Contract 0x5d00d312e171be5342067c09bae883f9bcb2003b

 

TxHash Block Age From To Value [TxFee]
0xcaac49f01c98adbf3f2e0030a757f1e00cfe86991f82aca0034b41406d532570(pending)2 hrs 18 mins ago0x1efd4d17af18089ac0b257c2e13769e6c621a081  IN  0x5d00d312e171be5342067c09bae883f9bcb2003b0 Ether(Pending)
0xff74bd579786c9217a141327448771417caafc2d0d4fb8557c0ef12828b27086(pending)2 hrs 23 mins ago0x1efd4d17af18089ac0b257c2e13769e6c621a081  IN  0x5d00d312e171be5342067c09bae883f9bcb2003b0 Ether(Pending)
0x381843946bbe48b39222f9bea934ef0ab4dfa83e595e0c77e4cccb563a19b382(pending)22 hrs 47 mins ago0x016f8fe2deb26020234f03a0378f45db588e45f9  IN  0x5d00d312e171be5342067c09bae883f9bcb2003b0 Ether(Pending)
0xdf94a814346a061c832ae74722eb6722387156043a42a27aaf743fab495cee16722565713 mins ago0x838c14eb3eabe4cb6a696d286c7b2a466629d0ee  IN   Etheremon_MonsterToken0 Ether0.000540555
0xaaa150bb1335928b12c176d0196c9483cd93ec820d3d7353e2662c63ab20699f722564119 mins ago0xd7f75e95925e0d2662a87c9b0cd68360c922e975  IN   Etheremon_MonsterToken0 Ether0.000370872
0xd1309b67bc40f6615a353a544e9d3b5dad85a53d3fdf8291be4091dc345ba0ba722557145 mins ago0x1e7f320cf5a938465d501f6bd6c405feb3a70f6c  IN   Etheremon_MonsterToken0 Ether0.00041054
0xa376db7d8dc37cb6eaec38e1500d8a44d9d7896117ed084136ccfa6578ffaad9722555350 mins ago0x2e0ce20ab9c3227c48db076a95ccd1ed13ae3a15  IN   Etheremon_MonsterToken0 Ether0.000285981
0x1321fd47681914227e6021ca45881763d3242c93beccda580af28b94b0d15ac3722555250 mins ago0x2e0ce20ab9c3227c48db076a95ccd1ed13ae3a15  IN   Etheremon_MonsterToken0 Ether0.000141228
0x3fb0449ec1d87c5fb5e5b4ca1e55e78e2dadd6775c087698ce599f55a0d4aaa5722555051 mins ago0x2e0ce20ab9c3227c48db076a95ccd1ed13ae3a15  IN   Etheremon_MonsterToken0 Ether0.0002911
0x1e10f20417fb4c8ffe70d9bbeac12ce3ab8c936cb89055ada1974a1ed73bf1cf72254891 hr 13 mins ago0xf5aee6d7b838d5ede8aa65d31dbc11116545180c  IN   Etheremon_MonsterToken0 Ether0.00041054
0xdd336f1f579955961fb9aecf97ffe7ffd7c6d0b443ea8163485dbc4fcf69de7472254581 hr 23 mins ago0x2e0ce20ab9c3227c48db076a95ccd1ed13ae3a15  IN   Etheremon_MonsterToken0 Ether0.00031344
0x816c13332dc5343e3c00a32958bafbf141c5cf4d3496370bd95414f1c24a931972254441 hr 27 mins ago0x2e0ce20ab9c3227c48db076a95ccd1ed13ae3a15  IN   Etheremon_MonsterToken0 Ether0.00030264
0x07fcef307a15ff762ef33dc03b12c6b518e9726b08016728284e25df56090e9572254361 hr 30 mins ago0x463215edb66fb6a8f0c979e739a731977617699f  IN   Etheremon_MonsterToken0 Ether0.000540555
0x1bc84a62a7710f3314b6e208b52457470e86c950c3f40d307477225251b33a2272254141 hr 37 mins ago0x2e0ce20ab9c3227c48db076a95ccd1ed13ae3a15  IN   Etheremon_MonsterToken0 Ether0.00035676
0x7713e1208fcfe3b4fb9d97782907df3a400c5cadedb35f1b2a5b75d42ee66f9572253891 hr 44 mins ago0x8acc1421ec98689461ff5777de8ad6648dc6d643  IN   Etheremon_MonsterToken0 Ether0.00040599
0xfb392c8fa321f2248c1bcd2bb2e8f13d6f30f4c765c92a199a2c1c292a59a67172253731 hr 52 mins ago0x6426942ee4d1602891ba4aba2be680dd8587f694  IN   Etheremon_MonsterToken0 Ether0.000179745
0xb9c8fc921d54f4e9ab14ef06fa24d119d2890f872e2b293f10db66733653380d72253252 hrs 9 mins ago0x6e13c7e25c2cda6f5c8c4e431bee480bfb312c28  IN   Etheremon_MonsterToken0 Ether0.00040599
0x4ea589cb9e37c6d9e9b56a638abebba28c5dc05667d94a3d7bf55372d3fec65872252622 hrs 32 mins ago0xc533bd4993d9f3a19df9010e9a6b15cf7ee374b7  IN   Etheremon_MonsterToken0 Ether0.00065478
0x54ad1fb5603fa4610888db4e575f7175ec0a36741551d8c2bc87d976619dab4d72252362 hrs 39 mins ago0x01cb2497b6cf5fa69b261aa263d991baa14475f6  IN   Etheremon_MonsterToken0 Ether0.00060447
0xa945dbc1706eba381a2bbad2e0531be7c217d28a8a5c87200cd3266e8b389b8572252352 hrs 39 mins ago0xa37e6b46fa8e1a6f1ddbf035c4e0230b8414ff04  IN   Etheremon_MonsterToken0 Ether0.00040599
0x17b8c83eaf96c804de9fff135386bd98d800adf526552433c423793363f3021f72252202 hrs 46 mins ago0x2fef65e4d69a38bf0dd074079f367cdf176ec0de  IN   Etheremon_MonsterToken0 Ether0.0006072
0x365f1bdf3af71d81c150a9e2656b8d44b32f864dcd57fb0bef861c47dab757c972252202 hrs 46 mins ago0x01cb2497b6cf5fa69b261aa263d991baa14475f6  IN   Etheremon_MonsterToken0 Ether0.0006072
0xe16386a6427283c7e46a2c23002d96dfd8fec77769b00d66ce8af06eec1a41ca72252172 hrs 47 mins ago0x01cb2497b6cf5fa69b261aa263d991baa14475f6  IN   Etheremon_MonsterToken0 Ether0.000285981
0x03a7954bbddb595045393b576a7031c2188b8f249bcd13e07a060024e5b1f68172252152 hrs 49 mins ago0x01cb2497b6cf5fa69b261aa263d991baa14475f6  IN   Etheremon_MonsterToken0 Ether0.00036672
0x56cc00812efadae3eadcab060e4db00e3909c6f7dff64a931a20dfd8ad4e374472251703 hrs 2 mins ago0xc533bd4993d9f3a19df9010e9a6b15cf7ee374b7  IN   Etheremon_MonsterToken0 Ether0.000307521
[ Download CSV Export 

Internal Transactions as a result of Contract Execution

Parent TxHash Block Age From To Value
Warning: The compiled contract might be susceptible to ExpExponentCleanup (medium/high-severity), EventStructWrongData (very low-severity) Solidity Compiler Bugs.

Contract Source Code Verified (Exact Match)
Contract Name: EtheremonMonsterToken
Compiler Version: v0.4.24+commit.e67f0147
Optimization Enabled: Yes
Runs (Optimizer):  200


Contract Source Code
pragma solidity ^0.4.24;

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

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
    if (a == 0) {
      return 0;
    }
    c = a * b;
    assert(c / a == b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    // uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return a / b;
  }

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

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

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

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

}

interface ERC165 {
    function supportsInterface(bytes4 _interfaceID) external view returns (bool);
}

contract SupportsInterface is ERC165 {
    
    mapping(bytes4 => bool) internal supportedInterfaces;

    constructor() public {
        supportedInterfaces[0x01ffc9a7] = true; // ERC165
    }

    function supportsInterface(bytes4 _interfaceID) external view returns (bool) {
        return supportedInterfaces[_interfaceID];
    }
}

interface ERC721 {
    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
    event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
    
    function balanceOf(address _owner) external view returns (uint256);
    function ownerOf(uint256 _tokenId) external view returns (address);
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes _data) external;
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external;
    
    function transferFrom(address _from, address _to, uint256 _tokenId) external;
    function transfer(address _to, uint256 _tokenId) external;
    function approve(address _approved, uint256 _tokenId) external;
    function setApprovalForAll(address _operator, bool _approved) external;
    
    function getApproved(uint256 _tokenId) external view returns (address);
    function isApprovedForAll(address _owner, address _operator) external view returns (bool);
}

