ETH Price: $2,939.39 (+4.74%)
 

Overview

Max Total Supply

10,000,000,000 IDA

Holders

30,429

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
3,092.5 IDA

Value
$0.00
0x55450a289c1238568e94efeb03413e64faa05196
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
IdaToken

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-09-19
*/

pragma solidity ^0.4.24;

/**
 * Utility library of inline functions on addresses
 */
library AddressUtils {

  /**
   * Returns whether the target address is a contract
   * @dev This function will return false if invoked during the constructor of a contract,
   * as the code is not actually created until after the constructor finishes.
   * @param addr address to check
   * @return whether the target address is a contract
   */
  function isContract(address addr) internal view returns (bool) {
    uint256 size;
    // XXX Currently there is no better way to check if there is a contract in an address
    // than to check the size of the code at that address.
    // See https://ethereum.stackexchange.com/a/14016/36603
    // for more details about how this works.
    // TODO Check this again before the Serenity release, because all addresses will be
    // contracts then.
    // solium-disable-next-line security/no-inline-assembly
    assembly { size := extcodesize(addr) }
    return size > 0;
  }

}

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
    // Gas optimization: this is cheaper than asserting 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (a == 0) {
      return 0;
    }

    c = a * b;
    assert(c / a == b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  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 a / b;
  }

  /**
  * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
    c = a + b;
    assert(c >= a);
    return c;
  }
}

/**
 * @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;


  event OwnershipRenounced(address indexed previousOwner);
  event OwnershipTransferred(
    address indexed previousOwner,
    address indexed newOwner
  );


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  constructor() 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 relinquish control of the contract.
   * @notice Renouncing to ownership will leave the contract without an owner.
   * It will not be possible to call the functions with the `onlyOwner`
   * modifier anymore.
   */
  function renounceOwnership() public onlyOwner {
    emit OwnershipRenounced(owner);
    owner = address(0);
  }

  /**
   * @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 {
    _transferOwnership(_newOwner);
  }

  /**
   * @dev Transfers control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function _transferOwnership(address _newOwner) internal {
    require(_newOwner != address(0));
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }
}

/**
 * @title Roles
 * @author Francisco Giordano (@frangio)
 * @dev Library for managing addresses assigned to a Role.
 * See RBAC.sol for example usage.
 */
library Roles {
  struct Role {
    mapping (address => bool) bearer;
  }

  /**
   * @dev give an address access to this role
   */
  function add(Role storage role, address addr)
    internal
  {
    role.bearer[addr] = true;
  }

  /**
   * @dev remove an address' access to this role
   */
  function remove(Role storage role, address addr)
    internal
  {
    role.bearer[addr] = false;
  }

  /**
   * @dev check if an address has this role
   * // reverts
   */
  function check(Role storage role, address addr)
    view
    internal
  {
    require(has(role, addr));
  }

  /**
   * @dev check if an address has this role
   * @return bool
   */
  function has(Role storage role, address addr)
    view
    internal
    returns (bool)
  {
    return role.bearer[addr];
  }
}

/**
 * @title RBAC (Role-Based Access Control)
 * @author Matt Condon (@Shrugs)
 * @dev Stores and provides setters and getters for roles and addresses.
 * Supports unlimited numbers of roles and addresses.
 * See //contracts/mocks/RBACMock.sol for an example of usage.
 * This RBAC method uses strings to key roles. It may be beneficial
 * for you to write your own implementation of this interface using Enums or similar.
 */
contract RBAC {
  using Roles for Roles.Role;

  mapping (string => Roles.Role) private roles;

  event RoleAdded(address indexed operator, string role);
  event RoleRemoved(address indexed operator, string role);

  /**
   * @dev reverts if addr does not have role
   * @param _operator address
   * @param _role the name of the role
   * // reverts
   */
  function checkRole(address _operator, string _role)
    view
    public
  {
    roles[_role].check(_operator);
  }

  /**
   * @dev determine if addr has role
   * @param _operator address
   * @param _role the name of the role
   * @return bool
   */
  function hasRole(address _operator, string _role)
    view
    public
    returns (bool)
  {
    return roles[_role].has(_operator);
  }

  /**
   * @dev add a role to an address
   * @param _operator address
   * @param _role the name of the role
   */
  function addRole(address _operator, string _role)
    internal
  {
    roles[_role].add(_operator);
    emit RoleAdded(_operator, _role);
  }

  /**
   * @dev remove a role from an address
   * @param _operator address
   * @param _role the name of the role
   */
  function removeRole(address _operator, string _role)
    internal
  {
    roles[_role].remove(_operator);
    emit RoleRemoved(_operator, _role);
  }

  /**
   * @dev modifier to scope access to a single role (uses msg.sender as addr)
   * @param _role the name of the role
   * // reverts
   */
  modifier onlyRole(string _role)
  {
    checkRole(msg.sender, _role);
    _;
  }

  /**
   * @dev modifier to scope access to a set of roles (uses msg.sender as addr)
   * @param _roles the names of the roles to scope access to
   * // reverts
   *
   * @TODO - when solidity supports dynamic arrays as arguments to modifiers, provide this
   *  see: https://github.com/ethereum/solidity/issues/2467
   */
  // modifier onlyRoles(string[] _roles) {
  //     bool hasAnyRole = false;
  //     for (uint8 i = 0; i < _roles.length; i++) {
  //         if (hasRole(msg.sender, _roles[i])) {
  //             hasAnyRole = true;
  //             break;
  //         }
  //     }

  //     require(hasAnyRole);

  //     _;
  // }
}

/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * See https://github.com/ethereum/EIPs/issues/179
 */
