ETH Price: $2,631.04 (+7.77%)
 

Overview

Max Total Supply

156,852,447.959188553626084366 FFC

Holders

6,784

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
34.6 FFC

Value
$0.00
0x97ffe497f1888336dda8707a25441d18f235a03a
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:
BwinToken

Compiler Version
v0.4.21+commit.dfe3193c

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

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

pragma solidity ^0.4.13;

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);
}

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);
}

contract ContractReceiver {

    struct TKN {
        address sender;
        uint value;
        bytes data;
        bytes4 sig;
    }

    function tokenFallback(address _from, uint _value, bytes _data) public pure {
        TKN memory tkn;
        tkn.sender = _from;
        tkn.value = _value;
        tkn.data = _data;
        uint32 u = uint32(_data[3]) + (uint32(_data[2]) << 8) + (uint32(_data[1]) << 16) + (uint32(_data[0]) << 24);
        tkn.sig = bytes4(u);

        /* tkn variable is analogue of msg variable of Ether transaction
        *  tkn.sender is person who initiated this token transaction   (analogue of msg.sender)
        *  tkn.value the number of tokens that were sent   (analogue of msg.value)
        *  tkn.data is data of token transaction   (analogue of msg.data)
        *  tkn.sig is 4 bytes signature of function
        *  if data of token transaction is a function execution
        */
    }
}

contract Ownable {
  address public owner;


  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));
    emit OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }

}

contract CrowdsaleFront is Ownable{
    //Crowdsale public provider;
    using SafeMath for uint256;
    mapping (address => uint256) internal userAmounts;
    mapping (address => uint256) internal rewardPayed;
    BwinCommons internal commons;
    function setCommons(address _addr) public onlyOwner {
        commons = BwinCommons(_addr);
    }
    // fallback function can be used to buy tokens
    function () public payable {
        buyTokens(msg.sender, 0, 999);
    }

    // low level token purchase function
    function buyTokens(address beneficiary, address _parent, uint256 _top) public payable returns(bool){
      bool ret;
      uint256 tokens;
      (ret, tokens) = Crowdsale(commons.get("Crowdsale")).buyTokens.value(msg.value)(beneficiary, beneficiary, _parent, _top);
      userAmounts[beneficiary] = userAmounts[beneficiary].add(tokens);
      require(ret);
    }

    function getTokensFromBuy(address _addr) public view returns (uint256){
      return userAmounts[_addr];
    }
    function rewardPayedOf(address _user) public view returns (uint256) {
      return rewardPayed[_user];
    }
    function rewardPay(address _user, uint256 amount) public {
      require(msg.sender == commons.get("Crowdsale"));
      rewardPayed[_user] = rewardPayed[_user].add(amount);
    }

    // @return true if crowdsale event has ended
    function hasEnded() public view returns (bool){
        return Crowdsale(commons.get("Crowdsale")).hasEnded();
    }

}

contract InterestHolder is Ownable{
  using SafeMath for uint256;
  BwinCommons internal commons;
  function setCommons(address _addr) public onlyOwner {
      commons = BwinCommons(_addr);
  }
  bool public locked = true;
  event ReceiveBalanceUpdate(address _addr,address _user);
  event ReceiveBalanceUpdateUserType(address _addr,address _user,uint256 _type);
  function receiveBalanceUpdate(address _user) external returns (bool) {
    emit ReceiveBalanceUpdate(msg.sender, _user);
    Token token = Token(commons.get("Token"));
    User user = User(commons.get("User"));
    if (msg.sender == address(token)){
      uint256 _type;
      (,,_type) = user.getUserInfo(_user);
      emit ReceiveBalanceUpdateUserType(msg.sender, _user, _type);
      if (_type == 0){
          return true;
      }
      process(_user,_type);
      return true;
    }
    return false;
  }
  event ProcessLx(address _addr,address _user, uint256 _type,uint256 lastBalance, uint256 iAmount, uint256 lastTime);
  function process(address _user, uint256 _type) internal{
    Token token = Token(commons.get("Token"));
    User user = User(commons.get("User"));
    uint256 _value = compute(_user, _type);
    uint256 balance = token.balanceOf(_user);
    user.setInterestor(_user,balance.add(_value),now);
    if(_value > 0){
      token.mintForWorker(_user,_value);
      emit ProcessLx(msg.sender, _user, _type, balance, _value, now);
    }
  }
  event GetLx(address _addr,address _user,uint256 _type);

  function compute(address _user, uint256 _type) internal view returns (uint256) {
    User user = User(commons.get("User"));
    uint256 lastBalance = 0;
    uint256 lastTime = 0;
    bool exist;
    (lastBalance,lastTime,exist) = user.getInterestor(_user);
    uint256 _value = 0;
    if (exist && lastTime > 0){
        uint256 times = now.sub(lastTime);
        if (_type == 1){
            _value = lastBalance.div(10000).mul(5).div(86400).mul(times);
        }else if(_type == 2){
            _value = lastBalance.div(10000).mul(8).div(86400).mul(times);
        }
    }
    return _value;
  }
  function getLx() external returns (uint256) {
    User user = User(commons.get("User"));
    uint256 _type;
    (,,_type) = user.getUserInfo(msg.sender);
    emit GetLx(msg.sender, msg.sender, _type);
    if (_type == 0){
        return 0;
    }
    return compute(msg.sender, _type);
  }
}

contract TokenHolder is Ownable{
  using SafeMath for uint256;

  BwinCommons internal commons;
  function setCommons(address _addr) public onlyOwner {
      commons = BwinCommons(_addr);
  }
  bool locked = true;
  mapping (address => uint256) lockedAmount;
  event ReceiveLockedAmount(address _addr, address _user, uint256 _amount);
  function receiveLockedAmount(address _user, uint256 _amount) external returns (bool) {
    address cds = commons.get("Crowdsale");
    if (msg.sender == address(cds)){
      lockedAmount[_user] = lockedAmount[_user].add(_amount);
      emit ReceiveLockedAmount(msg.sender, _user, _amount);
      return true;
    }
    return false;
  }

  function balanceOf(address _user) public view returns (uint256) {
    return lockedAmount[_user];
  }
  function balance() public view returns (uint256) {
    return lockedAmount[msg.sender];
  }

  function setLock(bool _locked) public onlyOwner{
    locked = _locked;
  }

  function withDrawlocked() public view returns (bool) {
      return locked;
  }

  function withDrawable() public view returns (bool) {
    User user = User(commons.get("User"));
    uint256 _type;
    (,,_type) = user.getUserInfo(msg.sender);
    return !locked && (_type > 0) && lockedAmount[msg.sender] > 0;
  }

  function withDraw() external {
    assert(!locked);//用户必须是种子钱包
    BwinToken token = BwinToken(commons.get("BwinToken"));
    User user = User(commons.get("User"));
    uint256 _type;
    (,,_type) = user.getUserInfo(msg.sender);
    assert(_type > 0);
    uint _value = lockedAmount[msg.sender];
    lockedAmount[msg.sender] = 0;
    token.transfer(msg.sender,_value);
  }

}