interface ERC721Enumerable {
    function totalSupply() external view returns (uint256);
    function tokenByIndex(uint256 _index) external view returns (uint256);
    function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256);
}

interface ERC721Metadata {
    function name() external view returns (string _name);
    function symbol() external view returns (string _symbol);
    function tokenURI(uint256 _tokenId) external view returns (string);
}

interface ERC721TokenReceiver {
  function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes _data) external returns(bytes4);
}

contract BasicAccessControl {
    address public owner;
    // address[] public moderators;
    uint16 public totalModerators = 0;
    mapping (address => bool) public moderators;
    bool public isMaintaining = false;

    constructor() public {
        owner = msg.sender;
    }

    modifier onlyOwner {
        require(msg.sender == owner);
        _;
    }

    modifier onlyModerators() {
        require(msg.sender == owner || moderators[msg.sender] == true);
        _;
    }

    modifier isActive {
        require(!isMaintaining);
        _;
    }

    function ChangeOwner(address _newOwner) onlyOwner public {
        if (_newOwner != address(0)) {
            owner = _newOwner;
        }
    }


    function AddModerator(address _newModerator) onlyOwner public {
        if (moderators[_newModerator] == false) {
            moderators[_newModerator] = true;
            totalModerators += 1;
        }
    }
    
    function RemoveModerator(address _oldModerator) onlyOwner public {
        if (moderators[_oldModerator] == true) {
            moderators[_oldModerator] = false;
            totalModerators -= 1;
        }
    }

    function UpdateMaintaining(bool _isMaintaining) onlyOwner public {
        isMaintaining = _isMaintaining;
    }
}

contract EtheremonEnum {

    enum ResultCode {
        SUCCESS,
        ERROR_CLASS_NOT_FOUND,
        ERROR_LOW_BALANCE,
        ERROR_SEND_FAIL,
        ERROR_NOT_TRAINER,
        ERROR_NOT_ENOUGH_MONEY,
        ERROR_INVALID_AMOUNT
    }
    
    enum ArrayType {
        CLASS_TYPE,
        STAT_STEP,
        STAT_START,
        STAT_BASE,
        OBJ_SKILL
    }
    
    enum PropertyType {
        ANCESTOR,
        XFACTOR
    }
}

contract EtheremonDataBase {
    
    uint64 public totalMonster;
    uint32 public totalClass;
    
    // write
    function withdrawEther(address _sendTo, uint _amount) external returns(EtheremonEnum.ResultCode);
    function addElementToArrayType(EtheremonEnum.ArrayType _type, uint64 _id, uint8 _value) external returns(uint);
    function updateIndexOfArrayType(EtheremonEnum.ArrayType _type, uint64 _id, uint _index, uint8 _value) external returns(uint);
    function setMonsterClass(uint32 _classId, uint256 _price, uint256 _returnPrice, bool _catchable) external returns(uint32);
    function addMonsterObj(uint32 _classId, address _trainer, string _name) external returns(uint64);
    function setMonsterObj(uint64 _objId, string _name, uint32 _exp, uint32 _createIndex, uint32 _lastClaimIndex) external;
    function increaseMonsterExp(uint64 _objId, uint32 amount) external;
    function decreaseMonsterExp(uint64 _objId, uint32 amount) external;
    function removeMonsterIdMapping(address _trainer, uint64 _monsterId) external;
    function addMonsterIdMapping(address _trainer, uint64 _monsterId) external;
    function clearMonsterReturnBalance(uint64 _monsterId) external returns(uint256 amount);
    function collectAllReturnBalance(address _trainer) external returns(uint256 amount);
    function transferMonster(address _from, address _to, uint64 _monsterId) external returns(EtheremonEnum.ResultCode);
    function addExtraBalance(address _trainer, uint256 _amount) external returns(uint256);
    function deductExtraBalance(address _trainer, uint256 _amount) external returns(uint256);
    function setExtraBalance(address _trainer, uint256 _amount) external;
    
    // read
    function getSizeArrayType(EtheremonEnum.ArrayType _type, uint64 _id) constant external returns(uint);
    function getElementInArrayType(EtheremonEnum.ArrayType _type, uint64 _id, uint _index) constant external returns(uint8);
    function getMonsterClass(uint32 _classId) constant external returns(uint32 classId, uint256 price, uint256 returnPrice, uint32 total, bool catchable);
    function getMonsterObj(uint64 _objId) constant external returns(uint64 objId, uint32 classId, address trainer, uint32 exp, uint32 createIndex, uint32 lastClaimIndex, uint createTime);
    function getMonsterName(uint64 _objId) constant external returns(string name);
    function getExtraBalance(address _trainer) constant external returns(uint256);
    function getMonsterDexSize(address _trainer) constant external returns(uint);
    function getMonsterObjId(address _trainer, uint index) constant external returns(uint64);
    function getExpectedBalance(address _trainer) constant external returns(uint256);
    function getMonsterReturn(uint64 _objId) constant external returns(uint256 current, uint256 total);
}

interface EtheremonBattle {
    function isOnBattle(uint64 _objId) constant external returns(bool);
}

interface EtheremonTradeInterface {
    function isOnTrading(uint64 _objId) constant external returns(bool);
}


