Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 943 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Transfer Ownersh... | 19793990 | 55 days ago | IN | 0 ETH | 0.00016696 | ||||
Transfer Ownersh... | 19793987 | 55 days ago | IN | 0 ETH | 0.00016871 | ||||
Transfer Ownersh... | 19793981 | 55 days ago | IN | 0 ETH | 0.00018675 | ||||
Transfer Ownersh... | 19793980 | 55 days ago | IN | 0 ETH | 0.00017216 | ||||
Transfer Ownersh... | 19793977 | 55 days ago | IN | 0 ETH | 0.00016605 | ||||
Transfer Ownersh... | 19793975 | 55 days ago | IN | 0 ETH | 0.00017599 | ||||
Transfer Ownersh... | 19793972 | 55 days ago | IN | 0 ETH | 0.00016132 | ||||
Transfer Ownersh... | 19793970 | 55 days ago | IN | 0 ETH | 0.00016664 | ||||
Transfer Ownersh... | 19793969 | 55 days ago | IN | 0 ETH | 0.00017158 | ||||
Transfer Ownersh... | 19793967 | 55 days ago | IN | 0 ETH | 0.00015806 | ||||
Transfer Ownersh... | 19793963 | 55 days ago | IN | 0 ETH | 0.00017196 | ||||
Transfer Ownersh... | 19793962 | 55 days ago | IN | 0 ETH | 0.0001636 | ||||
Transfer Ownersh... | 19793959 | 55 days ago | IN | 0 ETH | 0.00016607 | ||||
Transfer Ownersh... | 19793956 | 55 days ago | IN | 0 ETH | 0.00017292 | ||||
Transfer Ownersh... | 19793955 | 55 days ago | IN | 0 ETH | 0.00017329 | ||||
Transfer Ownersh... | 19793953 | 55 days ago | IN | 0 ETH | 0.000176 | ||||
Transfer Ownersh... | 19793951 | 55 days ago | IN | 0 ETH | 0.00018752 | ||||
Transfer Ownersh... | 19793943 | 55 days ago | IN | 0 ETH | 0.00017662 | ||||
Transfer Ownersh... | 19793942 | 55 days ago | IN | 0 ETH | 0.00016609 | ||||
Transfer Ownersh... | 19793936 | 55 days ago | IN | 0 ETH | 0.00016309 | ||||
Transfer Ownersh... | 19793934 | 55 days ago | IN | 0 ETH | 0.00016414 | ||||
Transfer Ownersh... | 19793933 | 55 days ago | IN | 0 ETH | 0.00017611 | ||||
Transfer Ownersh... | 19793932 | 55 days ago | IN | 0 ETH | 0.00017553 | ||||
Transfer Ownersh... | 19793931 | 55 days ago | IN | 0 ETH | 0.00016896 | ||||
Transfer Ownersh... | 19793930 | 55 days ago | IN | 0 ETH | 0.0001756 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
11565486 | 1274 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
MoonSale
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-01-01 */ pragma solidity ^0.5.5; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Converts an `address` into `address payable`. Note that this is * simply a type cast: the actual underlying value is not changed. * * _Available since v2.4.0._ */ function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. * * _Available since v2.4.0._ */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call.value(amount)(""); require(success, "Address: unable to send value, recipient may have reverted"); } } /** * @title Roles * @dev Library for managing addresses assigned to a Role. */ library Roles { struct Role { mapping (address => bool) bearer; } /** * @dev Give an account access to this role. */ function add(Role storage role, address account) internal { require(!has(role, account), "Roles: account already has role"); role.bearer[account] = true; } /** * @dev Remove an account's access to this role. */ function remove(Role storage role, address account) internal { require(has(role, account), "Roles: account does not have role"); role.bearer[account] = false; } /** * @dev Check if an account has this role. * @return bool */ function has(Role storage role, address account) internal view returns (bool) { require(account != address(0), "Roles: account is the zero address"); return role.bearer[account]; } } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. * * _Since v2.5.0:_ this module is now much more gas efficient, given net gas * metering changes introduced in the Istanbul hardfork. */ contract ReentrancyGuard { bool private _notEntered; constructor () internal { // Storing an initial non-zero value makes deployment a bit more // expensive, but in exchange the refund on every call to nonReentrant // will be lower in amount. Since refunds are capped to a percetange of // the total transaction's gas, it is best to keep them low in cases // like this one, to increase the likelihood of the full refund coming // into effect. _notEntered = true; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_notEntered, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _notEntered = false; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _notEntered = true; } } /* * @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 GSN 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. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } contract PauserRole is Context { using Roles for Roles.Role; event PauserAdded(address indexed account); event PauserRemoved(address indexed account); Roles.Role private _pausers; constructor () internal { _addPauser(_msgSender()); } modifier onlyPauser() { require(isPauser(_msgSender()), "PauserRole: caller does not have the Pauser role"); _; } function isPauser(address account) public view returns (bool) { return _pausers.has(account); } function addPauser(address account) public onlyPauser { _addPauser(account); } function renouncePauser() public { _removePauser(_msgSender()); } function _addPauser(address account) internal { _pausers.add(account); emit PauserAdded(account); } function _removePauser(address account) internal { _pausers.remove(account); emit PauserRemoved(account); } } /** * @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. */ contract Pausable is Context, PauserRole { /** * @dev Emitted when the pause is triggered by a pauser (`account`). */ event Paused(address account); /** * @dev Emitted when the pause is lifted by a pauser (`account`). */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. Assigns the Pauser role * to the deployer. */ constructor () internal { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. */ modifier whenNotPaused() { require(!_paused, "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. */ modifier whenPaused() { require(_paused, "Pausable: not paused"); _; } /** * @dev Called by a pauser to pause, triggers stopped state. */ function pause() public onlyPauser whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Called by a pauser to unpause, returns to normal state. */ function unpause() public onlyPauser whenPaused { _paused = false; emit Unpaused(_msgSender()); } } /** * @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. * * 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. */ 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 () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() internal view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() internal view returns (bool) { return _msgSender() == _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 onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = 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 onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @title Crowdsale * @dev Crowdsale is a base contract for managing a token crowdsale, * allowing investors to purchase tokens with ether. This contract implements * such functionality in its most fundamental form and can be extended to provide additional * functionality and/or custom behavior. * The external interface represents the basic interface for purchasing tokens, and conforms * the base architecture for crowdsales. It is *not* intended to be modified / overridden. * The internal interface conforms the extensible and modifiable surface of crowdsales. Override * the methods to add functionality. Consider using 'super' where appropriate to concatenate * behavior. */ contract Crowdsale is Ownable, ReentrancyGuard { using SafeMath for uint256; using SafeERC20 for IERC20; struct Rate { uint256 rate; uint256 adapter; } // The token being sold IERC20 private _token; // How many token units a buyer gets per wei. // The rate is the conversion between wei and the smallest and indivisible token unit. // So, if you are using a rate of 1 with a ERC20Detailed token with 3 decimals called TOK // 1 wei will give you 1 unit, or 0.001 TOK. uint256 private _sold; mapping(address => Rate) private _rates; /** * Event for token purchase logging * @param purchaser who paid for the tokens * @param beneficiary who got the tokens * @param value weis paid for purchase * @param amount amount of tokens purchased */ event TokensPurchased(address indexed purchaser, address indexed beneficiary, uint256 value, uint256 amount); /** * @dev The rate is the conversion between wei and the smallest and indivisible * token unit. So, if you are using a rate of 1 with a ERC20Detailed token * with 3 decimals called TOK, 1 wei will give you 1 unit, or 0.001 TOK. * @param token Address of the token being sold */ constructor (IERC20 token) Ownable() public { require(address(token) != address(0), "Crowdsale: token is the zero address"); _rates[0xdAC17F958D2ee523a2206206994597C13D831ec7].rate = 2e12; _rates[0xdAC17F958D2ee523a2206206994597C13D831ec7].adapter = 1; _rates[0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48].rate = 2e12; _rates[0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48].adapter = 1; _token = token; } /** * @dev Checks whether the token is accepted. * @return Whether the token is accepted. */ function isTokenAccepted(address token) public view returns (bool) { return _rates[token].rate != 0; } /** * @dev Update accepted token rate */ function updateTokenRate(address token, uint256 _rate, uint256 _adapter) public onlyOwner returns (bool) { _rates[token].rate = _rate; _rates[token].adapter = _adapter; return true; } /** * @dev View current rate */ function rate(address token) public view onlyOwner returns (uint256, uint256) { return ( _rates[token].rate, _rates[token].adapter ); } /** * @return the token being sold. */ function token() public view returns (IERC20) { return _token; } /** * @return the amount of token sold. */ function sold() public view returns (uint256) { return _sold; } /** * @dev This function has a non-reentrancy guard, so it shouldn't be called by * another `nonReentrant` function. * @param sentTokens Amount of tokens sent * @param _erc20Token Address of the token contract */ function buyTokensWithTokens(uint256 sentTokens, address _erc20Token) public nonReentrant { require(isTokenAccepted(_erc20Token), "Token is not accepted"); address beneficiary = _msgSender(); _preValidatePurchase(beneficiary, sentTokens); IERC20 erc20Token = IERC20(_erc20Token); uint256 amountRecieved = _getTokenAmount(sentTokens, _erc20Token); require(sentTokens <= erc20Token.allowance(beneficiary, address(this)), "Insufficient Funds"); _forwardFundsToken(erc20Token, sentTokens); _sold = _sold.add(amountRecieved); _processPurchase(beneficiary, amountRecieved); emit TokensPurchased(beneficiary, beneficiary, 0, amountRecieved); _updatePurchasingState(beneficiary, amountRecieved); } function checkRate(uint256 amount, address tokenAddress) public onlyOwner view returns (uint256) { return _getTokenAmount(amount, tokenAddress); } /** * @dev Validation of an incoming purchase. Use require statements to revert state when conditions are not met. * Use `super` in contracts that inherit from Crowdsale to extend their validations. * Example from CappedCrowdsale.sol's _preValidatePurchase method: * super._preValidatePurchase(beneficiary, weiAmount); * require(weiRaised().add(weiAmount) <= cap); * @param beneficiary Address performing the token purchase * @param weiAmount Value in wei involved in the purchase */ function _preValidatePurchase(address beneficiary, uint256 weiAmount) internal view { require(beneficiary != address(0), "Crowdsale: beneficiary is the zero address"); require(weiAmount != 0, "Crowdsale: weiAmount is 0"); this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 } /** * @dev Validation of an executed purchase. Observe state and use revert statements to undo rollback when valid * conditions are not met. * @param weiAmount Value in wei involved in the purchase */ function _forwardFundsToken(IERC20 erc20Token, uint256 weiAmount) internal { // solhint-disable-previous-line no-empty-blocks } /** * @dev Source of tokens. Override this method to modify the way in which the crowdsale ultimately gets and sends * its tokens. * @param beneficiary Address performing the token purchase * @param tokenAmount Number of tokens to be emitted */ function _deliverTokens(address beneficiary, uint256 tokenAmount) internal { _token.transfer(beneficiary, tokenAmount); } /** * @dev Executed when a purchase has been validated and is ready to be executed. Doesn't necessarily emit/send * tokens. * @param beneficiary Address receiving the tokens * @param tokenAmount Number of tokens to be purchased */ function _processPurchase(address beneficiary, uint256 tokenAmount) internal { _deliverTokens(beneficiary, tokenAmount); } /** * @dev Override for extensions that require an internal state to check for validity (current user contributions, * etc.) * @param beneficiary Address receiving the tokens * @param weiAmount Value in wei involved in the purchase */ function _updatePurchasingState(address beneficiary, uint256 weiAmount) internal { // solhint-disable-previous-line no-empty-blocks } /** * @dev Override to extend the way in which ether is converted to tokens. * @param amount Value in wei to be converted into tokens * @return Number of tokens that can be purchased with the specified _amount */ function _getTokenAmount(uint256 amount, address _erc20Token) internal view returns (uint256) { Rate memory exchangeRate = _rates[_erc20Token]; return amount .mul(exchangeRate.rate) .div(exchangeRate.adapter); } } /** * @title TimedCrowdsale * @dev Crowdsale accepting contributions only within a time frame. */ contract TimedCrowdsale is Crowdsale { using SafeMath for uint256; uint256 private _openingTime; uint256 private _closingTime; /** * Event for crowdsale extending * @param newClosingTime new closing time * @param prevClosingTime old closing time */ event TimedCrowdsaleExtended(uint256 prevClosingTime, uint256 newClosingTime); /** * @dev Reverts if not in crowdsale time range. */ modifier onlyWhileOpen { require(isOpen(), "TimedCrowdsale: not open"); _; } /** * @dev Constructor, takes crowdsale opening and closing times. * @param openingTime Crowdsale opening time * @param closingTime Crowdsale closing time */ constructor (uint256 openingTime, uint256 closingTime) public { // solhint-disable-next-line not-rely-on-time require(openingTime >= block.timestamp, "TimedCrowdsale: opening time is before current time"); // solhint-disable-next-line max-line-length require(closingTime > openingTime, "TimedCrowdsale: opening time is not before closing time"); _openingTime = openingTime; _closingTime = closingTime; } /** * @return the crowdsale opening time. */ function openingTime() public view returns (uint256) { return _openingTime; } /** * @return the crowdsale closing time. */ function closingTime() public view returns (uint256) { return _closingTime; } /** * @return true if the crowdsale is open, false otherwise. */ function isOpen() public view returns (bool) { // solhint-disable-next-line not-rely-on-time return block.timestamp >= _openingTime && block.timestamp <= _closingTime; } /** * @dev Checks whether the period in which the crowdsale is open has already elapsed. * @return Whether crowdsale period has elapsed */ function hasClosed() public view returns (bool) { // solhint-disable-next-line not-rely-on-time return block.timestamp > _closingTime; } /** * @dev Extend parent behavior requiring to be within contributing period. * @param beneficiary Token purchaser * @param weiAmount Amount of wei contributed */ function _preValidatePurchase(address beneficiary, uint256 weiAmount) internal onlyWhileOpen view { super._preValidatePurchase(beneficiary, weiAmount); } /** * @dev Extend crowdsale. * @param newOpeningTime Crowdsale Opening time * @param newClosingTime Crowdsale closing time */ function _extendTime(uint256 newOpeningTime, uint256 newClosingTime) internal { emit TimedCrowdsaleExtended(_closingTime, newClosingTime); _openingTime = newOpeningTime; _closingTime = newClosingTime; } } /** * @dev A Secondary contract can only be used by its primary account (the one that created it). */ contract Secondary is Context { address private _primary; /** * @dev Emitted when the primary contract changes. */ event PrimaryTransferred( address recipient ); /** * @dev Sets the primary account to the one that is creating the Secondary contract. */ constructor () internal { address msgSender = _msgSender(); _primary = msgSender; emit PrimaryTransferred(msgSender); } /** * @dev Reverts if called from any account other than the primary. */ modifier onlyPrimary() { require(_msgSender() == _primary, "Secondary: caller is not the primary account"); _; } /** * @return the address of the primary. */ function primary() public view returns (address) { return _primary; } /** * @dev Transfers contract to a new primary. * @param recipient The address of new primary. */ function transferPrimary(address recipient) public onlyPrimary { require(recipient != address(0), "Secondary: new primary is the zero address"); _primary = recipient; emit PrimaryTransferred(recipient); } } /** * @title __unstable__TokenVault * @dev Similar to an Escrow for tokens, this contract allows its primary account to spend its tokens as it sees fit. * This contract is an internal helper for PostDeliveryCrowdsale, and should not be used outside of this context. */ // solhint-disable-next-line contract-name-camelcase contract __unstable__TokenVault is Secondary { using SafeERC20 for IERC20; function transferToken(IERC20 token, address to, uint256 amount) public onlyPrimary { token.safeTransfer(to, amount); } function transferFunds(address payable to, uint256 amount) public onlyPrimary { require (address(this).balance >= amount); to.transfer(amount); } function () external payable {} } /** * @title MoonSale */ contract MoonSale is TimedCrowdsale, Pausable { using SafeMath for uint256; struct User { address sponsor; uint256 balance; uint256 referralBonus; } __unstable__TokenVault private _vault; mapping(address => User) _users; /** * @param token The token. */ constructor(IERC20 token) TimedCrowdsale(block.timestamp + 1 seconds, block.timestamp + 30 days) Crowdsale(token) public { _vault = new __unstable__TokenVault(); } /** * @dev Extend sale * @param openingTime New opening time. * @param closingTime New closing time. */ function extendTime(uint256 openingTime, uint256 closingTime) public onlyOwner returns (bool) { _extendTime(openingTime, closingTime); return true; } /** * @dev Set sponsor * @param sponsor Sponsor address */ function setSponsor(address sponsor) public returns (bool) { require(sponsor != _msgSender(), "You can not be your own sponsor"); User storage _user = _users[_msgSender()]; require(_user.sponsor == address(0), "You already has a sponsor"); _user.sponsor = sponsor; return true; } /** * @dev Withdraw all available tokens. */ function withdraw() public whenNotPaused nonReentrant returns (bool) { require(hasClosed(), "TimedCrowdsale: not closed"); User storage user = _users[_msgSender()]; uint256 available = user.referralBonus.add(user.balance); require(available > 0, "Not available"); user.balance = 0; user.referralBonus = 0; _vault.transferToken(token(), _msgSender(), available); return true; } /** * @dev deprive tokens from vaults. * @param vault Vault address * @param amount The amount */ function depriveToken(address vault, IERC20 token, uint256 amount) public onlyOwner returns (bool) { _vault.transferToken(token, vault, amount); return true; } /** * @dev deprive funds from vaults. * @param vault Vault address * @param amount The amount */ function depriveFunds(address payable vault, uint256 amount) public onlyOwner returns (bool) { _vault.transferFunds(vault, amount); return true; } function delegateToken(IERC20 token, address from, address to, uint256 amount) public onlyOwner returns (bool) { token.safeTransferFrom(from, to, amount); return true; } /** * @return the invested, referralBonus, airdropBonus, dailyIncome, stakes, withdrawn, available */ function personalStats(address account) public view returns ( address sponsor, uint256 balance, uint256 referralBonus, uint256 available ) { User memory user = _users[account]; return ( user.sponsor, user.balance, user.referralBonus, user.balance.add(user.referralBonus) ); } /** * @dev Fallback function */ function () external payable { address(uint160((address(_vault)))).transfer(msg.value); } /** * @dev Override parent behavior: Storing balance instead of issuing tokens right away. * @param beneficiary Token purchaser * @param tokenAmount Amount of tokens purchased */ function _processPurchase(address beneficiary, uint256 tokenAmount) internal { _users[beneficiary].balance = _users[beneficiary].balance.add(tokenAmount); } /** * @dev Override parent behavior: Pay bonus for sponsor. * @param beneficiary Address receiving the tokens * @param amount Value in token involved in the purchase */ function _updatePurchasingState(address beneficiary, uint256 amount) internal { User storage user = _users[beneficiary]; if (user.sponsor != address(0)) { _users[user.sponsor].referralBonus = amount .mul(12).div(100).add(_users[user.sponsor].referralBonus); } } /** * @dev Extend parent behavior requiring minimum amount to be 1000. * @param beneficiary Token purchaser * @param _value Amount contributed */ function _preValidatePurchase(address beneficiary, uint256 _value) internal view { // require(_value >= 1000e18, "Minimum amount is 1000"); super._preValidatePurchase(beneficiary, _value); } function transferAnyERC20Token(IERC20 erc20Token, uint256 tokens, address target) public onlyOwner returns (bool success) { erc20Token.safeTransfer(target, tokens); return true; } /** * @dev Extend parent behavior * @param erc20Token ERC20 Token * @param _value Amount contributed */ function _forwardFundsToken(IERC20 erc20Token, uint256 _value) internal { erc20Token.safeTransferFrom(_msgSender(), address(_vault), _value); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"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":"PauserAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"PauserRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"prevClosingTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newClosingTime","type":"uint256"}],"name":"TimedCrowdsaleExtended","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"purchaser","type":"address"},{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokensPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addPauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"sentTokens","type":"uint256"},{"internalType":"address","name":"_erc20Token","type":"address"}],"name":"buyTokensWithTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"checkRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"closingTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"delegateToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"vault","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depriveFunds","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depriveToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"openingTime","type":"uint256"},{"internalType":"uint256","name":"closingTime","type":"uint256"}],"name":"extendTime","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"hasClosed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isPauser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"isTokenAccepted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"openingTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"personalStats","outputs":[{"internalType":"address","name":"sponsor","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"referralBonus","type":"uint256"},{"internalType":"uint256","name":"available","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renouncePauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sponsor","type":"address"}],"name":"setSponsor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"sold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IERC20","name":"erc20Token","type":"address"},{"internalType":"uint256","name":"tokens","type":"uint256"},{"internalType":"address","name":"target","type":"address"}],"name":"transferAnyERC20Token","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"_rate","type":"uint256"},{"internalType":"uint256","name":"_adapter","type":"uint256"}],"name":"updateTokenRate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162002b6c38038062002b6c833981810160405260208110156200003757600080fd5b505142600181019062278d000182600062000051620002dd565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506000805460ff60a01b1916600160a01b1790556001600160a01b038116620000f55760405162461bcd60e51b815260040180806020018281038252602481526020018062002b266024913960400191505060405180910390fd5b60036020526501d1a94a20007f82a5f3f697c19feba90e97eb50cf7817270ec4e8adf5c43afb6668e726e6e67181905560017f82a5f3f697c19feba90e97eb50cf7817270ec4e8adf5c43afb6668e726e6e67281905573a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486000527f37c5eec85d84da1cf053e48828b531c27553684966639a8ba393ecfe725880fd919091557f37c5eec85d84da1cf053e48828b531c27553684966639a8ba393ecfe725880fe81905580546001600160a01b0319166001600160a01b0392909216919091179055428210156200020b5760405162461bcd60e51b815260040180806020018281038252603381526020018062002abc6033913960400191505060405180910390fd5b8181116200024b5760405162461bcd60e51b815260040180806020018281038252603781526020018062002aef6037913960400191505060405180910390fd5b6004919091556005556200027a6200026b6001600160e01b03620002dd16565b6001600160e01b03620002e116565b6007805460ff19169055604051620002929062000429565b604051809103906000f080158015620002af573d6000803e3d6000fd5b50600760016101000a8154816001600160a01b0302191690836001600160a01b031602179055505062000437565b3390565b620002fc8160066200033360201b62001c201790919060201c565b6040516001600160a01b038216907f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f890600090a250565b6200034882826001600160e01b03620003c016565b156200039b576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006001600160a01b038216620004095760405162461bcd60e51b815260040180806020018281038252602281526020018062002b4a6022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b6106bb806200240183390190565b611fba80620004476000396000f3fe60806040526004361061019c5760003560e01c80635c975abb116100ec578063ae4c4b411161008a578063e93375f211610064578063e93375f2146105df578063f2fde38b14610622578063f7ccc18414610655578063fc0c546a146106855761019c565b8063ae4c4b4114610552578063b7a8807c1461058b578063d545782e146105a05761019c565b806382dc1ec4116100c657806382dc1ec41461048e5780638456cb59146104c15780639156fb05146104d6578063aab324ae1461050f5761019c565b80635c975abb1461044f5780636ef8d66d14610464578063715018a6146104795761019c565b80633ccfd60b1161015957806347535d7b1161013357806347535d7b1461038f5780634b6753bc146103a457806358ccd7f5146103b957806359753fb11461041c5761019c565b80633ccfd60b146103325780633f4ba83a1461034757806346fbf68e1461035c5761019c565b806302c7e7af146101df5780630560bd96146102065780630ba9d8ca1461024d5780631515bc2b146102995780631684c343146102ae57806330053620146102e9575b6007546040516001600160a01b0361010090920491909116903480156108fc02916000818181858888f193505050501580156101dc573d6000803e3d6000fd5b50005b3480156101eb57600080fd5b506101f46106b6565b60408051918252519081900360200190f35b34801561021257600080fd5b506102396004803603602081101561022957600080fd5b50356001600160a01b03166106bc565b604080519115158252519081900360200190f35b34801561025957600080fd5b506102806004803603602081101561027057600080fd5b50356001600160a01b03166106d9565b6040805192835260208301919091528051918290030190f35b3480156102a557600080fd5b50610239610748565b3480156102ba57600080fd5b506102e7600480360360408110156102d157600080fd5b50803590602001356001600160a01b0316610750565b005b3480156102f557600080fd5b506102396004803603608081101561030c57600080fd5b506001600160a01b0381358116916020810135821691604082013516906060013561098f565b34801561033e57600080fd5b506102396109fe565b34801561035357600080fd5b506102e7610c75565b34801561036857600080fd5b506102396004803603602081101561037f57600080fd5b50356001600160a01b0316610d5e565b34801561039b57600080fd5b50610239610d77565b3480156103b057600080fd5b506101f4610d92565b3480156103c557600080fd5b506103ec600480360360208110156103dc57600080fd5b50356001600160a01b0316610d98565b604080516001600160a01b0390951685526020850193909352838301919091526060830152519081900360800190f35b34801561042857600080fd5b506102396004803603602081101561043f57600080fd5b50356001600160a01b0316610e0c565b34801561045b57600080fd5b50610239610f20565b34801561047057600080fd5b506102e7610f29565b34801561048557600080fd5b506102e7610f3b565b34801561049a57600080fd5b506102e7600480360360208110156104b157600080fd5b50356001600160a01b0316610fcc565b3480156104cd57600080fd5b506102e761101e565b3480156104e257600080fd5b506101f4600480360360408110156104f957600080fd5b50803590602001356001600160a01b03166110e5565b34801561051b57600080fd5b506102396004803603606081101561053257600080fd5b506001600160a01b0381358116916020810135916040909101351661113f565b34801561055e57600080fd5b506102396004803603604081101561057557600080fd5b506001600160a01b0381351690602001356111ac565b34801561059757600080fd5b506101f4611271565b3480156105ac57600080fd5b50610239600480360360608110156105c357600080fd5b506001600160a01b038135169060208101359060400135611277565b3480156105eb57600080fd5b506102396004803603606081101561060257600080fd5b506001600160a01b038135811691602081013590911690604001356112ea565b34801561062e57600080fd5b506102e76004803603602081101561064557600080fd5b50356001600160a01b03166113b8565b34801561066157600080fd5b506102396004803603604081101561067857600080fd5b5080359060200135611408565b34801561069157600080fd5b5061069a611464565b604080516001600160a01b039092168252519081900360200190f35b60025490565b6001600160a01b0316600090815260036020526040902054151590565b6000806106e4611473565b610723576040805162461bcd60e51b81526020600482018190526024820152600080516020611ef0833981519152604482015290519081900360640190fd5b50506001600160a01b0316600090815260036020526040902080546001909101549091565b600554421190565b600054600160a01b900460ff166107ae576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6000805460ff60a01b191690556107c4816106bc565b61080d576040805162461bcd60e51b8152602060048201526015602482015274151bdad95b881a5cc81b9bdd081858d8d95c1d1959605a1b604482015290519081900360640190fd5b6000610817611497565b9050610823818461149b565b81600061083085836114a9565b60408051636eb1769f60e11b81526001600160a01b03868116600483015230602483015291519293509084169163dd62ed3e91604480820192602092909190829003018186803b15801561088357600080fd5b505afa158015610897573d6000803e3d6000fd5b505050506040513d60208110156108ad57600080fd5b50518511156108f8576040805162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742046756e647360701b604482015290519081900360640190fd5b6109028286611513565b600254610915908263ffffffff61154016565b600255610922838261159a565b60408051600081526020810183905281516001600160a01b0386169283927f6faf93231a456e552dbc9961f58d9713ee4f2e69d15f1975b050ef0911053a7b929081900390910190a361097583826115e9565b50506000805460ff60a01b1916600160a01b179055505050565b6000610999611473565b6109d8576040805162461bcd60e51b81526020600482018190526024820152600080516020611ef0833981519152604482015290519081900360640190fd5b6109f36001600160a01b03861685858563ffffffff61167216565b506001949350505050565b60075460009060ff1615610a4c576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b600054600160a01b900460ff16610aaa576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6000805460ff60a01b19169055610abf610748565b610b10576040805162461bcd60e51b815260206004820152601a60248201527f54696d656443726f776473616c653a206e6f7420636c6f736564000000000000604482015290519081900360640190fd5b600060086000610b1e611497565b6001600160a01b03166001600160a01b0316815260200190815260200160002090506000610b5d8260010154836002015461154090919063ffffffff16565b905060008111610ba4576040805162461bcd60e51b815260206004820152600d60248201526c4e6f7420617661696c61626c6560981b604482015290519081900360640190fd5b600060018301819055600283015560075461010090046001600160a01b031663f5537ede610bd0611464565b610bd8611497565b846040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015610c4157600080fd5b505af1158015610c55573d6000803e3d6000fd5b505050506001925050506000805460ff60a01b1916600160a01b17905590565b610c85610c80611497565b610d5e565b610cc05760405162461bcd60e51b8152600401808060200182810382526030815260200180611e586030913960400191505060405180910390fd5b60075460ff16610d0e576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6007805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa610d41611497565b604080516001600160a01b039092168252519081900360200190a1565b6000610d7160068363ffffffff6116d216565b92915050565b60006004544210158015610d8d57506005544211155b905090565b60055490565b600080600080610da6611e13565b506001600160a01b0380861660009081526008602090815260409182902082516060810184528154909416808552600182015492850183905260029091015492840183905291610dfc828263ffffffff61154016565b9450945094509450509193509193565b6000610e16611497565b6001600160a01b0316826001600160a01b03161415610e7c576040805162461bcd60e51b815260206004820152601f60248201527f596f752063616e206e6f7420626520796f7572206f776e2073706f6e736f7200604482015290519081900360640190fd5b600060086000610e8a611497565b6001600160a01b039081168252602082019290925260400160002080549092501615610efd576040805162461bcd60e51b815260206004820152601960248201527f596f7520616c72656164792068617320612073706f6e736f7200000000000000604482015290519081900360640190fd5b80546001600160a01b0384166001600160a01b0319909116179055506001919050565b60075460ff1690565b610f39610f34611497565b611739565b565b610f43611473565b610f82576040805162461bcd60e51b81526020600482018190526024820152600080516020611ef0833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b610fd7610c80611497565b6110125760405162461bcd60e51b8152600401808060200182810382526030815260200180611e586030913960400191505060405180910390fd5b61101b81611781565b50565b611029610c80611497565b6110645760405162461bcd60e51b8152600401808060200182810382526030815260200180611e586030913960400191505060405180910390fd5b60075460ff16156110af576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6007805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610d41611497565b60006110ef611473565b61112e576040805162461bcd60e51b81526020600482018190526024820152600080516020611ef0833981519152604482015290519081900360640190fd5b61113883836114a9565b9392505050565b6000611149611473565b611188576040805162461bcd60e51b81526020600482018190526024820152600080516020611ef0833981519152604482015290519081900360640190fd5b6111a26001600160a01b038516838563ffffffff6117c916565b5060019392505050565b60006111b6611473565b6111f5576040805162461bcd60e51b81526020600482018190526024820152600080516020611ef0833981519152604482015290519081900360640190fd5b6007546040805163990dc9db60e01b81526001600160a01b0386811660048301526024820186905291516101009093049091169163990dc9db9160448082019260009290919082900301818387803b15801561125057600080fd5b505af1158015611264573d6000803e3d6000fd5b5060019695505050505050565b60045490565b6000611281611473565b6112c0576040805162461bcd60e51b81526020600482018190526024820152600080516020611ef0833981519152604482015290519081900360640190fd5b506001600160a01b0392909216600090815260036020526040902090815560019081019190915590565b60006112f4611473565b611333576040805162461bcd60e51b81526020600482018190526024820152600080516020611ef0833981519152604482015290519081900360640190fd5b60075460408051637aa9bf6f60e11b81526001600160a01b03868116600483015287811660248301526044820186905291516101009093049091169163f5537ede9160648082019260009290919082900301818387803b15801561139657600080fd5b505af11580156113aa573d6000803e3d6000fd5b506001979650505050505050565b6113c0611473565b6113ff576040805162461bcd60e51b81526020600482018190526024820152600080516020611ef0833981519152604482015290519081900360640190fd5b61101b8161181b565b6000611412611473565b611451576040805162461bcd60e51b81526020600482018190526024820152600080516020611ef0833981519152604482015290519081900360640190fd5b61145b83836118bb565b50600192915050565b6001546001600160a01b031690565b600080546001600160a01b0316611488611497565b6001600160a01b031614905090565b3390565b6114a58282611903565b5050565b60006114b3611e3d565b506001600160a01b0382166000908152600360209081526040918290208251808401909352805480845260019091015491830182905261150b91906114ff90879063ffffffff61196616565b9063ffffffff6119bf16565b949350505050565b6114a561151e611497565b6007546001600160a01b0385811692916101009004168463ffffffff61167216565b600082820183811015611138576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b0382166000908152600860205260409020600101546115c6908263ffffffff61154016565b6001600160a01b0390921660009081526008602052604090206001019190915550565b6001600160a01b03808316600090815260086020526040902080549091161561166d5780546001600160a01b031660009081526008602052604090206002015461164f9061164360646114ff86600c63ffffffff61196616565b9063ffffffff61154016565b81546001600160a01b03166000908152600860205260409020600201555b505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526116cc908590611a01565b50505050565b60006001600160a01b0382166117195760405162461bcd60e51b8152600401808060200182810382526022815260200180611f106022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b61174a60068263ffffffff611bb916565b6040516001600160a01b038216907fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e90600090a250565b61179260068263ffffffff611c2016565b6040516001600160a01b038216907f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f890600090a250565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261166d908490611a01565b6001600160a01b0381166118605760405162461bcd60e51b8152600401808060200182810382526026815260200180611e886026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600554604080519182526020820183905280517f46711e222f558a07afd26e5e71b48ecb0a8b2cdcd40faeb1323e05e2c76a2f329281900390910190a1600491909155600555565b61190b610d77565b61195c576040805162461bcd60e51b815260206004820152601860248201527f54696d656443726f776473616c653a206e6f74206f70656e0000000000000000604482015290519081900360640190fd5b6114a58282611ca1565b60008261197557506000610d71565b8282028284828161198257fe5b04146111385760405162461bcd60e51b8152600401808060200182810382526021815260200180611ecf6021913960400191505060405180910390fd5b600061113883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611d38565b611a13826001600160a01b0316611dda565b611a64576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310611aa25780518252601f199092019160209182019101611a83565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611b04576040519150601f19603f3d011682016040523d82523d6000602084013e611b09565b606091505b509150915081611b60576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156116cc57808060200190516020811015611b7c57600080fd5b50516116cc5760405162461bcd60e51b815260040180806020018281038252602a815260200180611f5c602a913960400191505060405180910390fd5b611bc382826116d2565b611bfe5760405162461bcd60e51b8152600401808060200182810382526021815260200180611eae6021913960400191505060405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b611c2a82826116d2565b15611c7c576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6001600160a01b038216611ce65760405162461bcd60e51b815260040180806020018281038252602a815260200180611f32602a913960400191505060405180910390fd5b806114a5576040805162461bcd60e51b815260206004820152601960248201527f43726f776473616c653a20776569416d6f756e74206973203000000000000000604482015290519081900360640190fd5b60008183611dc45760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611d89578181015183820152602001611d71565b50505050905090810190601f168015611db65780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581611dd057fe5b0495945050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061150b575050151592915050565b604051806060016040528060006001600160a01b0316815260200160008152602001600081525090565b60405180604001604052806000815260200160008152509056fe506175736572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652050617573657220726f6c654f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572526f6c65733a206163636f756e7420697320746865207a65726f206164647265737343726f776473616c653a2062656e656669636961727920697320746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a265627a7a7231582086dc51629d1fd38ef7d7c98dc0fb923dd35c46f95e5e1a3832dbeb8d381449eb64736f6c63430005110032608060405260006100176001600160e01b0361007216565b600080546001600160a01b0383166001600160a01b0319909116811790915560408051918252519192507f4101e71e974f68df5e9730cc223280b41654676bbb052cdcc735c3337e64d2d9919081900360200190a150610076565b3390565b610636806100856000396000f3fe60806040526004361061003f5760003560e01c80632348238c14610041578063990dc9db14610074578063c6dbdf61146100ad578063f5537ede146100de575b005b34801561004d57600080fd5b5061003f6004803603602081101561006457600080fd5b50356001600160a01b0316610121565b34801561008057600080fd5b5061003f6004803603604081101561009757600080fd5b506001600160a01b038135169060200135610213565b3480156100b957600080fd5b506100c26102b4565b604080516001600160a01b039092168252519081900360200190f35b3480156100ea57600080fd5b5061003f6004803603606081101561010157600080fd5b506001600160a01b038135811691602081013590911690604001356102c3565b6000546001600160a01b0316610135610336565b6001600160a01b03161461017a5760405162461bcd60e51b815260040180806020018281038252602c8152602001806105ac602c913960400191505060405180910390fd5b6001600160a01b0381166101bf5760405162461bcd60e51b815260040180806020018281038252602a815260200180610582602a913960400191505060405180910390fd5b600080546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f4101e71e974f68df5e9730cc223280b41654676bbb052cdcc735c3337e64d2d99181900360200190a150565b6000546001600160a01b0316610227610336565b6001600160a01b03161461026c5760405162461bcd60e51b815260040180806020018281038252602c8152602001806105ac602c913960400191505060405180910390fd5b8047101561027957600080fd5b6040516001600160a01b0383169082156108fc029083906000818181858888f193505050501580156102af573d6000803e3d6000fd5b505050565b6000546001600160a01b031690565b6000546001600160a01b03166102d7610336565b6001600160a01b03161461031c5760405162461bcd60e51b815260040180806020018281038252602c8152602001806105ac602c913960400191505060405180910390fd5b6102af6001600160a01b038416838363ffffffff61033a16565b3390565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526102af908490610399826001600160a01b0316610545565b6103ea576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106104285780518252601f199092019160209182019101610409565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461048a576040519150601f19603f3d011682016040523d82523d6000602084013e61048f565b606091505b5091509150816104e6576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561053f5780806020019051602081101561050257600080fd5b505161053f5760405162461bcd60e51b815260040180806020018281038252602a8152602001806105d8602a913960400191505060405180910390fd5b50505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061057957508115155b94935050505056fe5365636f6e646172793a206e6577207072696d61727920697320746865207a65726f20616464726573735365636f6e646172793a2063616c6c6572206973206e6f7420746865207072696d617279206163636f756e745361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a265627a7a72315820ae4523c688ee7f9768409d7c472f5b73b873cd26cf4793aef5382f157752150664736f6c6343000511003254696d656443726f776473616c653a206f70656e696e672074696d65206973206265666f72652063757272656e742074696d6554696d656443726f776473616c653a206f70656e696e672074696d65206973206e6f74206265666f726520636c6f73696e672074696d6543726f776473616c653a20746f6b656e20697320746865207a65726f2061646472657373526f6c65733a206163636f756e7420697320746865207a65726f206164647265737300000000000000000000000071924a8d733ae1bbc18d243e1deb56e767440eb6
Deployed Bytecode
0x60806040526004361061019c5760003560e01c80635c975abb116100ec578063ae4c4b411161008a578063e93375f211610064578063e93375f2146105df578063f2fde38b14610622578063f7ccc18414610655578063fc0c546a146106855761019c565b8063ae4c4b4114610552578063b7a8807c1461058b578063d545782e146105a05761019c565b806382dc1ec4116100c657806382dc1ec41461048e5780638456cb59146104c15780639156fb05146104d6578063aab324ae1461050f5761019c565b80635c975abb1461044f5780636ef8d66d14610464578063715018a6146104795761019c565b80633ccfd60b1161015957806347535d7b1161013357806347535d7b1461038f5780634b6753bc146103a457806358ccd7f5146103b957806359753fb11461041c5761019c565b80633ccfd60b146103325780633f4ba83a1461034757806346fbf68e1461035c5761019c565b806302c7e7af146101df5780630560bd96146102065780630ba9d8ca1461024d5780631515bc2b146102995780631684c343146102ae57806330053620146102e9575b6007546040516001600160a01b0361010090920491909116903480156108fc02916000818181858888f193505050501580156101dc573d6000803e3d6000fd5b50005b3480156101eb57600080fd5b506101f46106b6565b60408051918252519081900360200190f35b34801561021257600080fd5b506102396004803603602081101561022957600080fd5b50356001600160a01b03166106bc565b604080519115158252519081900360200190f35b34801561025957600080fd5b506102806004803603602081101561027057600080fd5b50356001600160a01b03166106d9565b6040805192835260208301919091528051918290030190f35b3480156102a557600080fd5b50610239610748565b3480156102ba57600080fd5b506102e7600480360360408110156102d157600080fd5b50803590602001356001600160a01b0316610750565b005b3480156102f557600080fd5b506102396004803603608081101561030c57600080fd5b506001600160a01b0381358116916020810135821691604082013516906060013561098f565b34801561033e57600080fd5b506102396109fe565b34801561035357600080fd5b506102e7610c75565b34801561036857600080fd5b506102396004803603602081101561037f57600080fd5b50356001600160a01b0316610d5e565b34801561039b57600080fd5b50610239610d77565b3480156103b057600080fd5b506101f4610d92565b3480156103c557600080fd5b506103ec600480360360208110156103dc57600080fd5b50356001600160a01b0316610d98565b604080516001600160a01b0390951685526020850193909352838301919091526060830152519081900360800190f35b34801561042857600080fd5b506102396004803603602081101561043f57600080fd5b50356001600160a01b0316610e0c565b34801561045b57600080fd5b50610239610f20565b34801561047057600080fd5b506102e7610f29565b34801561048557600080fd5b506102e7610f3b565b34801561049a57600080fd5b506102e7600480360360208110156104b157600080fd5b50356001600160a01b0316610fcc565b3480156104cd57600080fd5b506102e761101e565b3480156104e257600080fd5b506101f4600480360360408110156104f957600080fd5b50803590602001356001600160a01b03166110e5565b34801561051b57600080fd5b506102396004803603606081101561053257600080fd5b506001600160a01b0381358116916020810135916040909101351661113f565b34801561055e57600080fd5b506102396004803603604081101561057557600080fd5b506001600160a01b0381351690602001356111ac565b34801561059757600080fd5b506101f4611271565b3480156105ac57600080fd5b50610239600480360360608110156105c357600080fd5b506001600160a01b038135169060208101359060400135611277565b3480156105eb57600080fd5b506102396004803603606081101561060257600080fd5b506001600160a01b038135811691602081013590911690604001356112ea565b34801561062e57600080fd5b506102e76004803603602081101561064557600080fd5b50356001600160a01b03166113b8565b34801561066157600080fd5b506102396004803603604081101561067857600080fd5b5080359060200135611408565b34801561069157600080fd5b5061069a611464565b604080516001600160a01b039092168252519081900360200190f35b60025490565b6001600160a01b0316600090815260036020526040902054151590565b6000806106e4611473565b610723576040805162461bcd60e51b81526020600482018190526024820152600080516020611ef0833981519152604482015290519081900360640190fd5b50506001600160a01b0316600090815260036020526040902080546001909101549091565b600554421190565b600054600160a01b900460ff166107ae576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6000805460ff60a01b191690556107c4816106bc565b61080d576040805162461bcd60e51b8152602060048201526015602482015274151bdad95b881a5cc81b9bdd081858d8d95c1d1959605a1b604482015290519081900360640190fd5b6000610817611497565b9050610823818461149b565b81600061083085836114a9565b60408051636eb1769f60e11b81526001600160a01b03868116600483015230602483015291519293509084169163dd62ed3e91604480820192602092909190829003018186803b15801561088357600080fd5b505afa158015610897573d6000803e3d6000fd5b505050506040513d60208110156108ad57600080fd5b50518511156108f8576040805162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742046756e647360701b604482015290519081900360640190fd5b6109028286611513565b600254610915908263ffffffff61154016565b600255610922838261159a565b60408051600081526020810183905281516001600160a01b0386169283927f6faf93231a456e552dbc9961f58d9713ee4f2e69d15f1975b050ef0911053a7b929081900390910190a361097583826115e9565b50506000805460ff60a01b1916600160a01b179055505050565b6000610999611473565b6109d8576040805162461bcd60e51b81526020600482018190526024820152600080516020611ef0833981519152604482015290519081900360640190fd5b6109f36001600160a01b03861685858563ffffffff61167216565b506001949350505050565b60075460009060ff1615610a4c576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b600054600160a01b900460ff16610aaa576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6000805460ff60a01b19169055610abf610748565b610b10576040805162461bcd60e51b815260206004820152601a60248201527f54696d656443726f776473616c653a206e6f7420636c6f736564000000000000604482015290519081900360640190fd5b600060086000610b1e611497565b6001600160a01b03166001600160a01b0316815260200190815260200160002090506000610b5d8260010154836002015461154090919063ffffffff16565b905060008111610ba4576040805162461bcd60e51b815260206004820152600d60248201526c4e6f7420617661696c61626c6560981b604482015290519081900360640190fd5b600060018301819055600283015560075461010090046001600160a01b031663f5537ede610bd0611464565b610bd8611497565b846040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015610c4157600080fd5b505af1158015610c55573d6000803e3d6000fd5b505050506001925050506000805460ff60a01b1916600160a01b17905590565b610c85610c80611497565b610d5e565b610cc05760405162461bcd60e51b8152600401808060200182810382526030815260200180611e586030913960400191505060405180910390fd5b60075460ff16610d0e576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6007805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa610d41611497565b604080516001600160a01b039092168252519081900360200190a1565b6000610d7160068363ffffffff6116d216565b92915050565b60006004544210158015610d8d57506005544211155b905090565b60055490565b600080600080610da6611e13565b506001600160a01b0380861660009081526008602090815260409182902082516060810184528154909416808552600182015492850183905260029091015492840183905291610dfc828263ffffffff61154016565b9450945094509450509193509193565b6000610e16611497565b6001600160a01b0316826001600160a01b03161415610e7c576040805162461bcd60e51b815260206004820152601f60248201527f596f752063616e206e6f7420626520796f7572206f776e2073706f6e736f7200604482015290519081900360640190fd5b600060086000610e8a611497565b6001600160a01b039081168252602082019290925260400160002080549092501615610efd576040805162461bcd60e51b815260206004820152601960248201527f596f7520616c72656164792068617320612073706f6e736f7200000000000000604482015290519081900360640190fd5b80546001600160a01b0384166001600160a01b0319909116179055506001919050565b60075460ff1690565b610f39610f34611497565b611739565b565b610f43611473565b610f82576040805162461bcd60e51b81526020600482018190526024820152600080516020611ef0833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b610fd7610c80611497565b6110125760405162461bcd60e51b8152600401808060200182810382526030815260200180611e586030913960400191505060405180910390fd5b61101b81611781565b50565b611029610c80611497565b6110645760405162461bcd60e51b8152600401808060200182810382526030815260200180611e586030913960400191505060405180910390fd5b60075460ff16156110af576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6007805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610d41611497565b60006110ef611473565b61112e576040805162461bcd60e51b81526020600482018190526024820152600080516020611ef0833981519152604482015290519081900360640190fd5b61113883836114a9565b9392505050565b6000611149611473565b611188576040805162461bcd60e51b81526020600482018190526024820152600080516020611ef0833981519152604482015290519081900360640190fd5b6111a26001600160a01b038516838563ffffffff6117c916565b5060019392505050565b60006111b6611473565b6111f5576040805162461bcd60e51b81526020600482018190526024820152600080516020611ef0833981519152604482015290519081900360640190fd5b6007546040805163990dc9db60e01b81526001600160a01b0386811660048301526024820186905291516101009093049091169163990dc9db9160448082019260009290919082900301818387803b15801561125057600080fd5b505af1158015611264573d6000803e3d6000fd5b5060019695505050505050565b60045490565b6000611281611473565b6112c0576040805162461bcd60e51b81526020600482018190526024820152600080516020611ef0833981519152604482015290519081900360640190fd5b506001600160a01b0392909216600090815260036020526040902090815560019081019190915590565b60006112f4611473565b611333576040805162461bcd60e51b81526020600482018190526024820152600080516020611ef0833981519152604482015290519081900360640190fd5b60075460408051637aa9bf6f60e11b81526001600160a01b03868116600483015287811660248301526044820186905291516101009093049091169163f5537ede9160648082019260009290919082900301818387803b15801561139657600080fd5b505af11580156113aa573d6000803e3d6000fd5b506001979650505050505050565b6113c0611473565b6113ff576040805162461bcd60e51b81526020600482018190526024820152600080516020611ef0833981519152604482015290519081900360640190fd5b61101b8161181b565b6000611412611473565b611451576040805162461bcd60e51b81526020600482018190526024820152600080516020611ef0833981519152604482015290519081900360640190fd5b61145b83836118bb565b50600192915050565b6001546001600160a01b031690565b600080546001600160a01b0316611488611497565b6001600160a01b031614905090565b3390565b6114a58282611903565b5050565b60006114b3611e3d565b506001600160a01b0382166000908152600360209081526040918290208251808401909352805480845260019091015491830182905261150b91906114ff90879063ffffffff61196616565b9063ffffffff6119bf16565b949350505050565b6114a561151e611497565b6007546001600160a01b0385811692916101009004168463ffffffff61167216565b600082820183811015611138576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b0382166000908152600860205260409020600101546115c6908263ffffffff61154016565b6001600160a01b0390921660009081526008602052604090206001019190915550565b6001600160a01b03808316600090815260086020526040902080549091161561166d5780546001600160a01b031660009081526008602052604090206002015461164f9061164360646114ff86600c63ffffffff61196616565b9063ffffffff61154016565b81546001600160a01b03166000908152600860205260409020600201555b505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526116cc908590611a01565b50505050565b60006001600160a01b0382166117195760405162461bcd60e51b8152600401808060200182810382526022815260200180611f106022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b61174a60068263ffffffff611bb916565b6040516001600160a01b038216907fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e90600090a250565b61179260068263ffffffff611c2016565b6040516001600160a01b038216907f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f890600090a250565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261166d908490611a01565b6001600160a01b0381166118605760405162461bcd60e51b8152600401808060200182810382526026815260200180611e886026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600554604080519182526020820183905280517f46711e222f558a07afd26e5e71b48ecb0a8b2cdcd40faeb1323e05e2c76a2f329281900390910190a1600491909155600555565b61190b610d77565b61195c576040805162461bcd60e51b815260206004820152601860248201527f54696d656443726f776473616c653a206e6f74206f70656e0000000000000000604482015290519081900360640190fd5b6114a58282611ca1565b60008261197557506000610d71565b8282028284828161198257fe5b04146111385760405162461bcd60e51b8152600401808060200182810382526021815260200180611ecf6021913960400191505060405180910390fd5b600061113883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611d38565b611a13826001600160a01b0316611dda565b611a64576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310611aa25780518252601f199092019160209182019101611a83565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611b04576040519150601f19603f3d011682016040523d82523d6000602084013e611b09565b606091505b509150915081611b60576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156116cc57808060200190516020811015611b7c57600080fd5b50516116cc5760405162461bcd60e51b815260040180806020018281038252602a815260200180611f5c602a913960400191505060405180910390fd5b611bc382826116d2565b611bfe5760405162461bcd60e51b8152600401808060200182810382526021815260200180611eae6021913960400191505060405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b611c2a82826116d2565b15611c7c576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6001600160a01b038216611ce65760405162461bcd60e51b815260040180806020018281038252602a815260200180611f32602a913960400191505060405180910390fd5b806114a5576040805162461bcd60e51b815260206004820152601960248201527f43726f776473616c653a20776569416d6f756e74206973203000000000000000604482015290519081900360640190fd5b60008183611dc45760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611d89578181015183820152602001611d71565b50505050905090810190601f168015611db65780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581611dd057fe5b0495945050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061150b575050151592915050565b604051806060016040528060006001600160a01b0316815260200160008152602001600081525090565b60405180604001604052806000815260200160008152509056fe506175736572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652050617573657220726f6c654f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572526f6c65733a206163636f756e7420697320746865207a65726f206164647265737343726f776473616c653a2062656e656669636961727920697320746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a265627a7a7231582086dc51629d1fd38ef7d7c98dc0fb923dd35c46f95e5e1a3832dbeb8d381449eb64736f6c63430005110032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000071924a8d733ae1bbc18d243e1deb56e767440eb6
-----Decoded View---------------
Arg [0] : token (address): 0x71924a8D733aE1bBC18d243e1deb56E767440eb6
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000071924a8d733ae1bbc18d243e1deb56e767440eb6
Deployed Bytecode Sourcemap
37791:5178:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41091:6;;41066:55;;-1:-1:-1;;;;;41091:6:0;;;;;;;;;41111:9;41066:55;;;;;;;;;41111:9;41091:6;41066:55;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41066:55:0;37791:5178;28233:77;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28233:77:0;;;:::i;:::-;;;;;;;;;;;;;;;;27380:116;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27380:116:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27380:116:0;-1:-1:-1;;;;;27380:116:0;;:::i;:::-;;;;;;;;;;;;;;;;;;27839:184;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27839:184:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27839:184:0;-1:-1:-1;;;;;27839:184:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;34718:159;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34718:159:0;;;:::i;28566:799::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28566:799:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28566:799:0;;;;;;-1:-1:-1;;;;;28566:799:0;;:::i;:::-;;40241:201;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40241:201:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;40241:201:0;;;;;;;;;;;;;;;;;;;;;;:::i;39133:453::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39133:453:0;;;:::i;15717:120::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15717:120:0;;;:::i;13286:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13286:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13286:109:0;-1:-1:-1;;;;;13286:109:0;;:::i;34356:192::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34356:192:0;;;:::i;34175:91::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34175:91:0;;;:::i;40569:400::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40569:400:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40569:400:0;-1:-1:-1;;;;;40569:400:0;;:::i;:::-;;;;-1:-1:-1;;;;;40569:400:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38734:329;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38734:329:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38734:329:0;-1:-1:-1;;;;;38734:329:0;;:::i;14924:78::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14924:78:0;;;:::i;13503:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13503:79:0;;;:::i;17532:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17532:140:0;;;:::i;13403:92::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13403:92:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13403:92:0;-1:-1:-1;;;;;13403:92:0;;:::i;15504:118::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15504:118:0;;;:::i;29373:160::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29373:160:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29373:160:0;;;;;;-1:-1:-1;;;;;29373:160:0;;:::i;42457:211::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42457:211:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;42457:211:0;;;;;;;;;;;;;;;;;:::i;40046:187::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40046:187:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;40046:187:0;;;;;;;;:::i;34014:91::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34014:91:0;;;:::i;27560:224::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27560:224:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;27560:224:0;;;;;;;;;;;;;:::i;39721:191::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39721:191:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;39721:191:0;;;;;;;;;;;;;;;;;:::i;17827:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17827:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17827:109:0;-1:-1:-1;;;;;17827:109:0;;:::i;38454:190::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38454:190:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38454:190:0;;;;;;;:::i;28087:78::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28087:78:0;;;:::i;:::-;;;;-1:-1:-1;;;;;28087:78:0;;;;;;;;;;;;;;28233:77;28297:5;;28233:77;:::o;27380:116::-;-1:-1:-1;;;;;27465:13:0;27441:4;27465:13;;;:6;:13;;;;;:18;:23;;;27380:116::o;27839:184::-;27899:7;27908;16931:9;:7;:9::i;:::-;16923:54;;;;;-1:-1:-1;;;16923:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16923:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;27950:13:0;;;;;:6;:13;;;;;:18;;27983:21;;;;;27950:18;;27839:184::o;34718:159::-;34857:12;;34839:15;:30;34718:159;:::o;28566:799::-;11399:11;;-1:-1:-1;;;11399:11:0;;;;11391:55;;;;;-1:-1:-1;;;11391:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11538:5;11524:19;;-1:-1:-1;;;;11524:19:0;;;28675:28;28691:11;28675:15;:28::i;:::-;28667:62;;;;;-1:-1:-1;;;28667:62:0;;;;;;;;;;;;-1:-1:-1;;;28667:62:0;;;;;;;;;;;;;;;28740:19;28762:12;:10;:12::i;:::-;28740:34;;28785:45;28806:11;28819:10;28785:20;:45::i;:::-;28870:11;28843:17;28918:40;28934:10;28870:11;28918:15;:40::i;:::-;28991:48;;;-1:-1:-1;;;28991:48:0;;-1:-1:-1;;;;;28991:48:0;;;;;;;29033:4;28991:48;;;;;;28893:65;;-1:-1:-1;28991:20:0;;;;;;:48;;;;;;;;;;;;;;;:20;:48;;;5:2:-1;;;;30:1;27;20:12;5:2;28991:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28991:48:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28991:48:0;28977:62;;;28969:93;;;;;-1:-1:-1;;;28969:93:0;;;;;;;;;;;;-1:-1:-1;;;28969:93:0;;;;;;;;;;;;;;;29075:42;29094:10;29106;29075:18;:42::i;:::-;29136:5;;:25;;29146:14;29136:25;:9;:25;:::i;:::-;29128:5;:33;29172:45;29189:11;29202:14;29172:16;:45::i;:::-;29233:60;;;29275:1;29233:60;;;;;;;;;;-1:-1:-1;;;;;29233:60:0;;;;;;;;;;;;;;;;29306:51;29329:11;29342:14;29306:22;:51::i;:::-;-1:-1:-1;;11704:11:0;:18;;-1:-1:-1;;;;11704:18:0;-1:-1:-1;;;11704:18:0;;;-1:-1:-1;;;28566:799:0:o;40241:201::-;40355:4;16931:9;:7;:9::i;:::-;16923:54;;;;;-1:-1:-1;;;16923:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16923:54:0;;;;;;;;;;;;;;;40372:40;-1:-1:-1;;;;;40372:22:0;;40395:4;40401:2;40405:6;40372:40;:22;:40;:::i;:::-;-1:-1:-1;40430:4:0;40241:201;;;;;;:::o;39133:453::-;15161:7;;39196:4;;15161:7;;15160:8;15152:37;;;;;-1:-1:-1;;;15152:37:0;;;;;;;;;;;;-1:-1:-1;;;15152:37:0;;;;;;;;;;;;;;;11399:11;;-1:-1:-1;;;11399:11:0;;;;11391:55;;;;;-1:-1:-1;;;11391:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11538:5;11524:19;;-1:-1:-1;;;;11524:19:0;;;39221:11;:9;:11::i;:::-;39213:50;;;;;-1:-1:-1;;;39213:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39274:17;39294:6;:20;39301:12;:10;:12::i;:::-;-1:-1:-1;;;;;39294:20:0;-1:-1:-1;;;;;39294:20:0;;;;;;;;;;;;39274:40;;39325:17;39345:36;39368:4;:12;;;39345:4;:18;;;:22;;:36;;;;:::i;:::-;39325:56;;39412:1;39400:9;:13;39392:39;;;;;-1:-1:-1;;;39392:39:0;;;;;;;;;;;;-1:-1:-1;;;39392:39:0;;;;;;;;;;;;;;;39457:1;39442:12;;;:16;;;39469:18;;;:22;39502:6;;;;;-1:-1:-1;;;;;39502:6:0;:20;39523:7;:5;:7::i;:::-;39532:12;:10;:12::i;:::-;39546:9;39502:54;;;;;;;;;;;;;-1:-1:-1;;;;;39502:54:0;-1:-1:-1;;;;;39502:54:0;;;;;;-1:-1:-1;;;;;39502:54:0;-1:-1:-1;;;;;39502:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39502:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39502:54:0;;;;39574:4;39567:11;;;;11704;:18;;-1:-1:-1;;;;11704:18:0;-1:-1:-1;;;11704:18:0;;;39133:453;:::o;15717:120::-;13183:22;13192:12;:10;:12::i;:::-;13183:8;:22::i;:::-;13175:83;;;;-1:-1:-1;;;13175:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15360:7;;;;15352:40;;;;;-1:-1:-1;;;15352:40:0;;;;;;;;;;;;-1:-1:-1;;;15352:40:0;;;;;;;;;;;;;;;15776:7;:15;;-1:-1:-1;;15776:15:0;;;15807:22;15816:12;:10;:12::i;:::-;15807:22;;;-1:-1:-1;;;;;15807:22:0;;;;;;;;;;;;;;15717:120::o;13286:109::-;13342:4;13366:21;:8;13379:7;13366:21;:12;:21;:::i;:::-;13359:28;13286:109;-1:-1:-1;;13286:109:0:o;34356:192::-;34395:4;34493:12;;34474:15;:31;;:66;;;;;34528:12;;34509:15;:31;;34474:66;34467:73;;34356:192;:::o;34175:91::-;34246:12;;34175:91;:::o;40569:400::-;40640:15;40666;40692:21;40724:17;40760:16;;:::i;:::-;-1:-1:-1;;;;;;40779:15:0;;;;;;;:6;:15;;;;;;;;;40760:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40914:36;40760:34;;40914:36;:16;:36;:::i;:::-;40805:156;;;;;;;;;40569:400;;;;;:::o;38734:329::-;38787:4;38823:12;:10;:12::i;:::-;-1:-1:-1;;;;;38812:23:0;:7;-1:-1:-1;;;;;38812:23:0;;;38804:67;;;;;-1:-1:-1;;;38804:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;38882:18;38903:6;:20;38910:12;:10;:12::i;:::-;-1:-1:-1;;;;;38903:20:0;;;;;;;;;;;;;;-1:-1:-1;38903:20:0;38942:13;;38903:20;;-1:-1:-1;38942:13:0;:27;38934:65;;;;;-1:-1:-1;;;38934:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39010:23;;-1:-1:-1;;;;;39010:23:0;;-1:-1:-1;;;;;;39010:23:0;;;;;;-1:-1:-1;39010:23:0;38734:329;;;:::o;14924:78::-;14987:7;;;;14924:78;:::o;13503:79::-;13547:27;13561:12;:10;:12::i;:::-;13547:13;:27::i;:::-;13503:79::o;17532:140::-;16931:9;:7;:9::i;:::-;16923:54;;;;;-1:-1:-1;;;16923:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16923:54:0;;;;;;;;;;;;;;;17631:1;17615:6;;17594:40;;-1:-1:-1;;;;;17615:6:0;;;;17594:40;;17631:1;;17594:40;17662:1;17645:19;;-1:-1:-1;;;;;;17645:19:0;;;17532:140::o;13403:92::-;13183:22;13192:12;:10;:12::i;13183:22::-;13175:83;;;;-1:-1:-1;;;13175:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13468:19;13479:7;13468:10;:19::i;:::-;13403:92;:::o;15504:118::-;13183:22;13192:12;:10;:12::i;13183:22::-;13175:83;;;;-1:-1:-1;;;13175:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15161:7;;;;15160:8;15152:37;;;;;-1:-1:-1;;;15152:37:0;;;;;;;;;;;;-1:-1:-1;;;15152:37:0;;;;;;;;;;;;;;;15564:7;:14;;-1:-1:-1;;15564:14:0;15574:4;15564:14;;;15594:20;15601:12;:10;:12::i;29373:160::-;29461:7;16931:9;:7;:9::i;:::-;16923:54;;;;;-1:-1:-1;;;16923:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16923:54:0;;;;;;;;;;;;;;;29488:37;29504:6;29512:12;29488:15;:37::i;:::-;29481:44;29373:160;-1:-1:-1;;;29373:160:0:o;42457:211::-;42574:12;16931:9;:7;:9::i;:::-;16923:54;;;;;-1:-1:-1;;;16923:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16923:54:0;;;;;;;;;;;;;;;42599:39;-1:-1:-1;;;;;42599:23:0;;42623:6;42631;42599:39;:23;:39;:::i;:::-;-1:-1:-1;42656:4:0;42457:211;;;;;:::o;40046:187::-;40151:4;16931:9;:7;:9::i;:::-;16923:54;;;;;-1:-1:-1;;;16923:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16923:54:0;;;;;;;;;;;;;;;40168:6;;:35;;;-1:-1:-1;;;40168:35:0;;-1:-1:-1;;;;;40168:35:0;;;;;;;;;;;;;;;:6;;;;;;;;:20;;:35;;;;;-1:-1:-1;;40168:35:0;;;;;;;;-1:-1:-1;40168:6:0;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;40168:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;40221:4:0;;40046:187;-1:-1:-1;;;;;;40046:187:0:o;34014:91::-;34085:12;;34014:91;:::o;27560:224::-;27668:4;16931:9;:7;:9::i;:::-;16923:54;;;;;-1:-1:-1;;;16923:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16923:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;;27685:13:0;;;;;;;;:6;:13;;;;;:26;;;27722:21;;;;:32;;;;:21;27560:224::o;39721:191::-;39823:4;16931:9;:7;:9::i;:::-;16923:54;;;;;-1:-1:-1;;;16923:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16923:54:0;;;;;;;;;;;;;;;39840:6;;:42;;;-1:-1:-1;;;39840:42:0;;-1:-1:-1;;;;;39840:42:0;;;;;;;;;;;;;;;;;;;;;;:6;;;;;;;;:20;;:42;;;;;-1:-1:-1;;39840:42:0;;;;;;;;-1:-1:-1;39840:6:0;:42;;;5:2:-1;;;;30:1;27;20:12;5:2;39840:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;39900:4:0;;39721:191;-1:-1:-1;;;;;;;39721:191:0:o;17827:109::-;16931:9;:7;:9::i;:::-;16923:54;;;;;-1:-1:-1;;;16923:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16923:54:0;;;;;;;;;;;;;;;17900:28;17919:8;17900:18;:28::i;38454:190::-;38560:4;16931:9;:7;:9::i;:::-;16923:54;;;;;-1:-1:-1;;;16923:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16923:54:0;;;;;;;;;;;;;;;38577:37;38589:11;38602;38577;:37::i;:::-;-1:-1:-1;38632:4:0;38454:190;;;;:::o;28087:78::-;28151:6;;-1:-1:-1;;;;;28151:6:0;28087:78;:::o;17085:96::-;17127:4;17167:6;;-1:-1:-1;;;;;17167:6:0;17151:12;:10;:12::i;:::-;-1:-1:-1;;;;;17151:22:0;;17144:29;;17085:96;:::o;12516:98::-;12596:10;12516:98;:::o;42227:222::-;42394:47;42421:11;42434:6;42394:26;:47::i;:::-;42227:222;;:::o;32353:260::-;32438:7;32458:24;;:::i;:::-;-1:-1:-1;;;;;;32485:19:0;;;;;;:6;:19;;;;;;;;;32458:46;;;;;;;;;;;;;;;;;;;;;;;;32522:83;;32458:46;32522:43;;:6;;:43;:24;:43;:::i;:::-;:61;:83;:61;:83;:::i;:::-;32515:90;32353:260;-1:-1:-1;;;;32353:260:0:o;42809:157::-;42892:66;42920:12;:10;:12::i;:::-;42942:6;;-1:-1:-1;;;;;42892:27:0;;;;:66;42942:6;;;;42951;42892:66;:27;:66;:::i;859:181::-;917:7;949:5;;;973:6;;;;965:46;;;;;-1:-1:-1;;;965:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;41345:170;-1:-1:-1;;;;;41463:19:0;;;;;;:6;:19;;;;;:27;;;:44;;41495:11;41463:44;:31;:44;:::i;:::-;-1:-1:-1;;;;;41433:19:0;;;;;;;:6;:19;;;;;:27;;:74;;;;-1:-1:-1;41345:170:0:o;41721:323::-;-1:-1:-1;;;;;41830:19:0;;;41810:17;41830:19;;;:6;:19;;;;;41864:12;;41830:19;;41864:12;:26;41860:177;;41997:12;;-1:-1:-1;;;;;41997:12:0;41990:20;;;;:6;:20;;;;;:34;;;41944:81;;:41;41981:3;41944:32;:6;41973:2;41944:32;:28;:32;:::i;:41::-;:45;:81;:45;:81;:::i;:::-;41914:12;;-1:-1:-1;;;;;41914:12:0;41907:20;;;;:6;:20;;;;;:34;;:118;41860:177;41721:323;;;:::o;19020:204::-;19147:68;;;-1:-1:-1;;;;;19147:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;19147:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;19121:95:0;;19140:5;;19121:18;:95::i;:::-;19020:204;;;;:::o;9239:203::-;9311:4;-1:-1:-1;;;;;9336:21:0;;9328:68;;;;-1:-1:-1;;;9328:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;9414:20:0;:11;:20;;;;;;;;;;;;;;;9239:203::o;13720:130::-;13780:24;:8;13796:7;13780:24;:15;:24;:::i;:::-;13820:22;;-1:-1:-1;;;;;13820:22:0;;;;;;;;13720:130;:::o;13590:122::-;13647:21;:8;13660:7;13647:21;:12;:21;:::i;:::-;13684:20;;-1:-1:-1;;;;;13684:20:0;;;;;;;;13590:122;:::o;18836:176::-;18945:58;;;-1:-1:-1;;;;;18945:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;18945:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;18919:85:0;;18938:5;;18919:18;:85::i;18042:229::-;-1:-1:-1;;;;;18116:22:0;;18108:73;;;;-1:-1:-1;;;18108:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18218:6;;;18197:38;;-1:-1:-1;;;;;18197:38:0;;;;18218:6;;;18197:38;;;18246:6;:17;;-1:-1:-1;;;;;;18246:17:0;-1:-1:-1;;;;;18246:17:0;;;;;;;;;;18042:229::o;35416:234::-;35533:12;;35510:52;;;;;;;;;;;;;;;;;;;;;;;;35573:12;:29;;;;35613:12;:29;35416:234::o;35077:176::-;33228:8;:6;:8::i;:::-;33220:45;;;;;-1:-1:-1;;;33220:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;35195:50;35222:11;35235:9;35195:26;:50::i;2231:471::-;2289:7;2534:6;2530:47;;-1:-1:-1;2564:1:0;2557:8;;2530:47;2601:5;;;2605:1;2601;:5;:1;2625:5;;;;;:10;2617:56;;;;-1:-1:-1;;;2617:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3170:132;3228:7;3255:39;3259:1;3262;3255:39;;;;;;;;;;;;;;;;;:3;:39::i;20875:1114::-;21479:27;21487:5;-1:-1:-1;;;;;21479:25:0;;:27::i;:::-;21471:71;;;;;-1:-1:-1;;;21471:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21616:12;21630:23;21665:5;-1:-1:-1;;;;;21657:19:0;21677:4;21657:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;21657:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;21615:67:0;;;;21701:7;21693:52;;;;;-1:-1:-1;;;21693:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21762:17;;:21;21758:224;;21904:10;21893:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21893:30:0;21885:85;;;;-1:-1:-1;;;21885:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8961:183;9041:18;9045:4;9051:7;9041:3;:18::i;:::-;9033:64;;;;-1:-1:-1;;;9033:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9108:20:0;9131:5;9108:20;;;;;;;;;;;:28;;-1:-1:-1;;9108:28:0;;;8961:183::o;8703:178::-;8781:18;8785:4;8791:7;8781:3;:18::i;:::-;8780:19;8772:63;;;;;-1:-1:-1;;;8772:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8846:20:0;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;8846:27:0;8869:4;8846:27;;;8703:178::o;30086:380::-;-1:-1:-1;;;;;30189:25:0;;30181:80;;;;-1:-1:-1;;;30181:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30280:14;30272:52;;;;;-1:-1:-1;;;30272:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;3832:345;3918:7;4020:12;4013:5;4005:28;;;;-1:-1:-1;;;4005:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;4005:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4044:9;4060:1;4056;:5;;;;;;;3832:345;-1:-1:-1;;;;;3832:345:0:o;6138:619::-;6198:4;6666:20;;6509:66;6706:23;;;;;;:42;;-1:-1:-1;;6733:15:0;;;6698:51;-1:-1:-1;;6138:619:0:o;37791:5178::-;;;;;;;;;;-1:-1:-1;;;;;37791:5178:0;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://ae4523c688ee7f9768409d7c472f5b73b873cd26cf4793aef5382f1577521506
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.