contract Destructible is Ownable {

  function Destructible() public payable { }

  /**
   * @dev Transfers the current balance to the owner and terminates the contract.
   */
  function destroy() onlyOwner public {
    selfdestruct(owner);
  }

  function destroyAndSend(address _recipient) onlyOwner public {
    selfdestruct(_recipient);
  }
}

contract EtherHolder is Destructible{
  using SafeMath for uint256;
  bool locked = false;

  BwinCommons internal commons;
  function setCommons(address _addr) public onlyOwner {
      commons = BwinCommons(_addr);
  }
  struct Account {
    address wallet;
    address parent;
    uint256 radio;
    bool exist;
  }
  mapping (address => uint256) private userAmounts;
  uint256 internal _balance;
  event ProcessFunds(address _topWallet, uint256 _value ,bool isContract);

  event ReceiveFunds(address _addr, address _user, uint256 _value, uint256 _amount);
  function receiveFunds(address _user, uint256 _amount) external payable returns (bool) {
    emit ReceiveFunds(msg.sender, _user, msg.value, _amount);
    Crowdsale cds = Crowdsale(commons.get("Crowdsale"));
    User user = User(commons.get("User"));
    assert(msg.value == _amount);
    if (msg.sender == address(cds)){
        address _topWallet;
        uint _percent=0;
        bool _contract;
        uint256 _topValue = 0;
        bool _topOk;
        uint256 _totalShares = 0;
        uint256 _totalSharePercent = 0;
        bool _shareRet;
        if(user.hasUser(_user)){
          (_topWallet,_percent,_contract) = user.getTopInfoDetail(_user);
          assert(_percent <= 1000);
          (_topValue,_topOk) = processFunds(_topWallet,_amount,_percent,_contract);
        }else{
          _topOk = true;
        }
        (_totalShares,_totalSharePercent,_shareRet) = processShares(_amount.sub(_topValue));
        assert(_topOk && _shareRet);
        assert(_topValue.add(_totalShares) <= _amount);
        assert(_totalSharePercent <= 1000);
        _balance = _balance.add(_amount);
        return true;
    }
    return false;
  }
  event ProcessShares(uint256 _amount, uint i, uint256 _percent, bool _contract,address _wallet);
  function processShares(uint256 _amount) internal returns(uint256,uint256,bool){
      uint256 _sended = 0;
      uint256 _sharePercent = 0;
      User user = User(commons.get("User"));
      for(uint i=0;i<user.getShareHolderCount();i++){
        address _wallet;
        uint256 _percent;
        bool _contract;
        emit ProcessShares(_amount, i, _percent, _contract,_wallet);
        assert(_percent <= 1000);
        (_wallet,_percent,_contract) = user.getShareHolder(i);
        uint256 _value;
        bool _valueOk;
        (_value,_valueOk) = processFunds(_wallet,_amount,_percent,_contract);
        _sharePercent = _sharePercent.add(_percent);
        _sended = _sended.add(_value);
      }
      return (_sended,_sharePercent,true);
  }
  function getAmount(uint256 _amount, uint256 _percent) internal pure returns(uint256){
      uint256 _value = _amount.div(1000).mul(_percent);
      return _value;
  }
  function processFunds(address _topWallet, uint256 _amount ,uint256 _percent, bool isContract) internal returns(uint,bool) {
      uint256 _value = getAmount(_amount, _percent);
      userAmounts[_topWallet] = userAmounts[_topWallet].add(_value);
      emit ProcessFunds(_topWallet,_value,isContract);
      return (_value,true);
  }

  function balanceOf(address _user) public view returns (uint256) {
    return userAmounts[_user];
  }

  function balanceOfme() public view returns (uint256) {
    return userAmounts[msg.sender];
  }

  function withDrawlocked() public view returns (bool) {
      return locked;
  }
  function getBalance() public view returns (uint256, uint256) {
    return (address(this).balance,_balance);
  }
  function lock(bool _locked) public onlyOwner{
    locked = _locked;
  }
  event WithDraw(address caller, uint256 _amount);

  function withDraw(uint256 _amount) external {
    assert(!locked);
    assert(userAmounts[msg.sender] >= _amount);
    userAmounts[msg.sender] = userAmounts[msg.sender].sub(_amount);
    _balance = _balance.sub(_amount);
    msg.sender.transfer(_amount);
    emit WithDraw(msg.sender, _amount);
  }
  function destroy() onlyOwner public {
    selfdestruct(owner);
  }
}

