ETH Price: $3,365.50 (-0.05%)

Contract

0xcA28d2E8E77AA06e8846D9D4E3F5e34C32397c78
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer120591792021-03-17 23:31:071346 days ago1616023867IN
0xcA28d2E8...C32397c78
0 ETH00
Transfer120591672021-03-17 23:28:401346 days ago1616023720IN
0xcA28d2E8...C32397c78
0 ETH00
Transfer68337842018-12-06 1:12:582179 days ago1544058778IN
0xcA28d2E8...C32397c78
0 ETH0.000450712.5
Transfer68337832018-12-06 1:12:032179 days ago1544058723IN
0xcA28d2E8...C32397c78
0 ETH0.001678215
Transfer68108392018-12-02 6:07:302183 days ago1543730850IN
0xcA28d2E8...C32397c78
0 ETH0.002142417.4
Transfer68107892018-12-02 5:58:232183 days ago1543730303IN
0xcA28d2E8...C32397c78
0 ETH0.0043436815
Transfer67997842018-11-30 10:20:522184 days ago1543573252IN
0xcA28d2E8...C32397c78
0 ETH0.0086835330
Transfer65437522018-10-19 11:08:152226 days ago1539947295IN
0xcA28d2E8...C32397c78
0 ETH0.003503627.5
Transfer65437322018-10-19 11:04:452226 days ago1539947085IN
0xcA28d2E8...C32397c78
0 ETH0.00373728
Transfer65312572018-10-17 10:07:102228 days ago1539770830IN
0xcA28d2E8...C32397c78
0 ETH0.0015988412.60120525
Transfer65124652018-10-14 8:29:072232 days ago1539505747IN
0xcA28d2E8...C32397c78
0 ETH0.000579152
Transfer65123962018-10-14 8:08:572232 days ago1539504537IN
0xcA28d2E8...C32397c78
0 ETH0.000579032
Transfer64515482018-10-04 11:27:442241 days ago1538652464IN
0xcA28d2E8...C32397c78
0 ETH0.001401453
Transfer64515372018-10-04 11:24:582241 days ago1538652298IN
0xcA28d2E8...C32397c78
0 ETH0.001075992.303
Transfer64425702018-10-03 0:05:402243 days ago1538525140IN
0xcA28d2E8...C32397c78
0 ETH0.001447575
Transfer63884962018-09-24 3:36:042252 days ago1537760164IN
0xcA28d2E8...C32397c78
0 ETH0.002102464.5
Transfer63710932018-09-21 6:50:362255 days ago1537512636IN
0xcA28d2E8...C32397c78
0 ETH0.001781416.15174729
Transfer63164152018-09-12 5:58:392264 days ago1536731919IN
0xcA28d2E8...C32397c78
0 ETH0.005790320
Transfer63093012018-09-11 1:28:532265 days ago1536629333IN
0xcA28d2E8...C32397c78
0 ETH0.000975813.3705001
Transfer63092802018-09-11 1:23:352265 days ago1536629015IN
0xcA28d2E8...C32397c78
0 ETH0.001461974.8
Transfer62859312018-09-07 3:14:512269 days ago1536290091IN
0xcA28d2E8...C32397c78
0 ETH0.001239624.28125
Transfer62851012018-09-06 23:43:152269 days ago1536277395IN
0xcA28d2E8...C32397c78
0 ETH0.001447575
Transfer62760302018-09-05 11:35:412270 days ago1536147341IN
0xcA28d2E8...C32397c78
0 ETH0.001071443.7
Transfer62739812018-09-05 3:15:192271 days ago1536117319IN
0xcA28d2E8...C32397c78
0 ETH0.000178413
Transfer62737022018-09-05 2:06:022271 days ago1536113162IN
0xcA28d2E8...C32397c78
0 ETH0.000636932.2
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

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

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.