ETH Price: $2,920.70 (+4.54%)
 

Overview

Max Total Supply

9,520,000,000 APIS

Holders

8,784 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
2,775.346623614786737562 APIS

Value
$0.00
0x5c31ad35da16b347f2c3b8e28a4eed81bd4538ac
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Key currency of masternode coin & the first masternode mediation.

ICO Information

ICO Start Date : Mar 04, 2018
ICO End Date : Apr 03, 2018
Country : Singapore

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ApisToken

Compiler Version
v0.4.18+commit.9cf6e910

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-03-29
*/

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 APIS Token
 * @dev APIS 토큰을 생성한다
 */
contract ApisToken is StandardToken, Ownable {
    // 토큰의 이름
    string public constant name = "APIS";
    
    // 토큰의 단위
    string public constant symbol = "APIS";
    
    // 소수점 자리수. 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 ApisToken() public {
        // 총 APIS 발행량 (95억 2천만)
        uint256 supplyApis = 9520000000;
        
        // wei 단위로 토큰 총량을 생성한다.
        totalSupply = supplyApis * 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 지갑으로 _apisWei 만큼의 토큰을 송금한다.
     * @param _to 토큰을 받는 지갑 주소
     * @param _apisWei 전송되는 토큰의 양
     */
    function transfer(address _to, uint256 _apisWei) public returns (bool) {
        // 자신에게 송금하는 것을 방지한다
        require(_to != address(this));
        
        // 마스터노드 컨트렉트일 경우, APIS 송수신에 제한을 두지 않는다
        if(manoContracts[msg.sender] || manoContracts[_to]) {
            return super.transfer(_to, _apisWei);
        }
        
        // 송금 기능이 잠긴 지갑인지 확인한다.
        if(lockedWalletInfo[msg.sender].timeLockUpEnd > now && lockedWalletInfo[msg.sender].sendLock == true) {
            RejectedPaymentFromLockedUpWallet(msg.sender, _to, _apisWei);
            return false;
        } 
        // 입금 받는 기능이 잠긴 지갑인지 확인한다
        else if(lockedWalletInfo[_to].timeLockUpEnd > now && lockedWalletInfo[_to].receiveLock == true) {
            RejectedPaymentToLockedUpWallet(msg.sender, _to, _apisWei);
            return false;
        } 
        // 제한이 없는 경우, 송금을 진행한다.
        else {
            return super.transfer(_to, _apisWei);
        }
    }
    
    /**
     * @dev _to 지갑으로 _apisWei 만큼의 APIS를 송금하고 _timeLockUpEnd 시간만큼 지갑을 잠근다
     * @param _to 토큰을 받는 지갑 주소
     * @param _apisWei 전송되는 토큰의 양(wei)
     * @param _timeLockUpEnd 잠금이 해제되는 시간
     */
    function transferAndLockUntil(address _to, uint256 _apisWei, uint _timeLockUpEnd) onlyOwner public {
        require(transfer(_to, _apisWei));
        
        walletLockBoth(_to, _timeLockUpEnd);
    }
    
    /**
     * @dev _to 지갑으로 _apisWei 만큼의 APIS를 송금하고영원히 지갑을 잠근다
     * @param _to 토큰을 받는 지갑 주소
     * @param _apisWei 전송되는 토큰의 양(wei)
     */
    function transferAndLockForever(address _to, uint256 _apisWei) onlyOwner public {
        require(transfer(_to, _apisWei));
        
        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 ApisCrowdSale 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 토큰 컨트렉트
    ApisToken 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 _addressOfApisTokenUsedAsReward APIS 토큰의 컨트렉트 주소
     * @param _addressOfWhiteList WhiteList 컨트렉트 주소
     */
    function ApisCrowdSale (
        uint256 _fundingGoalApis,
        uint _startTime,
        uint _endTime,
        address _addressOfApisTokenUsedAsReward,
        address _addressOfWhiteList
    ) public {
        require (_fundingGoalApis > 0);
        require (_startTime > now);
        require (_endTime > _startTime);
        require (_addressOfApisTokenUsedAsReward != 0x0);
        require (_addressOfWhiteList != 0x0);
        
        fundingGoal = _fundingGoalApis * 10 ** uint256(decimals);
        
        startTime = _startTime;
        endTime = _endTime;
        
        // 토큰 스마트컨트렉트를 불러온다
        tokenReward = ApisToken(_addressOfApisTokenUsedAsReward);
        
        // 화이트 리스트를 가져온다
        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

Contract ABI

[{"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":"_apisWei","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":"_apisWei","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":"_apisWei","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"}]

6060604052341561000f57600080fd5b60038054600160a060020a03191633600160a060020a03169081179091556b1ec2c26a1a64c4d3300000006000818155828152600160205260408082208390556402376fac0093927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef915190815260200160405180910390a3506112d4806100986000396000f3006060604052600436106101745763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166303a1bdc3811461017957806306fdde031461019d578063095ea7b31461022757806318160ddd1461025d57806323b872dd146102825780632823fbe5146102aa578063313ce567146102c9578063385ec577146102f257806342966c681461031157806366188463146103275780636a59d0a41461034957806370a082311461036b57806374ccd7cc1461038a578063788c4023146103b657806379ba5097146103ef5780637cf846c91461040257806385d544be146104265780638da5cb5b1461044b57806395d89b411461019d578063a9059cbb1461047a578063af87c3661461049c578063d48b38b7146104bb578063d4ee1d9014610500578063d73dd62314610513578063dd62ed3e14610535578063e374e8d41461055a578063f1f62f101461056d578063f2fde38b1461058c578063fbcc3775146105ab575b600080fd5b341561018457600080fd5b61019b600160a060020a03600435166024356105be565b005b34156101a857600080fd5b6101b06105ea565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156101ec5780820151838201526020016101d4565b50505050905090810190601f1680156102195780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561023257600080fd5b610249600160a060020a0360043516602435610621565b604051901515815260200160405180910390f35b341561026857600080fd5b61027061068e565b60405190815260200160405180910390f35b341561028d57600080fd5b610249600160a060020a0360043581169060243516604435610694565b34156102b557600080fd5b61019b600160a060020a0360043516610816565b34156102d457600080fd5b6102dc610846565b60405160ff909116815260200160405180910390f35b34156102fd57600080fd5b610249600160a060020a036004351661084b565b341561031c57600080fd5b61019b600435610860565b341561033257600080fd5b610249600160a060020a03600435166024356108f5565b341561035457600080fd5b61019b600160a060020a03600435166024356109ef565b341561037657600080fd5b610270600160a060020a0360043516610a28565b341561039557600080fd5b61019b600160a060020a036004351660243560443515156064351515610a43565b34156103c157600080fd5b6103d5600160a060020a0360043516610b5c565b604051911515825260208201526040908101905180910390f35b34156103fa57600080fd5b61019b610bf1565b341561040d57600080fd5b61019b600160a060020a03600435166024351515610c7f565b341561043157600080fd5b61019b600160a060020a0360043516602435604435610d0b565b341561045657600080fd5b61045e610d4a565b604051600160a060020a03909116815260200160405180910390f35b341561048557600080fd5b610249600160a060020a0360043516602435610d59565b34156104a757600080fd5b61019b600160a060020a0360043516610f18565b34156104c657600080fd5b6104da600160a060020a0360043516610f41565b604051928352901515602083015215156040808301919091526060909101905180910390f35b341561050b57600080fd5b61045e610f66565b341561051e57600080fd5b610249600160a060020a0360043516602435610f75565b341561054057600080fd5b610270600160a060020a0360043581169060243516611019565b341561056557600080fd5b6103d5611044565b341561057857600080fd5b6103d5600160a060020a0360043516611058565b341561059757600080fd5b61019b600160a060020a03600435166110de565b34156105b657600080fd5b6103d5611179565b60035433600160a060020a039081169116146105d957600080fd5b6105e68282600180610a43565b5050565b60408051908101604052600481527f4150495300000000000000000000000000000000000000000000000000000000602082015281565b600160a060020a03338116600081815260026020908152604080832094871680845294909152808220859055909291907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a35060015b92915050565b60005481565b6000600160a060020a03831615156106ab57600080fd5b600160a060020a0384166000908152600160205260409020548211156106d057600080fd5b600160a060020a038085166000908152600260209081526040808320339094168352929052205482111561070357600080fd5b600160a060020a03841660009081526001602052604090205461072c908363ffffffff61118516565b600160a060020a038086166000908152600160205260408082209390935590851681522054610761908363ffffffff61119716565b600160a060020a038085166000908152600160209081526040808320949094558783168252600281528382203390931682529190915220546107a9908363ffffffff61118516565b600160a060020a03808616600081815260026020908152604080832033861684529091529081902093909355908516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a35060019392505050565b60035433600160a060020a0390811691161461083157600080fd5b6108438164e8d4a50fff600180610a43565b50565b601281565b60066020526000908152604090205460ff1681565b600160a060020a03331660009081526001602052604081205482111561088557600080fd5b60005482111561089457600080fd5b5033600160a060020a0381166000818152600160205260408082208054869003905581548590039091557fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59084905190815260200160405180910390a25050565b600160a060020a0333811660009081526002602090815260408083209386168352929052908120548083111561095257600160a060020a033381166000908152600260209081526040808320938816835292905290812055610989565b610962818463ffffffff61118516565b600160a060020a033381166000908152600260209081526040808320938916835292905220555b600160a060020a0333811660008181526002602090815260408083209489168084529490915290819020547f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925915190815260200160405180910390a35060019392505050565b60035433600160a060020a03908116911614610a0a57600080fd5b610a148282610d59565b1515610a1f57600080fd5b6105e682610816565b600160a060020a031660009081526001602052604090205490565b60035433600160a060020a03908116911614610a5e57600080fd5b600160a060020a0384161515610a7357600080fd5b81158015610a7f575080155b15610a8957600092505b600160a060020a0384166000908152600560205260408120848155600101805460ff19168415151761ff00191661010084151502179055831115610b1f5783600160a060020a03167f9a26d7aa8d0b0885c3a5cce1b95072a26bc415306c652f20e7b507c07a3914d5848484604051928352901515602083015215156040808301919091526060909101905180910390a2610b56565b83600160a060020a03167f7e6adfec7e3f286831a0200a754127c171a2da564078722cb97704741bbdb0ea60405160405180910390a25b50505050565b600080600160a060020a0383161515610b7457600080fd5b600160a060020a0383166000908152600560205260409020544290118015610bc15750600160a060020a0383166000908152600560205260409020600190810154610100900460ff161515145b91508115610be85750600160a060020a038216600090815260056020526040902054610bec565b5060005b915091565b60045433600160a060020a03908116911614610c0c57600080fd5b600454600354600160a060020a0391821691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600480546003805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03841617909155169055565b60035433600160a060020a03908116911614610c9a57600080fd5b600160a060020a03821660009081526006602052604090819020805460ff19168315151790557f1419fc91a0d31d7042ea1fc0fb24c255e2c68a9eda9e83715ad768761433a89e908390839051600160a060020a039092168252151560208201526040908101905180910390a15050565b60035433600160a060020a03908116911614610d2657600080fd5b610d308383610d59565b1515610d3b57600080fd5b610d4583826105be565b505050565b600354600160a060020a031681565b600030600160a060020a031683600160a060020a031614151515610d7c57600080fd5b600160a060020a03331660009081526006602052604090205460ff1680610dbb5750600160a060020a03831660009081526006602052604090205460ff165b15610dd157610dca83836111ad565b9050610688565b600160a060020a0333166000908152600560205260409020544290118015610e195750600160a060020a033316600090815260056020526040902060019081015460ff161515145b15610e6d5782600160a060020a031633600160a060020a03167f77c483e4ff749a73be4f6404c2ecea502a159772ef1cd46e475516a4cdf0eb0d8460405190815260200160405180910390a3506000610688565b600160a060020a0383166000908152600560205260409020544290118015610eba5750600160a060020a0383166000908152600560205260409020600190810154610100900460ff161515145b15610f0e5782600160a060020a031633600160a060020a03167f9afa4bbee84237d6edfd62a23e6fe062ff3073a421c564307d695b24b5e50d738460405190815260200160405180910390a3506000610688565b610dca83836111ad565b60035433600160a060020a03908116911614610f3357600080fd5b610843816000806000610a43565b6005602052600090815260409020805460019091015460ff8082169161010090041683565b600454600160a060020a031681565b600160a060020a033381166000908152600260209081526040808320938616835292905290812054610fad908363ffffffff61119716565b600160a060020a0333811660008181526002602090815260408083209489168084529490915290819020849055919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591905190815260200160405180910390a350600192915050565b600160a060020a03918216600090815260026020908152604080832093909416825291909152205490565b60008061105033610b5c565b915091509091565b600080600160a060020a038316151561107057600080fd5b600160a060020a0383166000908152600560205260409020544290118015610bc15750600160a060020a038316600090815260056020526040902060019081015460ff1615151491508115610be85750600160a060020a038216600090815260056020526040902054610bec565b60035433600160a060020a039081169116146110f957600080fd5b600160a060020a038116151561110e57600080fd5b600354600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60008061105033611058565b60008282111561119157fe5b50900390565b6000828201838110156111a657fe5b9392505050565b6000600160a060020a03831615156111c457600080fd5b600160a060020a0333166000908152600160205260409020548211156111e957600080fd5b600160a060020a033316600090815260016020526040902054611212908363ffffffff61118516565b600160a060020a033381166000908152600160205260408082209390935590851681522054611247908363ffffffff61119716565b600160a060020a0380851660008181526001602052604090819020939093559133909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a3506001929150505600a165627a7a723058208e915161962b5078452450b2ab04ad981e0f25dfa77687187c263eb550f3f5990029

Deployed Bytecode

0x6060604052600436106101745763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166303a1bdc3811461017957806306fdde031461019d578063095ea7b31461022757806318160ddd1461025d57806323b872dd146102825780632823fbe5146102aa578063313ce567146102c9578063385ec577146102f257806342966c681461031157806366188463146103275780636a59d0a41461034957806370a082311461036b57806374ccd7cc1461038a578063788c4023146103b657806379ba5097146103ef5780637cf846c91461040257806385d544be146104265780638da5cb5b1461044b57806395d89b411461019d578063a9059cbb1461047a578063af87c3661461049c578063d48b38b7146104bb578063d4ee1d9014610500578063d73dd62314610513578063dd62ed3e14610535578063e374e8d41461055a578063f1f62f101461056d578063f2fde38b1461058c578063fbcc3775146105ab575b600080fd5b341561018457600080fd5b61019b600160a060020a03600435166024356105be565b005b34156101a857600080fd5b6101b06105ea565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156101ec5780820151838201526020016101d4565b50505050905090810190601f1680156102195780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561023257600080fd5b610249600160a060020a0360043516602435610621565b604051901515815260200160405180910390f35b341561026857600080fd5b61027061068e565b60405190815260200160405180910390f35b341561028d57600080fd5b610249600160a060020a0360043581169060243516604435610694565b34156102b557600080fd5b61019b600160a060020a0360043516610816565b34156102d457600080fd5b6102dc610846565b60405160ff909116815260200160405180910390f35b34156102fd57600080fd5b610249600160a060020a036004351661084b565b341561031c57600080fd5b61019b600435610860565b341561033257600080fd5b610249600160a060020a03600435166024356108f5565b341561035457600080fd5b61019b600160a060020a03600435166024356109ef565b341561037657600080fd5b610270600160a060020a0360043516610a28565b341561039557600080fd5b61019b600160a060020a036004351660243560443515156064351515610a43565b34156103c157600080fd5b6103d5600160a060020a0360043516610b5c565b604051911515825260208201526040908101905180910390f35b34156103fa57600080fd5b61019b610bf1565b341561040d57600080fd5b61019b600160a060020a03600435166024351515610c7f565b341561043157600080fd5b61019b600160a060020a0360043516602435604435610d0b565b341561045657600080fd5b61045e610d4a565b604051600160a060020a03909116815260200160405180910390f35b341561048557600080fd5b610249600160a060020a0360043516602435610d59565b34156104a757600080fd5b61019b600160a060020a0360043516610f18565b34156104c657600080fd5b6104da600160a060020a0360043516610f41565b604051928352901515602083015215156040808301919091526060909101905180910390f35b341561050b57600080fd5b61045e610f66565b341561051e57600080fd5b610249600160a060020a0360043516602435610f75565b341561054057600080fd5b610270600160a060020a0360043581169060243516611019565b341561056557600080fd5b6103d5611044565b341561057857600080fd5b6103d5600160a060020a0360043516611058565b341561059757600080fd5b61019b600160a060020a03600435166110de565b34156105b657600080fd5b6103d5611179565b60035433600160a060020a039081169116146105d957600080fd5b6105e68282600180610a43565b5050565b60408051908101604052600481527f4150495300000000000000000000000000000000000000000000000000000000602082015281565b600160a060020a03338116600081815260026020908152604080832094871680845294909152808220859055909291907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a35060015b92915050565b60005481565b6000600160a060020a03831615156106ab57600080fd5b600160a060020a0384166000908152600160205260409020548211156106d057600080fd5b600160a060020a038085166000908152600260209081526040808320339094168352929052205482111561070357600080fd5b600160a060020a03841660009081526001602052604090205461072c908363ffffffff61118516565b600160a060020a038086166000908152600160205260408082209390935590851681522054610761908363ffffffff61119716565b600160a060020a038085166000908152600160209081526040808320949094558783168252600281528382203390931682529190915220546107a9908363ffffffff61118516565b600160a060020a03808616600081815260026020908152604080832033861684529091529081902093909355908516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a35060019392505050565b60035433600160a060020a0390811691161461083157600080fd5b6108438164e8d4a50fff600180610a43565b50565b601281565b60066020526000908152604090205460ff1681565b600160a060020a03331660009081526001602052604081205482111561088557600080fd5b60005482111561089457600080fd5b5033600160a060020a0381166000818152600160205260408082208054869003905581548590039091557fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59084905190815260200160405180910390a25050565b600160a060020a0333811660009081526002602090815260408083209386168352929052908120548083111561095257600160a060020a033381166000908152600260209081526040808320938816835292905290812055610989565b610962818463ffffffff61118516565b600160a060020a033381166000908152600260209081526040808320938916835292905220555b600160a060020a0333811660008181526002602090815260408083209489168084529490915290819020547f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925915190815260200160405180910390a35060019392505050565b60035433600160a060020a03908116911614610a0a57600080fd5b610a148282610d59565b1515610a1f57600080fd5b6105e682610816565b600160a060020a031660009081526001602052604090205490565b60035433600160a060020a03908116911614610a5e57600080fd5b600160a060020a0384161515610a7357600080fd5b81158015610a7f575080155b15610a8957600092505b600160a060020a0384166000908152600560205260408120848155600101805460ff19168415151761ff00191661010084151502179055831115610b1f5783600160a060020a03167f9a26d7aa8d0b0885c3a5cce1b95072a26bc415306c652f20e7b507c07a3914d5848484604051928352901515602083015215156040808301919091526060909101905180910390a2610b56565b83600160a060020a03167f7e6adfec7e3f286831a0200a754127c171a2da564078722cb97704741bbdb0ea60405160405180910390a25b50505050565b600080600160a060020a0383161515610b7457600080fd5b600160a060020a0383166000908152600560205260409020544290118015610bc15750600160a060020a0383166000908152600560205260409020600190810154610100900460ff161515145b91508115610be85750600160a060020a038216600090815260056020526040902054610bec565b5060005b915091565b60045433600160a060020a03908116911614610c0c57600080fd5b600454600354600160a060020a0391821691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600480546003805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03841617909155169055565b60035433600160a060020a03908116911614610c9a57600080fd5b600160a060020a03821660009081526006602052604090819020805460ff19168315151790557f1419fc91a0d31d7042ea1fc0fb24c255e2c68a9eda9e83715ad768761433a89e908390839051600160a060020a039092168252151560208201526040908101905180910390a15050565b60035433600160a060020a03908116911614610d2657600080fd5b610d308383610d59565b1515610d3b57600080fd5b610d4583826105be565b505050565b600354600160a060020a031681565b600030600160a060020a031683600160a060020a031614151515610d7c57600080fd5b600160a060020a03331660009081526006602052604090205460ff1680610dbb5750600160a060020a03831660009081526006602052604090205460ff165b15610dd157610dca83836111ad565b9050610688565b600160a060020a0333166000908152600560205260409020544290118015610e195750600160a060020a033316600090815260056020526040902060019081015460ff161515145b15610e6d5782600160a060020a031633600160a060020a03167f77c483e4ff749a73be4f6404c2ecea502a159772ef1cd46e475516a4cdf0eb0d8460405190815260200160405180910390a3506000610688565b600160a060020a0383166000908152600560205260409020544290118015610eba5750600160a060020a0383166000908152600560205260409020600190810154610100900460ff161515145b15610f0e5782600160a060020a031633600160a060020a03167f9afa4bbee84237d6edfd62a23e6fe062ff3073a421c564307d695b24b5e50d738460405190815260200160405180910390a3506000610688565b610dca83836111ad565b60035433600160a060020a03908116911614610f3357600080fd5b610843816000806000610a43565b6005602052600090815260409020805460019091015460ff8082169161010090041683565b600454600160a060020a031681565b600160a060020a033381166000908152600260209081526040808320938616835292905290812054610fad908363ffffffff61119716565b600160a060020a0333811660008181526002602090815260408083209489168084529490915290819020849055919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591905190815260200160405180910390a350600192915050565b600160a060020a03918216600090815260026020908152604080832093909416825291909152205490565b60008061105033610b5c565b915091509091565b600080600160a060020a038316151561107057600080fd5b600160a060020a0383166000908152600560205260409020544290118015610bc15750600160a060020a038316600090815260056020526040902060019081015460ff1615151491508115610be85750600160a060020a038216600090815260056020526040902054610bec565b60035433600160a060020a039081169116146110f957600080fd5b600160a060020a038116151561110e57600080fd5b600354600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60008061105033611058565b60008282111561119157fe5b50900390565b6000828201838110156111a657fe5b9392505050565b6000600160a060020a03831615156111c457600080fd5b600160a060020a0333166000908152600160205260409020548211156111e957600080fd5b600160a060020a033316600090815260016020526040902054611212908363ffffffff61118516565b600160a060020a033381166000908152600160205260408082209390935590851681522054611247908363ffffffff61119716565b600160a060020a0380851660008181526001602052604090819020939093559133909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a3506001929150505600a165627a7a723058208e915161962b5078452450b2ab04ad981e0f25dfa77687187c263eb550f3f5990029

Swarm Source

bzzr://8e915161962b5078452450b2ab04ad981e0f25dfa77687187c263eb550f3f599
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.