library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  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;
  }

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

  /**
  * @dev Substracts 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) {
    uint256 c = a + b;
    assert(c >= a);
    return c;
  }
}

contract RBAC {
  using Roles for Roles.Role;

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

  event RoleAdded(address addr, string roleName);
  event RoleRemoved(address addr, string roleName);

  /**
   * A constant role name for indicating admins.
   */
  string public constant ROLE_ADMIN = "admin";

  /**
   * @dev constructor. Sets msg.sender as admin by default
   */
  function RBAC()
    public
  {
    addRole(msg.sender, ROLE_ADMIN);
  }

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

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

  /**
   * @dev add a role to an address
   * @param addr address
   * @param roleName the name of the role
   */
  function adminAddRole(address addr, string roleName)
    onlyAdmin
    public
  {
    addRole(addr, roleName);
  }

  /**
   * @dev remove a role from an address
   * @param addr address
   * @param roleName the name of the role
   */
  function adminRemoveRole(address addr, string roleName)
    onlyAdmin
    public
  {
    removeRole(addr, roleName);
  }

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

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

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

  /**
   * @dev modifier to scope access to admins
   * // reverts
   */
  modifier onlyAdmin()
  {
    checkRole(msg.sender, ROLE_ADMIN);
    _;
  }

  /**
   * @dev modifier to scope access to a set of roles (uses msg.sender as addr)
   * @param roleNames 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[] roleNames) {
  //     bool hasAnyRole = false;
  //     for (uint8 i = 0; i < roleNames.length; i++) {
  //         if (hasRole(msg.sender, roleNames[i])) {
  //             hasAnyRole = true;
  //             break;
  //         }
  //     }

  //     require(hasAnyRole);

  //     _;
  // }
}

contract BwinCommons is RBAC, Destructible {
    mapping (string => address) internal addresses;
    mapping (address => string) internal names;

    event UpdateRegistration(string key, address old, address n);

    function register(string key, address ad) public onlyAdmin {
        emit UpdateRegistration(key, addresses[key], ad);
        addresses[key] = ad;
        names[ad] = key;
    }

    function get(string key) public view returns(address) {
        return addresses[key];
    }

    function remove() public {
      string memory key = names[msg.sender];
      delete addresses[key];
      delete names[msg.sender];
    }
}

contract User is RBAC ,Destructible{
    struct UserInfo {
        //推荐人
        address parent;
        uint256 top;
        bool exist;
        uint256 userType;
    }

    struct Partner {
      address addr;
      uint256 percent;
      bool exist;
      bool iscontract;
    }

    struct UserBalance{
        address user;
        uint256 balance;
        uint256 lastTime;
        bool exist;
    }
    mapping (address => UserBalance) internal balanceForInterests;
    uint256[] internal tops;
    mapping (uint256 => Partner) internal topDefine;

    uint256[] internal shareHolders;
    mapping (uint256 => Partner) internal shareHolderInfos;
    mapping (address => UserInfo) internal tree;
    BwinCommons internal commons;
    function setCommons(address _addr) public onlyAdmin {
        commons = BwinCommons(_addr);
    }


    address[] internal users;
    event SetInterestor(address caller, address _user, uint256 _balance, uint256 _lastTime);
    event SetShareHolders(address caller, uint256 topId, address _topAddr, uint256 _percent, bool iscontract);
    event SetTop(address caller, uint256 topId, address _topAddr, uint256 _percent, bool iscontract);
    event AddUser(address caller, address _parent, uint256 _top);
    event SetUser(address caller, address _user, address _parent, uint256 _top, uint256 _type);
    event SetUserType(address caller, address _user, uint _type);
    event RemoveUser(address caller, uint _index);

    function setInterestor(address _user, uint256 _balance, uint256 _lastTime) public onlyRole("INTEREST_HOLDER"){
        balanceForInterests[_user] = UserBalance(_user,_balance,_lastTime,true);
        emit SetInterestor(msg.sender,_user,_balance,_lastTime);
    }

    function getInterestor(address _user) public view returns(uint256,uint256,bool){
        return (balanceForInterests[_user].balance,balanceForInterests[_user].lastTime,balanceForInterests[_user].exist);
    }
    function setShareHolders(uint256 topId, address _topAddr, uint256 _percent, bool iscontract) public onlyAdmin {
        if (!shareHolderInfos[topId].exist){
          shareHolders.push(topId);
        }
        shareHolderInfos[topId] = Partner(_topAddr, _percent, true, iscontract);
        emit SetShareHolders(msg.sender,topId,_topAddr,_percent,iscontract);
    }
    function getShareHolder(uint256 _index) public view returns(address, uint256, bool){
        uint256 shareHolderId = shareHolders[_index];
        return getShareHoldersInfo(shareHolderId);
    }
    function getShareHolderCount() public view returns(uint256){
        return shareHolders.length;
    }
    function getShareHoldersInfo(uint256 shareHolderId) public view returns(address, uint256, bool){
      return (shareHolderInfos[shareHolderId].addr, shareHolderInfos[shareHolderId].percent, shareHolderInfos[shareHolderId].iscontract);
    }

    function setTop(uint256 topId, address _topAddr, uint256 _percent, bool iscontract) public onlyAdmin {
        if (!topDefine[topId].exist){
          tops.push(topId);
        }
        topDefine[topId] = Partner(_topAddr, _percent, true, iscontract);
        emit SetTop(msg.sender, topId, _topAddr, _percent, iscontract);
    }
    function getTopInfoDetail(address _user) public view returns(address, uint256, bool){
        uint256 _topId;
        address _wallet;
        uint256 _percent;
        bool _contract;
        (,_topId,) = getUserInfo(_user);
        (_wallet,_percent,_contract) = getTopInfo(_topId);
        return (_wallet,_percent,_contract);
    }
    function getTopInfo(uint256 topId) public view returns(address, uint256, bool){
      return (topDefine[topId].addr, topDefine[topId].percent, topDefine[topId].iscontract);
    }
    function addUser(address _parent, uint256 _top) public {
        require(msg.sender != _parent);
        if (_parent != address(0)) {
            require(tree[_parent].exist);
        }
        require(!hasUser(msg.sender));
        tree[msg.sender] = UserInfo(_parent, _top, true, 0);
        users.push(msg.sender);
        emit AddUser(msg.sender, _parent, _top);
    }

    function getUsersCount() public view returns(uint) {
        return users.length;
    }

    function getUserInfo(address _user) public view returns(address, uint256, uint256) {
        return (tree[_user].parent, tree[_user].top, tree[_user].userType);
    }

    function hasUser(address _user) public view returns(bool) {
        return tree[_user].exist;
    }

    function setUser(address _user, address _parent, uint256 _top, uint256 _type) public onlyAdmin {
      if(!tree[_user].exist){
        users.push(_user);
      }
      tree[_user] = UserInfo(_parent, _top, true, _type);
      emit SetUser(msg.sender, _user, _parent, _top, _type);
    }

    function setUserType(address _user, uint _type) public onlyAdmin {
        require(hasUser(_user));
        tree[_user].userType = _type;
        emit SetUserType(msg.sender, _user, _type);
    }
    function indexOfUserInfo(uint _index) public view returns (address) {
        return users[_index];
    }

    function removeUser(uint _index) public onlyAdmin {
        address _user = indexOfUserInfo(_index);
        delete users[_index];
        delete tree[_user];
        emit RemoveUser(msg.sender, _index);
    }
}

contract Pausable is RBAC {
  event Pause();
  event Unpause();

  bool public paused = false;


  /**
   * @dev Modifier to make a function callable only when the contract is not paused.
   */
  modifier whenNotPaused() {
    require(!paused);
    _;
  }

  /**
   * @dev Modifier to make a function callable only when the contract is paused.
   */
  modifier whenPaused() {
    require(paused);
    _;
  }

  /**
   * @dev called by the owner to pause, triggers stopped state
   */
  function pause() onlyAdmin whenNotPaused public {
    paused = true;
    emit Pause();
  }

  /**
   * @dev called by the owner to unpause, returns to normal state
   */
  function unpause() onlyAdmin whenPaused public {
    paused = false;
    emit Unpause();
  }
}