contract EtheremonMonsterTokenBasic is ERC721, SupportsInterface, BasicAccessControl {

    using SafeMath for uint256;
    using AddressUtils for address;
    
    struct MonsterClassAcc {
        uint32 classId;
        uint256 price;
        uint256 returnPrice;
        uint32 total;
        bool catchable;
    }

    struct MonsterObjAcc {
        uint64 monsterId;
        uint32 classId;
        address trainer;
        string name;
        uint32 exp;
        uint32 createIndex;
        uint32 lastClaimIndex;
        uint createTime;
    }

    // data contract
    address public dataContract;
    address public battleContract;
    address public tradeContract;
    
    // Mapping from NFT ID to approved address.
    mapping (uint256 => address) internal idToApprovals;
    
    // Mapping from owner address to mapping of operator addresses.
    mapping (address => mapping (address => bool)) internal ownerToOperators;
    
    /**
    * @dev Magic value of a smart contract that can recieve NFT.
    * Equal to: bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")).
    */
    bytes4 constant MAGIC_ON_ERC721_RECEIVED = 0x150b7a02;

    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
    event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
    
    // internal function
    function _canOperate(address _tokenOwner) constant internal {
        require(_tokenOwner == msg.sender || ownerToOperators[_tokenOwner][msg.sender]);
    }
    
    function _canTransfer(uint256 _tokenId, address _tokenOwner) constant internal {
        EtheremonBattle battle = EtheremonBattle(battleContract);
        EtheremonTradeInterface trade = EtheremonTradeInterface(tradeContract);
        require(!battle.isOnBattle(uint64(_tokenId)) && !trade.isOnTrading(uint64(_tokenId)));
        require(_tokenOwner != address(0));
        require(_tokenOwner == msg.sender || idToApprovals[_tokenId] == msg.sender || ownerToOperators[_tokenOwner][msg.sender]);
    }
    
    function setOperationContracts(address _dataContract, address _battleContract, address _tradeContract) onlyModerators external {
        dataContract = _dataContract;
        battleContract = _battleContract;
        tradeContract = _tradeContract;
    }
    
    // public function

    constructor() public {
        supportedInterfaces[0x80ac58cd] = true; // ERC721
    }

    function isApprovable(address _owner, uint256 _tokenId) public constant returns(bool) {
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        MonsterObjAcc memory obj;
        (obj.monsterId, obj.classId, obj.trainer, obj.exp, obj.createIndex, obj.lastClaimIndex, obj.createTime) = data.getMonsterObj(uint64(_tokenId));
        if (obj.monsterId != uint64(_tokenId))
            return false;
        if (obj.trainer != _owner)
            return false;
        // check battle & trade contract 
        EtheremonBattle battle = EtheremonBattle(battleContract);
        EtheremonTradeInterface trade = EtheremonTradeInterface(tradeContract);
        return (!battle.isOnBattle(obj.monsterId) && !trade.isOnTrading(obj.monsterId));
    }

    function balanceOf(address _owner) external view returns (uint256) {
        require(_owner != address(0));
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        return data.getMonsterDexSize(_owner);
    }

    function ownerOf(uint256 _tokenId) external view returns (address _owner) {
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        MonsterObjAcc memory obj;
        (obj.monsterId, obj.classId, _owner, obj.exp, obj.createIndex, obj.lastClaimIndex, obj.createTime) = data.getMonsterObj(uint64(_tokenId));
        require(_owner != address(0));
    }


    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes _data) external {
        _safeTransferFrom(_from, _to, _tokenId, _data);
    }

    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external {
        _safeTransferFrom(_from, _to, _tokenId, "");
    }

    function transferFrom(address _from, address _to, uint256 _tokenId) external {
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        MonsterObjAcc memory obj;
        (obj.monsterId, obj.classId, obj.trainer, obj.exp, obj.createIndex, obj.lastClaimIndex, obj.createTime) = data.getMonsterObj(uint64(_tokenId));
        require(obj.trainer != address(0));
        _canTransfer(_tokenId, obj.trainer);
        
        require(obj.trainer == _from);
        require(_to != address(0));
        _transfer(obj.trainer, _to, _tokenId);
    }

    function transfer(address _to, uint256 _tokenId) external {
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        MonsterObjAcc memory obj;
        (obj.monsterId, obj.classId, obj.trainer, obj.exp, obj.createIndex, obj.lastClaimIndex, obj.createTime) = data.getMonsterObj(uint64(_tokenId));
        require(obj.trainer != address(0));
        _canTransfer(_tokenId, obj.trainer);
        
        require(obj.trainer == msg.sender);
        require(_to != address(0));
        _transfer(obj.trainer, _to, _tokenId);
    }

    function approve(address _approved, uint256 _tokenId) external {
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        MonsterObjAcc memory obj;
        (obj.monsterId, obj.classId, obj.trainer, obj.exp, obj.createIndex, obj.lastClaimIndex, obj.createTime) = data.getMonsterObj(uint64(_tokenId));
        require(obj.trainer != address(0));
        _canOperate(obj.trainer);
        EtheremonBattle battle = EtheremonBattle(battleContract);
        EtheremonTradeInterface trade = EtheremonTradeInterface(tradeContract);
        if(battle.isOnBattle(obj.monsterId) || trade.isOnTrading(obj.monsterId))
            revert();
        
        require(_approved != obj.trainer);

        idToApprovals[_tokenId] = _approved;
        emit Approval(obj.trainer, _approved, _tokenId);
    }

    function setApprovalForAll(address _operator, bool _approved) external {
        require(_operator != address(0));
        ownerToOperators[msg.sender][_operator] = _approved;
        emit ApprovalForAll(msg.sender, _operator, _approved);
    }

    function getApproved(uint256 _tokenId) public view returns (address) {
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        MonsterObjAcc memory obj;
        (obj.monsterId, obj.classId, obj.trainer, obj.exp, obj.createIndex, obj.lastClaimIndex, obj.createTime) = data.getMonsterObj(uint64(_tokenId));
        require(obj.trainer != address(0));
        return idToApprovals[_tokenId];
    }

    function isApprovedForAll(address _owner, address _operator) external view returns (bool) {
        require(_owner != address(0));
        require(_operator != address(0));
        return ownerToOperators[_owner][_operator];
    }

    function _safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes _data) internal {
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        MonsterObjAcc memory obj;
        (obj.monsterId, obj.classId, obj.trainer, obj.exp, obj.createIndex, obj.lastClaimIndex, obj.createTime) = data.getMonsterObj(uint64(_tokenId));
        require(obj.trainer != address(0));
        _canTransfer(_tokenId, obj.trainer);
        
        require(obj.trainer == _from);
        require(_to != address(0));

        _transfer(obj.trainer, _to, _tokenId);

        if (_to.isContract()) {
            bytes4 retval = ERC721TokenReceiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data);
            require(retval == MAGIC_ON_ERC721_RECEIVED);
        }
    }

    function _transfer(address _from, address _to, uint256 _tokenId) private {
        _clearApproval(_tokenId);
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        data.removeMonsterIdMapping(_from, uint64(_tokenId));
        data.addMonsterIdMapping(_to, uint64(_tokenId));
        emit Transfer(_from, _to, _tokenId);
    }


    function _burn(uint256 _tokenId) internal { 
        _clearApproval(_tokenId);
        
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        MonsterObjAcc memory obj;
        (obj.monsterId, obj.classId, obj.trainer, obj.exp, obj.createIndex, obj.lastClaimIndex, obj.createTime) = data.getMonsterObj(uint64(_tokenId));
        require(obj.trainer != address(0));
        
        EtheremonBattle battle = EtheremonBattle(battleContract);
        EtheremonTradeInterface trade = EtheremonTradeInterface(tradeContract);
        if(battle.isOnBattle(obj.monsterId) || trade.isOnTrading(obj.monsterId))
            revert();
        
        data.removeMonsterIdMapping(obj.trainer, uint64(_tokenId));
        
        emit Transfer(obj.trainer, address(0), _tokenId);
    }

    function _clearApproval(uint256 _tokenId) internal {
        if(idToApprovals[_tokenId] != 0) {
            delete idToApprovals[_tokenId];
        }
    }

}


contract EtheremonMonsterEnumerable is EtheremonMonsterTokenBasic, ERC721Enumerable {

    constructor() public {
        supportedInterfaces[0x780e9d63] = true; // ERC721Enumerable
    }

    function totalSupply() external view returns (uint256) {
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        return data.totalMonster();
    }

    function tokenByIndex(uint256 _index) external view returns (uint256) {
        return _index;
    }

    function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256) {
        require(_owner != address(0));
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        return data.getMonsterObjId(_owner, _index);
    }

}


contract EtheremonMonsterStandard is EtheremonMonsterEnumerable, ERC721Metadata {
    string internal nftName;
    string internal nftSymbol;
    
    mapping (uint256 => string) internal idToUri;
    
    constructor(string _name, string _symbol) public {
        nftName = _name;
        nftSymbol = _symbol;
        supportedInterfaces[0x5b5e139f] = true; // ERC721Metadata
    }
    
    function _burn(uint256 _tokenId) internal {
        super._burn(_tokenId);
        if (bytes(idToUri[_tokenId]).length != 0) {
            delete idToUri[_tokenId];
        }
    }
    
    function _setTokenUri(uint256 _tokenId, string _uri) internal {
        idToUri[_tokenId] = _uri;
    }
    
    function name() external view returns (string _name) {
        _name = nftName;
    }
    
    function symbol() external view returns (string _symbol) {
        _symbol = nftSymbol;
    }
    
    function tokenURI(uint256 _tokenId) external view returns (string) {
        return idToUri[_tokenId];
    }
}

