Overview
MNT Balance
MNT Value
$0.00Latest 9 from a total of 9 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Set Router Trans... | 79849997 | 249 days ago | IN | 0 MNT | 0.00237833 | ||||
| Set Routers | 79849979 | 249 days ago | IN | 0 MNT | 0.00262882 | ||||
| Set Router Trans... | 79191473 | 265 days ago | IN | 0 MNT | 0.00170084 | ||||
| Set Routers | 79191462 | 265 days ago | IN | 0 MNT | 0.00188598 | ||||
| Remove Routers | 78030278 | 292 days ago | IN | 0 MNT | 0.00157298 | ||||
| Set Routers | 77120898 | 313 days ago | IN | 0 MNT | 0.01055036 | ||||
| Set Router Trans... | 75227676 | 356 days ago | IN | 0 MNT | 0.00319367 | ||||
| Set Routers | 75227651 | 356 days ago | IN | 0 MNT | 0.01581538 | ||||
| Set Gateway | 75179888 | 358 days ago | IN | 0 MNT | 0.006798 |
View more zero value Internal Transactions in Advanced View mode
Cross-Chain Transactions
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.22;
import { IRegistry } from './interfaces/IRegistry.sol';
import { BalanceManagement } from './BalanceManagement.sol';
import { SystemVersionId } from './SystemVersionId.sol';
import { TargetGasReserve } from './crosschain/TargetGasReserve.sol';
import './helpers/AddressHelper.sol' as AddressHelper;
import './Constants.sol' as Constants;
import './DataStructures.sol' as DataStructures;
/**
* @title ActionExecutorRegistry
* @notice The contract for action settings
*/
contract ActionExecutorRegistry is SystemVersionId, TargetGasReserve, BalanceManagement, IRegistry {
/**
* @dev Registered cross-chain gateway addresses by type
*/
mapping(uint256 gatewayType => address gatewayAddress) public gatewayMap;
/**
* @dev Registered cross-chain gateway types
*/
uint256[] public gatewayTypeList;
/**
* @dev Registered cross-chain gateway type indices
*/
mapping(uint256 gatewayType => DataStructures.OptionalValue gatewayTypeIndex)
public gatewayTypeIndexMap;
/**
* @dev Registered swap router addresses by type
*/
mapping(uint256 routerType => address routerAddress) public routerMap;
/**
* @dev Registered swap router types
*/
uint256[] public routerTypeList;
/**
* @dev Registered swap router type indices
*/
mapping(uint256 routerType => DataStructures.OptionalValue routerTypeIndex)
public routerTypeIndexMap;
/**
* @dev Registered swap router transfer addresses by router type
*/
mapping(uint256 routerType => address routerTransferAddress) public routerTransferMap;
/**
* @notice Emitted when a registered cross-chain gateway contract address is added or updated
* @param gatewayType The type of the registered cross-chain gateway
* @param gatewayAddress The address of the registered cross-chain gateway contract
*/
event SetGateway(uint256 indexed gatewayType, address indexed gatewayAddress);
/**
* @notice Emitted when a registered cross-chain gateway contract address is removed
* @param gatewayType The type of the removed cross-chain gateway
*/
event RemoveGateway(uint256 indexed gatewayType);
/**
* @notice Emitted when a registered swap router contract address is added or updated
* @param routerType The type of the registered swap router
* @param routerAddress The address of the registered swap router contract
*/
event SetRouter(uint256 indexed routerType, address indexed routerAddress);
/**
* @notice Emitted when a registered swap router contract address is removed
* @param routerType The type of the removed swap router
*/
event RemoveRouter(uint256 indexed routerType);
/**
* @notice Emitted when a registered swap router transfer contract address is set
* @param routerType The type of the swap router
* @param routerTransfer The address of the swap router transfer contract
*/
event SetRouterTransfer(uint256 indexed routerType, address indexed routerTransfer);
/**
* @notice Emitted when the requested cross-chain gateway type is not set
*/
error GatewayNotSetError();
/**
* @notice Emitted when the requested swap router type is not set
*/
error RouterNotSetError();
/**
* @notice Deploys the ActionExecutorRegistry contract
* @param _gateways Initial values of cross-chain gateway types and addresses
* @param _targetGasReserve The initial gas reserve value for target chain action processing
* @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(
DataStructures.KeyToAddressValue[] memory _gateways,
uint256 _targetGasReserve,
address _owner,
address[] memory _managers,
bool _addOwnerToManagers
) {
for (uint256 index; index < _gateways.length; index++) {
DataStructures.KeyToAddressValue memory item = _gateways[index];
_setGateway(item.key, item.value);
}
_setTargetGasReserve(_targetGasReserve);
_initRoles(_owner, _managers, _addOwnerToManagers);
}
/**
* @notice Adds or updates a registered cross-chain gateway contract address
* @param _gatewayType The type of the registered cross-chain gateway
* @param _gatewayAddress The address of the registered cross-chain gateway contract
*/
function setGateway(uint256 _gatewayType, address _gatewayAddress) external onlyManager {
_setGateway(_gatewayType, _gatewayAddress);
}
/**
* @notice Removes a registered cross-chain gateway contract address
* @param _gatewayType The type of the removed cross-chain gateway
*/
function removeGateway(uint256 _gatewayType) external onlyManager {
address gatewayAddress = gatewayMap[_gatewayType];
if (gatewayAddress == address(0)) {
revert GatewayNotSetError();
}
DataStructures.combinedMapRemove(
gatewayMap,
gatewayTypeList,
gatewayTypeIndexMap,
_gatewayType
);
emit RemoveGateway(_gatewayType);
}
/**
* @notice Adds or updates registered swap router contract addresses
* @param _routers Types and addresses of swap routers
*/
function setRouters(DataStructures.KeyToAddressValue[] calldata _routers) external onlyManager {
for (uint256 index; index < _routers.length; index++) {
DataStructures.KeyToAddressValue calldata item = _routers[index];
_setRouter(item.key, item.value);
}
}
/**
* @notice Removes registered swap router contract addresses
* @param _routerTypes Types of swap routers
*/
function removeRouters(uint256[] calldata _routerTypes) external onlyManager {
for (uint256 index; index < _routerTypes.length; index++) {
uint256 routerType = _routerTypes[index];
_removeRouter(routerType);
}
}
/**
* @notice Adds or updates a registered swap router transfer contract address
* @dev Zero address can be used to remove a router transfer contract
* @param _routerType The type of the swap router
* @param _routerTransfer The address of the swap router transfer contract
*/
function setRouterTransfer(uint256 _routerType, address _routerTransfer) external onlyManager {
if (routerMap[_routerType] == address(0)) {
revert RouterNotSetError();
}
AddressHelper.requireContractOrZeroAddress(_routerTransfer);
routerTransferMap[_routerType] = _routerTransfer;
emit SetRouterTransfer(_routerType, _routerTransfer);
}
/**
* @notice Getter of source chain settings for a cross-chain swap
* @param _gatewayType The type of the cross-chain gateway
* @param _routerType The type of the swap router
* @return Source chain settings for a cross-chain swap
*/
function sourceSettings(
uint256 _gatewayType,
uint256 _routerType
) external view returns (SourceSettings memory) {
(address router, address routerTransfer) = _routerAddresses(_routerType);
return
SourceSettings({
gateway: gatewayMap[_gatewayType],
router: router,
routerTransfer: routerTransfer
});
}
/**
* @notice Getter of target chain settings for a cross-chain swap
* @param _routerType The type of the swap router
* @return Target chain settings for a cross-chain swap
*/
function targetSettings(uint256 _routerType) external view returns (TargetSettings memory) {
(address router, address routerTransfer) = _routerAddresses(_routerType);
return
TargetSettings({
router: router,
routerTransfer: routerTransfer,
gasReserve: targetGasReserve
});
}
/**
* @notice Getter of registered cross-chain gateway type count
* @return Registered cross-chain gateway type count
*/
function gatewayTypeCount() external view returns (uint256) {
return gatewayTypeList.length;
}
/**
* @notice Getter of the complete list of registered cross-chain gateway types
* @return The complete list of registered cross-chain gateway types
*/
function fullGatewayTypeList() external view returns (uint256[] memory) {
return gatewayTypeList;
}
/**
* @notice Getter of registered swap router type count
* @return Registered swap router type count
*/
function routerTypeCount() external view returns (uint256) {
return routerTypeList.length;
}
/**
* @notice Getter of the complete list of registered swap router types
* @return The complete list of registered swap router types
*/
function fullRouterTypeList() external view returns (uint256[] memory) {
return routerTypeList;
}
function _setGateway(uint256 _gatewayType, address _gatewayAddress) private {
AddressHelper.requireContract(_gatewayAddress);
address previousGatewayAddress = gatewayMap[_gatewayType];
if (_gatewayAddress != previousGatewayAddress) {
DataStructures.combinedMapSet(
gatewayMap,
gatewayTypeList,
gatewayTypeIndexMap,
_gatewayType,
_gatewayAddress,
Constants.LIST_SIZE_LIMIT_DEFAULT
);
}
emit SetGateway(_gatewayType, _gatewayAddress);
}
function _setRouter(uint256 _routerType, address _routerAddress) private {
AddressHelper.requireContract(_routerAddress);
DataStructures.combinedMapSet(
routerMap,
routerTypeList,
routerTypeIndexMap,
_routerType,
_routerAddress,
Constants.LIST_SIZE_LIMIT_ROUTERS
);
emit SetRouter(_routerType, _routerAddress);
}
function _removeRouter(uint256 _routerType) private {
DataStructures.combinedMapRemove(
routerMap,
routerTypeList,
routerTypeIndexMap,
_routerType
);
delete routerTransferMap[_routerType];
emit RemoveRouter(_routerType);
}
function _routerAddresses(
uint256 _routerType
) private view returns (address router, address routerTransfer) {
router = routerMap[_routerType];
routerTransfer = routerTransferMap[_routerType];
if (routerTransfer == address(0)) {
routerTransfer = router;
}
}
}// 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 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.22;
import { ITokenBalance } from './interfaces/ITokenBalance.sol';
import { ManagerRole } from './roles/ManagerRole.sol';
import './helpers/TransferHelper.sol' as TransferHelper;
import './Constants.sol' as Constants;
/**
* @title BalanceManagement
* @notice Base contract for the withdrawal of tokens, except for reserved ones
*/
abstract contract BalanceManagement is ManagerRole {
/**
* @notice Emitted when the specified token is reserved
*/
error ReservedTokenError();
/**
* @notice Performs the withdrawal of tokens, except for reserved ones
* @dev Use the "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE" address for the native token
* @param _tokenAddress The address of the token
* @param _tokenAmount The amount of the token
*/
function cleanup(address _tokenAddress, uint256 _tokenAmount) external onlyManager {
if (isReservedToken(_tokenAddress)) {
revert ReservedTokenError();
}
if (_tokenAddress == Constants.NATIVE_TOKEN_ADDRESS) {
TransferHelper.safeTransferNative(msg.sender, _tokenAmount);
} else {
TransferHelper.safeTransfer(_tokenAddress, msg.sender, _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 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
}
}// SPDX-License-Identifier: AGPL-3.0-only pragma solidity 0.8.22; /** * @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.22;
import { ManagerRole } from '../roles/ManagerRole.sol';
/**
* @title TargetGasReserve
* @notice Base contract that implements the gas reserve logic for the target chain actions
*/
abstract contract TargetGasReserve is ManagerRole {
/**
* @dev The target chain gas reserve value
*/
uint256 public targetGasReserve;
/**
* @notice Emitted when the target chain gas reserve value is set
* @param gasReserve The target chain gas reserve value
*/
event SetTargetGasReserve(uint256 gasReserve);
/**
* @notice Sets the target chain gas reserve value
* @param _gasReserve The target chain gas reserve value
*/
function setTargetGasReserve(uint256 _gasReserve) external onlyManager {
_setTargetGasReserve(_gasReserve);
}
function _setTargetGasReserve(uint256 _gasReserve) internal virtual {
targetGasReserve = _gasReserve;
emit SetTargetGasReserve(_gasReserve);
}
}// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.22;
/**
* @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 Sets or updates a value in a combined double map (two mappings with a key list and key index mapping)
* @param _map1 The first mapping reference
* @param _map2 The second mapping reference
* @param _keyList The key list reference
* @param _keyIndexMap The key list index mapping reference
* @param _key The numeric key
* @param _value1 The first address value
* @param _value2 The second address value
* @param _sizeLimit The map and list size limit
* @return isNewKey True if the key was just added, otherwise false
*/
function combinedDoubleMapSet(
mapping(uint256 => address) storage _map1,
mapping(uint256 => address) storage _map2,
uint256[] storage _keyList,
mapping(uint256 => OptionalValue) storage _keyIndexMap,
uint256 _key,
address _value1,
address _value2,
uint256 _sizeLimit
) returns (bool isNewKey) {
isNewKey = !_keyIndexMap[_key].isSet;
if (isNewKey) {
uniqueListAdd(_keyList, _keyIndexMap, _key, _sizeLimit);
}
_map1[_key] = _value1;
_map2[_key] = _value2;
}
/**
* @notice Removes a value from a combined double map (two mappings with a key list and key index mapping)
* @param _map1 The first mapping reference
* @param _map2 The second 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 combinedDoubleMapRemove(
mapping(uint256 => address) storage _map1,
mapping(uint256 => address) storage _map2,
uint256[] storage _keyList,
mapping(uint256 => OptionalValue) storage _keyIndexMap,
uint256 _key
) returns (bool isChanged) {
isChanged = _keyIndexMap[_key].isSet;
if (isChanged) {
delete _map1[_key];
delete _map2[_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.22;
/**
* @notice Emitted when the account is not a contract
* @param account The account address
*/
error NonContractAddressError(address account);
/**
* @notice Function to check if the account is a contract
* @return The account contract status flag
*/
function isContract(address _account) view returns (bool) {
return _account.code.length > 0;
}
/**
* @notice Function to require an account to be a contract
*/
function requireContract(address _account) view {
if (!isContract(_account)) {
revert NonContractAddressError(_account);
}
}
/**
* @notice Function to require an account to be a contract or a zero address
*/
function requireContractOrZeroAddress(address _account) view {
if (_account != address(0)) {
requireContract(_account);
}
}// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.22;
/**
* @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.22;
import { ISettings } from './ISettings.sol';
interface IRegistry is ISettings {
/**
* @notice Getter of the registered gateway address by the gateway type
* @param _gatewayType The gateway type
* @return gatewayAddress The registered gateway address
*/
function gatewayMap(uint256 _gatewayType) external view returns (address gatewayAddress);
/**
* @notice Getter of source chain settings for a cross-chain swap
* @param _gatewayType The type of the cross-chain gateway
* @param _routerType The type of the swap router
* @return Source chain settings for a cross-chain swap
*/
function sourceSettings(
uint256 _gatewayType,
uint256 _routerType
) external view returns (SourceSettings memory);
/**
* @notice Getter of target chain settings for a cross-chain swap
* @param _routerType The type of the swap router
* @return Target chain settings for a cross-chain swap
*/
function targetSettings(uint256 _routerType) external view returns (TargetSettings memory);
}// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.22;
/**
* @title ISettings
* @notice Settings data structure declarations
*/
interface ISettings {
/**
* @notice Source chain settings for a cross-chain swap
* @param gateway The cross-chain gateway contract address
* @param router The swap router contract address
* @param routerTransfer The swap router transfer contract address
*/
struct SourceSettings {
address gateway;
address router;
address routerTransfer;
}
/**
* @notice Target chain settings for a cross-chain swap
* @param router The swap router contract address
* @param routerTransfer The swap router transfer contract address
* @param gasReserve The target chain gas reserve value
*/
struct TargetSettings {
address router;
address routerTransfer;
uint256 gasReserve;
}
}// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.22;
/**
* @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.22;
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.22;
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.22;
/**
* @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-2025-01-22'));
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"evmVersion": "paris",
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"components":[{"internalType":"uint256","name":"key","type":"uint256"},{"internalType":"address","name":"value","type":"address"}],"internalType":"struct KeyToAddressValue[]","name":"_gateways","type":"tuple[]"},{"internalType":"uint256","name":"_targetGasReserve","type":"uint256"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address[]","name":"_managers","type":"address[]"},{"internalType":"bool","name":"_addOwnerToManagers","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"GatewayNotSetError","type":"error"},{"inputs":[],"name":"ListSizeLimitError","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NonContractAddressError","type":"error"},{"inputs":[],"name":"OnlyManagerError","type":"error"},{"inputs":[],"name":"ReservedTokenError","type":"error"},{"inputs":[],"name":"RouterNotSetError","type":"error"},{"inputs":[],"name":"SafeTransferError","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":true,"internalType":"uint256","name":"gatewayType","type":"uint256"}],"name":"RemoveGateway","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"routerType","type":"uint256"}],"name":"RemoveRouter","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"RenounceManagerRole","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"gatewayType","type":"uint256"},{"indexed":true,"internalType":"address","name":"gatewayAddress","type":"address"}],"name":"SetGateway","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":true,"internalType":"uint256","name":"routerType","type":"uint256"},{"indexed":true,"internalType":"address","name":"routerAddress","type":"address"}],"name":"SetRouter","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"routerType","type":"uint256"},{"indexed":true,"internalType":"address","name":"routerTransfer","type":"address"}],"name":"SetRouterTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"gasReserve","type":"uint256"}],"name":"SetTargetGasReserve","type":"event"},{"inputs":[],"name":"SYSTEM_VERSION_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"cleanup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fullGatewayTypeList","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fullManagerList","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fullRouterTypeList","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gatewayType","type":"uint256"}],"name":"gatewayMap","outputs":[{"internalType":"address","name":"gatewayAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gatewayTypeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gatewayType","type":"uint256"}],"name":"gatewayTypeIndexMap","outputs":[{"internalType":"bool","name":"isSet","type":"bool"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"gatewayTypeList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"uint256","name":"_gatewayType","type":"uint256"}],"name":"removeGateway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_routerTypes","type":"uint256[]"}],"name":"removeRouters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceManagerRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"routerType","type":"uint256"}],"name":"routerMap","outputs":[{"internalType":"address","name":"routerAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"routerType","type":"uint256"}],"name":"routerTransferMap","outputs":[{"internalType":"address","name":"routerTransferAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"routerTypeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"routerType","type":"uint256"}],"name":"routerTypeIndexMap","outputs":[{"internalType":"bool","name":"isSet","type":"bool"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"routerTypeList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gatewayType","type":"uint256"},{"internalType":"address","name":"_gatewayAddress","type":"address"}],"name":"setGateway","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":"uint256","name":"_routerType","type":"uint256"},{"internalType":"address","name":"_routerTransfer","type":"address"}],"name":"setRouterTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"key","type":"uint256"},{"internalType":"address","name":"value","type":"address"}],"internalType":"struct KeyToAddressValue[]","name":"_routers","type":"tuple[]"}],"name":"setRouters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gasReserve","type":"uint256"}],"name":"setTargetGasReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gatewayType","type":"uint256"},{"internalType":"uint256","name":"_routerType","type":"uint256"}],"name":"sourceSettings","outputs":[{"components":[{"internalType":"address","name":"gateway","type":"address"},{"internalType":"address","name":"router","type":"address"},{"internalType":"address","name":"routerTransfer","type":"address"}],"internalType":"struct ISettings.SourceSettings","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"targetGasReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_routerType","type":"uint256"}],"name":"targetSettings","outputs":[{"components":[{"internalType":"address","name":"router","type":"address"},{"internalType":"address","name":"routerTransfer","type":"address"},{"internalType":"uint256","name":"gasReserve","type":"uint256"}],"internalType":"struct ISettings.TargetSettings","name":"","type":"tuple"}],"stateMutability":"view","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"}]Contract Creation Code
60806040523480156200001157600080fd5b50604051620022c4380380620022c48339810160408190526200003491620008ac565b6200003f33620000b5565b60005b855181101562000091576000868281518110620000635762000063620009d5565b6020026020010151905062000087816000015182602001516200010560201b60201c565b5060010162000042565b506200009d8462000185565b620000aa838383620001c0565b505050505062000a23565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b62000110816200026e565b6000828152600460205260409020546001600160a01b0390811690821681146200014a576200014860046005600686866064620002aa565b505b6040516001600160a01b0383169084907f7abb2a08d413d164f83a1309ed5f176f1cbcec7981c54e1ea77166200f76f9d090600090a3505050565b60038190556040518181527fec9e8f9ec7dd2c5310e5b87c7bedeb6ba1c5943cb4d2da1ee80335508a5bc5a49060200160405180910390a150565b60006001600160a01b03841615620001d95783620001db565b335b905060005b8351811015620002225762000219848281518110620002035762000203620009d5565b602002602001015160016200030960201b60201c565b600101620001e0565b5081801562000239575062000237816200037c565b155b156200024c576200024c81600162000309565b6001600160a01b038116331462000268576200026881620003be565b50505050565b6001600160a01b0381163b620002a757604051638c50d7cd60e01b81526001600160a01b03821660048201526024015b60405180910390fd5b50565b60008381526020859052604090205460ff16158015620002d457620002d2868686856200043a565b505b600093845260209690965250604090912080546001600160a01b0319166001600160a01b039092169190911790555090919050565b62000313620004c9565b620003407f6d439300980e333f0256d64be2c9f67e86f4493ce25f82498d6db7f4be3d9e6f838362000527565b604051811515906001600160a01b038416907fbe9474bb3e78da7e315cdffa5cfa30b767fcc95bbf44a6197da60228eea1028690600090a35050565b6001600160a01b03811660009081527f260b29b219d450563ddb0e5ca806bdadb1e125f7e8c506de0443797dd7122728602052604081205460ff165b92915050565b620003c8620004c9565b6001600160a01b0381166200042f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016200029e565b620002a781620000b5565b60008281526020849052604090205460ff16158015620004c15784548211620004765760405163b1655e3360e01b815260040160405180910390fd5b60408051808201825260018082528754602080840191825260008881528982529485209351845460ff1916901515178455905192820192909255875490810188558783529120018390555b949350505050565b6000546001600160a01b03163314620005255760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200029e565b565b600083815260016020908152604080832060029092529091206200026891908484606460008262000565576200055f8686866200057d565b62000573565b6200057386868685620006b2565b9695505050505050565b6001600160a01b0381166000908152602083905260409020805460ff16908115620006aa5760018082015486549091600091620005bb9190620009eb565b90508082146200064f576000878281548110620005dc57620005dc620009d5565b9060005260206000200160009054906101000a90046001600160a01b0316905080888481548110620006125762000612620009d5565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394851617905592909116815290879052604090206001018290555b8680548062000662576200066262000a0d565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b038716825287905260408120805460ff191681556001015550505b509392505050565b6001600160a01b03821660009081526020849052604090205460ff16158015620004c15784548211620006f85760405163b1655e3360e01b815260040160405180910390fd5b6040805180820182526001808252875460208084019182526001600160a01b039790971660008181529888529388209251835460ff19169015151783555191810191909155865490810187559585529290932090930180546001600160a01b0319169091179055919050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156200079f576200079f62000764565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620007d057620007d062000764565b604052919050565b60006001600160401b03821115620007f457620007f462000764565b5060051b60200190565b80516001600160a01b03811681146200081657600080fd5b919050565b600082601f8301126200082d57600080fd5b81516020620008466200084083620007d8565b620007a5565b8083825260208201915060208460051b8701019350868411156200086957600080fd5b602086015b8481101562000890576200088281620007fe565b83529183019183016200086e565b509695505050505050565b805180151581146200081657600080fd5b600080600080600060a08688031215620008c557600080fd5b85516001600160401b0380821115620008dd57600080fd5b818801915088601f830112620008f257600080fd5b81516020620009056200084083620007d8565b82815260069290921b8401810191818101908c8411156200092557600080fd5b948201945b8386101562000977576040868e031215620009455760008081fd5b6200094f6200077a565b8651815262000960848801620007fe565b81850152825260409590950194908201906200092a565b809a505050808a0151975050506200099260408901620007fe565b94506060880151915080821115620009a957600080fd5b50620009b8888289016200081b565b925050620009c9608087016200089b565b90509295509295909350565b634e487b7160e01b600052603260045260246000fd5b81810381811115620003b857634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b6118918062000a336000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80639b9a0c951161010f578063dea3ae3f116100a2578063e6d475d011610071578063e6d475d014610541578063eedc966a14610549578063f2fde38b1461055c578063f3ae24151461056f57600080fd5b8063dea3ae3f146104f3578063e3725b1514610506578063e4634bc11461051b578063e5dac7031461052e57600080fd5b8063bdd390d9116100de578063bdd390d9146104a7578063c25bce5e146104d0578063c2c518e1146104d8578063ca19b65b146104e057600080fd5b80639b9a0c95146103fb578063a5e90eee14610424578063ae66aa7114610437578063b57688ff1461047a57600080fd5b8063619f42b711610187578063748a995b11610156578063748a995b146103b1578063759ccb51146103c45780638da5cb5b146103d75780639ab88c6f146103e857600080fd5b8063619f42b714610310578063630eae08146103555780636e32d3e414610368578063715018a6146103a957600080fd5b8063440d7248116101c3578063440d72481461028a5780635873b6ba146102ae5780635a6c4d8c146102c35780635a9fab501461030757600080fd5b8063093f0e27146101f5578063103b73971461022f5780631f3a7ccf1461026d57806330eb127814610275575b600080fd5b61021c7fe322224f3a42a02485e6bbb933e62e967e91050cefd657687e5c2dc7bf9d04d381565b6040519081526020015b60405180910390f35b60008051602061183c83398151915260005260016020527f3c2285c553468ca8f30447b24bb463c127f1b840e23a0cafa23caa79d906669a5461021c565b60055461021c565b610288610283366004611534565b610587565b005b61029e61029836600461155e565b50600090565b6040519015158152602001610226565b6102b66105eb565b6040516102269190611580565b6102f06102d13660046115c4565b6009602052600090815260409020805460019091015460ff9091169082565b604080519215158352602083019190915201610226565b61021c60035481565b61032361031e3660046115dd565b610643565b6040805182516001600160a01b0390811682526020808501518216908301529282015190921690820152606001610226565b6102886103633660046115c4565b6106ac565b6103916103763660046115c4565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610226565b6102886106de565b61021c6103bf3660046115c4565b6106f2565b61021c6103d23660046115c4565b610713565b6000546001600160a01b0316610391565b6102886103f63660046115ff565b610723565b6103916104093660046115c4565b6007602052600090815260409020546001600160a01b031681565b610288610432366004611682565b61079d565b61044a6104453660046115c4565b6107fa565b6040805182516001600160a01b039081168252602080850151909116908201529181015190820152606001610226565b6102f06104883660046115c4565b6006602052600090815260409020805460019091015460ff9091169082565b6103916104b53660046115c4565b600a602052600090815260409020546001600160a01b031681565b60085461021c565b610288610850565b6102886104ee3660046116b9565b6108bd565b6102886105013660046116b9565b6108ed565b61050e6109aa565b60405161022691906116e5565b610288610529366004611726565b6109c3565b61028861053c3660046115c4565b610a23565b6102b6610abe565b61021c61055736600461155e565b610b14565b61028861056a36600461155e565b610baf565b61029e61057d36600461155e565b610c2a565b905090565b61059033610c2a565b6105ad57604051637c3ea23f60e01b815260040160405180910390fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b038316016105e0576105dc3382610c6a565b5050565b6105dc823383610cf8565b6060600580548060200260200160405190810160405280929190818152602001828054801561063957602002820191906000526020600020905b815481526020019060010190808311610625575b5050505050905090565b60408051606081018252600080825260208201819052918101829052908061066a84610dea565b6040805160608101825260008981526004602090815290839020546001600160a01b039081168352948516908201529290911690820152925050505b92915050565b6106b533610c2a565b6106d257604051637c3ea23f60e01b815260040160405180910390fd5b6106db81610e1f565b50565b6106e6610e5a565b6106f06000610eb4565b565b6005818154811061070257600080fd5b600091825260209091200154905081565b6008818154811061070257600080fd5b61072c33610c2a565b61074957604051637c3ea23f60e01b815260040160405180910390fd5b60005b81811015610798573683838381811061076757610767611789565b905060400201905061078f816000013582602001602081019061078a919061155e565b610f04565b5060010161074c565b505050565b6107a5610e5a565b6107be60008051602061183c8339815191528383610f5a565b604051811515906001600160a01b038416907fbe9474bb3e78da7e315cdffa5cfa30b767fcc95bbf44a6197da60228eea1028690600090a35050565b60408051606081018252600080825260208201819052918101829052908061082184610dea565b604080516060810182526001600160a01b03938416815292909116602083015260035490820152949350505050565b61085933610c2a565b61087657604051637c3ea23f60e01b815260040160405180910390fd5b61089060008051602061183c833981519152336000610f5a565b60405133907f6cc2c67081f55c2fffb7c008fa995fbbf890f48c7c16fba93d8220f00dc84cc590600090a2565b6108c633610c2a565b6108e357604051637c3ea23f60e01b815260040160405180910390fd5b6105dc8282610f87565b6108f633610c2a565b61091357604051637c3ea23f60e01b815260040160405180910390fd5b6000828152600760205260409020546001600160a01b03166109485760405163ebb12eb360e01b815260040160405180910390fd5b61095181611002565b6000828152600a602052604080822080546001600160a01b0319166001600160a01b0385169081179091559051909184917f66e49d96cd98c11351d515875671af63416186605ef6cd3ae2214110766092dd9190a35050565b606061058260008051602061183c83398151915261101a565b6109cc33610c2a565b6109e957604051637c3ea23f60e01b815260040160405180910390fd5b60005b81811015610798576000838383818110610a0857610a08611789565b905060200201359050610a1a81611086565b506001016109ec565b610a2c33610c2a565b610a4957604051637c3ea23f60e01b815260040160405180910390fd5b6000818152600460205260409020546001600160a01b031680610a7f5760405163ba8ec24160e01b815260040160405180910390fd5b610a8e600460056006856110dc565b5060405182907fd74373b3c5b19af1d43b65f86bd63f6800b3b58ff6e0c1044d3d9503a1c73d4690600090a25050565b606060088054806020026020016040519081016040528092919081815260200182805480156106395760200282019190600052602060002090815481526020019060010190808311610625575050505050905090565b600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b03831601610b42575047919050565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015610b86573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a6919061179f565b919050565b610bb7610e5a565b6001600160a01b038116610c215760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6106db81610eb4565b6001600160a01b03811660009081527f260b29b219d450563ddb0e5ca806bdadb1e125f7e8c506de0443797dd7122728602052604081205460ff166106a6565b604080516000808252602082019092526001600160a01b038416908390604051610c9491906117b8565b60006040518083038185875af1925050503d8060008114610cd1576040519150601f19603f3d011682016040523d82523d6000602084013e610cd6565b606091505b505090508061079857604051632e05b05360e21b815260040160405180910390fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691610d5491906117b8565b6000604051808303816000865af19150503d8060008114610d91576040519150601f19603f3d011682016040523d82523d6000602084013e610d96565b606091505b50915091506000828015610dc2575081511580610dc2575081806020019051810190610dc291906117e7565b905080610de257604051632fdb1b7f60e11b815260040160405180910390fd5b505050505050565b600081815260076020908152604080832054600a909252909120546001600160a01b03918216911680610e1a5750805b915091565b60038190556040518181527fec9e8f9ec7dd2c5310e5b87c7bedeb6ba1c5943cb4d2da1ee80335508a5bc5a49060200160405180910390a150565b6000546001600160a01b031633146106f05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c18565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610f0d81611125565b610f1f600760086009858560c8611158565b506040516001600160a01b0382169083907fca5539b66dee2f17e4268fc1f3ce94aa3fb43a44e4651174b1eafd597476bb3f90600090a35050565b60008381526001602090815260408083206002909252909120610f819190848460646111b4565b50505050565b610f9081611125565b6000828152600460205260409020546001600160a01b039081169082168114610fc757610fc560046005600686866064611158565b505b6040516001600160a01b0383169084907f7abb2a08d413d164f83a1309ed5f176f1cbcec7981c54e1ea77166200f76f9d090600090a3505050565b6001600160a01b038116156106db576106db81611125565b60008181526001602090815260409182902080548351818402810184019094528084526060939283018282801561107a57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161105c575b50505050509050919050565b611095600760086009846110dc565b506000818152600a602052604080822080546001600160a01b03191690555182917f5848beff51a3442fb73c109ccd6f780a4697e2cc0b8b3afbb630e3843e73cbfd91a250565b60008181526020839052604090205460ff16801561111d57600082815260208690526040902080546001600160a01b031916905561111b8484846111e1565b505b949350505050565b6001600160a01b0381163b6106db57604051638c50d7cd60e01b81526001600160a01b0382166004820152602401610c18565b60008381526020859052604090205460ff1615801561117f5761117d868686856112bd565b505b600093845260209690965250604090912080546001600160a01b0319166001600160a01b039092169190911790555090919050565b6000826111cb576111c6868686611346565b6111d7565b6111d78686868561146d565b9695505050505050565b6000818152602083905260409020805460ff169081156112b557600180820154865490916000916112129190611804565b905080821461127157600087828154811061122f5761122f611789565b906000526020600020015490508088848154811061124f5761124f611789565b6000918252602080832090910192909255918252879052604090206001018290555b8680548061128157611281611825565b60008281526020808220830160001990810183905590920190925586825287905260408120805460ff191681556001015550505b509392505050565b60008281526020849052604090205460ff1615801561111d57845482116112f75760405163b1655e3360e01b815260040160405180910390fd5b60408051808201825260018082528754602080840191825260008881529881529388209251835460ff191690151517835551918101919091558654908101875595855290932090930155919050565b6001600160a01b0381166000908152602083905260409020805460ff169081156112b557600180820154865490916000916113819190611804565b905080821461140e57600087828154811061139e5761139e611789565b9060005260206000200160009054906101000a90046001600160a01b03169050808884815481106113d1576113d1611789565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394851617905592909116815290879052604090206001018290555b8680548061141e5761141e611825565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b038716825287905260408120805460ff19168155600101555050509392505050565b6001600160a01b03821660009081526020849052604090205460ff1615801561111d57845482116114b15760405163b1655e3360e01b815260040160405180910390fd5b6040805180820182526001808252875460208084019182526001600160a01b039790971660008181529888529388209251835460ff19169015151783555191810191909155865490810187559585529290932090930180546001600160a01b0319169091179055919050565b80356001600160a01b0381168114610baa57600080fd5b6000806040838503121561154757600080fd5b6115508361151d565b946020939093013593505050565b60006020828403121561157057600080fd5b6115798261151d565b9392505050565b6020808252825182820181905260009190848201906040850190845b818110156115b85783518352928401929184019160010161159c565b50909695505050505050565b6000602082840312156115d657600080fd5b5035919050565b600080604083850312156115f057600080fd5b50508035926020909101359150565b6000806020838503121561161257600080fd5b823567ffffffffffffffff8082111561162a57600080fd5b818501915085601f83011261163e57600080fd5b81358181111561164d57600080fd5b8660208260061b850101111561166257600080fd5b60209290920196919550909350505050565b80151581146106db57600080fd5b6000806040838503121561169557600080fd5b61169e8361151d565b915060208301356116ae81611674565b809150509250929050565b600080604083850312156116cc57600080fd5b823591506116dc6020840161151d565b90509250929050565b6020808252825182820181905260009190848201906040850190845b818110156115b85783516001600160a01b031683529284019291840191600101611701565b6000806020838503121561173957600080fd5b823567ffffffffffffffff8082111561175157600080fd5b818501915085601f83011261176557600080fd5b81358181111561177457600080fd5b8660208260051b850101111561166257600080fd5b634e487b7160e01b600052603260045260246000fd5b6000602082840312156117b157600080fd5b5051919050565b6000825160005b818110156117d957602081860181015185830152016117bf565b506000920191825250919050565b6000602082840312156117f957600080fd5b815161157981611674565b818103818111156106a657634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fdfe6d439300980e333f0256d64be2c9f67e86f4493ce25f82498d6db7f4be3d9e6fa2646970667358221220ba99fec5c98c2c9ac40e364c0bcbd82cfbf215e6d3c309c0c749ebf8e11bfe9264736f6c6343000816003300000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000ea6000000000000000000000000072e28c7f34100afefc399fcc0ae041b8fe5841ae00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101f05760003560e01c80639b9a0c951161010f578063dea3ae3f116100a2578063e6d475d011610071578063e6d475d014610541578063eedc966a14610549578063f2fde38b1461055c578063f3ae24151461056f57600080fd5b8063dea3ae3f146104f3578063e3725b1514610506578063e4634bc11461051b578063e5dac7031461052e57600080fd5b8063bdd390d9116100de578063bdd390d9146104a7578063c25bce5e146104d0578063c2c518e1146104d8578063ca19b65b146104e057600080fd5b80639b9a0c95146103fb578063a5e90eee14610424578063ae66aa7114610437578063b57688ff1461047a57600080fd5b8063619f42b711610187578063748a995b11610156578063748a995b146103b1578063759ccb51146103c45780638da5cb5b146103d75780639ab88c6f146103e857600080fd5b8063619f42b714610310578063630eae08146103555780636e32d3e414610368578063715018a6146103a957600080fd5b8063440d7248116101c3578063440d72481461028a5780635873b6ba146102ae5780635a6c4d8c146102c35780635a9fab501461030757600080fd5b8063093f0e27146101f5578063103b73971461022f5780631f3a7ccf1461026d57806330eb127814610275575b600080fd5b61021c7fe322224f3a42a02485e6bbb933e62e967e91050cefd657687e5c2dc7bf9d04d381565b6040519081526020015b60405180910390f35b60008051602061183c83398151915260005260016020527f3c2285c553468ca8f30447b24bb463c127f1b840e23a0cafa23caa79d906669a5461021c565b60055461021c565b610288610283366004611534565b610587565b005b61029e61029836600461155e565b50600090565b6040519015158152602001610226565b6102b66105eb565b6040516102269190611580565b6102f06102d13660046115c4565b6009602052600090815260409020805460019091015460ff9091169082565b604080519215158352602083019190915201610226565b61021c60035481565b61032361031e3660046115dd565b610643565b6040805182516001600160a01b0390811682526020808501518216908301529282015190921690820152606001610226565b6102886103633660046115c4565b6106ac565b6103916103763660046115c4565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610226565b6102886106de565b61021c6103bf3660046115c4565b6106f2565b61021c6103d23660046115c4565b610713565b6000546001600160a01b0316610391565b6102886103f63660046115ff565b610723565b6103916104093660046115c4565b6007602052600090815260409020546001600160a01b031681565b610288610432366004611682565b61079d565b61044a6104453660046115c4565b6107fa565b6040805182516001600160a01b039081168252602080850151909116908201529181015190820152606001610226565b6102f06104883660046115c4565b6006602052600090815260409020805460019091015460ff9091169082565b6103916104b53660046115c4565b600a602052600090815260409020546001600160a01b031681565b60085461021c565b610288610850565b6102886104ee3660046116b9565b6108bd565b6102886105013660046116b9565b6108ed565b61050e6109aa565b60405161022691906116e5565b610288610529366004611726565b6109c3565b61028861053c3660046115c4565b610a23565b6102b6610abe565b61021c61055736600461155e565b610b14565b61028861056a36600461155e565b610baf565b61029e61057d36600461155e565b610c2a565b905090565b61059033610c2a565b6105ad57604051637c3ea23f60e01b815260040160405180910390fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b038316016105e0576105dc3382610c6a565b5050565b6105dc823383610cf8565b6060600580548060200260200160405190810160405280929190818152602001828054801561063957602002820191906000526020600020905b815481526020019060010190808311610625575b5050505050905090565b60408051606081018252600080825260208201819052918101829052908061066a84610dea565b6040805160608101825260008981526004602090815290839020546001600160a01b039081168352948516908201529290911690820152925050505b92915050565b6106b533610c2a565b6106d257604051637c3ea23f60e01b815260040160405180910390fd5b6106db81610e1f565b50565b6106e6610e5a565b6106f06000610eb4565b565b6005818154811061070257600080fd5b600091825260209091200154905081565b6008818154811061070257600080fd5b61072c33610c2a565b61074957604051637c3ea23f60e01b815260040160405180910390fd5b60005b81811015610798573683838381811061076757610767611789565b905060400201905061078f816000013582602001602081019061078a919061155e565b610f04565b5060010161074c565b505050565b6107a5610e5a565b6107be60008051602061183c8339815191528383610f5a565b604051811515906001600160a01b038416907fbe9474bb3e78da7e315cdffa5cfa30b767fcc95bbf44a6197da60228eea1028690600090a35050565b60408051606081018252600080825260208201819052918101829052908061082184610dea565b604080516060810182526001600160a01b03938416815292909116602083015260035490820152949350505050565b61085933610c2a565b61087657604051637c3ea23f60e01b815260040160405180910390fd5b61089060008051602061183c833981519152336000610f5a565b60405133907f6cc2c67081f55c2fffb7c008fa995fbbf890f48c7c16fba93d8220f00dc84cc590600090a2565b6108c633610c2a565b6108e357604051637c3ea23f60e01b815260040160405180910390fd5b6105dc8282610f87565b6108f633610c2a565b61091357604051637c3ea23f60e01b815260040160405180910390fd5b6000828152600760205260409020546001600160a01b03166109485760405163ebb12eb360e01b815260040160405180910390fd5b61095181611002565b6000828152600a602052604080822080546001600160a01b0319166001600160a01b0385169081179091559051909184917f66e49d96cd98c11351d515875671af63416186605ef6cd3ae2214110766092dd9190a35050565b606061058260008051602061183c83398151915261101a565b6109cc33610c2a565b6109e957604051637c3ea23f60e01b815260040160405180910390fd5b60005b81811015610798576000838383818110610a0857610a08611789565b905060200201359050610a1a81611086565b506001016109ec565b610a2c33610c2a565b610a4957604051637c3ea23f60e01b815260040160405180910390fd5b6000818152600460205260409020546001600160a01b031680610a7f5760405163ba8ec24160e01b815260040160405180910390fd5b610a8e600460056006856110dc565b5060405182907fd74373b3c5b19af1d43b65f86bd63f6800b3b58ff6e0c1044d3d9503a1c73d4690600090a25050565b606060088054806020026020016040519081016040528092919081815260200182805480156106395760200282019190600052602060002090815481526020019060010190808311610625575050505050905090565b600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b03831601610b42575047919050565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015610b86573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a6919061179f565b919050565b610bb7610e5a565b6001600160a01b038116610c215760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6106db81610eb4565b6001600160a01b03811660009081527f260b29b219d450563ddb0e5ca806bdadb1e125f7e8c506de0443797dd7122728602052604081205460ff166106a6565b604080516000808252602082019092526001600160a01b038416908390604051610c9491906117b8565b60006040518083038185875af1925050503d8060008114610cd1576040519150601f19603f3d011682016040523d82523d6000602084013e610cd6565b606091505b505090508061079857604051632e05b05360e21b815260040160405180910390fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691610d5491906117b8565b6000604051808303816000865af19150503d8060008114610d91576040519150601f19603f3d011682016040523d82523d6000602084013e610d96565b606091505b50915091506000828015610dc2575081511580610dc2575081806020019051810190610dc291906117e7565b905080610de257604051632fdb1b7f60e11b815260040160405180910390fd5b505050505050565b600081815260076020908152604080832054600a909252909120546001600160a01b03918216911680610e1a5750805b915091565b60038190556040518181527fec9e8f9ec7dd2c5310e5b87c7bedeb6ba1c5943cb4d2da1ee80335508a5bc5a49060200160405180910390a150565b6000546001600160a01b031633146106f05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c18565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610f0d81611125565b610f1f600760086009858560c8611158565b506040516001600160a01b0382169083907fca5539b66dee2f17e4268fc1f3ce94aa3fb43a44e4651174b1eafd597476bb3f90600090a35050565b60008381526001602090815260408083206002909252909120610f819190848460646111b4565b50505050565b610f9081611125565b6000828152600460205260409020546001600160a01b039081169082168114610fc757610fc560046005600686866064611158565b505b6040516001600160a01b0383169084907f7abb2a08d413d164f83a1309ed5f176f1cbcec7981c54e1ea77166200f76f9d090600090a3505050565b6001600160a01b038116156106db576106db81611125565b60008181526001602090815260409182902080548351818402810184019094528084526060939283018282801561107a57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161105c575b50505050509050919050565b611095600760086009846110dc565b506000818152600a602052604080822080546001600160a01b03191690555182917f5848beff51a3442fb73c109ccd6f780a4697e2cc0b8b3afbb630e3843e73cbfd91a250565b60008181526020839052604090205460ff16801561111d57600082815260208690526040902080546001600160a01b031916905561111b8484846111e1565b505b949350505050565b6001600160a01b0381163b6106db57604051638c50d7cd60e01b81526001600160a01b0382166004820152602401610c18565b60008381526020859052604090205460ff1615801561117f5761117d868686856112bd565b505b600093845260209690965250604090912080546001600160a01b0319166001600160a01b039092169190911790555090919050565b6000826111cb576111c6868686611346565b6111d7565b6111d78686868561146d565b9695505050505050565b6000818152602083905260409020805460ff169081156112b557600180820154865490916000916112129190611804565b905080821461127157600087828154811061122f5761122f611789565b906000526020600020015490508088848154811061124f5761124f611789565b6000918252602080832090910192909255918252879052604090206001018290555b8680548061128157611281611825565b60008281526020808220830160001990810183905590920190925586825287905260408120805460ff191681556001015550505b509392505050565b60008281526020849052604090205460ff1615801561111d57845482116112f75760405163b1655e3360e01b815260040160405180910390fd5b60408051808201825260018082528754602080840191825260008881529881529388209251835460ff191690151517835551918101919091558654908101875595855290932090930155919050565b6001600160a01b0381166000908152602083905260409020805460ff169081156112b557600180820154865490916000916113819190611804565b905080821461140e57600087828154811061139e5761139e611789565b9060005260206000200160009054906101000a90046001600160a01b03169050808884815481106113d1576113d1611789565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394851617905592909116815290879052604090206001018290555b8680548061141e5761141e611825565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b038716825287905260408120805460ff19168155600101555050509392505050565b6001600160a01b03821660009081526020849052604090205460ff1615801561111d57845482116114b15760405163b1655e3360e01b815260040160405180910390fd5b6040805180820182526001808252875460208084019182526001600160a01b039790971660008181529888529388209251835460ff19169015151783555191810191909155865490810187559585529290932090930180546001600160a01b0319169091179055919050565b80356001600160a01b0381168114610baa57600080fd5b6000806040838503121561154757600080fd5b6115508361151d565b946020939093013593505050565b60006020828403121561157057600080fd5b6115798261151d565b9392505050565b6020808252825182820181905260009190848201906040850190845b818110156115b85783518352928401929184019160010161159c565b50909695505050505050565b6000602082840312156115d657600080fd5b5035919050565b600080604083850312156115f057600080fd5b50508035926020909101359150565b6000806020838503121561161257600080fd5b823567ffffffffffffffff8082111561162a57600080fd5b818501915085601f83011261163e57600080fd5b81358181111561164d57600080fd5b8660208260061b850101111561166257600080fd5b60209290920196919550909350505050565b80151581146106db57600080fd5b6000806040838503121561169557600080fd5b61169e8361151d565b915060208301356116ae81611674565b809150509250929050565b600080604083850312156116cc57600080fd5b823591506116dc6020840161151d565b90509250929050565b6020808252825182820181905260009190848201906040850190845b818110156115b85783516001600160a01b031683529284019291840191600101611701565b6000806020838503121561173957600080fd5b823567ffffffffffffffff8082111561175157600080fd5b818501915085601f83011261176557600080fd5b81358181111561177457600080fd5b8660208260051b850101111561166257600080fd5b634e487b7160e01b600052603260045260246000fd5b6000602082840312156117b157600080fd5b5051919050565b6000825160005b818110156117d957602081860181015185830152016117bf565b506000920191825250919050565b6000602082840312156117f957600080fd5b815161157981611674565b818103818111156106a657634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fdfe6d439300980e333f0256d64be2c9f67e86f4493ce25f82498d6db7f4be3d9e6fa2646970667358221220ba99fec5c98c2c9ac40e364c0bcbd82cfbf215e6d3c309c0c749ebf8e11bfe9264736f6c63430008160033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000ea6000000000000000000000000072e28c7f34100afefc399fcc0ae041b8fe5841ae00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _gateways (tuple[]):
Arg [1] : _targetGasReserve (uint256): 60000
Arg [2] : _owner (address): 0x72E28c7F34100AfefC399fcc0AE041B8fe5841AE
Arg [3] : _managers (address[]):
Arg [4] : _addOwnerToManagers (bool): True
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 000000000000000000000000000000000000000000000000000000000000ea60
Arg [2] : 00000000000000000000000072e28c7f34100afefc399fcc0ae041b8fe5841ae
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000000
Net Worth in USD
Net Worth in MNT
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.