contract BwinToken is ERC20, Pausable, Destructible{
    //Token t;

    BwinCommons internal commons;
    function setCommons(address _addr) public onlyOwner {
        commons = BwinCommons(_addr);
    }
    string public constant name = "FFgame Coin";
    string public constant symbol = "FFC";
    uint8 public constant decimals = 18;
    event Transfer(address indexed from, address indexed to, uint256 value);
    function BwinToken() public {
      addRole(msg.sender, ROLE_ADMIN);
    }
    function totalSupply() public view returns (uint256){
      Token t = Token(commons.get("Token"));
      return t.totalSupply();
    }
    function balanceOf(address who) public view returns (uint256){
      Token t = Token(commons.get("Token"));
      return t.balanceOf(who);
    }
    function transfer(address to, uint256 value) public returns (bool){
      bytes memory empty;
      Token t = Token(commons.get("Token"));
      if(t.transfer(msg.sender, to, value,empty)){
          emit Transfer(msg.sender, to, value);
          return true;
      }
      return false;
    }


    function allowance(address owner, address spender) public view returns (uint256){
      Token t = Token(commons.get("Token"));
      return t.allowance(owner, spender);
    }
    function transferFrom(address from, address to, uint256 value) public returns (bool){
      Token t = Token(commons.get("Token"));
      if(t._transferFrom(msg.sender, from, to, value)){
          emit Transfer(from, to, value);
          return true;
      }
      return false;
    }
    function approve(address spender, uint256 value) public returns (bool){
      Token t = Token(commons.get("Token"));
      if (t._approve(msg.sender, spender, value)){
          emit Approval(msg.sender, spender, value);
          return true;
      }
      return false;
    }

    function increaseApproval(address _spender, uint _addedValue) public whenNotPaused returns (bool success) {
      Token t = Token(commons.get("Token"));
      if(t._increaseApproval(msg.sender, _spender, _addedValue)){
          emit Approval(msg.sender, _spender, _addedValue);
          return true;
      }
      return false;
    }

    function decreaseApproval(address _spender, uint _subtractedValue) public whenNotPaused returns (bool success) {
      Token t = Token(commons.get("Token"));
      if (t._decreaseApproval(msg.sender,_spender, _subtractedValue)){
          emit Approval(msg.sender, _spender, _subtractedValue);
          return true;
      }
      return false;
    }
    event Approval(address indexed owner, address indexed spender, uint256 value);

}

contract Token is RBAC, Pausable{
    using SafeMath for uint256;

    BwinCommons internal commons;
    function setCommons(address _addr) public onlyAdmin {
        commons = BwinCommons(_addr);
    }
    event TokenApproval(address indexed owner, address indexed spender, uint256 value);
    event TokenTransfer(address indexed from, address indexed to, uint256 value);
    event MintForSale(address indexed to, uint256 amount);
    event MintForWorker(address indexed to, uint256 amount);
    event MintForUnlock(address indexed to, uint256 amount);

    function Token() public {
        addRole(msg.sender, ROLE_ADMIN);
    }

    function totalSupply() public view returns (uint256) {
      TokenData td = TokenData(commons.get("TokenData"));
      return td.totalSupply();
    }
    function balanceOf(address _owner) public view returns (uint256) {
      TokenData td = TokenData(commons.get("TokenData"));
      return td.balanceOf(_owner);
    }
    function _transferFrom(address _sender, address _from, address _to, uint256 _value) external whenNotPaused onlyRole("FRONT_TOKEN_USER") returns (bool) {
      InterestHolder ih = InterestHolder(commons.get("InterestHolder"));
      TokenData td = TokenData(commons.get("TokenData"));
      uint256 _balanceFrom = balanceOf(_from);
      uint256 _balanceTo = balanceOf(_to);
      uint256 _allow = allowance(_from, _sender);
      require(_from != address(0));
      require(_sender != address(0));
      require(_to != address(0));
      require(_value <= _balanceFrom);
      require(_value <= _allow);
      td.setBalance(_from,_balanceFrom.sub(_value));
      td.setBalance(_to,_balanceTo.add(_value));
      td.setAllowance(_from, _sender, _allow.sub(_value));
      if(ih != address(0)){
        ih.receiveBalanceUpdate(_from);
        ih.receiveBalanceUpdate(_to);
      }
      emit TokenTransfer(_from, _to, _value);
      return true;
    }

    function allowance(address _owner, address _spender) public view returns (uint256) {
      TokenData td = TokenData(commons.get("TokenData"));
      return td.allowance(_owner,_spender);
    }
    function _approve(address _sender, address _spender, uint256 _value) public onlyRole("FRONT_TOKEN_USER")  whenNotPaused returns (bool) {
      TokenData td = TokenData(commons.get("TokenData"));
      return td.setAllowance(_sender, _spender, _value);
    }
    function _increaseApproval(address _sender, address _spender, uint _addedValue) public onlyRole("FRONT_TOKEN_USER") whenNotPaused returns (bool) {
      TokenData td = TokenData(commons.get("TokenData"));
      td.setAllowance(_sender, _spender, allowance(_sender, _spender).add(_addedValue));
      emit TokenApproval(_sender, _spender, allowance(_sender, _spender));
      return true;
    }
    function _decreaseApproval(address _sender, address _spender, uint _subtractedValue) public onlyRole("FRONT_TOKEN_USER") whenNotPaused returns (bool) {
      TokenData td = TokenData(commons.get("TokenData"));
      uint oldValue = allowance(_sender, _spender);
      if (_subtractedValue > oldValue) {
          td.setAllowance(_sender, _spender, 0);
          //allowed[msg.sender][_spender] = 0;
      } else {
          td.setAllowance(_sender, _spender, oldValue.sub(_subtractedValue));
          //allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
      }
      emit TokenApproval(_sender, _spender, allowance(_sender, _spender));
      return true;
    }

    function unlockAmount(address _to, uint256 _amount) external onlyAdmin returns (bool){
      TokenData td = TokenData(commons.get("TokenData"));
      require(td.totalSupply().add(_amount) <= td.TotalCapacity());
      uint256 unlockedAmount = td.valueOf("unlockedAmount");
      if(_mint(_to, _amount)){
          td.setValue("unlockedAmount",unlockedAmount.add(_amount));
          emit MintForUnlock(_to, _amount);
          return true;
      }
      return false;
    }

    function _mint(address _to, uint256 _amount) internal returns (bool) {
      TokenData td = TokenData(commons.get("TokenData"));
      InterestHolder ih = InterestHolder(commons.get("InterestHolder"));
      require(_to != address(0));
      require(_amount > 0);
      uint256 totalMinted = td.valueOf("totalMinted");
      td.setTotal(td.totalSupply().add(_amount));
      td.setBalance(_to,balanceOf(_to).add(_amount));
      td.setValue("totalMinted",totalMinted.add(_amount));
      if(address(ih) != address(0)){
        ih.receiveBalanceUpdate(_to);
      }
      return true;
    }

    function mintForSale(address _to, uint256 _amount) external onlyRole("TOKEN_SALE") whenNotPaused returns (bool) {
      TokenData td = TokenData(commons.get("TokenData"));
      require(td.totalSupply().add(_amount) <= td.TotalCapacity());
      uint256 saledAmount = td.valueOf("saledAmount");
      if(_mint(_to, _amount)){
          td.setValue("saledAmount",saledAmount.add(_amount));
          emit MintForSale(_to, _amount);
          return true;
      }
      return false;
    }
    function mintForWorker(address _to, uint256 _amount) external onlyRole("TOKEN_WORKER") whenNotPaused returns (bool) {
      TokenData td = TokenData(commons.get("TokenData"));
      require(td.totalSupply().add(_amount) <= td.TotalCapacity());
      uint256 minedAmount = td.valueOf("minedAmount");
      if(_mint(_to, _amount)){
        td.setValue("minedAmount",minedAmount.add(_amount));
        emit MintForWorker(_to, _amount);
        return true;
      }
      return false;
    }
    function transfer(address _from, address _to, uint _value, bytes _data) external whenNotPaused onlyRole("FRONT_TOKEN_USER")  returns (bool success) {

        if (isContract(_to)) {
            return transferToContract(_from, _to, _value, _data);
        }else {
            return transferToAddress(_from, _to, _value);
        }
    }
    //assemble the given address bytecode. If bytecode exists then the _addr is a contract.
    function isContract(address _addr) internal view returns (bool) {
        uint length;
        assembly {
            //retrieve the size of the code on target address, this needs assembly
            length := extcodesize(_addr)
        }
        return (length > 0);
    }
    function _transfer(address _from, address _to, uint256 _value) internal returns (bool) {
      TokenData td = TokenData(commons.get("TokenData"));
      InterestHolder ih = InterestHolder(commons.get("InterestHolder"));
      require(_to != address(0));
      require(_value <= balanceOf(_from));
      td.setBalance(_from,balanceOf(_from).sub(_value));
      td.setBalance(_to,balanceOf(_to).add(_value));
      if(ih != address(0)){
        ih.receiveBalanceUpdate(_from);
        ih.receiveBalanceUpdate(_to);
      }
      emit TokenTransfer(_from, _to, _value);
      return true;
    }

    //function that is called when transaction target is an address
    function transferToAddress(address _from, address _to, uint _value) internal returns (bool success) {
        require(balanceOf(_from) >= _value);
        require(_transfer(_from, _to, _value));
        emit TokenTransfer(_from, _to, _value);
        return true;
    }

    //function that is called when transaction target is a contract
    function transferToContract(address _from, address _to, uint _value, bytes _data) internal returns (bool success) {
        require(balanceOf(_from) >= _value);
        require(_transfer(_from, _to, _value));
        ContractReceiver receiver = ContractReceiver(_to);
        receiver.tokenFallback(msg.sender, _value, _data);
        emit TokenTransfer(msg.sender, _to, _value);
        return true;
    }



}