contract EtheremonMonsterToken is EtheremonMonsterStandard("EtheremonMonster", "EMONA") {
    uint8 constant public STAT_COUNT = 6;
    uint8 constant public STAT_MAX = 32;

    uint seed = 0;
    
    mapping(uint8 => uint32) public levelExps;
    mapping(uint32 => bool) classWhitelist;
    mapping(address => bool) addressWhitelist;
    
    uint public gapFactor = 0.001 ether;
    uint16 public priceIncreasingRatio = 1000;
    
    function setPriceIncreasingRatio(uint16 _ratio) onlyModerators external {
        priceIncreasingRatio = _ratio;
    }
    
    function setFactor(uint _gapFactor) onlyModerators public {
        gapFactor = _gapFactor;
    }
    
    function genLevelExp() onlyModerators external {
        uint8 level = 1;
        uint32 requirement = 100;
        uint32 sum = requirement;
        while(level <= 100) {
            levelExps[level] = sum;
            level += 1;
            requirement = (requirement * 11) / 10 + 5;
            sum += requirement;
        }
    }
    
    function setClassWhitelist(uint32 _classId, bool _status) onlyModerators external {
        classWhitelist[_classId] = _status;
    }

    function setAddressWhitelist(address _smartcontract, bool _status) onlyModerators external {
        addressWhitelist[_smartcontract] = _status;
    }

    function setTokenURI(uint256 _tokenId, string _uri) onlyModerators external {
        _setTokenUri(_tokenId, _uri);
    }
    
    function withdrawEther(address _sendTo, uint _amount) onlyOwner public {
        if (_amount > address(this).balance) {
            revert();
        }
        _sendTo.transfer(_amount);
    }
    
    function mintMonster(uint32 _classId, address _trainer, string _name) onlyModerators external returns(uint){
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        // add monster
        uint64 objId = data.addMonsterObj(_classId, _trainer, _name);
        uint8 value;
        seed = getRandom(_trainer, block.number-1, seed, objId);
        // generate base stat for the previous one
        for (uint i=0; i < STAT_COUNT; i+= 1) {
            value = uint8(seed % STAT_MAX) + data.getElementInArrayType(EtheremonEnum.ArrayType.STAT_START, uint64(_classId), i);
            data.addElementToArrayType(EtheremonEnum.ArrayType.STAT_BASE, objId, value);
        }
        emit Transfer(address(0), _trainer, objId);
        return objId;
    }
    
    function burnMonster(uint64 _tokenId) onlyModerators external {
        _burn(_tokenId);
    }
    
    function clearApproval(uint _tokenId) onlyModerators external {
        _clearApproval(_tokenId);
    }
    
    function triggerTransferEvent(address _from, address _to, uint _tokenId) onlyModerators external {
        _clearApproval(_tokenId);
        emit Transfer(_from, _to, _tokenId);
    }
    
    // public api 
    function getRandom(address _player, uint _block, uint _seed, uint _count) view public returns(uint) {
        return uint(keccak256(abi.encodePacked(blockhash(_block), _player, _seed, _count)));
    }
    
    function getLevel(uint32 exp) view public returns (uint8) {
        uint8 minIndex = 1;
        uint8 maxIndex = 100;
        uint8 currentIndex;
     
        while (minIndex < maxIndex) {
            currentIndex = (minIndex + maxIndex) / 2;
            if (exp < levelExps[currentIndex])
                maxIndex = currentIndex;
            else
                minIndex = currentIndex + 1;
        }

        return minIndex;
    }
    
    function getMonsterBaseStats(uint64 _monsterId) constant external returns(uint hp, uint pa, uint pd, uint sa, uint sd, uint speed) {
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        uint[6] memory stats;
        for(uint i=0; i < STAT_COUNT; i+=1) {
            stats[i] = data.getElementInArrayType(EtheremonEnum.ArrayType.STAT_BASE, _monsterId, i);
        }
        return (stats[0], stats[1], stats[2], stats[3], stats[4], stats[5]);
    }
    
    function getMonsterCurrentStats(uint64 _monsterId) constant external returns(uint exp, uint level, uint hp, uint pa, uint pd, uint sa, uint sd, uint speed) {
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        MonsterObjAcc memory obj;
        (obj.monsterId, obj.classId, obj.trainer, obj.exp, obj.createIndex, obj.lastClaimIndex, obj.createTime) = data.getMonsterObj(_monsterId);
        
        uint[6] memory stats;
        uint i = 0;
        level = getLevel(obj.exp);
        for(i=0; i < STAT_COUNT; i+=1) {
            stats[i] = data.getElementInArrayType(EtheremonEnum.ArrayType.STAT_BASE, _monsterId, i);
        }
        for(i=0; i < STAT_COUNT; i++) {
            stats[i] += uint(data.getElementInArrayType(EtheremonEnum.ArrayType.STAT_STEP, obj.classId, i)) * level * 3;
        }
        
        return (obj.exp, level, stats[0], stats[1], stats[2], stats[3], stats[4], stats[5]);
    }
    
    function getMonsterCP(uint64 _monsterId) constant external returns(uint cp) {
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        MonsterObjAcc memory obj;
        (obj.monsterId, obj.classId, obj.trainer, obj.exp, obj.createIndex, obj.lastClaimIndex, obj.createTime) = data.getMonsterObj(_monsterId);
        
        uint[6] memory stats;
        uint i = 0;
        cp = getLevel(obj.exp);
        for(i=0; i < STAT_COUNT; i+=1) {
            stats[i] = data.getElementInArrayType(EtheremonEnum.ArrayType.STAT_BASE, _monsterId, i);
        }
        for(i=0; i < STAT_COUNT; i++) {
            stats[i] += uint(data.getElementInArrayType(EtheremonEnum.ArrayType.STAT_STEP, obj.classId, i)) * cp * 3;
        }
        
        cp = (stats[0] + stats[1] + stats[2] + stats[3] + stats[4] + stats[5]) / 6;
    }
    
    function getPrice(uint32 _classId) constant external returns(bool catchable, uint price) {
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        MonsterClassAcc memory class;
        (class.classId, class.price, class.returnPrice, class.total, class.catchable) = data.getMonsterClass(_classId);
        
        price = class.price;
        if (class.total > 0)
            price += class.price*(class.total-1)/priceIncreasingRatio;
        
        if (class.catchable == false) {
            if (addressWhitelist[msg.sender] == true && classWhitelist[_classId] == true) {
                return (true, price);
            }
        }
        
        return (class.catchable, price);
    }
    
    function getMonsterClassBasic(uint32 _classId) constant external returns(uint256, uint256, uint256, bool) {
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        MonsterClassAcc memory class;
        (class.classId, class.price, class.returnPrice, class.total, class.catchable) = data.getMonsterClass(_classId);
        return (class.price, class.returnPrice, class.total, class.catchable);
    }
    
    function renameMonster(uint64 _objId, string name) isActive external {
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        MonsterObjAcc memory obj;
        (obj.monsterId, obj.classId, obj.trainer, obj.exp, obj.createIndex, obj.lastClaimIndex, obj.createTime) = data.getMonsterObj(_objId);
        if (obj.monsterId != _objId || obj.trainer != msg.sender) {
            revert();
        }
        data.setMonsterObj(_objId, name, obj.exp, obj.createIndex, obj.lastClaimIndex);
    }
    
    function catchMonster(address _player, uint32 _classId, string _name) isActive external payable returns(uint tokenId) {
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        MonsterClassAcc memory class;
        (class.classId, class.price, class.returnPrice, class.total, class.catchable) = data.getMonsterClass(_classId);
        if (class.classId == 0) {
            revert();
        }
        
        if (class.catchable == false) {
            if (addressWhitelist[msg.sender] == false || classWhitelist[_classId] == false) {
                revert();
            }
        }
        
        uint price = class.price;
        if (class.total > 0)
            price += class.price*(class.total-1)/priceIncreasingRatio;
        if (msg.value + gapFactor < price) {
            revert();
        }
        
        // add new monster 
        uint64 objId = data.addMonsterObj(_classId, _player, _name);
        uint8 value;
        seed = getRandom(_player, block.number-1, seed, objId);
        // generate base stat for the previous one
        for (uint i=0; i < STAT_COUNT; i+= 1) {
            value = uint8(seed % STAT_MAX) + data.getElementInArrayType(EtheremonEnum.ArrayType.STAT_START, uint64(_classId), i);
            data.addElementToArrayType(EtheremonEnum.ArrayType.STAT_BASE, objId, value);
        }
        
        emit Transfer(address(0), _player, objId);

        return objId; 
    }
    
    
}

