Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
Overview
Max Total Supply
10,000,000 VIL
Holders
21
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
10,855.4279 VILValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
VILToken
Compiler Version
v0.4.26+commit.4563c3fc
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-06-02 */ pragma solidity ^0.4.18; /** * @title ERC20Basic * @dev Simpler version of ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/179 */ contract ERC20Basic { uint256 public totalSupply; function balanceOf(address who) public view returns (uint256); function transfer(address to, uint256 value) public returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); } /** * @title SafeMath * @dev Math operations with safety checks that throw on error */ library SafeMath { function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; assert(c / a == b); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { // assert(b > 0); // Solidity automatically throws when dividing by 0 uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } } /** * @title Basic token * @dev Basic version of StandardToken, with no allowances. */ contract BasicToken is ERC20Basic { using SafeMath for uint256; mapping(address => uint256) balances; /** * @dev transfer token for a specified address * @param _to The address to transfer to. * @param _value The amount to be transferred. */ function transfer(address _to, uint256 _value) public returns (bool) { require(_to != address(0)); require(_value <= balances[msg.sender]); // SafeMath.sub will throw if there is not enough balance. balances[msg.sender] = balances[msg.sender].sub(_value); balances[_to] = balances[_to].add(_value); Transfer(msg.sender, _to, _value); return true; } /** * @dev Gets the balance of the specified address. * @param _owner The address to query the the balance of. * @return An uint256 representing the amount owned by the passed address. */ function balanceOf(address _owner) public view returns (uint256 balance) { return balances[_owner]; } } /** * @title ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/20 */ contract ERC20 is ERC20Basic { function allowance(address owner, address spender) public view returns (uint256); function transferFrom(address from, address to, uint256 value) public returns (bool); function approve(address spender, uint256 value) public returns (bool); event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @title Standard ERC20 token * * @dev Implementation of the basic standard token. * @dev https://github.com/ethereum/EIPs/issues/20 * @dev Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol */ contract StandardToken is ERC20, BasicToken { mapping (address => mapping (address => uint256)) internal allowed; /** * @dev Transfer tokens from one address to another * @param _from address The address which you want to send tokens from * @param _to address The address which you want to transfer to * @param _value uint256 the amount of tokens to be transferred */ function transferFrom(address _from, address _to, uint256 _value) public returns (bool) { require(_to != address(0)); require(_value <= balances[_from]); require(_value <= allowed[_from][msg.sender]); balances[_from] = balances[_from].sub(_value); balances[_to] = balances[_to].add(_value); allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value); Transfer(_from, _to, _value); return true; } /** * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. * * Beware that changing an allowance with this method brings the risk that someone may use both the old * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * @param _spender The address which will spend the funds. * @param _value The amount of tokens to be spent. */ function approve(address _spender, uint256 _value) public returns (bool) { allowed[msg.sender][_spender] = _value; Approval(msg.sender, _spender, _value); return true; } /** * @dev Function to check the amount of tokens that an owner allowed to a spender. * @param _owner address The address which owns the funds. * @param _spender address The address which will spend the funds. * @return A uint256 specifying the amount of tokens still available for the spender. */ function allowance(address _owner, address _spender) public view returns (uint256) { return allowed[_owner][_spender]; } /** * @dev Increase the amount of tokens that an owner allowed to a spender. * * approve should be called when allowed[_spender] == 0. To increment * allowed value is better to use this function to avoid 2 calls (and wait until * the first transaction is mined) * From MonolithDAO Token.sol * @param _spender The address which will spend the funds. * @param _addedValue The amount of tokens to increase the allowance by. */ function increaseApproval(address _spender, uint _addedValue) public returns (bool) { allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue); Approval(msg.sender, _spender, allowed[msg.sender][_spender]); return true; } /** * @dev Decrease the amount of tokens that an owner allowed to a spender. * * approve should be called when allowed[_spender] == 0. To decrement * allowed value is better to use this function to avoid 2 calls (and wait until * the first transaction is mined) * From MonolithDAO Token.sol * @param _spender The address which will spend the funds. * @param _subtractedValue The amount of tokens to decrease the allowance by. */ function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) { uint oldValue = allowed[msg.sender][_spender]; if (_subtractedValue > oldValue) { allowed[msg.sender][_spender] = 0; } else { allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue); } Approval(msg.sender, _spender, allowed[msg.sender][_spender]); return true; } } /** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". */ contract Ownable { address public owner; address public newOwner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ function Ownable() public { owner = msg.sender; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner); _; } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param _newOwner The address to transfer ownership to. */ function transferOwnership(address _newOwner) public onlyOwner { require(_newOwner != address(0)); OwnershipTransferred(owner, _newOwner); newOwner = _newOwner; } /** * @dev 새로운 관리자가 승인해야만 소유권이 이전된다 */ function acceptOwnership() public { require(msg.sender == newOwner); OwnershipTransferred(owner, newOwner); owner = newOwner; newOwner = address(0); } } /** * @title VILToken * @dev VIL 토큰을 생성한다 */ contract VILToken is StandardToken, Ownable { // 토큰의 이름 string public constant name = "VICDeal"; // 토큰의 단위 string public constant symbol = "VIL"; // 소수점 자리수. ETH 18자리에 맞춘다 uint8 public constant decimals = 18; // 지갑별로 송금/수금 기능의 잠긴 여부를 저장 mapping (address => LockedInfo) public lockedWalletInfo; /** * @dev 플랫폼에서 운영하는 마스터노드 스마트 컨트렉트 주소 */ mapping (address => bool) public manoContracts; /** * @dev 토큰 지갑의 잠김 속성을 정의 * * @param timeLockUpEnd timeLockUpEnd 시간까지 송/수금에 대한 제한이 적용된다. 이후에는 제한이 풀린다 * @param sendLock 출금 잠김 여부(true : 잠김, false : 풀림) * @param receiveLock 입금 잠김 여부 (true : 잠김, false : 풀림) */ struct LockedInfo { uint timeLockUpEnd; bool sendLock; bool receiveLock; } /** * @dev 토큰이 송금됐을 때 발생하는 이벤트 * @param from 토큰을 보내는 지갑 주소 * @param to 토큰을 받는 지갑 주소 * @param value 전달되는 토큰의 양 (Satoshi) */ event Transfer (address indexed from, address indexed to, uint256 value); /** * @dev 토큰 지갑의 송금/입금 기능이 제한되었을 때 발생하는 이벤트 * @param target 제한 대상 지갑 주소 * @param timeLockUpEnd 제한이 종료되는 시간(UnixTimestamp) * @param sendLock 지갑에서의 송금을 제한하는지 여부(true : 제한, false : 해제) * @param receiveLock 지갑으로의 입금을 제한하는지 여부 (true : 제한, false : 해제) */ event Locked (address indexed target, uint timeLockUpEnd, bool sendLock, bool receiveLock); /** * @dev 지갑에 대한 송금/입금 제한을 해제했을 때 발생하는 이벤트 * @param target 해제 대상 지갑 주소 */ event Unlocked (address indexed target); /** * @dev 송금 받는 지갑의 입금이 제한되어있어서 송금이 거절되었을 때 발생하는 이벤트 * @param from 토큰을 보내는 지갑 주소 * @param to (입금이 제한된) 토큰을 받는 지갑 주소 * @param value 전송하려고 한 토큰의 양(Satoshi) */ event RejectedPaymentToLockedUpWallet (address indexed from, address indexed to, uint256 value); /** * @dev 송금하는 지갑의 출금이 제한되어있어서 송금이 거절되었을 때 발생하는 이벤트 * @param from (출금이 제한된) 토큰을 보내는 지갑 주소 * @param to 토큰을 받는 지갑 주소 * @param value 전송하려고 한 토큰의 양(Satoshi) */ event RejectedPaymentFromLockedUpWallet (address indexed from, address indexed to, uint256 value); /** * @dev 토큰을 소각한다. * @param burner 토큰을 소각하는 지갑 주소 * @param value 소각하는 토큰의 양(Satoshi) */ event Burn (address indexed burner, uint256 value); /** * @dev 아피스 플랫폼에 마스터노드 스마트 컨트렉트가 등록되거나 해제될 때 발생하는 이벤트 */ event ManoContractRegistered (address manoContract, bool registered); /** * @dev 컨트랙트가 생성될 때 실행. 컨트렉트 소유자 지갑에 모든 토큰을 할당한다. * 발행량이나 이름은 소스코드에서 확인할 수 있도록 변경하였음 */ function VILToken() public { // 총 VIL 발행량 (1천만) uint256 supplyVil = 10000000; // wei 단위로 토큰 총량을 생성한다. totalSupply = supplyVil * 10 ** uint256(decimals); balances[msg.sender] = totalSupply; Transfer(0x0, msg.sender, totalSupply); } /** * @dev 지갑을 지정된 시간까지 제한시키거나 해제시킨다. 제한 시간이 경과하면 모든 제한이 해제된다. * @param _targetWallet 제한을 적용할 지갑 주소 * @param _timeLockEnd 제한이 종료되는 시간(UnixTimestamp) * @param _sendLock (true : 지갑에서 토큰을 출금하는 기능을 제한한다.) (false : 제한을 해제한다) * @param _receiveLock (true : 지갑으로 토큰을 입금받는 기능을 제한한다.) (false : 제한을 해제한다) */ function walletLock(address _targetWallet, uint _timeLockEnd, bool _sendLock, bool _receiveLock) onlyOwner public { require(_targetWallet != 0x0); // If all locks are unlocked, set the _timeLockEnd to zero. if(_sendLock == false && _receiveLock == false) { _timeLockEnd = 0; } lockedWalletInfo[_targetWallet].timeLockUpEnd = _timeLockEnd; lockedWalletInfo[_targetWallet].sendLock = _sendLock; lockedWalletInfo[_targetWallet].receiveLock = _receiveLock; if(_timeLockEnd > 0) { Locked(_targetWallet, _timeLockEnd, _sendLock, _receiveLock); } else { Unlocked(_targetWallet); } } /** * @dev 지갑의 입급/출금을 지정된 시간까지 제한시킨다. 제한 시간이 경과하면 모든 제한이 해제된다. * @param _targetWallet 제한을 적용할 지갑 주소 * @param _timeLockUpEnd 제한이 종료되는 시간(UnixTimestamp) */ function walletLockBoth(address _targetWallet, uint _timeLockUpEnd) onlyOwner public { walletLock(_targetWallet, _timeLockUpEnd, true, true); } /** * @dev 지갑의 입급/출금을 영원히(33658-9-27 01:46:39+00) 제한시킨다. * @param _targetWallet 제한을 적용할 지갑 주소 */ function walletLockBothForever(address _targetWallet) onlyOwner public { walletLock(_targetWallet, 999999999999, true, true); } /** * @dev 지갑에 설정된 입출금 제한을 해제한다 * @param _targetWallet 제한을 해제하고자 하는 지갑 주소 */ function walletUnlock(address _targetWallet) onlyOwner public { walletLock(_targetWallet, 0, false, false); } /** * @dev 지갑의 송금 기능이 제한되어있는지 확인한다. * @param _addr 송금 제한 여부를 확인하려는 지갑의 주소 * @return isSendLocked (true : 제한되어 있음, 토큰을 보낼 수 없음) (false : 제한 없음, 토큰을 보낼 수 있음) * @return until 잠겨있는 시간, UnixTimestamp */ function isWalletLocked_Send(address _addr) public constant returns (bool isSendLocked, uint until) { require(_addr != 0x0); isSendLocked = (lockedWalletInfo[_addr].timeLockUpEnd > now && lockedWalletInfo[_addr].sendLock == true); if(isSendLocked) { until = lockedWalletInfo[_addr].timeLockUpEnd; } else { until = 0; } } /** * @dev 지갑의 입금 기능이 제한되어있는지 확인한다. * @param _addr 입금 제한 여부를 확인하려는 지갑의 주소 * @return (true : 제한되어 있음, 토큰을 받을 수 없음) (false : 제한 없음, 토큰을 받을 수 있음) */ function isWalletLocked_Receive(address _addr) public constant returns (bool isReceiveLocked, uint until) { require(_addr != 0x0); isReceiveLocked = (lockedWalletInfo[_addr].timeLockUpEnd > now && lockedWalletInfo[_addr].receiveLock == true); if(isReceiveLocked) { until = lockedWalletInfo[_addr].timeLockUpEnd; } else { until = 0; } } /** * @dev 요청자의 지갑에 송금 기능이 제한되어있는지 확인한다. * @return (true : 제한되어 있음, 토큰을 보낼 수 없음) (false : 제한 없음, 토큰을 보낼 수 있음) */ function isMyWalletLocked_Send() public constant returns (bool isSendLocked, uint until) { return isWalletLocked_Send(msg.sender); } /** * @dev 요청자의 지갑에 입금 기능이 제한되어있는지 확인한다. * @return (true : 제한되어 있음, 토큰을 보낼 수 없음) (false : 제한 없음, 토큰을 보낼 수 있음) */ function isMyWalletLocked_Receive() public constant returns (bool isReceiveLocked, uint until) { return isWalletLocked_Receive(msg.sender); } /** * @dev 아피스 플랫폼에서 운영하는 스마트 컨트렉트 주소를 등록하거나 해제한다. * @param manoAddr 마스터노드 스마트 컨트렉컨트렉트 * @param registered true : 등록, false : 해제 */ function registerManoContract(address manoAddr, bool registered) onlyOwner public { manoContracts[manoAddr] = registered; ManoContractRegistered(manoAddr, registered); } /** * @dev _to 지갑으로 _vilsWei 만큼의 토큰을 송금한다. * @param _to 토큰을 받는 지갑 주소 * @param _vilWei 전송되는 토큰의 양 */ function transfer(address _to, uint256 _vilWei) public returns (bool) { // 자신에게 송금하는 것을 방지한다 require(_to != address(this)); // 마스터노드 컨트렉트일 경우, APIS 송수신에 제한을 두지 않는다 if(manoContracts[msg.sender] || manoContracts[_to]) { return super.transfer(_to, _vilWei); } // 송금 기능이 잠긴 지갑인지 확인한다. if(lockedWalletInfo[msg.sender].timeLockUpEnd > now && lockedWalletInfo[msg.sender].sendLock == true) { RejectedPaymentFromLockedUpWallet(msg.sender, _to, _vilWei); return false; } // 입금 받는 기능이 잠긴 지갑인지 확인한다 else if(lockedWalletInfo[_to].timeLockUpEnd > now && lockedWalletInfo[_to].receiveLock == true) { RejectedPaymentToLockedUpWallet(msg.sender, _to, _vilWei); return false; } // 제한이 없는 경우, 송금을 진행한다. else { return super.transfer(_to, _vilWei); } } /** * @dev _to 지갑으로 _vilWei 만큼의 Vil를 송금하고 _timeLockUpEnd 시간만큼 지갑을 잠근다 * @param _to 토큰을 받는 지갑 주소 * @param _vilWei 전송되는 토큰의 양(wei) * @param _timeLockUpEnd 잠금이 해제되는 시간 */ function transferAndLockUntil(address _to, uint256 _vilWei, uint _timeLockUpEnd) onlyOwner public { require(transfer(_to, _vilWei)); walletLockBoth(_to, _timeLockUpEnd); } /** * @dev _to 지갑으로 _vilWei 만큼의 APIS를 송금하고영원히 지갑을 잠근다 * @param _to 토큰을 받는 지갑 주소 * @param _vilWei 전송되는 토큰의 양(wei) */ function transferAndLockForever(address _to, uint256 _vilWei) onlyOwner public { require(transfer(_to, _vilWei)); walletLockBothForever(_to); } /** * @dev 함수를 호출하는 지갑의 토큰을 소각한다. * * zeppelin-solidity/contracts/token/BurnableToken.sol 참조 * @param _value 소각하려는 토큰의 양(Satoshi) */ function burn(uint256 _value) public { require(_value <= balances[msg.sender]); require(_value <= totalSupply); address burner = msg.sender; balances[burner] -= _value; totalSupply -= _value; Burn(burner, _value); } /** * @dev Eth은 받을 수 없도록 한다. */ function () public payable { revert(); } } /** * @title WhiteList * @dev ICO 참여가 가능한 화이트 리스트를 관리한다 */ contract WhiteList is Ownable { mapping (address => uint8) internal list; /** * @dev 화이트리스트에 변동이 발생했을 때 이벤트 * @param backer 화이트리스트에 등재하려는 지갑 주소 * @param allowed (true : 화이트리스트에 추가) (false : 제거) */ event WhiteBacker(address indexed backer, bool allowed); /** * @dev 화이트리스트에 등록하거나 해제한다. * @param _target 화이트리스트에 등재하려는 지갑 주소 * @param _allowed (true : 화이트리스트에 추가) (false : 제거) */ function setWhiteBacker(address _target, bool _allowed) onlyOwner public { require(_target != 0x0); if(_allowed == true) { list[_target] = 1; } else { list[_target] = 0; } WhiteBacker(_target, _allowed); } /** * @dev 화이트 리스트에 등록(추가)한다 * @param _target 추가할 지갑 주소 */ function addWhiteBacker(address _target) onlyOwner public { setWhiteBacker(_target, true); } /** * @dev 화이트리스트에 여러 지갑 주소를 동시에 등재하거나 제거한다. * * 가스 소모를 줄여보기 위함 * @param _backers 대상이 되는 지갑들의 리스트 * @param _allows 대상이 되는 지갑들의 추가 여부 리스트 (true : 추가) (false : 제거) */ function setWhiteBackersByList(address[] _backers, bool[] _allows) onlyOwner public { require(_backers.length > 0); require(_backers.length == _allows.length); for(uint backerIndex = 0; backerIndex < _backers.length; backerIndex++) { setWhiteBacker(_backers[backerIndex], _allows[backerIndex]); } } /** * @dev 화이트리스트에 여러 지갑 주소를 등재한다. * * 모든 주소들은 화이트리스트에 추가된다. * @param _backers 대상이 되는 지갑들의 리스트 */ function addWhiteBackersByList(address[] _backers) onlyOwner public { for(uint backerIndex = 0; backerIndex < _backers.length; backerIndex++) { setWhiteBacker(_backers[backerIndex], true); } } /** * @dev 해당 지갑 주소가 화이트 리스트에 등록되어있는지 확인한다 * @param _addr 등재 여부를 확인하려는 지갑의 주소 * @return (true : 등록되어있음) (false : 등록되어있지 않음) */ function isInWhiteList(address _addr) public constant returns (bool) { require(_addr != 0x0); return list[_addr] > 0; } /** * @dev 요청하는 지갑이 화이트리스트에 등록되어있는지 확인한다. * @return (true : 등록되어있음) (false : 등록되어있지 않음) */ function isMeInWhiteList() public constant returns (bool isWhiteBacker) { return list[msg.sender] > 0; } } /** * @title APIS Crowd Pre-Sale * @dev 토큰의 프리세일을 수행하기 위한 컨트랙트 */ contract VILCrowdSale is Ownable { // 소수점 자리수. Eth 18자리에 맞춘다 uint8 public constant decimals = 18; // 크라우드 세일의 판매 목표량(APIS) uint256 public fundingGoal; // 현재 진행하는 판매 목표량 // QTUM과 공동으로 판매가 진행되기 때문에, QTUM 쪽 컨트렉트와 합산한 판매량이 총 판매목표를 넘지 않도록 하기 위함 uint256 public fundingGoalCurrent; // 1 ETH으로 살 수 있는 APIS의 갯수 uint256 public priceOfApisPerFund; // 발급된 Apis 갯수 (예약 + 발행) //uint256 public totalSoldApis; // 발행 대기중인 APIS 갯수 //uint256 public totalReservedApis; // 발행되서 출금된 APIS 갯수 //uint256 public totalWithdrawedApis; // 입금된 투자금의 총액 (예약 + 발행) //uint256 public totalReceivedFunds; // 구매 확정 전 투자금의 총액 //uint256 public totalReservedFunds; // 구매 확정된 투자금의 총액 //uint256 public totalPaidFunds; // 판매가 시작되는 시간 uint public startTime; // 판매가 종료되는 시간 uint public endTime; // 판매가 조기에 종료될 경우를 대비하기 위함 bool closed = false; SaleStatus public saleStatus; // APIS 토큰 컨트렉트 VILToken internal tokenReward; // 화이트리스트 컨트렉트 WhiteList internal whiteList; mapping (address => Property) public fundersProperty; /** * @dev APIS 토큰 구매자의 자산 현황을 정리하기 위한 구조체 */ struct Property { uint256 reservedFunds; // 입금했지만 아직 APIS로 변환되지 않은 Eth (환불 가능) uint256 paidFunds; // APIS로 변환된 Eth (환불 불가) uint256 reservedApis; // 받을 예정인 토큰 uint256 withdrawedApis; // 이미 받은 토큰 uint purchaseTime; // 구입한 시간 } /** * @dev 현재 세일의 진행 현황을 확인할 수 있다. * totalSoldApis 발급된 Apis 갯수 (예약 + 발행) * totalReservedApis 발행 대기 중인 Apis * totalWithdrawedApis 발행되서 출금된 APIS 갯수 * * totalReceivedFunds 입금된 투자금의 총액 (예약 + 발행) * totalReservedFunds 구매 확정 전 투자금의 총액 * ttotalPaidFunds 구매 확정된 투자금의 총액 */ struct SaleStatus { uint256 totalReservedFunds; uint256 totalPaidFunds; uint256 totalReceivedFunds; uint256 totalReservedApis; uint256 totalWithdrawedApis; uint256 totalSoldApis; } /** * @dev APIS를 구입하기 위한 Eth을 입금했을 때 발생하는 이벤트 * @param beneficiary APIS를 구매하고자 하는 지갑의 주소 * @param amountOfFunds 입금한 Eth의 양 (wei) * @param amountOfApis 투자금에 상응하는 APIS 토큰의 양 (wei) */ event ReservedApis(address beneficiary, uint256 amountOfFunds, uint256 amountOfApis); /** * @dev 크라우드 세일 컨트렉트에서 Eth이 인출되었을 때 발생하는 이벤트 * @param addr 받는 지갑의 주소 * @param amount 송금되는 양(wei) */ event WithdrawalFunds(address addr, uint256 amount); /** * @dev 구매자에게 토큰이 발급되었을 때 발생하는 이벤트 * @param funder 토큰을 받는 지갑의 주소 * @param amountOfFunds 입금한 투자금의 양 (wei) * @param amountOfApis 발급 받는 토큰의 양 (wei) */ event WithdrawalApis(address funder, uint256 amountOfFunds, uint256 amountOfApis); /** * @dev 투자금 입금 후, 아직 토큰을 발급받지 않은 상태에서, 환불 처리를 했을 때 발생하는 이벤트 * @param _backer 환불 처리를 진행하는 지갑의 주소 * @param _amountFunds 환불하는 투자금의 양 * @param _amountApis 취소되는 APIS 양 */ event Refund(address _backer, uint256 _amountFunds, uint256 _amountApis); /** * @dev 크라우드 세일 진행 중에만 동작하도록 제한하고, APIS의 가격도 설정되어야만 한다. */ modifier onSale() { require(now >= startTime); require(now < endTime); require(closed == false); require(priceOfApisPerFund > 0); require(fundingGoalCurrent > 0); _; } /** * @dev 크라우드 세일 종료 후에만 동작하도록 제한 */ modifier onFinished() { require(now >= endTime || closed == true); _; } /** * @dev 화이트리스트에 등록되어있어야하고 아직 구매완료 되지 않은 투자금이 있어야만 한다. */ modifier claimable() { require(whiteList.isInWhiteList(msg.sender) == true); require(fundersProperty[msg.sender].reservedFunds > 0); _; } /** * @dev 크라우드 세일 컨트렉트를 생성한다. * @param _fundingGoalApis 판매하는 토큰의 양 (APIS 단위) * @param _startTime 크라우드 세일을 시작하는 시간 * @param _endTime 크라우드 세일을 종료하는 시간 * @param _addressOfVilTokenUsedAsReward APIS 토큰의 컨트렉트 주소 * @param _addressOfWhiteList WhiteList 컨트렉트 주소 */ function ApisCrowdSale ( uint256 _fundingGoalApis, uint _startTime, uint _endTime, address _addressOfVilTokenUsedAsReward, address _addressOfWhiteList ) public { require (_fundingGoalApis > 0); require (_startTime > now); require (_endTime > _startTime); require (_addressOfVilTokenUsedAsReward != 0x0); require (_addressOfWhiteList != 0x0); fundingGoal = _fundingGoalApis * 10 ** uint256(decimals); startTime = _startTime; endTime = _endTime; // 토큰 스마트컨트렉트를 불러온다 tokenReward = VILToken(_addressOfVilTokenUsedAsReward); // 화이트 리스트를 가져온다 whiteList = WhiteList(_addressOfWhiteList); } /** * @dev 판매 종료는 1회만 가능하도록 제약한다. 종료 후 다시 판매 중으로 변경할 수 없다 */ function closeSale(bool _closed) onlyOwner public { require (closed == false); closed = _closed; } /** * @dev 크라우드 세일 시작 전에 1Eth에 해당하는 APIS 량을 설정한다. */ function setPriceOfApis(uint256 price) onlyOwner public { require(priceOfApisPerFund == 0); priceOfApisPerFund = price; } /** * @dev 현 시점에서 판매 가능한 목표량을 수정한다. * @param _currentFundingGoalAPIS 현 시점의 판매 목표량은 총 판매된 양 이상이어야만 한다. */ function setCurrentFundingGoal(uint256 _currentFundingGoalAPIS) onlyOwner public { uint256 fundingGoalCurrentWei = _currentFundingGoalAPIS * 10 ** uint256(decimals); require(fundingGoalCurrentWei >= saleStatus.totalSoldApis); fundingGoalCurrent = fundingGoalCurrentWei; } /** * @dev APIS 잔고를 확인한다 * @param _addr 잔고를 확인하려는 지갑의 주소 * @return balance 지갑에 들은 APIS 잔고 (wei) */ function balanceOf(address _addr) public view returns (uint256 balance) { return tokenReward.balanceOf(_addr); } /** * @dev 화이트리스트 등록 여부를 확인한다 * @param _addr 등록 여부를 확인하려는 주소 * @return addrIsInWhiteList true : 등록되있음, false : 등록되어있지 않음 */ function whiteListOf(address _addr) public view returns (string message) { if(whiteList.isInWhiteList(_addr) == true) { return "The address is in whitelist."; } else { return "The address is *NOT* in whitelist."; } } /** * @dev 전달받은 지갑이 APIS 지급 요청이 가능한지 확인한다. * @param _addr 확인하는 주소 * @return message 결과 메시지 */ function isClaimable(address _addr) public view returns (string message) { if(fundersProperty[_addr].reservedFunds == 0) { return "The address has no claimable balance."; } if(whiteList.isInWhiteList(_addr) == false) { return "The address must be registered with KYC and Whitelist"; } else { return "The address can claim APIS!"; } } /** * @dev 크라우드 세일 컨트렉트로 바로 투자금을 송금하는 경우, buyToken으로 연결한다 */ function () onSale public payable { buyToken(msg.sender); } /** * @dev 토큰을 구입하기 위해 Qtum을 입금받는다. * @param _beneficiary 토큰을 받게 될 지갑의 주소 */ function buyToken(address _beneficiary) onSale public payable { // 주소 확인 require(_beneficiary != 0x0); // 크라우드 세일 컨트렉트의 토큰 송금 기능이 정지되어있으면 판매하지 않는다 bool isLocked = false; uint timeLock = 0; (isLocked, timeLock) = tokenReward.isWalletLocked_Send(this); require(isLocked == false); uint256 amountFunds = msg.value; uint256 reservedApis = amountFunds * priceOfApisPerFund; // 목표 금액을 넘어서지 못하도록 한다 require(saleStatus.totalSoldApis + reservedApis <= fundingGoalCurrent); require(saleStatus.totalSoldApis + reservedApis <= fundingGoal); // 투자자의 자산을 업데이트한다 fundersProperty[_beneficiary].reservedFunds += amountFunds; fundersProperty[_beneficiary].reservedApis += reservedApis; fundersProperty[_beneficiary].purchaseTime = now; // 총액들을 업데이트한다 saleStatus.totalReceivedFunds += amountFunds; saleStatus.totalReservedFunds += amountFunds; saleStatus.totalSoldApis += reservedApis; saleStatus.totalReservedApis += reservedApis; // 화이트리스트에 등록되어있으면 바로 출금한다 if(whiteList.isInWhiteList(_beneficiary) == true) { withdrawal(_beneficiary); } else { // 토큰 발행 예약 이벤트 발생 ReservedApis(_beneficiary, amountFunds, reservedApis); } } /** * @dev 관리자에 의해서 토큰을 발급한다. 하지만 기본 요건은 갖춰야만 가능하다 * * @param _target 토큰 발급을 청구하려는 지갑 주소 */ function claimApis(address _target) public { // 화이트 리스트에 있어야만 하고 require(whiteList.isInWhiteList(_target) == true); // 예약된 투자금이 있어야만 한다. require(fundersProperty[_target].reservedFunds > 0); withdrawal(_target); } /** * @dev 예약한 토큰의 실제 지급을 요청하도록 한다. * * APIS를 구매하기 위해 Qtum을 입금할 경우, 관리자의 검토를 위한 7일의 유예기간이 존재한다. * 유예기간이 지나면 토큰 지급을 요구할 수 있다. */ function claimMyApis() claimable public { withdrawal(msg.sender); } /** * @dev 구매자에게 토큰을 지급한다. * @param funder 토큰을 지급할 지갑의 주소 */ function withdrawal(address funder) internal { // 구매자 지갑으로 토큰을 전달한다 assert(tokenReward.transferFrom(owner, funder, fundersProperty[funder].reservedApis)); fundersProperty[funder].withdrawedApis += fundersProperty[funder].reservedApis; fundersProperty[funder].paidFunds += fundersProperty[funder].reservedFunds; // 총액에 반영 saleStatus.totalReservedFunds -= fundersProperty[funder].reservedFunds; saleStatus.totalPaidFunds += fundersProperty[funder].reservedFunds; saleStatus.totalReservedApis -= fundersProperty[funder].reservedApis; saleStatus.totalWithdrawedApis += fundersProperty[funder].reservedApis; // APIS가 출금 되었음을 알리는 이벤트 WithdrawalApis(funder, fundersProperty[funder].reservedFunds, fundersProperty[funder].reservedApis); // 인출하지 않은 APIS 잔고를 0으로 변경해서, Qtum 재입금 시 이미 출금한 토큰이 다시 출금되지 않게 한다. fundersProperty[funder].reservedFunds = 0; fundersProperty[funder].reservedApis = 0; } /** * @dev 아직 토큰을 발급받지 않은 지갑을 대상으로, 환불을 진행할 수 있다. * @param _funder 환불을 진행하려는 지갑의 주소 */ function refundByOwner(address _funder) onlyOwner public { require(fundersProperty[_funder].reservedFunds > 0); uint256 amountFunds = fundersProperty[_funder].reservedFunds; uint256 amountApis = fundersProperty[_funder].reservedApis; // Eth을 환불한다 _funder.transfer(amountFunds); saleStatus.totalReceivedFunds -= amountFunds; saleStatus.totalReservedFunds -= amountFunds; saleStatus.totalSoldApis -= amountApis; saleStatus.totalReservedApis -= amountApis; fundersProperty[_funder].reservedFunds = 0; fundersProperty[_funder].reservedApis = 0; Refund(_funder, amountFunds, amountApis); } /** * @dev 펀딩이 종료된 이후면, 적립된 투자금을 반환한다. * @param remainRefundable true : 환불할 수 있는 금액은 남기고 반환한다. false : 모두 반환한다 */ function withdrawalFunds(bool remainRefundable) onlyOwner public { require(now > endTime || closed == true); uint256 amount = 0; if(remainRefundable) { amount = this.balance - saleStatus.totalReservedFunds; } else { amount = this.balance; } if(amount > 0) { msg.sender.transfer(amount); WithdrawalFunds(msg.sender, amount); } } /** * @dev 크라우드 세일이 진행 중인지 여부를 반환한다. * @return isOpened true: 진행 중 false : 진행 중이 아님(참여 불가) */ function isOpened() public view returns (bool isOpend) { if(now < startTime) return false; if(now >= endTime) return false; if(closed == true) return false; return true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":false,"inputs":[{"name":"_targetWallet","type":"address"},{"name":"_timeLockUpEnd","type":"uint256"}],"name":"walletLockBoth","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_targetWallet","type":"address"}],"name":"walletLockBothForever","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"manoContracts","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_vilWei","type":"uint256"}],"name":"transferAndLockForever","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_targetWallet","type":"address"},{"name":"_timeLockEnd","type":"uint256"},{"name":"_sendLock","type":"bool"},{"name":"_receiveLock","type":"bool"}],"name":"walletLock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"isWalletLocked_Receive","outputs":[{"name":"isReceiveLocked","type":"bool"},{"name":"until","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"manoAddr","type":"address"},{"name":"registered","type":"bool"}],"name":"registerManoContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_vilWei","type":"uint256"},{"name":"_timeLockUpEnd","type":"uint256"}],"name":"transferAndLockUntil","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_vilWei","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_targetWallet","type":"address"}],"name":"walletUnlock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"lockedWalletInfo","outputs":[{"name":"timeLockUpEnd","type":"uint256"},{"name":"sendLock","type":"bool"},{"name":"receiveLock","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"newOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isMyWalletLocked_Receive","outputs":[{"name":"isReceiveLocked","type":"bool"},{"name":"until","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"isWalletLocked_Send","outputs":[{"name":"isSendLocked","type":"bool"},{"name":"until","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isMyWalletLocked_Send","outputs":[{"name":"isSendLocked","type":"bool"},{"name":"until","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"target","type":"address"},{"indexed":false,"name":"timeLockUpEnd","type":"uint256"},{"indexed":false,"name":"sendLock","type":"bool"},{"indexed":false,"name":"receiveLock","type":"bool"}],"name":"Locked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"target","type":"address"}],"name":"Unlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"RejectedPaymentToLockedUpWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"RejectedPaymentFromLockedUpWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"burner","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"manoContract","type":"address"},{"indexed":false,"name":"registered","type":"bool"}],"name":"ManoContractRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}]
Contract Creation Code
608060405234801561001057600080fd5b50600033600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550629896809050601260ff16600a0a8102600081905550600054600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff1660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6000546040518082815260200191505060405180910390a35061287d806101126000396000f300608060405260043610610175576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a1bdc31461017a57806306fdde03146101c7578063095ea7b31461025757806318160ddd146102bc57806323b872dd146102e75780632823fbe51461036c578063313ce567146103af578063385ec577146103e057806342966c681461043b57806366188463146104685780636a59d0a4146104cd57806370a082311461051a57806374ccd7cc14610571578063788c4023146105d657806379ba5097146106385780637cf846c91461064f57806385d544be1461069e5780638da5cb5b146106f557806395d89b411461074c578063a9059cbb146107dc578063af87c36614610841578063d48b38b714610884578063d4ee1d90146108f1578063d73dd62314610948578063dd62ed3e146109ad578063e374e8d414610a24578063f1f62f1014610a5a578063f2fde38b14610abc578063fbcc377514610aff575b600080fd5b34801561018657600080fd5b506101c5600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b35565b005b3480156101d357600080fd5b506101dc610ba2565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561021c578082015181840152602081019050610201565b50505050905090810190601f1680156102495780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561026357600080fd5b506102a2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610bdb565b604051808215151515815260200191505060405180910390f35b3480156102c857600080fd5b506102d1610ccd565b6040518082815260200191505060405180910390f35b3480156102f357600080fd5b50610352600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610cd3565b604051808215151515815260200191505060405180910390f35b34801561037857600080fd5b506103ad600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611092565b005b3480156103bb57600080fd5b506103c4611103565b604051808260ff1660ff16815260200191505060405180910390f35b3480156103ec57600080fd5b50610421600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611108565b604051808215151515815260200191505060405180910390f35b34801561044757600080fd5b5061046660048036038101908080359060200190929190505050611128565b005b34801561047457600080fd5b506104b3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061123a565b604051808215151515815260200191505060405180910390f35b3480156104d957600080fd5b50610518600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114cb565b005b34801561052657600080fd5b5061055b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611549565b6040518082815260200191505060405180910390f35b34801561057d57600080fd5b506105d4600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803515159060200190929190803515159060200190929190505050611592565b005b3480156105e257600080fd5b50610617600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506117ef565b60405180831515151581526020018281526020019250505060405180910390f35b34801561064457600080fd5b5061064d611918565b005b34801561065b57600080fd5b5061069c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611ab9565b005b3480156106aa57600080fd5b506106f3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050611bdf565b005b34801561070157600080fd5b5061070a611c5f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561075857600080fd5b50610761611c85565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156107a1578082015181840152602081019050610786565b50505050905090810190601f1680156107ce5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156107e857600080fd5b50610827600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611cbe565b604051808215151515815260200191505060405180910390f35b34801561084d57600080fd5b50610882600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ff3565b005b34801561089057600080fd5b506108c5600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612060565b604051808481526020018315151515815260200182151515158152602001935050505060405180910390f35b3480156108fd57600080fd5b506109066120a4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561095457600080fd5b50610993600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506120ca565b604051808215151515815260200191505060405180910390f35b3480156109b957600080fd5b50610a0e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506122c6565b6040518082815260200191505060405180910390f35b348015610a3057600080fd5b50610a3961234d565b60405180831515151581526020018281526020019250505060405180910390f35b348015610a6657600080fd5b50610a9b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612361565b60405180831515151581526020018281526020019250505060405180910390f35b348015610ac857600080fd5b50610afd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061248a565b005b348015610b0b57600080fd5b50610b146125e2565b60405180831515151581526020018281526020019250505060405180910390f35b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b9157600080fd5b610b9e8282600180611592565b5050565b6040805190810160405280600781526020017f5649434465616c0000000000000000000000000000000000000000000000000081525081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60005481565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610d1057600080fd5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d5e57600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610de957600080fd5b610e3b82600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125f690919063ffffffff16565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610ed082600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461260f90919063ffffffff16565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610fa282600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125f690919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156110ee57600080fd5b6111008164e8d4a50fff600180611592565b50565b601281565b60066020528060005260406000206000915054906101000a900460ff1681565b6000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561117857600080fd5b600054821115151561118957600080fd5b33905081600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055508160008082825403925050819055508073ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5836040518082815260200191505060405180910390a25050565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083111561134b576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506113df565b61135e83826125f690919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561152757600080fd5b6115318282611cbe565b151561153c57600080fd5b61154582611092565b5050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115ee57600080fd5b60008473ffffffffffffffffffffffffffffffffffffffff161415151561161457600080fd5b6000151582151514801561162c575060001515811515145b1561163657600092505b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555081600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555080600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160016101000a81548160ff02191690831515021790555060008311156117a5578373ffffffffffffffffffffffffffffffffffffffff167f9a26d7aa8d0b0885c3a5cce1b95072a26bc415306c652f20e7b507c07a3914d5848484604051808481526020018315151515815260200182151515158152602001935050505060405180910390a26117e9565b8373ffffffffffffffffffffffffffffffffffffffff167f7e6adfec7e3f286831a0200a754127c171a2da564078722cb97704741bbdb0ea60405160405180910390a25b50505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff161415151561181857600080fd5b42600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541180156118bc575060011515600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160019054906101000a900460ff161515145b9150811561190e57600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050611913565b600090505b915091565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561197457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b1557600080fd5b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f1419fc91a0d31d7042ea1fc0fb24c255e2c68a9eda9e83715ad768761433a89e8282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a15050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c3b57600080fd5b611c458383611cbe565b1515611c5057600080fd5b611c5a8382610b35565b505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040805190810160405280600381526020017f56494c000000000000000000000000000000000000000000000000000000000081525081565b60003073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515611cfb57600080fd5b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611d9c5750600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15611db257611dab838361262d565b9050611fed565b42600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154118015611e56575060011515600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff161515145b15611ec9578273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f77c483e4ff749a73be4f6404c2ecea502a159772ef1cd46e475516a4cdf0eb0d846040518082815260200191505060405180910390a360009050611fed565b42600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154118015611f6d575060011515600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160019054906101000a900460ff161515145b15611fe0578273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f9afa4bbee84237d6edfd62a23e6fe062ff3073a421c564307d695b24b5e50d73846040518082815260200191505060405180910390a360009050611fed565b611fea838361262d565b90505b92915050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561204f57600080fd5b61205d816000806000611592565b50565b60056020528060005260406000206000915090508060000154908060010160009054906101000a900460ff16908060010160019054906101000a900460ff16905083565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061215b82600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461260f90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600080612359336117ef565b915091509091565b60008060008373ffffffffffffffffffffffffffffffffffffffff161415151561238a57600080fd5b42600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015411801561242e575060011515600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff161515145b9150811561248057600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050612485565b600090505b915091565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156124e657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561252257600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806125ee33612361565b915091509091565b600082821115151561260457fe5b818303905092915050565b600080828401905083811015151561262357fe5b8091505092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561266a57600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156126b857600080fd5b61270a82600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125f690919063ffffffff16565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061279f82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461260f90919063ffffffff16565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a360019050929150505600a165627a7a723058206847af93badb66edd01bcd009def324495b8f9111ddde3f3f0965536b77d11ac0029
Deployed Bytecode
0x608060405260043610610175576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a1bdc31461017a57806306fdde03146101c7578063095ea7b31461025757806318160ddd146102bc57806323b872dd146102e75780632823fbe51461036c578063313ce567146103af578063385ec577146103e057806342966c681461043b57806366188463146104685780636a59d0a4146104cd57806370a082311461051a57806374ccd7cc14610571578063788c4023146105d657806379ba5097146106385780637cf846c91461064f57806385d544be1461069e5780638da5cb5b146106f557806395d89b411461074c578063a9059cbb146107dc578063af87c36614610841578063d48b38b714610884578063d4ee1d90146108f1578063d73dd62314610948578063dd62ed3e146109ad578063e374e8d414610a24578063f1f62f1014610a5a578063f2fde38b14610abc578063fbcc377514610aff575b600080fd5b34801561018657600080fd5b506101c5600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b35565b005b3480156101d357600080fd5b506101dc610ba2565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561021c578082015181840152602081019050610201565b50505050905090810190601f1680156102495780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561026357600080fd5b506102a2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610bdb565b604051808215151515815260200191505060405180910390f35b3480156102c857600080fd5b506102d1610ccd565b6040518082815260200191505060405180910390f35b3480156102f357600080fd5b50610352600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610cd3565b604051808215151515815260200191505060405180910390f35b34801561037857600080fd5b506103ad600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611092565b005b3480156103bb57600080fd5b506103c4611103565b604051808260ff1660ff16815260200191505060405180910390f35b3480156103ec57600080fd5b50610421600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611108565b604051808215151515815260200191505060405180910390f35b34801561044757600080fd5b5061046660048036038101908080359060200190929190505050611128565b005b34801561047457600080fd5b506104b3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061123a565b604051808215151515815260200191505060405180910390f35b3480156104d957600080fd5b50610518600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114cb565b005b34801561052657600080fd5b5061055b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611549565b6040518082815260200191505060405180910390f35b34801561057d57600080fd5b506105d4600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803515159060200190929190803515159060200190929190505050611592565b005b3480156105e257600080fd5b50610617600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506117ef565b60405180831515151581526020018281526020019250505060405180910390f35b34801561064457600080fd5b5061064d611918565b005b34801561065b57600080fd5b5061069c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611ab9565b005b3480156106aa57600080fd5b506106f3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050611bdf565b005b34801561070157600080fd5b5061070a611c5f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561075857600080fd5b50610761611c85565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156107a1578082015181840152602081019050610786565b50505050905090810190601f1680156107ce5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156107e857600080fd5b50610827600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611cbe565b604051808215151515815260200191505060405180910390f35b34801561084d57600080fd5b50610882600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ff3565b005b34801561089057600080fd5b506108c5600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612060565b604051808481526020018315151515815260200182151515158152602001935050505060405180910390f35b3480156108fd57600080fd5b506109066120a4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561095457600080fd5b50610993600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506120ca565b604051808215151515815260200191505060405180910390f35b3480156109b957600080fd5b50610a0e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506122c6565b6040518082815260200191505060405180910390f35b348015610a3057600080fd5b50610a3961234d565b60405180831515151581526020018281526020019250505060405180910390f35b348015610a6657600080fd5b50610a9b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612361565b60405180831515151581526020018281526020019250505060405180910390f35b348015610ac857600080fd5b50610afd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061248a565b005b348015610b0b57600080fd5b50610b146125e2565b60405180831515151581526020018281526020019250505060405180910390f35b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b9157600080fd5b610b9e8282600180611592565b5050565b6040805190810160405280600781526020017f5649434465616c0000000000000000000000000000000000000000000000000081525081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60005481565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610d1057600080fd5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d5e57600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610de957600080fd5b610e3b82600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125f690919063ffffffff16565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610ed082600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461260f90919063ffffffff16565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610fa282600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125f690919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156110ee57600080fd5b6111008164e8d4a50fff600180611592565b50565b601281565b60066020528060005260406000206000915054906101000a900460ff1681565b6000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561117857600080fd5b600054821115151561118957600080fd5b33905081600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055508160008082825403925050819055508073ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5836040518082815260200191505060405180910390a25050565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083111561134b576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506113df565b61135e83826125f690919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561152757600080fd5b6115318282611cbe565b151561153c57600080fd5b61154582611092565b5050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115ee57600080fd5b60008473ffffffffffffffffffffffffffffffffffffffff161415151561161457600080fd5b6000151582151514801561162c575060001515811515145b1561163657600092505b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555081600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555080600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160016101000a81548160ff02191690831515021790555060008311156117a5578373ffffffffffffffffffffffffffffffffffffffff167f9a26d7aa8d0b0885c3a5cce1b95072a26bc415306c652f20e7b507c07a3914d5848484604051808481526020018315151515815260200182151515158152602001935050505060405180910390a26117e9565b8373ffffffffffffffffffffffffffffffffffffffff167f7e6adfec7e3f286831a0200a754127c171a2da564078722cb97704741bbdb0ea60405160405180910390a25b50505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff161415151561181857600080fd5b42600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541180156118bc575060011515600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160019054906101000a900460ff161515145b9150811561190e57600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050611913565b600090505b915091565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561197457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b1557600080fd5b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f1419fc91a0d31d7042ea1fc0fb24c255e2c68a9eda9e83715ad768761433a89e8282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a15050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c3b57600080fd5b611c458383611cbe565b1515611c5057600080fd5b611c5a8382610b35565b505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040805190810160405280600381526020017f56494c000000000000000000000000000000000000000000000000000000000081525081565b60003073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515611cfb57600080fd5b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611d9c5750600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15611db257611dab838361262d565b9050611fed565b42600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154118015611e56575060011515600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff161515145b15611ec9578273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f77c483e4ff749a73be4f6404c2ecea502a159772ef1cd46e475516a4cdf0eb0d846040518082815260200191505060405180910390a360009050611fed565b42600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154118015611f6d575060011515600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160019054906101000a900460ff161515145b15611fe0578273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f9afa4bbee84237d6edfd62a23e6fe062ff3073a421c564307d695b24b5e50d73846040518082815260200191505060405180910390a360009050611fed565b611fea838361262d565b90505b92915050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561204f57600080fd5b61205d816000806000611592565b50565b60056020528060005260406000206000915090508060000154908060010160009054906101000a900460ff16908060010160019054906101000a900460ff16905083565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061215b82600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461260f90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600080612359336117ef565b915091509091565b60008060008373ffffffffffffffffffffffffffffffffffffffff161415151561238a57600080fd5b42600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015411801561242e575060011515600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff161515145b9150811561248057600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050612485565b600090505b915091565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156124e657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561252257600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806125ee33612361565b915091509091565b600082821115151561260457fe5b818303905092915050565b600080828401905083811015151561262357fe5b8091505092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561266a57600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156126b857600080fd5b61270a82600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125f690919063ffffffff16565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061279f82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461260f90919063ffffffff16565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a360019050929150505600a165627a7a723058206847af93badb66edd01bcd009def324495b8f9111ddde3f3f0965536b77d11ac0029
Deployed Bytecode Sourcemap
8337:12285:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20603:8;;;14083:157;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14083:157:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8413:39;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8413:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;8413:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4579:187;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4579:187:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;186:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;186:26:0;;;;;;;;;;;;;;;;;;;;;;;3495:449;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3495:449:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14424:141;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14424:141:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8595:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8595:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8886:46;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8886:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20186:294;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20186:294:0;;;;;;;;;;;;;;;;;;;;;;;;;;6425:407;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6425:407:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19767:176;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19767:176:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2235:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2235:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13035:739;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13035:739:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15974:431;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15974:431:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8061:201;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8061:201:0;;;;;;17477:202;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17477:202:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19330:204;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19330:204:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7062:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7062:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8490:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8490:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;8490:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17888:1131;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17888:1131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14743:123;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14743:123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8712:55;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8712:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7089:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7089:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;5690:261;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5690:261:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5093:128;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5093:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17043:155;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17043:155:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15247:416;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15247:416:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7763:194;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7763:194:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;16651:146;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16651:146:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14083:157;7557:5;;;;;;;;;;;7543:19;;:10;:19;;;7535:28;;;;;;;;14179:53;14190:13;14205:14;14221:4;14227;14179:10;:53::i;:::-;14083:157;;:::o;8413:39::-;;;;;;;;;;;;;;;;;;;;:::o;4579:187::-;4646:4;4691:6;4659:7;:19;4667:10;4659:19;;;;;;;;;;;;;;;:29;4679:8;4659:29;;;;;;;;;;;;;;;:38;;;;4725:8;4704:38;;4713:10;4704:38;;;4735:6;4704:38;;;;;;;;;;;;;;;;;;4756:4;4749:11;;4579:187;;;;:::o;186:26::-;;;;:::o;3495:449::-;3577:4;3613:1;3598:17;;:3;:17;;;;3590:26;;;;;;;;3641:8;:15;3650:5;3641:15;;;;;;;;;;;;;;;;3631:6;:25;;3623:34;;;;;;;;3682:7;:14;3690:5;3682:14;;;;;;;;;;;;;;;:26;3697:10;3682:26;;;;;;;;;;;;;;;;3672:6;:36;;3664:45;;;;;;;;3736:27;3756:6;3736:8;:15;3745:5;3736:15;;;;;;;;;;;;;;;;:19;;:27;;;;:::i;:::-;3718:8;:15;3727:5;3718:15;;;;;;;;;;;;;;;:45;;;;3786:25;3804:6;3786:8;:13;3795:3;3786:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;3770:8;:13;3779:3;3770:13;;;;;;;;;;;;;;;:41;;;;3847:38;3878:6;3847:7;:14;3855:5;3847:14;;;;;;;;;;;;;;;:26;3862:10;3847:26;;;;;;;;;;;;;;;;:30;;:38;;;;:::i;:::-;3818:7;:14;3826:5;3818:14;;;;;;;;;;;;;;;:26;3833:10;3818:26;;;;;;;;;;;;;;;:67;;;;3908:3;3892:28;;3901:5;3892:28;;;3913:6;3892:28;;;;;;;;;;;;;;;;;;3934:4;3927:11;;3495:449;;;;;:::o;14424:141::-;7557:5;;;;;;;;;;;7543:19;;:10;:19;;;7535:28;;;;;;;;14506:51;14517:13;14532:12;14546:4;14552;14506:10;:51::i;:::-;14424:141;:::o;8595:35::-;8628:2;8595:35;:::o;8886:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;20186:294::-;20335:14;20252:8;:20;20261:10;20252:20;;;;;;;;;;;;;;;;20242:6;:30;;20234:39;;;;;;;;20302:11;;20292:6;:21;;20284:30;;;;;;;;20352:10;20335:27;;20393:6;20373:8;:16;20382:6;20373:16;;;;;;;;;;;;;;;;:26;;;;;;;;;;;20425:6;20410:11;;:21;;;;;;;;;;;20457:6;20452:20;;;20465:6;20452:20;;;;;;;;;;;;;;;;;;20186:294;;:::o;6425:407::-;6508:4;6521:13;6537:7;:19;6545:10;6537:19;;;;;;;;;;;;;;;:29;6557:8;6537:29;;;;;;;;;;;;;;;;6521:45;;6596:8;6577:16;:27;6573:168;;;6647:1;6615:7;:19;6623:10;6615:19;;;;;;;;;;;;;;;:29;6635:8;6615:29;;;;;;;;;;;;;;;:33;;;;6573:168;;;6703:30;6716:16;6703:8;:12;;:30;;;;:::i;:::-;6671:7;:19;6679:10;6671:19;;;;;;;;;;;;;;;:29;6691:8;6671:29;;;;;;;;;;;;;;;:62;;;;6573:168;6768:8;6747:61;;6756:10;6747:61;;;6778:7;:19;6786:10;6778:19;;;;;;;;;;;;;;;:29;6798:8;6778:29;;;;;;;;;;;;;;;;6747:61;;;;;;;;;;;;;;;;;;6822:4;6815:11;;6425:407;;;;;:::o;19767:176::-;7557:5;;;;;;;;;;;7543:19;;:10;:19;;;7535:28;;;;;;;;19865:22;19874:3;19879:7;19865:8;:22::i;:::-;19857:31;;;;;;;;19909:26;19931:3;19909:21;:26::i;:::-;19767:176;;:::o;2235:109::-;2291:15;2322:8;:16;2331:6;2322:16;;;;;;;;;;;;;;;;2315:23;;2235:109;;;:::o;13035:739::-;7557:5;;;;;;;;;;;7543:19;;:10;:19;;;7535:28;;;;;;;;13185:3;13168:13;:20;;;;13160:29;;;;;;;;13295:5;13282:18;;:9;:18;;;:43;;;;;13320:5;13304:21;;:12;:21;;;13282:43;13279:91;;;13357:1;13342:16;;13279:91;13438:12;13390:16;:31;13407:13;13390:31;;;;;;;;;;;;;;;:45;;:60;;;;13504:9;13461:16;:31;13478:13;13461:31;;;;;;;;;;;;;;;:40;;;:52;;;;;;;;;;;;;;;;;;13570:12;13524:16;:31;13541:13;13524:31;;;;;;;;;;;;;;;:43;;;:58;;;;;;;;;;;;;;;;;;13621:1;13606:12;:16;13603:164;;;13646:13;13639:60;;;13661:12;13675:9;13686:12;13639:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13603:164;;;13741:13;13732:23;;;;;;;;;;;;13603:164;13035:739;;;;:::o;15974:431::-;16046:20;16068:10;16108:3;16099:5;:12;;;;16091:21;;;;;;;;16192:3;16152:16;:23;16169:5;16152:23;;;;;;;;;;;;;;;:37;;;:43;:90;;;;;16238:4;16199:43;;:16;:23;16216:5;16199:23;;;;;;;;;;;;;;;:35;;;;;;;;;;;;:43;;;16152:90;16133:110;;16267:15;16264:134;;;16307:16;:23;16324:5;16307:23;;;;;;;;;;;;;;;:37;;;16299:45;;16264:134;;;16385:1;16377:9;;16264:134;15974:431;;;:::o;8061:201::-;8128:8;;;;;;;;;;;8114:22;;:10;:22;;;8106:31;;;;;;;;8186:8;;;;;;;;;;;8158:37;;8179:5;;;;;;;;;;;8158:37;;;;;;;;;;;;8214:8;;;;;;;;;;;8206:5;;:16;;;;;;;;;;;;;;;;;;8252:1;8233:8;;:21;;;;;;;;;;;;;;;;;;8061:201::o;17477:202::-;7557:5;;;;;;;;;;;7543:19;;:10;:19;;;7535:28;;;;;;;;17596:10;17570:13;:23;17584:8;17570:23;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;17627:44;17650:8;17660:10;17627:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17477:202;;:::o;19330:204::-;7557:5;;;;;;;;;;;7543:19;;:10;:19;;;7535:28;;;;;;;;19447:22;19456:3;19461:7;19447:8;:22::i;:::-;19439:31;;;;;;;;19491:35;19506:3;19511:14;19491;:35::i;:::-;19330:204;;;:::o;7062:20::-;;;;;;;;;;;;;:::o;8490:37::-;;;;;;;;;;;;;;;;;;;;:::o;17888:1131::-;17952:4;18050;18035:20;;:3;:20;;;;18027:29;;;;;;;;18177:13;:25;18191:10;18177:25;;;;;;;;;;;;;;;;;;;;;;;;;:47;;;;18206:13;:18;18220:3;18206:18;;;;;;;;;;;;;;;;;;;;;;;;;18177:47;18174:114;;;18248:28;18263:3;18268:7;18248:14;:28::i;:::-;18241:35;;;;18174:114;18419:3;18374:16;:28;18391:10;18374:28;;;;;;;;;;;;;;;:42;;;:48;:97;;;;;18467:4;18426:45;;:16;:28;18443:10;18426:28;;;;;;;;;;;;;;;:37;;;;;;;;;;;;:45;;;18374:97;18371:641;;;18534:3;18488:59;;18522:10;18488:59;;;18539:7;18488:59;;;;;;;;;;;;;;;;;;18569:5;18562:12;;;;18371:641;18712:3;18674:16;:21;18691:3;18674:21;;;;;;;;;;;;;;;:35;;;:41;:86;;;;;18756:4;18719:41;;:16;:21;18736:3;18719:21;;;;;;;;;;;;;;;:33;;;;;;;;;;;;:41;;;18674:86;18671:341;;;18821:3;18777:57;;18809:10;18777:57;;;18826:7;18777:57;;;;;;;;;;;;;;;;;;18856:5;18849:12;;;;18671:341;18972:28;18987:3;18992:7;18972:14;:28::i;:::-;18965:35;;17888:1131;;;;;:::o;14743:123::-;7557:5;;;;;;;;;;;7543:19;;:10;:19;;;7535:28;;;;;;;;14816:42;14827:13;14842:1;14845:5;14852;14816:10;:42::i;:::-;14743:123;:::o;8712:55::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7089:23::-;;;;;;;;;;;;;:::o;5690:261::-;5768:4;5813:46;5847:11;5813:7;:19;5821:10;5813:19;;;;;;;;;;;;;;;:29;5833:8;5813:29;;;;;;;;;;;;;;;;:33;;:46;;;;:::i;:::-;5781:7;:19;5789:10;5781:19;;;;;;;;;;;;;;;:29;5801:8;5781:29;;;;;;;;;;;;;;;:78;;;;5887:8;5866:61;;5875:10;5866:61;;;5897:7;:19;5905:10;5897:19;;;;;;;;;;;;;;;:29;5917:8;5897:29;;;;;;;;;;;;;;;;5866:61;;;;;;;;;;;;;;;;;;5941:4;5934:11;;5690:261;;;;:::o;5093:128::-;5167:7;5190;:15;5198:6;5190:15;;;;;;;;;;;;;;;:25;5206:8;5190:25;;;;;;;;;;;;;;;;5183:32;;5093:128;;;;:::o;17043:155::-;17104:20;17126:10;17156:34;17179:10;17156:22;:34::i;:::-;17149:41;;;;17043:155;;:::o;15247:416::-;15316:17;15335:10;15375:3;15366:5;:12;;;;15358:21;;;;;;;;15456:3;15416:16;:23;15433:5;15416:23;;;;;;;;;;;;;;;:37;;;:43;:87;;;;;15499:4;15463:40;;:16;:23;15480:5;15463:23;;;;;;;;;;;;;;;:32;;;;;;;;;;;;:40;;;15416:87;15400:104;;15528:12;15525:131;;;15565:16;:23;15582:5;15565:23;;;;;;;;;;;;;;;:37;;;15557:45;;15525:131;;;15643:1;15635:9;;15525:131;15247:416;;;:::o;7763:194::-;7557:5;;;;;;;;;;;7543:19;;:10;:19;;;7535:28;;;;;;;;7866:1;7845:23;;:9;:23;;;;7837:32;;;;;;;;7908:9;7880:38;;7901:5;;;;;;;;;;;7880:38;;;;;;;;;;;;7940:9;7929:8;;:20;;;;;;;;;;;;;;;;;;7763:194;:::o;16651:146::-;16709:17;16728:10;16758:31;16778:10;16758:19;:31::i;:::-;16751:38;;;;16651:146;;:::o;1013:113::-;1071:7;1099:1;1094;:6;;1087:14;;;;;;1119:1;1115;:5;1108:12;;1013:113;;;;:::o;1132:133::-;1190:7;1206:9;1222:1;1218;:5;1206:17;;1242:1;1237;:6;;1230:14;;;;;;1258:1;1251:8;;1132:133;;;;;:::o;1638:388::-;1701:4;1737:1;1722:17;;:3;:17;;;;1714:26;;;;;;;;1765:8;:20;1774:10;1765:20;;;;;;;;;;;;;;;;1755:6;:30;;1747:39;;;;;;;;1882:32;1907:6;1882:8;:20;1891:10;1882:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;1859:8;:20;1868:10;1859:20;;;;;;;;;;;;;;;:55;;;;1937:25;1955:6;1937:8;:13;1946:3;1937:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;1921:8;:13;1930:3;1921:13;;;;;;;;;;;;;;;:41;;;;1990:3;1969:33;;1978:10;1969:33;;;1995:6;1969:33;;;;;;;;;;;;;;;;;;2016:4;2009:11;;1638:388;;;;:::o
Swarm Source
bzzr://6847af93badb66edd01bcd009def324495b8f9111ddde3f3f0965536b77d11ac
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.