contract TokenData is RBAC, Pausable{
  //using SafeMath for uint256;
  event TokenDataBalance(address sender, address indexed addr, uint256 value);
  event TokenDataAllowance(address sender, address indexed from, address indexed to, uint256 value);
  event SetTotalSupply(address _addr, uint256 _total);
  mapping(address => uint256) internal balances;
  mapping(string => uint256) internal values;

  mapping (address => mapping (address => uint256)) internal allowed;

  address[] internal users;

  uint256 internal totalSupply_;
  uint256 internal totalCapacity_;

  string internal  name_;
  string internal  symbol_;
  uint8 internal  decimals_;
  function TokenData(uint256 _totalSupply, uint256 _totalCapacity) public {
    addRole(msg.sender, ROLE_ADMIN);
    totalSupply_ = _totalSupply;
    totalCapacity_ = _totalCapacity;
  }

  BwinCommons internal commons;
  function setCommons(address _addr) public onlyAdmin {
      commons = BwinCommons(_addr);
  }
  function setTotal(uint256 _total) public onlyRole("TOKEN_DATA_USER") {
      totalSupply_ = _total;
      emit SetTotalSupply(msg.sender, _total);
  }
  event SetValue(address _addr, string name, uint256 _value);

  function setValue(string name, uint256 _value) external onlyRole("TOKEN_DATA_USER") {
      values[name] = _value;
      emit SetValue(msg.sender, name, _value);
  }

  event SetTotalCapacity(address _addr, uint256 _total);

  function setTotalCapacity(uint256 _total) external onlyRole("TOKEN_DATA_USER") {
      totalCapacity_ = _total;
      emit SetTotalCapacity(msg.sender, _total);
  }

  function valueOf(string _name) public view returns(uint256){
      return values[_name];
  }


  function TotalCapacity() public view returns (uint256) {
    return totalCapacity_;
  }

  function totalSupply() public view returns (uint256) {
    return totalSupply_;
  }



  function balanceOf(address _owner) public view returns (uint256) {
    return balances[_owner];
  }

  function allowance(address _owner, address _spender) public view returns (uint256) {
    return allowed[_owner][_spender];
  }



  function setBalance(address _addr, uint256 _value) external whenNotPaused onlyRole("TOKEN_DATA_USER") returns (bool) {
    return _setBalance(_addr, _value);
  }
  function setAllowance(address _from, address _to, uint256 _value) external whenNotPaused onlyRole("TOKEN_DATA_USER") returns (bool) {
    return _setAllowance(_from, _to, _value);
  }

  function setBalanceAdmin(address _addr, uint256 _value) external onlyAdmin returns (bool) {
    return _setBalance(_addr, _value);
  }
  function setAllowanceAdmin(address _from, address _to, uint256 _value) external onlyAdmin returns (bool) {
    return _setAllowance(_from, _to, _value);
  }

  function _setBalance(address _addr, uint256 _value) internal returns (bool) {
    require(_addr != address(0));
    require(_value >= 0);
    balances[_addr] = _value;
    emit TokenDataBalance(msg.sender, _addr, _value);
    return true;
  }
  function _setAllowance(address _from, address _to, uint256 _value) internal returns (bool) {
    require(_from != address(0));
    require(_to != address(0));
    require(_value >= 0);
    allowed[_from][_to] = _value;
    emit TokenDataAllowance(msg.sender, _from, _to, _value);
    return true;
  }
}

