Latest 25 from a total of 9,158 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Execute Local | 24136290 | 34 days ago | IN | 0.00002576 ETH | 0.00000022 | ||||
| Execute Local | 19514773 | 109 days ago | IN | 0.00002306 ETH | 0.00000775 | ||||
| Execute Local | 17638290 | 132 days ago | IN | 0.04102665 ETH | 0.00001286 | ||||
| Execute Local | 17552428 | 134 days ago | IN | 0.00002803 ETH | 0.00000004 | ||||
| Execute Local | 17371981 | 139 days ago | IN | 0.04002822 ETH | 0.00000596 | ||||
| Execute Local | 17183748 | 145 days ago | IN | 0.00003356 ETH | 0.00000295 | ||||
| Execute Local | 16717964 | 163 days ago | IN | 0.00004097 ETH | 0.00001408 | ||||
| Execute Local | 16390932 | 177 days ago | IN | 0.047036 ETH | 0.00000903 | ||||
| Execute Local | 16073379 | 190 days ago | IN | 0.07423681 ETH | 0.00002877 | ||||
| Execute Local | 15648880 | 199 days ago | IN | 0.00003964 ETH | 0.00000903 | ||||
| Execute Local | 15034470 | 221 days ago | IN | 0.00005543 ETH | 0.00000536 | ||||
| Execute Local | 14702006 | 235 days ago | IN | 0.00006279 ETH | 0.00003804 | ||||
| Execute Local | 14438519 | 245 days ago | IN | 0.00005593 ETH | 0.00007699 | ||||
| Execute Local | 13967882 | 269 days ago | IN | 0.00005251 ETH | 0.0000213 | ||||
| Execute Local | 13733262 | 280 days ago | IN | 0.00004635 ETH | 0.00002545 | ||||
| Execute Local | 13732532 | 280 days ago | IN | 0.00004677 ETH | 0.00002285 | ||||
| Execute Local | 13732509 | 280 days ago | IN | 0.01204677 ETH | 0.00001588 | ||||
| Execute Local | 13392890 | 295 days ago | IN | 0.00003738 ETH | 0.00002692 | ||||
| Execute Local | 13264995 | 301 days ago | IN | 0.00003611 ETH | 0.0000336 | ||||
| Execute Local | 13246174 | 301 days ago | IN | 0.00003696 ETH | 0.00004296 | ||||
| Execute Local | 13192417 | 304 days ago | IN | 0.00003618 ETH | 0.00003343 | ||||
| Execute Local | 13173845 | 304 days ago | IN | 0.00003701 ETH | 0.0000416 | ||||
| Execute Local | 13173750 | 304 days ago | IN | 0.00003701 ETH | 0.00004892 | ||||
| Execute Local | 13173566 | 304 days ago | IN | 0.00003721 ETH | 0.00005194 | ||||
| Execute Local | 13173453 | 304 days ago | IN | 0.00003739 ETH | 0.00005041 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 24136290 | 34 days ago | 0.00002576 ETH | ||||
| 19514773 | 109 days ago | 0.00002306 ETH | ||||
| 17638290 | 132 days ago | 0.00002665 ETH | ||||
| 17638290 | 132 days ago | 0.041 ETH | ||||
| 17552428 | 134 days ago | 0.00002803 ETH | ||||
| 17371981 | 139 days ago | 0.00002822 ETH | ||||
| 17371981 | 139 days ago | 0.04 ETH | ||||
| 17183748 | 145 days ago | 0.00003356 ETH | ||||
| 16717964 | 163 days ago | 0.00004097 ETH | ||||
| 16390932 | 177 days ago | 0.000036 ETH | ||||
| 16390932 | 177 days ago | 0.047 ETH | ||||
| 16073379 | 190 days ago | 0.00003681 ETH | ||||
| 16073379 | 190 days ago | 0.0742 ETH | ||||
| 15648880 | 199 days ago | 0.00003964 ETH | ||||
| 15034470 | 221 days ago | 0.00005543 ETH | ||||
| 14702006 | 235 days ago | 0.00006279 ETH | ||||
| 14438519 | 245 days ago | 0.00005593 ETH | ||||
| 13967882 | 269 days ago | 0.00005251 ETH | ||||
| 13733262 | 280 days ago | 0.00004635 ETH | ||||
| 13732532 | 280 days ago | 0.00004677 ETH | ||||
| 13732509 | 280 days ago | 0.00004677 ETH | ||||
| 13732509 | 280 days ago | 0.012 ETH | ||||
| 13392890 | 295 days ago | 0.00003738 ETH | ||||
| 13264995 | 301 days ago | 0.00003611 ETH | ||||
| 13246174 | 301 days ago | 0.00003696 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
LocalActionProxy
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes 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 { IActionDataStructures } from '../interfaces/IActionDataStructures.sol';
import { BalanceManagement } from '../BalanceManagement.sol';
import { CallerGuard } from '../CallerGuard.sol';
import { Pausable } from '../Pausable.sol';
import { SystemVersionId } from '../SystemVersionId.sol';
import { ZeroAddressError } from '../Errors.sol';
import '../helpers/AddressHelper.sol' as AddressHelper;
import '../helpers/RefundHelper.sol' as RefundHelper;
import '../helpers/TransferHelper.sol' as TransferHelper;
import '../Constants.sol' as Constants;
/**
* @title LocalActionProxy
* @notice Local action proxy contract
*/
contract LocalActionProxy is
SystemVersionId,
Pausable,
CallerGuard,
BalanceManagement,
IActionDataStructures
{
/**
* @dev The address of the action executor contract
*/
ILocalActionExecutor public actionExecutor;
/**
* @dev The address of the fee collector
*/
address public feeCollector;
/**
* @notice Emitted when the action executor contract reference is set
* @param actionExecutor The action executor contract address
*/
event SetActionExecutor(address indexed actionExecutor);
/**
* @notice Emitted when the address of the fee collector is set
* @param feeCollector The address of the fee collector
*/
event SetFeeCollector(address indexed feeCollector);
/**
* @notice Emitted when the extra balance is refunded
* @param actionId The ID of the action
* @param sender The address of the user
*/
event LocalActionExecuted(uint256 indexed actionId, address indexed sender);
/**
* @notice Emitted when the extra balance is refunded
* @param to The refund receiver's address
* @param extraBalance The extra balance of the native token
*/
event ExtraBalanceRefunded(address indexed to, uint256 extraBalance);
/**
* @notice Emitted when the native token value of the transaction does not correspond to the swap amount
*/
error NativeTokenValueError();
/**
* @notice Initializes the LocalActionProxy contract
* @param _actionExecutor The address of the action executor contract
* @param _feeCollector The address of the fee collector
* @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(
ILocalActionExecutor _actionExecutor,
address _feeCollector,
address _owner,
address[] memory _managers,
bool _addOwnerToManagers
) {
_setActionExecutor(_actionExecutor);
_setFeeCollector(_feeCollector);
_initRoles(_owner, _managers, _addOwnerToManagers);
}
/**
* @notice The standard "receive" function
* @dev Is payable to allow receiving native token funds from the action executor
*/
receive() external payable {}
/**
* @notice Executes a single-chain action
* @param _localAction The parameters of the action
* @param _processingFee The processing fee value
*/
function executeLocal(
LocalAction memory _localAction,
uint256 _processingFee
) external payable whenNotPaused checkCaller {
uint256 initialBalance = address(this).balance - msg.value;
address fromTokenAddress = _localAction.fromTokenAddress;
uint256 fromAmount = _localAction.swapInfo.fromAmount;
bool fromNative = fromTokenAddress == Constants.NATIVE_TOKEN_ADDRESS;
uint256 requiredNativeTokenValue = fromNative
? fromAmount + _processingFee
: _processingFee;
if (msg.value < requiredNativeTokenValue) {
revert NativeTokenValueError();
}
if (!fromNative) {
TransferHelper.safeTransferFrom(
fromTokenAddress,
msg.sender,
address(this),
fromAmount
);
TransferHelper.safeApprove(fromTokenAddress, address(actionExecutor), fromAmount);
}
if (_localAction.recipient == address(0)) {
_localAction.recipient = msg.sender;
}
uint256 actionId = actionExecutor.executeLocal{ value: fromNative ? fromAmount : 0 }(
_localAction
);
emit LocalActionExecuted(actionId, msg.sender);
if (!fromNative) {
TransferHelper.safeApprove(fromTokenAddress, address(actionExecutor), 0);
}
TransferHelper.safeTransferNative(feeCollector, _processingFee);
uint256 extraBalance = RefundHelper.refundExtraBalanceWithResult(
address(this),
initialBalance,
payable(msg.sender)
);
if (extraBalance > 0) {
emit ExtraBalanceRefunded(msg.sender, extraBalance);
}
}
/**
* @notice Sets the action executor contract reference
* @param _actionExecutor The action executor contract address
*/
function setActionExecutor(ILocalActionExecutor _actionExecutor) external onlyManager {
_setActionExecutor(_actionExecutor);
}
/**
* @notice Sets the address of the fee collector
* @param _feeCollector The address of the fee collector
*/
function setFeeCollector(address _feeCollector) external onlyManager {
_setFeeCollector(_feeCollector);
}
function _setActionExecutor(ILocalActionExecutor _actionExecutor) private {
AddressHelper.requireContract(address(_actionExecutor));
actionExecutor = _actionExecutor;
emit SetActionExecutor(address(_actionExecutor));
}
function _setFeeCollector(address _feeCollector) private {
if (_feeCollector == address(0)) {
revert ZeroAddressError();
}
feeCollector = _feeCollector;
emit SetFeeCollector(_feeCollector);
}
}
interface ILocalActionExecutor is IActionDataStructures {
function executeLocal(
LocalAction calldata _localAction
) external payable returns (uint256 actionId);
}// 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 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;
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.19;
import { ManagerRole } from './roles/ManagerRole.sol';
import './helpers/AddressHelper.sol' as AddressHelper;
import './Constants.sol' as Constants;
import './DataStructures.sol' as DataStructures;
/**
* @title CallerGuard
* @notice Base contract to control access from other contracts
*/
abstract contract CallerGuard is ManagerRole {
/**
* @dev Caller guard mode enumeration
*/
enum CallerGuardMode {
ContractForbidden,
ContractList,
ContractAllowed
}
/**
* @dev Caller guard mode value
*/
CallerGuardMode public callerGuardMode = CallerGuardMode.ContractForbidden;
/**
* @dev Registered contract list for "ContractList" mode
*/
address[] public listedCallerGuardContractList;
/**
* @dev Registered contract list indices for "ContractList" mode
*/
mapping(address /*account*/ => DataStructures.OptionalValue /*index*/)
public listedCallerGuardContractIndexMap;
/**
* @notice Emitted when the caller guard mode is set
* @param callerGuardMode The caller guard mode
*/
event SetCallerGuardMode(CallerGuardMode indexed callerGuardMode);
/**
* @notice Emitted when a registered contract for "ContractList" mode is added or removed
* @param contractAddress The contract address
* @param isListed The registered contract list inclusion flag
*/
event SetListedCallerGuardContract(address indexed contractAddress, bool indexed isListed);
/**
* @notice Emitted when the caller is not allowed to perform the intended action
*/
error CallerGuardError(address caller);
/**
* @dev Modifier to check if the caller is allowed to perform the intended action
*/
modifier checkCaller() {
if (msg.sender != tx.origin) {
bool condition = (callerGuardMode == CallerGuardMode.ContractAllowed ||
(callerGuardMode == CallerGuardMode.ContractList &&
isListedCallerGuardContract(msg.sender)));
if (!condition) {
revert CallerGuardError(msg.sender);
}
}
_;
}
/**
* @notice Sets the caller guard mode
* @param _callerGuardMode The caller guard mode
*/
function setCallerGuardMode(CallerGuardMode _callerGuardMode) external onlyManager {
callerGuardMode = _callerGuardMode;
emit SetCallerGuardMode(_callerGuardMode);
}
/**
* @notice Updates the list of registered contracts for the "ContractList" mode
* @param _items The addresses and flags for the contracts
*/
function setListedCallerGuardContracts(
DataStructures.AccountToFlag[] calldata _items
) external onlyManager {
for (uint256 index; index < _items.length; index++) {
DataStructures.AccountToFlag calldata item = _items[index];
if (item.flag) {
AddressHelper.requireContract(item.account);
}
DataStructures.uniqueAddressListUpdate(
listedCallerGuardContractList,
listedCallerGuardContractIndexMap,
item.account,
item.flag,
Constants.LIST_SIZE_LIMIT_DEFAULT
);
emit SetListedCallerGuardContract(item.account, item.flag);
}
}
/**
* @notice Getter of the registered contract count
* @return The registered contract count
*/
function listedCallerGuardContractCount() external view returns (uint256) {
return listedCallerGuardContractList.length;
}
/**
* @notice Getter of the complete list of registered contracts
* @return The complete list of registered contracts
*/
function fullListedCallerGuardContractList() external view returns (address[] memory) {
return listedCallerGuardContractList;
}
/**
* @notice Getter of a listed contract flag
* @param _account The contract address
* @return The listed contract flag
*/
function isListedCallerGuardContract(address _account) public view returns (bool) {
return listedCallerGuardContractIndexMap[_account].isSet;
}
}// 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 attempt to burn a token fails */ error TokenBurnError(); /** * @notice Emitted when an attempt to mint a token fails */ error TokenMintError(); /** * @notice Emitted when a zero address is specified where it is not allowed */ error ZeroAddressError();
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.19;
/**
* @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.19;
import './TransferHelper.sol' as TransferHelper;
/**
* @notice Refunds the extra balance of the native token
* @dev Reverts on subtraction if the actual balance is less than expected
* @param _self The address of the executing contract
* @param _expectedBalance The expected native token balance value
* @param _to The refund receiver's address
*/
function refundExtraBalance(address _self, uint256 _expectedBalance, address payable _to) {
uint256 extraBalance = _self.balance - _expectedBalance;
if (extraBalance > 0) {
TransferHelper.safeTransferNative(_to, extraBalance);
}
}
/**
* @notice Refunds the extra balance of the native token
* @dev Reverts on subtraction if the actual balance is less than expected
* @param _self The address of the executing contract
* @param _expectedBalance The expected native token balance value
* @param _to The refund receiver's address
* @return extraBalance The extra balance of the native token
*/
function refundExtraBalanceWithResult(
address _self,
uint256 _expectedBalance,
address payable _to
) returns (uint256 extraBalance) {
extraBalance = _self.balance - _expectedBalance;
if (extraBalance > 0) {
TransferHelper.safeTransferNative(_to, extraBalance);
}
}// 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 IActionDataStructures
* @notice Action data structure declarations
*/
interface IActionDataStructures {
/**
* @notice Single-chain action data structure
* @param fromTokenAddress The address of the input token
* @param toTokenAddress The address of the output token
* @param swapInfo The data for the single-chain swap
* @param recipient The address of the recipient
*/
struct LocalAction {
address fromTokenAddress;
address toTokenAddress;
SwapInfo swapInfo;
address recipient;
}
/**
* @notice Cross-chain action data structure
* @param gatewayType The numeric type of the cross-chain gateway
* @param vaultType The numeric type of the vault
* @param sourceTokenAddress The address of the input token on the source chain
* @param sourceSwapInfo The data for the source chain swap
* @param targetChainId The action target chain ID
* @param targetTokenAddress The address of the output token on the destination chain
* @param targetSwapInfoOptions The list of data options for the target chain swap
* @param targetRecipient The address of the recipient on the target chain
* @param gatewaySettings The gateway-specific settings data
*/
struct Action {
uint256 gatewayType;
uint256 vaultType;
address sourceTokenAddress;
SwapInfo sourceSwapInfo;
uint256 targetChainId;
address targetTokenAddress;
SwapInfo[] targetSwapInfoOptions;
address targetRecipient;
bytes gatewaySettings;
}
/**
* @notice Token swap data structure
* @param fromAmount The quantity of the token
* @param routerType The numeric type of the swap router
* @param routerData The data for the swap router call
*/
struct SwapInfo {
uint256 fromAmount;
uint256 routerType;
bytes routerData;
}
/**
* @notice Cross-chain message data structure
* @param actionId The unique identifier of the cross-chain action
* @param sourceSender The address of the sender on the source chain
* @param vaultType The numeric type of the vault
* @param targetTokenAddress The address of the output token on the target chain
* @param targetSwapInfo The data for the target chain swap
* @param targetRecipient The address of the recipient on the target chain
*/
struct TargetMessage {
uint256 actionId;
address sourceSender;
uint256 vaultType;
address targetTokenAddress;
SwapInfo targetSwapInfo;
address targetRecipient;
}
}// 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 { 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": true,
"runs": 200
},
"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":[{"internalType":"contract ILocalActionExecutor","name":"_actionExecutor","type":"address"},{"internalType":"address","name":"_feeCollector","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":[{"internalType":"address","name":"caller","type":"address"}],"name":"CallerGuardError","type":"error"},{"inputs":[],"name":"ListSizeLimitError","type":"error"},{"inputs":[],"name":"NativeTokenValueError","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":"SafeApproveError","type":"error"},{"inputs":[],"name":"SafeTransferError","type":"error"},{"inputs":[],"name":"SafeTransferFromError","type":"error"},{"inputs":[],"name":"SafeTransferNativeError","type":"error"},{"inputs":[],"name":"ZeroAddressError","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"extraBalance","type":"uint256"}],"name":"ExtraBalanceRefunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"actionId","type":"uint256"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"LocalActionExecuted","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":"actionExecutor","type":"address"}],"name":"SetActionExecutor","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"enum CallerGuard.CallerGuardMode","name":"callerGuardMode","type":"uint8"}],"name":"SetCallerGuardMode","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"feeCollector","type":"address"}],"name":"SetFeeCollector","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"bool","name":"isListed","type":"bool"}],"name":"SetListedCallerGuardContract","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":[],"name":"actionExecutor","outputs":[{"internalType":"contract ILocalActionExecutor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callerGuardMode","outputs":[{"internalType":"enum CallerGuard.CallerGuardMode","name":"","type":"uint8"}],"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":[{"components":[{"internalType":"address","name":"fromTokenAddress","type":"address"},{"internalType":"address","name":"toTokenAddress","type":"address"},{"components":[{"internalType":"uint256","name":"fromAmount","type":"uint256"},{"internalType":"uint256","name":"routerType","type":"uint256"},{"internalType":"bytes","name":"routerData","type":"bytes"}],"internalType":"struct IActionDataStructures.SwapInfo","name":"swapInfo","type":"tuple"},{"internalType":"address","name":"recipient","type":"address"}],"internalType":"struct IActionDataStructures.LocalAction","name":"_localAction","type":"tuple"},{"internalType":"uint256","name":"_processingFee","type":"uint256"}],"name":"executeLocal","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"feeCollector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fullListedCallerGuardContractList","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fullManagerList","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isListedCallerGuardContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"listedCallerGuardContractCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"listedCallerGuardContractIndexMap","outputs":[{"internalType":"bool","name":"isSet","type":"bool"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"listedCallerGuardContractList","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"contract ILocalActionExecutor","name":"_actionExecutor","type":"address"}],"name":"setActionExecutor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum CallerGuard.CallerGuardMode","name":"_callerGuardMode","type":"uint8"}],"name":"setCallerGuardMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeCollector","type":"address"}],"name":"setFeeCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"flag","type":"bool"}],"internalType":"struct AccountToFlag[]","name":"_items","type":"tuple[]"}],"name":"setListedCallerGuardContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_value","type":"bool"}],"name":"setManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"tokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60806040526003805460ff191690553480156200001b57600080fd5b506040516200250d3803806200250d8339810160408190526200003e91620006bb565b6000805460ff19169055620000533362000081565b6200005e85620000da565b62000069846200012f565b62000076838383620001a1565b505050505062000858565b600080546001600160a01b03838116610100818102610100600160a81b0319851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b620000e5816200025b565b600680546001600160a01b0319166001600160a01b0383169081179091556040517f1e7b8d72cf538d88fcda3e6a489e2ac83f06df204580b5d1fef6cba8d248418890600090a250565b6001600160a01b0381166200015757604051633efa09af60e01b815260040160405180910390fd5b600780546001600160a01b0319166001600160a01b0383169081179091556040517fd649da8f6092116f86ea4e5139de0b75ad371d823918d16368ba3ff09a5cbc9f90600090a250565b60006001600160a01b03841615620001ba5783620001bc565b335b905060005b83518110156200020f57620001fa848281518110620001e457620001e4620007e4565b602002602001015160016200029760201b60201c565b80620002068162000810565b915050620001c1565b5081801562000226575062000224816200030a565b155b1562000239576200023981600162000297565b6001600160a01b0381163314620002555762000255816200034c565b50505050565b6001600160a01b0381163b6200029457604051638c50d7cd60e01b81526001600160a01b03821660048201526024015b60405180910390fd5b50565b620002a1620003c8565b620002ce7f6d439300980e333f0256d64be2c9f67e86f4493ce25f82498d6db7f4be3d9e6f83836200042c565b604051811515906001600160a01b038416907fbe9474bb3e78da7e315cdffa5cfa30b767fcc95bbf44a6197da60228eea1028690600090a35050565b6001600160a01b03811660009081527f260b29b219d450563ddb0e5ca806bdadb1e125f7e8c506de0443797dd7122728602052604081205460ff165b92915050565b62000356620003c8565b6001600160a01b038116620003bd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016200028b565b620002948162000081565b6000546001600160a01b036101009091041633146200042a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200028b565b565b60008381526001602090815260408083206002909252909120620002559190848460646000826200046a576200046486868662000482565b62000478565b6200047886868685620005b7565b9695505050505050565b6001600160a01b0381166000908152602083905260409020805460ff16908115620005af5760018082015486549091600091620004c091906200082c565b905080821462000554576000878281548110620004e157620004e1620007e4565b9060005260206000200160009054906101000a90046001600160a01b0316905080888481548110620005175762000517620007e4565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394851617905592909116815290879052604090206001018290555b8680548062000567576200056762000842565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b038716825287905260408120805460ff191681556001015550505b509392505050565b6001600160a01b03821660009081526020849052604090205460ff16158015620006645784548211620005fd5760405163b1655e3360e01b815260040160405180910390fd5b6040805180820182526001808252875460208084019182526001600160a01b03881660008181528a83529586209451855460ff1916901515178555915193830193909355885491820189558884529190922090910180546001600160a01b03191690911790555b949350505050565b6001600160a01b03811681146200029457600080fd5b80516200068f816200066c565b919050565b634e487b7160e01b600052604160045260246000fd5b805180151581146200068f57600080fd5b600080600080600060a08688031215620006d457600080fd5b8551620006e1816200066c565b80955050602080870151620006f6816200066c565b604088015190955062000709816200066c565b60608801519094506001600160401b03808211156200072757600080fd5b818901915089601f8301126200073c57600080fd5b81518181111562000751576200075162000694565b8060051b604051601f19603f8301168101818110858211171562000779576200077962000694565b60405291825284820192508381018501918c8311156200079857600080fd5b938501935b82851015620007c157620007b18562000682565b845293850193928501926200079d565b809750505050505050620007d860808701620006aa565b90509295509295909350565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201620008255762000825620007fa565b5060010190565b81810381811115620003465762000346620007fa565b634e487b7160e01b600052603160045260246000fd5b611ca580620008686000396000f3fe6080604052600436106101bb5760003560e01c80637b25b4d4116100ec578063c415b95c1161008a578063f2fde38b11610064578063f2fde38b14610547578063f3ae241514610567578063f977350c14610587578063fe14e8c3146105a757600080fd5b8063c415b95c146104f2578063e3725b1514610512578063eedc966a1461052757600080fd5b8063a42dce80116100c6578063a42dce801461047d578063a5e90eee1461049d578063b9925588146104bd578063c2c518e1146104dd57600080fd5b80637b25b4d41461040d5780638456cb59146104455780638da5cb5b1461045a57600080fd5b80633f4ba83a116101595780635c975abb116101335780635c975abb146103a4578063607ab5e5146103bc5780636b56a691146103e3578063715018a6146103f857600080fd5b80633f4ba83a1461034e578063440d7248146103635780635359bf211461038457600080fd5b8063103b739711610195578063103b73971461024957806317daf0b41461029457806330eb1278146102dd578063341328c5146102fd57600080fd5b806304e535e2146101c7578063093f0e27146101f25780630da13cf31461023457600080fd5b366101c257005b600080fd5b3480156101d357600080fd5b506101dc6105c7565b6040516101e991906116f2565b60405180910390f35b3480156101fe57600080fd5b506102267f22ad9585a395edc8067b50da4778cafbb7fa2c4bbd7619fad6aeba403857fd7481565b6040519081526020016101e9565b6102476102423660046117f2565b610629565b005b34801561025557600080fd5b50600080516020611c5083398151915260005260016020527f3c2285c553468ca8f30447b24bb463c127f1b840e23a0cafa23caa79d906669a54610226565b3480156102a057600080fd5b506102cd6102af36600461192c565b6001600160a01b031660009081526005602052604090205460ff1690565b60405190151581526020016101e9565b3480156102e957600080fd5b506102476102f8366004611949565b6108ad565b34801561030957600080fd5b5061033761031836600461192c565b6005602052600090815260409020805460019091015460ff9091169082565b6040805192151583526020830191909152016101e9565b34801561035a57600080fd5b50610247610911565b34801561036f57600080fd5b506102cd61037e36600461192c565b50600090565b34801561039057600080fd5b5061024761039f36600461192c565b610949565b3480156103b057600080fd5b5060005460ff166102cd565b3480156103c857600080fd5b506003546103d69060ff1681565b6040516101e9919061198b565b3480156103ef57600080fd5b50600454610226565b34801561040457600080fd5b5061024761097b565b34801561041957600080fd5b5061042d6104283660046119b3565b61098d565b6040516001600160a01b0390911681526020016101e9565b34801561045157600080fd5b506102476109b7565b34801561046657600080fd5b5060005461010090046001600160a01b031661042d565b34801561048957600080fd5b5061024761049836600461192c565b6109ed565b3480156104a957600080fd5b506102476104b83660046119da565b610a1c565b3480156104c957600080fd5b5060065461042d906001600160a01b031681565b3480156104e957600080fd5b50610247610a79565b3480156104fe57600080fd5b5060075461042d906001600160a01b031681565b34801561051e57600080fd5b506101dc610ae6565b34801561053357600080fd5b5061022661054236600461192c565b610aff565b34801561055357600080fd5b5061024761056236600461192c565b610ba0565b34801561057357600080fd5b506102cd61058236600461192c565b610c16565b34801561059357600080fd5b506102476105a2366004611a13565b610c56565b3480156105b357600080fd5b506102476105c2366004611a34565b610cde565b6060600480548060200260200160405190810160405280929190818152602001828054801561061f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610601575b5050505050905090565b610631610def565b3332146106b8576000600260035460ff16600281111561065357610653611975565b148061068f5750600160035460ff16600281111561067357610673611975565b14801561068f57503360009081526005602052604090205460ff165b9050806106b657604051630fa0970d60e11b81523360048201526024015b60405180910390fd5b505b60006106c43447611abf565b8351604085015151919250906001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146000816106fd5785610707565b6107078684611ad2565b90508034101561072a57604051637dd7aa2160e01b815260040160405180910390fd5b816107535761073b84333086610e35565b6006546107539085906001600160a01b031685610f30565b60608701516001600160a01b031661076c573360608801525b6006546000906001600160a01b0316639f4876858461078c57600061078e565b855b8a6040518363ffffffff1660e01b81526004016107ab9190611b09565b60206040518083038185885af11580156107c9573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906107ee9190611b9b565b604051909150339082907f81917f569d6e249389f2db45ba51e7709ef45773fb326110af15efa50fcb245490600090a38261083c5760065461083c9086906001600160a01b03166000610f30565b600754610852906001600160a01b031688611022565b600061085f3088336110b0565b9050801561089d5760405181815233907fccb279e3652a5f0b9b377a22a3a61a4764a5590775e82e0535541fd87ce7370b9060200160405180910390a25b505050505050505050565b905090565b6108b633610c16565b6108d357604051637c3ea23f60e01b815260040160405180910390fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b03831601610906576109023382611022565b5050565b6109028233836110df565b61091a33610c16565b61093757604051637c3ea23f60e01b815260040160405180910390fd5b61093f6111c9565b610947611212565b565b61095233610c16565b61096f57604051637c3ea23f60e01b815260040160405180910390fd5b61097881611264565b50565b6109836112b7565b6109476000611317565b6004818154811061099d57600080fd5b6000918252602090912001546001600160a01b0316905081565b6109c033610c16565b6109dd57604051637c3ea23f60e01b815260040160405180910390fd5b6109e5610def565b610947611370565b6109f633610c16565b610a1357604051637c3ea23f60e01b815260040160405180910390fd5b610978816113ad565b610a246112b7565b610a3d600080516020611c50833981519152838361141e565b604051811515906001600160a01b038416907fbe9474bb3e78da7e315cdffa5cfa30b767fcc95bbf44a6197da60228eea1028690600090a35050565b610a8233610c16565b610a9f57604051637c3ea23f60e01b815260040160405180910390fd5b610ab9600080516020611c5083398151915233600061141e565b60405133907f6cc2c67081f55c2fffb7c008fa995fbbf890f48c7c16fba93d8220f00dc84cc590600090a2565b60606108a8600080516020611c5083398151915261144b565b600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b03831601610b2d575047919050565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015610b71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b959190611b9b565b92915050565b919050565b610ba86112b7565b6001600160a01b038116610c0d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106ad565b61097881611317565b6001600160a01b03811660009081527f260b29b219d450563ddb0e5ca806bdadb1e125f7e8c506de0443797dd7122728602052604081205460ff16610b95565b610c5f33610c16565b610c7c57604051637c3ea23f60e01b815260040160405180910390fd5b6003805482919060ff19166001836002811115610c9b57610c9b611975565b0217905550806002811115610cb257610cb2611975565b6040517f332a9f1d3bd9b0f7abbd95838fed6b417589632d0eb33f2d8ae6e2aa17178efd90600090a250565b610ce733610c16565b610d0457604051637c3ea23f60e01b815260040160405180910390fd5b60005b81811015610dea5736838383818110610d2257610d22611bb4565b9050604002019050806020016020810190610d3d9190611bca565b15610d5757610d57610d52602083018361192c565b6114b7565b610d8260046005610d6b602085018561192c565b610d7b6040860160208701611bca565b60646114ea565b50610d936040820160208301611bca565b1515610da2602083018361192c565b6001600160a01b03167f1470aed653fa8a8ce4c7b2f41287634199f7ec3c4f5fd0ace97d82cf006beec360405160405180910390a35080610de281611be7565b915050610d07565b505050565b60005460ff16156109475760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106ad565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b1790529151600092839290881691610e999190611c00565b6000604051808303816000865af19150503d8060008114610ed6576040519150601f19603f3d011682016040523d82523d6000602084013e610edb565b606091505b50915091506000828015610f07575081511580610f07575081806020019051810190610f079190611c1c565b905080610f2757604051632d9d5b4160e01b815260040160405180910390fd5b50505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b1790529151600092839290871691610f8c9190611c00565b6000604051808303816000865af19150503d8060008114610fc9576040519150601f19603f3d011682016040523d82523d6000602084013e610fce565b606091505b50915091506000828015610ffa575081511580610ffa575081806020019051810190610ffa9190611c1c565b90508061101a5760405163b45d44e760e01b815260040160405180910390fd5b505050505050565b604080516000808252602082019092526001600160a01b03841690839060405161104c9190611c00565b60006040518083038185875af1925050503d8060008114611089576040519150601f19603f3d011682016040523d82523d6000602084013e61108e565b606091505b5050905080610dea57604051632e05b05360e21b815260040160405180910390fd5b60006110c6836001600160a01b03861631611abf565b905080156110d8576110d88282611022565b9392505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b179052915160009283929087169161113b9190611c00565b6000604051808303816000865af19150503d8060008114611178576040519150601f19603f3d011682016040523d82523d6000602084013e61117d565b606091505b509150915060008280156111a95750815115806111a95750818060200190518101906111a99190611c1c565b90508061101a57604051632fdb1b7f60e11b815260040160405180910390fd5b60005460ff166109475760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016106ad565b61121a6111c9565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b61126d816114b7565b600680546001600160a01b0319166001600160a01b0383169081179091556040517f1e7b8d72cf538d88fcda3e6a489e2ac83f06df204580b5d1fef6cba8d248418890600090a250565b6000546001600160a01b036101009091041633146109475760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106ad565b600080546001600160a01b03838116610100818102610100600160a81b0319851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b611378610def565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586112473390565b6001600160a01b0381166113d457604051633efa09af60e01b815260040160405180910390fd5b600780546001600160a01b0319166001600160a01b0383169081179091556040517fd649da8f6092116f86ea4e5139de0b75ad371d823918d16368ba3ff09a5cbc9f90600090a250565b600083815260016020908152604080832060029092529091206114459190848460646114ea565b50505050565b6000818152600160209081526040918290208054835181840281018401909452808452606093928301828280156114ab57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161148d575b50505050509050919050565b6001600160a01b0381163b61097857604051638c50d7cd60e01b81526001600160a01b03821660048201526024016106ad565b600082611501576114fc868686611517565b61150d565b61150d8686868561163f565b9695505050505050565b6001600160a01b0381166000908152602083905260409020805460ff1690811561163757600180820154865490916000916115529190611abf565b90508082146115df57600087828154811061156f5761156f611bb4565b9060005260206000200160009054906101000a90046001600160a01b03169050808884815481106115a2576115a2611bb4565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394851617905592909116815290879052604090206001018290555b868054806115ef576115ef611c39565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b038716825287905260408120805460ff191681556001015550505b509392505050565b6001600160a01b03821660009081526020849052604090205460ff161580156116ea57845482116116835760405163b1655e3360e01b815260040160405180910390fd5b6040805180820182526001808252875460208084019182526001600160a01b03881660008181528a83529586209451855460ff1916901515178555915193830193909355885491820189558884529190922090910180546001600160a01b03191690911790555b949350505050565b6020808252825182820181905260009190848201906040850190845b818110156117335783516001600160a01b03168352928401929184019160010161170e565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff811182821017156117785761177861173f565b60405290565b6040516060810167ffffffffffffffff811182821017156117785761177861173f565b604051601f8201601f1916810167ffffffffffffffff811182821017156117ca576117ca61173f565b604052919050565b6001600160a01b038116811461097857600080fd5b8035610b9b816117d2565b6000806040838503121561180557600080fd5b823567ffffffffffffffff8082111561181d57600080fd5b908401906080828703121561183157600080fd5b611839611755565b8235611844816117d2565b8152602083810135611855816117d2565b8282015260408401358381111561186b57600080fd5b84016060818a03121561187d57600080fd5b61188561177e565b8135815282820135838201526040820135858111156118a357600080fd5b80830192505089601f8301126118b857600080fd5b8135858111156118ca576118ca61173f565b6118dc601f8201601f191685016117a1565b95508086528a848285010111156118f257600080fd5b8084840185880137600090860184015260408181018690528401525061191a606085016117e7565b60608301529097950135955050505050565b60006020828403121561193e57600080fd5b81356110d8816117d2565b6000806040838503121561195c57600080fd5b8235611967816117d2565b946020939093013593505050565b634e487b7160e01b600052602160045260246000fd5b60208101600383106119ad57634e487b7160e01b600052602160045260246000fd5b91905290565b6000602082840312156119c557600080fd5b5035919050565b801515811461097857600080fd5b600080604083850312156119ed57600080fd5b82356119f8816117d2565b91506020830135611a08816119cc565b809150509250929050565b600060208284031215611a2557600080fd5b8135600381106110d857600080fd5b60008060208385031215611a4757600080fd5b823567ffffffffffffffff80821115611a5f57600080fd5b818501915085601f830112611a7357600080fd5b813581811115611a8257600080fd5b8660208260061b8501011115611a9757600080fd5b60209290920196919550909350505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610b9557610b95611aa9565b80820180821115610b9557610b95611aa9565b60005b83811015611b00578181015183820152602001611ae8565b50506000910152565b60208152600060018060a01b0380845116602084015280602085015116604084015250604083015160806060840152805160a0840152602081015160c084015260408101519050606060e0840152805180610100850152610120611b738282870160208601611ae5565b606095909501516001600160a01b03166080850152601f01601f191690920190920192915050565b600060208284031215611bad57600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215611bdc57600080fd5b81356110d8816119cc565b600060018201611bf957611bf9611aa9565b5060010190565b60008251611c12818460208701611ae5565b9190910192915050565b600060208284031215611c2e57600080fd5b81516110d8816119cc565b634e487b7160e01b600052603160045260246000fdfe6d439300980e333f0256d64be2c9f67e86f4493ce25f82498d6db7f4be3d9e6fa2646970667358221220219578763768416eb3618b256552e985cf66053c64c0c3397dc079e4b300f5e964736f6c634300081300330000000000000000000000007b2e3fc7510d1a51b3bef735f985446589219354000000000000000000000000933579532530d4740baf09fb551d3eb57e8ee51100000000000000000000000072e28c7f34100afefc399fcc0ae041b8fe5841ae00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106101bb5760003560e01c80637b25b4d4116100ec578063c415b95c1161008a578063f2fde38b11610064578063f2fde38b14610547578063f3ae241514610567578063f977350c14610587578063fe14e8c3146105a757600080fd5b8063c415b95c146104f2578063e3725b1514610512578063eedc966a1461052757600080fd5b8063a42dce80116100c6578063a42dce801461047d578063a5e90eee1461049d578063b9925588146104bd578063c2c518e1146104dd57600080fd5b80637b25b4d41461040d5780638456cb59146104455780638da5cb5b1461045a57600080fd5b80633f4ba83a116101595780635c975abb116101335780635c975abb146103a4578063607ab5e5146103bc5780636b56a691146103e3578063715018a6146103f857600080fd5b80633f4ba83a1461034e578063440d7248146103635780635359bf211461038457600080fd5b8063103b739711610195578063103b73971461024957806317daf0b41461029457806330eb1278146102dd578063341328c5146102fd57600080fd5b806304e535e2146101c7578063093f0e27146101f25780630da13cf31461023457600080fd5b366101c257005b600080fd5b3480156101d357600080fd5b506101dc6105c7565b6040516101e991906116f2565b60405180910390f35b3480156101fe57600080fd5b506102267f22ad9585a395edc8067b50da4778cafbb7fa2c4bbd7619fad6aeba403857fd7481565b6040519081526020016101e9565b6102476102423660046117f2565b610629565b005b34801561025557600080fd5b50600080516020611c5083398151915260005260016020527f3c2285c553468ca8f30447b24bb463c127f1b840e23a0cafa23caa79d906669a54610226565b3480156102a057600080fd5b506102cd6102af36600461192c565b6001600160a01b031660009081526005602052604090205460ff1690565b60405190151581526020016101e9565b3480156102e957600080fd5b506102476102f8366004611949565b6108ad565b34801561030957600080fd5b5061033761031836600461192c565b6005602052600090815260409020805460019091015460ff9091169082565b6040805192151583526020830191909152016101e9565b34801561035a57600080fd5b50610247610911565b34801561036f57600080fd5b506102cd61037e36600461192c565b50600090565b34801561039057600080fd5b5061024761039f36600461192c565b610949565b3480156103b057600080fd5b5060005460ff166102cd565b3480156103c857600080fd5b506003546103d69060ff1681565b6040516101e9919061198b565b3480156103ef57600080fd5b50600454610226565b34801561040457600080fd5b5061024761097b565b34801561041957600080fd5b5061042d6104283660046119b3565b61098d565b6040516001600160a01b0390911681526020016101e9565b34801561045157600080fd5b506102476109b7565b34801561046657600080fd5b5060005461010090046001600160a01b031661042d565b34801561048957600080fd5b5061024761049836600461192c565b6109ed565b3480156104a957600080fd5b506102476104b83660046119da565b610a1c565b3480156104c957600080fd5b5060065461042d906001600160a01b031681565b3480156104e957600080fd5b50610247610a79565b3480156104fe57600080fd5b5060075461042d906001600160a01b031681565b34801561051e57600080fd5b506101dc610ae6565b34801561053357600080fd5b5061022661054236600461192c565b610aff565b34801561055357600080fd5b5061024761056236600461192c565b610ba0565b34801561057357600080fd5b506102cd61058236600461192c565b610c16565b34801561059357600080fd5b506102476105a2366004611a13565b610c56565b3480156105b357600080fd5b506102476105c2366004611a34565b610cde565b6060600480548060200260200160405190810160405280929190818152602001828054801561061f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610601575b5050505050905090565b610631610def565b3332146106b8576000600260035460ff16600281111561065357610653611975565b148061068f5750600160035460ff16600281111561067357610673611975565b14801561068f57503360009081526005602052604090205460ff165b9050806106b657604051630fa0970d60e11b81523360048201526024015b60405180910390fd5b505b60006106c43447611abf565b8351604085015151919250906001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146000816106fd5785610707565b6107078684611ad2565b90508034101561072a57604051637dd7aa2160e01b815260040160405180910390fd5b816107535761073b84333086610e35565b6006546107539085906001600160a01b031685610f30565b60608701516001600160a01b031661076c573360608801525b6006546000906001600160a01b0316639f4876858461078c57600061078e565b855b8a6040518363ffffffff1660e01b81526004016107ab9190611b09565b60206040518083038185885af11580156107c9573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906107ee9190611b9b565b604051909150339082907f81917f569d6e249389f2db45ba51e7709ef45773fb326110af15efa50fcb245490600090a38261083c5760065461083c9086906001600160a01b03166000610f30565b600754610852906001600160a01b031688611022565b600061085f3088336110b0565b9050801561089d5760405181815233907fccb279e3652a5f0b9b377a22a3a61a4764a5590775e82e0535541fd87ce7370b9060200160405180910390a25b505050505050505050565b905090565b6108b633610c16565b6108d357604051637c3ea23f60e01b815260040160405180910390fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b03831601610906576109023382611022565b5050565b6109028233836110df565b61091a33610c16565b61093757604051637c3ea23f60e01b815260040160405180910390fd5b61093f6111c9565b610947611212565b565b61095233610c16565b61096f57604051637c3ea23f60e01b815260040160405180910390fd5b61097881611264565b50565b6109836112b7565b6109476000611317565b6004818154811061099d57600080fd5b6000918252602090912001546001600160a01b0316905081565b6109c033610c16565b6109dd57604051637c3ea23f60e01b815260040160405180910390fd5b6109e5610def565b610947611370565b6109f633610c16565b610a1357604051637c3ea23f60e01b815260040160405180910390fd5b610978816113ad565b610a246112b7565b610a3d600080516020611c50833981519152838361141e565b604051811515906001600160a01b038416907fbe9474bb3e78da7e315cdffa5cfa30b767fcc95bbf44a6197da60228eea1028690600090a35050565b610a8233610c16565b610a9f57604051637c3ea23f60e01b815260040160405180910390fd5b610ab9600080516020611c5083398151915233600061141e565b60405133907f6cc2c67081f55c2fffb7c008fa995fbbf890f48c7c16fba93d8220f00dc84cc590600090a2565b60606108a8600080516020611c5083398151915261144b565b600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b03831601610b2d575047919050565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015610b71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b959190611b9b565b92915050565b919050565b610ba86112b7565b6001600160a01b038116610c0d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106ad565b61097881611317565b6001600160a01b03811660009081527f260b29b219d450563ddb0e5ca806bdadb1e125f7e8c506de0443797dd7122728602052604081205460ff16610b95565b610c5f33610c16565b610c7c57604051637c3ea23f60e01b815260040160405180910390fd5b6003805482919060ff19166001836002811115610c9b57610c9b611975565b0217905550806002811115610cb257610cb2611975565b6040517f332a9f1d3bd9b0f7abbd95838fed6b417589632d0eb33f2d8ae6e2aa17178efd90600090a250565b610ce733610c16565b610d0457604051637c3ea23f60e01b815260040160405180910390fd5b60005b81811015610dea5736838383818110610d2257610d22611bb4565b9050604002019050806020016020810190610d3d9190611bca565b15610d5757610d57610d52602083018361192c565b6114b7565b610d8260046005610d6b602085018561192c565b610d7b6040860160208701611bca565b60646114ea565b50610d936040820160208301611bca565b1515610da2602083018361192c565b6001600160a01b03167f1470aed653fa8a8ce4c7b2f41287634199f7ec3c4f5fd0ace97d82cf006beec360405160405180910390a35080610de281611be7565b915050610d07565b505050565b60005460ff16156109475760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106ad565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b1790529151600092839290881691610e999190611c00565b6000604051808303816000865af19150503d8060008114610ed6576040519150601f19603f3d011682016040523d82523d6000602084013e610edb565b606091505b50915091506000828015610f07575081511580610f07575081806020019051810190610f079190611c1c565b905080610f2757604051632d9d5b4160e01b815260040160405180910390fd5b50505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b1790529151600092839290871691610f8c9190611c00565b6000604051808303816000865af19150503d8060008114610fc9576040519150601f19603f3d011682016040523d82523d6000602084013e610fce565b606091505b50915091506000828015610ffa575081511580610ffa575081806020019051810190610ffa9190611c1c565b90508061101a5760405163b45d44e760e01b815260040160405180910390fd5b505050505050565b604080516000808252602082019092526001600160a01b03841690839060405161104c9190611c00565b60006040518083038185875af1925050503d8060008114611089576040519150601f19603f3d011682016040523d82523d6000602084013e61108e565b606091505b5050905080610dea57604051632e05b05360e21b815260040160405180910390fd5b60006110c6836001600160a01b03861631611abf565b905080156110d8576110d88282611022565b9392505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b179052915160009283929087169161113b9190611c00565b6000604051808303816000865af19150503d8060008114611178576040519150601f19603f3d011682016040523d82523d6000602084013e61117d565b606091505b509150915060008280156111a95750815115806111a95750818060200190518101906111a99190611c1c565b90508061101a57604051632fdb1b7f60e11b815260040160405180910390fd5b60005460ff166109475760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016106ad565b61121a6111c9565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b61126d816114b7565b600680546001600160a01b0319166001600160a01b0383169081179091556040517f1e7b8d72cf538d88fcda3e6a489e2ac83f06df204580b5d1fef6cba8d248418890600090a250565b6000546001600160a01b036101009091041633146109475760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106ad565b600080546001600160a01b03838116610100818102610100600160a81b0319851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b611378610def565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586112473390565b6001600160a01b0381166113d457604051633efa09af60e01b815260040160405180910390fd5b600780546001600160a01b0319166001600160a01b0383169081179091556040517fd649da8f6092116f86ea4e5139de0b75ad371d823918d16368ba3ff09a5cbc9f90600090a250565b600083815260016020908152604080832060029092529091206114459190848460646114ea565b50505050565b6000818152600160209081526040918290208054835181840281018401909452808452606093928301828280156114ab57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161148d575b50505050509050919050565b6001600160a01b0381163b61097857604051638c50d7cd60e01b81526001600160a01b03821660048201526024016106ad565b600082611501576114fc868686611517565b61150d565b61150d8686868561163f565b9695505050505050565b6001600160a01b0381166000908152602083905260409020805460ff1690811561163757600180820154865490916000916115529190611abf565b90508082146115df57600087828154811061156f5761156f611bb4565b9060005260206000200160009054906101000a90046001600160a01b03169050808884815481106115a2576115a2611bb4565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394851617905592909116815290879052604090206001018290555b868054806115ef576115ef611c39565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b038716825287905260408120805460ff191681556001015550505b509392505050565b6001600160a01b03821660009081526020849052604090205460ff161580156116ea57845482116116835760405163b1655e3360e01b815260040160405180910390fd5b6040805180820182526001808252875460208084019182526001600160a01b03881660008181528a83529586209451855460ff1916901515178555915193830193909355885491820189558884529190922090910180546001600160a01b03191690911790555b949350505050565b6020808252825182820181905260009190848201906040850190845b818110156117335783516001600160a01b03168352928401929184019160010161170e565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff811182821017156117785761177861173f565b60405290565b6040516060810167ffffffffffffffff811182821017156117785761177861173f565b604051601f8201601f1916810167ffffffffffffffff811182821017156117ca576117ca61173f565b604052919050565b6001600160a01b038116811461097857600080fd5b8035610b9b816117d2565b6000806040838503121561180557600080fd5b823567ffffffffffffffff8082111561181d57600080fd5b908401906080828703121561183157600080fd5b611839611755565b8235611844816117d2565b8152602083810135611855816117d2565b8282015260408401358381111561186b57600080fd5b84016060818a03121561187d57600080fd5b61188561177e565b8135815282820135838201526040820135858111156118a357600080fd5b80830192505089601f8301126118b857600080fd5b8135858111156118ca576118ca61173f565b6118dc601f8201601f191685016117a1565b95508086528a848285010111156118f257600080fd5b8084840185880137600090860184015260408181018690528401525061191a606085016117e7565b60608301529097950135955050505050565b60006020828403121561193e57600080fd5b81356110d8816117d2565b6000806040838503121561195c57600080fd5b8235611967816117d2565b946020939093013593505050565b634e487b7160e01b600052602160045260246000fd5b60208101600383106119ad57634e487b7160e01b600052602160045260246000fd5b91905290565b6000602082840312156119c557600080fd5b5035919050565b801515811461097857600080fd5b600080604083850312156119ed57600080fd5b82356119f8816117d2565b91506020830135611a08816119cc565b809150509250929050565b600060208284031215611a2557600080fd5b8135600381106110d857600080fd5b60008060208385031215611a4757600080fd5b823567ffffffffffffffff80821115611a5f57600080fd5b818501915085601f830112611a7357600080fd5b813581811115611a8257600080fd5b8660208260061b8501011115611a9757600080fd5b60209290920196919550909350505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610b9557610b95611aa9565b80820180821115610b9557610b95611aa9565b60005b83811015611b00578181015183820152602001611ae8565b50506000910152565b60208152600060018060a01b0380845116602084015280602085015116604084015250604083015160806060840152805160a0840152602081015160c084015260408101519050606060e0840152805180610100850152610120611b738282870160208601611ae5565b606095909501516001600160a01b03166080850152601f01601f191690920190920192915050565b600060208284031215611bad57600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215611bdc57600080fd5b81356110d8816119cc565b600060018201611bf957611bf9611aa9565b5060010190565b60008251611c12818460208701611ae5565b9190910192915050565b600060208284031215611c2e57600080fd5b81516110d8816119cc565b634e487b7160e01b600052603160045260246000fdfe6d439300980e333f0256d64be2c9f67e86f4493ce25f82498d6db7f4be3d9e6fa2646970667358221220219578763768416eb3618b256552e985cf66053c64c0c3397dc079e4b300f5e964736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000007b2e3fc7510d1a51b3bef735f985446589219354000000000000000000000000933579532530d4740baf09fb551d3eb57e8ee51100000000000000000000000072e28c7f34100afefc399fcc0ae041b8fe5841ae00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _actionExecutor (address): 0x7b2E3FC7510D1A51b3bef735F985446589219354
Arg [1] : _feeCollector (address): 0x933579532530d4740bAF09FB551D3EB57e8eE511
Arg [2] : _owner (address): 0x72E28c7F34100AfefC399fcc0AE041B8fe5841AE
Arg [3] : _managers (address[]):
Arg [4] : _addOwnerToManagers (bool): False
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000007b2e3fc7510d1a51b3bef735f985446589219354
Arg [1] : 000000000000000000000000933579532530d4740baf09fb551d3eb57e8ee511
Arg [2] : 00000000000000000000000072e28c7f34100afefc399fcc0ae041b8fe5841ae
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.