Overview
Max Total Supply
13,592,902.619482496194824961 ZONE
Holders
873 ( -0.115%)
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
3,036.020363481601519292 ZONEValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ZONE
Compiler Version
v0.6.12+commit.27d51765
Optimization Enabled:
Yes with 1000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity >=0.6.0; pragma experimental ABIEncoderV2; import "@openzeppelin/contracts/math/SafeMath.sol"; import "./lib/Ownable.sol"; import "./lib/Global.sol"; contract CompBase is Ownable { using SafeMath for uint256; /// @notice EIP-20 token name for this token string public constant name = "GridZone.io"; /// @notice EIP-20 token symbol for this token string public constant symbol = "ZONE"; /// @notice EIP-20 token decimals for this token uint8 public constant decimals = 18; // Total number of tokens in circulation uint256 internal constant _teamSupply = 3360000 * (10 ** uint256(decimals)); // 12% uint256 internal constant _advisorsSupply = 980000 * (10 ** uint256(decimals)); // 3.5% uint256 internal constant _genesisSupply = 2800000 * (10 ** uint256(decimals)); // 10% uint256 internal constant _publicSupply = 420000 * (10 ** uint256(decimals)); // 1.5% uint256 internal constant _treasurySupply = 3640000 * (10 ** uint256(decimals)); // 13% uint256 internal constant _airdropSupply = 420000 * (10 ** uint256(decimals)); // 1.5% uint256 internal constant _ecosystemSupply = 16380000 * (10 ** uint256(decimals)); // 58.5% uint256 internal constant _genesisEthCapacity = 100e18; // 100 ETH uint256 internal _publicEthCapacity = 2000e18; // 2000 ETH uint256 private _totalSupply = 0; uint256 private _totalLockedTokens = 0; /** * @dev Sets the value of the `cap`. This value is immutable, it can only be * set once during construction. */ uint256 private constant _cap = _teamSupply + _advisorsSupply + _genesisSupply + _publicSupply + _treasurySupply + _airdropSupply + _ecosystemSupply; // Allowance amounts on behalf of others mapping (address => mapping (address => uint256)) internal allowances; // Official record of token balances for each account mapping (address => uint256) internal _balances; /// @notice A record of each accounts delegate mapping (address => address) public delegates; /// @notice A checkpoint for marking number of votes from a given block struct Checkpoint { uint32 fromBlock; uint256 votes; } /// @notice A record of votes checkpoints for each account, by index mapping (address => mapping (uint32 => Checkpoint)) public checkpoints; /// @notice The number of checkpoints for each account mapping (address => uint32) public numCheckpoints; // A record of the locked token uint8 internal constant LOCK_TYPE_GENESIS = 0; uint8 internal constant LOCK_TYPE_BLACKLIST = 1; struct LockedToken { uint256 id; uint8 lockType; uint256 amount; uint256 start; uint256 end; } mapping(address => LockedToken[]) internal _lockedTokens; uint256 private lastLockId = 0; /// @notice The EIP-712 typehash for the contract's domain bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"); /// @notice The EIP-712 typehash for the delegation struct used by the contract bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); /// @notice A record of states for signing / validating signatures mapping (address => uint) public nonces; /// @notice An event thats emitted when an account changes its delegate event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); /// @notice An event thats emitted when a delegate account's vote balance changes event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance); /// @notice The standard EIP-20 transfer event event Transfer(address indexed from, address indexed to, uint256 amount); /// @notice The standard EIP-20 approval event event Approval(address indexed owner, address indexed spender, uint256 amount); /// @notice token locked event event TokenLocked(address indexed account, uint256 amount, uint8 lockType, uint256 end); event TokenUnlocked(address indexed account, uint256 amount, uint8 lockType); /** * @notice Construct a new GridZone token * @param ownerAddress Owner address of the GridZone token */ constructor(address ownerAddress) Ownable(ownerAddress) public { } function totalSupply() public view returns (uint256) { return _totalSupply.add(_totalLockedTokens); } /** * @dev Returns the cap on the token's total supply. */ function cap() public pure returns (uint256) { return _cap; } /** * @notice Get the number of tokens held by the `account` * @param account The address of the account to get the balance of * @return The number of tokens held */ function balanceOf(address account) external view returns (uint256) { uint256 amount = _balances[account]; return amount.add(getLockedAmount(account)); } function getLockedAmount(address account) public view returns (uint256) { LockedToken[] memory lockedTokensRef = _lockedTokens[account]; uint256 length = lockedTokensRef.length; uint256 amount = 0; for (uint256 i = 0; i < length; i ++) { amount = amount.add(lockedTokensRef[i].amount); } return amount; } /** * @notice Gets the available votes balance for `account` regarding locked token * @param account The address to get votes balance * @return The number of available votes balance for `account` */ function voteBalanceOf(address account) public view returns (uint256) { uint256 amount = _balances[account]; LockedToken[] memory lockedTokensRef = _lockedTokens[account]; uint256 length = lockedTokensRef.length; for (uint256 i = 0; i < length; i ++) { if (lockedTokensRef[i].lockType != LOCK_TYPE_BLACKLIST) { amount = amount.add(lockedTokensRef[i].amount); } } return amount; } /** * @notice Get the number of tokens `spender` is approved to spend on behalf of `account` * @param account The address of the account holding the funds * @param spender The address of the account spending the funds * @return The number of tokens approved */ function allowance(address account, address spender) external view returns (uint256) { return allowances[account][spender]; } /** * @notice Approve `spender` to transfer up to `amount` from `src` * @dev This will overwrite the approval amount for `spender` * and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve) * @param spender The address of the account which may transfer tokens * @param rawAmount The number of tokens that are approved (2^256-1 means infinite) * @return Whether or not the approval succeeded */ function approve(address spender, uint rawAmount) external returns (bool) { _approve(_msgSender(), spender, rawAmount); return true; } function _approve(address owner, address spender, uint256 amount) internal { require(owner != address(0), "ZONE: approve from the zero address"); require(spender != address(0), "ZONE: approve to the zero address"); allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @notice Transfer `amount` tokens from `msg.sender` to `dst` * @param dst The address of the destination account * @param rawAmount The number of tokens to transfer * @return Whether or not the transfer succeeded */ function transfer(address dst, uint256 rawAmount) external returns (bool) { _transferTokens(msg.sender, dst, rawAmount); return true; } /** * @notice Transfer `amount` tokens from `src` to `dst` * @param src The address of the source account * @param dst The address of the destination account * @param rawAmount The number of tokens to transfer * @return Whether or not the transfer succeeded */ function transferFrom(address src, address dst, uint256 rawAmount) external returns (bool) { address spender = msg.sender; uint256 spenderAllowance = allowances[src][spender]; if (spender != src && spenderAllowance != uint256(-1)) { uint256 newAllowance = spenderAllowance.sub(rawAmount); allowances[src][spender] = newAllowance; emit Approval(src, spender, newAllowance); } _transferTokens(src, dst, rawAmount); return true; } /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegatee The address to delegate votes to */ function delegate(address delegatee) public { return _delegate(msg.sender, delegatee); } /** * @notice Delegates votes from signatory to `delegatee` * @param delegatee The address to delegate votes to * @param nonce The contract state required to match the signature * @param expiry The time at which to expire the signature * @param v The recovery byte of the signature * @param r Half of the ECDSA signature pair * @param s Half of the ECDSA signature pair */ function delegateBySig(address delegatee, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s) public { bytes32 domainSeparator = keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name)), getChainId(), address(this))); bytes32 structHash = keccak256(abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry)); bytes32 digest = keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); address signatory = ecrecover(digest, v, r, s); require(signatory != address(0), "ZONE::delegateBySig: invalid signature"); require(nonce == nonces[signatory]++, "ZONE::delegateBySig: invalid nonce"); require(now <= expiry, "ZONE::delegateBySig: signature expired"); return _delegate(signatory, delegatee); } /** * @notice Gets the current votes balance for `account` * @param account The address to get votes balance * @return The number of current votes for `account` */ function getCurrentVotes(address account) external view returns (uint256) { uint32 nCheckpoints = numCheckpoints[account]; return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0; } /** * @notice Determine the prior number of votes for an account as of a block number * @dev Block number must be a finalized block or else this function will revert to prevent misinformation. * @param account The address of the account to check * @param blockNumber The block number to get the vote balance at * @return The number of votes the account had as of the given block */ function getPriorVotes(address account, uint blockNumber) public view returns (uint256) { require(blockNumber < block.number, "ZONE::getPriorVotes: not yet determined"); uint32 nCheckpoints = numCheckpoints[account]; if (nCheckpoints == 0) { return 0; } // First check most recent balance if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) { return checkpoints[account][nCheckpoints - 1].votes; } // Next check implicit zero balance if (checkpoints[account][0].fromBlock > blockNumber) { return 0; } uint32 lower = 0; uint32 upper = nCheckpoints - 1; while (upper > lower) { uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow Checkpoint memory cp = checkpoints[account][center]; if (cp.fromBlock == blockNumber) { return cp.votes; } else if (cp.fromBlock < blockNumber) { lower = center; } else { upper = center - 1; } } return checkpoints[account][lower].votes; } function _delegate(address delegator, address delegatee) internal { address currentDelegate = delegates[delegator]; uint256 delegatorBalance = voteBalanceOf(delegator); delegates[delegator] = delegatee; emit DelegateChanged(delegator, currentDelegate, delegatee); _moveDelegates(currentDelegate, delegatee, delegatorBalance); } function _transferTokens(address src, address dst, uint256 amount) internal { require(src != address(0), "ZONE::_transferTokens: cannot transfer from the zero address"); require(dst != address(0), "ZONE::_transferTokens: cannot transfer to the zero address"); _beforeTokenTransfer(src, dst, amount); _balances[src] = _balances[src].sub(amount); _balances[dst] = _balances[dst].add(amount); emit Transfer(src, dst, amount); _moveDelegates(delegates[src], delegates[dst], amount); } function _moveDelegates(address srcRep, address dstRep, uint256 amount) internal { if (srcRep != dstRep && amount > 0) { if (srcRep != address(0)) { uint32 srcRepNum = numCheckpoints[srcRep]; uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0; uint256 srcRepNew = srcRepOld.sub(amount); _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); } if (dstRep != address(0)) { uint32 dstRepNum = numCheckpoints[dstRep]; uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0; uint256 dstRepNew = dstRepOld.add(amount); _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); } } } function _writeCheckpoint(address delegatee, uint32 nCheckpoints, uint256 oldVotes, uint256 newVotes) internal { uint32 blockNumber = safe32(block.number, "ZONE::_writeCheckpoint: block number exceeds 32 bits"); if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) { checkpoints[delegatee][nCheckpoints - 1].votes = newVotes; } else { checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes); numCheckpoints[delegatee] = nCheckpoints + 1; } emit DelegateVotesChanged(delegatee, oldVotes, newVotes); } function safe32(uint n, string memory errorMessage) internal pure returns (uint32) { require(n < 2**32, errorMessage); return uint32(n); } function getChainId() internal pure returns (uint) { uint256 chainId; assembly { chainId := chainid() } return chainId; } /** @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 * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal { require(account != address(0), "ZONE: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); _moveDelegates(address(0), delegates[account], amount); } function _mintLockedToken(address account, uint256 amount, uint8 lockType, uint256 end) internal { require(account != address(0), "ZONE: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalLockedTokens = _totalLockedTokens.add(amount); LockedToken memory lockedToken = LockedToken({ id: lastLockId++, lockType: lockType, amount: amount, start: now, end: end }); _lockedTokens[account].push(lockedToken); emit Transfer(address(0), account, amount); if (lockType != LOCK_TYPE_BLACKLIST) { _moveDelegates(address(0), delegates[account], amount); } emit TokenLocked(account, amount, lockType, end); } function _unlockToken(address account, uint256 lockId) internal { LockedToken[] storage lockedTokensRef = _lockedTokens[account]; uint256 length = lockedTokensRef.length; require(0 < length, "ZONE: No locked token"); bool found = false; uint256 index = 0; for (uint256 i = 0; i < length; i++) { if (lockedTokensRef[i].id == lockId) { index = i; found = true; break; } } require(found == true, "ZONE: lockId invalid"); uint256 amount = lockedTokensRef[index].amount; uint8 lockType = lockedTokensRef[index].lockType; _totalLockedTokens = _totalLockedTokens.sub(amount); _totalSupply = _totalSupply.add(amount); // remove item from list uint256 lastIndex = length - 1; if (index < lastIndex) { lockedTokensRef[index] = lockedTokensRef[lastIndex]; } lockedTokensRef.pop(); _balances[account] = _balances[account].add(amount); if (lockType == LOCK_TYPE_BLACKLIST) { _moveDelegates(address(0), delegates[account], amount); } emit TokenUnlocked(account, amount, lockType); } function getLockedTokens(address account) external view returns (LockedToken[] memory) { LockedToken[] memory lockedTokensRef = _lockedTokens[account]; return lockedTokensRef; } /** * @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 { require(account != address(0), "ZONE: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ZONE: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); _moveDelegates(delegates[account], address(0), amount); } /** * @dev See {ERC20-_beforeTokenTransfer}. * * Requirements: * * - minted tokens must not cause the total supply to go over the cap. */ function _beforeTokenTransfer(address from, address to, uint256 amount) view internal { if (from == address(0)) { // When minting tokens require(totalSupply().add(amount) <= _cap, "Capped: cap exceeded"); } } } /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20Burnable is CompBase { /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public { address spender = _msgSender(); uint256 spenderAllowance = allowances[account][spender]; uint256 decreasedAllowance = spenderAllowance.sub(amount, "ZONE::burnFrom: burn amount exceeds allowance"); _approve(account, spender, decreasedAllowance); _burn(account, amount); } } contract ZONE is CompBase, ERC20Burnable { using SafeMath for uint256; uint256 public immutable launchTime; address public immutable vault; uint256 private _genesisRate; uint256 private _publicRate; uint256 public immutable genesisSaleEndTime; uint256 public immutable genesisSaleUnlockTime; // total purchased eth amount during ICO. The unit is wei uint256 public genesisSaleBoughtEth = 0; uint256 public publicSaleBoughtEth = 0; uint256 public genesisSaleSoldToken = 0; uint256 public publicSaleSoldToken = 0; bool private _genesisSaleFinished = false; bool private _publicSaleFinished = false; struct Vest { address beneficiary; uint256 start; uint256 cliff; uint256 duration; uint256 amount; uint256 claimedAmount; bool revoked; } mapping (address => Vest) public vests; uint16[] private quarterlyRate; // sum is same with quarterlyRateDenominator uint16 private constant quarterlyRateDenominator = 10000; uint256 public claimedEcosystemVest = 0; address private governorTimelock; event VestAdded(address indexed beneficiary, uint256 start, uint256 cliff, uint256 duration, uint256 amount); event VestClaimed(address indexed beneficiary, uint256 amount); event EcosystemVestClaimed(address indexed account, uint256 amount); event SoldOnGenesisSale(address indexed buyer, uint256 ethAmount, uint256 tokenAmount); event SoldOnPublicSale(address indexed buyer, uint256 ethAmount, uint256 tokenAmount); event GenesisSaleFinished(uint256 boughtEth, uint256 soldToken); event PublicSaleFinished(uint256 boughtEth, uint256 soldToken); event GenesisSaleRateChanged(uint256 newRate); event PublicSaleRateChanged(uint256 newRate); event PublicSaleEthCapacityChanged(uint256 newRate, uint256 newEthCapacity); constructor(address owner_, address vault_, address advisors_, address treasury_) CompBase(owner_) public { require(owner_ != vault_, "ZONE: You specified owner address as an vault address"); launchTime = now; quarterlyRate = [3182, 2676, 2250, 1892]; vault = vault_; _genesisRate = _genesisSupply.mul(10).div(_genesisEthCapacity).div(12); // 2/12 is for bonuses _publicRate = _publicSupply.div(_publicEthCapacity); genesisSaleEndTime = now + GLOBAL.SECONDS_IN_MONTH * 3; genesisSaleUnlockTime = now + GLOBAL.SECONDS_IN_MONTH * 4; AddVest(owner_, now, 0, GLOBAL.SECONDS_IN_YEAR * 2, _teamSupply); AddVest(advisors_, now, 0, GLOBAL.SECONDS_IN_YEAR, _advisorsSupply); _mintLockedToken(treasury_, _treasurySupply, LOCK_TYPE_BLACKLIST, now + GLOBAL.SECONDS_IN_YEAR); _mint(vault_, _airdropSupply); } modifier onlyCommunity() { require(msg.sender == governorTimelock, "ZONE: The caller is not the governance timelock contract."); _; } modifier onlyEndUser { require(msg.sender == tx.origin, "ZONE: Only end-user"); _; } function setGovernorTimelock(address governorTimelock_) external onlyOwner { governorTimelock = governorTimelock_; } /** * @param beneficiary address of the beneficiary to whom vested tokens are transferred * @param cliff duration in seconds of the cliff in which tokens will begin to vest * @param duration duration in seconds of the period in which the tokens will vest */ function AddVest(address beneficiary, uint256 start, uint256 cliff, uint256 duration, uint256 amount) internal { require(beneficiary != address(0), "ZONE::AddVest Invalid beneficiary"); require(cliff <= duration, "ZONE::AddVest cliff > duration"); Vest memory vest = Vest({ beneficiary: beneficiary, start: start, cliff: start.add(cliff), duration: duration, amount: amount, claimedAmount: 0, revoked: false }); vests[beneficiary] = vest; emit VestAdded(beneficiary, start, cliff, duration, amount); } function calculateVestClaim(address beneficiary) public view returns (uint256 vestedAmount, uint256 claimedAmount) { Vest storage vest = vests[beneficiary]; if (vest.beneficiary != beneficiary) { // Invalid beneficiary return (0, 0); } if (now < vest.cliff) { // For vest created with a future start date, that hasn't been reached, return 0, 0 return (0, vest.claimedAmount); } else if (vest.revoked == true) { return (vest.claimedAmount, vest.claimedAmount); } else if (vest.start.add(vest.duration) <= now) { return (vest.amount, vest.claimedAmount); } else { vestedAmount = vest.amount.mul(now.sub(vest.start)).div(vest.duration); return (vestedAmount, vest.claimedAmount); } } function claimVestedToken(address beneficiary) external { (uint256 vested, uint256 claimed) = calculateVestClaim(beneficiary); require(claimed < vested, "ZONE: No claimable token"); uint256 fund = vested.sub(claimed); vests[beneficiary].claimedAmount = vested; _mint(beneficiary, fund); emit VestClaimed(beneficiary, fund); } function revokeVest(address beneficiary) external onlyCommunity { Vest storage vest = vests[beneficiary]; require(vest.beneficiary == beneficiary, "ZONE: Invalid beneficiary"); require(vest.revoked == false, "ZONE: Already revoked"); uint256 fund = vest.amount.sub(vest.claimedAmount); if (0 < fund) { vest.claimedAmount = vest.amount; _mint(beneficiary, fund); emit VestClaimed(beneficiary, fund); } vest.revoked = true; } // // Unlock token // function getUnlockableAmount(address account) public view returns (uint256) { LockedToken[] memory lockedTokensRef = _lockedTokens[account]; uint256 length = lockedTokensRef.length; uint256 amount = 0; for (uint256 i = 0; i < length; i ++) { if (_isUnlockable(lockedTokensRef[i].lockType, lockedTokensRef[i].end) == true) { amount = amount.add(lockedTokensRef[i].amount); } } return amount; } function Unlock(address account) public returns (uint256) { LockedToken[] memory lockedTokensRef = _lockedTokens[account]; uint256 length = lockedTokensRef.length; bool unlocked = false; for (uint256 i = 0; i < length; i ++) { if (_isUnlockable(lockedTokensRef[i].lockType, lockedTokensRef[i].end) == true) { _unlockToken(account, lockedTokensRef[i].id); unlocked = true; } } require(unlocked, "ZONE: No unlockable token."); } function _isUnlockable(uint8 lockType, uint256 end) internal view returns (bool) { if (end <= now) { return true; } if ((lockType == LOCK_TYPE_GENESIS) && _publicSaleFinished) { return true; } return false; } function revokeBlacklistLock(address account) external onlyCommunity { LockedToken[] memory lockedTokensRef = _lockedTokens[account]; uint256 length = lockedTokensRef.length; for (uint256 i = 0; i < length; i ++) { if (lockedTokensRef[i].lockType == LOCK_TYPE_BLACKLIST) { _unlockToken(account, lockedTokensRef[i].id); } } } // // Quarterly vesting for ecosystem // function calculateEcosystemVested() public view returns (uint256 vestedAmount) { uint256 quartersCount = now.sub(launchTime).div(GLOBAL.SECONDS_IN_QUARTER); uint256 yearsCount = quartersCount.div(GLOBAL.QUARTERS_IN_YEAR); uint256 currentQurter = quartersCount.mod(GLOBAL.QUARTERS_IN_YEAR); uint256 yearSupply = _ecosystemSupply >> (yearsCount + 1); if (0 < yearsCount) { // _ecosystemSupply * (1 - 1 / (2*yearsCount)) vestedAmount = _ecosystemSupply.sub(_ecosystemSupply.div(2).div(yearsCount)); } else { vestedAmount = 0; } for (uint8 quarter = 0; quarter <= currentQurter; quarter ++) { uint256 vestedInQuarter = yearSupply.mul(quarterlyRate[quarter]).div(quarterlyRateDenominator); vestedAmount = vestedAmount.add(vestedInQuarter); } return vestedAmount; } function claimEcosystemVest() external { uint256 vested = calculateEcosystemVested(); require (claimedEcosystemVest < vested, "ZONE: No claimable token for the ecosystem."); uint256 fund = vested.sub(claimedEcosystemVest); claimedEcosystemVest = vested; _mint(vault, fund); emit EcosystemVestClaimed(vault, fund); } function revokeEcosystemVest() external onlyCommunity { require (claimedEcosystemVest < _ecosystemSupply, "ZONE: All tokens already have been claimed for the ecosystem."); uint256 fund = _ecosystemSupply.sub(claimedEcosystemVest); claimedEcosystemVest = _ecosystemSupply; _mint(vault, fund); emit EcosystemVestClaimed(vault, fund); } // // Genesis and Public sale // function isGenesisSaleFinished() external view returns (bool) { if (_genesisSaleFinished == true || genesisSaleEndTime <= now) { return true; } return false; } function isPublicSaleFinished() external view returns (bool) { return _publicSaleFinished; } // Crowds Sale contains both the Genesis sale and the Public sale function isCrowdsaleFinished() external view returns (bool) { if (_publicSaleFinished) return true; if (genesisSaleEndTime <= now) return false; if (_genesisSaleFinished) return true; return false; } function rate() public view returns (uint256) { return (now < genesisSaleEndTime) ? _genesisRate : _publicRate; } function getGenesisSaleRate() external view returns(uint256) { return _genesisRate; } function setGenesisSaleRate(uint256 newRate) external onlyOwner { require(0 < newRate, "ZONE: The rate can't be 0."); _genesisRate = newRate; emit GenesisSaleRateChanged(_genesisRate); } function getPublicSaleRate() external view returns(uint256) { return _publicRate; } function setPublicSaleRate(uint256 newRate) public onlyOwner { require(0 < newRate, "ZONE: The rate can't be 0."); _publicRate = newRate; emit PublicSaleRateChanged(_publicRate); } function getPublicSaleEthCapacity() external view returns(uint256) { return _publicEthCapacity; } function setPublicSaleEthCapacity(uint256 newEthCapacity) public onlyOwner { require(publicSaleBoughtEth < newEthCapacity, "ZONE: The capacity must be greater than the already bought amount in the public sale."); _publicRate = _publicSupply.sub(publicSaleSoldToken).div(newEthCapacity.sub(publicSaleBoughtEth)); _publicEthCapacity = newEthCapacity; emit PublicSaleEthCapacityChanged(_publicRate, _publicEthCapacity); } function finishCrowdsale() external onlyOwner { _finishGenesisSale(); if (genesisSaleEndTime <= now) { _finishPublicSale(); } } function _finishGenesisSale() private { if (_genesisSaleFinished) return; _genesisSaleFinished = true; uint256 leftOver = _genesisSupply.sub(genesisSaleSoldToken); if (leftOver > 0) { _mint(owner(), leftOver); } emit GenesisSaleFinished(genesisSaleBoughtEth, genesisSaleSoldToken); } function _finishPublicSale() private { if (_publicSaleFinished) return; _publicSaleFinished = true; uint256 leftOver = _publicSupply.sub(publicSaleSoldToken); if (leftOver > 0) { _mint(owner(), leftOver); } emit PublicSaleFinished(publicSaleBoughtEth, publicSaleSoldToken); } function _sellOnGenesisSale(address payable buyer, uint256 ethAmount) private { uint256 capacity = _genesisEthCapacity.sub(genesisSaleBoughtEth); uint256 _ethAmount = (ethAmount < capacity) ? ethAmount : capacity; uint256 refund = ethAmount - _ethAmount; require(0 < _ethAmount, "ZONE: The amount can't be 0."); uint256 amount = _ethAmount.mul(_genesisRate); uint256 genesisBonus = amount.div(10); // when buying during Genesis sale, 10% bonus uint256 purchaseBonus = 0; if (_ethAmount >= 10e18) { // when buying for over 10eth, 10% bonus purchaseBonus = amount.div(10); } // total token amount amount = amount.add(genesisBonus).add(purchaseBonus); genesisSaleBoughtEth = genesisSaleBoughtEth.add(_ethAmount); genesisSaleSoldToken = genesisSaleSoldToken.add(amount); require(genesisSaleSoldToken <= _genesisSupply, "ZONE: Genesis supply is insufficient."); // mint token amount and bonuses to buyer _mintLockedToken(buyer, amount, LOCK_TYPE_GENESIS, genesisSaleUnlockTime); address payable ownerAddress = address(uint160(owner())); ownerAddress.transfer(_ethAmount); emit SoldOnGenesisSale(buyer, _ethAmount, amount); if (0 < refund) { buyer.transfer(refund); } if (_genesisEthCapacity <= genesisSaleBoughtEth) { _finishGenesisSale(); } } function _sellOnPublicSale(address payable buyer, uint256 ethAmount) private { uint256 capacity = _publicEthCapacity.sub(publicSaleBoughtEth); uint256 _ethAmount = (ethAmount < capacity) ? ethAmount : capacity; uint256 refund = ethAmount - _ethAmount; require(0 < _ethAmount, "ZONE: The amount can't be 0."); uint256 amount = _ethAmount.mul(_publicRate); publicSaleBoughtEth = publicSaleBoughtEth.add(_ethAmount); publicSaleSoldToken = publicSaleSoldToken.add(amount); require(publicSaleSoldToken <= _publicSupply, "ZONE: Public supply is insufficient."); // mint token amount to buyer _mint(buyer, amount); address payable ownerAddress = address(uint160(owner())); ownerAddress.transfer(_ethAmount); emit SoldOnPublicSale(buyer, _ethAmount, amount); if (0 < refund) { buyer.transfer(refund); } if (_publicEthCapacity <= publicSaleBoughtEth) { _finishPublicSale(); } } // low level token purchase function function purchase() external payable onlyEndUser { address payable buyer = _msgSender(); require(buyer != address(0)); require(msg.value >= 1e16, "ZONE: The purchase minimum amount is 0.01 ETH"); if (now < genesisSaleEndTime) { require(_genesisSaleFinished == false, "ZONE: Genesis sale already finished"); _sellOnGenesisSale(buyer, msg.value); } else { _finishGenesisSale(); require(_publicSaleFinished == false, "ZONE: Public sale already finished"); _sellOnPublicSale(buyer, msg.value); } } receive() external payable { require(false, "ZONE: Use the purchase function to buy the ZONE token."); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { 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) { 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) { // 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) { 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) { 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) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); 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) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); 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) { require(b > 0, "SafeMath: modulo by zero"); 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) { 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. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * 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) { 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) { require(b > 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "@openzeppelin/contracts/utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; address private _pendingOwner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor (address owner) internal { _owner = owner; emit OwnershipTransferred(address(0), owner); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Returns the address of the pending owner. */ function pendingOwner() public view virtual returns (address) { return _pendingOwner; } /** * @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 { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _pendingOwner = newOwner; } function acceptOwnership() external { require(msg.sender == _pendingOwner, "acceptOwnership: Call must come from pendingOwner."); emit OwnershipTransferred(_owner, _pendingOwner); _owner = _pendingOwner; } }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity >=0.6.0; pragma experimental ABIEncoderV2; library GLOBAL { uint256 constant SECONDS_IN_YEAR = 365 * 24 * 3600; // 365 days * 24 hours * 60 minutes * 60 seconds uint256 constant SECONDS_IN_QUARTER = SECONDS_IN_YEAR / 4; uint256 constant SECONDS_IN_MONTH = 30 * 24 * 3600; // 30 days * 24 hours * 60 minutes * 60 seconds uint8 constant QUARTERS_IN_YEAR = 4; }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <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 GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
{ "optimizer": { "enabled": true, "runs": 1000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"vault_","type":"address"},{"internalType":"address","name":"advisors_","type":"address"},{"internalType":"address","name":"treasury_","type":"address"}],"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":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EcosystemVestClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"boughtEth","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"soldToken","type":"uint256"}],"name":"GenesisSaleFinished","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"GenesisSaleRateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newEthCapacity","type":"uint256"}],"name":"PublicSaleEthCapacityChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"boughtEth","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"soldToken","type":"uint256"}],"name":"PublicSaleFinished","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"PublicSaleRateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"SoldOnGenesisSale","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"SoldOnPublicSale","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"lockType","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"end","type":"uint256"}],"name":"TokenLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"lockType","type":"uint8"}],"name":"TokenUnlocked","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":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"start","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cliff","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"VestAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"VestClaimed","type":"event"},{"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"Unlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","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":"rawAmount","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":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"calculateEcosystemVested","outputs":[{"internalType":"uint256","name":"vestedAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"}],"name":"calculateVestClaim","outputs":[{"internalType":"uint256","name":"vestedAmount","type":"uint256"},{"internalType":"uint256","name":"claimedAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint256","name":"votes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimEcosystemVest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"}],"name":"claimVestedToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimedEcosystemVest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"finishCrowdsale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"genesisSaleBoughtEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesisSaleEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesisSaleSoldToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesisSaleUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGenesisSaleRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getLockedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getLockedTokens","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint8","name":"lockType","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"internalType":"struct CompBase.LockedToken[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPublicSaleEthCapacity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPublicSaleRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getUnlockableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isCrowdsaleFinished","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isGenesisSaleFinished","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleFinished","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleBoughtEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleSoldToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"purchase","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"revokeBlacklistLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revokeEcosystemVest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"}],"name":"revokeVest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"setGenesisSaleRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"governorTimelock_","type":"address"}],"name":"setGovernorTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newEthCapacity","type":"uint256"}],"name":"setPublicSaleEthCapacity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"setPublicSaleRate","outputs":[],"stateMutability":"nonpayable","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":"dst","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"rawAmount","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":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"vests","outputs":[{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"cliff","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"claimedAmount","type":"uint256"},{"internalType":"bool","name":"revoked","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"voteBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
610100604052686c6b935b8bbd400000600255600060038190556004819055600b819055600f8190556010819055601181905560128190556013805461ffff191690556016553480156200005257600080fd5b506040516200575938038062005759833981016040819052620000759162000c1e565b600080546001600160a01b0319166001600160a01b038616908117825560405186928392917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35050826001600160a01b0316846001600160a01b03161415620000ff5760405162461bcd60e51b8152600401620000f69062000ea0565b60405180910390fd5b426080908152604080519182018152610c6e8252610a7460208301526108ca9082015261076460608201526200013a90601590600462000ac0565b50606083901b6001600160601b03191660a05262000196600c6200018268056bc75e2d63100000816a0250ec4ddca432f6000000600a62000253602090811b6200256617901c565b6200029c60201b620025a01790919060201c565b600d55600254620001bf906958f03ee118a13e800000906200029c602090811b620025a017901c565b600e55426276a700810160c052629e3400810160e052620001f590859060006303c267006a02c781f708c509f4000000620002d2565b62000213824260006301e1338069cf85e80d39783c800000620002d2565b62000233816a0302cccb9ed575730000006001426301e133800162000443565b62000249836958f03ee118a13e800000620005e7565b5050505062000f48565b600082620002645750600062000296565b828202828482816200027257fe5b0414620002935760405162461bcd60e51b8152600401620000f69062000de7565b90505b92915050565b6000808211620002c05760405162461bcd60e51b8152600401620000f69062000d79565b818381620002ca57fe5b049392505050565b6001600160a01b038516620002fb5760405162461bcd60e51b8152600401620000f69062000e5f565b818311156200031e5760405162461bcd60e51b8152600401620000f69062000e28565b6200032862000b70565b6040518060e00160405280876001600160a01b03168152602001868152602001620003628688620006e260201b620025d21790919060201c565b8152602080820186905260408083018690526000606080850182905260809485018290526001600160a01b038c81168084526014865292849020875181546001600160a01b0319169216919091178155938601516001850155858301516002850155850151600384015592840151600483015560a0840151600583015560c08401516006909201805460ff19169215159290921790915551919250907fe248a39650014b0e23685178b095d4aee81e861e4cf38d6acc166d7c05616027906200043390889088908890889062000f14565b60405180910390a2505050505050565b6001600160a01b0384166200046c5760405162461bcd60e51b8152600401620000f69062000cd4565b6200047a600085856200070a565b6200049683600454620006e260201b620025d21790919060201c565b600455620004a362000bb8565b506040805160a081018252600b80546001808201909255825260ff85811660208085019182528486018981524260608701908152608087018981526001600160a01b038d166000818152600a86528a81208054808b0182559082529581208a516005909702019586559551978501805460ff1916989097169790971790955590516002830155516003820155915160049092019190915592519192909160008051602062005705833981519152906200055e90889062000efd565b60405180910390a360ff831660011462000599576001600160a01b03808616600090815260076020526040812054620005999216866200076e565b846001600160a01b03167f9298b2b497f03d8c40a216bc1e5142747187dd4687de91e09d789982f96d0f5a858585604051620005d89392919062000f2f565b60405180910390a25050505050565b6001600160a01b038216620006105760405162461bcd60e51b8152600401620000f69062000cd4565b6200061e600083836200070a565b6200063a81600354620006e260201b620025d21790919060201c565b6003556001600160a01b0382166000908152600660209081526040909120546200066f918390620025d2620006e2821b17901c565b6001600160a01b0383166000818152600660205260408082209390935591519091906000805160206200570583398151915290620006af90859062000efd565b60405180910390a36001600160a01b03808316600090815260076020526040812054620006de9216836200076e565b5050565b600082820183811015620002935760405162461bcd60e51b8152600401620000f69062000d0b565b6001600160a01b03831662000769576a17293b0a9e69fd9c000000620007488262000734620008df565b620006e260201b620025d21790919060201c565b1115620007695760405162461bcd60e51b8152600401620000f69062000db0565b505050565b816001600160a01b0316836001600160a01b031614158015620007915750600081115b1562000769576001600160a01b0383161562000839576001600160a01b03831660009081526009602052604081205463ffffffff169081620007d557600062000807565b6001600160a01b038516600090815260086020908152604080832063ffffffff60001987011684529091529020600101545b905060006200082584836200090460201b620025f71790919060201c565b905062000835868484846200092f565b5050505b6001600160a01b0382161562000769576001600160a01b03821660009081526009602052604081205463ffffffff16908162000877576000620008a9565b6001600160a01b038416600090815260086020908152604080832063ffffffff60001987011684529091529020600101545b90506000620008c78483620006e260201b620025d21790919060201c565b9050620008d7858484846200092f565b505050505050565b6000620008ff600454600354620006e260201b620025d21790919060201c565b905090565b600082821115620009295760405162461bcd60e51b8152600401620000f69062000d42565b50900390565b60006200095643604051806060016040528060348152602001620057256034913962000a8d565b905060008463ffffffff16118015620009a057506001600160a01b038516600090815260086020908152604080832063ffffffff6000198901811685529252909120548282169116145b15620009df576001600160a01b038516600090815260086020908152604080832063ffffffff6000198901168452909152902060010182905562000a50565b60408051808201825263ffffffff808416825260208083018681526001600160a01b038a166000818152600884528681208b8616825284528681209551865490861663ffffffff19918216178755925160019687015590815260099092529390208054928801909116919092161790555b846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051620005d892919062000f06565b600081640100000000841062000ab85760405162461bcd60e51b8152600401620000f6919062000c7e565b509192915050565b82805482825590600052602060002090600f0160109004810192821562000b5e5791602002820160005b8382111562000b2c57835183826101000a81548161ffff021916908361ffff160217905550926020019260020160208160010104928301926001030262000aea565b801562000b5c5782816101000a81549061ffff021916905560020160208160010104928301926001030262000b2c565b505b5062000b6c92915062000bea565b5090565b6040518060e0016040528060006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b6040518060a0016040528060008152602001600060ff1681526020016000815260200160008152602001600081525090565b5b8082111562000b6c57805461ffff1916815560010162000beb565b80516001600160a01b03811681146200029657600080fd5b6000806000806080858703121562000c34578384fd5b62000c40868662000c06565b935062000c51866020870162000c06565b925062000c62866040870162000c06565b915062000c73866060870162000c06565b905092959194509250565b6000602080835283518082850152825b8181101562000cac5785810183015185820160400152820162000c8e565b8181111562000cbe5783604083870101525b50601f01601f1916929092016040019392505050565b6020808252601e908201527f5a4f4e453a206d696e7420746f20746865207a65726f20616464726573730000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526014908201527f4361707065643a20636170206578636565646564000000000000000000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601e908201527f5a4f4e453a3a4164645665737420636c696666203e206475726174696f6e0000604082015260600190565b60208082526021908201527f5a4f4e453a3a4164645665737420496e76616c69642062656e656669636961726040820152607960f81b606082015260800190565b60208082526035908201527f5a4f4e453a20596f7520737065636966696564206f776e65722061646472657360408201527f7320617320616e207661756c7420616464726573730000000000000000000000606082015260800190565b90815260200190565b918252602082015260400190565b93845260208401929092526040830152606082015260800190565b92835260ff919091166020830152604082015260600190565b60805160a05160601c60c05160e05161474d62000fb860003980610fc05280612e5a525080610e8e52806111775280611a575280611cee5280611dae5280611e2752508061178452806117ab5280612168528061218f52806125445250806115d65280611b82525061474d6000f3fe6080604052600436106103b15760003560e01c8063782d6fe1116101e7578063b4b5ea571161010d578063dd62ed3e116100a0578063f1127ed81161006f578063f1127ed814610a41578063f2fde38b14610a6f578063f45f8b9914610a8f578063fbfa77cf14610aaf576103d9565b8063dd62ed3e146109d7578063e30c3978146109f7578063e680be4d14610a0c578063e7a324dc14610a2c576103d9565b8063c3cda520116100dc578063c3cda5201461096d578063c514621c1461098d578063d7d79931146109a2578063db75e17c146109b7576103d9565b8063b4b5ea5714610903578063b5267cb014610923578063b80cdcf614610938578063bffeac211461094d576103d9565b80638c0491ca1161018557806394fc8f0a1161015457806394fc8f0a146108a457806395d89b41146108b9578063a9059cbb146108ce578063aa56c8e7146108ee576103d9565b80638c0491ca1461083a5780638cfd91a61461085a5780638da5cb5b1461086f578063929ec53714610884576103d9565b806379cc6790116101c157806379cc6790146107c55780637e0e71ac146107e55780637ecebe00146107fa57806384ab8bb81461081a576103d9565b8063782d6fe11461077b578063790ca4131461079b57806379ba5097146107b0576103d9565b806337e1a88e116102d757806364edfbf01161026a57806370a082311161023957806370a082311461071c578063712df89f1461073c578063715018a61461075157806377ee5cfe14610766576103d9565b806364edfbf01461069a5780636b2d95d4146106a25780636fcfff45146106cf5780636fd0d888146106fc576103d9565b8063587cde1e116102a6578063587cde1e146105fa5780635c19a95c146106275780635c712bc01461064757806364d2f4c71461067a576103d9565b806337e1a88e1461059b578063408a2592146105b057806342966c68146105c557806351b2ea1f146105e5576103d9565b806318160ddd1161034f5780632c4e722e1161031e5780632c4e722e14610521578063313ce56714610536578063355274ea14610558578063365ad85f1461056d576103d9565b806318160ddd146104b757806320606b70146104cc57806323b872dd146104e1578063259da3d614610501576103d9565b806306fdde031161038b57806306fdde0314610433578063095ea7b31461045557806309f9b481146104825780630be7748514610497576103d9565b806301179422146103de5780630452a74914610409578063067f45b91461041e576103d9565b366103d95760405162461bcd60e51b81526004016103ce90613fa6565b60405180910390fd5b005b600080fd5b3480156103ea57600080fd5b506103f3610ac4565b60405161040091906139e7565b60405180910390f35b34801561041557600080fd5b506103f3610aca565b34801561042a57600080fd5b506103f3610ad1565b34801561043f57600080fd5b50610448610ad7565b6040516104009190613a56565b34801561046157600080fd5b50610475610470366004613804565b610afe565b60405161040091906139dc565b34801561048e57600080fd5b506103f3610b1c565b3480156104a357600080fd5b506103f36104b2366004613775565b610b22565b3480156104c357600080fd5b506103f3610c65565b3480156104d857600080fd5b506103f3610c83565b3480156104ed57600080fd5b506104756104fc3660046137c4565b610ca7565b34801561050d57600080fd5b506103d761051c366004613775565b610d73565b34801561052d57600080fd5b506103f3610e8a565b34801561054257600080fd5b5061054b610ec2565b6040516104009190614672565b34801561056457600080fd5b506103f3610ec7565b34801561057957600080fd5b5061058d610588366004613775565b610ed6565b604051610400929190614613565b3480156105a757600080fd5b506103f3610fbe565b3480156105bc57600080fd5b506103f3610fe2565b3480156105d157600080fd5b506103d76105e03660046138cc565b610fe8565b3480156105f157600080fd5b506103f3610ffc565b34801561060657600080fd5b5061061a610615366004613775565b611002565b604051610400919061391a565b34801561063357600080fd5b506103d7610642366004613775565b61101d565b34801561065357600080fd5b50610667610662366004613775565b611027565b604051610400979695949392919061392e565b34801561068657600080fd5b506103d76106953660046138cc565b611071565b6103d7611110565b3480156106ae57600080fd5b506106c26106bd366004613775565b611209565b604051610400919061396b565b3480156106db57600080fd5b506106ef6106ea366004613775565b6112aa565b604051610400919061464b565b34801561070857600080fd5b506103d7610717366004613775565b6112c2565b34801561072857600080fd5b506103f3610737366004613775565b611323565b34801561074857600080fd5b506103f3611356565b34801561075d57600080fd5b506103d761135c565b34801561077257600080fd5b506103f36113e5565b34801561078757600080fd5b506103f3610796366004613804565b6113eb565b3480156107a757600080fd5b506103f36115d4565b3480156107bc57600080fd5b506103d76115f8565b3480156107d157600080fd5b506103d76107e0366004613804565b611683565b3480156107f157600080fd5b506103d76116fc565b34801561080657600080fd5b506103f3610815366004613775565b61180d565b34801561082657600080fd5b506103f3610835366004613775565b61181f565b34801561084657600080fd5b506103d7610855366004613775565b611939565b34801561086657600080fd5b506103f3611a55565b34801561087b57600080fd5b5061061a611a79565b34801561089057600080fd5b506103f361089f366004613775565b611a88565b3480156108b057600080fd5b506103f3611b72565b3480156108c557600080fd5b50610448611c8a565b3480156108da57600080fd5b506104756108e9366004613804565b611cc3565b3480156108fa57600080fd5b50610475611cd0565b34801561090f57600080fd5b506103f361091e366004613775565b611d33565b34801561092f57600080fd5b50610475611d97565b34801561094457600080fd5b506103d7611ddd565b34801561095957600080fd5b506103d7610968366004613775565b611e55565b34801561097957600080fd5b506103d761098836600461382e565b611f01565b34801561099957600080fd5b5061047561210a565b3480156109ae57600080fd5b506103d7612118565b3480156109c357600080fd5b506103d76109d23660046138cc565b6121f2565b3480156109e357600080fd5b506103f36109f2366004613790565b6122bc565b348015610a0357600080fd5b5061061a6122e7565b348015610a1857600080fd5b506103f3610a27366004613775565b6122f6565b348015610a3857600080fd5b506103f36123d6565b348015610a4d57600080fd5b50610a61610a5c36600461388d565b6123fa565b60405161040092919061465c565b348015610a7b57600080fd5b506103d7610a8a366004613775565b612427565b348015610a9b57600080fd5b506103d7610aaa3660046138cc565b6124ae565b348015610abb57600080fd5b5061061a612542565b60165481565b600e545b90565b60125481565b6040518060400160405280600b81526020016a477269645a6f6e652e696f60a81b81525081565b6000610b12610b0b61261f565b8484612623565b5060015b92915050565b60105481565b6001600160a01b0381166000908152600a602090815260408083208054825181850281018501909352808352606093859084015b82821015610bb75760008481526020908190206040805160a081018252600586029092018054835260018082015460ff1684860152600282015492840192909252600381015460608401526004015460808301529083529092019101610b56565b5050505090506000815190506000805b82811015610c3f57610c07848281518110610bde57fe5b602002602001015160200151858381518110610bf657fe5b6020026020010151608001516126d7565b151560011415610c3757610c3286858381518110610c2157fe5b602002602001015160000151612716565b600191505b600101610bc7565b5080610c5d5760405162461bcd60e51b81526004016103ce906142bd565b505050919050565b6000610c7e6004546003546125d290919063ffffffff16565b905090565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6001600160a01b038316600081815260056020908152604080832033808552925282205491929091908214801590610ce157506000198114155b15610d5c576000610cf282866125f7565b6001600160a01b03808916600081815260056020908152604080832094891680845294909152908190208490555192935090917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610d529085906139e7565b60405180910390a3505b610d678686866129a0565b50600195945050505050565b6017546001600160a01b03163314610d9d5760405162461bcd60e51b81526004016103ce90613aa9565b6001600160a01b038082166000818152601460205260409020805490921614610dd85760405162461bcd60e51b81526004016103ce90613d56565b600681015460ff1615610dfd5760405162461bcd60e51b81526004016103ce906140ce565b6000610e1a826005015483600401546125f790919063ffffffff16565b90508015610e785760048201546005830155610e368382612ada565b826001600160a01b03167f3552bfeaaadccee76f56971ef880969c9fe7ec6af186859930f738924cc0ede982604051610e6f91906139e7565b60405180910390a25b50600601805460ff1916600117905550565b60007f00000000000000000000000000000000000000000000000000000000000000004210610ebb57600e54610c7e565b50600d5490565b601281565b6a17293b0a9e69fd9c00000090565b6001600160a01b03808216600081815260146020526040812080549193849391921614610f0a576000809250925050610fb9565b8060020154421015610f255760050154600092509050610fb9565b600681015460ff16151560011415610f4557600501549150819050610fb9565b42610f61826003015483600101546125d290919063ffffffff16565b11610f7a57806004015481600501549250925050610fb9565b610fad8160030154610fa7610f9c8460010154426125f790919063ffffffff16565b600485015490612566565b906125a0565b60059091015490925090505b915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b600d5490565b610ff9610ff361261f565b82612bbf565b50565b60025490565b6007602052600090815260409020546001600160a01b031681565b610ff93382612cc3565b60146020526000908152604090208054600182015460028301546003840154600485015460058601546006909601546001600160a01b039095169593949293919290919060ff1687565b61107961261f565b6001600160a01b031661108a611a79565b6001600160a01b0316146110b05760405162461bcd60e51b81526004016103ce906141f6565b806000106110d05760405162461bcd60e51b81526004016103ce90613e47565b600d8190556040517f75990a60d01435e02fb3cf68b03da25cad152b95f63f3fab6fde582b9d110487906111059083906139e7565b60405180910390a150565b33321461112f5760405162461bcd60e51b81526004016103ce90614522565b600061113961261f565b90506001600160a01b03811661114e57600080fd5b662386f26fc100003410156111755760405162461bcd60e51b81526004016103ce906145b6565b7f00000000000000000000000000000000000000000000000000000000000000004210156111cf5760135460ff16156111c05760405162461bcd60e51b81526004016103ce90613cf9565b6111ca8134612d52565b610ff9565b6111d7612f68565b601354610100900460ff16156111ff5760405162461bcd60e51b81526004016103ce90613b63565b610ff98134612fef565b6001600160a01b0381166000908152600a602090815260408083208054825181850281018501909352808352606094859484015b8282101561129e5760008481526020908190206040805160a081018252600586029092018054835260018082015460ff168486015260028201549284019290925260038101546060840152600401546080830152908352909201910161123d565b50929695505050505050565b60096020526000908152604090205463ffffffff1681565b6112ca61261f565b6001600160a01b03166112db611a79565b6001600160a01b0316146113015760405162461bcd60e51b81526004016103ce906141f6565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526006602052604081205461134f61134884611a88565b82906125d2565b9392505050565b600f5481565b61136461261f565b6001600160a01b0316611375611a79565b6001600160a01b03161461139b5760405162461bcd60e51b81526004016103ce906141f6565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60115481565b600043821061140c5760405162461bcd60e51b81526004016103ce906144c5565b6001600160a01b03831660009081526009602052604090205463ffffffff168061143a576000915050610b16565b6001600160a01b038416600090815260086020908152604080832063ffffffff6000198601811685529252909120541683106114a9576001600160a01b03841660009081526008602090815260408083206000199490940163ffffffff16835292905220600101549050610b16565b6001600160a01b038416600090815260086020908152604080832083805290915290205463ffffffff168310156114e4576000915050610b16565b600060001982015b8163ffffffff168163ffffffff16111561159d57600282820363ffffffff16048103611516613715565b506001600160a01b038716600090815260086020908152604080832063ffffffff80861685529083529281902081518083019092528054909316808252600190930154918101919091529087141561157857602001519450610b169350505050565b805163ffffffff1687111561158f57819350611596565b6001820392505b50506114ec565b506001600160a01b038516600090815260086020908152604080832063ffffffff9094168352929052206001015491505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001546001600160a01b031633146116225760405162461bcd60e51b81526004016103ce90613f49565b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b600061168d61261f565b6001600160a01b038085166000908152600560209081526040808320938516835292815282822054835160608101909452602d8085529495509391926116de9287926146b79083013984919061318d565b90506116eb858483612623565b6116f58585612bbf565b5050505050565b6017546001600160a01b031633146117265760405162461bcd60e51b81526004016103ce90613aa9565b6016546a0d8c99944ac09085800000116117525760405162461bcd60e51b81526004016103ce906143ae565b60165460009061176e906a0d8c99944ac09085800000906125f7565b6a0d8c99944ac0908580000060165590506117a97f000000000000000000000000000000000000000000000000000000000000000082612ada565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f5dfcd58f0dcb57f470a1160f7e369fafa49ce56fc620b91fc1c80199706745498260405161180291906139e7565b60405180910390a250565b600c6020526000908152604090205481565b6001600160a01b038116600090815260066020908152604080832054600a8352818420805483518186028101860190945280845291936060939290869084015b828210156118c05760008481526020908190206040805160a081018252600586029092018054835260018082015460ff168486015260028201549284019290925260038101546060840152600401546080830152908352909201910161185f565b5050825192935060009150505b8181101561192f57600160ff168382815181106118e657fe5b60200260200101516020015160ff16146119275761192483828151811061190957fe5b602002602001015160400151856125d290919063ffffffff16565b93505b6001016118cd565b5091949350505050565b6017546001600160a01b031633146119635760405162461bcd60e51b81526004016103ce90613aa9565b6001600160a01b0381166000908152600a60209081526040808320805482518185028101850190935280835260609492939192909184015b828210156119fc5760008481526020908190206040805160a081018252600586029092018054835260018082015460ff168486015260028201549284019290925260038101546060840152600401546080830152908352909201910161199b565b5050825192935060009150505b81811015611a4f57600160ff16838281518110611a2257fe5b60200260200101516020015160ff161415611a4757611a4784848381518110610c2157fe5b600101611a09565b50505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b031690565b6001600160a01b0381166000908152600a602090815260408083208054825181850281018501909352808352606093859084015b82821015611b1d5760008481526020908190206040805160a081018252600586029092018054835260018082015460ff1684860152600282015492840192909252600381015460608401526004015460808301529083529092019101611abc565b5050505090506000815190506000805b82811015611b6957611b5f848281518110611b4457fe5b602002602001015160400151836125d290919063ffffffff16565b9150600101611b2d565b50949350505050565b600080611ba662784ce0610fa7427f00000000000000000000000000000000000000000000000000000000000000006125f7565b90506000611bb58260046125a0565b90506000611bc48360046131b9565b90506a0d8c99944ac09085800000600183011c8215611c1357611c0c611bfa84610fa76a0d8c99944ac0908580000060026125a0565b6a0d8c99944ac09085800000906125f7565b9450611c18565b600094505b60005b828160ff1611611c82576000611c6b61271061ffff16610fa760158560ff1681548110611c4457fe5b600091825260209091206010820401548791600f166002026101000a900461ffff16612566565b9050611c7787826125d2565b965050600101611c1b565b505050505090565b6040518060400160405280600481526020017f5a4f4e450000000000000000000000000000000000000000000000000000000081525081565b6000610b123384846129a0565b601354600090610100900460ff1615611ceb57506001610ace565b427f000000000000000000000000000000000000000000000000000000000000000011611d1a57506000610ace565b60135460ff1615611d2d57506001610ace565b50600090565b6001600160a01b03811660009081526009602052604081205463ffffffff1680611d5e57600061134f565b6001600160a01b038316600090815260086020908152604080832063ffffffff6000198601168452909152902060010154915050919050565b60135460009060ff16151560011480611dd05750427f000000000000000000000000000000000000000000000000000000000000000011155b15611d2d57506001610ace565b611de561261f565b6001600160a01b0316611df6611a79565b6001600160a01b031614611e1c5760405162461bcd60e51b81526004016103ce906141f6565b611e24612f68565b427f000000000000000000000000000000000000000000000000000000000000000011611e5357611e536131eb565b565b600080611e6183610ed6565b91509150818110611e845760405162461bcd60e51b81526004016103ce90613c2e565b6000611e9083836125f7565b6001600160a01b03851660009081526014602052604090206005018490559050611eba8482612ada565b836001600160a01b03167f3552bfeaaadccee76f56971ef880969c9fe7ec6af186859930f738924cc0ede982604051611ef391906139e7565b60405180910390a250505050565b60408051808201909152600b81526a477269645a6f6e652e696f60a81b60209091015260007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8667f401f2289580892741b17d81b8e6fd14c6c8b0684a13495ce86820224e1e558ae611f70613272565b30604051602001611f849493929190613a14565b60405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf888888604051602001611fd594939291906139f0565b604051602081830303815290604052805190602001209050600082826040516020016120029291906138e4565b60405160208183030381529060405280519060200120905060006001828888886040516000815260200160405260405161203f9493929190613a38565b6020604051602081039080840390855afa158015612061573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166120945760405162461bcd60e51b81526004016103ce90614559565b6001600160a01b0381166000908152600c6020526040902080546001810190915589146120d35760405162461bcd60e51b81526004016103ce90614351565b874211156120f35760405162461bcd60e51b81526004016103ce9061413c565b6120fd818b612cc3565b505050505b505050505050565b601354610100900460ff1690565b6000612122611b72565b905080601654106121455760405162461bcd60e51b81526004016103ce90614260565b600061215c601654836125f790919063ffffffff16565b6016839055905061218d7f000000000000000000000000000000000000000000000000000000000000000082612ada565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f5dfcd58f0dcb57f470a1160f7e369fafa49ce56fc620b91fc1c8019970674549826040516121e691906139e7565b60405180910390a25050565b6121fa61261f565b6001600160a01b031661220b611a79565b6001600160a01b0316146122315760405162461bcd60e51b81526004016103ce906141f6565b80601054106122525760405162461bcd60e51b81526004016103ce90613dc4565b61228261226a601054836125f790919063ffffffff16565b601254610fa7906958f03ee118a13e800000906125f7565b600e81905560028290556040517fbd0d57d866d23c5e05fefb5a23f0f22a28efec80fa288d6ae00b47405d3ee8a891611105918490614613565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b6001546001600160a01b031690565b6001600160a01b0381166000908152600a602090815260408083208054825181850281018501909352808352606093859084015b8282101561238b5760008481526020908190206040805160a081018252600586029092018054835260018082015460ff168486015260028201549284019290925260038101546060840152600401546080830152908352909201910161232a565b5050505090506000815190506000805b82811015611b69576123b2848281518110610bde57fe5b1515600114156123ce576123cb848281518110611b4457fe5b91505b60010161239b565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b60086020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b61242f61261f565b6001600160a01b0316612440611a79565b6001600160a01b0316146124665760405162461bcd60e51b81526004016103ce906141f6565b6001600160a01b03811661248c5760405162461bcd60e51b81526004016103ce90613b06565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6124b661261f565b6001600160a01b03166124c7611a79565b6001600160a01b0316146124ed5760405162461bcd60e51b81526004016103ce906141f6565b8060001061250d5760405162461bcd60e51b81526004016103ce90613e47565b600e8190556040517f79e6b4d7a5586ff3d8254c33e90330f31d37922340f0d818b65f50c7291ba5b7906111059083906139e7565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008261257557506000610b16565b8282028284828161258257fe5b041461134f5760405162461bcd60e51b81526004016103ce90614199565b60008082116125c15760405162461bcd60e51b81526004016103ce90613e7e565b8183816125ca57fe5b049392505050565b60008282018381101561134f5760405162461bcd60e51b81526004016103ce90613bf7565b6000828211156126195760405162461bcd60e51b81526004016103ce90613d8d565b50900390565b3390565b6001600160a01b0383166126495760405162461bcd60e51b81526004016103ce90613eec565b6001600160a01b03821661266f5760405162461bcd60e51b81526004016103ce9061403a565b6001600160a01b0380841660008181526005602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906126ca9085906139e7565b60405180910390a3505050565b60004282116126e857506001610b16565b60ff83161580156127005750601354610100900460ff165b1561270d57506001610b16565b50600092915050565b6001600160a01b0382166000908152600a6020526040902080548061274d5760405162461bcd60e51b81526004016103ce90614003565b60008060005b83811015612794578585828154811061276857fe5b906000526020600020906005020160000154141561278c5780915060019250612794565b600101612753565b506001821515146127b75760405162461bcd60e51b81526004016103ce90613c65565b60008482815481106127c557fe5b906000526020600020906005020160020154905060008583815481106127e757fe5b600091825260209091206001600590920201015460045460ff909116915061280f90836125f7565b60045560035461281f90836125d2565b6003556000198501808410156128a25786818154811061283b57fe5b906000526020600020906005020187858154811061285557fe5b600091825260209091208254600590920201908155600180830154908201805460ff191660ff90921691909117905560028083015490820155600380830154908201556004918201549101555b868054806128ac57fe5b6000828152602080822060056000199094019384020182815560018101805460ff191690556002810183905560038101839055600401829055919092556001600160a01b038b16825260069052604090205461290890846125d2565b6001600160a01b038a1660009081526006602052604090205560ff821660011415612952576001600160a01b03808a16600090815260076020526040812054612952921685613276565b886001600160a01b03167f72713ae12cbff1018e930bf23f6ccdbce7fa0530b38938b35f5bb893bcfd4e66848460405161298d929190614621565b60405180910390a2505050505050505050565b6001600160a01b0383166129c65760405162461bcd60e51b81526004016103ce90613c9c565b6001600160a01b0382166129ec5760405162461bcd60e51b81526004016103ce906142f4565b6129f78383836133b3565b6001600160a01b038316600090815260066020526040902054612a1a90826125f7565b6001600160a01b038085166000908152600660205260408082209390935590841681522054612a4990826125d2565b6001600160a01b0380841660008181526006602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612a9b9085906139e7565b60405180910390a36001600160a01b03808416600090815260076020526040808220548584168352912054612ad592918216911683613276565b505050565b6001600160a01b038216612b005760405162461bcd60e51b81526004016103ce90613bc0565b612b0c600083836133b3565b600354612b1990826125d2565b6003556001600160a01b038216600090815260066020526040902054612b3f90826125d2565b6001600160a01b0383166000818152600660205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612b8e9085906139e7565b60405180910390a36001600160a01b03808316600090815260076020526040812054612bbb921683613276565b5050565b6001600160a01b038216612be55760405162461bcd60e51b81526004016103ce9061422b565b612bf1826000836133b3565b612c2e81604051806060016040528060218152602001614696602191396001600160a01b038516600090815260066020526040902054919061318d565b6001600160a01b038316600090815260066020526040902055600354612c5490826125f7565b6003556040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612c959085906139e7565b60405180910390a36001600160a01b03808316600090815260076020526040812054612bbb92169083613276565b6001600160a01b0380831660009081526007602052604081205490911690612cea8461181f565b6001600160a01b0385811660008181526007602052604080822080546001600160a01b031916898616908117909155905194955093928616927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4611a4f828483613276565b6000612d72600f5468056bc75e2d631000006125f790919063ffffffff16565b90506000818310612d835781612d85565b825b905080830381612da75760405162461bcd60e51b81526004016103ce90613eb5565b6000612dbe600d548461256690919063ffffffff16565b90506000612dcd82600a6125a0565b90506000678ac7230489e800008510612dee57612deb83600a6125a0565b90505b612e0281612dfc85856125d2565b906125d2565b600f54909350612e1290866125d2565b600f55601154612e2290846125d2565b60118190556a0250ec4ddca432f60000001015612e515760405162461bcd60e51b81526004016103ce9061440b565b612e7e888460007f00000000000000000000000000000000000000000000000000000000000000006133f7565b6000612e88611a79565b6040519091506001600160a01b0382169087156108fc029088906000818181858888f19350505050158015612ec1573d6000803e3d6000fd5b50886001600160a01b03167f579d39089a1b97845971a326ca93d594877a8103906d038b93fd99e8508f59978786604051612efd929190614613565b60405180910390a28415612f43576040516001600160a01b038a169086156108fc029087906000818181858888f19350505050158015612f41573d6000803e3d6000fd5b505b600f5468056bc75e2d6310000011612f5d57612f5d612f68565b505050505050505050565b60135460ff1615612f7857611e53565b6013805460ff19166001179055601154600090612fa1906a0250ec4ddca432f6000000906125f7565b90508015612fba57612fba612fb4611a79565b82612ada565b7f9a0fa7ccc193069a32705455c2e134739bca39d58931fe12363d3cebf47a92a4600f54601154604051611105929190614613565b60006130086010546002546125f790919063ffffffff16565b90506000818310613019578161301b565b825b90508083038161303d5760405162461bcd60e51b81526004016103ce90613eb5565b6000613054600e548461256690919063ffffffff16565b60105490915061306490846125d2565b60105560125461307490826125d2565b60128190556958f03ee118a13e80000010156130a25760405162461bcd60e51b81526004016103ce90614468565b6130ac8682612ada565b60006130b6611a79565b6040519091506001600160a01b0382169085156108fc029086906000818181858888f193505050501580156130ef573d6000803e3d6000fd5b50866001600160a01b03167f3c924c24e32dc6d93bf4dc79a699da648d296aefdadcbaea23037dae46257b4a858460405161312b929190614613565b60405180910390a28215613171576040516001600160a01b0388169084156108fc029085906000818181858888f1935050505015801561316f573d6000803e3d6000fd5b505b60105460025411613184576131846131eb565b50505050505050565b600081848411156131b15760405162461bcd60e51b81526004016103ce9190613a56565b505050900390565b60008082116131da5760405162461bcd60e51b81526004016103ce90614097565b8183816131e357fe5b069392505050565b601354610100900460ff161561320057611e53565b6013805461ff00191661010017905560125460009061322a906958f03ee118a13e800000906125f7565b9050801561323d5761323d612fb4611a79565b7fb8855a603ac7881ae8282e6a1b39c138c12e785d66f8582ddacc16f0277613dd601054601254604051611105929190614613565b4690565b816001600160a01b0316836001600160a01b0316141580156132985750600081115b15612ad5576001600160a01b0383161561332a576001600160a01b03831660009081526009602052604081205463ffffffff1690816132d857600061330a565b6001600160a01b038516600090815260086020908152604080832063ffffffff60001987011684529091529020600101545b9050600061331882856125f7565b90506133268684848461358f565b5050505b6001600160a01b03821615612ad5576001600160a01b03821660009081526009602052604081205463ffffffff169081613365576000613397565b6001600160a01b038416600090815260086020908152604080832063ffffffff60001987011684529091529020600101545b905060006133a582856125d2565b90506121028584848461358f565b6001600160a01b038316612ad5576a17293b0a9e69fd9c0000006133d982612dfc610c65565b1115612ad55760405162461bcd60e51b81526004016103ce90614105565b6001600160a01b03841661341d5760405162461bcd60e51b81526004016103ce90613bc0565b613429600085856133b3565b60045461343690846125d2565b60045561344161372c565b506040805160a081018252600b80546001808201909255825260ff85811660208085019182528486018981524260608701908152608087018981526001600160a01b038d166000818152600a86528a81208054808b0182559082529581208a516005909702019586559551978501805460ff191698909716979097179095559051600283015551600382015591516004909201919091559251919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061350b9088906139e7565b60405180910390a360ff8316600114613543576001600160a01b03808616600090815260076020526040812054613543921686613276565b846001600160a01b03167f9298b2b497f03d8c40a216bc1e5142747187dd4687de91e09d789982f96d0f5a85858560405161358093929190614632565b60405180910390a25050505050565b60006135b3436040518060600160405280603481526020016146e4603491396136e5565b905060008463ffffffff161180156135fc57506001600160a01b038516600090815260086020908152604080832063ffffffff6000198901811685529252909120548282169116145b15613639576001600160a01b038516600090815260086020908152604080832063ffffffff600019890116845290915290206001018290556136aa565b60408051808201825263ffffffff808416825260208083018681526001600160a01b038a166000818152600884528681208b8616825284528681209551865490861663ffffffff19918216178755925160019687015590815260099092529390208054928801909116919092161790555b846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051613580929190614613565b600081640100000000841061370d5760405162461bcd60e51b81526004016103ce9190613a56565b509192915050565b604080518082019091526000808252602082015290565b6040518060a0016040528060008152602001600060ff1681526020016000815260200160008152602001600081525090565b80356001600160a01b0381168114610b1657600080fd5b600060208284031215613786578081fd5b61134f838361375e565b600080604083850312156137a2578081fd5b6137ac848461375e565b91506137bb846020850161375e565b90509250929050565b6000806000606084860312156137d8578081fd5b83356137e381614680565b925060208401356137f381614680565b929592945050506040919091013590565b60008060408385031215613816578182fd5b613820848461375e565b946020939093013593505050565b60008060008060008060c08789031215613846578182fd5b613850888861375e565b95506020870135945060408701359350606087013560ff81168114613873578283fd5b9598949750929560808101359460a0909101359350915050565b6000806040838503121561389f578182fd5b6138a9848461375e565b9150602083013563ffffffff811681146138c1578182fd5b809150509250929050565b6000602082840312156138dd578081fd5b5035919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b03979097168752602087019590955260408601939093526060850191909152608084015260a0830152151560c082015260e00190565b602080825282518282018190526000919060409081850190868401855b828110156139cf578151805185528681015160ff16878601528581015186860152606080820151908601526080908101519085015260a09093019290850190600101613988565b5091979650505050505050565b901515815260200190565b90815260200190565b9384526001600160a01b039290921660208401526040830152606082015260800190565b938452602084019290925260408301526001600160a01b0316606082015260800190565b93845260ff9290921660208401526040830152606082015260800190565b6000602080835283518082850152825b81811015613a8257858101830151858201604001528201613a66565b81811115613a935783604083870101525b50601f01601f1916929092016040019392505050565b60208082526039908201527f5a4f4e453a205468652063616c6c6572206973206e6f742074686520676f766560408201527f726e616e63652074696d656c6f636b20636f6e74726163742e00000000000000606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b60208082526022908201527f5a4f4e453a205075626c69632073616c6520616c72656164792066696e69736860408201527f6564000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601e908201527f5a4f4e453a206d696e7420746f20746865207a65726f20616464726573730000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526018908201527f5a4f4e453a204e6f20636c61696d61626c6520746f6b656e0000000000000000604082015260600190565b60208082526014908201527f5a4f4e453a206c6f636b496420696e76616c6964000000000000000000000000604082015260600190565b6020808252603c908201527f5a4f4e453a3a5f7472616e73666572546f6b656e733a2063616e6e6f7420747260408201527f616e736665722066726f6d20746865207a65726f206164647265737300000000606082015260800190565b60208082526023908201527f5a4f4e453a2047656e657369732073616c6520616c72656164792066696e697360408201527f6865640000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526019908201527f5a4f4e453a20496e76616c69642062656e656669636961727900000000000000604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526055908201527f5a4f4e453a20546865206361706163697479206d75737420626520677265617460408201527f6572207468616e2074686520616c726561647920626f7567687420616d6f756e60608201527f7420696e20746865207075626c69632073616c652e0000000000000000000000608082015260a00190565b6020808252601a908201527f5a4f4e453a2054686520726174652063616e277420626520302e000000000000604082015260600190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252601c908201527f5a4f4e453a2054686520616d6f756e742063616e277420626520302e00000000604082015260600190565b60208082526023908201527f5a4f4e453a20617070726f76652066726f6d20746865207a65726f206164647260408201527f6573730000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526032908201527f6163636570744f776e6572736869703a2043616c6c206d75737420636f6d652060408201527f66726f6d2070656e64696e674f776e65722e0000000000000000000000000000606082015260800190565b60208082526036908201527f5a4f4e453a20557365207468652070757263686173652066756e6374696f6e2060408201527f746f2062757920746865205a4f4e4520746f6b656e2e00000000000000000000606082015260800190565b60208082526015908201527f5a4f4e453a204e6f206c6f636b656420746f6b656e0000000000000000000000604082015260600190565b60208082526021908201527f5a4f4e453a20617070726f766520746f20746865207a65726f2061646472657360408201527f7300000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526018908201527f536166654d6174683a206d6f64756c6f206279207a65726f0000000000000000604082015260600190565b60208082526015908201527f5a4f4e453a20416c7265616479207265766f6b65640000000000000000000000604082015260600190565b60208082526014908201527f4361707065643a20636170206578636565646564000000000000000000000000604082015260600190565b60208082526026908201527f5a4f4e453a3a64656c656761746542795369673a207369676e6174757265206560408201527f7870697265640000000000000000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60408201527f7700000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f5a4f4e453a206275726e2066726f6d20746865207a65726f2061646472657373604082015260600190565b6020808252602b908201527f5a4f4e453a204e6f20636c61696d61626c6520746f6b656e20666f722074686560408201527f2065636f73797374656d2e000000000000000000000000000000000000000000606082015260800190565b6020808252601a908201527f5a4f4e453a204e6f20756e6c6f636b61626c6520746f6b656e2e000000000000604082015260600190565b6020808252603a908201527f5a4f4e453a3a5f7472616e73666572546f6b656e733a2063616e6e6f7420747260408201527f616e7366657220746f20746865207a65726f2061646472657373000000000000606082015260800190565b60208082526022908201527f5a4f4e453a3a64656c656761746542795369673a20696e76616c6964206e6f6e60408201527f6365000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252603d908201527f5a4f4e453a20416c6c20746f6b656e7320616c7265616479206861766520626560408201527f656e20636c61696d656420666f72207468652065636f73797374656d2e000000606082015260800190565b60208082526025908201527f5a4f4e453a2047656e6573697320737570706c7920697320696e73756666696360408201527f69656e742e000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f5a4f4e453a205075626c696320737570706c7920697320696e7375666669636960408201527f656e742e00000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526027908201527f5a4f4e453a3a6765745072696f72566f7465733a206e6f74207965742064657460408201527f65726d696e656400000000000000000000000000000000000000000000000000606082015260800190565b60208082526013908201527f5a4f4e453a204f6e6c7920656e642d7573657200000000000000000000000000604082015260600190565b60208082526026908201527f5a4f4e453a3a64656c656761746542795369673a20696e76616c69642073696760408201527f6e61747572650000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602d908201527f5a4f4e453a20546865207075726368617365206d696e696d756d20616d6f756e60408201527f7420697320302e30312045544800000000000000000000000000000000000000606082015260800190565b918252602082015260400190565b91825260ff16602082015260400190565b92835260ff919091166020830152604082015260600190565b63ffffffff91909116815260200190565b63ffffffff929092168252602082015260400190565b60ff91909116815260200190565b6001600160a01b0381168114610ff957600080fdfe5a4f4e453a206275726e20616d6f756e7420657863656564732062616c616e63655a4f4e453a3a6275726e46726f6d3a206275726e20616d6f756e74206578636565647320616c6c6f77616e63655a4f4e453a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473a264697066735822122073ed80619577dbbd25c20305df3c0465e725ac72198be55907de5d72eb86338064736f6c634300060c0033ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5a4f4e453a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473000000000000000000000000ab0b18523e8fe8cbf947c55632e8ab5ce936ae8c0000000000000000000000007205731e9643235aa313d46552c7aa81e559fb6f0000000000000000000000002e229b4172a7157ea0db8caa0ca580636a05dce30000000000000000000000000c1ac3ede7a6a22cf36457bd3759bcea44b0b643
Deployed Bytecode
0x6080604052600436106103b15760003560e01c8063782d6fe1116101e7578063b4b5ea571161010d578063dd62ed3e116100a0578063f1127ed81161006f578063f1127ed814610a41578063f2fde38b14610a6f578063f45f8b9914610a8f578063fbfa77cf14610aaf576103d9565b8063dd62ed3e146109d7578063e30c3978146109f7578063e680be4d14610a0c578063e7a324dc14610a2c576103d9565b8063c3cda520116100dc578063c3cda5201461096d578063c514621c1461098d578063d7d79931146109a2578063db75e17c146109b7576103d9565b8063b4b5ea5714610903578063b5267cb014610923578063b80cdcf614610938578063bffeac211461094d576103d9565b80638c0491ca1161018557806394fc8f0a1161015457806394fc8f0a146108a457806395d89b41146108b9578063a9059cbb146108ce578063aa56c8e7146108ee576103d9565b80638c0491ca1461083a5780638cfd91a61461085a5780638da5cb5b1461086f578063929ec53714610884576103d9565b806379cc6790116101c157806379cc6790146107c55780637e0e71ac146107e55780637ecebe00146107fa57806384ab8bb81461081a576103d9565b8063782d6fe11461077b578063790ca4131461079b57806379ba5097146107b0576103d9565b806337e1a88e116102d757806364edfbf01161026a57806370a082311161023957806370a082311461071c578063712df89f1461073c578063715018a61461075157806377ee5cfe14610766576103d9565b806364edfbf01461069a5780636b2d95d4146106a25780636fcfff45146106cf5780636fd0d888146106fc576103d9565b8063587cde1e116102a6578063587cde1e146105fa5780635c19a95c146106275780635c712bc01461064757806364d2f4c71461067a576103d9565b806337e1a88e1461059b578063408a2592146105b057806342966c68146105c557806351b2ea1f146105e5576103d9565b806318160ddd1161034f5780632c4e722e1161031e5780632c4e722e14610521578063313ce56714610536578063355274ea14610558578063365ad85f1461056d576103d9565b806318160ddd146104b757806320606b70146104cc57806323b872dd146104e1578063259da3d614610501576103d9565b806306fdde031161038b57806306fdde0314610433578063095ea7b31461045557806309f9b481146104825780630be7748514610497576103d9565b806301179422146103de5780630452a74914610409578063067f45b91461041e576103d9565b366103d95760405162461bcd60e51b81526004016103ce90613fa6565b60405180910390fd5b005b600080fd5b3480156103ea57600080fd5b506103f3610ac4565b60405161040091906139e7565b60405180910390f35b34801561041557600080fd5b506103f3610aca565b34801561042a57600080fd5b506103f3610ad1565b34801561043f57600080fd5b50610448610ad7565b6040516104009190613a56565b34801561046157600080fd5b50610475610470366004613804565b610afe565b60405161040091906139dc565b34801561048e57600080fd5b506103f3610b1c565b3480156104a357600080fd5b506103f36104b2366004613775565b610b22565b3480156104c357600080fd5b506103f3610c65565b3480156104d857600080fd5b506103f3610c83565b3480156104ed57600080fd5b506104756104fc3660046137c4565b610ca7565b34801561050d57600080fd5b506103d761051c366004613775565b610d73565b34801561052d57600080fd5b506103f3610e8a565b34801561054257600080fd5b5061054b610ec2565b6040516104009190614672565b34801561056457600080fd5b506103f3610ec7565b34801561057957600080fd5b5061058d610588366004613775565b610ed6565b604051610400929190614613565b3480156105a757600080fd5b506103f3610fbe565b3480156105bc57600080fd5b506103f3610fe2565b3480156105d157600080fd5b506103d76105e03660046138cc565b610fe8565b3480156105f157600080fd5b506103f3610ffc565b34801561060657600080fd5b5061061a610615366004613775565b611002565b604051610400919061391a565b34801561063357600080fd5b506103d7610642366004613775565b61101d565b34801561065357600080fd5b50610667610662366004613775565b611027565b604051610400979695949392919061392e565b34801561068657600080fd5b506103d76106953660046138cc565b611071565b6103d7611110565b3480156106ae57600080fd5b506106c26106bd366004613775565b611209565b604051610400919061396b565b3480156106db57600080fd5b506106ef6106ea366004613775565b6112aa565b604051610400919061464b565b34801561070857600080fd5b506103d7610717366004613775565b6112c2565b34801561072857600080fd5b506103f3610737366004613775565b611323565b34801561074857600080fd5b506103f3611356565b34801561075d57600080fd5b506103d761135c565b34801561077257600080fd5b506103f36113e5565b34801561078757600080fd5b506103f3610796366004613804565b6113eb565b3480156107a757600080fd5b506103f36115d4565b3480156107bc57600080fd5b506103d76115f8565b3480156107d157600080fd5b506103d76107e0366004613804565b611683565b3480156107f157600080fd5b506103d76116fc565b34801561080657600080fd5b506103f3610815366004613775565b61180d565b34801561082657600080fd5b506103f3610835366004613775565b61181f565b34801561084657600080fd5b506103d7610855366004613775565b611939565b34801561086657600080fd5b506103f3611a55565b34801561087b57600080fd5b5061061a611a79565b34801561089057600080fd5b506103f361089f366004613775565b611a88565b3480156108b057600080fd5b506103f3611b72565b3480156108c557600080fd5b50610448611c8a565b3480156108da57600080fd5b506104756108e9366004613804565b611cc3565b3480156108fa57600080fd5b50610475611cd0565b34801561090f57600080fd5b506103f361091e366004613775565b611d33565b34801561092f57600080fd5b50610475611d97565b34801561094457600080fd5b506103d7611ddd565b34801561095957600080fd5b506103d7610968366004613775565b611e55565b34801561097957600080fd5b506103d761098836600461382e565b611f01565b34801561099957600080fd5b5061047561210a565b3480156109ae57600080fd5b506103d7612118565b3480156109c357600080fd5b506103d76109d23660046138cc565b6121f2565b3480156109e357600080fd5b506103f36109f2366004613790565b6122bc565b348015610a0357600080fd5b5061061a6122e7565b348015610a1857600080fd5b506103f3610a27366004613775565b6122f6565b348015610a3857600080fd5b506103f36123d6565b348015610a4d57600080fd5b50610a61610a5c36600461388d565b6123fa565b60405161040092919061465c565b348015610a7b57600080fd5b506103d7610a8a366004613775565b612427565b348015610a9b57600080fd5b506103d7610aaa3660046138cc565b6124ae565b348015610abb57600080fd5b5061061a612542565b60165481565b600e545b90565b60125481565b6040518060400160405280600b81526020016a477269645a6f6e652e696f60a81b81525081565b6000610b12610b0b61261f565b8484612623565b5060015b92915050565b60105481565b6001600160a01b0381166000908152600a602090815260408083208054825181850281018501909352808352606093859084015b82821015610bb75760008481526020908190206040805160a081018252600586029092018054835260018082015460ff1684860152600282015492840192909252600381015460608401526004015460808301529083529092019101610b56565b5050505090506000815190506000805b82811015610c3f57610c07848281518110610bde57fe5b602002602001015160200151858381518110610bf657fe5b6020026020010151608001516126d7565b151560011415610c3757610c3286858381518110610c2157fe5b602002602001015160000151612716565b600191505b600101610bc7565b5080610c5d5760405162461bcd60e51b81526004016103ce906142bd565b505050919050565b6000610c7e6004546003546125d290919063ffffffff16565b905090565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6001600160a01b038316600081815260056020908152604080832033808552925282205491929091908214801590610ce157506000198114155b15610d5c576000610cf282866125f7565b6001600160a01b03808916600081815260056020908152604080832094891680845294909152908190208490555192935090917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610d529085906139e7565b60405180910390a3505b610d678686866129a0565b50600195945050505050565b6017546001600160a01b03163314610d9d5760405162461bcd60e51b81526004016103ce90613aa9565b6001600160a01b038082166000818152601460205260409020805490921614610dd85760405162461bcd60e51b81526004016103ce90613d56565b600681015460ff1615610dfd5760405162461bcd60e51b81526004016103ce906140ce565b6000610e1a826005015483600401546125f790919063ffffffff16565b90508015610e785760048201546005830155610e368382612ada565b826001600160a01b03167f3552bfeaaadccee76f56971ef880969c9fe7ec6af186859930f738924cc0ede982604051610e6f91906139e7565b60405180910390a25b50600601805460ff1916600117905550565b60007f00000000000000000000000000000000000000000000000000000000612e75924210610ebb57600e54610c7e565b50600d5490565b601281565b6a17293b0a9e69fd9c00000090565b6001600160a01b03808216600081815260146020526040812080549193849391921614610f0a576000809250925050610fb9565b8060020154421015610f255760050154600092509050610fb9565b600681015460ff16151560011415610f4557600501549150819050610fb9565b42610f61826003015483600101546125d290919063ffffffff16565b11610f7a57806004015481600501549250925050610fb9565b610fad8160030154610fa7610f9c8460010154426125f790919063ffffffff16565b600485015490612566565b906125a0565b60059091015490925090505b915091565b7f000000000000000000000000000000000000000000000000000000006156029281565b600d5490565b610ff9610ff361261f565b82612bbf565b50565b60025490565b6007602052600090815260409020546001600160a01b031681565b610ff93382612cc3565b60146020526000908152604090208054600182015460028301546003840154600485015460058601546006909601546001600160a01b039095169593949293919290919060ff1687565b61107961261f565b6001600160a01b031661108a611a79565b6001600160a01b0316146110b05760405162461bcd60e51b81526004016103ce906141f6565b806000106110d05760405162461bcd60e51b81526004016103ce90613e47565b600d8190556040517f75990a60d01435e02fb3cf68b03da25cad152b95f63f3fab6fde582b9d110487906111059083906139e7565b60405180910390a150565b33321461112f5760405162461bcd60e51b81526004016103ce90614522565b600061113961261f565b90506001600160a01b03811661114e57600080fd5b662386f26fc100003410156111755760405162461bcd60e51b81526004016103ce906145b6565b7f00000000000000000000000000000000000000000000000000000000612e75924210156111cf5760135460ff16156111c05760405162461bcd60e51b81526004016103ce90613cf9565b6111ca8134612d52565b610ff9565b6111d7612f68565b601354610100900460ff16156111ff5760405162461bcd60e51b81526004016103ce90613b63565b610ff98134612fef565b6001600160a01b0381166000908152600a602090815260408083208054825181850281018501909352808352606094859484015b8282101561129e5760008481526020908190206040805160a081018252600586029092018054835260018082015460ff168486015260028201549284019290925260038101546060840152600401546080830152908352909201910161123d565b50929695505050505050565b60096020526000908152604090205463ffffffff1681565b6112ca61261f565b6001600160a01b03166112db611a79565b6001600160a01b0316146113015760405162461bcd60e51b81526004016103ce906141f6565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526006602052604081205461134f61134884611a88565b82906125d2565b9392505050565b600f5481565b61136461261f565b6001600160a01b0316611375611a79565b6001600160a01b03161461139b5760405162461bcd60e51b81526004016103ce906141f6565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60115481565b600043821061140c5760405162461bcd60e51b81526004016103ce906144c5565b6001600160a01b03831660009081526009602052604090205463ffffffff168061143a576000915050610b16565b6001600160a01b038416600090815260086020908152604080832063ffffffff6000198601811685529252909120541683106114a9576001600160a01b03841660009081526008602090815260408083206000199490940163ffffffff16835292905220600101549050610b16565b6001600160a01b038416600090815260086020908152604080832083805290915290205463ffffffff168310156114e4576000915050610b16565b600060001982015b8163ffffffff168163ffffffff16111561159d57600282820363ffffffff16048103611516613715565b506001600160a01b038716600090815260086020908152604080832063ffffffff80861685529083529281902081518083019092528054909316808252600190930154918101919091529087141561157857602001519450610b169350505050565b805163ffffffff1687111561158f57819350611596565b6001820392505b50506114ec565b506001600160a01b038516600090815260086020908152604080832063ffffffff9094168352929052206001015491505092915050565b7f0000000000000000000000000000000000000000000000000000000060b7ce9281565b6001546001600160a01b031633146116225760405162461bcd60e51b81526004016103ce90613f49565b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b600061168d61261f565b6001600160a01b038085166000908152600560209081526040808320938516835292815282822054835160608101909452602d8085529495509391926116de9287926146b79083013984919061318d565b90506116eb858483612623565b6116f58585612bbf565b5050505050565b6017546001600160a01b031633146117265760405162461bcd60e51b81526004016103ce90613aa9565b6016546a0d8c99944ac09085800000116117525760405162461bcd60e51b81526004016103ce906143ae565b60165460009061176e906a0d8c99944ac09085800000906125f7565b6a0d8c99944ac0908580000060165590506117a97f0000000000000000000000007205731e9643235aa313d46552c7aa81e559fb6f82612ada565b7f0000000000000000000000007205731e9643235aa313d46552c7aa81e559fb6f6001600160a01b03167f5dfcd58f0dcb57f470a1160f7e369fafa49ce56fc620b91fc1c80199706745498260405161180291906139e7565b60405180910390a250565b600c6020526000908152604090205481565b6001600160a01b038116600090815260066020908152604080832054600a8352818420805483518186028101860190945280845291936060939290869084015b828210156118c05760008481526020908190206040805160a081018252600586029092018054835260018082015460ff168486015260028201549284019290925260038101546060840152600401546080830152908352909201910161185f565b5050825192935060009150505b8181101561192f57600160ff168382815181106118e657fe5b60200260200101516020015160ff16146119275761192483828151811061190957fe5b602002602001015160400151856125d290919063ffffffff16565b93505b6001016118cd565b5091949350505050565b6017546001600160a01b031633146119635760405162461bcd60e51b81526004016103ce90613aa9565b6001600160a01b0381166000908152600a60209081526040808320805482518185028101850190935280835260609492939192909184015b828210156119fc5760008481526020908190206040805160a081018252600586029092018054835260018082015460ff168486015260028201549284019290925260038101546060840152600401546080830152908352909201910161199b565b5050825192935060009150505b81811015611a4f57600160ff16838281518110611a2257fe5b60200260200101516020015160ff161415611a4757611a4784848381518110610c2157fe5b600101611a09565b50505050565b7f00000000000000000000000000000000000000000000000000000000612e759281565b6000546001600160a01b031690565b6001600160a01b0381166000908152600a602090815260408083208054825181850281018501909352808352606093859084015b82821015611b1d5760008481526020908190206040805160a081018252600586029092018054835260018082015460ff1684860152600282015492840192909252600381015460608401526004015460808301529083529092019101611abc565b5050505090506000815190506000805b82811015611b6957611b5f848281518110611b4457fe5b602002602001015160400151836125d290919063ffffffff16565b9150600101611b2d565b50949350505050565b600080611ba662784ce0610fa7427f0000000000000000000000000000000000000000000000000000000060b7ce926125f7565b90506000611bb58260046125a0565b90506000611bc48360046131b9565b90506a0d8c99944ac09085800000600183011c8215611c1357611c0c611bfa84610fa76a0d8c99944ac0908580000060026125a0565b6a0d8c99944ac09085800000906125f7565b9450611c18565b600094505b60005b828160ff1611611c82576000611c6b61271061ffff16610fa760158560ff1681548110611c4457fe5b600091825260209091206010820401548791600f166002026101000a900461ffff16612566565b9050611c7787826125d2565b965050600101611c1b565b505050505090565b6040518060400160405280600481526020017f5a4f4e450000000000000000000000000000000000000000000000000000000081525081565b6000610b123384846129a0565b601354600090610100900460ff1615611ceb57506001610ace565b427f00000000000000000000000000000000000000000000000000000000612e759211611d1a57506000610ace565b60135460ff1615611d2d57506001610ace565b50600090565b6001600160a01b03811660009081526009602052604081205463ffffffff1680611d5e57600061134f565b6001600160a01b038316600090815260086020908152604080832063ffffffff6000198601168452909152902060010154915050919050565b60135460009060ff16151560011480611dd05750427f00000000000000000000000000000000000000000000000000000000612e759211155b15611d2d57506001610ace565b611de561261f565b6001600160a01b0316611df6611a79565b6001600160a01b031614611e1c5760405162461bcd60e51b81526004016103ce906141f6565b611e24612f68565b427f00000000000000000000000000000000000000000000000000000000612e759211611e5357611e536131eb565b565b600080611e6183610ed6565b91509150818110611e845760405162461bcd60e51b81526004016103ce90613c2e565b6000611e9083836125f7565b6001600160a01b03851660009081526014602052604090206005018490559050611eba8482612ada565b836001600160a01b03167f3552bfeaaadccee76f56971ef880969c9fe7ec6af186859930f738924cc0ede982604051611ef391906139e7565b60405180910390a250505050565b60408051808201909152600b81526a477269645a6f6e652e696f60a81b60209091015260007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8667f401f2289580892741b17d81b8e6fd14c6c8b0684a13495ce86820224e1e558ae611f70613272565b30604051602001611f849493929190613a14565b60405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf888888604051602001611fd594939291906139f0565b604051602081830303815290604052805190602001209050600082826040516020016120029291906138e4565b60405160208183030381529060405280519060200120905060006001828888886040516000815260200160405260405161203f9493929190613a38565b6020604051602081039080840390855afa158015612061573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166120945760405162461bcd60e51b81526004016103ce90614559565b6001600160a01b0381166000908152600c6020526040902080546001810190915589146120d35760405162461bcd60e51b81526004016103ce90614351565b874211156120f35760405162461bcd60e51b81526004016103ce9061413c565b6120fd818b612cc3565b505050505b505050505050565b601354610100900460ff1690565b6000612122611b72565b905080601654106121455760405162461bcd60e51b81526004016103ce90614260565b600061215c601654836125f790919063ffffffff16565b6016839055905061218d7f0000000000000000000000007205731e9643235aa313d46552c7aa81e559fb6f82612ada565b7f0000000000000000000000007205731e9643235aa313d46552c7aa81e559fb6f6001600160a01b03167f5dfcd58f0dcb57f470a1160f7e369fafa49ce56fc620b91fc1c8019970674549826040516121e691906139e7565b60405180910390a25050565b6121fa61261f565b6001600160a01b031661220b611a79565b6001600160a01b0316146122315760405162461bcd60e51b81526004016103ce906141f6565b80601054106122525760405162461bcd60e51b81526004016103ce90613dc4565b61228261226a601054836125f790919063ffffffff16565b601254610fa7906958f03ee118a13e800000906125f7565b600e81905560028290556040517fbd0d57d866d23c5e05fefb5a23f0f22a28efec80fa288d6ae00b47405d3ee8a891611105918490614613565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b6001546001600160a01b031690565b6001600160a01b0381166000908152600a602090815260408083208054825181850281018501909352808352606093859084015b8282101561238b5760008481526020908190206040805160a081018252600586029092018054835260018082015460ff168486015260028201549284019290925260038101546060840152600401546080830152908352909201910161232a565b5050505090506000815190506000805b82811015611b69576123b2848281518110610bde57fe5b1515600114156123ce576123cb848281518110611b4457fe5b91505b60010161239b565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b60086020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b61242f61261f565b6001600160a01b0316612440611a79565b6001600160a01b0316146124665760405162461bcd60e51b81526004016103ce906141f6565b6001600160a01b03811661248c5760405162461bcd60e51b81526004016103ce90613b06565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6124b661261f565b6001600160a01b03166124c7611a79565b6001600160a01b0316146124ed5760405162461bcd60e51b81526004016103ce906141f6565b8060001061250d5760405162461bcd60e51b81526004016103ce90613e47565b600e8190556040517f79e6b4d7a5586ff3d8254c33e90330f31d37922340f0d818b65f50c7291ba5b7906111059083906139e7565b7f0000000000000000000000007205731e9643235aa313d46552c7aa81e559fb6f81565b60008261257557506000610b16565b8282028284828161258257fe5b041461134f5760405162461bcd60e51b81526004016103ce90614199565b60008082116125c15760405162461bcd60e51b81526004016103ce90613e7e565b8183816125ca57fe5b049392505050565b60008282018381101561134f5760405162461bcd60e51b81526004016103ce90613bf7565b6000828211156126195760405162461bcd60e51b81526004016103ce90613d8d565b50900390565b3390565b6001600160a01b0383166126495760405162461bcd60e51b81526004016103ce90613eec565b6001600160a01b03821661266f5760405162461bcd60e51b81526004016103ce9061403a565b6001600160a01b0380841660008181526005602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906126ca9085906139e7565b60405180910390a3505050565b60004282116126e857506001610b16565b60ff83161580156127005750601354610100900460ff165b1561270d57506001610b16565b50600092915050565b6001600160a01b0382166000908152600a6020526040902080548061274d5760405162461bcd60e51b81526004016103ce90614003565b60008060005b83811015612794578585828154811061276857fe5b906000526020600020906005020160000154141561278c5780915060019250612794565b600101612753565b506001821515146127b75760405162461bcd60e51b81526004016103ce90613c65565b60008482815481106127c557fe5b906000526020600020906005020160020154905060008583815481106127e757fe5b600091825260209091206001600590920201015460045460ff909116915061280f90836125f7565b60045560035461281f90836125d2565b6003556000198501808410156128a25786818154811061283b57fe5b906000526020600020906005020187858154811061285557fe5b600091825260209091208254600590920201908155600180830154908201805460ff191660ff90921691909117905560028083015490820155600380830154908201556004918201549101555b868054806128ac57fe5b6000828152602080822060056000199094019384020182815560018101805460ff191690556002810183905560038101839055600401829055919092556001600160a01b038b16825260069052604090205461290890846125d2565b6001600160a01b038a1660009081526006602052604090205560ff821660011415612952576001600160a01b03808a16600090815260076020526040812054612952921685613276565b886001600160a01b03167f72713ae12cbff1018e930bf23f6ccdbce7fa0530b38938b35f5bb893bcfd4e66848460405161298d929190614621565b60405180910390a2505050505050505050565b6001600160a01b0383166129c65760405162461bcd60e51b81526004016103ce90613c9c565b6001600160a01b0382166129ec5760405162461bcd60e51b81526004016103ce906142f4565b6129f78383836133b3565b6001600160a01b038316600090815260066020526040902054612a1a90826125f7565b6001600160a01b038085166000908152600660205260408082209390935590841681522054612a4990826125d2565b6001600160a01b0380841660008181526006602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612a9b9085906139e7565b60405180910390a36001600160a01b03808416600090815260076020526040808220548584168352912054612ad592918216911683613276565b505050565b6001600160a01b038216612b005760405162461bcd60e51b81526004016103ce90613bc0565b612b0c600083836133b3565b600354612b1990826125d2565b6003556001600160a01b038216600090815260066020526040902054612b3f90826125d2565b6001600160a01b0383166000818152600660205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612b8e9085906139e7565b60405180910390a36001600160a01b03808316600090815260076020526040812054612bbb921683613276565b5050565b6001600160a01b038216612be55760405162461bcd60e51b81526004016103ce9061422b565b612bf1826000836133b3565b612c2e81604051806060016040528060218152602001614696602191396001600160a01b038516600090815260066020526040902054919061318d565b6001600160a01b038316600090815260066020526040902055600354612c5490826125f7565b6003556040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612c959085906139e7565b60405180910390a36001600160a01b03808316600090815260076020526040812054612bbb92169083613276565b6001600160a01b0380831660009081526007602052604081205490911690612cea8461181f565b6001600160a01b0385811660008181526007602052604080822080546001600160a01b031916898616908117909155905194955093928616927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4611a4f828483613276565b6000612d72600f5468056bc75e2d631000006125f790919063ffffffff16565b90506000818310612d835781612d85565b825b905080830381612da75760405162461bcd60e51b81526004016103ce90613eb5565b6000612dbe600d548461256690919063ffffffff16565b90506000612dcd82600a6125a0565b90506000678ac7230489e800008510612dee57612deb83600a6125a0565b90505b612e0281612dfc85856125d2565b906125d2565b600f54909350612e1290866125d2565b600f55601154612e2290846125d2565b60118190556a0250ec4ddca432f60000001015612e515760405162461bcd60e51b81526004016103ce9061440b565b612e7e888460007f00000000000000000000000000000000000000000000000000000000615602926133f7565b6000612e88611a79565b6040519091506001600160a01b0382169087156108fc029088906000818181858888f19350505050158015612ec1573d6000803e3d6000fd5b50886001600160a01b03167f579d39089a1b97845971a326ca93d594877a8103906d038b93fd99e8508f59978786604051612efd929190614613565b60405180910390a28415612f43576040516001600160a01b038a169086156108fc029087906000818181858888f19350505050158015612f41573d6000803e3d6000fd5b505b600f5468056bc75e2d6310000011612f5d57612f5d612f68565b505050505050505050565b60135460ff1615612f7857611e53565b6013805460ff19166001179055601154600090612fa1906a0250ec4ddca432f6000000906125f7565b90508015612fba57612fba612fb4611a79565b82612ada565b7f9a0fa7ccc193069a32705455c2e134739bca39d58931fe12363d3cebf47a92a4600f54601154604051611105929190614613565b60006130086010546002546125f790919063ffffffff16565b90506000818310613019578161301b565b825b90508083038161303d5760405162461bcd60e51b81526004016103ce90613eb5565b6000613054600e548461256690919063ffffffff16565b60105490915061306490846125d2565b60105560125461307490826125d2565b60128190556958f03ee118a13e80000010156130a25760405162461bcd60e51b81526004016103ce90614468565b6130ac8682612ada565b60006130b6611a79565b6040519091506001600160a01b0382169085156108fc029086906000818181858888f193505050501580156130ef573d6000803e3d6000fd5b50866001600160a01b03167f3c924c24e32dc6d93bf4dc79a699da648d296aefdadcbaea23037dae46257b4a858460405161312b929190614613565b60405180910390a28215613171576040516001600160a01b0388169084156108fc029085906000818181858888f1935050505015801561316f573d6000803e3d6000fd5b505b60105460025411613184576131846131eb565b50505050505050565b600081848411156131b15760405162461bcd60e51b81526004016103ce9190613a56565b505050900390565b60008082116131da5760405162461bcd60e51b81526004016103ce90614097565b8183816131e357fe5b069392505050565b601354610100900460ff161561320057611e53565b6013805461ff00191661010017905560125460009061322a906958f03ee118a13e800000906125f7565b9050801561323d5761323d612fb4611a79565b7fb8855a603ac7881ae8282e6a1b39c138c12e785d66f8582ddacc16f0277613dd601054601254604051611105929190614613565b4690565b816001600160a01b0316836001600160a01b0316141580156132985750600081115b15612ad5576001600160a01b0383161561332a576001600160a01b03831660009081526009602052604081205463ffffffff1690816132d857600061330a565b6001600160a01b038516600090815260086020908152604080832063ffffffff60001987011684529091529020600101545b9050600061331882856125f7565b90506133268684848461358f565b5050505b6001600160a01b03821615612ad5576001600160a01b03821660009081526009602052604081205463ffffffff169081613365576000613397565b6001600160a01b038416600090815260086020908152604080832063ffffffff60001987011684529091529020600101545b905060006133a582856125d2565b90506121028584848461358f565b6001600160a01b038316612ad5576a17293b0a9e69fd9c0000006133d982612dfc610c65565b1115612ad55760405162461bcd60e51b81526004016103ce90614105565b6001600160a01b03841661341d5760405162461bcd60e51b81526004016103ce90613bc0565b613429600085856133b3565b60045461343690846125d2565b60045561344161372c565b506040805160a081018252600b80546001808201909255825260ff85811660208085019182528486018981524260608701908152608087018981526001600160a01b038d166000818152600a86528a81208054808b0182559082529581208a516005909702019586559551978501805460ff191698909716979097179095559051600283015551600382015591516004909201919091559251919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061350b9088906139e7565b60405180910390a360ff8316600114613543576001600160a01b03808616600090815260076020526040812054613543921686613276565b846001600160a01b03167f9298b2b497f03d8c40a216bc1e5142747187dd4687de91e09d789982f96d0f5a85858560405161358093929190614632565b60405180910390a25050505050565b60006135b3436040518060600160405280603481526020016146e4603491396136e5565b905060008463ffffffff161180156135fc57506001600160a01b038516600090815260086020908152604080832063ffffffff6000198901811685529252909120548282169116145b15613639576001600160a01b038516600090815260086020908152604080832063ffffffff600019890116845290915290206001018290556136aa565b60408051808201825263ffffffff808416825260208083018681526001600160a01b038a166000818152600884528681208b8616825284528681209551865490861663ffffffff19918216178755925160019687015590815260099092529390208054928801909116919092161790555b846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051613580929190614613565b600081640100000000841061370d5760405162461bcd60e51b81526004016103ce9190613a56565b509192915050565b604080518082019091526000808252602082015290565b6040518060a0016040528060008152602001600060ff1681526020016000815260200160008152602001600081525090565b80356001600160a01b0381168114610b1657600080fd5b600060208284031215613786578081fd5b61134f838361375e565b600080604083850312156137a2578081fd5b6137ac848461375e565b91506137bb846020850161375e565b90509250929050565b6000806000606084860312156137d8578081fd5b83356137e381614680565b925060208401356137f381614680565b929592945050506040919091013590565b60008060408385031215613816578182fd5b613820848461375e565b946020939093013593505050565b60008060008060008060c08789031215613846578182fd5b613850888861375e565b95506020870135945060408701359350606087013560ff81168114613873578283fd5b9598949750929560808101359460a0909101359350915050565b6000806040838503121561389f578182fd5b6138a9848461375e565b9150602083013563ffffffff811681146138c1578182fd5b809150509250929050565b6000602082840312156138dd578081fd5b5035919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b03979097168752602087019590955260408601939093526060850191909152608084015260a0830152151560c082015260e00190565b602080825282518282018190526000919060409081850190868401855b828110156139cf578151805185528681015160ff16878601528581015186860152606080820151908601526080908101519085015260a09093019290850190600101613988565b5091979650505050505050565b901515815260200190565b90815260200190565b9384526001600160a01b039290921660208401526040830152606082015260800190565b938452602084019290925260408301526001600160a01b0316606082015260800190565b93845260ff9290921660208401526040830152606082015260800190565b6000602080835283518082850152825b81811015613a8257858101830151858201604001528201613a66565b81811115613a935783604083870101525b50601f01601f1916929092016040019392505050565b60208082526039908201527f5a4f4e453a205468652063616c6c6572206973206e6f742074686520676f766560408201527f726e616e63652074696d656c6f636b20636f6e74726163742e00000000000000606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b60208082526022908201527f5a4f4e453a205075626c69632073616c6520616c72656164792066696e69736860408201527f6564000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601e908201527f5a4f4e453a206d696e7420746f20746865207a65726f20616464726573730000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526018908201527f5a4f4e453a204e6f20636c61696d61626c6520746f6b656e0000000000000000604082015260600190565b60208082526014908201527f5a4f4e453a206c6f636b496420696e76616c6964000000000000000000000000604082015260600190565b6020808252603c908201527f5a4f4e453a3a5f7472616e73666572546f6b656e733a2063616e6e6f7420747260408201527f616e736665722066726f6d20746865207a65726f206164647265737300000000606082015260800190565b60208082526023908201527f5a4f4e453a2047656e657369732073616c6520616c72656164792066696e697360408201527f6865640000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526019908201527f5a4f4e453a20496e76616c69642062656e656669636961727900000000000000604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526055908201527f5a4f4e453a20546865206361706163697479206d75737420626520677265617460408201527f6572207468616e2074686520616c726561647920626f7567687420616d6f756e60608201527f7420696e20746865207075626c69632073616c652e0000000000000000000000608082015260a00190565b6020808252601a908201527f5a4f4e453a2054686520726174652063616e277420626520302e000000000000604082015260600190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252601c908201527f5a4f4e453a2054686520616d6f756e742063616e277420626520302e00000000604082015260600190565b60208082526023908201527f5a4f4e453a20617070726f76652066726f6d20746865207a65726f206164647260408201527f6573730000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526032908201527f6163636570744f776e6572736869703a2043616c6c206d75737420636f6d652060408201527f66726f6d2070656e64696e674f776e65722e0000000000000000000000000000606082015260800190565b60208082526036908201527f5a4f4e453a20557365207468652070757263686173652066756e6374696f6e2060408201527f746f2062757920746865205a4f4e4520746f6b656e2e00000000000000000000606082015260800190565b60208082526015908201527f5a4f4e453a204e6f206c6f636b656420746f6b656e0000000000000000000000604082015260600190565b60208082526021908201527f5a4f4e453a20617070726f766520746f20746865207a65726f2061646472657360408201527f7300000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526018908201527f536166654d6174683a206d6f64756c6f206279207a65726f0000000000000000604082015260600190565b60208082526015908201527f5a4f4e453a20416c7265616479207265766f6b65640000000000000000000000604082015260600190565b60208082526014908201527f4361707065643a20636170206578636565646564000000000000000000000000604082015260600190565b60208082526026908201527f5a4f4e453a3a64656c656761746542795369673a207369676e6174757265206560408201527f7870697265640000000000000000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60408201527f7700000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f5a4f4e453a206275726e2066726f6d20746865207a65726f2061646472657373604082015260600190565b6020808252602b908201527f5a4f4e453a204e6f20636c61696d61626c6520746f6b656e20666f722074686560408201527f2065636f73797374656d2e000000000000000000000000000000000000000000606082015260800190565b6020808252601a908201527f5a4f4e453a204e6f20756e6c6f636b61626c6520746f6b656e2e000000000000604082015260600190565b6020808252603a908201527f5a4f4e453a3a5f7472616e73666572546f6b656e733a2063616e6e6f7420747260408201527f616e7366657220746f20746865207a65726f2061646472657373000000000000606082015260800190565b60208082526022908201527f5a4f4e453a3a64656c656761746542795369673a20696e76616c6964206e6f6e60408201527f6365000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252603d908201527f5a4f4e453a20416c6c20746f6b656e7320616c7265616479206861766520626560408201527f656e20636c61696d656420666f72207468652065636f73797374656d2e000000606082015260800190565b60208082526025908201527f5a4f4e453a2047656e6573697320737570706c7920697320696e73756666696360408201527f69656e742e000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f5a4f4e453a205075626c696320737570706c7920697320696e7375666669636960408201527f656e742e00000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526027908201527f5a4f4e453a3a6765745072696f72566f7465733a206e6f74207965742064657460408201527f65726d696e656400000000000000000000000000000000000000000000000000606082015260800190565b60208082526013908201527f5a4f4e453a204f6e6c7920656e642d7573657200000000000000000000000000604082015260600190565b60208082526026908201527f5a4f4e453a3a64656c656761746542795369673a20696e76616c69642073696760408201527f6e61747572650000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602d908201527f5a4f4e453a20546865207075726368617365206d696e696d756d20616d6f756e60408201527f7420697320302e30312045544800000000000000000000000000000000000000606082015260800190565b918252602082015260400190565b91825260ff16602082015260400190565b92835260ff919091166020830152604082015260600190565b63ffffffff91909116815260200190565b63ffffffff929092168252602082015260400190565b60ff91909116815260200190565b6001600160a01b0381168114610ff957600080fdfe5a4f4e453a206275726e20616d6f756e7420657863656564732062616c616e63655a4f4e453a3a6275726e46726f6d3a206275726e20616d6f756e74206578636565647320616c6c6f77616e63655a4f4e453a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473a264697066735822122073ed80619577dbbd25c20305df3c0465e725ac72198be55907de5d72eb86338064736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ab0b18523e8fe8cbf947c55632e8ab5ce936ae8c0000000000000000000000007205731e9643235aa313d46552c7aa81e559fb6f0000000000000000000000002e229b4172a7157ea0db8caa0ca580636a05dce30000000000000000000000000c1ac3ede7a6a22cf36457bd3759bcea44b0b643
-----Decoded View---------------
Arg [0] : owner_ (address): 0xab0B18523e8fe8CBF947C55632e8aB5Ce936ae8c
Arg [1] : vault_ (address): 0x7205731e9643235Aa313D46552c7aa81E559fB6F
Arg [2] : advisors_ (address): 0x2e229B4172a7157ea0db8caa0cA580636A05dce3
Arg [3] : treasury_ (address): 0x0C1Ac3eDE7A6a22CF36457BD3759BceA44b0B643
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000ab0b18523e8fe8cbf947c55632e8ab5ce936ae8c
Arg [1] : 0000000000000000000000007205731e9643235aa313d46552c7aa81e559fb6f
Arg [2] : 0000000000000000000000002e229b4172a7157ea0db8caa0ca580636a05dce3
Arg [3] : 0000000000000000000000000c1ac3ede7a6a22cf36457bd3759bcea44b0b643
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.