contract Crowdsale is Ownable, Pausable{
  using SafeMath for uint256;
  uint256 public startTime;
  uint256 public endTime;
  uint256 public saleCapacity;
  uint256 public saledAmount;
  uint256 public rate;
  uint256 public weiRaised;
  event TokenPurchase(address payor, address indexed purchaser, address indexed beneficiary, uint256 value, uint256 amount);
  BwinCommons internal commons;
  function setCommons(address _addr) public onlyOwner {
      commons = BwinCommons(_addr);
  }
  function buyTokens(address payor, address beneficiary, address _parent, uint256 _top) public  payable returns(bool, uint256);
  function hasEnded() public view returns (bool){
      return (now > endTime || saledAmount >= saleCapacity);
  }
  modifier onlyFront() {
      require(msg.sender == address(commons.get("CrowdsaleFront")));
      _;
  }
  function validPurchase() internal view returns (bool) {
      bool withinPeriod = now >= startTime && now <= endTime;
      bool withinCapacity = saledAmount <= saleCapacity;
      return withinPeriod && withinCapacity;
  }

  function getTokenAmount(uint256 weiAmount) internal view returns(uint256) {
      return weiAmount.mul(rate);
  }
}

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];
  }
}

Contract Security Audit

Contract ABI

[{"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":"addr","type":"address"},{"name":"roleName","type":"string"}],"name":"checkRole","outputs":[],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"},{"name":"roleName","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":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"who","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"destroy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"},{"name":"roleName","type":"string"}],"name":"adminRemoveRole","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":"value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"},{"name":"roleName","type":"string"}],"name":"adminAddRole","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"}],"name":"setCommons","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ROLE_ADMIN","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"success","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":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_recipient","type":"address"}],"name":"destroyAndSend","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"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":"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":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"addr","type":"address"},{"indexed":false,"name":"roleName","type":"string"}],"name":"RoleAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"addr","type":"address"},{"indexed":false,"name":"roleName","type":"string"}],"name":"RoleRemoved","type":"event"}]

60606040526000600160006101000a81548160ff02191690831515021790555034156200002b57600080fd5b62000080336040805190810160405280600581526020017f61646d696e0000000000000000000000000000000000000000000000000000008152506200011b64010000000002620022f2176401000000009004565b336001806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000115336040805190810160405280600581526020017f61646d696e0000000000000000000000000000000000000000000000000000008152506200011b64010000000002620022f2176401000000009004565b620002df565b620001aa826000836040518082805190602001908083835b6020831015156200015a578051825260208201915060208101905060208303925062000133565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206200028164010000000002620024a1179091906401000000009004565b7fbfec83d64eaa953f2708271a023ab9ee82057f8f3578d548c1a4ba0b5b7004898282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b838110156200024157808201518184015260208101905062000224565b50505050905090810190601f1680156200026f5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b61253f80620002ef6000396000f30060606040526004361061013e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde0314610143578063095ea7b3146101d15780630988ca8c1461022b57806318160ddd146102a7578063217fe6c6146102d057806323b872dd14610364578063313ce567146103dd5780633f4ba83a1461040c5780635c975abb14610421578063661884631461044e57806370a08231146104a857806383197ef0146104f55780638456cb591461050a57806388cee87e1461051f5780638da5cb5b1461059b57806395d89b41146105f0578063a9059cbb1461067e578063b25fa92c146106d8578063d23ad39d14610754578063d391014b1461078d578063d73dd6231461081b578063dd62ed3e14610875578063f2fde38b146108e1578063f5074f411461091a575b600080fd5b341561014e57600080fd5b610156610953565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561019657808201518184015260208101905061017b565b50505050905090810190601f1680156101c35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101dc57600080fd5b610211600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061098c565b604051808215151515815260200191505060405180910390f35b341561023657600080fd5b6102a5600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610bd5565b005b34156102b257600080fd5b6102ba610c56565b6040518082815260200191505060405180910390f35b34156102db57600080fd5b61034a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610db3565b604051808215151515815260200191505060405180910390f35b341561036f57600080fd5b6103c3600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610e3a565b604051808215151515815260200191505060405180910390f35b34156103e857600080fd5b6103f06110b8565b604051808260ff1660ff16815260200191505060405180910390f35b341561041757600080fd5b61041f6110bd565b005b341561042c57600080fd5b610434611160565b604051808215151515815260200191505060405180910390f35b341561045957600080fd5b61048e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611173565b604051808215151515815260200191505060405180910390f35b34156104b357600080fd5b6104df600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506113d8565b6040518082815260200191505060405180910390f35b341561050057600080fd5b61050861156e565b005b341561051557600080fd5b61051d611603565b005b341561052a57600080fd5b610599600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506116a6565b005b34156105a657600080fd5b6105ae6116f3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105fb57600080fd5b610603611718565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610643578082015181840152602081019050610628565b50505050905090810190601f1680156106705780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561068957600080fd5b6106be600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611751565b604051808215151515815260200191505060405180910390f35b34156106e357600080fd5b610752600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611a11565b005b341561075f57600080fd5b61078b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a5e565b005b341561079857600080fd5b6107a0611afd565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156107e05780820151818401526020810190506107c5565b50505050905090810190601f16801561080d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561082657600080fd5b61085b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611b36565b604051808215151515815260200191505060405180910390f35b341561088057600080fd5b6108cb600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611d9b565b6040518082815260200191505060405180910390f35b34156108ec57600080fd5b610918600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611f66565b005b341561092557600080fd5b610951600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506120bb565b005b6040805190810160405280600b81526020017f464667616d6520436f696e00000000000000000000000000000000000000000081525081565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825260058152602001807f546f6b656e000000000000000000000000000000000000000000000000000000815250602001915050602060405180830381600087803b1515610a5057600080fd5b5af11515610a5d57600080fd5b5050506040518051905090508073ffffffffffffffffffffffffffffffffffffffff1663104e81ff3386866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1515610b3f57600080fd5b5af11515610b4c57600080fd5b5050506040518051905015610bc9578373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040518082815260200191505060405180910390a360019150610bce565b600091505b5092915050565b610c52826000836040518082805190602001908083835b602083101515610c115780518252602082019150602081019050602083039250610bec565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902061212f90919063ffffffff16565b5050565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825260058152602001807f546f6b656e000000000000000000000000000000000000000000000000000000815250602001915050602060405180830381600087803b1515610d1a57600080fd5b5af11515610d2757600080fd5b5050506040518051905090508073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610d9657600080fd5b5af11515610da357600080fd5b5050506040518051905091505090565b6000610e32836000846040518082805190602001908083835b602083101515610df15780518252602082019150602081019050602083039250610dcc565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902061214890919063ffffffff16565b905092915050565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825260058152602001807f546f6b656e000000000000000000000000000000000000000000000000000000815250602001915050602060405180830381600087803b1515610efe57600080fd5b5af11515610f0b57600080fd5b5050506040518051905090508073ffffffffffffffffffffffffffffffffffffffff1663851d1c27338787876040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b151561102157600080fd5b5af1151561102e57600080fd5b50505060405180519050156110ab578373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3600191506110b0565b600091505b509392505050565b601281565b6110fc336040805190810160405280600581526020017f61646d696e000000000000000000000000000000000000000000000000000000815250610bd5565b600160009054906101000a900460ff16151561111757600080fd5b6000600160006101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600160009054906101000a900460ff1681565b600080600160009054906101000a900460ff1615151561119257600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825260058152602001807f546f6b656e000000000000000000000000000000000000000000000000000000815250602001915050602060405180830381600087803b151561125357600080fd5b5af1151561126057600080fd5b5050506040518051905090508073ffffffffffffffffffffffffffffffffffffffff1663a03928973386866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b151561134257600080fd5b5af1151561134f57600080fd5b50505060405180519050156113cc578373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040518082815260200191505060405180910390a3600191506113d1565b600091505b5092915050565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825260058152602001807f546f6b656e000000000000000000000000000000000000000000000000000000815250602001915050602060405180830381600087803b151561149c57600080fd5b5af115156114a957600080fd5b5050506040518051905090508073ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b151561154f57600080fd5b5af1151561155c57600080fd5b50505060405180519050915050919050565b6001809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115c957600080fd5b6001809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b611642336040805190810160405280600581526020017f61646d696e000000000000000000000000000000000000000000000000000000815250610bd5565b600160009054906101000a900460ff1615151561165e57600080fd5b60018060006101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6116e5336040805190810160405280600581526020017f61646d696e000000000000000000000000000000000000000000000000000000815250610bd5565b6116ef82826121a1565b5050565b6001809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040805190810160405280600381526020017f464643000000000000000000000000000000000000000000000000000000000081525081565b600061175b6124ff565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825260058152602001807f546f6b656e000000000000000000000000000000000000000000000000000000815250602001915050602060405180830381600087803b151561181e57600080fd5b5af1151561182b57600080fd5b5050506040518051905090508073ffffffffffffffffffffffffffffffffffffffff166312a837b4338787866040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561192c578082015181840152602081019050611911565b50505050905090810190601f1680156119595780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b151561197a57600080fd5b5af1151561198757600080fd5b5050506040518051905015611a04578473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a360019250611a09565b600092505b505092915050565b611a50336040805190810160405280600581526020017f61646d696e000000000000000000000000000000000000000000000000000000815250610bd5565b611a5a82826122f2565b5050565b6001809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ab957600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040805190810160405280600581526020017f61646d696e00000000000000000000000000000000000000000000000000000081525081565b600080600160009054906101000a900460ff16151515611b5557600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825260058152602001807f546f6b656e000000000000000000000000000000000000000000000000000000815250602001915050602060405180830381600087803b1515611c1657600080fd5b5af11515611c2357600080fd5b5050506040518051905090508073ffffffffffffffffffffffffffffffffffffffff16638a6e0a8e3386866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1515611d0557600080fd5b5af11515611d1257600080fd5b5050506040518051905015611d8f578373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040518082815260200191505060405180910390a360019150611d94565b600091505b5092915050565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825260058152602001807f546f6b656e000000000000000000000000000000000000000000000000000000815250602001915050602060405180830381600087803b1515611e5f57600080fd5b5af11515611e6c57600080fd5b5050506040518051905090508073ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e85856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515611f4657600080fd5b5af11515611f5357600080fd5b5050506040518051905091505092915050565b6001809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fc157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611ffd57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166001809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806001806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6001809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561211657600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16ff5b6121398282612148565b151561214457600080fd5b5050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61221e826000836040518082805190602001908083835b6020831015156121dd57805182526020820191506020810190506020830392506121b8565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902061244390919063ffffffff16565b7fd211483f91fc6eff862467f8de606587a30c8fc9981056f051b897a418df803a8282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b838110156122b3578082015181840152602081019050612298565b50505050905090810190601f1680156122e05780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b61236f826000836040518082805190602001908083835b60208310151561232e5780518252602082019150602081019050602083039250612309565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206124a190919063ffffffff16565b7fbfec83d64eaa953f2708271a023ab9ee82057f8f3578d548c1a4ba0b5b7004898282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b838110156124045780820151818401526020810190506123e9565b50505050905090810190601f1680156124315780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6020604051908101604052806000815250905600a165627a7a7230582079aa5201125b5861ab37b34dc129345840c94ae224b98313416024ad2d5fa1720029

