编译器
0.8.19+commit.7dd6d404
文件 1 的 17:AddressHelper.sol
pragma solidity 0.8.19;
error NonContractAddressError(address account);
function isContract(address _account) view returns (bool) {
return _account.code.length > 0;
}
function requireContract(address _account) view {
if (!isContract(_account)) {
revert NonContractAddressError(_account);
}
}
function requireContractOrZeroAddress(address _account) view {
if (_account != address(0)) {
requireContract(_account);
}
}
文件 2 的 17:BalanceManagementMixin.sol
pragma solidity 0.8.19;
import { ITokenBalance } from '../interfaces/ITokenBalance.sol';
import { ManagerRole } from '../roles/ManagerRole.sol';
import '../helpers/TransferHelper.sol' as TransferHelper;
import '../Constants.sol' as Constants;
abstract contract BalanceManagementMixin is ManagerRole {
error ReservedTokenError();
function cleanup(address _tokenAddress, address _to) external virtual onlyManager {
_cleanupWithAmount(_tokenAddress, _to, tokenBalance(_tokenAddress));
}
function cleanupWithAmount(
address _tokenAddress,
address _to,
uint256 _tokenAmount
) external virtual onlyManager {
_cleanupWithAmount(_tokenAddress, _to, _tokenAmount);
}
function tokenBalance(address _tokenAddress) public view virtual returns (uint256) {
if (_tokenAddress == Constants.NATIVE_TOKEN_ADDRESS) {
return address(this).balance;
} else {
return ITokenBalance(_tokenAddress).balanceOf(address(this));
}
}
function isReservedToken(address _tokenAddress) public view virtual returns (bool) {
}
function _cleanupWithAmount(
address _tokenAddress,
address _to,
uint256 _tokenAmount
) internal virtual {
if (isReservedToken(_tokenAddress)) {
revert ReservedTokenError();
}
if (_tokenAddress == Constants.NATIVE_TOKEN_ADDRESS) {
TransferHelper.safeTransferNative(_to, _tokenAmount);
} else {
TransferHelper.safeTransfer(_tokenAddress, _to, _tokenAmount);
}
}
}
文件 3 的 17:Client.sol
pragma solidity ^0.8.0;
library Client {
struct EVMTokenAmount {
address token;
uint256 amount;
}
struct Any2EVMMessage {
bytes32 messageId;
uint64 sourceChainSelector;
bytes sender;
bytes data;
EVMTokenAmount[] destTokenAmounts;
}
struct EVM2AnyMessage {
bytes receiver;
bytes data;
EVMTokenAmount[] tokenAmounts;
address feeToken;
bytes extraArgs;
}
bytes4 public constant EVM_EXTRA_ARGS_V1_TAG = 0x97a657c9;
struct EVMExtraArgsV1 {
uint256 gasLimit;
}
function _argsToBytes(EVMExtraArgsV1 memory extraArgs) internal pure returns (bytes memory bts) {
return abi.encodeWithSelector(EVM_EXTRA_ARGS_V1_TAG, extraArgs);
}
}
文件 4 的 17:Constants.sol
pragma solidity 0.8.19;
uint256 constant DECIMALS_DEFAULT = 18;
uint256 constant INFINITY = type(uint256).max;
uint256 constant LIST_SIZE_LIMIT_DEFAULT = 100;
uint256 constant LIST_SIZE_LIMIT_ROUTERS = 200;
uint256 constant MILLIPERCENT_FACTOR = 100_000;
address constant NATIVE_TOKEN_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
文件 5 的 17:Context.sol
pragma solidity ^0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
文件 6 的 17:DataStructures.sol
pragma solidity 0.8.19;
struct OptionalValue {
bool isSet;
uint256 value;
}
struct KeyToValue {
uint256 key;
uint256 value;
}
struct KeyToAddressValue {
uint256 key;
address value;
}
struct AccountToFlag {
address account;
bool flag;
}
error ListSizeLimitError();
function combinedMapSet(
mapping(uint256 => address) storage _map,
uint256[] storage _keyList,
mapping(uint256 => OptionalValue) storage _keyIndexMap,
uint256 _key,
address _value,
uint256 _sizeLimit
) returns (bool isNewKey) {
isNewKey = !_keyIndexMap[_key].isSet;
if (isNewKey) {
uniqueListAdd(_keyList, _keyIndexMap, _key, _sizeLimit);
}
_map[_key] = _value;
}
function combinedMapRemove(
mapping(uint256 => address) storage _map,
uint256[] storage _keyList,
mapping(uint256 => OptionalValue) storage _keyIndexMap,
uint256 _key
) returns (bool isChanged) {
isChanged = _keyIndexMap[_key].isSet;
if (isChanged) {
delete _map[_key];
uniqueListRemove(_keyList, _keyIndexMap, _key);
}
}
function uniqueListAdd(
uint256[] storage _list,
mapping(uint256 => OptionalValue) storage _indexMap,
uint256 _value,
uint256 _sizeLimit
) returns (bool isChanged) {
isChanged = !_indexMap[_value].isSet;
if (isChanged) {
if (_list.length >= _sizeLimit) {
revert ListSizeLimitError();
}
_indexMap[_value] = OptionalValue(true, _list.length);
_list.push(_value);
}
}
function uniqueListRemove(
uint256[] storage _list,
mapping(uint256 => OptionalValue) storage _indexMap,
uint256 _value
) returns (bool isChanged) {
OptionalValue storage indexItem = _indexMap[_value];
isChanged = indexItem.isSet;
if (isChanged) {
uint256 itemIndex = indexItem.value;
uint256 lastIndex = _list.length - 1;
if (itemIndex != lastIndex) {
uint256 lastValue = _list[lastIndex];
_list[itemIndex] = lastValue;
_indexMap[lastValue].value = itemIndex;
}
_list.pop();
delete _indexMap[_value];
}
}
function uniqueAddressListAdd(
address[] storage _list,
mapping(address => OptionalValue) storage _indexMap,
address _value,
uint256 _sizeLimit
) returns (bool isChanged) {
isChanged = !_indexMap[_value].isSet;
if (isChanged) {
if (_list.length >= _sizeLimit) {
revert ListSizeLimitError();
}
_indexMap[_value] = OptionalValue(true, _list.length);
_list.push(_value);
}
}
function uniqueAddressListRemove(
address[] storage _list,
mapping(address => OptionalValue) storage _indexMap,
address _value
) returns (bool isChanged) {
OptionalValue storage indexItem = _indexMap[_value];
isChanged = indexItem.isSet;
if (isChanged) {
uint256 itemIndex = indexItem.value;
uint256 lastIndex = _list.length - 1;
if (itemIndex != lastIndex) {
address lastValue = _list[lastIndex];
_list[itemIndex] = lastValue;
_indexMap[lastValue].value = itemIndex;
}
_list.pop();
delete _indexMap[_value];
}
}
function uniqueAddressListUpdate(
address[] storage _list,
mapping(address => OptionalValue) storage _indexMap,
address _value,
bool _flag,
uint256 _sizeLimit
) returns (bool isChanged) {
return
_flag
? uniqueAddressListAdd(_list, _indexMap, _value, _sizeLimit)
: uniqueAddressListRemove(_list, _indexMap, _value);
}
文件 7 的 17:IRouterClient.sol
pragma solidity ^0.8.0;
import {Client} from "../libraries/Client.sol";
interface IRouterClient {
error UnsupportedDestinationChain(uint64 destChainSelector);
error InsufficientFeeTokenAmount();
error InvalidMsgValue();
function isChainSupported(uint64 chainSelector) external view returns (bool supported);
function getSupportedTokens(uint64 chainSelector) external view returns (address[] memory tokens);
function getFee(
uint64 destinationChainSelector,
Client.EVM2AnyMessage memory message
) external view returns (uint256 fee);
function ccipSend(
uint64 destinationChainSelector,
Client.EVM2AnyMessage calldata message
) external payable returns (bytes32);
}
文件 8 的 17:ITokenBalance.sol
pragma solidity 0.8.19;
interface ITokenBalance {
function balanceOf(address _account) external view returns (uint256);
}
文件 9 的 17:InterportCCIPBridgeCore.sol
pragma solidity 0.8.19;
import { Pausable } from '@openzeppelin/contracts/security/Pausable.sol';
import { IRouterClient } from '@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IRouterClient.sol';
import { Client } from '@chainlink/contracts-ccip/src/v0.8/ccip/libraries/Client.sol';
import { BalanceManagementMixin } from '../../../mixins/BalanceManagementMixin.sol';
import { SystemVersionId } from '../../../SystemVersionId.sol';
import '../../../helpers/AddressHelper.sol' as AddressHelper;
abstract contract InterportCCIPBridgeCore is SystemVersionId, Pausable, BalanceManagementMixin {
struct MessagingTokenInfo {
address token;
uint256 amount;
uint256 messagingAmount;
}
address public endpoint;
event SetEndpoint(address indexed endpointAddress);
error MessagingTokenAmountError();
error NativeTokenValueError();
error OnlyEndpointError();
modifier onlyEndpoint() {
if (msg.sender != endpoint) {
revert OnlyEndpointError();
}
_;
}
constructor(
address _endpointAddress,
address _owner,
address[] memory _managers,
bool _addOwnerToManagers
) {
_setEndpoint(_endpointAddress);
_initRoles(_owner, _managers, _addOwnerToManagers);
}
receive() external payable {}
function setEndpoint(address _endpointAddress) external onlyManager {
_setEndpoint(_endpointAddress);
}
function pause() external onlyManager whenNotPaused {
_pause();
}
function unpause() external onlyManager whenPaused {
_unpause();
}
function _ccipSend(
uint64 _targetChainSelector,
Client.EVM2AnyMessage memory _ccipMessage,
uint256 _ccipSendValue
) internal virtual returns (bytes32 ccipMessageId) {
return
IRouterClient(endpoint).ccipSend{ value: _ccipSendValue }(
_targetChainSelector,
_ccipMessage
);
}
function _setEndpoint(address _endpoint) internal virtual {
AddressHelper.requireContract(_endpoint);
endpoint = _endpoint;
emit SetEndpoint(_endpoint);
}
function _checkMessagingTokenInfo(
MessagingTokenInfo calldata _messagingTokenInfo,
uint256 _fromNativeTokenAmount
) internal view virtual returns (bool isNativeMessagingToken, uint256 ccipSendValue) {
if (_messagingTokenInfo.amount < _messagingTokenInfo.messagingAmount) {
revert MessagingTokenAmountError();
}
isNativeMessagingToken = (_messagingTokenInfo.token == address(0));
uint256 expectedMsgValue = isNativeMessagingToken
? (_messagingTokenInfo.amount + _fromNativeTokenAmount)
: _fromNativeTokenAmount;
if (msg.value < expectedMsgValue) {
revert NativeTokenValueError();
}
ccipSendValue = isNativeMessagingToken ? _messagingTokenInfo.messagingAmount : 0;
}
function _ccipGetFee(
uint64 _targetChainSelector,
Client.EVM2AnyMessage memory _ccipMessage
) internal view virtual returns (uint256 fee) {
return IRouterClient(endpoint).getFee(_targetChainSelector, _ccipMessage);
}
function _createCcipMessage(
address _receiverAddress,
bytes memory _data,
Client.EVMTokenAmount[] memory _tokenAmounts,
uint256 _targetGasLimit,
address _feeToken
) internal pure virtual returns (Client.EVM2AnyMessage memory) {
return
Client.EVM2AnyMessage({
receiver: abi.encode(_receiverAddress),
data: _data,
tokenAmounts: _tokenAmounts,
extraArgs: Client._argsToBytes(
Client.EVMExtraArgsV1({ gasLimit: _targetGasLimit })
),
feeToken: _feeToken
});
}
}
文件 10 的 17:InterportCCIPTokenBridge.sol
pragma solidity 0.8.19;
import { ReentrancyGuard } from '@openzeppelin/contracts/security/ReentrancyGuard.sol';
import { Client } from '@chainlink/contracts-ccip/src/v0.8/ccip/libraries/Client.sol';
import { InterportCCIPBridgeCore } from './core/InterportCCIPBridgeCore.sol';
import '../../helpers/TransferHelper.sol' as TransferHelper;
contract InterportCCIPTokenBridge is InterportCCIPBridgeCore, ReentrancyGuard {
struct TokenBridgeAction {
uint256 targetChainId;
uint64 targetChainSelector;
address targetRecipient;
Client.EVMTokenAmount[] tokenAmounts;
}
event TokenBridgeActionSource(
uint256 targetChainId,
address indexed sourceSender,
address targetRecipient,
Client.EVMTokenAmount[] tokenAmounts,
bytes32 indexed ccipMessageId,
uint256 timestamp
);
constructor(
address _endpointAddress,
address _owner,
address[] memory _managers,
bool _addOwnerToManagers
) InterportCCIPBridgeCore(_endpointAddress, _owner, _managers, _addOwnerToManagers) {}
function bridgeTokens(
TokenBridgeAction calldata _action,
MessagingTokenInfo calldata _messagingTokenInfo
) external payable whenNotPaused nonReentrant returns (bytes32 ccipMessageId) {
(bool isNativeMessagingToken, uint256 ccipSendValue) = _checkMessagingTokenInfo(
_messagingTokenInfo,
0
);
bool messagingTokenIncluded;
for (uint256 index; index < _action.tokenAmounts.length; index++) {
Client.EVMTokenAmount calldata tokenAmountData = _action.tokenAmounts[index];
uint256 tokenAmountToReceive = tokenAmountData.amount;
uint256 tokenAmountToApprove = tokenAmountData.amount;
if (_messagingTokenInfo.token == tokenAmountData.token && !messagingTokenIncluded) {
messagingTokenIncluded = true;
tokenAmountToReceive += _messagingTokenInfo.amount;
tokenAmountToApprove += _messagingTokenInfo.messagingAmount;
}
TransferHelper.safeTransferFrom(
tokenAmountData.token,
msg.sender,
address(this),
tokenAmountToReceive
);
TransferHelper.safeApprove(tokenAmountData.token, endpoint, tokenAmountToApprove);
}
if (!messagingTokenIncluded && !isNativeMessagingToken) {
TransferHelper.safeTransferFrom(
_messagingTokenInfo.token,
msg.sender,
address(this),
_messagingTokenInfo.amount
);
TransferHelper.safeApprove(
_messagingTokenInfo.token,
endpoint,
_messagingTokenInfo.messagingAmount
);
}
Client.EVM2AnyMessage memory ccipMessage = _createCcipMessage(
_action.targetRecipient,
new bytes(0),
_action.tokenAmounts,
0,
_messagingTokenInfo.token
);
ccipMessageId = _ccipSend(_action.targetChainSelector, ccipMessage, ccipSendValue);
for (uint256 index; index < _action.tokenAmounts.length; index++) {
TransferHelper.safeApprove(_action.tokenAmounts[index].token, endpoint, 0);
}
if (!messagingTokenIncluded && !isNativeMessagingToken) {
TransferHelper.safeApprove(_messagingTokenInfo.token, endpoint, 0);
}
emit TokenBridgeActionSource(
_action.targetChainId,
msg.sender,
_action.targetRecipient,
_action.tokenAmounts,
ccipMessageId,
block.timestamp
);
}
function messageFee(
TokenBridgeAction calldata _action,
address _messagingToken
) external view returns (uint256) {
Client.EVM2AnyMessage memory ccipMessage = _createCcipMessage(
_action.targetRecipient,
new bytes(0),
_action.tokenAmounts,
0,
_messagingToken
);
return _ccipGetFee(_action.targetChainSelector, ccipMessage);
}
}
文件 11 的 17:ManagerRole.sol
pragma solidity 0.8.19;
import { Ownable } from '@openzeppelin/contracts/access/Ownable.sol';
import { RoleBearers } from './RoleBearers.sol';
abstract contract ManagerRole is Ownable, RoleBearers {
bytes32 private constant ROLE_KEY = keccak256('Manager');
event SetManager(address indexed account, bool indexed value);
event RenounceManagerRole(address indexed account);
error OnlyManagerError();
modifier onlyManager() {
if (!isManager(msg.sender)) {
revert OnlyManagerError();
}
_;
}
function setManager(address _account, bool _value) public onlyOwner {
_setRoleBearer(ROLE_KEY, _account, _value);
emit SetManager(_account, _value);
}
function renounceManagerRole() external onlyManager {
_setRoleBearer(ROLE_KEY, msg.sender, false);
emit RenounceManagerRole(msg.sender);
}
function managerCount() external view returns (uint256) {
return _roleBearerCount(ROLE_KEY);
}
function fullManagerList() external view returns (address[] memory) {
return _fullRoleBearerList(ROLE_KEY);
}
function isManager(address _account) public view returns (bool) {
return _isRoleBearer(ROLE_KEY, _account);
}
function _initRoles(
address _owner,
address[] memory _managers,
bool _addOwnerToManagers
) internal {
address ownerAddress = _owner == address(0) ? msg.sender : _owner;
for (uint256 index; index < _managers.length; index++) {
setManager(_managers[index], true);
}
if (_addOwnerToManagers && !isManager(ownerAddress)) {
setManager(ownerAddress, true);
}
if (ownerAddress != msg.sender) {
transferOwnership(ownerAddress);
}
}
}
文件 12 的 17:Ownable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_transferOwnership(_msgSender());
}
modifier onlyOwner() {
_checkOwner();
_;
}
function owner() public view virtual returns (address) {
return _owner;
}
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
文件 13 的 17:Pausable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Pausable is Context {
event Paused(address account);
event Unpaused(address account);
bool private _paused;
constructor() {
_paused = false;
}
modifier whenNotPaused() {
_requireNotPaused();
_;
}
modifier whenPaused() {
_requirePaused();
_;
}
function paused() public view virtual returns (bool) {
return _paused;
}
function _requireNotPaused() internal view virtual {
require(!paused(), "Pausable: paused");
}
function _requirePaused() internal view virtual {
require(paused(), "Pausable: not paused");
}
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}
文件 14 的 17:ReentrancyGuard.sol
pragma solidity ^0.8.0;
abstract contract ReentrancyGuard {
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
_status = _ENTERED;
}
function _nonReentrantAfter() private {
_status = _NOT_ENTERED;
}
}
文件 15 的 17:RoleBearers.sol
pragma solidity 0.8.19;
import '../Constants.sol' as Constants;
import '../DataStructures.sol' as DataStructures;
abstract contract RoleBearers {
mapping(bytes32 => address[] ) private roleBearerTable;
mapping(bytes32 => mapping(address => DataStructures.OptionalValue ))
private roleBearerIndexTable;
function _setRoleBearer(bytes32 _roleKey, address _account, bool _value) internal {
DataStructures.uniqueAddressListUpdate(
roleBearerTable[_roleKey],
roleBearerIndexTable[_roleKey],
_account,
_value,
Constants.LIST_SIZE_LIMIT_DEFAULT
);
}
function _isRoleBearer(bytes32 _roleKey, address _account) internal view returns (bool) {
return roleBearerIndexTable[_roleKey][_account].isSet;
}
function _roleBearerCount(bytes32 _roleKey) internal view returns (uint256) {
return roleBearerTable[_roleKey].length;
}
function _fullRoleBearerList(bytes32 _roleKey) internal view returns (address[] memory) {
return roleBearerTable[_roleKey];
}
}
文件 16 的 17:SystemVersionId.sol
pragma solidity 0.8.19;
abstract contract SystemVersionId {
uint256 public constant SYSTEM_VERSION_ID = uint256(keccak256('Initial'));
}
文件 17 的 17:TransferHelper.sol
pragma solidity 0.8.19;
error SafeApproveError();
error SafeTransferError();
error SafeTransferFromError();
error SafeTransferNativeError();
function safeApprove(address _token, address _to, uint256 _value) {
(bool success, bytes memory data) = _token.call(
abi.encodeWithSelector(0x095ea7b3, _to, _value)
);
bool condition = success && (data.length == 0 || abi.decode(data, (bool)));
if (!condition) {
revert SafeApproveError();
}
}
function safeTransfer(address _token, address _to, uint256 _value) {
(bool success, bytes memory data) = _token.call(
abi.encodeWithSelector(0xa9059cbb, _to, _value)
);
bool condition = success && (data.length == 0 || abi.decode(data, (bool)));
if (!condition) {
revert SafeTransferError();
}
}
function safeTransferFrom(address _token, address _from, address _to, uint256 _value) {
(bool success, bytes memory data) = _token.call(
abi.encodeWithSelector(0x23b872dd, _from, _to, _value)
);
bool condition = success && (data.length == 0 || abi.decode(data, (bool)));
if (!condition) {
revert SafeTransferFromError();
}
}
function safeTransferNative(address _to, uint256 _value) {
(bool success, ) = _to.call{ value: _value }(new bytes(0));
if (!success) {
revert SafeTransferNativeError();
}
}
{
"compilationTarget": {
"contracts/bridge/chainlink-ccip/InterportCCIPTokenBridge.sol": "InterportCCIPTokenBridge"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_endpointAddress","type":"address"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address[]","name":"_managers","type":"address[]"},{"internalType":"bool","name":"_addOwnerToManagers","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ListSizeLimitError","type":"error"},{"inputs":[],"name":"MessagingTokenAmountError","type":"error"},{"inputs":[],"name":"NativeTokenValueError","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NonContractAddressError","type":"error"},{"inputs":[],"name":"OnlyEndpointError","type":"error"},{"inputs":[],"name":"OnlyManagerError","type":"error"},{"inputs":[],"name":"ReservedTokenError","type":"error"},{"inputs":[],"name":"SafeApproveError","type":"error"},{"inputs":[],"name":"SafeTransferError","type":"error"},{"inputs":[],"name":"SafeTransferFromError","type":"error"},{"inputs":[],"name":"SafeTransferNativeError","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"RenounceManagerRole","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"endpointAddress","type":"address"}],"name":"SetEndpoint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetManager","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"targetChainId","type":"uint256"},{"indexed":true,"internalType":"address","name":"sourceSender","type":"address"},{"indexed":false,"internalType":"address","name":"targetRecipient","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"indexed":false,"internalType":"struct Client.EVMTokenAmount[]","name":"tokenAmounts","type":"tuple[]"},{"indexed":true,"internalType":"bytes32","name":"ccipMessageId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokenBridgeActionSource","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"SYSTEM_VERSION_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"targetChainId","type":"uint256"},{"internalType":"uint64","name":"targetChainSelector","type":"uint64"},{"internalType":"address","name":"targetRecipient","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct Client.EVMTokenAmount[]","name":"tokenAmounts","type":"tuple[]"}],"internalType":"struct InterportCCIPTokenBridge.TokenBridgeAction","name":"_action","type":"tuple"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"messagingAmount","type":"uint256"}],"internalType":"struct InterportCCIPBridgeCore.MessagingTokenInfo","name":"_messagingTokenInfo","type":"tuple"}],"name":"bridgeTokens","outputs":[{"internalType":"bytes32","name":"ccipMessageId","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"cleanup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"cleanupWithAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endpoint","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fullManagerList","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isManager","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"isReservedToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"managerCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"targetChainId","type":"uint256"},{"internalType":"uint64","name":"targetChainSelector","type":"uint64"},{"internalType":"address","name":"targetRecipient","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct Client.EVMTokenAmount[]","name":"tokenAmounts","type":"tuple[]"}],"internalType":"struct InterportCCIPTokenBridge.TokenBridgeAction","name":"_action","type":"tuple"},{"internalType":"address","name":"_messagingToken","type":"address"}],"name":"messageFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceManagerRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_endpointAddress","type":"address"}],"name":"setEndpoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_value","type":"bool"}],"name":"setManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"tokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]