contract ERC20Basic {
  function totalSupply() public view returns (uint256);
  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 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 Basic token
 * @dev Basic version of StandardToken, with no allowances.
 */
contract BasicToken is ERC20Basic {
  using SafeMath for uint256;

  mapping(address => uint256) internal balances;

  uint256 internal totalSupply_;

  /**
  * @dev Total number of tokens in existence
  */
  function totalSupply() public view returns (uint256) {
    return totalSupply_;
  }

  /**
  * @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(_value <= balances[msg.sender]);
    require(_to != address(0));

    balances[msg.sender] = balances[msg.sender].sub(_value);
    balances[_to] = balances[_to].add(_value);
    emit 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) {
    return balances[_owner];
  }

}

/**
 * @title Standard ERC20 token
 *
 * @dev Implementation of the basic standard token.
 * https://github.com/ethereum/EIPs/issues/20
 * 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(_value <= balances[_from]);
    require(_value <= allowed[_from][msg.sender]);
    require(_to != address(0));

    balances[_from] = balances[_from].sub(_value);
    balances[_to] = balances[_to].add(_value);
    allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
    emit 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) {
    require(_spender != address(0));
    allowed[msg.sender][_spender] = _value;
    emit 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,
    uint256 _addedValue
  )
    public
    returns (bool)
  {
    require(_spender != address(0));
    allowed[msg.sender][_spender] = (
      allowed[msg.sender][_spender].add(_addedValue));
    emit 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,
    uint256 _subtractedValue
  )
    public
    returns (bool)
  {
    require(_spender != address(0));
    uint256 oldValue = allowed[msg.sender][_spender];
    if (_subtractedValue >= oldValue) {
      allowed[msg.sender][_spender] = 0;
    } else {
      allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
    }
    emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

}

contract IdaToken is Ownable, RBAC, StandardToken {
    using AddressUtils for address;
    using SafeMath for uint256;

    string public name    = "IDA";
    string public symbol  = "IDA";
    uint8 public decimals = 18;

    // 初始发行量 100 亿
    uint256 public constant INITIAL_SUPPLY          = 10000000000;
    // 基石轮额度 3.96 亿
    uint256 public constant FOOTSTONE_ROUND_AMOUNT  = 396000000;
    // 私募额度 12 亿
    uint256 public constant PRIVATE_SALE_AMOUNT     = 1200000000;
    // 2019/05/01 之前的 Owner 锁仓额度 50 亿
    uint256 public constant OWNER_LOCKED_IN_COMMON     = 5000000000;
    // 通用额度 72.04 亿 (IDA 基金会、研发、生态建设、社区建设、运营)
    uint256 public constant COMMON_PURPOSE_AMOUNT   = 7204000000;
    // 团队预留额度1 1.2 亿
    uint256 public constant TEAM_RESERVED_AMOUNT1   = 120000000;
    // 团队预留额度2 3.6 亿
    uint256 public constant TEAM_RESERVED_AMOUNT2   = 360000000;
    // 团队预留额度3 3.6 亿
    uint256 public constant TEAM_RESERVED_AMOUNT3   = 360000000;
    // 团队预留额度4 3.6 亿
    uint256 public constant TEAM_RESERVED_AMOUNT4   = 360000000;

    // 私募中的 Ether 兑换比率,1 Ether = 10000 IDA
    uint256 public constant EXCHANGE_RATE_IN_PRIVATE_SALE = 10000;

    // 2018/10/01 00:00:01 的时间戳常数
    uint256 public constant TIMESTAMP_OF_20181001000001 = 1538352001;
    // 2018/10/02 00:00:01 的时间戳常数
    uint256 public constant TIMESTAMP_OF_20181002000001 = 1538438401;
    // 2018/11/01 00:00:01 的时间戳常数
    uint256 public constant TIMESTAMP_OF_20181101000001 = 1541030401;
    // 2019/02/01 00:00:01 的时间戳常数
    uint256 public constant TIMESTAMP_OF_20190201000001 = 1548979201;
    // 2019/05/01 00:00:01 的时间戳常数
    uint256 public constant TIMESTAMP_OF_20190501000001 = 1556668801;
    // 2019/08/01 00:00:01 的时间戳常数
    uint256 public constant TIMESTAMP_OF_20190801000001 = 1564617601;
    // 2019/11/01 00:00:01 的时间戳常数
    uint256 public constant TIMESTAMP_OF_20191101000001 = 1572566401;
    // 2020/11/01 00:00:01 的时间戳常数
    uint256 public constant TIMESTAMP_OF_20201101000001 = 1604188801;
    // 2021/11/01 00:00:01 的时间戳常数
    uint256 public constant TIMESTAMP_OF_20211101000001 = 1635724801;

    // Role constant of Partner Whitelist
    string public constant ROLE_PARTNERWHITELIST = "partnerWhitelist";
    // Role constant of Privatesale Whitelist
    string public constant ROLE_PRIVATESALEWHITELIST = "privateSaleWhitelist";

    // 由 Owner 分发的总数额
    uint256 public totalOwnerReleased;
    // 所有 partner 的已分发额总数
    uint256 public totalPartnersReleased;
    // 所有私募代理人的已分发数额总数
    uint256 public totalPrivateSalesReleased;
    // 通用额度的已分发数额总数
    uint256 public totalCommonReleased;
    // 团队保留额度的已分发数额总数1
    uint256 public totalTeamReleased1;
    // 团队保留额度的已分发数额总数2
    uint256 public totalTeamReleased2;
    // 团队保留额度的已分发数额总数3
    uint256 public totalTeamReleased3;
    // 团队保留额度的已分发数额总数4
    uint256 public totalTeamReleased4;

    // Partner 地址数组
    address[] private partners;
    // Partner 地址在数组中索引
    mapping (address => uint256) private partnersIndex;
    // 私募代理人地址数组
    address[] private privateSaleAgents;
    // 私募代理人地址在数组中的索引
    mapping (address => uint256) private privateSaleAgentsIndex;

    // Partner 限额映射
    mapping (address => uint256) private partnersAmountLimit;
    // Partner 实际已转账额度映射
    mapping (address => uint256) private partnersWithdrawed;
    // 私募代理人实际转出(售出)的 token 数量映射
    mapping (address => uint256) private privateSalesReleased;

    // Owner 的钱包地址
    address ownerWallet;

    // Log 特定的转账函数操作
    event TransferLog(address from, address to, bytes32 functionName, uint256 value);

    /**
     * @dev 构造函数时需传入 Owner 指定的钱包地址
     * @param _ownerWallet Owner 的钱包地址
     */
    constructor(address _ownerWallet) public {
        ownerWallet = _ownerWallet;
        totalSupply_ = INITIAL_SUPPLY * (10 ** uint256(decimals));
        balances[msg.sender] = totalSupply_;
    }

    /**
     * @dev 变更 Owner 的钱包地址
     * @param _ownerWallet Owner 的钱包地址
     */
    function changeOwnerWallet(address _ownerWallet) public onlyOwner {
        ownerWallet = _ownerWallet;
    }

    /**
     * @dev 添加 partner 地址到白名单并设置其限额
     * @param _addr Partner 地址
     * @param _amount Partner 的持有限额
     */
    function addAddressToPartnerWhiteList(address _addr, uint256 _amount)
        public onlyOwner
    {
        // 仅允许在 2018/11/01 00:00:01 之前调用
        require(block.timestamp < TIMESTAMP_OF_20181101000001);
        // 如 _addr 不在白名单内,则执行添加处理
        if (!hasRole(_addr, ROLE_PARTNERWHITELIST)) {
            addRole(_addr, ROLE_PARTNERWHITELIST);
            // 把给定地址加入 partner 数组
            partnersIndex[_addr] = partners.length;
            partners.push(_addr);
        }
        // Owner 可以多次调用此函数以达到修改 partner 授权上限的效果
        partnersAmountLimit[_addr] = _amount;
    }

    /**
     * @dev 将 partner 地址从白名单移除
     * @param _addr Partner 地址
     */
    function removeAddressFromPartnerWhiteList(address _addr)
        public onlyOwner
    {
        // 仅允许在 2018/11/01 00:00:01 之前调用
        require(block.timestamp < TIMESTAMP_OF_20181101000001);
        // 仅允许 _addr 已在白名单内时使用
        require(hasRole(_addr, ROLE_PARTNERWHITELIST));

        removeRole(_addr, ROLE_PARTNERWHITELIST);
        partnersAmountLimit[_addr] = 0;
        // 把给定地址从 partner 数组中删除
        uint256 partnerIndex = partnersIndex[_addr];
        uint256 lastPartnerIndex = partners.length.sub(1);
        address lastPartner = partners[lastPartnerIndex];
        partners[partnerIndex] = lastPartner;
        delete partners[lastPartnerIndex];
        partners.length--;
        partnersIndex[_addr] = 0;
        partnersIndex[lastPartner] = partnerIndex;
    }

    /**
     * @dev 添加私募代理人地址到白名单并设置其限额
     * @param _addr 私募代理人地址
     * @param _amount 私募代理人的转账限额
     */
    function addAddressToPrivateWhiteList(address _addr, uint256 _amount)
        public onlyOwner
    {
        // 仅允许在 2018/10/02 00:00:01 之前调用
        require(block.timestamp < TIMESTAMP_OF_20181002000001);
        // 检查 _addr 是否已在白名单内以保证 approve 函数仅会被调用一次;
        // 后续如还需要更改授权额度,
        // 请直接使用安全的 increaseApproval 和 decreaseApproval 函数
        require(!hasRole(_addr, ROLE_PRIVATESALEWHITELIST));

        addRole(_addr, ROLE_PRIVATESALEWHITELIST);
        approve(_addr, _amount);
        // 把给定地址加入私募代理人数组
        privateSaleAgentsIndex[_addr] = privateSaleAgents.length;
        privateSaleAgents.push(_addr);
    }

    /**
     * @dev 将私募代理人地址从白名单移除
     * @param _addr 私募代理人地址
     */
    function removeAddressFromPrivateWhiteList(address _addr)
        public onlyOwner
    {
        // 仅允许在 2018/10/02 00:00:01 之前调用
        require(block.timestamp < TIMESTAMP_OF_20181002000001);
        // 仅允许 _addr 已在白名单内时使用
        require(hasRole(_addr, ROLE_PRIVATESALEWHITELIST));

        removeRole(_addr, ROLE_PRIVATESALEWHITELIST);
        approve(_addr, 0);
        // 把给定地址从私募代理人数组中删除
        uint256 agentIndex = privateSaleAgentsIndex[_addr];
        uint256 lastAgentIndex = privateSaleAgents.length.sub(1);
        address lastAgent = privateSaleAgents[lastAgentIndex];
        privateSaleAgents[agentIndex] = lastAgent;
        delete privateSaleAgents[lastAgentIndex];
        privateSaleAgents.length--;
        privateSaleAgentsIndex[_addr] = 0;
        privateSaleAgentsIndex[lastAgent] = agentIndex;
    }

    /**
     * @dev 允许接受转账的 fallback 函数
     */
    function() external payable {
        privateSale(msg.sender);
    }

    /**
     * @dev 私募处理
     * @param _beneficiary 收取 token 地址
     */
    function privateSale(address _beneficiary)
        public payable onlyRole(ROLE_PRIVATESALEWHITELIST)
    {
        // 仅允许 EOA 购买
        require(msg.sender == tx.origin);
        require(!msg.sender.isContract());
        // 仅允许在 2018/10/02 00:00:01 之前购买
        require(block.timestamp < TIMESTAMP_OF_20181002000001);

        uint256 purchaseValue = msg.value.mul(EXCHANGE_RATE_IN_PRIVATE_SALE);
        transferFrom(owner, _beneficiary, purchaseValue);
    }

    /**
     * @dev 人工私募处理
     * @param _addr 收取 token 地址
     * @param _amount 转账 token 数量
     */
    function withdrawPrivateCoinByMan(address _addr, uint256 _amount)
        public onlyRole(ROLE_PRIVATESALEWHITELIST)
    {
        // 仅允许在 2018/10/02 00:00:01 之前购买
        require(block.timestamp < TIMESTAMP_OF_20181002000001);
        // 仅允许 EOA 获得转账
        require(!_addr.isContract());

        transferFrom(owner, _addr, _amount);
    }

    /**
     * @dev 私募余额提取
     * @param _amount 提取 token 数量
     */
    function withdrawRemainPrivateCoin(uint256 _amount) public onlyOwner {
        // 仅允许在 2018/10/01 00:00:01 之后提取
        require(block.timestamp >= TIMESTAMP_OF_20181001000001);
        require(transfer(ownerWallet, _amount));
        emit TransferLog(owner, ownerWallet, bytes32("withdrawRemainPrivateCoin"), _amount);
    }

    /**
     * @dev 私募转账处理(从 Owner 持有的余额中转出)
     * @param _to 转入地址
     * @param _amount 转账数量
     */
    function _privateSaleTransferFromOwner(address _to, uint256 _amount)
        private returns (bool)
    {
        uint256 newTotalPrivateSaleAmount = totalPrivateSalesReleased.add(_amount);
        // 检查私募转账总额是否超限
        require(newTotalPrivateSaleAmount <= PRIVATE_SALE_AMOUNT.mul(10 ** uint256(decimals)));

        bool result = super.transferFrom(owner, _to, _amount);
        privateSalesReleased[msg.sender] = privateSalesReleased[msg.sender].add(_amount);
        totalPrivateSalesReleased = newTotalPrivateSaleAmount;
        return result;
    }

    /**
     * @dev 合约余额提取
     */
    function withdrawFunds() public onlyOwner {
        ownerWallet.transfer(address(this).balance);
    }

    /**
     * @dev 获取所有 Partner 地址
     * @return 所有 Partner 地址
     */
    function getPartnerAddresses() public onlyOwner view returns (address[]) {
        return partners;
    }

    /**
     * @dev 获取所有私募代理人地址
     * @return 所有私募代理人地址
     */
    function getPrivateSaleAgentAddresses() public onlyOwner view returns (address[]) {
        return privateSaleAgents;
    }

    /**
     * @dev 获得私募代理人地址已转出(售出)的 token 数量
     * @param _addr 私募代理人地址
     * @return 私募代理人地址的已转出的 token 数量
     */
    function privateSaleReleased(address _addr) public view returns (uint256) {
        return privateSalesReleased[_addr];
    }

    /**
     * @dev 获得 Partner 地址的提取限额
     * @param _addr Partner 的地址
     * @return Partner 地址的提取限额
     */
    function partnerAmountLimit(address _addr) public view returns (uint256) {
        return partnersAmountLimit[_addr];
    }

    /**
     * @dev 获得 Partner 地址的已提取 token 数量
     * @param _addr Partner 的地址
     * @return Partner 地址的已提取 token 数量
     */
    function partnerWithdrawed(address _addr) public view returns (uint256) {
        return partnersWithdrawed[_addr];
    }

    /**
     * @dev 给 Partner 地址分发 token
     * @param _addr Partner 的地址
     * @param _amount 分发的 token 数量
     */
    function withdrawToPartner(address _addr, uint256 _amount)
        public onlyOwner
    {
        require(hasRole(_addr, ROLE_PARTNERWHITELIST));
        // 仅允许在 2018/11/01 00:00:01 之前分发
        require(block.timestamp < TIMESTAMP_OF_20181101000001);

        uint256 newTotalReleased = totalPartnersReleased.add(_amount);
        require(newTotalReleased <= FOOTSTONE_ROUND_AMOUNT.mul(10 ** uint256(decimals)));

        uint256 newPartnerAmount = balanceOf(_addr).add(_amount);
        require(newPartnerAmount <= partnersAmountLimit[_addr]);

        totalPartnersReleased = newTotalReleased;
        transfer(_addr, _amount);
        emit TransferLog(owner, _addr, bytes32("withdrawToPartner"), _amount);
    }

    /**
     * @dev 计算 Partner 地址的可提取 token 数量,返回其与 _value 之间较小的那个值
     * @param _addr Partner 的地址
     * @param _value 想要提取的 token 数量
     * @return Partner 地址当前可提取的 token 数量,
     *         如果 _value 较小,则返回 _value 的数值
     */
    function _permittedPartnerTranferValue(address _addr, uint256 _value)
        private view returns (uint256)
    {
        uint256 limit = balanceOf(_addr);
        uint256 withdrawed = partnersWithdrawed[_addr];
        uint256 total = withdrawed.add(limit);
        uint256 time = block.timestamp;

        require(limit > 0);

        if (time >= TIMESTAMP_OF_20191101000001) {
            // 2019/11/01 00:00:01 之后可提取 100%
            limit = total;
        } else if (time >= TIMESTAMP_OF_20190801000001) {
            // 2019/08/01 00:00:01 之后最多提取 75%
            limit = total.mul(75).div(100);
        } else if (time >= TIMESTAMP_OF_20190501000001) {
            // 2019/05/01 00:00:01 之后最多提取 50%
            limit = total.div(2);
        } else if (time >= TIMESTAMP_OF_20190201000001) {
            // 2019/02/01 00:00:01 之后最多提取 25%
            limit = total.mul(25).div(100);
        } else {
            // 2019/02/01 00:00:01 之前不可提取
            limit = 0;
        }
        if (withdrawed >= limit) {
            limit = 0;
        } else {
            limit = limit.sub(withdrawed);
        }
        if (_value < limit) {
            limit = _value;
        }
        return limit;
    }

    /**
     * @dev 重写基础合约的 transferFrom 函数
     */
    function transferFrom(
        address _from,
        address _to,
        uint256 _value
    )
        public
        returns (bool)
    {
        bool result;
        address sender = msg.sender;

        if (_from == owner) {
            if (hasRole(sender, ROLE_PRIVATESALEWHITELIST)) {
                // 仅允许在 2018/10/02 00:00:01 之前购买
                require(block.timestamp < TIMESTAMP_OF_20181002000001);

                result = _privateSaleTransferFromOwner(_to, _value);
            } else {
                revert();
            }
        } else {
            result = super.transferFrom(_from, _to, _value);
        }
        return result;
    }

    /**
     * @dev 通用额度提取
     * @param _amount 提取 token 数量
     */
    function withdrawCommonCoin(uint256 _amount) public onlyOwner {
        // 仅允许在 2018/11/01 00:00:01 之后提取
        require(block.timestamp >= TIMESTAMP_OF_20181101000001);
        require(transfer(ownerWallet, _amount));
        emit TransferLog(owner, ownerWallet, bytes32("withdrawCommonCoin"), _amount);
        totalCommonReleased = totalCommonReleased.add(_amount);
    }

    /**
     * @dev 团队预留额度1提取
     * @param _amount 提取 token 数量
     */
    function withdrawToTeamStep1(uint256 _amount) public onlyOwner {
        // 仅允许在 2019/02/01 00:00:01 之后提取
        require(block.timestamp >= TIMESTAMP_OF_20190201000001);
        require(transfer(ownerWallet, _amount));
        emit TransferLog(owner, ownerWallet, bytes32("withdrawToTeamStep1"), _amount);
        totalTeamReleased1 = totalTeamReleased1.add(_amount);
    }

    /**
     * @dev 团队预留额度2提取
     * @param _amount 提取 token 数量
     */
    function withdrawToTeamStep2(uint256 _amount) public onlyOwner {
        // 仅允许在 2019/11/01 00:00:01 之后提取
        require(block.timestamp >= TIMESTAMP_OF_20191101000001);
        require(transfer(ownerWallet, _amount));
        emit TransferLog(owner, ownerWallet, bytes32("withdrawToTeamStep2"), _amount);
        totalTeamReleased2 = totalTeamReleased2.add(_amount);
    }

    /**
     * @dev 团队预留额度3提取
     * @param _amount 提取 token 数量
     */
    function withdrawToTeamStep3(uint256 _amount) public onlyOwner {
        // 仅允许在 2020/11/01 00:00:01 之后提取
        require(block.timestamp >= TIMESTAMP_OF_20201101000001);
        require(transfer(ownerWallet, _amount));
        emit TransferLog(owner, ownerWallet, bytes32("withdrawToTeamStep3"), _amount);
        totalTeamReleased3 = totalTeamReleased3.add(_amount);
    }

    /**
     * @dev 团队预留额度4提取
     * @param _amount 提取 token 数量
     */
    function withdrawToTeamStep4(uint256 _amount) public onlyOwner {
        // 仅允许在 2021/11/01 00:00:01 之后提取
        require(block.timestamp >= TIMESTAMP_OF_20211101000001);
        require(transfer(ownerWallet, _amount));
        emit TransferLog(owner, ownerWallet, bytes32("withdrawToTeamStep4"), _amount);
        totalTeamReleased4 = totalTeamReleased4.add(_amount);
    }

    /**
     * @dev 重写基础合约的 transfer 函数
     */
    function transfer(address _to, uint256 _value) public returns (bool) {
        bool result;
        uint256 limit;

        if (msg.sender == owner) {
            limit = _ownerReleaseLimit();
            uint256 newTotalOwnerReleased = totalOwnerReleased.add(_value);
            require(newTotalOwnerReleased <= limit);
            result = super.transfer(_to, _value);
            totalOwnerReleased = newTotalOwnerReleased;
        } else if (hasRole(msg.sender, ROLE_PARTNERWHITELIST)) {
            limit = _permittedPartnerTranferValue(msg.sender, _value);
            if (limit > 0) {
                result = super.transfer(_to, limit);
                partnersWithdrawed[msg.sender] = partnersWithdrawed[msg.sender].add(limit);
            } else {
                revert();
            }
        } else {
            result = super.transfer(_to, _value);
        }
        return result;
    }

    /**
     * @dev 计算 Owner 的转账额度
     * @return Owner 的当前转账额度
     */
   function _ownerReleaseLimit() private view returns (uint256) {
        uint256 time = block.timestamp;
        uint256 limit;
        uint256 amount;

        // 基石轮额度作为默认限额
        limit = FOOTSTONE_ROUND_AMOUNT.mul(10 ** uint256(decimals));
        if (time >= TIMESTAMP_OF_20181001000001) {
            // 2018/10/1 之后,最大限额需要增加私募剩余额度
            amount = PRIVATE_SALE_AMOUNT.mul(10 ** uint256(decimals));
            if (totalPrivateSalesReleased < amount) {
                limit = limit.add(amount).sub(totalPrivateSalesReleased);
            }
        }
        if (time >= TIMESTAMP_OF_20181101000001) {
            // 2018/11/1 之后,最大限额需要增加通用提取额度中减去锁仓额度以外的额度
            limit = limit.add(COMMON_PURPOSE_AMOUNT.sub(OWNER_LOCKED_IN_COMMON).mul(10 ** uint256(decimals)));
        }
        if (time >= TIMESTAMP_OF_20190201000001) {
            // 2019/2/1 之后,最大限额需要增加团队预留额度1
            limit = limit.add(TEAM_RESERVED_AMOUNT1.mul(10 ** uint256(decimals)));
        }
        if (time >= TIMESTAMP_OF_20190501000001) {
            // 2019/5/1 之后,最大限额需要增加通用额度中的锁仓额度
            limit = limit.add(OWNER_LOCKED_IN_COMMON.mul(10 ** uint256(decimals)));
        }
        if (time >= TIMESTAMP_OF_20191101000001) {
            // 2019/11/1 之后,最大限额需要增加团队预留额度2
            limit = limit.add(TEAM_RESERVED_AMOUNT2.mul(10 ** uint256(decimals)));
        }
        if (time >= TIMESTAMP_OF_20201101000001) {
            // 2020/11/1 之后,最大限额需要增加团队预留额度3
            limit = limit.add(TEAM_RESERVED_AMOUNT3.mul(10 ** uint256(decimals)));
        }
        if (time >= TIMESTAMP_OF_20211101000001) {
            // 2021/11/1 之后,最大限额需要增加团队预留额度4
            limit = limit.add(TEAM_RESERVED_AMOUNT4.mul(10 ** uint256(decimals)));
        }
        return limit;
    }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"name":"_addr","type":"address"}],"name":"removeAddressFromPrivateWhiteList","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalPartnersReleased","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalTeamReleased3","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"privateSaleReleased","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TEAM_RESERVED_AMOUNT2","outputs":[{"name":"","type":"uint256"}],"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":"_operator","type":"address"},{"name":"_role","type":"string"}],"name":"checkRole","outputs":[],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"withdrawToTeamStep4","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"EXCHANGE_RATE_IN_PRIVATE_SALE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TEAM_RESERVED_AMOUNT1","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"}],"name":"removeAddressFromPartnerWhiteList","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_amount","type":"uint256"}],"name":"addAddressToPartnerWhiteList","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_ownerWallet","type":"address"}],"name":"changeOwnerWallet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TIMESTAMP_OF_20211101000001","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_operator","type":"address"},{"name":"_role","type":"string"}],"name":"hasRole","outputs":[{"name":"","type":"bool"}],"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":"withdrawFunds","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"OWNER_LOCKED_IN_COMMON","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TEAM_RESERVED_AMOUNT3","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"withdrawToTeamStep3","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalCommonReleased","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"INITIAL_SUPPLY","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"withdrawToTeamStep1","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"withdrawRemainPrivateCoin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"withdrawCommonCoin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_amount","type":"uint256"}],"name":"addAddressToPrivateWhiteList","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"partnerAmountLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TIMESTAMP_OF_20190501000001","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TIMESTAMP_OF_20181001000001","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","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":true,"inputs":[],"name":"PRIVATE_SALE_AMOUNT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_amount","type":"uint256"}],"name":"withdrawToPartner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"TIMESTAMP_OF_20190201000001","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ROLE_PARTNERWHITELIST","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalTeamReleased4","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalTeamReleased1","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_amount","type":"uint256"}],"name":"withdrawPrivateCoinByMan","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getPrivateSaleAgentAddresses","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getPartnerAddresses","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"withdrawToTeamStep2","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"TIMESTAMP_OF_20190801000001","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalTeamReleased2","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TIMESTAMP_OF_20191101000001","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalPrivateSalesReleased","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"COMMON_PURPOSE_AMOUNT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FOOTSTONE_ROUND_AMOUNT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ROLE_PRIVATESALEWHITELIST","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"partnerWithdrawed","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TIMESTAMP_OF_20181101000001","outputs":[{"name":"","type":"uint256"}],"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":false,"inputs":[{"name":"_beneficiary","type":"address"}],"name":"privateSale","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"totalOwnerReleased","outputs":[{"name":"","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":"TIMESTAMP_OF_20201101000001","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TEAM_RESERVED_AMOUNT4","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TIMESTAMP_OF_20181002000001","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_ownerWallet","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"from","type":"address"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"functionName","type":"bytes32"},{"indexed":false,"name":"value","type":"uint256"}],"name":"TransferLog","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"},{"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":"operator","type":"address"},{"indexed":false,"name":"role","type":"string"}],"name":"RoleAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"operator","type":"address"},{"indexed":false,"name":"role","type":"string"}],"name":"RoleRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

