Latest 11 from a total of 11 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Bridge | 76665351 | 82 days ago | IN | 1.99505338 POL | 0.0064874 | ||||
| Bridge | 73281073 | 167 days ago | IN | 2.86483699 POL | 0.00459882 | ||||
| Bridge | 73249097 | 167 days ago | IN | 2.90314526 POL | 0.00459882 | ||||
| Bridge | 72956003 | 175 days ago | IN | 5.58842535 POL | 0.00459603 | ||||
| Bridge | 72925560 | 175 days ago | IN | 2.63185598 POL | 0.01161418 | ||||
| Bridge | 69907964 | 250 days ago | IN | 2.62653461 POL | 0.00843221 | ||||
| Bridge | 67370630 | 313 days ago | IN | 1.19875042 POL | 0.00712988 | ||||
| Bridge | 67370617 | 313 days ago | IN | 1.19922959 POL | 0.00727414 | ||||
| Bridge | 67370605 | 313 days ago | IN | 1.19884567 POL | 0.00688523 | ||||
| Transfer Ownersh... | 63631824 | 407 days ago | IN | 0 POL | 0.00109832 | ||||
| Set Manager | 63631790 | 407 days ago | IN | 0 POL | 0.003762 |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
InterportCCTPBridge
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.19;
import { ReentrancyGuard } from '@openzeppelin/contracts/security/ReentrancyGuard.sol';
import { ITokenMessenger } from './interfaces/ITokenMessenger.sol';
import { BalanceManagementMixin } from '../../mixins/BalanceManagementMixin.sol';
import { Pausable } from '../../Pausable.sol';
import { SystemVersionId } from '../../SystemVersionId.sol';
import '../../helpers/TransferHelper.sol' as TransferHelper;
/**
* @title InterportCCTPBridge
* @notice The contract bridges USDC with Circle CCTP
*/
contract InterportCCTPBridge is SystemVersionId, Pausable, BalanceManagementMixin, ReentrancyGuard {
/**
* @notice The "bridge" action parameters
* @param amount Amount of tokens to burn
* @param destinationDomain Destination domain
* @param mintRecipient Address of mint recipient on destination domain
* @param burnToken Address of contract to burn deposited tokens, on local domain
* @param destinationCaller Caller on the destination domain, as bytes32
*/
struct BridgeAction {
uint256 amount;
uint32 destinationDomain;
bytes32 mintRecipient;
address burnToken;
bytes32 destinationCaller;
}
/**
* @dev The CCTP token messenger address
*/
address public immutable tokenMessenger;
/**
* @notice Bridge action source event
* @param destinationDomain Destination domain
* @param sourceSender The address of the user on the source chain
* @param targetRecipient The address of the recipient on the target chain
* @param token The token address
* @param amount The token amount
* @param reserve The reserve amount
* @param messageNonce Unique nonce reserved by message
* @param timestamp The timestamp of the action (in seconds)
*/
event BridgeActionSource(
uint32 destinationDomain,
address indexed sourceSender,
bytes32 targetRecipient,
address token,
uint256 amount,
uint256 reserve,
uint64 indexed messageNonce,
uint256 timestamp
);
/**
* @notice Initializes the contract
* @param _tokenMessenger The CCTP token messenger address
* @param _owner The address of the initial owner of the contract
* @param _managers The addresses of initial managers of the contract
* @param _addOwnerToManagers The flag to optionally add the owner to the list of managers
*/
constructor(
address _tokenMessenger,
address _owner,
address[] memory _managers,
bool _addOwnerToManagers
) {
tokenMessenger = _tokenMessenger;
_initRoles(_owner, _managers, _addOwnerToManagers);
}
/**
* @notice Cross-chain bridging function
* @param _action Action parameters
* @return messageNonce Unique nonce reserved by message
*/
function bridge(
BridgeAction calldata _action
) external payable whenNotPaused nonReentrant returns (uint64 messageNonce) {
TransferHelper.safeTransferFrom(
_action.burnToken,
msg.sender,
address(this),
_action.amount
);
TransferHelper.safeApprove(_action.burnToken, tokenMessenger, _action.amount);
if (_action.destinationCaller == bytes32(0)) {
messageNonce = ITokenMessenger(tokenMessenger).depositForBurn(
_action.amount,
_action.destinationDomain,
_action.mintRecipient,
_action.burnToken
);
} else {
messageNonce = ITokenMessenger(tokenMessenger).depositForBurnWithCaller(
_action.amount,
_action.destinationDomain,
_action.mintRecipient,
_action.burnToken,
_action.destinationCaller
);
}
TransferHelper.safeApprove(_action.burnToken, tokenMessenger, 0);
emit BridgeActionSource(
_action.destinationDomain,
msg.sender,
_action.mintRecipient,
_action.burnToken,
_action.amount,
msg.value,
messageNonce,
block.timestamp
);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract Pausable is Context {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
constructor() {
_paused = false;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
_requireNotPaused();
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
_requirePaused();
_;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Throws if the contract is paused.
*/
function _requireNotPaused() internal view virtual {
require(!paused(), "Pausable: paused");
}
/**
* @dev Throws if the contract is not paused.
*/
function _requirePaused() internal view virtual {
require(paused(), "Pausable: not paused");
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be _NOT_ENTERED
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.19;
/**
* @title ITokenMessenger
* @notice Sends messages to MessageTransmitters and to TokenMinters
*/
interface ITokenMessenger {
function depositForBurn(
uint256 _amount,
uint32 _destinationDomain,
bytes32 _mintRecipient,
address _burnToken
) external returns (uint64 _nonce);
function depositForBurnWithCaller(
uint256 _amount,
uint32 _destinationDomain,
bytes32 _mintRecipient,
address _burnToken,
bytes32 _destinationCaller
) external returns (uint64 _nonce);
}// SPDX-License-Identifier: AGPL-3.0-only pragma solidity 0.8.19; /** * @dev The default token decimals value */ uint256 constant DECIMALS_DEFAULT = 18; /** * @dev The maximum uint256 value for swap amount limit settings */ uint256 constant INFINITY = type(uint256).max; /** * @dev The default limit of account list size */ uint256 constant LIST_SIZE_LIMIT_DEFAULT = 100; /** * @dev The limit of swap router list size */ uint256 constant LIST_SIZE_LIMIT_ROUTERS = 200; /** * @dev The factor for percentage settings. Example: 100 is 0.1% */ uint256 constant MILLIPERCENT_FACTOR = 100_000; /** * @dev The de facto standard address to denote the native token */ address constant NATIVE_TOKEN_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.19;
/**
* @notice Optional value structure
* @dev Is used in mappings to allow zero values
* @param isSet Value presence flag
* @param value Numeric value
*/
struct OptionalValue {
bool isSet;
uint256 value;
}
/**
* @notice Key-to-value structure
* @dev Is used as an array parameter item to perform multiple key-value settings
* @param key Numeric key
* @param value Numeric value
*/
struct KeyToValue {
uint256 key;
uint256 value;
}
/**
* @notice Key-to-value structure for address values
* @dev Is used as an array parameter item to perform multiple key-value settings with address values
* @param key Numeric key
* @param value Address value
*/
struct KeyToAddressValue {
uint256 key;
address value;
}
/**
* @notice Address-to-flag structure
* @dev Is used as an array parameter item to perform multiple settings
* @param account Account address
* @param flag Flag value
*/
struct AccountToFlag {
address account;
bool flag;
}
/**
* @notice Emitted when a list exceeds the size limit
*/
error ListSizeLimitError();
/**
* @notice Sets or updates a value in a combined map (a mapping with a key list and key index mapping)
* @param _map The mapping reference
* @param _keyList The key list reference
* @param _keyIndexMap The key list index mapping reference
* @param _key The numeric key
* @param _value The address value
* @param _sizeLimit The map and list size limit
* @return isNewKey True if the key was just added, otherwise false
*/
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;
}
/**
* @notice Removes a value from a combined map (a mapping with a key list and key index mapping)
* @param _map The mapping reference
* @param _keyList The key list reference
* @param _keyIndexMap The key list index mapping reference
* @param _key The numeric key
* @return isChanged True if the combined map was changed, otherwise false
*/
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);
}
}
/**
* @notice Adds a value to a unique value list (a list with value index mapping)
* @param _list The list reference
* @param _indexMap The value index mapping reference
* @param _value The numeric value
* @param _sizeLimit The list size limit
* @return isChanged True if the list was changed, otherwise false
*/
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);
}
}
/**
* @notice Removes a value from a unique value list (a list with value index mapping)
* @param _list The list reference
* @param _indexMap The value index mapping reference
* @param _value The numeric value
* @return isChanged True if the list was changed, otherwise false
*/
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];
}
}
/**
* @notice Adds a value to a unique address value list (a list with value index mapping)
* @param _list The list reference
* @param _indexMap The value index mapping reference
* @param _value The address value
* @param _sizeLimit The list size limit
* @return isChanged True if the list was changed, otherwise false
*/
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);
}
}
/**
* @notice Removes a value from a unique address value list (a list with value index mapping)
* @param _list The list reference
* @param _indexMap The value index mapping reference
* @param _value The address value
* @return isChanged True if the list was changed, otherwise false
*/
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];
}
}
/**
* @notice Adds or removes a value to/from a unique address value list (a list with value index mapping)
* @dev The list size limit is checked on items adding only
* @param _list The list reference
* @param _indexMap The value index mapping reference
* @param _value The address value
* @param _flag The value inclusion flag
* @param _sizeLimit The list size limit
* @return isChanged True if the list was changed, otherwise false
*/
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);
}// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.19;
/**
* @notice Emitted when an approval action fails
*/
error SafeApproveError();
/**
* @notice Emitted when a transfer action fails
*/
error SafeTransferError();
/**
* @notice Emitted when a transferFrom action fails
*/
error SafeTransferFromError();
/**
* @notice Emitted when a transfer of the native token fails
*/
error SafeTransferNativeError();
/**
* @notice Safely approve the token to the account
* @param _token The token address
* @param _to The token approval recipient address
* @param _value The token approval amount
*/
function safeApprove(address _token, address _to, uint256 _value) {
// 0x095ea7b3 is the selector for "approve(address,uint256)"
(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();
}
}
/**
* @notice Safely transfer the token to the account
* @param _token The token address
* @param _to The token transfer recipient address
* @param _value The token transfer amount
*/
function safeTransfer(address _token, address _to, uint256 _value) {
// 0xa9059cbb is the selector for "transfer(address,uint256)"
(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();
}
}
/**
* @notice Safely transfer the token between the accounts
* @param _token The token address
* @param _from The token transfer source address
* @param _to The token transfer recipient address
* @param _value The token transfer amount
*/
function safeTransferFrom(address _token, address _from, address _to, uint256 _value) {
// 0x23b872dd is the selector for "transferFrom(address,address,uint256)"
(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();
}
}
/**
* @notice Safely transfer the native token to the account
* @param _to The native token transfer recipient address
* @param _value The native token transfer amount
*/
function safeTransferNative(address _to, uint256 _value) {
(bool success, ) = _to.call{ value: _value }(new bytes(0));
if (!success) {
revert SafeTransferNativeError();
}
}// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.19;
/**
* @title ITokenBalance
* @notice Token balance interface
*/
interface ITokenBalance {
/**
* @notice Getter of the token balance by the account
* @param _account The account address
* @return Token balance
*/
function balanceOf(address _account) external view returns (uint256);
}// SPDX-License-Identifier: AGPL-3.0-only
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;
/**
* @title BalanceManagementMixin
* @notice The balance management mix-in logic
*/
abstract contract BalanceManagementMixin is ManagerRole {
/**
* @notice Emitted when the specified token is reserved
*/
error ReservedTokenError();
/**
* @notice Performs the token cleanup
* @dev Use the "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE" address for the native token
* @param _tokenAddress The address of the token
* @param _to The token transfer recipient address
*/
function cleanup(address _tokenAddress, address _to) external virtual onlyManager {
_cleanupWithAmount(_tokenAddress, _to, tokenBalance(_tokenAddress));
}
/**
* @notice Performs the token cleanup using the provided amount
* @dev Use the "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE" address for the native token
* @param _tokenAddress The address of the token
* @param _to The token transfer recipient address
* @param _tokenAmount The amount of the token
*/
function cleanupWithAmount(
address _tokenAddress,
address _to,
uint256 _tokenAmount
) external virtual onlyManager {
_cleanupWithAmount(_tokenAddress, _to, _tokenAmount);
}
/**
* @notice Getter of the token balance of the current contract
* @dev Use the "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE" address for the native token
* @param _tokenAddress The address of the token
* @return The token balance of the current contract
*/
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));
}
}
/**
* @notice Getter of the reserved token flag
* @dev Override to add reserved token addresses
* @param _tokenAddress The address of the token
* @return The reserved token flag
*/
function isReservedToken(address _tokenAddress) public view virtual returns (bool) {
// The function returns false by default.
// The explicit return statement is omitted to avoid the unused parameter warning.
// See https://github.com/ethereum/solidity/issues/5295
}
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);
}
}
}// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.19;
import { Pausable as PausableBase } from '@openzeppelin/contracts/security/Pausable.sol';
import { ManagerRole } from './roles/ManagerRole.sol';
/**
* @title Pausable
* @notice Base contract that implements the emergency pause mechanism
*/
abstract contract Pausable is PausableBase, ManagerRole {
/**
* @notice Enter pause state
*/
function pause() external onlyManager whenNotPaused {
_pause();
}
/**
* @notice Exit pause state
*/
function unpause() external onlyManager whenPaused {
_unpause();
}
}// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.19;
import { Ownable } from '@openzeppelin/contracts/access/Ownable.sol';
import { RoleBearers } from './RoleBearers.sol';
/**
* @title ManagerRole
* @notice Base contract that implements the Manager role.
* The manager role is a high-permission role for core team members only.
* Managers can set vaults and routers addresses, fees, cross-chain protocols,
* and other parameters for Interchain (cross-chain) swaps and single-network swaps.
* Please note, the manager role is unique for every contract,
* hence different addresses may be assigned as managers for different contracts.
*/
abstract contract ManagerRole is Ownable, RoleBearers {
bytes32 private constant ROLE_KEY = keccak256('Manager');
/**
* @notice Emitted when the Manager role status for the account is updated
* @param account The account address
* @param value The Manager role status flag
*/
event SetManager(address indexed account, bool indexed value);
/**
* @notice Emitted when the Manager role status for the account is renounced
* @param account The account address
*/
event RenounceManagerRole(address indexed account);
/**
* @notice Emitted when the caller is not a Manager role bearer
*/
error OnlyManagerError();
/**
* @dev Modifier to check if the caller is a Manager role bearer
*/
modifier onlyManager() {
if (!isManager(msg.sender)) {
revert OnlyManagerError();
}
_;
}
/**
* @notice Updates the Manager role status for the account
* @param _account The account address
* @param _value The Manager role status flag
*/
function setManager(address _account, bool _value) public onlyOwner {
_setRoleBearer(ROLE_KEY, _account, _value);
emit SetManager(_account, _value);
}
/**
* @notice Renounces the Manager role
*/
function renounceManagerRole() external onlyManager {
_setRoleBearer(ROLE_KEY, msg.sender, false);
emit RenounceManagerRole(msg.sender);
}
/**
* @notice Getter of the Manager role bearer count
* @return The Manager role bearer count
*/
function managerCount() external view returns (uint256) {
return _roleBearerCount(ROLE_KEY);
}
/**
* @notice Getter of the complete list of the Manager role bearers
* @return The complete list of the Manager role bearers
*/
function fullManagerList() external view returns (address[] memory) {
return _fullRoleBearerList(ROLE_KEY);
}
/**
* @notice Getter of the Manager role bearer status
* @param _account The account address
*/
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);
}
}
}// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.19;
import '../Constants.sol' as Constants;
import '../DataStructures.sol' as DataStructures;
/**
* @title RoleBearers
* @notice Base contract that implements role-based access control
* @dev A custom implementation providing full role bearer lists
*/
abstract contract RoleBearers {
mapping(bytes32 /*roleKey*/ => address[] /*roleBearers*/) private roleBearerTable;
mapping(bytes32 /*roleKey*/ => mapping(address /*account*/ => DataStructures.OptionalValue /*status*/))
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];
}
}// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.19;
/**
* @title SystemVersionId
* @notice Base contract providing the system version identifier
*/
abstract contract SystemVersionId {
/**
* @dev The system version identifier
*/
uint256 public constant SYSTEM_VERSION_ID = uint256(keccak256('Initial'));
}{
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"metadata": {
"useLiteralContent": true
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_tokenMessenger","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":"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":false,"internalType":"uint32","name":"destinationDomain","type":"uint32"},{"indexed":true,"internalType":"address","name":"sourceSender","type":"address"},{"indexed":false,"internalType":"bytes32","name":"targetRecipient","type":"bytes32"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reserve","type":"uint256"},{"indexed":true,"internalType":"uint64","name":"messageNonce","type":"uint64"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"BridgeActionSource","type":"event"},{"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":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetManager","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":"amount","type":"uint256"},{"internalType":"uint32","name":"destinationDomain","type":"uint32"},{"internalType":"bytes32","name":"mintRecipient","type":"bytes32"},{"internalType":"address","name":"burnToken","type":"address"},{"internalType":"bytes32","name":"destinationCaller","type":"bytes32"}],"internalType":"struct InterportCCTPBridge.BridgeAction","name":"_action","type":"tuple"}],"name":"bridge","outputs":[{"internalType":"uint64","name":"messageNonce","type":"uint64"}],"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":"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":[],"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":"_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":[],"name":"tokenMessenger","outputs":[{"internalType":"address","name":"","type":"address"}],"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"}]Contract Creation Code
60a06040523480156200001157600080fd5b506040516200327d3803806200327d833981810160405281019062000037919062000b8b565b60008060006101000a81548160ff0219169083151502179055506200007162000065620000ca60201b60201c565b620000d260201b60201c565b60016003819055508373ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050620000c08383836200019760201b60201c565b5050505062000e56565b600033905090565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614620001d45783620001d6565b335b905060005b83518110156200022b5762000215848281518110620001ff57620001fe62000c1c565b5b60200260200101516001620002ae60201b60201c565b8080620002229062000c84565b915050620001db565b5081801562000248575062000246816200033b60201b60201c565b155b15620002625762000261816001620002ae60201b60201c565b5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614620002a857620002a7816200037660201b60201c565b5b50505050565b620002be6200040c60201b60201c565b620002f17f6d439300980e333f0256d64be2c9f67e86f4493ce25f82498d6db7f4be3d9e6f83836200049d60201b60201c565b8015158273ffffffffffffffffffffffffffffffffffffffff167fbe9474bb3e78da7e315cdffa5cfa30b767fcc95bbf44a6197da60228eea1028660405160405180910390a35050565b60006200036f7f6d439300980e333f0256d64be2c9f67e86f4493ce25f82498d6db7f4be3d9e6f83620004dd60201b60201c565b9050919050565b620003866200040c60201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620003f8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003ef9062000d58565b60405180910390fd5b6200040981620000d260201b60201c565b50565b6200041c620000ca60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620004426200054860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200049b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004929062000dca565b60405180910390fd5b565b620004d76001600085815260200190815260200160002060026000868152602001908152602001600020848460646200057160201b60201c565b50505050565b60006002600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff16905092915050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008262000592576200058c868686620005b260201b60201c565b620005a7565b620005a686868685620007d560201b60201c565b5b905095945050505050565b6000808360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508060000160009054906101000a900460ff1691508115620007cd576000816001015490506000600187805490506200062e919062000dec565b90508082146200072457600087828154811062000650576200064f62000c1c565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508088848154811062000694576200069362000c1c565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550505b8680548062000738576200073762000e27565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590558560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160006101000a81549060ff02191690556001820160009055505050505b509392505050565b60008360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1615905080156200095857818580549050106200086e576040517fb1655e3300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051806040016040528060011515815260200186805490508152508460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015590505084839080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b949350505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620009a18262000974565b9050919050565b620009b38162000994565b8114620009bf57600080fd5b50565b600081519050620009d381620009a8565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000a2982620009de565b810181811067ffffffffffffffff8211171562000a4b5762000a4a620009ef565b5b80604052505050565b600062000a6062000960565b905062000a6e828262000a1e565b919050565b600067ffffffffffffffff82111562000a915762000a90620009ef565b5b602082029050602081019050919050565b600080fd5b600062000abe62000ab88462000a73565b62000a54565b9050808382526020820190506020840283018581111562000ae45762000ae362000aa2565b5b835b8181101562000b11578062000afc8882620009c2565b84526020840193505060208101905062000ae6565b5050509392505050565b600082601f83011262000b335762000b32620009d9565b5b815162000b4584826020860162000aa7565b91505092915050565b60008115159050919050565b62000b658162000b4e565b811462000b7157600080fd5b50565b60008151905062000b858162000b5a565b92915050565b6000806000806080858703121562000ba85762000ba76200096a565b5b600062000bb887828801620009c2565b945050602062000bcb87828801620009c2565b935050604085015167ffffffffffffffff81111562000bef5762000bee6200096f565b5b62000bfd8782880162000b1b565b925050606062000c108782880162000b74565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b600062000c918262000c7a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362000cc65762000cc562000c4b565b5b600182019050919050565b600082825260208201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600062000d4060268362000cd1565b915062000d4d8262000ce2565b604082019050919050565b6000602082019050818103600083015262000d738162000d31565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000db260208362000cd1565b915062000dbf8262000d7a565b602082019050919050565b6000602082019050818103600083015262000de58162000da3565b9050919050565b600062000df98262000c7a565b915062000e068362000c7a565b925082820390508181111562000e215762000e2062000c4b565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6080516123ef62000e8e6000396000818161049a015281816104d3015281816105a80152818161069501526107b101526123ef6000f3fe6080604052600436106101095760003560e01c806383d8534611610095578063c2c518e111610064578063c2c518e114610312578063e3725b1514610329578063eedc966a14610354578063f2fde38b14610391578063f3ae2415146103ba57610109565b806383d853461461027e5780638456cb59146102a75780638da5cb5b146102be578063a5e90eee146102e957610109565b8063440d7248116100dc578063440d7248146101ab57806346117830146101e85780635c975abb146102135780635d2251d51461023e578063715018a61461026757610109565b8063093f0e271461010e578063103b739714610139578063385df13e146101645780633f4ba83a14610194575b600080fd5b34801561011a57600080fd5b506101236103f7565b6040516101309190611982565b60405180910390f35b34801561014557600080fd5b5061014e61041e565b60405161015b9190611982565b60405180910390f35b61017e600480360381019061017991906119c6565b61044e565b60405161018b9190611a16565b60405180910390f35b3480156101a057600080fd5b506101a9610757565b005b3480156101b757600080fd5b506101d260048036038101906101cd9190611a8f565b6107a8565b6040516101df9190611ad7565b60405180910390f35b3480156101f457600080fd5b506101fd6107af565b60405161020a9190611b01565b60405180910390f35b34801561021f57600080fd5b506102286107d3565b6040516102359190611ad7565b60405180910390f35b34801561024a57600080fd5b5061026560048036038101906102609190611b48565b6107e9565b005b34801561027357600080fd5b5061027c610838565b005b34801561028a57600080fd5b506102a560048036038101906102a09190611b9b565b61084c565b005b3480156102b357600080fd5b506102bc6108a2565b005b3480156102ca57600080fd5b506102d36108f3565b6040516102e09190611b01565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190611c07565b61091c565b005b34801561031e57600080fd5b50610327610999565b005b34801561033557600080fd5b5061033e610a49565b60405161034b9190611d05565b60405180910390f35b34801561036057600080fd5b5061037b60048036038101906103769190611a8f565b610a79565b6040516103889190611982565b60405180910390f35b34801561039d57600080fd5b506103b860048036038101906103b39190611a8f565b610b4c565b005b3480156103c657600080fd5b506103e160048036038101906103dc9190611a8f565b610bcf565b6040516103ee9190611ad7565b60405180910390f35b7f22ad9585a395edc8067b50da4778cafbb7fa2c4bbd7619fad6aeba403857fd7460001c81565b60006104497f6d439300980e333f0256d64be2c9f67e86f4493ce25f82498d6db7f4be3d9e6f610c02565b905090565b6000610458610c22565b610460610c6c565b6104828260600160208101906104769190611a8f565b33308560000135610cbb565b6104c38260600160208101906104989190611a8f565b7f00000000000000000000000000000000000000000000000000000000000000008460000135610df1565b6000801b8260800135036105a6577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636fd3504e83600001358460200160208101906105259190611d63565b856040013586606001602081019061053d9190611a8f565b6040518563ffffffff1660e01b815260040161055c9493929190611db8565b6020604051808303816000875af115801561057b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059f9190611e29565b905061067d565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f856ddb683600001358460200160208101906105fa9190611d63565b85604001358660600160208101906106129190611a8f565b87608001356040518663ffffffff1660e01b8152600401610637959493929190611e56565b6020604051808303816000875af1158015610656573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067a9190611e29565b90505b6106bb8260600160208101906106939190611a8f565b7f00000000000000000000000000000000000000000000000000000000000000006000610df1565b8067ffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb9ca371acfa400c8f24c295d7a65dc53334c762f84de89037884af886fb0e10b8460200160208101906107119190611d63565b85604001358660600160208101906107299190611a8f565b8760000135344260405161074296959493929190611ea9565b60405180910390a3610752610f24565b919050565b61076033610bcf565b610796576040517f7c3ea23f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61079e610f2e565b6107a6610f77565b565b6000919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008060009054906101000a900460ff16905090565b6107f233610bcf565b610828576040517f7c3ea23f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610833838383610fd9565b505050565b610840611080565b61084a60006110fe565b565b61085533610bcf565b61088b576040517f7c3ea23f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61089e828261089985610a79565b610fd9565b5050565b6108ab33610bcf565b6108e1576040517f7c3ea23f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108e9610c22565b6108f16111c3565b565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610924611080565b61094f7f6d439300980e333f0256d64be2c9f67e86f4493ce25f82498d6db7f4be3d9e6f8383611225565b8015158273ffffffffffffffffffffffffffffffffffffffff167fbe9474bb3e78da7e315cdffa5cfa30b767fcc95bbf44a6197da60228eea1028660405160405180910390a35050565b6109a233610bcf565b6109d8576040517f7c3ea23f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a047f6d439300980e333f0256d64be2c9f67e86f4493ce25f82498d6db7f4be3d9e6f336000611225565b3373ffffffffffffffffffffffffffffffffffffffff167f6cc2c67081f55c2fffb7c008fa995fbbf890f48c7c16fba93d8220f00dc84cc560405160405180910390a2565b6060610a747f6d439300980e333f0256d64be2c9f67e86f4493ce25f82498d6db7f4be3d9e6f61125d565b905090565b600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610aca57479050610b47565b8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610b039190611b01565b602060405180830381865afa158015610b20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b449190611f1f565b90505b919050565b610b54611080565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bba90611fcf565b60405180910390fd5b610bcc816110fe565b50565b6000610bfb7f6d439300980e333f0256d64be2c9f67e86f4493ce25f82498d6db7f4be3d9e6f836112fe565b9050919050565b600060016000838152602001908152602001600020805490509050919050565b610c2a6107d3565b15610c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c619061203b565b60405180910390fd5b565b600260035403610cb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca8906120a7565b60405180910390fd5b6002600381905550565b6000808573ffffffffffffffffffffffffffffffffffffffff166323b872dd868686604051602401610cef939291906120c7565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610d3d919061216f565b6000604051808303816000865af19150503d8060008114610d7a576040519150601f19603f3d011682016040523d82523d6000602084013e610d7f565b606091505b50915091506000828015610daf5750600082511480610dae575081806020019051810190610dad919061219b565b5b5b905080610de8576040517f2d9d5b4100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050505050565b6000808473ffffffffffffffffffffffffffffffffffffffff1663095ea7b38585604051602401610e239291906121c8565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610e71919061216f565b6000604051808303816000865af19150503d8060008114610eae576040519150601f19603f3d011682016040523d82523d6000602084013e610eb3565b606091505b50915091506000828015610ee35750600082511480610ee2575081806020019051810190610ee1919061219b565b5b5b905080610f1c576040517fb45d44e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050565b6001600381905550565b610f366107d3565b610f75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6c9061223d565b60405180910390fd5b565b610f7f610f2e565b60008060006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa610fc2611369565b604051610fcf9190611b01565b60405180910390a1565b610fe2836107a8565b15611019576040517f88eed33200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361106f5761106a8282611371565b61107b565b61107a838383611468565b5b505050565b611088611369565b73ffffffffffffffffffffffffffffffffffffffff166110a66108f3565b73ffffffffffffffffffffffffffffffffffffffff16146110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f3906122a9565b60405180910390fd5b565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6111cb610c22565b60016000806101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861120e611369565b60405161121b9190611b01565b60405180910390a1565b61125760016000858152602001908152602001600020600260008681526020019081526020016000208484606461159b565b50505050565b6060600160008381526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156112f257602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116112a8575b50505050509050919050565b60006002600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff16905092915050565b600033905090565b60008273ffffffffffffffffffffffffffffffffffffffff1682600067ffffffffffffffff8111156113a6576113a56122c9565b5b6040519080825280601f01601f1916602001820160405280156113d85781602001600182028036833780820191505090505b506040516113e6919061216f565b60006040518083038185875af1925050503d8060008114611423576040519150601f19603f3d011682016040523d82523d6000602084013e611428565b606091505b5050905080611463576040517fb816c14c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b6000808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb858560405160240161149a9291906121c8565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516114e8919061216f565b6000604051808303816000865af19150503d8060008114611525576040519150601f19603f3d011682016040523d82523d6000602084013e61152a565b606091505b5091509150600082801561155a5750600082511480611559575081806020019051810190611558919061219b565b5b5b905080611593576040517f5fb636fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050565b6000826115b2576115ad8686866115ca565b6115bf565b6115be868686856117e0565b5b905095945050505050565b6000808360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508060000160009054906101000a900460ff16915081156117d8576000816001015490506000600187805490506116439190612327565b90508082146117325760008782815481106116615761166061235b565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050808884815481106116a2576116a161235b565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550505b868054806117435761174261238a565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590558560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160006101000a81549060ff02191690556001820160009055505050505b509392505050565b60008360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1615905080156119615781858054905010611877576040517fb1655e3300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051806040016040528060011515815260200186805490508152508460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015590505084839080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b949350505050565b6000819050919050565b61197c81611969565b82525050565b60006020820190506119976000830184611973565b92915050565b600080fd5b600080fd5b600060a082840312156119bd576119bc6119a2565b5b81905092915050565b600060a082840312156119dc576119db61199d565b5b60006119ea848285016119a7565b91505092915050565b600067ffffffffffffffff82169050919050565b611a10816119f3565b82525050565b6000602082019050611a2b6000830184611a07565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611a5c82611a31565b9050919050565b611a6c81611a51565b8114611a7757600080fd5b50565b600081359050611a8981611a63565b92915050565b600060208284031215611aa557611aa461199d565b5b6000611ab384828501611a7a565b91505092915050565b60008115159050919050565b611ad181611abc565b82525050565b6000602082019050611aec6000830184611ac8565b92915050565b611afb81611a51565b82525050565b6000602082019050611b166000830184611af2565b92915050565b611b2581611969565b8114611b3057600080fd5b50565b600081359050611b4281611b1c565b92915050565b600080600060608486031215611b6157611b6061199d565b5b6000611b6f86828701611a7a565b9350506020611b8086828701611a7a565b9250506040611b9186828701611b33565b9150509250925092565b60008060408385031215611bb257611bb161199d565b5b6000611bc085828601611a7a565b9250506020611bd185828601611a7a565b9150509250929050565b611be481611abc565b8114611bef57600080fd5b50565b600081359050611c0181611bdb565b92915050565b60008060408385031215611c1e57611c1d61199d565b5b6000611c2c85828601611a7a565b9250506020611c3d85828601611bf2565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611c7c81611a51565b82525050565b6000611c8e8383611c73565b60208301905092915050565b6000602082019050919050565b6000611cb282611c47565b611cbc8185611c52565b9350611cc783611c63565b8060005b83811015611cf8578151611cdf8882611c82565b9750611cea83611c9a565b925050600181019050611ccb565b5085935050505092915050565b60006020820190508181036000830152611d1f8184611ca7565b905092915050565b600063ffffffff82169050919050565b611d4081611d27565b8114611d4b57600080fd5b50565b600081359050611d5d81611d37565b92915050565b600060208284031215611d7957611d7861199d565b5b6000611d8784828501611d4e565b91505092915050565b611d9981611d27565b82525050565b6000819050919050565b611db281611d9f565b82525050565b6000608082019050611dcd6000830187611973565b611dda6020830186611d90565b611de76040830185611da9565b611df46060830184611af2565b95945050505050565b611e06816119f3565b8114611e1157600080fd5b50565b600081519050611e2381611dfd565b92915050565b600060208284031215611e3f57611e3e61199d565b5b6000611e4d84828501611e14565b91505092915050565b600060a082019050611e6b6000830188611973565b611e786020830187611d90565b611e856040830186611da9565b611e926060830185611af2565b611e9f6080830184611da9565b9695505050505050565b600060c082019050611ebe6000830189611d90565b611ecb6020830188611da9565b611ed86040830187611af2565b611ee56060830186611973565b611ef26080830185611973565b611eff60a0830184611973565b979650505050505050565b600081519050611f1981611b1c565b92915050565b600060208284031215611f3557611f3461199d565b5b6000611f4384828501611f0a565b91505092915050565b600082825260208201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000611fb9602683611f4c565b9150611fc482611f5d565b604082019050919050565b60006020820190508181036000830152611fe881611fac565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000612025601083611f4c565b915061203082611fef565b602082019050919050565b6000602082019050818103600083015261205481612018565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000612091601f83611f4c565b915061209c8261205b565b602082019050919050565b600060208201905081810360008301526120c081612084565b9050919050565b60006060820190506120dc6000830186611af2565b6120e96020830185611af2565b6120f66040830184611973565b949350505050565b600081519050919050565b600081905092915050565b60005b83811015612132578082015181840152602081019050612117565b60008484015250505050565b6000612149826120fe565b6121538185612109565b9350612163818560208601612114565b80840191505092915050565b600061217b828461213e565b915081905092915050565b60008151905061219581611bdb565b92915050565b6000602082840312156121b1576121b061199d565b5b60006121bf84828501612186565b91505092915050565b60006040820190506121dd6000830185611af2565b6121ea6020830184611973565b9392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000612227601483611f4c565b9150612232826121f1565b602082019050919050565b600060208201905081810360008301526122568161221a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612293602083611f4c565b915061229e8261225d565b602082019050919050565b600060208201905081810360008301526122c281612286565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061233282611969565b915061233d83611969565b9250828203905081811115612355576123546122f8565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220d10206cc89e227048aefe4fa6344563d184d2589a050e70fdd23755892b0186a64736f6c634300081300330000000000000000000000009daf8c91aefae50b9c0e69629d3f6ca40ca3b3fe00000000000000000000000072e28c7f34100afefc399fcc0ae041b8fe5841ae000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106101095760003560e01c806383d8534611610095578063c2c518e111610064578063c2c518e114610312578063e3725b1514610329578063eedc966a14610354578063f2fde38b14610391578063f3ae2415146103ba57610109565b806383d853461461027e5780638456cb59146102a75780638da5cb5b146102be578063a5e90eee146102e957610109565b8063440d7248116100dc578063440d7248146101ab57806346117830146101e85780635c975abb146102135780635d2251d51461023e578063715018a61461026757610109565b8063093f0e271461010e578063103b739714610139578063385df13e146101645780633f4ba83a14610194575b600080fd5b34801561011a57600080fd5b506101236103f7565b6040516101309190611982565b60405180910390f35b34801561014557600080fd5b5061014e61041e565b60405161015b9190611982565b60405180910390f35b61017e600480360381019061017991906119c6565b61044e565b60405161018b9190611a16565b60405180910390f35b3480156101a057600080fd5b506101a9610757565b005b3480156101b757600080fd5b506101d260048036038101906101cd9190611a8f565b6107a8565b6040516101df9190611ad7565b60405180910390f35b3480156101f457600080fd5b506101fd6107af565b60405161020a9190611b01565b60405180910390f35b34801561021f57600080fd5b506102286107d3565b6040516102359190611ad7565b60405180910390f35b34801561024a57600080fd5b5061026560048036038101906102609190611b48565b6107e9565b005b34801561027357600080fd5b5061027c610838565b005b34801561028a57600080fd5b506102a560048036038101906102a09190611b9b565b61084c565b005b3480156102b357600080fd5b506102bc6108a2565b005b3480156102ca57600080fd5b506102d36108f3565b6040516102e09190611b01565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190611c07565b61091c565b005b34801561031e57600080fd5b50610327610999565b005b34801561033557600080fd5b5061033e610a49565b60405161034b9190611d05565b60405180910390f35b34801561036057600080fd5b5061037b60048036038101906103769190611a8f565b610a79565b6040516103889190611982565b60405180910390f35b34801561039d57600080fd5b506103b860048036038101906103b39190611a8f565b610b4c565b005b3480156103c657600080fd5b506103e160048036038101906103dc9190611a8f565b610bcf565b6040516103ee9190611ad7565b60405180910390f35b7f22ad9585a395edc8067b50da4778cafbb7fa2c4bbd7619fad6aeba403857fd7460001c81565b60006104497f6d439300980e333f0256d64be2c9f67e86f4493ce25f82498d6db7f4be3d9e6f610c02565b905090565b6000610458610c22565b610460610c6c565b6104828260600160208101906104769190611a8f565b33308560000135610cbb565b6104c38260600160208101906104989190611a8f565b7f0000000000000000000000009daf8c91aefae50b9c0e69629d3f6ca40ca3b3fe8460000135610df1565b6000801b8260800135036105a6577f0000000000000000000000009daf8c91aefae50b9c0e69629d3f6ca40ca3b3fe73ffffffffffffffffffffffffffffffffffffffff16636fd3504e83600001358460200160208101906105259190611d63565b856040013586606001602081019061053d9190611a8f565b6040518563ffffffff1660e01b815260040161055c9493929190611db8565b6020604051808303816000875af115801561057b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059f9190611e29565b905061067d565b7f0000000000000000000000009daf8c91aefae50b9c0e69629d3f6ca40ca3b3fe73ffffffffffffffffffffffffffffffffffffffff1663f856ddb683600001358460200160208101906105fa9190611d63565b85604001358660600160208101906106129190611a8f565b87608001356040518663ffffffff1660e01b8152600401610637959493929190611e56565b6020604051808303816000875af1158015610656573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067a9190611e29565b90505b6106bb8260600160208101906106939190611a8f565b7f0000000000000000000000009daf8c91aefae50b9c0e69629d3f6ca40ca3b3fe6000610df1565b8067ffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb9ca371acfa400c8f24c295d7a65dc53334c762f84de89037884af886fb0e10b8460200160208101906107119190611d63565b85604001358660600160208101906107299190611a8f565b8760000135344260405161074296959493929190611ea9565b60405180910390a3610752610f24565b919050565b61076033610bcf565b610796576040517f7c3ea23f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61079e610f2e565b6107a6610f77565b565b6000919050565b7f0000000000000000000000009daf8c91aefae50b9c0e69629d3f6ca40ca3b3fe81565b60008060009054906101000a900460ff16905090565b6107f233610bcf565b610828576040517f7c3ea23f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610833838383610fd9565b505050565b610840611080565b61084a60006110fe565b565b61085533610bcf565b61088b576040517f7c3ea23f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61089e828261089985610a79565b610fd9565b5050565b6108ab33610bcf565b6108e1576040517f7c3ea23f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108e9610c22565b6108f16111c3565b565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610924611080565b61094f7f6d439300980e333f0256d64be2c9f67e86f4493ce25f82498d6db7f4be3d9e6f8383611225565b8015158273ffffffffffffffffffffffffffffffffffffffff167fbe9474bb3e78da7e315cdffa5cfa30b767fcc95bbf44a6197da60228eea1028660405160405180910390a35050565b6109a233610bcf565b6109d8576040517f7c3ea23f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a047f6d439300980e333f0256d64be2c9f67e86f4493ce25f82498d6db7f4be3d9e6f336000611225565b3373ffffffffffffffffffffffffffffffffffffffff167f6cc2c67081f55c2fffb7c008fa995fbbf890f48c7c16fba93d8220f00dc84cc560405160405180910390a2565b6060610a747f6d439300980e333f0256d64be2c9f67e86f4493ce25f82498d6db7f4be3d9e6f61125d565b905090565b600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610aca57479050610b47565b8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610b039190611b01565b602060405180830381865afa158015610b20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b449190611f1f565b90505b919050565b610b54611080565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bba90611fcf565b60405180910390fd5b610bcc816110fe565b50565b6000610bfb7f6d439300980e333f0256d64be2c9f67e86f4493ce25f82498d6db7f4be3d9e6f836112fe565b9050919050565b600060016000838152602001908152602001600020805490509050919050565b610c2a6107d3565b15610c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c619061203b565b60405180910390fd5b565b600260035403610cb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca8906120a7565b60405180910390fd5b6002600381905550565b6000808573ffffffffffffffffffffffffffffffffffffffff166323b872dd868686604051602401610cef939291906120c7565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610d3d919061216f565b6000604051808303816000865af19150503d8060008114610d7a576040519150601f19603f3d011682016040523d82523d6000602084013e610d7f565b606091505b50915091506000828015610daf5750600082511480610dae575081806020019051810190610dad919061219b565b5b5b905080610de8576040517f2d9d5b4100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050505050565b6000808473ffffffffffffffffffffffffffffffffffffffff1663095ea7b38585604051602401610e239291906121c8565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610e71919061216f565b6000604051808303816000865af19150503d8060008114610eae576040519150601f19603f3d011682016040523d82523d6000602084013e610eb3565b606091505b50915091506000828015610ee35750600082511480610ee2575081806020019051810190610ee1919061219b565b5b5b905080610f1c576040517fb45d44e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050565b6001600381905550565b610f366107d3565b610f75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6c9061223d565b60405180910390fd5b565b610f7f610f2e565b60008060006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa610fc2611369565b604051610fcf9190611b01565b60405180910390a1565b610fe2836107a8565b15611019576040517f88eed33200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361106f5761106a8282611371565b61107b565b61107a838383611468565b5b505050565b611088611369565b73ffffffffffffffffffffffffffffffffffffffff166110a66108f3565b73ffffffffffffffffffffffffffffffffffffffff16146110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f3906122a9565b60405180910390fd5b565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6111cb610c22565b60016000806101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861120e611369565b60405161121b9190611b01565b60405180910390a1565b61125760016000858152602001908152602001600020600260008681526020019081526020016000208484606461159b565b50505050565b6060600160008381526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156112f257602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116112a8575b50505050509050919050565b60006002600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff16905092915050565b600033905090565b60008273ffffffffffffffffffffffffffffffffffffffff1682600067ffffffffffffffff8111156113a6576113a56122c9565b5b6040519080825280601f01601f1916602001820160405280156113d85781602001600182028036833780820191505090505b506040516113e6919061216f565b60006040518083038185875af1925050503d8060008114611423576040519150601f19603f3d011682016040523d82523d6000602084013e611428565b606091505b5050905080611463576040517fb816c14c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b6000808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb858560405160240161149a9291906121c8565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516114e8919061216f565b6000604051808303816000865af19150503d8060008114611525576040519150601f19603f3d011682016040523d82523d6000602084013e61152a565b606091505b5091509150600082801561155a5750600082511480611559575081806020019051810190611558919061219b565b5b5b905080611593576040517f5fb636fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050565b6000826115b2576115ad8686866115ca565b6115bf565b6115be868686856117e0565b5b905095945050505050565b6000808360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508060000160009054906101000a900460ff16915081156117d8576000816001015490506000600187805490506116439190612327565b90508082146117325760008782815481106116615761166061235b565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050808884815481106116a2576116a161235b565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550505b868054806117435761174261238a565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590558560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160006101000a81549060ff02191690556001820160009055505050505b509392505050565b60008360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1615905080156119615781858054905010611877576040517fb1655e3300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051806040016040528060011515815260200186805490508152508460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015590505084839080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b949350505050565b6000819050919050565b61197c81611969565b82525050565b60006020820190506119976000830184611973565b92915050565b600080fd5b600080fd5b600060a082840312156119bd576119bc6119a2565b5b81905092915050565b600060a082840312156119dc576119db61199d565b5b60006119ea848285016119a7565b91505092915050565b600067ffffffffffffffff82169050919050565b611a10816119f3565b82525050565b6000602082019050611a2b6000830184611a07565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611a5c82611a31565b9050919050565b611a6c81611a51565b8114611a7757600080fd5b50565b600081359050611a8981611a63565b92915050565b600060208284031215611aa557611aa461199d565b5b6000611ab384828501611a7a565b91505092915050565b60008115159050919050565b611ad181611abc565b82525050565b6000602082019050611aec6000830184611ac8565b92915050565b611afb81611a51565b82525050565b6000602082019050611b166000830184611af2565b92915050565b611b2581611969565b8114611b3057600080fd5b50565b600081359050611b4281611b1c565b92915050565b600080600060608486031215611b6157611b6061199d565b5b6000611b6f86828701611a7a565b9350506020611b8086828701611a7a565b9250506040611b9186828701611b33565b9150509250925092565b60008060408385031215611bb257611bb161199d565b5b6000611bc085828601611a7a565b9250506020611bd185828601611a7a565b9150509250929050565b611be481611abc565b8114611bef57600080fd5b50565b600081359050611c0181611bdb565b92915050565b60008060408385031215611c1e57611c1d61199d565b5b6000611c2c85828601611a7a565b9250506020611c3d85828601611bf2565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611c7c81611a51565b82525050565b6000611c8e8383611c73565b60208301905092915050565b6000602082019050919050565b6000611cb282611c47565b611cbc8185611c52565b9350611cc783611c63565b8060005b83811015611cf8578151611cdf8882611c82565b9750611cea83611c9a565b925050600181019050611ccb565b5085935050505092915050565b60006020820190508181036000830152611d1f8184611ca7565b905092915050565b600063ffffffff82169050919050565b611d4081611d27565b8114611d4b57600080fd5b50565b600081359050611d5d81611d37565b92915050565b600060208284031215611d7957611d7861199d565b5b6000611d8784828501611d4e565b91505092915050565b611d9981611d27565b82525050565b6000819050919050565b611db281611d9f565b82525050565b6000608082019050611dcd6000830187611973565b611dda6020830186611d90565b611de76040830185611da9565b611df46060830184611af2565b95945050505050565b611e06816119f3565b8114611e1157600080fd5b50565b600081519050611e2381611dfd565b92915050565b600060208284031215611e3f57611e3e61199d565b5b6000611e4d84828501611e14565b91505092915050565b600060a082019050611e6b6000830188611973565b611e786020830187611d90565b611e856040830186611da9565b611e926060830185611af2565b611e9f6080830184611da9565b9695505050505050565b600060c082019050611ebe6000830189611d90565b611ecb6020830188611da9565b611ed86040830187611af2565b611ee56060830186611973565b611ef26080830185611973565b611eff60a0830184611973565b979650505050505050565b600081519050611f1981611b1c565b92915050565b600060208284031215611f3557611f3461199d565b5b6000611f4384828501611f0a565b91505092915050565b600082825260208201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000611fb9602683611f4c565b9150611fc482611f5d565b604082019050919050565b60006020820190508181036000830152611fe881611fac565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000612025601083611f4c565b915061203082611fef565b602082019050919050565b6000602082019050818103600083015261205481612018565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000612091601f83611f4c565b915061209c8261205b565b602082019050919050565b600060208201905081810360008301526120c081612084565b9050919050565b60006060820190506120dc6000830186611af2565b6120e96020830185611af2565b6120f66040830184611973565b949350505050565b600081519050919050565b600081905092915050565b60005b83811015612132578082015181840152602081019050612117565b60008484015250505050565b6000612149826120fe565b6121538185612109565b9350612163818560208601612114565b80840191505092915050565b600061217b828461213e565b915081905092915050565b60008151905061219581611bdb565b92915050565b6000602082840312156121b1576121b061199d565b5b60006121bf84828501612186565b91505092915050565b60006040820190506121dd6000830185611af2565b6121ea6020830184611973565b9392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000612227601483611f4c565b9150612232826121f1565b602082019050919050565b600060208201905081810360008301526122568161221a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612293602083611f4c565b915061229e8261225d565b602082019050919050565b600060208201905081810360008301526122c281612286565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061233282611969565b915061233d83611969565b9250828203905081811115612355576123546122f8565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220d10206cc89e227048aefe4fa6344563d184d2589a050e70fdd23755892b0186a64736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000009daf8c91aefae50b9c0e69629d3f6ca40ca3b3fe00000000000000000000000072e28c7f34100afefc399fcc0ae041b8fe5841ae000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _tokenMessenger (address): 0x9daF8c91AEFAE50b9c0E69629D3F6Ca40cA3B3FE
Arg [1] : _owner (address): 0x72E28c7F34100AfefC399fcc0AE041B8fe5841AE
Arg [2] : _managers (address[]):
Arg [3] : _addOwnerToManagers (bool): False
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000009daf8c91aefae50b9c0e69629d3f6ca40ca3b3fe
Arg [1] : 00000000000000000000000072e28c7f34100afefc399fcc0ae041b8fe5841ae
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.