Contract ABI
[{"constant":true,"inputs":[{"name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_monsterId","type":"uint64"}],"name":"getMonsterCP","outputs":[{"name":"cp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"_name","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_approved","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_classId","type":"uint32"},{"name":"_trainer","type":"address"},{"name":"_name","type":"string"}],"name":"mintMonster","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_player","type":"address"},{"name":"_block","type":"uint256"},{"name":"_seed","type":"uint256"},{"name":"_count","type":"uint256"}],"name":"getRandom","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_dataContract","type":"address"},{"name":"_battleContract","type":"address"},{"name":"_tradeContract","type":"address"}],"name":"setOperationContracts","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"dataContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"moderators","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"_uri","type":"string"}],"name":"setTokenURI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"genLevelExp","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_monsterId","type":"uint64"}],"name":"getMonsterCurrentStats","outputs":[{"name":"exp","type":"uint256"},{"name":"level","type":"uint256"},{"name":"hp","type":"uint256"},{"name":"pa","type":"uint256"},{"name":"pd","type":"uint256"},{"name":"sa","type":"uint256"},{"name":"sd","type":"uint256"},{"name":"speed","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"battleContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_classId","type":"uint32"},{"name":"_status","type":"bool"}],"name":"setClassWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_isMaintaining","type":"bool"}],"name":"UpdateMaintaining","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"STAT_MAX","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalModerators","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_sendTo","type":"address"},{"name":"_amount","type":"uint256"}],"name":"withdrawEther","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_ratio","type":"uint16"}],"name":"setPriceIncreasingRatio","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"_owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newModerator","type":"address"}],"name":"AddModerator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint8"}],"name":"levelExps","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"clearApproval","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_gapFactor","type":"uint256"}],"name":"setFactor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint64"}],"name":"burnMonster","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"isApprovable","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_objId","type":"uint64"},{"name":"name","type":"string"}],"name":"renameMonster","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":"_classId","type":"uint32"}],"name":"getMonsterClassBasic","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"_symbol","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_operator","type":"address"},{"name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_smartcontract","type":"address"},{"name":"_status","type":"bool"}],"name":"setAddressWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"exp","type":"uint32"}],"name":"getLevel","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_oldModerator","type":"address"}],"name":"RemoveModerator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_player","type":"address"},{"name":"_classId","type":"uint32"},{"name":"_name","type":"string"}],"name":"catchMonster","outputs":[{"name":"tokenId","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"gapFactor","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"triggerTransferEvent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_monsterId","type":"uint64"}],"name":"getMonsterBaseStats","outputs":[{"name":"hp","type":"uint256"},{"name":"pa","type":"uint256"},{"name":"pd","type":"uint256"},{"name":"sa","type":"uint256"},{"name":"sd","type":"uint256"},{"name":"speed","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"STAT_COUNT","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_classId","type":"uint32"}],"name":"getPrice","outputs":[{"name":"catchable","type":"bool"},{"name":"price","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"priceIncreasingRatio","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isMaintaining","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"ChangeOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tradeContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":true,"name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_approved","type":"address"},{"indexed":true,"name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_operator","type":"address"},{"indexed":false,"name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"}]

Contract Creation Code
600180546003805460ff199081169091556000600b81905566038d7ea4c68000600f556010805461ffff19166103e817815560808181527f4574686572656d6f6e4d6f6e737465720000000000000000000000000000000060a0908152610100604052600560c09081527f454d4f4e4100000000000000000000000000000000000000000000000000000060e05260208590527f67be87c3ff9960ca1e9cfac5cab2ff4747269cf9ed20c9b7306235ac35a491c58054871689179055600160b060020a0319909616331787557ff7815fccbf112960a73756e185887fedcb9fc64ca0a16cc5923b7960ed78080080548616881790557f780e9d63000000000000000000000000000000000000000000000000000000009093527f77b7bbe0e49b76487c9476b5db3354cf5270619d0037ccb899c2a4c4a75b43188054909416909517909255620001539160089190620001c7565b50805162000169906009906020840190620001c7565b50507f5b5e139f000000000000000000000000000000000000000000000000000000006000908152602052507f9562381dfbc2d8b8b66e765249f330164b73e329e5f01670660643571d1974df805460ff191660011790556200026c565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200020a57805160ff19168380011785556200023a565b828001600101855582156200023a579182015b828111156200023a5782518255916020019190600101906200021d565b50620002489291506200024c565b5090565b6200026991905b8082111562000248576000815560010162000253565b90565b614091806200027c6000396000f3006080604052600436106102795763ffffffff60e060020a60003504166301ffc9a7811461027e5780630672859b146102c957806306fdde03146102fd578063081812fc14610387578063095ea7b3146103bb5780630963d4b7146103e15780630a92b264146104185780630afd548d146104425780630d6688181461046f57806314d0f1ba14610484578063162094c4146104a557806318160ddd146104c957806323b872dd146104de5780632f745c591461050857806333ced3211461052c5780633c6e592714610541578063423b1ca3146105a457806342842e0e146105b95780634661bb98146105e357806348ef5aa8146106065780634e3dc2f1146106205780634efb023e1461064b5780634f6ccce714610677578063522f68151461068f57806357918052146106b35780636352211e146106cf5780636c81fd6d146106e757806370a082311461070857806378b475a8146107295780637fdd54031461075d578063817e9d311461077557806381b230421461078d5780638a0520fb146107af5780638d1d22d8146107d35780638da5cb5b1461080157806394f6ba1c1461081657806395d89b411461085c578063a22cb46514610871578063a9059cbb14610897578063af4c14ee146108bb578063b2cad9b7146108e1578063b85d6275146108ff578063b88d4fde14610920578063c0845e8a14610959578063c10be52114610983578063c463b00814610998578063c87b56dd146109c2578063d29cbd60146109da578063d98e14bd14610a2f578063da26663a14610a44578063e19bb96414610a7d578063e985e9c514610a92578063ee4e441614610ab9578063f285329214610ace578063ffa640d814610aef575b600080fd5b34801561028a57600080fd5b506102b57bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1960043516610b04565b604080519115158252519081900360200190f35b3480156102d557600080fd5b506102eb67ffffffffffffffff60043516610b38565b60408051918252519081900360200190f35b34801561030957600080fd5b50610312610dfe565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561034c578181015183820152602001610334565b50505050905090810190601f1680156103795780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561039357600080fd5b5061039f600435610e94565b60408051600160a060020a039092168252519081900360200190f35b3480156103c757600080fd5b506103df600160a060020a0360043516602435610fbf565b005b3480156103ed57600080fd5b506102eb6004803563ffffffff169060248035600160a060020a0316916044359182019101356112a7565b34801561042457600080fd5b506102eb600160a060020a036004351660243560443560643561157a565b34801561044e57600080fd5b506103df600160a060020a036004358116906024358116906044351661162c565b34801561047b57600080fd5b5061039f6116c6565b34801561049057600080fd5b506102b5600160a060020a03600435166116da565b3480156104b157600080fd5b506103df6004803590602480359081019101356116ef565b3480156104d557600080fd5b506102eb611766565b3480156104ea57600080fd5b506103df600160a060020a03600435811690602435166044356117fc565b34801561051457600080fd5b506102eb600160a060020a0360043516602435611961565b34801561053857600080fd5b506103df611a2e565b34801561054d57600080fd5b5061056367ffffffffffffffff60043516611acb565b604080519889526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b3480156105b057600080fd5b5061039f611de6565b3480156105c557600080fd5b506103df600160a060020a0360043581169060243516604435611df5565b3480156105ef57600080fd5b506103df63ffffffff600435166024351515611e11565b34801561061257600080fd5b506103df6004351515611e71565b34801561062c57600080fd5b50610635611e9b565b6040805160ff9092168252519081900360200190f35b34801561065757600080fd5b50610660611ea0565b6040805161ffff9092168252519081900360200190f35b34801561068357600080fd5b506102eb600435611ec2565b34801561069b57600080fd5b506103df600160a060020a0360043516602435611ec5565b3480156106bf57600080fd5b506103df61ffff60043516611f20565b3480156106db57600080fd5b5061039f600435611f70565b3480156106f357600080fd5b506103df600160a060020a0360043516612075565b34801561071457600080fd5b506102eb600160a060020a036004351661211c565b34801561073557600080fd5b5061074460ff600435166121d7565b6040805163ffffffff9092168252519081900360200190f35b34801561076957600080fd5b506103df6004356121ef565b34801561078157600080fd5b506103df600435612230565b34801561079957600080fd5b506103df67ffffffffffffffff6004351661226d565b3480156107bb57600080fd5b506102b5600160a060020a03600435166024356122b8565b3480156107df57600080fd5b506103df6004803567ffffffffffffffff16906024803590810191013561253e565b34801561080d57600080fd5b5061039f612758565b34801561082257600080fd5b5061083463ffffffff60043516612767565b6040805194855260208501939093528383019190915215156060830152519081900360800190f35b34801561086857600080fd5b50610312612866565b34801561087d57600080fd5b506103df600160a060020a036004351660243515156128c7565b3480156108a357600080fd5b506103df600160a060020a036004351660243561294a565b3480156108c757600080fd5b506103df600160a060020a03600435166024351515612aa3565b3480156108ed57600080fd5b5061063563ffffffff60043516612b06565b34801561090b57600080fd5b506103df600160a060020a0360043516612b69565b34801561092c57600080fd5b506103df600160a060020a0360048035821691602480359091169160443591606435908101910135612c10565b6102eb60048035600160a060020a0316906024803563ffffffff1691604435918201910135612c4c565b34801561098f57600080fd5b506102eb61307b565b3480156109a457600080fd5b506103df600160a060020a0360043581169060243516604435613081565b3480156109ce57600080fd5b506103126004356130f6565b3480156109e657600080fd5b506109fc67ffffffffffffffff60043516613197565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b348015610a3b57600080fd5b506106356132a6565b348015610a5057600080fd5b50610a6263ffffffff600435166132ab565b60408051921515835260208301919091528051918290030190f35b348015610a8957600080fd5b50610660613438565b348015610a9e57600080fd5b506102b5600160a060020a0360043581169060243516613442565b348015610ac557600080fd5b506102b561349d565b348015610ada57600080fd5b506103df600160a060020a03600435166134a6565b348015610afb57600080fd5b5061039f6134f9565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191660009081526020819052604090205460ff1690565b600080610b43613ee1565b610b4b613f24565b6003546040805160e560020a6239012302815267ffffffffffffffff881660048201529051610100909204600160a060020a03169450600091859163072024609160248083019260e092919082900301818787803b158015610bac57600080fd5b505af1158015610bc0573d6000803e3d6000fd5b505050506040513d60e0811015610bd657600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08f015263ffffffff9081169a8e019a909a52908916908c0152908716908a01819052600160a060020a039091169189019190915293169086015267ffffffffffffffff16845260009150610c5190612b06565b60ff169450600090505b6006811015610d0f576040805160e060020a6362b21ad70281526003600482015267ffffffffffffffff88166024820152604481018390529051600160a060020a038616916362b21ad79160648083019260209291908290030181600087803b158015610cc757600080fd5b505af1158015610cdb573d6000803e3d6000fd5b505050506040513d6020811015610cf157600080fd5b505160ff16828260068110610d0257fe5b6020020152600101610c5b565b5060005b6006811015610dd1576020838101516040805160e060020a6362b21ad70281526001600482015263ffffffff909216602483015260448201849052518792600160a060020a038816926362b21ad792606480830193928290030181600087803b158015610d7f57600080fd5b505af1158015610d93573d6000803e3d6000fd5b505050506040513d6020811015610da957600080fd5b505160ff1602600302828260068110610dbe57fe5b6020020180519091019052600101610d13565b5060a081015160808201516060830151604084015160208501519451600695010101010104949350505050565b60088054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610e8a5780601f10610e5f57610100808354040283529160200191610e8a565b820191906000526020600020905b815481529060010190602001808311610e6d57829003601f168201915b5050505050905090565b600080610e9f613ee1565b6003546040805160e560020a6239012302815267ffffffffffffffff871660048201529051610100909204600160a060020a03169350839163072024609160248082019260e0929091908290030181600087803b158015610eff57600080fd5b505af1158015610f13573d6000803e3d6000fd5b505050506040513d60e0811015610f2957600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08d015263ffffffff9081169a8c019a909a52908916908a015290871690880152600160a060020a031690860181905293169084015267ffffffffffffffff1682521515610f9d57600080fd5b600084815260066020526040902054600160a060020a031692505b5050919050565b6000610fc9613ee1565b600080600360019054906101000a9004600160a060020a0316935083600160a060020a03166307202460866040518263ffffffff1660e060020a028152600401808267ffffffffffffffff1667ffffffffffffffff16815260200191505060e060405180830381600087803b15801561104157600080fd5b505af1158015611055573d6000803e3d6000fd5b505050506040513d60e081101561106b57600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08f015263ffffffff9081169a8e019a909a52908916908c0152908716908a0152600160a060020a031690880181905293169086015267ffffffffffffffff16845215156110df57600080fd5b6110ec8360400151613508565b50506004805460055483516040805160e060020a6335f097f302815267ffffffffffffffff909216948201949094529251600160a060020a0392831693919092169183916335f097f39160248083019260209291908290030181600087803b15801561115757600080fd5b505af115801561116b573d6000803e3d6000fd5b505050506040513d602081101561118157600080fd5b50518061120d575082516040805160e260020a632a11e9c702815267ffffffffffffffff909216600483015251600160a060020a0383169163a847a71c9160248083019260209291908290030181600087803b1580156111e057600080fd5b505af11580156111f4573d6000803e3d6000fd5b505050506040513d602081101561120a57600080fd5b50515b1561121757600080fd5b6040830151600160a060020a038781169116141561123457600080fd5b600085815260066020526040808220805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038a811691821790925586830151925189949193909216917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a4505050505050565b6001546000908190819081908190600160a060020a03163314806112df57503360009081526002602052604090205460ff1615156001145b15156112ea57600080fd5b6003546040517ffc4d20f500000000000000000000000000000000000000000000000000000000815263ffffffff8b1660048201908152600160a060020a038b81166024840152606060448401908152606484018b9052610100909404169650869263fc4d20f5928d928d928d928d929190608401848480828437820191505095505050505050602060405180830381600087803b15801561138b57600080fd5b505af115801561139f573d6000803e3d6000fd5b505050506040513d60208110156113b557600080fd5b5051600b549093506113d990899060001943019067ffffffffffffffff871661157a565b600b555060005b6006811015611534576040805160e060020a6362b21ad70281526002600482015263ffffffff8b166024820152604481018390529051600160a060020a038616916362b21ad79160648083019260209291908290030181600087803b15801561144857600080fd5b505af115801561145c573d6000803e3d6000fd5b505050506040513d602081101561147257600080fd5b5051600b546020900601915083600160a060020a03166326bda739600385856040518463ffffffff1660e060020a028152600401808460048111156114b357fe5b60ff1681526020018367ffffffffffffffff1667ffffffffffffffff1681526020018260ff1660ff1681526020019350505050602060405180830381600087803b15801561150057600080fd5b505af1158015611514573d6000803e3d6000fd5b505050506040513d602081101561152a57600080fd5b50506001016113e0565b60405167ffffffffffffffff841690600160a060020a038a1690600090600080516020614046833981519152908290a4505067ffffffffffffffff169695505050505050565b6040805184406020808301919091526c01000000000000000000000000600160a060020a0388160282840152605482018590526074808301859052835180840390910181526094909201928390528151600093918291908401908083835b602083106115f75780518252601f1990920191602091820191016115d8565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912098975050505050505050565b600154600160a060020a031633148061165957503360009081526002602052604090205460ff1615156001145b151561166457600080fd5b60038054600160a060020a039485166101000274ffffffffffffffffffffffffffffffffffffffff00199091161790556004805492841673ffffffffffffffffffffffffffffffffffffffff1993841617905560058054919093169116179055565b6003546101009004600160a060020a031681565b60026020526000908152604090205460ff1681565b600154600160a060020a031633148061171c57503360009081526002602052604090205460ff1615156001145b151561172757600080fd5b6117618383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375061354d945050505050565b505050565b600080600360019054906101000a9004600160a060020a0316905080600160a060020a0316637a09defe6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156117bf57600080fd5b505af11580156117d3573d6000803e3d6000fd5b505050506040513d60208110156117e957600080fd5b505167ffffffffffffffff1691505b5090565b6000611806613ee1565b6003546040805160e560020a6239012302815267ffffffffffffffff861660048201529051610100909204600160a060020a03169350839163072024609160248082019260e0929091908290030181600087803b15801561186657600080fd5b505af115801561187a573d6000803e3d6000fd5b505050506040513d60e081101561189057600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08d015263ffffffff9081169a8c019a909a52908916908a015290871690880152600160a060020a031690860181905293169084015267ffffffffffffffff168252151561190457600080fd5b61191283826040015161356c565b84600160a060020a03168160400151600160a060020a031614151561193657600080fd5b600160a060020a038416151561194b57600080fd5b61195a8160400151858561370e565b5050505050565b600080600160a060020a038416151561197957600080fd5b50600354604080517f75fe2e33000000000000000000000000000000000000000000000000000000008152600160a060020a0386811660048301526024820186905291516101009093049091169182916375fe2e339160448083019260209291908290030181600087803b1580156119f057600080fd5b505af1158015611a04573d6000803e3d6000fd5b505050506040513d6020811015611a1a57600080fd5b505167ffffffffffffffff16949350505050565b60015460009081908190600160a060020a0316331480611a6257503360009081526002602052604090205460ff1615156001145b1515611a6d57600080fd5b506001915060649050805b606460ff8416116117615760ff83166000908152600c60205260409020805463ffffffff191663ffffffff83811691909117909155600190930192600a90600b8402160460050191508181019050611a78565b6000806000806000806000806000611ae1613ee1565b611ae9613f24565b6003546040805160e560020a6239012302815267ffffffffffffffff8f1660048201529051610100909204600160a060020a03169450600091859163072024609160248083019260e092919082900301818787803b158015611b4a57600080fd5b505af1158015611b5e573d6000803e3d6000fd5b505050506040513d60e0811015611b7457600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08f015263ffffffff9081169a8e019a909a52908916908c0152908716908a01819052600160a060020a039091169189019190915293169086015267ffffffffffffffff16845260009150611bef90612b06565b60ff169a50600090505b6006811015611cc65783600160a060020a03166362b21ad760038f846040518463ffffffff1660e060020a02815260040180846004811115611c3757fe5b60ff1681526020018367ffffffffffffffff1667ffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015611c7e57600080fd5b505af1158015611c92573d6000803e3d6000fd5b505050506040513d6020811015611ca857600080fd5b505160ff16828260068110611cb957fe5b6020020152600101611bf9565b5060005b6006811015611d88576020838101516040805160e060020a6362b21ad70281526001600482015263ffffffff909216602483015260448201849052518d92600160a060020a038816926362b21ad792606480830193928290030181600087803b158015611d3657600080fd5b505af1158015611d4a573d6000803e3d6000fd5b505050506040513d6020811015611d6057600080fd5b505160ff1602600302828260068110611d7557fe5b6020020180519091019052600101611cca565b60808301518b8360006020020151846001602002015185600260200201518660036020020151876004602002015188600560200201518763ffffffff1697509b509b509b509b509b509b509b509b5050505050919395975091939597565b600454600160a060020a031681565b6117618383836020604051908101604052806000815250613871565b600154600160a060020a0316331480611e3e57503360009081526002602052604090205460ff1615156001145b1515611e4957600080fd5b63ffffffff919091166000908152600d60205260409020805460ff1916911515919091179055565b600154600160a060020a03163314611e8857600080fd5b6003805460ff1916911515919091179055565b602081565b60015474010000000000000000000000000000000000000000900461ffff1681565b90565b600154600160a060020a03163314611edc57600080fd5b3031811115611eea57600080fd5b604051600160a060020a0383169082156108fc029083906000818181858888f19350505050158015611761573d6000803e3d6000fd5b600154600160a060020a0316331480611f4d57503360009081526002602052604090205460ff1615156001145b1515611f5857600080fd5b6010805461ffff191661ffff92909216919091179055565b600080611f7b613ee1565b6003546040805160e560020a6239012302815267ffffffffffffffff871660048201529051610100909204600160a060020a03169350839163072024609160248082019260e0929091908290030181600087803b158015611fdb57600080fd5b505af1158015611fef573d6000803e3d6000fd5b505050506040513d60e081101561200557600080fd5b5080516020808301516040840151606085015160808087015160a08089015160c0998a015160e08c015263ffffffff908116998b0199909952908816908901529086169087015293169084015267ffffffffffffffff1682529250600160a060020a0383161515610fb857600080fd5b600154600160a060020a0316331461208c57600080fd5b600160a060020a03811660009081526002602052604090205460ff16151561211957600160a060020a0381166000908152600260205260409020805460ff19166001908117909155805461ffff74010000000000000000000000000000000000000000808304821684019091160275ffff0000000000000000000000000000000000000000199091161790555b50565b600080600160a060020a038316151561213457600080fd5b50600354604080517f47c17bac000000000000000000000000000000000000000000000000000000008152600160a060020a03858116600483015291516101009093049091169182916347c17bac9160248083019260209291908290030181600087803b1580156121a457600080fd5b505af11580156121b8573d6000803e3d6000fd5b505050506040513d60208110156121ce57600080fd5b50519392505050565b600c6020526000908152604090205463ffffffff1681565b600154600160a060020a031633148061221c57503360009081526002602052604090205460ff1615156001145b151561222757600080fd5b61211981613b4b565b600154600160a060020a031633148061225d57503360009081526002602052604090205460ff1615156001145b151561226857600080fd5b600f55565b600154600160a060020a031633148061229a57503360009081526002602052604090205460ff1615156001145b15156122a557600080fd5b6121198167ffffffffffffffff16613b93565b6000806122c3613ee1565b600080600360019054906101000a9004600160a060020a0316935083600160a060020a03166307202460876040518263ffffffff1660e060020a028152600401808267ffffffffffffffff1667ffffffffffffffff16815260200191505060e060405180830381600087803b15801561233b57600080fd5b505af115801561234f573d6000803e3d6000fd5b505050506040513d60e081101561236557600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08f015263ffffffff9081169a8e019a909a52908916908c0152908716908a0152600160a060020a031690880152929092169185019190915267ffffffffffffffff908116808552908716146123e55760009450612534565b86600160a060020a03168360400151600160a060020a031614151561240d5760009450612534565b50506004805460055483516040805160e060020a6335f097f302815267ffffffffffffffff909216948201949094529251600160a060020a0392831693919092169183916335f097f39160248083019260209291908290030181600087803b15801561247857600080fd5b505af115801561248c573d6000803e3d6000fd5b505050506040513d60208110156124a257600080fd5b5051158015612531575082516040805160e260020a632a11e9c702815267ffffffffffffffff909216600483015251600160a060020a0383169163a847a71c9160248083019260209291908290030181600087803b15801561250357600080fd5b505af1158015612517573d6000803e3d6000fd5b505050506040513d602081101561252d57600080fd5b5051155b94505b5050505092915050565b6000612548613ee1565b60035460ff161561255857600080fd5b6003546040805160e560020a6239012302815267ffffffffffffffff881660048201529051610100909204600160a060020a03169350839163072024609160248082019260e0929091908290030181600087803b1580156125b857600080fd5b505af11580156125cc573d6000803e3d6000fd5b505050506040513d60e08110156125e257600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08d015263ffffffff9081169a8c019a909a52908916908a015290871690880152600160a060020a031690860152929092169183019190915267ffffffffffffffff90811680835290861614158061266e57506040810151600160a060020a03163314155b1561267857600080fd5b608081015160a08083015160c08401516040517f32666a3100000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8a166004820190815263ffffffff80871660448401528085166064840152831660848301526024820194855260a48201899052600160a060020a038816956332666a31958c958c958c959394919390929060c4018787808284378201915050975050505050505050600060405180830381600087803b15801561273957600080fd5b505af115801561274d573d6000803e3d6000fd5b505050505050505050565b600154600160a060020a031681565b6000806000806000612777613f43565b600354604080517f9d29cac400000000000000000000000000000000000000000000000000000000815263ffffffff8a1660048201529051610100909204600160a060020a031693508391639d29cac49160248082019260a0929091908290030181600087803b1580156127ea57600080fd5b505af11580156127fe573d6000803e3d6000fd5b505050506040513d60a081101561281457600080fd5b508051602080830151604080850151606080870151608097880151151597890188905263ffffffff90811691890182905292880182905293870183905293169094529299909850919650945092505050565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610e8a5780601f10610e5f57610100808354040283529160200191610e8a565b600160a060020a03821615156128dc57600080fd5b336000818152600760209081526040808320600160a060020a03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b6000612954613ee1565b6003546040805160e560020a6239012302815267ffffffffffffffff861660048201529051610100909204600160a060020a03169350839163072024609160248082019260e0929091908290030181600087803b1580156129b457600080fd5b505af11580156129c8573d6000803e3d6000fd5b505050506040513d60e08110156129de57600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08d015263ffffffff9081169a8c019a909a52908916908a015290871690880152600160a060020a031690860181905293169084015267ffffffffffffffff1682521515612a5257600080fd5b612a6083826040015161356c565b6040810151600160a060020a03163314612a7957600080fd5b600160a060020a0384161515612a8e57600080fd5b612a9d8160400151858561370e565b50505050565b600154600160a060020a0316331480612ad057503360009081526002602052604090205460ff1615156001145b1515612adb57600080fd5b600160a060020a03919091166000908152600e60205260409020805460ff1916911515919091179055565b600060016064825b8160ff168360ff161015612b6057600260ff848401160460ff81166000908152600c602052604090205490915063ffffffff9081169086161015612b5457809150612b5b565b8060010192505b612b0e565b50909392505050565b600154600160a060020a03163314612b8057600080fd5b600160a060020a03811660009081526002602052604090205460ff1615156001141561211957600160a060020a03166000908152600260205260409020805460ff191690556001805475ffff0000000000000000000000000000000000000000198116740100000000000000000000000000000000000000009182900461ffff9081166000190116909102179055565b61195a85858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843750613871945050505050565b600080612c57613f43565b60035460009081908190819060ff1615612c7057600080fd5b600354604080517f9d29cac400000000000000000000000000000000000000000000000000000000815263ffffffff8d1660048201529051610100909204600160a060020a031697508791639d29cac49160248082019260a0929091908290030181600087803b158015612ce357600080fd5b505af1158015612cf7573d6000803e3d6000fd5b505050506040513d60a0811015612d0d57600080fd5b5080516020808301516040808501516060808701516080978801511515978d019790975263ffffffff968716908c0152908a015290880152168086521515612d5457600080fd5b60808501511515612d9e57336000908152600e602052604090205460ff161580612d94575063ffffffff8a166000908152600d602052604090205460ff16155b15612d9e57600080fd5b846020015193506000856060015163ffffffff161115612de8576010546060860151602087015161ffff9092169160001990910163ffffffff1602811515612de257fe5b04840193505b83600f5434011015612df957600080fd5b85600160a060020a031663fc4d20f58b8d8c8c6040518563ffffffff1660e060020a028152600401808563ffffffff1663ffffffff16815260200184600160a060020a0316600160a060020a03168152602001806020018281038252848482818152602001925080828437820191505095505050505050602060405180830381600087803b158015612e8a57600080fd5b505af1158015612e9e573d6000803e3d6000fd5b505050506040513d6020811015612eb457600080fd5b5051600b54909350612ed8908c9060001943019067ffffffffffffffff871661157a565b600b555060005b6006811015613033576040805160e060020a6362b21ad70281526002600482015263ffffffff8c166024820152604481018390529051600160a060020a038816916362b21ad79160648083019260209291908290030181600087803b158015612f4757600080fd5b505af1158015612f5b573d6000803e3d6000fd5b505050506040513d6020811015612f7157600080fd5b5051600b546020900601915085600160a060020a03166326bda739600385856040518463ffffffff1660e060020a02815260040180846004811115612fb257fe5b60ff1681526020018367ffffffffffffffff1667ffffffffffffffff1681526020018260ff1660ff1681526020019350505050602060405180830381600087803b158015612fff57600080fd5b505af1158015613013573d6000803e3d6000fd5b505050506040513d602081101561302957600080fd5b5050600101612edf565b60405167ffffffffffffffff841690600160a060020a038d1690600090600080516020614046833981519152908290a4505067ffffffffffffffff1698975050505050505050565b600f5481565b600154600160a060020a03163314806130ae57503360009081526002602052604090205460ff1615156001145b15156130b957600080fd5b6130c281613b4b565b8082600160a060020a031684600160a060020a031660008051602061404683398151915260405160405180910390a4505050565b6000818152600a602090815260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084526060939283018282801561318b5780601f106131605761010080835404028352916020019161318b565b820191906000526020600020905b81548152906001019060200180831161316e57829003601f168201915b50505050509050919050565b60008060008060008060006131aa613f24565b6003546101009004600160a060020a0316915060005b6006811015613274576040805160e060020a6362b21ad70281526003600482015267ffffffffffffffff8c166024820152604481018390529051600160a060020a038516916362b21ad79160648083019260209291908290030181600087803b15801561322c57600080fd5b505af1158015613240573d6000803e3d6000fd5b505050506040513d602081101561325657600080fd5b505160ff1682826006811061326757fe5b60200201526001016131c0565b508051602082015160408301516060840151608085015160a090950151939d929c50909a509850919650945092505050565b600681565b60008060006132b8613f43565b600354604080517f9d29cac400000000000000000000000000000000000000000000000000000000815263ffffffff881660048201529051610100909204600160a060020a031693508391639d29cac49160248082019260a0929091908290030181600087803b15801561332b57600080fd5b505af115801561333f573d6000803e3d6000fd5b505050506040513d60a081101561335557600080fd5b50805160208083015160408085015160608087015160809788015115159789019790975263ffffffff96871690880181905291870152918501819052929091168352909350600010156133d2576010546060820151602083015161ffff9092169160001990910163ffffffff16028115156133cc57fe5b04830192505b6080810151151561342957336000908152600e602052604090205460ff161515600114801561341b575063ffffffff85166000908152600d602052604090205460ff1615156001145b156134295760019350613431565b608081015193505b5050915091565b60105461ffff1681565b6000600160a060020a038316151561345957600080fd5b600160a060020a038216151561346e57600080fd5b50600160a060020a03918216600090815260076020908152604080832093909416825291909152205460ff1690565b60035460ff1681565b600154600160a060020a031633146134bd57600080fd5b600160a060020a038116156121195760018054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff1990911617905550565b600554600160a060020a031681565b600160a060020a0381163314806135425750600160a060020a038116600090815260076020908152604080832033845290915290205460ff165b151561211957600080fd5b6000828152600a60209081526040909120825161176192840190613f71565b600480546005546040805160e060020a6335f097f302815267ffffffffffffffff87169481019490945251600160a060020a0392831693919092169183916335f097f39160248083019260209291908290030181600087803b1580156135d157600080fd5b505af11580156135e5573d6000803e3d6000fd5b505050506040513d60208110156135fb57600080fd5b505115801561368857506040805160e260020a632a11e9c702815267ffffffffffffffff861660048201529051600160a060020a0383169163a847a71c9160248083019260209291908290030181600087803b15801561365a57600080fd5b505af115801561366e573d6000803e3d6000fd5b505050506040513d602081101561368457600080fd5b5051155b151561369357600080fd5b600160a060020a03831615156136a857600080fd5b600160a060020a0383163314806136d55750600084815260066020526040902054600160a060020a031633145b806137035750600160a060020a038316600090815260076020908152604080832033845290915290205460ff165b1515612a9d57600080fd5b600061371982613b4b565b50600354604080517f60c6ccb2000000000000000000000000000000000000000000000000000000008152600160a060020a03868116600483015267ffffffffffffffff8516602483015291516101009093049091169182916360c6ccb291604480830192600092919082900301818387803b15801561379857600080fd5b505af11580156137ac573d6000803e3d6000fd5b5050604080517f9248019e000000000000000000000000000000000000000000000000000000008152600160a060020a03878116600483015267ffffffffffffffff8716602483015291519185169350639248019e925060448082019260009290919082900301818387803b15801561382457600080fd5b505af1158015613838573d6000803e3d6000fd5b505050508183600160a060020a031685600160a060020a031660008051602061404683398151915260405160405180910390a450505050565b600061387b613ee1565b6003546040805160e560020a6239012302815267ffffffffffffffff871660048201529051610100909204600160a060020a03169350600091849163072024609160248083019260e092919082900301818787803b1580156138dc57600080fd5b505af11580156138f0573d6000803e3d6000fd5b505050506040513d60e081101561390657600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08e015263ffffffff9081169a8d019a909a52908916908b015290871690890152600160a060020a031690870181905293169085015267ffffffffffffffff168352151561397a57600080fd5b61398885836040015161356c565b86600160a060020a03168260400151600160a060020a03161415156139ac57600080fd5b600160a060020a03861615156139c157600080fd5b6139d08260400151878761370e565b6139e286600160a060020a0316613bda565b15613b42576040517f150b7a020000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a038a8116602485015260448401899052608060648501908152885160848601528851918b169463150b7a0294938d938c938c93909160a490910190602085019080838360005b83811015613a7a578181015183820152602001613a62565b50505050905090810190601f168015613aa75780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015613ac957600080fd5b505af1158015613add573d6000803e3d6000fd5b505050506040513d6020811015613af357600080fd5b505190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1981167f150b7a020000000000000000000000000000000000000000000000000000000014613b4257600080fd5b50505050505050565b600081815260066020526040902054600160a060020a031615612119576000908152600660205260409020805473ffffffffffffffffffffffffffffffffffffffff19169055565b613b9c81613be2565b6000818152600a60205260409020546002600019610100600184161502019091160415612119576000818152600a6020526040812061211991613feb565b6000903b1190565b6000613bec613ee1565b600080613bf885613b4b565b6003546040805160e560020a6239012302815267ffffffffffffffff881660048201529051610100909204600160a060020a03169550859163072024609160248082019260e0929091908290030181600087803b158015613c5857600080fd5b505af1158015613c6c573d6000803e3d6000fd5b505050506040513d60e0811015613c8257600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08f015263ffffffff9081169a8e019a909a52908916908c0152908716908a0152600160a060020a031690880181905293169086015267ffffffffffffffff1684521515613cf657600080fd5b50506004805460055483516040805160e060020a6335f097f302815267ffffffffffffffff909216948201949094529251600160a060020a0392831693919092169183916335f097f39160248083019260209291908290030181600087803b158015613d6157600080fd5b505af1158015613d75573d6000803e3d6000fd5b505050506040513d6020811015613d8b57600080fd5b505180613e17575082516040805160e260020a632a11e9c702815267ffffffffffffffff909216600483015251600160a060020a0383169163a847a71c9160248083019260209291908290030181600087803b158015613dea57600080fd5b505af1158015613dfe573d6000803e3d6000fd5b505050506040513d6020811015613e1457600080fd5b50515b15613e2157600080fd5b60408084015181517f60c6ccb2000000000000000000000000000000000000000000000000000000008152600160a060020a03918216600482015267ffffffffffffffff881660248201529151908616916360c6ccb291604480830192600092919082900301818387803b158015613e9857600080fd5b505af1158015613eac573d6000803e3d6000fd5b5050506040808501519051879250600091600160a060020a031690600080516020614046833981519152908390a45050505050565b60408051610100810182526000808252602082018190529181018290526060808201526080810182905260a0810182905260c0810182905260e081019190915290565b60c0604051908101604052806006906020820280388339509192915050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613fb257805160ff1916838001178555613fdf565b82800160010185558215613fdf579182015b82811115613fdf578251825591602001919060010190613fc4565b506117f892915061402b565b50805460018160011615610100020316600290046000825580601f106140115750612119565b601f01602090049060005260206000209081019061211991905b611ec291905b808211156117f857600081556001016140315600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a7230582089a567cea9b3bb8422cf1b9a2493b8775bc1007b0c9f0a20c9626c790722f9b60029


   Swarm Source:
bzzr://89a567cea9b3bb8422cf1b9a2493b8775bc1007b0c9f0a20c9626c790722f9b6
Block Age transaction Difficulty GasUsed Reward
Block Age Uncle Number Difficulty GasUsed Reward
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.