60c0604052600360808190527f494441000000000000000000000000000000000000000000000000000000000060a09081526200004091600591906200010d565b506040805180820190915260038082527f4944410000000000000000000000000000000000000000000000000000000000602090920191825262000087916006916200010d565b506007805460ff19166012179055348015620000a257600080fd5b5060405160208062002c0283398101604090815290516000805433600160a060020a03199182168117835560178054909216600160a060020a0390941693909317905560075460ff16600a0a6402540be40002600381905591815260026020529190912055620001b2565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200015057805160ff191683800117855562000180565b8280016001018555821562000180579182015b828111156200018057825182559160200191906001019062000163565b506200018e92915062000192565b5090565b620001af91905b808211156200018e576000815560010162000199565b90565b612a4080620001c26000396000f3006080604052600436106103005763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166301284ad4811461030b57806301a2125d1461032c57806305bd4dad1461035357806306fdde031461036857806308534888146103f25780630939728714610413578063095ea7b3146104285780630988ca8c146104605780630ae25ca3146104c75780630b56db31146104df57806310b089ed146104f4578063150b52db14610509578063156014e81461052a57806318117abb1461054e57806318160ddd1461056f5780631833e00114610584578063217fe6c61461059957806323b872dd1461060057806324600fc31461062a5780632adeb6861461063f5780632bbb5b45146104135780632c868287146106545780632eeb42421461066c5780632ff2e9dc14610681578063313ce5671461069657806339635d13146106c15780633b4d75d8146106d95780633ef84fcb146106f15780634a4ef738146107095780634fd0fcb61461072d57806352e11ff71461074e578063587115b214610763578063661884631461077857806368942cd31461079c5780636c055ce2146107b15780636c3c4f4f146107d557806370a08231146107ea578063715018a61461080b57806376c0a6be14610820578063808741451461083557806383d962961461084a5780638da5cb5b1461085f578063951717e21461089057806395d89b41146108b45780639b9cc2ca146108c9578063a20ddfb61461092e578063a7157c7214610943578063a9059cbb1461095b578063ae07b5081461097f578063aeda4efc14610994578063b1f63f5e146109a9578063b86d1de0146109be578063b987cd76146109d3578063c22f690e146109e8578063c3bc7fe3146109fd578063cab3758614610a12578063d54b9b2e14610a33578063d73dd62314610a48578063dd62ed3e14610a6c578063e7d53fcb14610a93578063eb0ce79114610aa7578063f2fde38b14610abc578063f4522bbc14610add578063f66938d214610413578063fe9ad90814610af2575b61030933610b07565b005b34801561031757600080fd5b50610309600160a060020a0360043516610b98565b34801561033857600080fd5b50610341610d2d565b60408051918252519081900360200190f35b34801561035f57600080fd5b50610341610d33565b34801561037457600080fd5b5061037d610d39565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103b757818101518382015260200161039f565b50505050905090810190601f1680156103e45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103fe57600080fd5b50610341600160a060020a0360043516610dc7565b34801561041f57600080fd5b50610341610de2565b34801561043457600080fd5b5061044c600160a060020a0360043516602435610dea565b604080519115158252519081900360200190f35b34801561046c57600080fd5b5060408051602060046024803582810135601f8101859004850286018501909652858552610309958335600160a060020a0316953695604494919390910191908190840183828082843750949750610e699650505050505050565b3480156104d357600080fd5b50610309600435610ed7565b3480156104eb57600080fd5b50610341610f9f565b34801561050057600080fd5b50610341610fa5565b34801561051557600080fd5b50610309600160a060020a0360043516610fad565b34801561053657600080fd5b50610309600160a060020a0360043516602435611143565b34801561055a57600080fd5b50610309600160a060020a0360043516611243565b34801561057b57600080fd5b5061034161127c565b34801561059057600080fd5b50610341611283565b3480156105a557600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261044c958335600160a060020a031695369560449491939091019190819084018382808284375094975061128b9650505050505050565b34801561060c57600080fd5b5061044c600160a060020a03600435811690602435166044356112fe565b34801561063657600080fd5b5061030961138d565b34801561064b57600080fd5b506103416113e1565b34801561066057600080fd5b506103096004356113ea565b34801561067857600080fd5b506103416114b2565b34801561068d57600080fd5b506103416114b8565b3480156106a257600080fd5b506106ab6114c1565b6040805160ff9092168252519081900360200190f35b3480156106cd57600080fd5b506103096004356114ca565b3480156106e557600080fd5b50610309600435611592565b3480156106fd57600080fd5b50610309600435611644565b34801561071557600080fd5b50610309600160a060020a036004351660243561170c565b34801561073957600080fd5b50610341600160a060020a0360043516611804565b34801561075a57600080fd5b5061034161181f565b34801561076f57600080fd5b50610341611827565b34801561078457600080fd5b5061044c600160a060020a036004351660243561182f565b3480156107a857600080fd5b50610341611937565b3480156107bd57600080fd5b50610309600160a060020a036004351660243561193f565b3480156107e157600080fd5b50610341611a99565b3480156107f657600080fd5b50610341600160a060020a0360043516611aa1565b34801561081757600080fd5b50610309611abc565b34801561082c57600080fd5b5061037d611b1b565b34801561084157600080fd5b50610341611b40565b34801561085657600080fd5b50610341611b46565b34801561086b57600080fd5b50610874611b4c565b60408051600160a060020a039092168252519081900360200190f35b34801561089c57600080fd5b50610309600160a060020a0360043516602435611b5b565b3480156108c057600080fd5b5061037d611bca565b3480156108d557600080fd5b506108de611c25565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561091a578181015183820152602001610902565b505050509050019250505060405180910390f35b34801561093a57600080fd5b506108de611c9f565b34801561094f57600080fd5b50610309600435611d17565b34801561096757600080fd5b5061044c600160a060020a0360043516602435611ddf565b34801561098b57600080fd5b50610341611edc565b3480156109a057600080fd5b50610341611ee4565b3480156109b557600080fd5b50610341611eea565b3480156109ca57600080fd5b50610341611ef2565b3480156109df57600080fd5b50610341611ef8565b3480156109f457600080fd5b50610341611f01565b348015610a0957600080fd5b5061037d611f09565b348015610a1e57600080fd5b50610341600160a060020a0360043516611f2e565b348015610a3f57600080fd5b50610341611f49565b348015610a5457600080fd5b5061044c600160a060020a0360043516602435611f51565b348015610a7857600080fd5b50610341600160a060020a0360043581169060243516612001565b610309600160a060020a0360043516610b07565b348015610ab357600080fd5b5061034161202c565b348015610ac857600080fd5b50610309600160a060020a0360043516612032565b348015610ae957600080fd5b50610341612052565b348015610afe57600080fd5b5061034161205a565b60006040805190810160405280601481526020016000805160206129f5833981519152815250610b373382610e69565b333214610b4357600080fd5b610b4c33612062565b15610b5657600080fd5b635bb2b5014210610b6657600080fd5b610b783461271063ffffffff61206a16565b600054909250610b9290600160a060020a031684846112fe565b50505050565b6000805481908190600160a060020a03163314610bb457600080fd5b635bb2b5014210610bc457600080fd5b610bf1846040805190810160405280601481526020016000805160206129f583398151915281525061128b565b1515610bfc57600080fd5b610c29846040805190810160405280601481526020016000805160206129f5833981519152815250612093565b610c34846000610dea565b50600160a060020a038416600090815260136020526040902054601254909350610c6590600163ffffffff6121a416565b9150601282815481101515610c7657fe5b60009182526020909120015460128054600160a060020a039092169250829185908110610c9f57fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790556012805483908110610cd657fe5b60009182526020909120018054600160a060020a03191690556012805490610d0290600019830161296d565b50600160a060020a039384166000908152601360205260408082208290559190941684529092205550565b60095481565b600e5481565b6005805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610dbf5780601f10610d9457610100808354040283529160200191610dbf565b820191906000526020600020905b815481529060010190602001808311610da257829003601f168201915b505050505081565b600160a060020a031660009081526016602052604090205490565b6315752a0081565b6000600160a060020a0383161515610e0157600080fd5b336000818152600460209081526040808320600160a060020a03881680855290835292819020869055805186815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060015b92915050565b610ed3826001836040518082805190602001908083835b60208310610e9f5780518252601f199092019160209182019101610e80565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220929150506121b6565b5050565b600054600160a060020a03163314610eee57600080fd5b63617f2e01421015610eff57600080fd5b601754610f1590600160a060020a031682611ddf565b1515610f2057600080fd5b60005460175460408051600160a060020a0393841681529190921660208201527f7769746864726177546f5465616d537465703400000000000000000000000000818301526060810183905290516000805160206129b58339815191529181900360800190a1600f54610f99908263ffffffff6121cb16565b600f5550565b61271081565b6307270e0081565b6000805481908190600160a060020a03163314610fc957600080fd5b635bda42014210610fd957600080fd5b611006846040805190810160405280601081526020016000805160206129d583398151915281525061128b565b151561101157600080fd5b61103e846040805190810160405280601081526020016000805160206129d5833981519152815250612093565b600160a060020a0384166000908152601460209081526040808320839055601190915290205460105490935061107b90600163ffffffff6121a416565b915060108281548110151561108c57fe5b60009182526020909120015460108054600160a060020a0390921692508291859081106110b557fe5b60009182526020909120018054600160a060020a031916600160a060020a039290921691909117905560108054839081106110ec57fe5b60009182526020909120018054600160a060020a0319169055601080549061111890600019830161296d565b50600160a060020a039384166000908152601160205260408082208290559190941684529092205550565b600054600160a060020a0316331461115a57600080fd5b635bda4201421061116a57600080fd5b611197826040805190810160405280601081526020016000805160206129d583398151915281525061128b565b1515611227576111ca826040805190810160405280601081526020016000805160206129d58339815191528152506121d8565b60108054600160a060020a0384166000818152601160205260408120839055600183018455929092527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672018054600160a060020a03191690911790555b600160a060020a03909116600090815260146020526040902055565b600054600160a060020a0316331461125a57600080fd5b60178054600160a060020a031916600160a060020a0392909216919091179055565b6003545b90565b63617f2e0181565b60006112f7836001846040518082805190602001908083835b602083106112c35780518252601f1990920191602091820191016112a4565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220929150506122aa565b9392505050565b6000805481903390600160a060020a038781169116141561137657611346816040805190810160405280601481526020016000805160206129f583398151915281525061128b565b1561136c57635bb2b501421061135b57600080fd5b61136585856122c9565b9150611371565b600080fd5b611384565b611381868686612367565b91505b50949350505050565b600054600160a060020a031633146113a457600080fd5b601754604051600160a060020a0390911690303180156108fc02916000818181858888f193505050501580156113de573d6000803e3d6000fd5b50565b64012a05f20081565b600054600160a060020a0316331461140157600080fd5b635f9dfa8142101561141257600080fd5b60175461142890600160a060020a031682611ddf565b151561143357600080fd5b60005460175460408051600160a060020a0393841681529190921660208201527f7769746864726177546f5465616d537465703300000000000000000000000000818301526060810183905290516000805160206129b58339815191529181900360800190a1600e546114ac908263ffffffff6121cb16565b600e5550565b600b5481565b6402540be40081565b60075460ff1681565b600054600160a060020a031633146114e157600080fd5b635c538c014210156114f257600080fd5b60175461150890600160a060020a031682611ddf565b151561151357600080fd5b60005460175460408051600160a060020a0393841681529190921660208201527f7769746864726177546f5465616d537465703100000000000000000000000000818301526060810183905290516000805160206129b58339815191529181900360800190a1600c5461158c908263ffffffff6121cb16565b600c5550565b600054600160a060020a031633146115a957600080fd5b635bb163814210156115ba57600080fd5b6017546115d090600160a060020a031682611ddf565b15156115db57600080fd5b60005460175460408051600160a060020a0393841681529190921660208201527f776974686472617752656d61696e50726976617465436f696e00000000000000818301526060810183905290516000805160206129b58339815191529181900360800190a150565b600054600160a060020a0316331461165b57600080fd5b635bda420142101561166c57600080fd5b60175461168290600160a060020a031682611ddf565b151561168d57600080fd5b60005460175460408051600160a060020a0393841681529190921660208201527f7769746864726177436f6d6d6f6e436f696e0000000000000000000000000000818301526060810183905290516000805160206129b58339815191529181900360800190a1600b54611706908263ffffffff6121cb16565b600b5550565b600054600160a060020a0316331461172357600080fd5b635bb2b501421061173357600080fd5b611760826040805190810160405280601481526020016000805160206129f583398151915281525061128b565b1561176a57600080fd5b611797826040805190810160405280601481526020016000805160206129f58339815191528152506121d8565b6117a18282610dea565b505060128054600160a060020a039092166000818152601360205260408120849055600184018355919091527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34449091018054600160a060020a0319169091179055565b600160a060020a031660009081526014602052604090205490565b635cc8e18181565b635bb1638181565b600080600160a060020a038416151561184757600080fd5b50336000908152600460209081526040808320600160a060020a038716845290915290205480831061189c57336000908152600460209081526040808320600160a060020a03881684529091528120556118d1565b6118ac818463ffffffff6121a416565b336000908152600460209081526040808320600160a060020a03891684529091529020555b336000818152600460209081526040808320600160a060020a0389168085529083529281902054815190815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060019392505050565b6347868c0081565b600080548190600160a060020a0316331461195957600080fd5b611986846040805190810160405280601081526020016000805160206129d583398151915281525061128b565b151561199157600080fd5b635bda420142106119a157600080fd5b6009546119b4908463ffffffff6121cb16565b6007549092506119d59063179a7b009060ff16600a0a63ffffffff61206a16565b8211156119e157600080fd5b6119fa836119ee86611aa1565b9063ffffffff6121cb16565b600160a060020a038516600090815260146020526040902054909150811115611a2257600080fd5b6009829055611a318484611ddf565b5060005460408051600160a060020a03928316815291861660208301527f7769746864726177546f506172746e65720000000000000000000000000000008282015260608201859052516000805160206129b58339815191529181900360800190a150505050565b635c538c0181565b600160a060020a031660009081526002602052604090205490565b600054600160a060020a03163314611ad357600080fd5b60008054604051600160a060020a03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a260008054600160a060020a0319169055565b60408051808201909152601081526000805160206129d5833981519152602082015281565b600f5481565b600c5481565b600054600160a060020a031681565b60408051808201909152601481526000805160206129f58339815191526020820152611b873382610e69565b635bb2b5014210611b9757600080fd5b611ba983600160a060020a0316612062565b15611bb357600080fd5b600054610b9290600160a060020a031684846112fe565b6006805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610dbf5780601f10610d9457610100808354040283529160200191610dbf565b600054606090600160a060020a03163314611c3f57600080fd5b6012805480602002602001604051908101604052809291908181526020018280548015611c9557602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311611c77575b5050505050905090565b600054606090600160a060020a03163314611cb957600080fd5b6010805480602002602001604051908101604052809291908181526020018280548015611c9557602002820191906000526020600020908154600160a060020a03168152600190910190602001808311611c77575050505050905090565b600054600160a060020a03163314611d2e57600080fd5b635dbb7581421015611d3f57600080fd5b601754611d5590600160a060020a031682611ddf565b1515611d6057600080fd5b60005460175460408051600160a060020a0393841681529190921660208201527f7769746864726177546f5465616d537465703200000000000000000000000000818301526060810183905290516000805160206129b58339815191529181900360800190a1600d54611dd9908263ffffffff6121cb16565b600d5550565b60008054819081908190600160a060020a0316331415611e3c57611e016124de565b600854909250611e17908663ffffffff6121cb16565b905081811115611e2657600080fd5b611e3086866126ac565b60088290559250611ed2565b611e69336040805190810160405280601081526020016000805160206129d583398151915281525061128b565b15611ec557611e78338661278d565b9150600082111561136c57611e8d86836126ac565b33600090815260156020526040902054909350611eb0908363ffffffff6121cb16565b33600090815260156020526040902055611ed2565b611ecf86866126ac565b92505b5090949350505050565b635d422b8181565b600d5481565b635dbb758181565b600a5481565b6401ad64510081565b63179a7b0081565b60408051808201909152601481526000805160206129f5833981519152602082015281565b600160a060020a031660009081526015602052604090205490565b635bda420181565b6000600160a060020a0383161515611f6857600080fd5b336000908152600460209081526040808320600160a060020a0387168452909152902054611f9c908363ffffffff6121cb16565b336000818152600460209081526040808320600160a060020a0389168085529083529281902085905580519485525191937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a350600192915050565b600160a060020a03918216600090815260046020908152604080832093909416825291909152205490565b60085481565b600054600160a060020a0316331461204957600080fd5b6113de816128a1565b635f9dfa8181565b635bb2b50181565b6000903b1190565b600082151561207b57506000610e63565b5081810281838281151561208b57fe5b0414610e6357fe5b6120fd826001836040518082805190602001908083835b602083106120c95780518252601f1990920191602091820191016120aa565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922092915050612911565b81600160a060020a03167fd211483f91fc6eff862467f8de606587a30c8fc9981056f051b897a418df803a826040518080602001828103825283818151815260200191508051906020019080838360005b8381101561216657818101518382015260200161214e565b50505050905090810190601f1680156121935780820380516001836020036101000a031916815260200191505b509250505060405180910390a25050565b6000828211156121b057fe5b50900390565b6121c082826122aa565b1515610ed357600080fd5b81810182811015610e6357fe5b612242826001836040518082805190602001908083835b6020831061220e5780518252601f1990920191602091820191016121ef565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922092915050612933565b81600160a060020a03167fbfec83d64eaa953f2708271a023ab9ee82057f8f3578d548c1a4ba0b5b700489826040518080602001828103825283818151815260200191508051906020019080838360008381101561216657818101518382015260200161214e565b600160a060020a03166000908152602091909152604090205460ff1690565b60008060006122e384600a546121cb90919063ffffffff16565b600754909250612304906347868c009060ff16600a0a63ffffffff61206a16565b82111561231057600080fd5b60005461232790600160a060020a03168686612367565b3360009081526016602052604090205490915061234a908563ffffffff6121cb16565b33600090815260166020526040902055600a919091559392505050565b600160a060020a03831660009081526002602052604081205482111561238c57600080fd5b600160a060020a03841660009081526004602090815260408083203384529091529020548211156123bc57600080fd5b600160a060020a03831615156123d157600080fd5b600160a060020a0384166000908152600260205260409020546123fa908363ffffffff6121a416565b600160a060020a03808616600090815260026020526040808220939093559085168152205461242f908363ffffffff6121cb16565b600160a060020a038085166000908152600260209081526040808320949094559187168152600482528281203382529091522054612473908363ffffffff6121a416565b600160a060020a03808616600081815260046020908152604080832033845282529182902094909455805186815290519287169391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a35060019392505050565b6007546000904290829081906125059063179a7b009060ff16600a0a63ffffffff61206a16565b9150635bb16381831061256257600754612530906347868c009060ff16600a0a63ffffffff61206a16565b905080600a54101561256257600a5461255f90612553848463ffffffff6121cb16565b9063ffffffff6121a416565b91505b635bda420183106125b4576007546125b1906125a49060ff16600a0a6125986401ad64510064012a05f20063ffffffff6121a416565b9063ffffffff61206a16565b839063ffffffff6121cb16565b91505b635c538c0183106125e4576007546125e1906125a4906307270e009060ff16600a0a63ffffffff61206a16565b91505b635cc8e181831061261557600754612612906125a49064012a05f2009060ff16600a0a63ffffffff61206a16565b91505b635dbb7581831061264557600754612642906125a4906315752a009060ff16600a0a63ffffffff61206a16565b91505b635f9dfa81831061267557600754612672906125a4906315752a009060ff16600a0a63ffffffff61206a16565b91505b63617f2e0183106126a5576007546126a2906125a4906315752a009060ff16600a0a63ffffffff61206a16565b91505b5092915050565b336000908152600260205260408120548211156126c857600080fd5b600160a060020a03831615156126dd57600080fd5b336000908152600260205260409020546126fd908363ffffffff6121a416565b3360009081526002602052604080822092909255600160a060020a0385168152205461272f908363ffffffff6121cb16565b600160a060020a0384166000818152600260209081526040918290209390935580518581529051919233927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a350600192915050565b600080600080600061279e87611aa1565b600160a060020a03881660009081526015602052604090205490945092506127cc838563ffffffff6121cb16565b9150429050600084116127de57600080fd5b635dbb758181106127f157819350612867565b635d422b8181106128255761281e606461281284604b63ffffffff61206a16565b9063ffffffff61295816565b9350612867565b635cc8e18181106128415761281e82600263ffffffff61295816565b635c538c0181106128625761281e606461281284601963ffffffff61206a16565b600093505b838310612877576000935061288a565b612887848463ffffffff6121a416565b93505b83861015612896578593505b509195945050505050565b600160a060020a03811615156128b657600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360008054600160a060020a031916600160a060020a0392909216919091179055565b600160a060020a0316600090815260209190915260409020805460ff19169055565b600160a060020a0316600090815260209190915260409020805460ff19166001179055565b6000818381151561296557fe5b049392505050565b81548183558181111561299157600083815260209020612991918101908301612996565b505050565b61128091905b808211156129b0576000815560010161299c565b509056007d794f058f68b76e7ec56cf405982d6cddbac0baba1afbdf64368efa3e8b37ab706172746e657257686974656c697374000000000000000000000000000000007072697661746553616c6557686974656c697374000000000000000000000000a165627a7a7230582085fe8cacb4b93d4e9aba7506be3e0c438244201f910733d02d5be2fc499b731b0029

