Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
Overview
Max Total Supply
671,400 8DAO
Holders
13
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
25,200 8DAOValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
EightDAOToken
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-11 */ // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ 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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, 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); } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, _allowances[owner][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = _allowances[owner][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Spend `amount` form the allowance of `owner` toward `spender`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // 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 (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @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) { return a + b; } /** * @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 a - b; } /** * @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) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting 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 a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting 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. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * 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, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: contracts/TestToken.sol pragma solidity ^0.8.0; pragma solidity ^0.8.0; contract EightDAOToken is ERC20, Ownable { using SafeMath for uint256; uint256 public startReleaseTime = 1678204800; struct Workflow { uint256[] releaseTimes; uint256 index; uint256 unlockPoint; } uint256 workflowNonce = 0; bool public lockEnable = true; mapping(uint256 => Workflow) private workflows; struct Task { uint256 releaseTime; } uint256 public maxSupply = 10000000 * 1e18; mapping(address => uint256[]) private walletWorkflows; mapping(address => uint256) public lockedAmount; event CreateTasks( uint256 workeflowId, uint256 releaseTime, uint256 unlockPoint ); event JoinWorkflow(address wallet, uint256 workeflowId, uint256 index); event LeaveWorkflow(address wallet, uint256 workeflowId, uint256 index); constructor() ERC20("8DAO TOKEN", "8DAO") {} function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); if (lockedAmount[owner] > 0) { checkTaskAndAdvanceTask(owner); require( canTransferAmount(owner) >= amount, "Transfer amount exceed the locked amount" ); } _transfer(owner, to, amount); return true; } function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); if (lockedAmount[from] > 0) { checkTaskAndAdvanceTask(from); require( canTransferAmount(from) >= amount, "Transfer amount exceed the locked amount" ); } _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } function walletInfo(address wallet) public view returns ( uint256, uint256, uint256, uint256, uint256[] memory ) { return ( balanceOf(wallet), canTransferAmount(wallet), releasedAmount(wallet), lockedAmount[wallet], _joinedWorkflows(wallet) ); } function canTransferAmount(address wallet) public view returns (uint256) { uint256 balance = balanceOf(wallet); if (lockEnable && lockedAmount[wallet] > 0) { uint256 unlockedAmount = releasedAmount(wallet); if (lockedAmount[wallet] >= unlockedAmount) { uint256 remainLockedAmount = lockedAmount[wallet].sub( unlockedAmount ); return remainLockedAmount >= balance ? 0 : balance.sub(remainLockedAmount); } } return balanceOf(wallet); } function _now() public view returns (uint256) { return block.timestamp; } function getWorkflow(uint256 workflowId) external view returns ( uint256[] memory, uint256, uint256 ) { return ( workflows[workflowId].releaseTimes, workflows[workflowId].index, workflows[workflowId].unlockPoint ); } function releasedAmount(address wallet) public view returns (uint256) { if (!lockEnable) { return lockedAmount[wallet]; } if (startReleaseTime > block.timestamp) { return 0; } if (walletWorkflows[wallet].length < 1) { return 0; } uint256 unlocked = 0; for (uint256 i = 0; i < walletWorkflows[wallet].length; i++) { uint256 workeflowId = walletWorkflows[wallet][i]; uint256 currentIndex = workflows[workeflowId].index; for ( uint256 index = workflows[workeflowId].index; index < workflows[workeflowId].releaseTimes.length; index++ ) { if ( index == workflows[workeflowId].releaseTimes.length - 1 || workflows[workeflowId].releaseTimes[index] > block.timestamp ) { currentIndex = (index > 0) ? index - 1 : 0; break; } } unlocked = unlocked.add( lockedAmount[wallet] .mul( (currentIndex + 1).mul( workflows[workeflowId].unlockPoint ) ) .div(100000) ); } return unlocked; } function _joinedWorkflows(address wallet) public view returns (uint256[] memory) { return walletWorkflows[wallet]; } function _setStartRelaseTime(uint256 _startTime) public onlyOwner { startReleaseTime = _startTime; } function _setWorkflowRole1( address[] memory wallets, uint256[] memory lockAmounts, uint256[] memory workeflowIds ) public onlyOwner { for (uint256 i = 0; i < wallets.length; i++) { address wallet = wallets[i]; if (lockedAmount[wallet] != lockAmounts[i]) { lockedAmount[wallet] = lockAmounts[i]; } if (walletWorkflows[wallet].length > 0) { delete walletWorkflows[wallet]; } for (uint256 j = 0; j < workeflowIds.length; j++) { require( workflows[workeflowIds[j]].releaseTimes.length > 0, "workflow not exist" ); walletWorkflows[wallet].push(workeflowIds[j]); } } } function _mintWithSetRole( address[] memory wallets, uint256[] memory lockAmounts, uint256[] memory workeflowIds ) public onlyOwner { for (uint256 i = 0; i < wallets.length; i++) { address wallet = wallets[i]; if (lockedAmount[wallet] != lockAmounts[i]) { lockedAmount[wallet] = lockAmounts[i]; } if (walletWorkflows[wallet].length > 0) { delete walletWorkflows[wallet]; } for (uint256 j = 0; j < workeflowIds.length; j++) { require( workflows[workeflowIds[j]].releaseTimes.length > 0, "workflow not exist" ); walletWorkflows[wallet].push(workeflowIds[j]); } mint(wallet, lockAmounts[i]); } } function _setWorkflowRole2( address[] memory wallets, uint256 lockAmount, uint256[] memory workeflowIds ) public onlyOwner { for (uint256 i = 0; i < wallets.length; i++) { address wallet = wallets[i]; if (lockedAmount[wallet] != lockAmount) { lockedAmount[wallet] = lockAmount; } if (walletWorkflows[wallet].length > 0) { delete walletWorkflows[wallet]; } for (uint256 j = 0; j < workeflowIds.length; j++) { require( workflows[workeflowIds[j]].releaseTimes.length > 0, "workflow not exist" ); walletWorkflows[wallet].push(workeflowIds[j]); } } } function _setLock(bool _lock) public onlyOwner { lockEnable = _lock; } function _unlock(address wallet) public onlyOwner { lockedAmount[wallet] = 0; } function _createWorkflow( uint256[] memory _releaseTimes, uint256 _unlockPoint ) public onlyOwner { workflows[workflowNonce].unlockPoint = _unlockPoint; for (uint256 i = 0; i < _releaseTimes.length; i++) { if (i > 0) { require(_releaseTimes[i] > _releaseTimes[i - 1]); } workflows[workflowNonce].releaseTimes.push(_releaseTimes[i]); emit CreateTasks(workflowNonce, _releaseTimes[i], _unlockPoint); } workflowNonce++; } function _deleteWorkflow(uint256 workflowId) public onlyOwner { delete workflows[workflowId]; } function mint(address _to, uint256 _amount) public onlyOwner returns (bool) { require(totalSupply() + _amount <= maxSupply); _mint(_to, _amount); return true; } function checkTaskAndAdvanceTask(address wallet) public { if (!lockEnable) { return; } if (startReleaseTime > block.timestamp) { return; } if (walletWorkflows[wallet].length <= 0) { return; } for (uint256 i = 0; i < walletWorkflows[wallet].length; i++) { uint256 workeflowId = walletWorkflows[wallet][i]; uint256 currentWorkflowIndex = workflows[workeflowId].index; for ( uint256 index = workflows[workeflowId].index; index < workflows[workeflowId].releaseTimes.length; index++ ) { if ( index == workflows[workeflowId].releaseTimes.length - 1 || workflows[workeflowId].releaseTimes[index] > block.timestamp ) { currentWorkflowIndex = (index > 0) ? index - 1 : 0; break; } } if (currentWorkflowIndex > workflows[workeflowId].index) { workflows[workeflowId].index = currentWorkflowIndex; } } return; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"workeflowId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"releaseTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unlockPoint","type":"uint256"}],"name":"CreateTasks","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"workeflowId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"JoinWorkflow","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"workeflowId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"LeaveWorkflow","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256[]","name":"_releaseTimes","type":"uint256[]"},{"internalType":"uint256","name":"_unlockPoint","type":"uint256"}],"name":"_createWorkflow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"workflowId","type":"uint256"}],"name":"_deleteWorkflow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"_joinedWorkflows","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"uint256[]","name":"lockAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"workeflowIds","type":"uint256[]"}],"name":"_mintWithSetRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_now","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_lock","type":"bool"}],"name":"_setLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"}],"name":"_setStartRelaseTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"uint256[]","name":"lockAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"workeflowIds","type":"uint256[]"}],"name":"_setWorkflowRole1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"uint256","name":"lockAmount","type":"uint256"},{"internalType":"uint256[]","name":"workeflowIds","type":"uint256[]"}],"name":"_setWorkflowRole2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"_unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"canTransferAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"checkTaskAndAdvanceTask","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"workflowId","type":"uint256"}],"name":"getWorkflow","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockEnable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lockedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"releasedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startReleaseTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"walletInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526364075f8060065560006007556008805460ff191660011790556a084595161401484a000000600a553480156200003a57600080fd5b50604080518082018252600a8152691c2220a7902a27a5a2a760b11b6020808301918252835180850190945260048452633844414f60e01b908401528151919291620000899160039162000118565b5080516200009f90600490602084019062000118565b505050620000bc620000b6620000c260201b60201c565b620000c6565b620001fb565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200012690620001be565b90600052602060002090601f0160209004810192826200014a576000855562000195565b82601f106200016557805160ff191683800117855562000195565b8280016001018555821562000195579182015b828111156200019557825182559160200191906001019062000178565b50620001a3929150620001a7565b5090565b5b80821115620001a35760008155600101620001a8565b600181811c90821680620001d357607f821691505b60208210811415620001f557634e487b7160e01b600052602260045260246000fd5b50919050565b61218d806200020b6000396000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c806395d89b411161011a578063afca5a12116100ad578063dd62ed3e1161007c578063dd62ed3e14610449578063e38b0dfe14610482578063eec7b03c146104a2578063f2fde38b146104c4578063f84c91ab146104d757600080fd5b8063afca5a1214610414578063b3bb8cd414610427578063d2ef4d481461042d578063d5abeb011461044057600080fd5b8063a3b77fbc116100e9578063a3b77fbc146103ce578063a457c2d7146103e1578063a9059cbb146103f4578063a92176be1461040757600080fd5b806395d89b411461038057806396d35a161461038857806398a2ba0a1461039b578063a153e708146103ae57600080fd5b8063395093511161019d5780635dae0b0a1161016c5780635dae0b0a146103185780636fcf06f11461032b57806370a0823114610334578063715018a61461035d5780638da5cb5b1461036557600080fd5b806339509351146102bb57806340c10f19146102ce578063500e68e9146102e157806352e53ce71461030557600080fd5b80631ade6619116101d95780631ade6619146102715780631cf1bb721461028657806323b872dd14610299578063313ce567146102ac57600080fd5b8063025f3d951461020b57806306fdde0314610231578063095ea7b31461024657806318160ddd14610269575b600080fd5b61021e610219366004611c41565b6104ea565b6040519081526020015b60405180910390f35b6102396105c9565b6040516102289190611ec6565b610259610254366004611ccb565b61065b565b6040519015158152602001610228565b60025461021e565b61028461027f366004611c41565b610673565b005b61021e610294366004611c41565b610807565b6102596102a7366004611c8f565b610a01565b60405160128152602001610228565b6102596102c9366004611ccb565b610a7c565b6102596102dc366004611ccb565b610abb565b6102f46102ef366004611c41565b610b1d565b604051610228959493929190611fc4565b610284610313366004611cf5565b610b8a565b610284610326366004611cf5565b610d95565b61021e60065481565b61021e610342366004611c41565b6001600160a01b031660009081526020819052604090205490565b610284610f76565b6005546040516001600160a01b039091168152602001610228565b610239610fac565b610284610396366004611e3a565b610fbb565b6102846103a9366004611e18565b610fea565b61021e6103bc366004611c41565b600c6020526000908152604090205481565b6102846103dc366004611e3a565b611027565b6102596103ef366004611ccb565b61107d565b610259610402366004611ccb565b61110f565b6008546102599060ff1681565b610284610422366004611dd3565b611163565b4261021e565b61028461043b366004611c41565b6112cd565b61021e600a5481565b61021e610457366004611c5c565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610495610490366004611c41565b611311565b6040516102289190611e8e565b6104b56104b0366004611e3a565b61137d565b60405161022893929190611ea1565b6102846104d2366004611c41565b6113f5565b6102846104e5366004611d7d565b611490565b6001600160a01b03811660009081526020819052604081205460085460ff16801561052c57506001600160a01b0383166000908152600c602052604090205415155b156105a857600061053c84610807565b6001600160a01b0385166000908152600c602052604090205490915081116105a6576001600160a01b0384166000908152600c6020526040812054610581908361163b565b90508281101561059a57610595838261163b565b61059d565b60005b95945050505050565b505b6001600160a01b0383166000908152602081905260409020545b9392505050565b6060600380546105d8906120bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610604906120bf565b80156106515780601f1061062657610100808354040283529160200191610651565b820191906000526020600020905b81548152906001019060200180831161063457829003601f168201915b5050505050905090565b600033610669818585611647565b5060019392505050565b60085460ff166106805750565b42600654111561068d5750565b6001600160a01b0381166000908152600b60205260409020546106ad5750565b60005b6001600160a01b0382166000908152600b6020526040902054811015610803576001600160a01b0382166000908152600b602052604081208054839081106106fa576106fa61212b565b60009182526020808320909101548083526009909152604090912060010154909150805b6000838152600960205260409020548110156107bf5760008381526009602052604090205461074f906001906120a8565b8114806107875750600083815260096020526040902080544291908390811061077a5761077a61212b565b9060005260206000200154115b156107ad576000811161079b5760006107a6565b6107a66001826120a8565b91506107bf565b806107b7816120fa565b91505061071e565b506000828152600960205260409020600101548111156107ee5760008281526009602052604090206001018190555b505080806107fb906120fa565b9150506106b0565b5050565b60085460009060ff1661083057506001600160a01b03166000908152600c602052604090205490565b42600654111561084257506000919050565b6001600160a01b0382166000908152600b60205260409020546001111561086b57506000919050565b6000805b6001600160a01b0384166000908152600b60205260409020548110156109fa576001600160a01b0384166000908152600b602052604081208054839081106108b9576108b961212b565b60009182526020808320909101548083526009909152604090912060010154909150805b60008381526009602052604090205481101561097e5760008381526009602052604090205461090e906001906120a8565b811480610946575060008381526009602052604090208054429190839081106109395761093961212b565b9060005260206000200154115b1561096c576000811161095a576000610965565b6109656001826120a8565b915061097e565b80610976816120fa565b9150506108dd565b506000828152600960205260409020600201546109e3906109dc90620186a0906109d6906109b7906109b187600161204f565b9061176b565b6001600160a01b038b166000908152600c60205260409020549061176b565b90611777565b8590611783565b9350505080806109f2906120fa565b91505061086f565b5092915050565b6001600160a01b0383166000908152600c6020526040812054339015610a5b57610a2a85610673565b82610a34866104ea565b1015610a5b5760405162461bcd60e51b8152600401610a5290611f7c565b60405180910390fd5b610a6685828561178f565b610a7185858561181b565b506001949350505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091906106699082908690610ab690879061204f565b611647565b6005546000906001600160a01b03163314610ae85760405162461bcd60e51b8152600401610a5290611f47565b600a5482610af560025490565b610aff919061204f565b1115610b0a57600080fd5b610b1483836119e9565b50600192915050565b6000806000806060610b44866001600160a01b031660009081526020819052604090205490565b610b4d876104ea565b610b5688610807565b6001600160a01b0389166000908152600c6020526040902054610b788a611311565b939a9299509097509550909350915050565b6005546001600160a01b03163314610bb45760405162461bcd60e51b8152600401610a5290611f47565b60005b8351811015610d8f576000848281518110610bd457610bd461212b565b60200260200101519050838281518110610bf057610bf061212b565b6020026020010151600c6000836001600160a01b03166001600160a01b031681526020019081526020016000205414610c5c57838281518110610c3557610c3561212b565b6020908102919091018101516001600160a01b0383166000908152600c9092526040909120555b6001600160a01b0381166000908152600b602052604090205415610c9b576001600160a01b0381166000908152600b60205260408120610c9b91611b1a565b60005b8351811015610d5657600060096000868481518110610cbf57610cbf61212b565b602002602001015181526020019081526020016000206000018054905011610cf95760405162461bcd60e51b8152600401610a5290611f1b565b6001600160a01b0382166000908152600b602052604090208451859083908110610d2557610d2561212b565b6020908102919091018101518254600181018455600093845291909220015580610d4e816120fa565b915050610c9e565b50610d7a81858481518110610d6d57610d6d61212b565b6020026020010151610abb565b50508080610d87906120fa565b915050610bb7565b50505050565b6005546001600160a01b03163314610dbf5760405162461bcd60e51b8152600401610a5290611f47565b60005b8351811015610d8f576000848281518110610ddf57610ddf61212b565b60200260200101519050838281518110610dfb57610dfb61212b565b6020026020010151600c6000836001600160a01b03166001600160a01b031681526020019081526020016000205414610e6757838281518110610e4057610e4061212b565b6020908102919091018101516001600160a01b0383166000908152600c9092526040909120555b6001600160a01b0381166000908152600b602052604090205415610ea6576001600160a01b0381166000908152600b60205260408120610ea691611b1a565b60005b8351811015610f6157600060096000868481518110610eca57610eca61212b565b602002602001015181526020019081526020016000206000018054905011610f045760405162461bcd60e51b8152600401610a5290611f1b565b6001600160a01b0382166000908152600b602052604090208451859083908110610f3057610f3061212b565b6020908102919091018101518254600181018455600093845291909220015580610f59816120fa565b915050610ea9565b50508080610f6e906120fa565b915050610dc2565b6005546001600160a01b03163314610fa05760405162461bcd60e51b8152600401610a5290611f47565b610faa6000611ac8565b565b6060600480546105d8906120bf565b6005546001600160a01b03163314610fe55760405162461bcd60e51b8152600401610a5290611f47565b600655565b6005546001600160a01b031633146110145760405162461bcd60e51b8152600401610a5290611f47565b6008805460ff1916911515919091179055565b6005546001600160a01b031633146110515760405162461bcd60e51b8152600401610a5290611f47565b60008181526009602052604081209061106a8282611b1a565b5060006001820181905560029091015550565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190838110156111025760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a52565b610a718286868403611647565b336000818152600c6020526040812054909190156111585761113081610673565b8261113a826104ea565b10156111585760405162461bcd60e51b8152600401610a5290611f7c565b61066981858561181b565b6005546001600160a01b0316331461118d5760405162461bcd60e51b8152600401610a5290611f47565b60075460009081526009602052604081206002018290555b82518110156112b35780156111fc57826111c06001836120a8565b815181106111d0576111d061212b565b60200260200101518382815181106111ea576111ea61212b565b6020026020010151116111fc57600080fd5b600754600090815260096020526040902083518490839081106112215761122161212b565b6020908102919091018101518254600181018455600093845291909220015560075483517f09c299dbbbb2b82211c7b619f1feb7f8d8851ade84657e189042ce850500697b919085908490811061127a5761127a61212b565b6020908102919091018101516040805193845291830152810184905260600160405180910390a1806112ab816120fa565b9150506111a5565b50600780549060006112c4836120fa565b91905055505050565b6005546001600160a01b031633146112f75760405162461bcd60e51b8152600401610a5290611f47565b6001600160a01b03166000908152600c6020526040812055565b6001600160a01b0381166000908152600b602090815260409182902080548351818402810184019094528084526060939283018282801561137157602002820191906000526020600020905b81548152602001906001019080831161135d575b50505050509050919050565b60008181526009602090815260408083206001810154600282015482548451818702810187019095528085526060969586959185918301828280156113e157602002820191906000526020600020905b8154815260200190600101908083116113cd575b505050505092509250925092509193909250565b6005546001600160a01b0316331461141f5760405162461bcd60e51b8152600401610a5290611f47565b6001600160a01b0381166114845760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a52565b61148d81611ac8565b50565b6005546001600160a01b031633146114ba5760405162461bcd60e51b8152600401610a5290611f47565b60005b8351811015610d8f5760008482815181106114da576114da61212b565b6020026020010151905083600c6000836001600160a01b03166001600160a01b03168152602001908152602001600020541461152c576001600160a01b0381166000908152600c602052604090208490555b6001600160a01b0381166000908152600b60205260409020541561156b576001600160a01b0381166000908152600b6020526040812061156b91611b1a565b60005b83518110156116265760006009600086848151811061158f5761158f61212b565b6020026020010151815260200190815260200160002060000180549050116115c95760405162461bcd60e51b8152600401610a5290611f1b565b6001600160a01b0382166000908152600b6020526040902084518590839081106115f5576115f561212b565b602090810291909101810151825460018101845560009384529190922001558061161e816120fa565b91505061156e565b50508080611633906120fa565b9150506114bd565b60006105c282846120a8565b6001600160a01b0383166116a95760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a52565b6001600160a01b03821661170a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a52565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006105c28284612089565b60006105c28284612067565b60006105c2828461204f565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114610d8f578181101561180e5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610a52565b610d8f8484848403611647565b6001600160a01b03831661187f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a52565b6001600160a01b0382166118e15760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a52565b6001600160a01b038316600090815260208190526040902054818110156119595760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610a52565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061199090849061204f565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516119dc91815260200190565b60405180910390a3610d8f565b6001600160a01b038216611a3f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610a52565b8060026000828254611a51919061204f565b90915550506001600160a01b03821660009081526020819052604081208054839290611a7e90849061204f565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b508054600082559060005260206000209081019061148d91905b80821115611b485760008155600101611b34565b5090565b80356001600160a01b0381168114611b6357600080fd5b919050565b600082601f830112611b7957600080fd5b81356020611b8e611b898361202b565b611ffa565b80838252828201915082860187848660051b8901011115611bae57600080fd5b60005b85811015611bd457611bc282611b4c565b84529284019290840190600101611bb1565b5090979650505050505050565b600082601f830112611bf257600080fd5b81356020611c02611b898361202b565b80838252828201915082860187848660051b8901011115611c2257600080fd5b60005b85811015611bd457813584529284019290840190600101611c25565b600060208284031215611c5357600080fd5b6105c282611b4c565b60008060408385031215611c6f57600080fd5b611c7883611b4c565b9150611c8660208401611b4c565b90509250929050565b600080600060608486031215611ca457600080fd5b611cad84611b4c565b9250611cbb60208501611b4c565b9150604084013590509250925092565b60008060408385031215611cde57600080fd5b611ce783611b4c565b946020939093013593505050565b600080600060608486031215611d0a57600080fd5b833567ffffffffffffffff80821115611d2257600080fd5b611d2e87838801611b68565b94506020860135915080821115611d4457600080fd5b611d5087838801611be1565b93506040860135915080821115611d6657600080fd5b50611d7386828701611be1565b9150509250925092565b600080600060608486031215611d9257600080fd5b833567ffffffffffffffff80821115611daa57600080fd5b611db687838801611b68565b9450602086013593506040860135915080821115611d6657600080fd5b60008060408385031215611de657600080fd5b823567ffffffffffffffff811115611dfd57600080fd5b611e0985828601611be1565b95602094909401359450505050565b600060208284031215611e2a57600080fd5b813580151581146105c257600080fd5b600060208284031215611e4c57600080fd5b5035919050565b600081518084526020808501945080840160005b83811015611e8357815187529582019590820190600101611e67565b509495945050505050565b6020815260006105c26020830184611e53565b606081526000611eb46060830186611e53565b60208301949094525060400152919050565b600060208083528351808285015260005b81811015611ef357858101830151858201604001528201611ed7565b81811115611f05576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252601290820152711ddbdc9ad99b1bddc81b9bdd08195e1a5cdd60721b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526028908201527f5472616e7366657220616d6f756e742065786365656420746865206c6f636b656040820152671908185b5bdd5b9d60c21b606082015260800190565b85815284602082015283604082015282606082015260a060808201526000611fef60a0830184611e53565b979650505050505050565b604051601f8201601f1916810167ffffffffffffffff8111828210171561202357612023612141565b604052919050565b600067ffffffffffffffff82111561204557612045612141565b5060051b60200190565b6000821982111561206257612062612115565b500190565b60008261208457634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156120a3576120a3612115565b500290565b6000828210156120ba576120ba612115565b500390565b600181811c908216806120d357607f821691505b602082108114156120f457634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561210e5761210e612115565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea26469706673582212204d119b3ea9a8b5ee3bf5de417ac2913abae2a05529fb6ee9fc0ec655e6977f7664736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102065760003560e01c806395d89b411161011a578063afca5a12116100ad578063dd62ed3e1161007c578063dd62ed3e14610449578063e38b0dfe14610482578063eec7b03c146104a2578063f2fde38b146104c4578063f84c91ab146104d757600080fd5b8063afca5a1214610414578063b3bb8cd414610427578063d2ef4d481461042d578063d5abeb011461044057600080fd5b8063a3b77fbc116100e9578063a3b77fbc146103ce578063a457c2d7146103e1578063a9059cbb146103f4578063a92176be1461040757600080fd5b806395d89b411461038057806396d35a161461038857806398a2ba0a1461039b578063a153e708146103ae57600080fd5b8063395093511161019d5780635dae0b0a1161016c5780635dae0b0a146103185780636fcf06f11461032b57806370a0823114610334578063715018a61461035d5780638da5cb5b1461036557600080fd5b806339509351146102bb57806340c10f19146102ce578063500e68e9146102e157806352e53ce71461030557600080fd5b80631ade6619116101d95780631ade6619146102715780631cf1bb721461028657806323b872dd14610299578063313ce567146102ac57600080fd5b8063025f3d951461020b57806306fdde0314610231578063095ea7b31461024657806318160ddd14610269575b600080fd5b61021e610219366004611c41565b6104ea565b6040519081526020015b60405180910390f35b6102396105c9565b6040516102289190611ec6565b610259610254366004611ccb565b61065b565b6040519015158152602001610228565b60025461021e565b61028461027f366004611c41565b610673565b005b61021e610294366004611c41565b610807565b6102596102a7366004611c8f565b610a01565b60405160128152602001610228565b6102596102c9366004611ccb565b610a7c565b6102596102dc366004611ccb565b610abb565b6102f46102ef366004611c41565b610b1d565b604051610228959493929190611fc4565b610284610313366004611cf5565b610b8a565b610284610326366004611cf5565b610d95565b61021e60065481565b61021e610342366004611c41565b6001600160a01b031660009081526020819052604090205490565b610284610f76565b6005546040516001600160a01b039091168152602001610228565b610239610fac565b610284610396366004611e3a565b610fbb565b6102846103a9366004611e18565b610fea565b61021e6103bc366004611c41565b600c6020526000908152604090205481565b6102846103dc366004611e3a565b611027565b6102596103ef366004611ccb565b61107d565b610259610402366004611ccb565b61110f565b6008546102599060ff1681565b610284610422366004611dd3565b611163565b4261021e565b61028461043b366004611c41565b6112cd565b61021e600a5481565b61021e610457366004611c5c565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610495610490366004611c41565b611311565b6040516102289190611e8e565b6104b56104b0366004611e3a565b61137d565b60405161022893929190611ea1565b6102846104d2366004611c41565b6113f5565b6102846104e5366004611d7d565b611490565b6001600160a01b03811660009081526020819052604081205460085460ff16801561052c57506001600160a01b0383166000908152600c602052604090205415155b156105a857600061053c84610807565b6001600160a01b0385166000908152600c602052604090205490915081116105a6576001600160a01b0384166000908152600c6020526040812054610581908361163b565b90508281101561059a57610595838261163b565b61059d565b60005b95945050505050565b505b6001600160a01b0383166000908152602081905260409020545b9392505050565b6060600380546105d8906120bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610604906120bf565b80156106515780601f1061062657610100808354040283529160200191610651565b820191906000526020600020905b81548152906001019060200180831161063457829003601f168201915b5050505050905090565b600033610669818585611647565b5060019392505050565b60085460ff166106805750565b42600654111561068d5750565b6001600160a01b0381166000908152600b60205260409020546106ad5750565b60005b6001600160a01b0382166000908152600b6020526040902054811015610803576001600160a01b0382166000908152600b602052604081208054839081106106fa576106fa61212b565b60009182526020808320909101548083526009909152604090912060010154909150805b6000838152600960205260409020548110156107bf5760008381526009602052604090205461074f906001906120a8565b8114806107875750600083815260096020526040902080544291908390811061077a5761077a61212b565b9060005260206000200154115b156107ad576000811161079b5760006107a6565b6107a66001826120a8565b91506107bf565b806107b7816120fa565b91505061071e565b506000828152600960205260409020600101548111156107ee5760008281526009602052604090206001018190555b505080806107fb906120fa565b9150506106b0565b5050565b60085460009060ff1661083057506001600160a01b03166000908152600c602052604090205490565b42600654111561084257506000919050565b6001600160a01b0382166000908152600b60205260409020546001111561086b57506000919050565b6000805b6001600160a01b0384166000908152600b60205260409020548110156109fa576001600160a01b0384166000908152600b602052604081208054839081106108b9576108b961212b565b60009182526020808320909101548083526009909152604090912060010154909150805b60008381526009602052604090205481101561097e5760008381526009602052604090205461090e906001906120a8565b811480610946575060008381526009602052604090208054429190839081106109395761093961212b565b9060005260206000200154115b1561096c576000811161095a576000610965565b6109656001826120a8565b915061097e565b80610976816120fa565b9150506108dd565b506000828152600960205260409020600201546109e3906109dc90620186a0906109d6906109b7906109b187600161204f565b9061176b565b6001600160a01b038b166000908152600c60205260409020549061176b565b90611777565b8590611783565b9350505080806109f2906120fa565b91505061086f565b5092915050565b6001600160a01b0383166000908152600c6020526040812054339015610a5b57610a2a85610673565b82610a34866104ea565b1015610a5b5760405162461bcd60e51b8152600401610a5290611f7c565b60405180910390fd5b610a6685828561178f565b610a7185858561181b565b506001949350505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091906106699082908690610ab690879061204f565b611647565b6005546000906001600160a01b03163314610ae85760405162461bcd60e51b8152600401610a5290611f47565b600a5482610af560025490565b610aff919061204f565b1115610b0a57600080fd5b610b1483836119e9565b50600192915050565b6000806000806060610b44866001600160a01b031660009081526020819052604090205490565b610b4d876104ea565b610b5688610807565b6001600160a01b0389166000908152600c6020526040902054610b788a611311565b939a9299509097509550909350915050565b6005546001600160a01b03163314610bb45760405162461bcd60e51b8152600401610a5290611f47565b60005b8351811015610d8f576000848281518110610bd457610bd461212b565b60200260200101519050838281518110610bf057610bf061212b565b6020026020010151600c6000836001600160a01b03166001600160a01b031681526020019081526020016000205414610c5c57838281518110610c3557610c3561212b565b6020908102919091018101516001600160a01b0383166000908152600c9092526040909120555b6001600160a01b0381166000908152600b602052604090205415610c9b576001600160a01b0381166000908152600b60205260408120610c9b91611b1a565b60005b8351811015610d5657600060096000868481518110610cbf57610cbf61212b565b602002602001015181526020019081526020016000206000018054905011610cf95760405162461bcd60e51b8152600401610a5290611f1b565b6001600160a01b0382166000908152600b602052604090208451859083908110610d2557610d2561212b565b6020908102919091018101518254600181018455600093845291909220015580610d4e816120fa565b915050610c9e565b50610d7a81858481518110610d6d57610d6d61212b565b6020026020010151610abb565b50508080610d87906120fa565b915050610bb7565b50505050565b6005546001600160a01b03163314610dbf5760405162461bcd60e51b8152600401610a5290611f47565b60005b8351811015610d8f576000848281518110610ddf57610ddf61212b565b60200260200101519050838281518110610dfb57610dfb61212b565b6020026020010151600c6000836001600160a01b03166001600160a01b031681526020019081526020016000205414610e6757838281518110610e4057610e4061212b565b6020908102919091018101516001600160a01b0383166000908152600c9092526040909120555b6001600160a01b0381166000908152600b602052604090205415610ea6576001600160a01b0381166000908152600b60205260408120610ea691611b1a565b60005b8351811015610f6157600060096000868481518110610eca57610eca61212b565b602002602001015181526020019081526020016000206000018054905011610f045760405162461bcd60e51b8152600401610a5290611f1b565b6001600160a01b0382166000908152600b602052604090208451859083908110610f3057610f3061212b565b6020908102919091018101518254600181018455600093845291909220015580610f59816120fa565b915050610ea9565b50508080610f6e906120fa565b915050610dc2565b6005546001600160a01b03163314610fa05760405162461bcd60e51b8152600401610a5290611f47565b610faa6000611ac8565b565b6060600480546105d8906120bf565b6005546001600160a01b03163314610fe55760405162461bcd60e51b8152600401610a5290611f47565b600655565b6005546001600160a01b031633146110145760405162461bcd60e51b8152600401610a5290611f47565b6008805460ff1916911515919091179055565b6005546001600160a01b031633146110515760405162461bcd60e51b8152600401610a5290611f47565b60008181526009602052604081209061106a8282611b1a565b5060006001820181905560029091015550565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190838110156111025760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a52565b610a718286868403611647565b336000818152600c6020526040812054909190156111585761113081610673565b8261113a826104ea565b10156111585760405162461bcd60e51b8152600401610a5290611f7c565b61066981858561181b565b6005546001600160a01b0316331461118d5760405162461bcd60e51b8152600401610a5290611f47565b60075460009081526009602052604081206002018290555b82518110156112b35780156111fc57826111c06001836120a8565b815181106111d0576111d061212b565b60200260200101518382815181106111ea576111ea61212b565b6020026020010151116111fc57600080fd5b600754600090815260096020526040902083518490839081106112215761122161212b565b6020908102919091018101518254600181018455600093845291909220015560075483517f09c299dbbbb2b82211c7b619f1feb7f8d8851ade84657e189042ce850500697b919085908490811061127a5761127a61212b565b6020908102919091018101516040805193845291830152810184905260600160405180910390a1806112ab816120fa565b9150506111a5565b50600780549060006112c4836120fa565b91905055505050565b6005546001600160a01b031633146112f75760405162461bcd60e51b8152600401610a5290611f47565b6001600160a01b03166000908152600c6020526040812055565b6001600160a01b0381166000908152600b602090815260409182902080548351818402810184019094528084526060939283018282801561137157602002820191906000526020600020905b81548152602001906001019080831161135d575b50505050509050919050565b60008181526009602090815260408083206001810154600282015482548451818702810187019095528085526060969586959185918301828280156113e157602002820191906000526020600020905b8154815260200190600101908083116113cd575b505050505092509250925092509193909250565b6005546001600160a01b0316331461141f5760405162461bcd60e51b8152600401610a5290611f47565b6001600160a01b0381166114845760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a52565b61148d81611ac8565b50565b6005546001600160a01b031633146114ba5760405162461bcd60e51b8152600401610a5290611f47565b60005b8351811015610d8f5760008482815181106114da576114da61212b565b6020026020010151905083600c6000836001600160a01b03166001600160a01b03168152602001908152602001600020541461152c576001600160a01b0381166000908152600c602052604090208490555b6001600160a01b0381166000908152600b60205260409020541561156b576001600160a01b0381166000908152600b6020526040812061156b91611b1a565b60005b83518110156116265760006009600086848151811061158f5761158f61212b565b6020026020010151815260200190815260200160002060000180549050116115c95760405162461bcd60e51b8152600401610a5290611f1b565b6001600160a01b0382166000908152600b6020526040902084518590839081106115f5576115f561212b565b602090810291909101810151825460018101845560009384529190922001558061161e816120fa565b91505061156e565b50508080611633906120fa565b9150506114bd565b60006105c282846120a8565b6001600160a01b0383166116a95760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a52565b6001600160a01b03821661170a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a52565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006105c28284612089565b60006105c28284612067565b60006105c2828461204f565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114610d8f578181101561180e5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610a52565b610d8f8484848403611647565b6001600160a01b03831661187f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a52565b6001600160a01b0382166118e15760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a52565b6001600160a01b038316600090815260208190526040902054818110156119595760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610a52565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061199090849061204f565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516119dc91815260200190565b60405180910390a3610d8f565b6001600160a01b038216611a3f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610a52565b8060026000828254611a51919061204f565b90915550506001600160a01b03821660009081526020819052604081208054839290611a7e90849061204f565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b508054600082559060005260206000209081019061148d91905b80821115611b485760008155600101611b34565b5090565b80356001600160a01b0381168114611b6357600080fd5b919050565b600082601f830112611b7957600080fd5b81356020611b8e611b898361202b565b611ffa565b80838252828201915082860187848660051b8901011115611bae57600080fd5b60005b85811015611bd457611bc282611b4c565b84529284019290840190600101611bb1565b5090979650505050505050565b600082601f830112611bf257600080fd5b81356020611c02611b898361202b565b80838252828201915082860187848660051b8901011115611c2257600080fd5b60005b85811015611bd457813584529284019290840190600101611c25565b600060208284031215611c5357600080fd5b6105c282611b4c565b60008060408385031215611c6f57600080fd5b611c7883611b4c565b9150611c8660208401611b4c565b90509250929050565b600080600060608486031215611ca457600080fd5b611cad84611b4c565b9250611cbb60208501611b4c565b9150604084013590509250925092565b60008060408385031215611cde57600080fd5b611ce783611b4c565b946020939093013593505050565b600080600060608486031215611d0a57600080fd5b833567ffffffffffffffff80821115611d2257600080fd5b611d2e87838801611b68565b94506020860135915080821115611d4457600080fd5b611d5087838801611be1565b93506040860135915080821115611d6657600080fd5b50611d7386828701611be1565b9150509250925092565b600080600060608486031215611d9257600080fd5b833567ffffffffffffffff80821115611daa57600080fd5b611db687838801611b68565b9450602086013593506040860135915080821115611d6657600080fd5b60008060408385031215611de657600080fd5b823567ffffffffffffffff811115611dfd57600080fd5b611e0985828601611be1565b95602094909401359450505050565b600060208284031215611e2a57600080fd5b813580151581146105c257600080fd5b600060208284031215611e4c57600080fd5b5035919050565b600081518084526020808501945080840160005b83811015611e8357815187529582019590820190600101611e67565b509495945050505050565b6020815260006105c26020830184611e53565b606081526000611eb46060830186611e53565b60208301949094525060400152919050565b600060208083528351808285015260005b81811015611ef357858101830151858201604001528201611ed7565b81811115611f05576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252601290820152711ddbdc9ad99b1bddc81b9bdd08195e1a5cdd60721b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526028908201527f5472616e7366657220616d6f756e742065786365656420746865206c6f636b656040820152671908185b5bdd5b9d60c21b606082015260800190565b85815284602082015283604082015282606082015260a060808201526000611fef60a0830184611e53565b979650505050505050565b604051601f8201601f1916810167ffffffffffffffff8111828210171561202357612023612141565b604052919050565b600067ffffffffffffffff82111561204557612045612141565b5060051b60200190565b6000821982111561206257612062612115565b500190565b60008261208457634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156120a3576120a3612115565b500290565b6000828210156120ba576120ba612115565b500390565b600181811c908216806120d357607f821691505b602082108114156120f457634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561210e5761210e612115565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea26469706673582212204d119b3ea9a8b5ee3bf5de417ac2913abae2a05529fb6ee9fc0ec655e6977f7664736f6c63430008070033
Deployed Bytecode Sourcemap
27112:10164:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29522:656;;;;;;:::i;:::-;;:::i;:::-;;;11915:25:1;;;11903:2;11888:18;29522:656:0;;;;;;;;6674:100;;;:::i;:::-;;;;;;;:::i;9025:201::-;;;;;;:::i;:::-;;:::i;:::-;;;6467:14:1;;6460:22;6442:41;;6430:2;6415:18;9025:201:0;6302:187:1;7794:108:0;7882:12;;7794:108;;36051:1222;;;;;;:::i;:::-;;:::i;:::-;;30647:1441;;;;;;:::i;:::-;;:::i;28526:541::-;;;;;;:::i;:::-;;:::i;7636:93::-;;;7719:2;12970:36:1;;12958:2;12943:18;7636:93:0;12828:184:1;10510:240:0;;;;;;:::i;:::-;;:::i;35819:224::-;;;;;;:::i;:::-;;:::i;29075:439::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;33234:880::-;;;;;;:::i;:::-;;:::i;32388:838::-;;;;;;:::i;:::-;;:::i;27195:44::-;;;;;;7965:127;;;;;;:::i;:::-;-1:-1:-1;;;;;8066:18:0;8039:7;8066:18;;;;;;;;;;;;7965:127;19178:103;;;:::i;18527:87::-;18600:6;;18527:87;;-1:-1:-1;;;;;18600:6:0;;;5566:51:1;;5554:2;5539:18;18527:87:0;5420:203:1;6893:104:0;;;:::i;32266:114::-;;;;;;:::i;:::-;;:::i;34950:84::-;;;;;;:::i;:::-;;:::i;27649:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;35702:109;;;;;;:::i;:::-;;:::i;11253:438::-;;;;;;:::i;:::-;;:::i;28035:483::-;;;;;;:::i;:::-;;:::i;27395:29::-;;;;;;;;;35143:551;;;;;;:::i;:::-;;:::i;30186:87::-;30250:15;30186:87;;35042:93;;;;;;:::i;:::-;;:::i;27540:42::-;;;;;;8554:151;;;;;;:::i;:::-;-1:-1:-1;;;;;8670:18:0;;;8643:7;8670:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;8554:151;32096:162;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;30281:358::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;19436:201::-;;;;;;:::i;:::-;;:::i;34122:820::-;;;;;;:::i;:::-;;:::i;29522:656::-;-1:-1:-1;;;;;8066:18:0;;29586:7;8066:18;;;;;;;;;;;29656:10;;;;:38;;;;-1:-1:-1;;;;;;29670:20:0;;29693:1;29670:20;;;:12;:20;;;;;;:24;;29656:38;29652:484;;;29711:22;29736;29751:6;29736:14;:22::i;:::-;-1:-1:-1;;;;;29777:20:0;;;;;;:12;:20;;;;;;29711:47;;-1:-1:-1;29777:38:0;-1:-1:-1;29773:352:0;;-1:-1:-1;;;;;29865:20:0;;29836:26;29865:20;;;:12;:20;;;;;;:80;;29912:14;29865:24;:80::i;:::-;29836:109;;30014:7;29992:18;:29;;:117;;30078:31;:7;30090:18;30078:11;:31::i;:::-;29992:117;;;30049:1;29992:117;29964:145;29522:656;-1:-1:-1;;;;;29522:656:0:o;29773:352::-;29696:440;29652:484;-1:-1:-1;;;;;8066:18:0;;8039:7;8066:18;;;;;;;;;;;30153:17;30146:24;29522:656;-1:-1:-1;;;29522:656:0:o;6674:100::-;6728:13;6761:5;6754:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6674:100;:::o;9025:201::-;9108:4;4398:10;9164:32;4398:10;9180:7;9189:6;9164:8;:32::i;:::-;-1:-1:-1;9214:4:0;;9025:201;-1:-1:-1;;;9025:201:0:o;36051:1222::-;36123:10;;;;36118:50;;36051:1222;:::o;36118:50::-;36201:15;36182:16;;:34;36178:73;;;36051:1222;:::o;36178:73::-;-1:-1:-1;;;;;36265:23:0;;36299:1;36265:23;;;:15;:23;;;;;:30;36261:74;;36051:1222;:::o;36261:74::-;36352:9;36347:902;-1:-1:-1;;;;;36371:23:0;;;;;;:15;:23;;;;;:30;36367:34;;36347:902;;;-1:-1:-1;;;;;36445:23:0;;36423:19;36445:23;;;:15;:23;;;;;:26;;36469:1;;36445:26;;;;;;:::i;:::-;;;;;;;;;;;;;36517:22;;;:9;:22;;;;;;;:28;;;36445:26;;-1:-1:-1;36517:28:0;36562:519;36656:22;;;;:9;:22;;;;;:42;36648:50;;36562:519;;;36794:22;;;;:9;:22;;;;;:42;:46;;36839:1;;36794:46;:::i;:::-;36785:5;:55;:140;;;-1:-1:-1;36865:22:0;;;;:9;:22;;;;;:42;;36910:15;;36865:22;36901:5;;36865:42;;;;;;:::i;:::-;;;;;;;;;:60;36785:140;36759:307;;;37000:1;36992:5;:9;36991:27;;37017:1;36991:27;;;37005:9;37013:1;37005:5;:9;:::i;:::-;36968:50;;37041:5;;36759:307;36717:7;;;;:::i;:::-;;;;36562:519;;;-1:-1:-1;37122:22:0;;;;:9;:22;;;;;:28;;;37099:51;;37095:143;;;37171:22;;;;:9;:22;;;;;:28;;:51;;;37095:143;36408:841;;36403:3;;;;;:::i;:::-;;;;36347:902;;;;36051:1222;:::o;30647:1441::-;30733:10;;30708:7;;30733:10;;30728:71;;-1:-1:-1;;;;;;30767:20:0;;;;;:12;:20;;;;;;;30647:1441::o;30728:71::-;30832:15;30813:16;;:34;30809:75;;;-1:-1:-1;30871:1:0;;30647:1441;-1:-1:-1;30647:1441:0:o;30809:75::-;-1:-1:-1;;;;;30898:23:0;;;;;;:15;:23;;;;;:30;30931:1;-1:-1:-1;30894:75:0;;;-1:-1:-1;30956:1:0;;30647:1441;-1:-1:-1;30647:1441:0:o;30894:75::-;30979:16;31015:9;31010:1045;-1:-1:-1;;;;;31034:23:0;;;;;;:15;:23;;;;;:30;31030:34;;31010:1045;;;-1:-1:-1;;;;;31108:23:0;;31086:19;31108:23;;;:15;:23;;;;;:26;;31132:1;;31108:26;;;;;;:::i;:::-;;;;;;;;;;;;;31172:22;;;:9;:22;;;;;;;:28;;;31108:26;;-1:-1:-1;31172:28:0;31217:511;31311:22;;;;:9;:22;;;;;:42;31303:50;;31217:511;;;31449:22;;;;:9;:22;;;;;:42;:46;;31494:1;;31449:46;:::i;:::-;31440:5;:55;:140;;;-1:-1:-1;31520:22:0;;;;:9;:22;;;;;:42;;31565:15;;31520:22;31556:5;;31520:42;;;;;;:::i;:::-;;;;;;;;;:60;31440:140;31414:299;;;31647:1;31639:5;:9;31638:27;;31664:1;31638:27;;;31652:9;31660:1;31652:5;:9;:::i;:::-;31623:42;;31688:5;;31414:299;31372:7;;;;:::i;:::-;;;;31217:511;;;-1:-1:-1;31910:22:0;;;;:9;:22;;;;;:34;;;31753:290;;31784:244;;32021:6;;31784:210;;31857:114;;31858:16;:12;31873:1;31858:16;:::i;:::-;31857:22;;:114::i;:::-;-1:-1:-1;;;;;31784:20:0;;;;;;:12;:20;;;;;;;:46;:210::i;:::-;:236;;:244::i;:::-;31753:8;;:12;:290::i;:::-;31742:301;;31071:984;;31066:3;;;;;:::i;:::-;;;;31010:1045;;;-1:-1:-1;32072:8:0;30647:1441;-1:-1:-1;;30647:1441:0:o;28526:541::-;-1:-1:-1;;;;;28719:18:0;;28657:4;28719:18;;;:12;:18;;;;;;4398:10;;28719:22;28715:236;;28758:29;28782:4;28758:23;:29::i;:::-;28857:6;28830:23;28848:4;28830:17;:23::i;:::-;:33;;28804:135;;;;-1:-1:-1;;;28804:135:0;;;;;;;:::i;:::-;;;;;;;;;28961:38;28977:4;28983:7;28992:6;28961:15;:38::i;:::-;29010:27;29020:4;29026:2;29030:6;29010:9;:27::i;:::-;-1:-1:-1;29055:4:0;;28526:541;-1:-1:-1;;;;28526:541:0:o;10510:240::-;4398:10;10598:4;10679:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;10679:27:0;;;;;;;;;;10598:4;;4398:10;10654:66;;4398:10;;10679:27;;:40;;10709:10;;10679:40;:::i;:::-;10654:8;:66::i;35819:224::-;18600:6;;35916:4;;-1:-1:-1;;;;;18600:6:0;4398:10;18747:23;18739:68;;;;-1:-1:-1;;;18739:68:0;;;;;;;:::i;:::-;35973:9:::1;;35962:7;35946:13;7882:12:::0;;;7794:108;35946:13:::1;:23;;;;:::i;:::-;:36;;35938:45;;;::::0;::::1;;35994:19;36000:3;36005:7;35994:5;:19::i;:::-;-1:-1:-1::0;36031:4:0::1;35819:224:::0;;;;:::o;29075:439::-;29173:7;29195;29217;29239;29261:16;29327:17;29337:6;-1:-1:-1;;;;;8066:18:0;8039:7;8066:18;;;;;;;;;;;;7965:127;29327:17;29359:25;29377:6;29359:17;:25::i;:::-;29399:22;29414:6;29399:14;:22::i;:::-;-1:-1:-1;;;;;29436:20:0;;;;;;:12;:20;;;;;;29471:24;29449:6;29471:16;:24::i;:::-;29305:201;;;;-1:-1:-1;29305:201:0;;-1:-1:-1;29305:201:0;-1:-1:-1;29305:201:0;;-1:-1:-1;29075:439:0;-1:-1:-1;;29075:439:0:o;33234:880::-;18600:6;;-1:-1:-1;;;;;18600:6:0;4398:10;18747:23;18739:68;;;;-1:-1:-1;;;18739:68:0;;;;;;;:::i;:::-;33414:9:::1;33409:698;33433:7;:14;33429:1;:18;33409:698;;;33469:14;33486:7;33494:1;33486:10;;;;;;;;:::i;:::-;;;;;;;33469:27;;33539:11;33551:1;33539:14;;;;;;;;:::i;:::-;;;;;;;33515:12;:20;33528:6;-1:-1:-1::0;;;;;33515:20:0::1;-1:-1:-1::0;;;;;33515:20:0::1;;;;;;;;;;;;;:38;33511:116;;33597:11;33609:1;33597:14;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;33574:20:0;::::1;;::::0;;;:12:::1;:20:::0;;;;;;;:37;33511:116:::1;-1:-1:-1::0;;;;;33645:23:0;::::1;33678:1;33645:23:::0;;;:15:::1;:23;::::0;;;;:30;:34;33641:105:::1;;-1:-1:-1::0;;;;;33707:23:0;::::1;;::::0;;;:15:::1;:23;::::0;;;;33700:30:::1;::::0;::::1;:::i;:::-;33765:9;33760:293;33784:12;:19;33780:1;:23;33760:293;;;33908:1;33859:9;:26;33869:12;33882:1;33869:15;;;;;;;;:::i;:::-;;;;;;;33859:26;;;;;;;;;;;:39;;:46;;;;:50;33829:142;;;;-1:-1:-1::0;;;33829:142:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;33992:23:0;::::1;;::::0;;;:15:::1;:23;::::0;;;;34021:15;;:12;;34034:1;;34021:15;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;33992:45;;::::1;::::0;::::1;::::0;;-1:-1:-1;33992:45:0;;;;;;;::::1;::::0;33805:3;::::1;::::0;::::1;:::i;:::-;;;;33760:293;;;;34067:28;34072:6;34080:11;34092:1;34080:14;;;;;;;;:::i;:::-;;;;;;;34067:4;:28::i;:::-;;33454:653;33449:3;;;;;:::i;:::-;;;;33409:698;;;;33234:880:::0;;;:::o;32388:838::-;18600:6;;-1:-1:-1;;;;;18600:6:0;4398:10;18747:23;18739:68;;;;-1:-1:-1;;;18739:68:0;;;;;;;:::i;:::-;32569:9:::1;32564:655;32588:7;:14;32584:1;:18;32564:655;;;32624:14;32641:7;32649:1;32641:10;;;;;;;;:::i;:::-;;;;;;;32624:27;;32694:11;32706:1;32694:14;;;;;;;;:::i;:::-;;;;;;;32670:12;:20;32683:6;-1:-1:-1::0;;;;;32670:20:0::1;-1:-1:-1::0;;;;;32670:20:0::1;;;;;;;;;;;;;:38;32666:116;;32752:11;32764:1;32752:14;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;32729:20:0;::::1;;::::0;;;:12:::1;:20:::0;;;;;;;:37;32666:116:::1;-1:-1:-1::0;;;;;32800:23:0;::::1;32833:1;32800:23:::0;;;:15:::1;:23;::::0;;;;:30;:34;32796:105:::1;;-1:-1:-1::0;;;;;32862:23:0;::::1;;::::0;;;:15:::1;:23;::::0;;;;32855:30:::1;::::0;::::1;:::i;:::-;32920:9;32915:293;32939:12;:19;32935:1;:23;32915:293;;;33063:1;33014:9;:26;33024:12;33037:1;33024:15;;;;;;;;:::i;:::-;;;;;;;33014:26;;;;;;;;;;;:39;;:46;;;;:50;32984:142;;;;-1:-1:-1::0;;;32984:142:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;33147:23:0;::::1;;::::0;;;:15:::1;:23;::::0;;;;33176:15;;:12;;33189:1;;33176:15;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;33147:45;;::::1;::::0;::::1;::::0;;-1:-1:-1;33147:45:0;;;;;;;::::1;::::0;32960:3;::::1;::::0;::::1;:::i;:::-;;;;32915:293;;;;32609:610;32604:3;;;;;:::i;:::-;;;;32564:655;;19178:103:::0;18600:6;;-1:-1:-1;;;;;18600:6:0;4398:10;18747:23;18739:68;;;;-1:-1:-1;;;18739:68:0;;;;;;;:::i;:::-;19243:30:::1;19270:1;19243:18;:30::i;:::-;19178:103::o:0;6893:104::-;6949:13;6982:7;6975:14;;;;;:::i;32266:114::-;18600:6;;-1:-1:-1;;;;;18600:6:0;4398:10;18747:23;18739:68;;;;-1:-1:-1;;;18739:68:0;;;;;;;:::i;:::-;32343:16:::1;:29:::0;32266:114::o;34950:84::-;18600:6;;-1:-1:-1;;;;;18600:6:0;4398:10;18747:23;18739:68;;;;-1:-1:-1;;;18739:68:0;;;;;;;:::i;:::-;35008:10:::1;:18:::0;;-1:-1:-1;;35008:18:0::1;::::0;::::1;;::::0;;;::::1;::::0;;34950:84::o;35702:109::-;18600:6;;-1:-1:-1;;;;;18600:6:0;4398:10;18747:23;18739:68;;;;-1:-1:-1;;;18739:68:0;;;;;;;:::i;:::-;35782:21:::1;::::0;;;:9:::1;:21;::::0;;;;;35775:28:::1;35782:21:::0;;35775:28:::1;:::i;:::-;-1:-1:-1::0;35775:28:0::1;;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;-1:-1:-1;35702:109:0:o;11253:438::-;4398:10;11346:4;11429:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;11429:27:0;;;;;;;;;;11346:4;;4398:10;11475:35;;;;11467:85;;;;-1:-1:-1;;;11467:85:0;;11205:2:1;11467:85:0;;;11187:21:1;11244:2;11224:18;;;11217:30;11283:34;11263:18;;;11256:62;-1:-1:-1;;;11334:18:1;;;11327:35;11379:19;;11467:85:0;11003:401:1;11467:85:0;11588:60;11597:5;11604:7;11632:15;11613:16;:34;11588:8;:60::i;28035:483::-;4398:10;28150:4;28215:19;;;:12;:19;;;;;;28150:4;;4398:10;28215:23;28211:237;;28255:30;28279:5;28255:23;:30::i;:::-;28354:6;28326:24;28344:5;28326:17;:24::i;:::-;:34;;28300:136;;;;-1:-1:-1;;;28300:136:0;;;;;;;:::i;:::-;28458:28;28468:5;28475:2;28479:6;28458:9;:28::i;35143:551::-;18600:6;;-1:-1:-1;;;;;18600:6:0;4398:10;18747:23;18739:68;;;;-1:-1:-1;;;18739:68:0;;;;;;;:::i;:::-;35285:13:::1;::::0;35275:24:::1;::::0;;;:9:::1;:24;::::0;;;;:36:::1;;:51:::0;;;35337:324:::1;35361:13;:20;35357:1;:24;35337:324;;;35407:5:::0;;35403:94:::1;;35460:13:::0;35474:5:::1;35478:1;35474::::0;:5:::1;:::i;:::-;35460:20;;;;;;;;:::i;:::-;;;;;;;35441:13;35455:1;35441:16;;;;;;;;:::i;:::-;;;;;;;:39;35433:48;;;::::0;::::1;;35521:13;::::0;35511:24:::1;::::0;;;:9:::1;:24;::::0;;;;35554:16;;:13;;35568:1;;35554:16;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;35511:60;;::::1;::::0;::::1;::::0;;-1:-1:-1;35511:60:0;;;;;;;::::1;::::0;35603:13:::1;::::0;35618:16;;35591:58:::1;::::0;35603:13;35618;;35632:1;;35618:16;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;35591:58:::1;::::0;;12153:25:1;;;12194:18;;;12187:34;12237:18;;12230:34;;;12141:2;12126:18;35591:58:0::1;;;;;;;35383:3:::0;::::1;::::0;::::1;:::i;:::-;;;;35337:324;;;-1:-1:-1::0;35671:13:0::1;:15:::0;;;:13:::1;:15;::::0;::::1;:::i;:::-;;;;;;35143:551:::0;;:::o;35042:93::-;18600:6;;-1:-1:-1;;;;;18600:6:0;4398:10;18747:23;18739:68;;;;-1:-1:-1;;;18739:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35103:20:0::1;35126:1;35103:20:::0;;;:12:::1;:20;::::0;;;;:24;35042:93::o;32096:162::-;-1:-1:-1;;;;;32227:23:0;;;;;;:15;:23;;;;;;;;;32220:30;;;;;;;;;;;;;;;;;32186:16;;32220:30;;;32227:23;32220:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32096:162;;;:::o;30281:358::-;30417:7;30496:21;;;:9;:21;;;;;;;;30545:27;;;;30587:33;;;;30474:157;;;;;;;;;;;;;;;;;30386:16;;30417:7;;;30474:157;30496:21;;30474:157;;30496:21;30474:157;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30281:358;;;;;:::o;19436:201::-;18600:6;;-1:-1:-1;;;;;18600:6:0;4398:10;18747:23;18739:68;;;;-1:-1:-1;;;18739:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19525:22:0;::::1;19517:73;;;::::0;-1:-1:-1;;;19517:73:0;;8049:2:1;19517:73:0::1;::::0;::::1;8031:21:1::0;8088:2;8068:18;;;8061:30;8127:34;8107:18;;;8100:62;-1:-1:-1;;;8178:18:1;;;8171:36;8224:19;;19517:73:0::1;7847:402:1::0;19517:73:0::1;19601:28;19620:8;19601:18;:28::i;:::-;19436:201:::0;:::o;34122:820::-;18600:6;;-1:-1:-1;;;;;18600:6:0;4398:10;18747:23;18739:68;;;;-1:-1:-1;;;18739:68:0;;;;;;;:::i;:::-;34293:9:::1;34288:647;34312:7;:14;34308:1;:18;34288:647;;;34348:14;34365:7;34373:1;34365:10;;;;;;;;:::i;:::-;;;;;;;34348:27;;34418:10;34394:12;:20;34407:6;-1:-1:-1::0;;;;;34394:20:0::1;-1:-1:-1::0;;;;;34394:20:0::1;;;;;;;;;;;;;:34;34390:108;;-1:-1:-1::0;;;;;34449:20:0;::::1;;::::0;;;:12:::1;:20;::::0;;;;:33;;;34390:108:::1;-1:-1:-1::0;;;;;34516:23:0;::::1;34549:1;34516:23:::0;;;:15:::1;:23;::::0;;;;:30;:34;34512:105:::1;;-1:-1:-1::0;;;;;34578:23:0;::::1;;::::0;;;:15:::1;:23;::::0;;;;34571:30:::1;::::0;::::1;:::i;:::-;34636:9;34631:293;34655:12;:19;34651:1;:23;34631:293;;;34779:1;34730:9;:26;34740:12;34753:1;34740:15;;;;;;;;:::i;:::-;;;;;;;34730:26;;;;;;;;;;;:39;;:46;;;;:50;34700:142;;;;-1:-1:-1::0;;;34700:142:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;34863:23:0;::::1;;::::0;;;:15:::1;:23;::::0;;;;34892:15;;:12;;34905:1;;34892:15;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;34863:45;;::::1;::::0;::::1;::::0;;-1:-1:-1;34863:45:0;;;;;;;::::1;::::0;34676:3;::::1;::::0;::::1;:::i;:::-;;;;34631:293;;;;34333:602;34328:3;;;;;:::i;:::-;;;;34288:647;;23236:98:::0;23294:7;23321:5;23325:1;23321;:5;:::i;14889:380::-;-1:-1:-1;;;;;15025:19:0;;15017:68;;;;-1:-1:-1;;;15017:68:0;;10391:2:1;15017:68:0;;;10373:21:1;10430:2;10410:18;;;10403:30;10469:34;10449:18;;;10442:62;-1:-1:-1;;;10520:18:1;;;10513:34;10564:19;;15017:68:0;10189:400:1;15017:68:0;-1:-1:-1;;;;;15104:21:0;;15096:68;;;;-1:-1:-1;;;15096:68:0;;8456:2:1;15096:68:0;;;8438:21:1;8495:2;8475:18;;;8468:30;8534:34;8514:18;;;8507:62;-1:-1:-1;;;8585:18:1;;;8578:32;8627:19;;15096:68:0;8254:398:1;15096:68:0;-1:-1:-1;;;;;15177:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;15229:32;;11915:25:1;;;15229:32:0;;11888:18:1;15229:32:0;;;;;;;14889:380;;;:::o;23593:98::-;23651:7;23678:5;23682:1;23678;:5;:::i;23992:98::-;24050:7;24077:5;24081:1;24077;:5;:::i;22855:98::-;22913:7;22940:5;22944:1;22940;:5;:::i;15556:453::-;-1:-1:-1;;;;;8670:18:0;;;15691:24;8670:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;15758:37:0;;15754:248;;15840:6;15820:16;:26;;15812:68;;;;-1:-1:-1;;;15812:68:0;;8859:2:1;15812:68:0;;;8841:21:1;8898:2;8878:18;;;8871:30;8937:31;8917:18;;;8910:59;8986:18;;15812:68:0;8657:353:1;15812:68:0;15924:51;15933:5;15940:7;15968:6;15949:16;:25;15924:8;:51::i;12170:671::-;-1:-1:-1;;;;;12301:18:0;;12293:68;;;;-1:-1:-1;;;12293:68:0;;9985:2:1;12293:68:0;;;9967:21:1;10024:2;10004:18;;;9997:30;10063:34;10043:18;;;10036:62;-1:-1:-1;;;10114:18:1;;;10107:35;10159:19;;12293:68:0;9783:401:1;12293:68:0;-1:-1:-1;;;;;12380:16:0;;12372:64;;;;-1:-1:-1;;;12372:64:0;;7298:2:1;12372:64:0;;;7280:21:1;7337:2;7317:18;;;7310:30;7376:34;7356:18;;;7349:62;-1:-1:-1;;;7427:18:1;;;7420:33;7470:19;;12372:64:0;7096:399:1;12372:64:0;-1:-1:-1;;;;;12522:15:0;;12500:19;12522:15;;;;;;;;;;;12556:21;;;;12548:72;;;;-1:-1:-1;;;12548:72:0;;9217:2:1;12548:72:0;;;9199:21:1;9256:2;9236:18;;;9229:30;9295:34;9275:18;;;9268:62;-1:-1:-1;;;9346:18:1;;;9339:36;9392:19;;12548:72:0;9015:402:1;12548:72:0;-1:-1:-1;;;;;12656:15:0;;;:9;:15;;;;;;;;;;;12674:20;;;12656:38;;12716:13;;;;;;;;:23;;12688:6;;12656:9;12716:23;;12688:6;;12716:23;:::i;:::-;;;;;;;;12772:2;-1:-1:-1;;;;;12757:26:0;12766:4;-1:-1:-1;;;;;12757:26:0;;12776:6;12757:26;;;;11915:25:1;;11903:2;11888:18;;11769:177;12757:26:0;;;;;;;;12796:37;16609:125;13128:399;-1:-1:-1;;;;;13212:21:0;;13204:65;;;;-1:-1:-1;;;13204:65:0;;11611:2:1;13204:65:0;;;11593:21:1;11650:2;11630:18;;;11623:30;11689:33;11669:18;;;11662:61;11740:18;;13204:65:0;11409:355:1;13204:65:0;13360:6;13344:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;13377:18:0;;:9;:18;;;;;;;;;;:28;;13399:6;;13377:9;:28;;13399:6;;13377:28;:::i;:::-;;;;-1:-1:-1;;13421:37:0;;11915:25:1;;;-1:-1:-1;;;;;13421:37:0;;;13438:1;;13421:37;;11903:2:1;11888:18;13421:37:0;;;;;;;36347:902;36051:1222;:::o;19797:191::-;19890:6;;;-1:-1:-1;;;;;19907:17:0;;;-1:-1:-1;;;;;;19907:17:0;;;;;;;19940:40;;19890:6;;;19907:17;19890:6;;19940:40;;19871:16;;19940:40;19860:128;19797:191;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:679::-;246:5;299:3;292:4;284:6;280:17;276:27;266:55;;317:1;314;307:12;266:55;353:6;340:20;379:4;403:60;419:43;459:2;419:43;:::i;:::-;403:60;:::i;:::-;485:3;509:2;504:3;497:15;537:2;532:3;528:12;521:19;;572:2;564:6;560:15;624:3;619:2;613;610:1;606:10;598:6;594:23;590:32;587:41;584:61;;;641:1;638;631:12;584:61;663:1;673:169;687:2;684:1;681:9;673:169;;;744:23;763:3;744:23;:::i;:::-;732:36;;788:12;;;;820;;;;705:1;698:9;673:169;;;-1:-1:-1;860:5:1;;192:679;-1:-1:-1;;;;;;;192:679:1:o;876:673::-;930:5;983:3;976:4;968:6;964:17;960:27;950:55;;1001:1;998;991:12;950:55;1037:6;1024:20;1063:4;1087:60;1103:43;1143:2;1103:43;:::i;1087:60::-;1169:3;1193:2;1188:3;1181:15;1221:2;1216:3;1212:12;1205:19;;1256:2;1248:6;1244:15;1308:3;1303:2;1297;1294:1;1290:10;1282:6;1278:23;1274:32;1271:41;1268:61;;;1325:1;1322;1315:12;1268:61;1347:1;1357:163;1371:2;1368:1;1365:9;1357:163;;;1428:17;;1416:30;;1466:12;;;;1498;;;;1389:1;1382:9;1357:163;;1554:186;1613:6;1666:2;1654:9;1645:7;1641:23;1637:32;1634:52;;;1682:1;1679;1672:12;1634:52;1705:29;1724:9;1705:29;:::i;1745:260::-;1813:6;1821;1874:2;1862:9;1853:7;1849:23;1845:32;1842:52;;;1890:1;1887;1880:12;1842:52;1913:29;1932:9;1913:29;:::i;:::-;1903:39;;1961:38;1995:2;1984:9;1980:18;1961:38;:::i;:::-;1951:48;;1745:260;;;;;:::o;2010:328::-;2087:6;2095;2103;2156:2;2144:9;2135:7;2131:23;2127:32;2124:52;;;2172:1;2169;2162:12;2124:52;2195:29;2214:9;2195:29;:::i;:::-;2185:39;;2243:38;2277:2;2266:9;2262:18;2243:38;:::i;:::-;2233:48;;2328:2;2317:9;2313:18;2300:32;2290:42;;2010:328;;;;;:::o;2343:254::-;2411:6;2419;2472:2;2460:9;2451:7;2447:23;2443:32;2440:52;;;2488:1;2485;2478:12;2440:52;2511:29;2530:9;2511:29;:::i;:::-;2501:39;2587:2;2572:18;;;;2559:32;;-1:-1:-1;;;2343:254:1:o;2602:821::-;2754:6;2762;2770;2823:2;2811:9;2802:7;2798:23;2794:32;2791:52;;;2839:1;2836;2829:12;2791:52;2879:9;2866:23;2908:18;2949:2;2941:6;2938:14;2935:34;;;2965:1;2962;2955:12;2935:34;2988:61;3041:7;3032:6;3021:9;3017:22;2988:61;:::i;:::-;2978:71;;3102:2;3091:9;3087:18;3074:32;3058:48;;3131:2;3121:8;3118:16;3115:36;;;3147:1;3144;3137:12;3115:36;3170:63;3225:7;3214:8;3203:9;3199:24;3170:63;:::i;:::-;3160:73;;3286:2;3275:9;3271:18;3258:32;3242:48;;3315:2;3305:8;3302:16;3299:36;;;3331:1;3328;3321:12;3299:36;;3354:63;3409:7;3398:8;3387:9;3383:24;3354:63;:::i;:::-;3344:73;;;2602:821;;;;;:::o;3428:663::-;3555:6;3563;3571;3624:2;3612:9;3603:7;3599:23;3595:32;3592:52;;;3640:1;3637;3630:12;3592:52;3680:9;3667:23;3709:18;3750:2;3742:6;3739:14;3736:34;;;3766:1;3763;3756:12;3736:34;3789:61;3842:7;3833:6;3822:9;3818:22;3789:61;:::i;:::-;3779:71;;3897:2;3886:9;3882:18;3869:32;3859:42;;3954:2;3943:9;3939:18;3926:32;3910:48;;3983:2;3973:8;3970:16;3967:36;;;3999:1;3996;3989:12;4096:416;4189:6;4197;4250:2;4238:9;4229:7;4225:23;4221:32;4218:52;;;4266:1;4263;4256:12;4218:52;4306:9;4293:23;4339:18;4331:6;4328:30;4325:50;;;4371:1;4368;4361:12;4325:50;4394:61;4447:7;4438:6;4427:9;4423:22;4394:61;:::i;:::-;4384:71;4502:2;4487:18;;;;4474:32;;-1:-1:-1;;;;4096:416:1:o;4517:273::-;4573:6;4626:2;4614:9;4605:7;4601:23;4597:32;4594:52;;;4642:1;4639;4632:12;4594:52;4681:9;4668:23;4734:5;4727:13;4720:21;4713:5;4710:32;4700:60;;4756:1;4753;4746:12;4795:180;4854:6;4907:2;4895:9;4886:7;4882:23;4878:32;4875:52;;;4923:1;4920;4913:12;4875:52;-1:-1:-1;4946:23:1;;4795:180;-1:-1:-1;4795:180:1:o;4980:435::-;5033:3;5071:5;5065:12;5098:6;5093:3;5086:19;5124:4;5153:2;5148:3;5144:12;5137:19;;5190:2;5183:5;5179:14;5211:1;5221:169;5235:6;5232:1;5229:13;5221:169;;;5296:13;;5284:26;;5330:12;;;;5365:15;;;;5257:1;5250:9;5221:169;;;-1:-1:-1;5406:3:1;;4980:435;-1:-1:-1;;;;;4980:435:1:o;5628:261::-;5807:2;5796:9;5789:21;5770:4;5827:56;5879:2;5868:9;5864:18;5856:6;5827:56;:::i;5894:403::-;6129:2;6118:9;6111:21;6092:4;6149:56;6201:2;6190:9;6186:18;6178:6;6149:56;:::i;:::-;6236:2;6221:18;;6214:34;;;;-1:-1:-1;6279:2:1;6264:18;6257:34;6141:64;5894:403;-1:-1:-1;5894:403:1:o;6494:597::-;6606:4;6635:2;6664;6653:9;6646:21;6696:6;6690:13;6739:6;6734:2;6723:9;6719:18;6712:34;6764:1;6774:140;6788:6;6785:1;6782:13;6774:140;;;6883:14;;;6879:23;;6873:30;6849:17;;;6868:2;6845:26;6838:66;6803:10;;6774:140;;;6932:6;6929:1;6926:13;6923:91;;;7002:1;6997:2;6988:6;6977:9;6973:22;6969:31;6962:42;6923:91;-1:-1:-1;7075:2:1;7054:15;-1:-1:-1;;7050:29:1;7035:45;;;;7082:2;7031:54;;6494:597;-1:-1:-1;;;6494:597:1:o;7500:342::-;7702:2;7684:21;;;7741:2;7721:18;;;7714:30;-1:-1:-1;;;7775:2:1;7760:18;;7753:48;7833:2;7818:18;;7500:342::o;9422:356::-;9624:2;9606:21;;;9643:18;;;9636:30;9702:34;9697:2;9682:18;;9675:62;9769:2;9754:18;;9422:356::o;10594:404::-;10796:2;10778:21;;;10835:2;10815:18;;;10808:30;10874:34;10869:2;10854:18;;10847:62;-1:-1:-1;;;10940:2:1;10925:18;;10918:38;10988:3;10973:19;;10594:404::o;12275:548::-;12566:6;12555:9;12548:25;12609:6;12604:2;12593:9;12589:18;12582:34;12652:6;12647:2;12636:9;12632:18;12625:34;12695:6;12690:2;12679:9;12675:18;12668:34;12739:3;12733;12722:9;12718:19;12711:32;12529:4;12760:57;12812:3;12801:9;12797:19;12789:6;12760:57;:::i;:::-;12752:65;12275:548;-1:-1:-1;;;;;;;12275:548:1:o;13017:275::-;13088:2;13082:9;13153:2;13134:13;;-1:-1:-1;;13130:27:1;13118:40;;13188:18;13173:34;;13209:22;;;13170:62;13167:88;;;13235:18;;:::i;:::-;13271:2;13264:22;13017:275;;-1:-1:-1;13017:275:1:o;13297:183::-;13357:4;13390:18;13382:6;13379:30;13376:56;;;13412:18;;:::i;:::-;-1:-1:-1;13457:1:1;13453:14;13469:4;13449:25;;13297:183::o;13485:128::-;13525:3;13556:1;13552:6;13549:1;13546:13;13543:39;;;13562:18;;:::i;:::-;-1:-1:-1;13598:9:1;;13485:128::o;13618:217::-;13658:1;13684;13674:132;;13728:10;13723:3;13719:20;13716:1;13709:31;13763:4;13760:1;13753:15;13791:4;13788:1;13781:15;13674:132;-1:-1:-1;13820:9:1;;13618:217::o;13840:168::-;13880:7;13946:1;13942;13938:6;13934:14;13931:1;13928:21;13923:1;13916:9;13909:17;13905:45;13902:71;;;13953:18;;:::i;:::-;-1:-1:-1;13993:9:1;;13840:168::o;14013:125::-;14053:4;14081:1;14078;14075:8;14072:34;;;14086:18;;:::i;:::-;-1:-1:-1;14123:9:1;;14013:125::o;14143:380::-;14222:1;14218:12;;;;14265;;;14286:61;;14340:4;14332:6;14328:17;14318:27;;14286:61;14393:2;14385:6;14382:14;14362:18;14359:38;14356:161;;;14439:10;14434:3;14430:20;14427:1;14420:31;14474:4;14471:1;14464:15;14502:4;14499:1;14492:15;14356:161;;14143:380;;;:::o;14528:135::-;14567:3;-1:-1:-1;;14588:17:1;;14585:43;;;14608:18;;:::i;:::-;-1:-1:-1;14655:1:1;14644:13;;14528:135::o;14668:127::-;14729:10;14724:3;14720:20;14717:1;14710:31;14760:4;14757:1;14750:15;14784:4;14781:1;14774:15;14800:127;14861:10;14856:3;14852:20;14849:1;14842:31;14892:4;14889:1;14882:15;14916:4;14913:1;14906:15;14932:127;14993:10;14988:3;14984:20;14981:1;14974:31;15024:4;15021:1;15014:15;15048:4;15045:1;15038:15
Swarm Source
ipfs://4d119b3ea9a8b5ee3bf5de417ac2913abae2a05529fb6ee9fc0ec655e6977f76
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.