Deployed Bytecode

0x60606040526004361061013e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde0314610143578063095ea7b3146101d15780630988ca8c1461022b57806318160ddd146102a7578063217fe6c6146102d057806323b872dd14610364578063313ce567146103dd5780633f4ba83a1461040c5780635c975abb14610421578063661884631461044e57806370a08231146104a857806383197ef0146104f55780638456cb591461050a57806388cee87e1461051f5780638da5cb5b1461059b57806395d89b41146105f0578063a9059cbb1461067e578063b25fa92c146106d8578063d23ad39d14610754578063d391014b1461078d578063d73dd6231461081b578063dd62ed3e14610875578063f2fde38b146108e1578063f5074f411461091a575b600080fd5b341561014e57600080fd5b610156610953565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561019657808201518184015260208101905061017b565b50505050905090810190601f1680156101c35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101dc57600080fd5b610211600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061098c565b604051808215151515815260200191505060405180910390f35b341561023657600080fd5b6102a5600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610bd5565b005b34156102b257600080fd5b6102ba610c56565b6040518082815260200191505060405180910390f35b34156102db57600080fd5b61034a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610db3565b604051808215151515815260200191505060405180910390f35b341561036f57600080fd5b6103c3600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610e3a565b604051808215151515815260200191505060405180910390f35b34156103e857600080fd5b6103f06110b8565b604051808260ff1660ff16815260200191505060405180910390f35b341561041757600080fd5b61041f6110bd565b005b341561042c57600080fd5b610434611160565b604051808215151515815260200191505060405180910390f35b341561045957600080fd5b61048e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611173565b604051808215151515815260200191505060405180910390f35b34156104b357600080fd5b6104df600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506113d8565b6040518082815260200191505060405180910390f35b341561050057600080fd5b61050861156e565b005b341561051557600080fd5b61051d611603565b005b341561052a57600080fd5b610599600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506116a6565b005b34156105a657600080fd5b6105ae6116f3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105fb57600080fd5b610603611718565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610643578082015181840152602081019050610628565b50505050905090810190601f1680156106705780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561068957600080fd5b6106be600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611751565b604051808215151515815260200191505060405180910390f35b34156106e357600080fd5b610752600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611a11565b005b341561075f57600080fd5b61078b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a5e565b005b341561079857600080fd5b6107a0611afd565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156107e05780820151818401526020810190506107c5565b50505050905090810190601f16801561080d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561082657600080fd5b61085b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611b36565b604051808215151515815260200191505060405180910390f35b341561088057600080fd5b6108cb600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611d9b565b6040518082815260200191505060405180910390f35b34156108ec57600080fd5b610918600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611f66565b005b341561092557600080fd5b610951600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506120bb565b005b6040805190810160405280600b81526020017f464667616d6520436f696e00000000000000000000000000000000000000000081525081565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825260058152602001807f546f6b656e000000000000000000000000000000000000000000000000000000815250602001915050602060405180830381600087803b1515610a5057600080fd5b5af11515610a5d57600080fd5b5050506040518051905090508073ffffffffffffffffffffffffffffffffffffffff1663104e81ff3386866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1515610b3f57600080fd5b5af11515610b4c57600080fd5b5050506040518051905015610bc9578373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040518082815260200191505060405180910390a360019150610bce565b600091505b5092915050565b610c52826000836040518082805190602001908083835b602083101515610c115780518252602082019150602081019050602083039250610bec565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902061212f90919063ffffffff16565b5050565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825260058152602001807f546f6b656e000000000000000000000000000000000000000000000000000000815250602001915050602060405180830381600087803b1515610d1a57600080fd5b5af11515610d2757600080fd5b5050506040518051905090508073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610d9657600080fd5b5af11515610da357600080fd5b5050506040518051905091505090565b6000610e32836000846040518082805190602001908083835b602083101515610df15780518252602082019150602081019050602083039250610dcc565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902061214890919063ffffffff16565b905092915050565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825260058152602001807f546f6b656e000000000000000000000000000000000000000000000000000000815250602001915050602060405180830381600087803b1515610efe57600080fd5b5af11515610f0b57600080fd5b5050506040518051905090508073ffffffffffffffffffffffffffffffffffffffff1663851d1c27338787876040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b151561102157600080fd5b5af1151561102e57600080fd5b50505060405180519050156110ab578373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3600191506110b0565b600091505b509392505050565b601281565b6110fc336040805190810160405280600581526020017f61646d696e000000000000000000000000000000000000000000000000000000815250610bd5565b600160009054906101000a900460ff16151561111757600080fd5b6000600160006101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600160009054906101000a900460ff1681565b600080600160009054906101000a900460ff1615151561119257600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825260058152602001807f546f6b656e000000000000000000000000000000000000000000000000000000815250602001915050602060405180830381600087803b151561125357600080fd5b5af1151561126057600080fd5b5050506040518051905090508073ffffffffffffffffffffffffffffffffffffffff1663a03928973386866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b151561134257600080fd5b5af1151561134f57600080fd5b50505060405180519050156113cc578373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040518082815260200191505060405180910390a3600191506113d1565b600091505b5092915050565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825260058152602001807f546f6b656e000000000000000000000000000000000000000000000000000000815250602001915050602060405180830381600087803b151561149c57600080fd5b5af115156114a957600080fd5b5050506040518051905090508073ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b151561154f57600080fd5b5af1151561155c57600080fd5b50505060405180519050915050919050565b6001809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115c957600080fd5b6001809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b611642336040805190810160405280600581526020017f61646d696e000000000000000000000000000000000000000000000000000000815250610bd5565b600160009054906101000a900460ff1615151561165e57600080fd5b60018060006101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6116e5336040805190810160405280600581526020017f61646d696e000000000000000000000000000000000000000000000000000000815250610bd5565b6116ef82826121a1565b5050565b6001809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040805190810160405280600381526020017f464643000000000000000000000000000000000000000000000000000000000081525081565b600061175b6124ff565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825260058152602001807f546f6b656e000000000000000000000000000000000000000000000000000000815250602001915050602060405180830381600087803b151561181e57600080fd5b5af1151561182b57600080fd5b5050506040518051905090508073ffffffffffffffffffffffffffffffffffffffff166312a837b4338787866040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561192c578082015181840152602081019050611911565b50505050905090810190601f1680156119595780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b151561197a57600080fd5b5af1151561198757600080fd5b5050506040518051905015611a04578473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a360019250611a09565b600092505b505092915050565b611a50336040805190810160405280600581526020017f61646d696e000000000000000000000000000000000000000000000000000000815250610bd5565b611a5a82826122f2565b5050565b6001809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ab957600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040805190810160405280600581526020017f61646d696e00000000000000000000000000000000000000000000000000000081525081565b600080600160009054906101000a900460ff16151515611b5557600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825260058152602001807f546f6b656e000000000000000000000000000000000000000000000000000000815250602001915050602060405180830381600087803b1515611c1657600080fd5b5af11515611c2357600080fd5b5050506040518051905090508073ffffffffffffffffffffffffffffffffffffffff16638a6e0a8e3386866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1515611d0557600080fd5b5af11515611d1257600080fd5b5050506040518051905015611d8f578373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040518082815260200191505060405180910390a360019150611d94565b600091505b5092915050565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825260058152602001807f546f6b656e000000000000000000000000000000000000000000000000000000815250602001915050602060405180830381600087803b1515611e5f57600080fd5b5af11515611e6c57600080fd5b5050506040518051905090508073ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e85856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515611f4657600080fd5b5af11515611f5357600080fd5b5050506040518051905091505092915050565b6001809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fc157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611ffd57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166001809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806001806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6001809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561211657600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16ff5b6121398282612148565b151561214457600080fd5b5050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61221e826000836040518082805190602001908083835b6020831015156121dd57805182526020820191506020810190506020830392506121b8565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902061244390919063ffffffff16565b7fd211483f91fc6eff862467f8de606587a30c8fc9981056f051b897a418df803a8282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b838110156122b3578082015181840152602081019050612298565b50505050905090810190601f1680156122e05780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b61236f826000836040518082805190602001908083835b60208310151561232e5780518252602082019150602081019050602083039250612309565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206124a190919063ffffffff16565b7fbfec83d64eaa953f2708271a023ab9ee82057f8f3578d548c1a4ba0b5b7004898282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b838110156124045780820151818401526020810190506123e9565b50505050905090810190601f1680156124315780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6020604051908101604052806000815250905600a165627a7a7230582079aa5201125b5861ab37b34dc129345840c94ae224b98313416024ad2d5fa1720029

Swarm Source

bzzr://79aa5201125b5861ab37b34dc129345840c94ae224b98313416024ad2d5fa172
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.