Deployed Bytecode

0x6080604052600436106103005763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166301284ad4811461030b57806301a2125d1461032c57806305bd4dad1461035357806306fdde031461036857806308534888146103f25780630939728714610413578063095ea7b3146104285780630988ca8c146104605780630ae25ca3146104c75780630b56db31146104df57806310b089ed146104f4578063150b52db14610509578063156014e81461052a57806318117abb1461054e57806318160ddd1461056f5780631833e00114610584578063217fe6c61461059957806323b872dd1461060057806324600fc31461062a5780632adeb6861461063f5780632bbb5b45146104135780632c868287146106545780632eeb42421461066c5780632ff2e9dc14610681578063313ce5671461069657806339635d13146106c15780633b4d75d8146106d95780633ef84fcb146106f15780634a4ef738146107095780634fd0fcb61461072d57806352e11ff71461074e578063587115b214610763578063661884631461077857806368942cd31461079c5780636c055ce2146107b15780636c3c4f4f146107d557806370a08231146107ea578063715018a61461080b57806376c0a6be14610820578063808741451461083557806383d962961461084a5780638da5cb5b1461085f578063951717e21461089057806395d89b41146108b45780639b9cc2ca146108c9578063a20ddfb61461092e578063a7157c7214610943578063a9059cbb1461095b578063ae07b5081461097f578063aeda4efc14610994578063b1f63f5e146109a9578063b86d1de0146109be578063b987cd76146109d3578063c22f690e146109e8578063c3bc7fe3146109fd578063cab3758614610a12578063d54b9b2e14610a33578063d73dd62314610a48578063dd62ed3e14610a6c578063e7d53fcb14610a93578063eb0ce79114610aa7578063f2fde38b14610abc578063f4522bbc14610add578063f66938d214610413578063fe9ad90814610af2575b61030933610b07565b005b34801561031757600080fd5b50610309600160a060020a0360043516610b98565b34801561033857600080fd5b50610341610d2d565b60408051918252519081900360200190f35b34801561035f57600080fd5b50610341610d33565b34801561037457600080fd5b5061037d610d39565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103b757818101518382015260200161039f565b50505050905090810190601f1680156103e45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103fe57600080fd5b50610341600160a060020a0360043516610dc7565b34801561041f57600080fd5b50610341610de2565b34801561043457600080fd5b5061044c600160a060020a0360043516602435610dea565b604080519115158252519081900360200190f35b34801561046c57600080fd5b5060408051602060046024803582810135601f8101859004850286018501909652858552610309958335600160a060020a0316953695604494919390910191908190840183828082843750949750610e699650505050505050565b3480156104d357600080fd5b50610309600435610ed7565b3480156104eb57600080fd5b50610341610f9f565b34801561050057600080fd5b50610341610fa5565b34801561051557600080fd5b50610309600160a060020a0360043516610fad565b34801561053657600080fd5b50610309600160a060020a0360043516602435611143565b34801561055a57600080fd5b50610309600160a060020a0360043516611243565b34801561057b57600080fd5b5061034161127c565b34801561059057600080fd5b50610341611283565b3480156105a557600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261044c958335600160a060020a031695369560449491939091019190819084018382808284375094975061128b9650505050505050565b34801561060c57600080fd5b5061044c600160a060020a03600435811690602435166044356112fe565b34801561063657600080fd5b5061030961138d565b34801561064b57600080fd5b506103416113e1565b34801561066057600080fd5b506103096004356113ea565b34801561067857600080fd5b506103416114b2565b34801561068d57600080fd5b506103416114b8565b3480156106a257600080fd5b506106ab6114c1565b6040805160ff9092168252519081900360200190f35b3480156106cd57600080fd5b506103096004356114ca565b3480156106e557600080fd5b50610309600435611592565b3480156106fd57600080fd5b50610309600435611644565b34801561071557600080fd5b50610309600160a060020a036004351660243561170c565b34801561073957600080fd5b50610341600160a060020a0360043516611804565b34801561075a57600080fd5b5061034161181f565b34801561076f57600080fd5b50610341611827565b34801561078457600080fd5b5061044c600160a060020a036004351660243561182f565b3480156107a857600080fd5b50610341611937565b3480156107bd57600080fd5b50610309600160a060020a036004351660243561193f565b3480156107e157600080fd5b50610341611a99565b3480156107f657600080fd5b50610341600160a060020a0360043516611aa1565b34801561081757600080fd5b50610309611abc565b34801561082c57600080fd5b5061037d611b1b565b34801561084157600080fd5b50610341611b40565b34801561085657600080fd5b50610341611b46565b34801561086b57600080fd5b50610874611b4c565b60408051600160a060020a039092168252519081900360200190f35b34801561089c57600080fd5b50610309600160a060020a0360043516602435611b5b565b3480156108c057600080fd5b5061037d611bca565b3480156108d557600080fd5b506108de611c25565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561091a578181015183820152602001610902565b505050509050019250505060405180910390f35b34801561093a57600080fd5b506108de611c9f565b34801561094f57600080fd5b50610309600435611d17565b34801561096757600080fd5b5061044c600160a060020a0360043516602435611ddf565b34801561098b57600080fd5b50610341611edc565b3480156109a057600080fd5b50610341611ee4565b3480156109b557600080fd5b50610341611eea565b3480156109ca57600080fd5b50610341611ef2565b3480156109df57600080fd5b50610341611ef8565b3480156109f457600080fd5b50610341611f01565b348015610a0957600080fd5b5061037d611f09565b348015610a1e57600080fd5b50610341600160a060020a0360043516611f2e565b348015610a3f57600080fd5b50610341611f49565b348015610a5457600080fd5b5061044c600160a060020a0360043516602435611f51565b348015610a7857600080fd5b50610341600160a060020a0360043581169060243516612001565b610309600160a060020a0360043516610b07565b348015610ab357600080fd5b5061034161202c565b348015610ac857600080fd5b50610309600160a060020a0360043516612032565b348015610ae957600080fd5b50610341612052565b348015610afe57600080fd5b5061034161205a565b60006040805190810160405280601481526020016000805160206129f5833981519152815250610b373382610e69565b333214610b4357600080fd5b610b4c33612062565b15610b5657600080fd5b635bb2b5014210610b6657600080fd5b610b783461271063ffffffff61206a16565b600054909250610b9290600160a060020a031684846112fe565b50505050565b6000805481908190600160a060020a03163314610bb457600080fd5b635bb2b5014210610bc457600080fd5b610bf1846040805190810160405280601481526020016000805160206129f583398151915281525061128b565b1515610bfc57600080fd5b610c29846040805190810160405280601481526020016000805160206129f5833981519152815250612093565b610c34846000610dea565b50600160a060020a038416600090815260136020526040902054601254909350610c6590600163ffffffff6121a416565b9150601282815481101515610c7657fe5b60009182526020909120015460128054600160a060020a039092169250829185908110610c9f57fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790556012805483908110610cd657fe5b60009182526020909120018054600160a060020a03191690556012805490610d0290600019830161296d565b50600160a060020a039384166000908152601360205260408082208290559190941684529092205550565b60095481565b600e5481565b6005805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610dbf5780601f10610d9457610100808354040283529160200191610dbf565b820191906000526020600020905b815481529060010190602001808311610da257829003601f168201915b505050505081565b600160a060020a031660009081526016602052604090205490565b6315752a0081565b6000600160a060020a0383161515610e0157600080fd5b336000818152600460209081526040808320600160a060020a03881680855290835292819020869055805186815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060015b92915050565b610ed3826001836040518082805190602001908083835b60208310610e9f5780518252601f199092019160209182019101610e80565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220929150506121b6565b5050565b600054600160a060020a03163314610eee57600080fd5b63617f2e01421015610eff57600080fd5b601754610f1590600160a060020a031682611ddf565b1515610f2057600080fd5b60005460175460408051600160a060020a0393841681529190921660208201527f7769746864726177546f5465616d537465703400000000000000000000000000818301526060810183905290516000805160206129b58339815191529181900360800190a1600f54610f99908263ffffffff6121cb16565b600f5550565b61271081565b6307270e0081565b6000805481908190600160a060020a03163314610fc957600080fd5b635bda42014210610fd957600080fd5b611006846040805190810160405280601081526020016000805160206129d583398151915281525061128b565b151561101157600080fd5b61103e846040805190810160405280601081526020016000805160206129d5833981519152815250612093565b600160a060020a0384166000908152601460209081526040808320839055601190915290205460105490935061107b90600163ffffffff6121a416565b915060108281548110151561108c57fe5b60009182526020909120015460108054600160a060020a0390921692508291859081106110b557fe5b60009182526020909120018054600160a060020a031916600160a060020a039290921691909117905560108054839081106110ec57fe5b60009182526020909120018054600160a060020a0319169055601080549061111890600019830161296d565b50600160a060020a039384166000908152601160205260408082208290559190941684529092205550565b600054600160a060020a0316331461115a57600080fd5b635bda4201421061116a57600080fd5b611197826040805190810160405280601081526020016000805160206129d583398151915281525061128b565b1515611227576111ca826040805190810160405280601081526020016000805160206129d58339815191528152506121d8565b60108054600160a060020a0384166000818152601160205260408120839055600183018455929092527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672018054600160a060020a03191690911790555b600160a060020a03909116600090815260146020526040902055565b600054600160a060020a0316331461125a57600080fd5b60178054600160a060020a031916600160a060020a0392909216919091179055565b6003545b90565b63617f2e0181565b60006112f7836001846040518082805190602001908083835b602083106112c35780518252601f1990920191602091820191016112a4565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220929150506122aa565b9392505050565b6000805481903390600160a060020a038781169116141561137657611346816040805190810160405280601481526020016000805160206129f583398151915281525061128b565b1561136c57635bb2b501421061135b57600080fd5b61136585856122c9565b9150611371565b600080fd5b611384565b611381868686612367565b91505b50949350505050565b600054600160a060020a031633146113a457600080fd5b601754604051600160a060020a0390911690303180156108fc02916000818181858888f193505050501580156113de573d6000803e3d6000fd5b50565b64012a05f20081565b600054600160a060020a0316331461140157600080fd5b635f9dfa8142101561141257600080fd5b60175461142890600160a060020a031682611ddf565b151561143357600080fd5b60005460175460408051600160a060020a0393841681529190921660208201527f7769746864726177546f5465616d537465703300000000000000000000000000818301526060810183905290516000805160206129b58339815191529181900360800190a1600e546114ac908263ffffffff6121cb16565b600e5550565b600b5481565b6402540be40081565b60075460ff1681565b600054600160a060020a031633146114e157600080fd5b635c538c014210156114f257600080fd5b60175461150890600160a060020a031682611ddf565b151561151357600080fd5b60005460175460408051600160a060020a0393841681529190921660208201527f7769746864726177546f5465616d537465703100000000000000000000000000818301526060810183905290516000805160206129b58339815191529181900360800190a1600c5461158c908263ffffffff6121cb16565b600c5550565b600054600160a060020a031633146115a957600080fd5b635bb163814210156115ba57600080fd5b6017546115d090600160a060020a031682611ddf565b15156115db57600080fd5b60005460175460408051600160a060020a0393841681529190921660208201527f776974686472617752656d61696e50726976617465436f696e00000000000000818301526060810183905290516000805160206129b58339815191529181900360800190a150565b600054600160a060020a0316331461165b57600080fd5b635bda420142101561166c57600080fd5b60175461168290600160a060020a031682611ddf565b151561168d57600080fd5b60005460175460408051600160a060020a0393841681529190921660208201527f7769746864726177436f6d6d6f6e436f696e0000000000000000000000000000818301526060810183905290516000805160206129b58339815191529181900360800190a1600b54611706908263ffffffff6121cb16565b600b5550565b600054600160a060020a0316331461172357600080fd5b635bb2b501421061173357600080fd5b611760826040805190810160405280601481526020016000805160206129f583398151915281525061128b565b1561176a57600080fd5b611797826040805190810160405280601481526020016000805160206129f58339815191528152506121d8565b6117a18282610dea565b505060128054600160a060020a039092166000818152601360205260408120849055600184018355919091527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34449091018054600160a060020a0319169091179055565b600160a060020a031660009081526014602052604090205490565b635cc8e18181565b635bb1638181565b600080600160a060020a038416151561184757600080fd5b50336000908152600460209081526040808320600160a060020a038716845290915290205480831061189c57336000908152600460209081526040808320600160a060020a03881684529091528120556118d1565b6118ac818463ffffffff6121a416565b336000908152600460209081526040808320600160a060020a03891684529091529020555b336000818152600460209081526040808320600160a060020a0389168085529083529281902054815190815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060019392505050565b6347868c0081565b600080548190600160a060020a0316331461195957600080fd5b611986846040805190810160405280601081526020016000805160206129d583398151915281525061128b565b151561199157600080fd5b635bda420142106119a157600080fd5b6009546119b4908463ffffffff6121cb16565b6007549092506119d59063179a7b009060ff16600a0a63ffffffff61206a16565b8211156119e157600080fd5b6119fa836119ee86611aa1565b9063ffffffff6121cb16565b600160a060020a038516600090815260146020526040902054909150811115611a2257600080fd5b6009829055611a318484611ddf565b5060005460408051600160a060020a03928316815291861660208301527f7769746864726177546f506172746e65720000000000000000000000000000008282015260608201859052516000805160206129b58339815191529181900360800190a150505050565b635c538c0181565b600160a060020a031660009081526002602052604090205490565b600054600160a060020a03163314611ad357600080fd5b60008054604051600160a060020a03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a260008054600160a060020a0319169055565b60408051808201909152601081526000805160206129d5833981519152602082015281565b600f5481565b600c5481565b600054600160a060020a031681565b60408051808201909152601481526000805160206129f58339815191526020820152611b873382610e69565b635bb2b5014210611b9757600080fd5b611ba983600160a060020a0316612062565b15611bb357600080fd5b600054610b9290600160a060020a031684846112fe565b6006805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610dbf5780601f10610d9457610100808354040283529160200191610dbf565b600054606090600160a060020a03163314611c3f57600080fd5b6012805480602002602001604051908101604052809291908181526020018280548015611c9557602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311611c77575b5050505050905090565b600054606090600160a060020a03163314611cb957600080fd5b6010805480602002602001604051908101604052809291908181526020018280548015611c9557602002820191906000526020600020908154600160a060020a03168152600190910190602001808311611c77575050505050905090565b600054600160a060020a03163314611d2e57600080fd5b635dbb7581421015611d3f57600080fd5b601754611d5590600160a060020a031682611ddf565b1515611d6057600080fd5b60005460175460408051600160a060020a0393841681529190921660208201527f7769746864726177546f5465616d537465703200000000000000000000000000818301526060810183905290516000805160206129b58339815191529181900360800190a1600d54611dd9908263ffffffff6121cb16565b600d5550565b60008054819081908190600160a060020a0316331415611e3c57611e016124de565b600854909250611e17908663ffffffff6121cb16565b905081811115611e2657600080fd5b611e3086866126ac565b60088290559250611ed2565b611e69336040805190810160405280601081526020016000805160206129d583398151915281525061128b565b15611ec557611e78338661278d565b9150600082111561136c57611e8d86836126ac565b33600090815260156020526040902054909350611eb0908363ffffffff6121cb16565b33600090815260156020526040902055611ed2565b611ecf86866126ac565b92505b5090949350505050565b635d422b8181565b600d5481565b635dbb758181565b600a5481565b6401ad64510081565b63179a7b0081565b60408051808201909152601481526000805160206129f5833981519152602082015281565b600160a060020a031660009081526015602052604090205490565b635bda420181565b6000600160a060020a0383161515611f6857600080fd5b336000908152600460209081526040808320600160a060020a0387168452909152902054611f9c908363ffffffff6121cb16565b336000818152600460209081526040808320600160a060020a0389168085529083529281902085905580519485525191937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a350600192915050565b600160a060020a03918216600090815260046020908152604080832093909416825291909152205490565b60085481565b600054600160a060020a0316331461204957600080fd5b6113de816128a1565b635f9dfa8181565b635bb2b50181565b6000903b1190565b600082151561207b57506000610e63565b5081810281838281151561208b57fe5b0414610e6357fe5b6120fd826001836040518082805190602001908083835b602083106120c95780518252601f1990920191602091820191016120aa565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922092915050612911565b81600160a060020a03167fd211483f91fc6eff862467f8de606587a30c8fc9981056f051b897a418df803a826040518080602001828103825283818151815260200191508051906020019080838360005b8381101561216657818101518382015260200161214e565b50505050905090810190601f1680156121935780820380516001836020036101000a031916815260200191505b509250505060405180910390a25050565b6000828211156121b057fe5b50900390565b6121c082826122aa565b1515610ed357600080fd5b81810182811015610e6357fe5b612242826001836040518082805190602001908083835b6020831061220e5780518252601f1990920191602091820191016121ef565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922092915050612933565b81600160a060020a03167fbfec83d64eaa953f2708271a023ab9ee82057f8f3578d548c1a4ba0b5b700489826040518080602001828103825283818151815260200191508051906020019080838360008381101561216657818101518382015260200161214e565b600160a060020a03166000908152602091909152604090205460ff1690565b60008060006122e384600a546121cb90919063ffffffff16565b600754909250612304906347868c009060ff16600a0a63ffffffff61206a16565b82111561231057600080fd5b60005461232790600160a060020a03168686612367565b3360009081526016602052604090205490915061234a908563ffffffff6121cb16565b33600090815260166020526040902055600a919091559392505050565b600160a060020a03831660009081526002602052604081205482111561238c57600080fd5b600160a060020a03841660009081526004602090815260408083203384529091529020548211156123bc57600080fd5b600160a060020a03831615156123d157600080fd5b600160a060020a0384166000908152600260205260409020546123fa908363ffffffff6121a416565b600160a060020a03808616600090815260026020526040808220939093559085168152205461242f908363ffffffff6121cb16565b600160a060020a038085166000908152600260209081526040808320949094559187168152600482528281203382529091522054612473908363ffffffff6121a416565b600160a060020a03808616600081815260046020908152604080832033845282529182902094909455805186815290519287169391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a35060019392505050565b6007546000904290829081906125059063179a7b009060ff16600a0a63ffffffff61206a16565b9150635bb16381831061256257600754612530906347868c009060ff16600a0a63ffffffff61206a16565b905080600a54101561256257600a5461255f90612553848463ffffffff6121cb16565b9063ffffffff6121a416565b91505b635bda420183106125b4576007546125b1906125a49060ff16600a0a6125986401ad64510064012a05f20063ffffffff6121a416565b9063ffffffff61206a16565b839063ffffffff6121cb16565b91505b635c538c0183106125e4576007546125e1906125a4906307270e009060ff16600a0a63ffffffff61206a16565b91505b635cc8e181831061261557600754612612906125a49064012a05f2009060ff16600a0a63ffffffff61206a16565b91505b635dbb7581831061264557600754612642906125a4906315752a009060ff16600a0a63ffffffff61206a16565b91505b635f9dfa81831061267557600754612672906125a4906315752a009060ff16600a0a63ffffffff61206a16565b91505b63617f2e0183106126a5576007546126a2906125a4906315752a009060ff16600a0a63ffffffff61206a16565b91505b5092915050565b336000908152600260205260408120548211156126c857600080fd5b600160a060020a03831615156126dd57600080fd5b336000908152600260205260409020546126fd908363ffffffff6121a416565b3360009081526002602052604080822092909255600160a060020a0385168152205461272f908363ffffffff6121cb16565b600160a060020a0384166000818152600260209081526040918290209390935580518581529051919233927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a350600192915050565b600080600080600061279e87611aa1565b600160a060020a03881660009081526015602052604090205490945092506127cc838563ffffffff6121cb16565b9150429050600084116127de57600080fd5b635dbb758181106127f157819350612867565b635d422b8181106128255761281e606461281284604b63ffffffff61206a16565b9063ffffffff61295816565b9350612867565b635cc8e18181106128415761281e82600263ffffffff61295816565b635c538c0181106128625761281e606461281284601963ffffffff61206a16565b600093505b838310612877576000935061288a565b612887848463ffffffff6121a416565b93505b83861015612896578593505b509195945050505050565b600160a060020a03811615156128b657600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360008054600160a060020a031916600160a060020a0392909216919091179055565b600160a060020a0316600090815260209190915260409020805460ff19169055565b600160a060020a0316600090815260209190915260409020805460ff19166001179055565b6000818381151561296557fe5b049392505050565b81548183558181111561299157600083815260209020612991918101908301612996565b505050565b61128091905b808211156129b0576000815560010161299c565b509056007d794f058f68b76e7ec56cf405982d6cddbac0baba1afbdf64368efa3e8b37ab706172746e657257686974656c697374000000000000000000000000000000007072697661746553616c6557686974656c697374000000000000000000000000a165627a7a7230582085fe8cacb4b93d4e9aba7506be3e0c438244201f910733d02d5be2fc499b731b0029

Swarm Source

bzzr://85fe8cacb4b93d4e9aba7506be3e0c438244201f910733d02d5be2fc499b731b
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.