Contract 0x5D00d312e171Be5342067c09BaE883f9Bcb2003B

 
Txn Hash Method
Block
From
To
Value
0x9a8737b13b604221f1937197483ce01c1b808b8665e76e9bf60170be6ac0bd18Safe Transfer Fr...126783242021-06-21 15:05:011 day 19 hrs ago0xf3a2727a3447653a58d57e4be63d5d5cdc55421b IN  Etheremon Monster Token0 Ether0.0036406685738.115
0xd35dfb0fb1e54b18e46133d5a62ecbad91f943c18d07999ea044e25a7ddfd73dSafe Transfer Fr...126783052021-06-21 15:00:281 day 19 hrs ago0xf3a2727a3447653a58d57e4be63d5d5cdc55421b IN  Etheremon Monster Token0 Ether0.0043489561534.65
0x606bfcd4b56d3ea7104f723d148c455446eb29a21519d2183599d70c3bd9630dSafe Transfer Fr...126782952021-06-21 14:58:171 day 20 hrs ago0xf3a2727a3447653a58d57e4be63d5d5cdc55421b IN  Etheremon Monster Token0 Ether0.006037075837.8
0xcf8c9f774b9220f1e6b29c38c52d3a021c5ddcf6a4fd697ca0b38d8b70c08277Safe Transfer Fr...126500262021-06-17 5:19:256 days 5 hrs ago0xa0ee5a798c7420ad32b2e4b34dffba07cf1ef3e2 IN  Etheremon Monster Token0 Ether0.0015970488
0x731daa49295e7b2bf80596b95a98d5d4704f658526fb73bbf8bcd3311d4de4d0Set Approval For...126456792021-06-16 13:12:256 days 21 hrs ago0x5e70d1f20b874f9a6d90289ea262494055d70c52 IN  Etheremon Monster Token0 Ether0.00079830306817.000001459
0x0c86ea871f7017add37c205eb659c3cd21109a12b94b65ecf3f13cc24e11a848Set Approval For...126455772021-06-16 12:47:126 days 22 hrs ago0xed8328382b0df9d5d237797254f86169431b8adf IN  Etheremon Monster Token0 Ether0.00065742614
0xc2e0533d42ca98b71639811366f8d9c8892f5a93b9dd0d0b23bf2b3b8c9b6dd2Set Approval For...126455152021-06-16 12:31:556 days 22 hrs ago0x5cc95b84594480a88344a5227d0ca330b65f1012 IN  Etheremon Monster Token0 Ether0.00061046706813.000001459
0x3f4a49e39fe66652cbf905bf64a0e4d1ce3bd3a651ca397a46aee96fdef16279Safe Transfer Fr...126424262021-06-16 0:49:567 days 10 hrs ago0xb61ce2b4347bf9a028611f98dbdc8658a47457a2 IN  Etheremon Monster Token0 Ether0.001817980510.5
0xbfbd796be606bcb93edff947da199f1168a94765dd060ca501f98bfb9db1473dSafe Transfer Fr...126423942021-06-16 0:43:237 days 10 hrs ago0xb61ce2b4347bf9a028611f98dbdc8658a47457a2 IN  Etheremon Monster Token0 Ether0.001617955510.5
0x5bb90ce1b7f7eb40b5bebc1efd0be42bfac4de22d1a0a411e700ea9b3bd7f902Set Approval For...126111752021-06-11 4:42:2912 days 6 hrs ago0x194d64c12d147bb62b3bef1a2a1b90d6b841be91 IN  Etheremon Monster Token0 Ether0.00061046713
0xf014b3a273dcdfa961140d7caed856fbc2ba4d4d0c4f1f35f88adb6aa4ad336fSet Approval For...125957862021-06-08 19:29:2514 days 15 hrs ago0xfe8ef260e63a3388bb3f3174cf080f4423414100 IN  Etheremon Monster Token0 Ether0.00084526218
0xce7b30c8aad9f8aa6fb599c919e0c9e6a42dbd67cf9a57189038d53cd60c2433Set Approval For...125916582021-06-08 4:09:2515 days 6 hrs ago0x7b07cde87b9389addd049513dee69d5459dbf1cc IN  Etheremon Monster Token0 Ether0.000826478417.6
0x2d7860f30ea87e32a4f17bbe4a663250c9f9b2773c9c4def0213adae8b069b04Set Approval For...125850602021-06-07 3:36:4816 days 7 hrs ago0xa60b6d578991e5388e94643ae5846fb131a06b04 IN  Etheremon Monster Token0 Ether0.00084526218
0x5f74ec12ab7c4726d976b61a47f0e47ad244df56355e9248d098ed4c488e675eSet Approval For...125831622021-06-06 20:37:0716 days 14 hrs ago0xbe0c8e0f5f55cd1d90703d5daa14da0a9ee4ecd2 IN  Etheremon Monster Token0 Ether0.00070438515
0xae6e6ef2d89b9e8d51eb767e5a1731b04703cacfefeb5387ab40b27c6b9fca79Safe Transfer Fr...125829632021-06-06 19:55:2216 days 15 hrs ago0x0d76eb5ba6497ca92a906b411e358b0702713145 IN  Etheremon Monster Token0 Ether0.00190921212
0x36e9297b7f37e27f299a2036adf58bc1be3e0da6750c207e5f867c4abb65e2caSet Approval For...125804322021-06-06 10:34:4517 days 23 mins ago0xf18ca3753c5bba51b97fd410542ca739b4de5e71 IN  Etheremon Monster Token0 Ether0.00061046713
0x873ad67a3797ac4b3e127b48950bc38e8e975ca544d3e6df0c2110fdfbfb4062Safe Transfer Fr...125787972021-06-06 4:36:0817 days 6 hrs ago0x46dec61c112435c11702d0227330f894aee29a9f IN  Etheremon Monster Token0 Ether0.001730884610.6
0x8798c668272f7673247736fbe77b62d9cbc052b155108999f45fa6571642d871Set Approval For...125602782021-06-03 7:46:0520 days 3 hrs ago0xf8f59f0269c4f6d7b5c5ab98d70180eaa0c7507e IN  Etheremon Monster Token0 Ether0.00122093426
0x7605a7bbd62b5f1cd61f7540945ab9f57e926364fe1227d0fd966493266b2c94Safe Transfer Fr...125416562021-05-31 10:45:2023 days 13 mins ago0x6ec85b83d60b0ad3c2c2782c1cd554671980d734 IN  Etheremon Monster Token0 Ether0.00343905616
0xdc66390c2d73f66f3b10dad0c195231140eb9af6fda2c62a745e8e44a3938782Safe Transfer Fr...125416102021-05-31 10:36:2523 days 22 mins ago0x6ec85b83d60b0ad3c2c2782c1cd554671980d734 IN  Etheremon Monster Token0 Ether0.00428995818
0xd2669af78dc76e0389b633087b3036031d9a474cc7b521848d48d9dc8ccdf165Safe Transfer Fr...125415672021-05-31 10:25:0023 days 33 mins ago0x520414aa8c90496d7d8ca84cbdb673aff12f4c48 IN  Etheremon Monster Token0 Ether0.00305947818
0xc5369cb18c5c6c2f9a70bca7ab73645f3d9b2f5f923daecd0732b017fa317b97Safe Transfer Fr...125415302021-05-31 10:17:2023 days 41 mins ago0x6ec85b83d60b0ad3c2c2782c1cd554671980d734 IN  Etheremon Monster Token0 Ether0.0033853620
0x55ed2f65e0641eec4f49e27e6040400c34653329471841c7c92cd5fa11cb6e66Safe Transfer Fr...125414142021-05-31 9:44:1823 days 1 hr ago0x6ec85b83d60b0ad3c2c2782c1cd554671980d734 IN  Etheremon Monster Token0 Ether0.00251295717
0x7fe90e4a69621b2c6b7b61786ab5e476ac468ab00ceb1b6ac04254fb36b4ecc8Transfer From125352172021-05-30 10:36:5424 days 21 mins ago0x490fefeba684a6df25ec97add021bde0f21826dd IN  Etheremon Monster Token0 Ether0.00172002613618.700001481
0x4d99d9cfc60d029848e0d3c807f01bc0619313024402140b6c8317636cc1d6ceTransfer From125352172021-05-30 10:36:5424 days 21 mins ago0x490fefeba684a6df25ec97add021bde0f21826dd IN  Etheremon Monster Token0 Ether0.0029080933318.700001481
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0x3e70b0f2a3c60b0bd8762e676181b3a9e7c137b0187c2ec35ad990b7c0360c7198982842020-04-18 19:29:43430 days 15 hrs ago Etheremon Monster Token0x7bae63c4dbd39ec66669a1ef6e1cf6f747b71bdd0.3 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
EtheremonMonsterToken

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-08-28
*/

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 Security Audit

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

600180546003805460ff199081169091556000600b81905566038d7ea4c68000600f556010805461ffff19166103e817815560808181527f4574686572656d6f6e4d6f6e737465720000000000000000000000000000000060a0908152610100604052600560c09081527f454d4f4e4100000000000000000000000000000000000000000000000000000060e05260208590527f67be87c3ff9960ca1e9cfac5cab2ff4747269cf9ed20c9b7306235ac35a491c58054871689179055600160b060020a0319909616331787557ff7815fccbf112960a73756e185887fedcb9fc64ca0a16cc5923b7960ed78080080548616881790557f780e9d63000000000000000000000000000000000000000000000000000000009093527f77b7bbe0e49b76487c9476b5db3354cf5270619d0037ccb899c2a4c4a75b43188054909416909517909255620001539160089190620001c7565b50805162000169906009906020840190620001c7565b50507f5b5e139f000000000000000000000000000000000000000000000000000000006000908152602052507f9562381dfbc2d8b8b66e765249f330164b73e329e5f01670660643571d1974df805460ff191660011790556200026c565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200020a57805160ff19168380011785556200023a565b828001600101855582156200023a579182015b828111156200023a5782518255916020019190600101906200021d565b50620002489291506200024c565b5090565b6200026991905b8082111562000248576000815560010162000253565b90565b614091806200027c6000396000f3006080604052600436106102795763ffffffff60e060020a60003504166301ffc9a7811461027e5780630672859b146102c957806306fdde03146102fd578063081812fc14610387578063095ea7b3146103bb5780630963d4b7146103e15780630a92b264146104185780630afd548d146104425780630d6688181461046f57806314d0f1ba14610484578063162094c4146104a557806318160ddd146104c957806323b872dd146104de5780632f745c591461050857806333ced3211461052c5780633c6e592714610541578063423b1ca3146105a457806342842e0e146105b95780634661bb98146105e357806348ef5aa8146106065780634e3dc2f1146106205780634efb023e1461064b5780634f6ccce714610677578063522f68151461068f57806357918052146106b35780636352211e146106cf5780636c81fd6d146106e757806370a082311461070857806378b475a8146107295780637fdd54031461075d578063817e9d311461077557806381b230421461078d5780638a0520fb146107af5780638d1d22d8146107d35780638da5cb5b1461080157806394f6ba1c1461081657806395d89b411461085c578063a22cb46514610871578063a9059cbb14610897578063af4c14ee146108bb578063b2cad9b7146108e1578063b85d6275146108ff578063b88d4fde14610920578063c0845e8a14610959578063c10be52114610983578063c463b00814610998578063c87b56dd146109c2578063d29cbd60146109da578063d98e14bd14610a2f578063da26663a14610a44578063e19bb96414610a7d578063e985e9c514610a92578063ee4e441614610ab9578063f285329214610ace578063ffa640d814610aef575b600080fd5b34801561028a57600080fd5b506102b57bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1960043516610b04565b604080519115158252519081900360200190f35b3480156102d557600080fd5b506102eb67ffffffffffffffff60043516610b38565b60408051918252519081900360200190f35b34801561030957600080fd5b50610312610dfe565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561034c578181015183820152602001610334565b50505050905090810190601f1680156103795780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561039357600080fd5b5061039f600435610e94565b60408051600160a060020a039092168252519081900360200190f35b3480156103c757600080fd5b506103df600160a060020a0360043516602435610fbf565b005b3480156103ed57600080fd5b506102eb6004803563ffffffff169060248035600160a060020a0316916044359182019101356112a7565b34801561042457600080fd5b506102eb600160a060020a036004351660243560443560643561157a565b34801561044e57600080fd5b506103df600160a060020a036004358116906024358116906044351661162c565b34801561047b57600080fd5b5061039f6116c6565b34801561049057600080fd5b506102b5600160a060020a03600435166116da565b3480156104b157600080fd5b506103df6004803590602480359081019101356116ef565b3480156104d557600080fd5b506102eb611766565b3480156104ea57600080fd5b506103df600160a060020a03600435811690602435166044356117fc565b34801561051457600080fd5b506102eb600160a060020a0360043516602435611961565b34801561053857600080fd5b506103df611a2e565b34801561054d57600080fd5b5061056367ffffffffffffffff60043516611acb565b604080519889526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b3480156105b057600080fd5b5061039f611de6565b3480156105c557600080fd5b506103df600160a060020a0360043581169060243516604435611df5565b3480156105ef57600080fd5b506103df63ffffffff600435166024351515611e11565b34801561061257600080fd5b506103df6004351515611e71565b34801561062c57600080fd5b50610635611e9b565b6040805160ff9092168252519081900360200190f35b34801561065757600080fd5b50610660611ea0565b6040805161ffff9092168252519081900360200190f35b34801561068357600080fd5b506102eb600435611ec2565b34801561069b57600080fd5b506103df600160a060020a0360043516602435611ec5565b3480156106bf57600080fd5b506103df61ffff60043516611f20565b3480156106db57600080fd5b5061039f600435611f70565b3480156106f357600080fd5b506103df600160a060020a0360043516612075565b34801561071457600080fd5b506102eb600160a060020a036004351661211c565b34801561073557600080fd5b5061074460ff600435166121d7565b6040805163ffffffff9092168252519081900360200190f35b34801561076957600080fd5b506103df6004356121ef565b34801561078157600080fd5b506103df600435612230565b34801561079957600080fd5b506103df67ffffffffffffffff6004351661226d565b3480156107bb57600080fd5b506102b5600160a060020a03600435166024356122b8565b3480156107df57600080fd5b506103df6004803567ffffffffffffffff16906024803590810191013561253e565b34801561080d57600080fd5b5061039f612758565b34801561082257600080fd5b5061083463ffffffff60043516612767565b6040805194855260208501939093528383019190915215156060830152519081900360800190f35b34801561086857600080fd5b50610312612866565b34801561087d57600080fd5b506103df600160a060020a036004351660243515156128c7565b3480156108a357600080fd5b506103df600160a060020a036004351660243561294a565b3480156108c757600080fd5b506103df600160a060020a03600435166024351515612aa3565b3480156108ed57600080fd5b5061063563ffffffff60043516612b06565b34801561090b57600080fd5b506103df600160a060020a0360043516612b69565b34801561092c57600080fd5b506103df600160a060020a0360048035821691602480359091169160443591606435908101910135612c10565b6102eb60048035600160a060020a0316906024803563ffffffff1691604435918201910135612c4c565b34801561098f57600080fd5b506102eb61307b565b3480156109a457600080fd5b506103df600160a060020a0360043581169060243516604435613081565b3480156109ce57600080fd5b506103126004356130f6565b3480156109e657600080fd5b506109fc67ffffffffffffffff60043516613197565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b348015610a3b57600080fd5b506106356132a6565b348015610a5057600080fd5b50610a6263ffffffff600435166132ab565b60408051921515835260208301919091528051918290030190f35b348015610a8957600080fd5b50610660613438565b348015610a9e57600080fd5b506102b5600160a060020a0360043581169060243516613442565b348015610ac557600080fd5b506102b561349d565b348015610ada57600080fd5b506103df600160a060020a03600435166134a6565b348015610afb57600080fd5b5061039f6134f9565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191660009081526020819052604090205460ff1690565b600080610b43613ee1565b610b4b613f24565b6003546040805160e560020a6239012302815267ffffffffffffffff881660048201529051610100909204600160a060020a03169450600091859163072024609160248083019260e092919082900301818787803b158015610bac57600080fd5b505af1158015610bc0573d6000803e3d6000fd5b505050506040513d60e0811015610bd657600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08f015263ffffffff9081169a8e019a909a52908916908c0152908716908a01819052600160a060020a039091169189019190915293169086015267ffffffffffffffff16845260009150610c5190612b06565b60ff169450600090505b6006811015610d0f576040805160e060020a6362b21ad70281526003600482015267ffffffffffffffff88166024820152604481018390529051600160a060020a038616916362b21ad79160648083019260209291908290030181600087803b158015610cc757600080fd5b505af1158015610cdb573d6000803e3d6000fd5b505050506040513d6020811015610cf157600080fd5b505160ff16828260068110610d0257fe5b6020020152600101610c5b565b5060005b6006811015610dd1576020838101516040805160e060020a6362b21ad70281526001600482015263ffffffff909216602483015260448201849052518792600160a060020a038816926362b21ad792606480830193928290030181600087803b158015610d7f57600080fd5b505af1158015610d93573d6000803e3d6000fd5b505050506040513d6020811015610da957600080fd5b505160ff1602600302828260068110610dbe57fe5b6020020180519091019052600101610d13565b5060a081015160808201516060830151604084015160208501519451600695010101010104949350505050565b60088054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610e8a5780601f10610e5f57610100808354040283529160200191610e8a565b820191906000526020600020905b815481529060010190602001808311610e6d57829003601f168201915b5050505050905090565b600080610e9f613ee1565b6003546040805160e560020a6239012302815267ffffffffffffffff871660048201529051610100909204600160a060020a03169350839163072024609160248082019260e0929091908290030181600087803b158015610eff57600080fd5b505af1158015610f13573d6000803e3d6000fd5b505050506040513d60e0811015610f2957600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08d015263ffffffff9081169a8c019a909a52908916908a015290871690880152600160a060020a031690860181905293169084015267ffffffffffffffff1682521515610f9d57600080fd5b600084815260066020526040902054600160a060020a031692505b5050919050565b6000610fc9613ee1565b600080600360019054906101000a9004600160a060020a0316935083600160a060020a03166307202460866040518263ffffffff1660e060020a028152600401808267ffffffffffffffff1667ffffffffffffffff16815260200191505060e060405180830381600087803b15801561104157600080fd5b505af1158015611055573d6000803e3d6000fd5b505050506040513d60e081101561106b57600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08f015263ffffffff9081169a8e019a909a52908916908c0152908716908a0152600160a060020a031690880181905293169086015267ffffffffffffffff16845215156110df57600080fd5b6110ec8360400151613508565b50506004805460055483516040805160e060020a6335f097f302815267ffffffffffffffff909216948201949094529251600160a060020a0392831693919092169183916335f097f39160248083019260209291908290030181600087803b15801561115757600080fd5b505af115801561116b573d6000803e3d6000fd5b505050506040513d602081101561118157600080fd5b50518061120d575082516040805160e260020a632a11e9c702815267ffffffffffffffff909216600483015251600160a060020a0383169163a847a71c9160248083019260209291908290030181600087803b1580156111e057600080fd5b505af11580156111f4573d6000803e3d6000fd5b505050506040513d602081101561120a57600080fd5b50515b1561121757600080fd5b6040830151600160a060020a038781169116141561123457600080fd5b600085815260066020526040808220805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038a811691821790925586830151925189949193909216917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a4505050505050565b6001546000908190819081908190600160a060020a03163314806112df57503360009081526002602052604090205460ff1615156001145b15156112ea57600080fd5b6003546040517ffc4d20f500000000000000000000000000000000000000000000000000000000815263ffffffff8b1660048201908152600160a060020a038b81166024840152606060448401908152606484018b9052610100909404169650869263fc4d20f5928d928d928d928d929190608401848480828437820191505095505050505050602060405180830381600087803b15801561138b57600080fd5b505af115801561139f573d6000803e3d6000fd5b505050506040513d60208110156113b557600080fd5b5051600b549093506113d990899060001943019067ffffffffffffffff871661157a565b600b555060005b6006811015611534576040805160e060020a6362b21ad70281526002600482015263ffffffff8b166024820152604481018390529051600160a060020a038616916362b21ad79160648083019260209291908290030181600087803b15801561144857600080fd5b505af115801561145c573d6000803e3d6000fd5b505050506040513d602081101561147257600080fd5b5051600b546020900601915083600160a060020a03166326bda739600385856040518463ffffffff1660e060020a028152600401808460048111156114b357fe5b60ff1681526020018367ffffffffffffffff1667ffffffffffffffff1681526020018260ff1660ff1681526020019350505050602060405180830381600087803b15801561150057600080fd5b505af1158015611514573d6000803e3d6000fd5b505050506040513d602081101561152a57600080fd5b50506001016113e0565b60405167ffffffffffffffff841690600160a060020a038a1690600090600080516020614046833981519152908290a4505067ffffffffffffffff169695505050505050565b6040805184406020808301919091526c01000000000000000000000000600160a060020a0388160282840152605482018590526074808301859052835180840390910181526094909201928390528151600093918291908401908083835b602083106115f75780518252601f1990920191602091820191016115d8565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912098975050505050505050565b600154600160a060020a031633148061165957503360009081526002602052604090205460ff1615156001145b151561166457600080fd5b60038054600160a060020a039485166101000274ffffffffffffffffffffffffffffffffffffffff00199091161790556004805492841673ffffffffffffffffffffffffffffffffffffffff1993841617905560058054919093169116179055565b6003546101009004600160a060020a031681565b60026020526000908152604090205460ff1681565b600154600160a060020a031633148061171c57503360009081526002602052604090205460ff1615156001145b151561172757600080fd5b6117618383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375061354d945050505050565b505050565b600080600360019054906101000a9004600160a060020a0316905080600160a060020a0316637a09defe6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156117bf57600080fd5b505af11580156117d3573d6000803e3d6000fd5b505050506040513d60208110156117e957600080fd5b505167ffffffffffffffff1691505b5090565b6000611806613ee1565b6003546040805160e560020a6239012302815267ffffffffffffffff861660048201529051610100909204600160a060020a03169350839163072024609160248082019260e0929091908290030181600087803b15801561186657600080fd5b505af115801561187a573d6000803e3d6000fd5b505050506040513d60e081101561189057600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08d015263ffffffff9081169a8c019a909a52908916908a015290871690880152600160a060020a031690860181905293169084015267ffffffffffffffff168252151561190457600080fd5b61191283826040015161356c565b84600160a060020a03168160400151600160a060020a031614151561193657600080fd5b600160a060020a038416151561194b57600080fd5b61195a8160400151858561370e565b5050505050565b600080600160a060020a038416151561197957600080fd5b50600354604080517f75fe2e33000000000000000000000000000000000000000000000000000000008152600160a060020a0386811660048301526024820186905291516101009093049091169182916375fe2e339160448083019260209291908290030181600087803b1580156119f057600080fd5b505af1158015611a04573d6000803e3d6000fd5b505050506040513d6020811015611a1a57600080fd5b505167ffffffffffffffff16949350505050565b60015460009081908190600160a060020a0316331480611a6257503360009081526002602052604090205460ff1615156001145b1515611a6d57600080fd5b506001915060649050805b606460ff8416116117615760ff83166000908152600c60205260409020805463ffffffff191663ffffffff83811691909117909155600190930192600a90600b8402160460050191508181019050611a78565b6000806000806000806000806000611ae1613ee1565b611ae9613f24565b6003546040805160e560020a6239012302815267ffffffffffffffff8f1660048201529051610100909204600160a060020a03169450600091859163072024609160248083019260e092919082900301818787803b158015611b4a57600080fd5b505af1158015611b5e573d6000803e3d6000fd5b505050506040513d60e0811015611b7457600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08f015263ffffffff9081169a8e019a909a52908916908c0152908716908a01819052600160a060020a039091169189019190915293169086015267ffffffffffffffff16845260009150611bef90612b06565b60ff169a50600090505b6006811015611cc65783600160a060020a03166362b21ad760038f846040518463ffffffff1660e060020a02815260040180846004811115611c3757fe5b60ff1681526020018367ffffffffffffffff1667ffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015611c7e57600080fd5b505af1158015611c92573d6000803e3d6000fd5b505050506040513d6020811015611ca857600080fd5b505160ff16828260068110611cb957fe5b6020020152600101611bf9565b5060005b6006811015611d88576020838101516040805160e060020a6362b21ad70281526001600482015263ffffffff909216602483015260448201849052518d92600160a060020a038816926362b21ad792606480830193928290030181600087803b158015611d3657600080fd5b505af1158015611d4a573d6000803e3d6000fd5b505050506040513d6020811015611d6057600080fd5b505160ff1602600302828260068110611d7557fe5b6020020180519091019052600101611cca565b60808301518b8360006020020151846001602002015185600260200201518660036020020151876004602002015188600560200201518763ffffffff1697509b509b509b509b509b509b509b509b5050505050919395975091939597565b600454600160a060020a031681565b6117618383836020604051908101604052806000815250613871565b600154600160a060020a0316331480611e3e57503360009081526002602052604090205460ff1615156001145b1515611e4957600080fd5b63ffffffff919091166000908152600d60205260409020805460ff1916911515919091179055565b600154600160a060020a03163314611e8857600080fd5b6003805460ff1916911515919091179055565b602081565b60015474010000000000000000000000000000000000000000900461ffff1681565b90565b600154600160a060020a03163314611edc57600080fd5b3031811115611eea57600080fd5b604051600160a060020a0383169082156108fc029083906000818181858888f19350505050158015611761573d6000803e3d6000fd5b600154600160a060020a0316331480611f4d57503360009081526002602052604090205460ff1615156001145b1515611f5857600080fd5b6010805461ffff191661ffff92909216919091179055565b600080611f7b613ee1565b6003546040805160e560020a6239012302815267ffffffffffffffff871660048201529051610100909204600160a060020a03169350839163072024609160248082019260e0929091908290030181600087803b158015611fdb57600080fd5b505af1158015611fef573d6000803e3d6000fd5b505050506040513d60e081101561200557600080fd5b5080516020808301516040840151606085015160808087015160a08089015160c0998a015160e08c015263ffffffff908116998b0199909952908816908901529086169087015293169084015267ffffffffffffffff1682529250600160a060020a0383161515610fb857600080fd5b600154600160a060020a0316331461208c57600080fd5b600160a060020a03811660009081526002602052604090205460ff16151561211957600160a060020a0381166000908152600260205260409020805460ff19166001908117909155805461ffff74010000000000000000000000000000000000000000808304821684019091160275ffff0000000000000000000000000000000000000000199091161790555b50565b600080600160a060020a038316151561213457600080fd5b50600354604080517f47c17bac000000000000000000000000000000000000000000000000000000008152600160a060020a03858116600483015291516101009093049091169182916347c17bac9160248083019260209291908290030181600087803b1580156121a457600080fd5b505af11580156121b8573d6000803e3d6000fd5b505050506040513d60208110156121ce57600080fd5b50519392505050565b600c6020526000908152604090205463ffffffff1681565b600154600160a060020a031633148061221c57503360009081526002602052604090205460ff1615156001145b151561222757600080fd5b61211981613b4b565b600154600160a060020a031633148061225d57503360009081526002602052604090205460ff1615156001145b151561226857600080fd5b600f55565b600154600160a060020a031633148061229a57503360009081526002602052604090205460ff1615156001145b15156122a557600080fd5b6121198167ffffffffffffffff16613b93565b6000806122c3613ee1565b600080600360019054906101000a9004600160a060020a0316935083600160a060020a03166307202460876040518263ffffffff1660e060020a028152600401808267ffffffffffffffff1667ffffffffffffffff16815260200191505060e060405180830381600087803b15801561233b57600080fd5b505af115801561234f573d6000803e3d6000fd5b505050506040513d60e081101561236557600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08f015263ffffffff9081169a8e019a909a52908916908c0152908716908a0152600160a060020a031690880152929092169185019190915267ffffffffffffffff908116808552908716146123e55760009450612534565b86600160a060020a03168360400151600160a060020a031614151561240d5760009450612534565b50506004805460055483516040805160e060020a6335f097f302815267ffffffffffffffff909216948201949094529251600160a060020a0392831693919092169183916335f097f39160248083019260209291908290030181600087803b15801561247857600080fd5b505af115801561248c573d6000803e3d6000fd5b505050506040513d60208110156124a257600080fd5b5051158015612531575082516040805160e260020a632a11e9c702815267ffffffffffffffff909216600483015251600160a060020a0383169163a847a71c9160248083019260209291908290030181600087803b15801561250357600080fd5b505af1158015612517573d6000803e3d6000fd5b505050506040513d602081101561252d57600080fd5b5051155b94505b5050505092915050565b6000612548613ee1565b60035460ff161561255857600080fd5b6003546040805160e560020a6239012302815267ffffffffffffffff881660048201529051610100909204600160a060020a03169350839163072024609160248082019260e0929091908290030181600087803b1580156125b857600080fd5b505af11580156125cc573d6000803e3d6000fd5b505050506040513d60e08110156125e257600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08d015263ffffffff9081169a8c019a909a52908916908a015290871690880152600160a060020a031690860152929092169183019190915267ffffffffffffffff90811680835290861614158061266e57506040810151600160a060020a03163314155b1561267857600080fd5b608081015160a08083015160c08401516040517f32666a3100000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8a166004820190815263ffffffff80871660448401528085166064840152831660848301526024820194855260a48201899052600160a060020a038816956332666a31958c958c958c959394919390929060c4018787808284378201915050975050505050505050600060405180830381600087803b15801561273957600080fd5b505af115801561274d573d6000803e3d6000fd5b505050505050505050565b600154600160a060020a031681565b6000806000806000612777613f43565b600354604080517f9d29cac400000000000000000000000000000000000000000000000000000000815263ffffffff8a1660048201529051610100909204600160a060020a031693508391639d29cac49160248082019260a0929091908290030181600087803b1580156127ea57600080fd5b505af11580156127fe573d6000803e3d6000fd5b505050506040513d60a081101561281457600080fd5b508051602080830151604080850151606080870151608097880151151597890188905263ffffffff90811691890182905292880182905293870183905293169094529299909850919650945092505050565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610e8a5780601f10610e5f57610100808354040283529160200191610e8a565b600160a060020a03821615156128dc57600080fd5b336000818152600760209081526040808320600160a060020a03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b6000612954613ee1565b6003546040805160e560020a6239012302815267ffffffffffffffff861660048201529051610100909204600160a060020a03169350839163072024609160248082019260e0929091908290030181600087803b1580156129b457600080fd5b505af11580156129c8573d6000803e3d6000fd5b505050506040513d60e08110156129de57600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08d015263ffffffff9081169a8c019a909a52908916908a015290871690880152600160a060020a031690860181905293169084015267ffffffffffffffff1682521515612a5257600080fd5b612a6083826040015161356c565b6040810151600160a060020a03163314612a7957600080fd5b600160a060020a0384161515612a8e57600080fd5b612a9d8160400151858561370e565b50505050565b600154600160a060020a0316331480612ad057503360009081526002602052604090205460ff1615156001145b1515612adb57600080fd5b600160a060020a03919091166000908152600e60205260409020805460ff1916911515919091179055565b600060016064825b8160ff168360ff161015612b6057600260ff848401160460ff81166000908152600c602052604090205490915063ffffffff9081169086161015612b5457809150612b5b565b8060010192505b612b0e565b50909392505050565b600154600160a060020a03163314612b8057600080fd5b600160a060020a03811660009081526002602052604090205460ff1615156001141561211957600160a060020a03166000908152600260205260409020805460ff191690556001805475ffff0000000000000000000000000000000000000000198116740100000000000000000000000000000000000000009182900461ffff9081166000190116909102179055565b61195a85858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843750613871945050505050565b600080612c57613f43565b60035460009081908190819060ff1615612c7057600080fd5b600354604080517f9d29cac400000000000000000000000000000000000000000000000000000000815263ffffffff8d1660048201529051610100909204600160a060020a031697508791639d29cac49160248082019260a0929091908290030181600087803b158015612ce357600080fd5b505af1158015612cf7573d6000803e3d6000fd5b505050506040513d60a0811015612d0d57600080fd5b5080516020808301516040808501516060808701516080978801511515978d019790975263ffffffff968716908c0152908a015290880152168086521515612d5457600080fd5b60808501511515612d9e57336000908152600e602052604090205460ff161580612d94575063ffffffff8a166000908152600d602052604090205460ff16155b15612d9e57600080fd5b846020015193506000856060015163ffffffff161115612de8576010546060860151602087015161ffff9092169160001990910163ffffffff1602811515612de257fe5b04840193505b83600f5434011015612df957600080fd5b85600160a060020a031663fc4d20f58b8d8c8c6040518563ffffffff1660e060020a028152600401808563ffffffff1663ffffffff16815260200184600160a060020a0316600160a060020a03168152602001806020018281038252848482818152602001925080828437820191505095505050505050602060405180830381600087803b158015612e8a57600080fd5b505af1158015612e9e573d6000803e3d6000fd5b505050506040513d6020811015612eb457600080fd5b5051600b54909350612ed8908c9060001943019067ffffffffffffffff871661157a565b600b555060005b6006811015613033576040805160e060020a6362b21ad70281526002600482015263ffffffff8c166024820152604481018390529051600160a060020a038816916362b21ad79160648083019260209291908290030181600087803b158015612f4757600080fd5b505af1158015612f5b573d6000803e3d6000fd5b505050506040513d6020811015612f7157600080fd5b5051600b546020900601915085600160a060020a03166326bda739600385856040518463ffffffff1660e060020a02815260040180846004811115612fb257fe5b60ff1681526020018367ffffffffffffffff1667ffffffffffffffff1681526020018260ff1660ff1681526020019350505050602060405180830381600087803b158015612fff57600080fd5b505af1158015613013573d6000803e3d6000fd5b505050506040513d602081101561302957600080fd5b5050600101612edf565b60405167ffffffffffffffff841690600160a060020a038d1690600090600080516020614046833981519152908290a4505067ffffffffffffffff1698975050505050505050565b600f5481565b600154600160a060020a03163314806130ae57503360009081526002602052604090205460ff1615156001145b15156130b957600080fd5b6130c281613b4b565b8082600160a060020a031684600160a060020a031660008051602061404683398151915260405160405180910390a4505050565b6000818152600a602090815260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084526060939283018282801561318b5780601f106131605761010080835404028352916020019161318b565b820191906000526020600020905b81548152906001019060200180831161316e57829003601f168201915b50505050509050919050565b60008060008060008060006131aa613f24565b6003546101009004600160a060020a0316915060005b6006811015613274576040805160e060020a6362b21ad70281526003600482015267ffffffffffffffff8c166024820152604481018390529051600160a060020a038516916362b21ad79160648083019260209291908290030181600087803b15801561322c57600080fd5b505af1158015613240573d6000803e3d6000fd5b505050506040513d602081101561325657600080fd5b505160ff1682826006811061326757fe5b60200201526001016131c0565b508051602082015160408301516060840151608085015160a090950151939d929c50909a509850919650945092505050565b600681565b60008060006132b8613f43565b600354604080517f9d29cac400000000000000000000000000000000000000000000000000000000815263ffffffff881660048201529051610100909204600160a060020a031693508391639d29cac49160248082019260a0929091908290030181600087803b15801561332b57600080fd5b505af115801561333f573d6000803e3d6000fd5b505050506040513d60a081101561335557600080fd5b50805160208083015160408085015160608087015160809788015115159789019790975263ffffffff96871690880181905291870152918501819052929091168352909350600010156133d2576010546060820151602083015161ffff9092169160001990910163ffffffff16028115156133cc57fe5b04830192505b6080810151151561342957336000908152600e602052604090205460ff161515600114801561341b575063ffffffff85166000908152600d602052604090205460ff1615156001145b156134295760019350613431565b608081015193505b5050915091565b60105461ffff1681565b6000600160a060020a038316151561345957600080fd5b600160a060020a038216151561346e57600080fd5b50600160a060020a03918216600090815260076020908152604080832093909416825291909152205460ff1690565b60035460ff1681565b600154600160a060020a031633146134bd57600080fd5b600160a060020a038116156121195760018054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff1990911617905550565b600554600160a060020a031681565b600160a060020a0381163314806135425750600160a060020a038116600090815260076020908152604080832033845290915290205460ff165b151561211957600080fd5b6000828152600a60209081526040909120825161176192840190613f71565b600480546005546040805160e060020a6335f097f302815267ffffffffffffffff87169481019490945251600160a060020a0392831693919092169183916335f097f39160248083019260209291908290030181600087803b1580156135d157600080fd5b505af11580156135e5573d6000803e3d6000fd5b505050506040513d60208110156135fb57600080fd5b505115801561368857506040805160e260020a632a11e9c702815267ffffffffffffffff861660048201529051600160a060020a0383169163a847a71c9160248083019260209291908290030181600087803b15801561365a57600080fd5b505af115801561366e573d6000803e3d6000fd5b505050506040513d602081101561368457600080fd5b5051155b151561369357600080fd5b600160a060020a03831615156136a857600080fd5b600160a060020a0383163314806136d55750600084815260066020526040902054600160a060020a031633145b806137035750600160a060020a038316600090815260076020908152604080832033845290915290205460ff165b1515612a9d57600080fd5b600061371982613b4b565b50600354604080517f60c6ccb2000000000000000000000000000000000000000000000000000000008152600160a060020a03868116600483015267ffffffffffffffff8516602483015291516101009093049091169182916360c6ccb291604480830192600092919082900301818387803b15801561379857600080fd5b505af11580156137ac573d6000803e3d6000fd5b5050604080517f9248019e000000000000000000000000000000000000000000000000000000008152600160a060020a03878116600483015267ffffffffffffffff8716602483015291519185169350639248019e925060448082019260009290919082900301818387803b15801561382457600080fd5b505af1158015613838573d6000803e3d6000fd5b505050508183600160a060020a031685600160a060020a031660008051602061404683398151915260405160405180910390a450505050565b600061387b613ee1565b6003546040805160e560020a6239012302815267ffffffffffffffff871660048201529051610100909204600160a060020a03169350600091849163072024609160248083019260e092919082900301818787803b1580156138dc57600080fd5b505af11580156138f0573d6000803e3d6000fd5b505050506040513d60e081101561390657600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08e015263ffffffff9081169a8d019a909a52908916908b015290871690890152600160a060020a031690870181905293169085015267ffffffffffffffff168352151561397a57600080fd5b61398885836040015161356c565b86600160a060020a03168260400151600160a060020a03161415156139ac57600080fd5b600160a060020a03861615156139c157600080fd5b6139d08260400151878761370e565b6139e286600160a060020a0316613bda565b15613b42576040517f150b7a020000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a038a8116602485015260448401899052608060648501908152885160848601528851918b169463150b7a0294938d938c938c93909160a490910190602085019080838360005b83811015613a7a578181015183820152602001613a62565b50505050905090810190601f168015613aa75780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015613ac957600080fd5b505af1158015613add573d6000803e3d6000fd5b505050506040513d6020811015613af357600080fd5b505190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1981167f150b7a020000000000000000000000000000000000000000000000000000000014613b4257600080fd5b50505050505050565b600081815260066020526040902054600160a060020a031615612119576000908152600660205260409020805473ffffffffffffffffffffffffffffffffffffffff19169055565b613b9c81613be2565b6000818152600a60205260409020546002600019610100600184161502019091160415612119576000818152600a6020526040812061211991613feb565b6000903b1190565b6000613bec613ee1565b600080613bf885613b4b565b6003546040805160e560020a6239012302815267ffffffffffffffff881660048201529051610100909204600160a060020a03169550859163072024609160248082019260e0929091908290030181600087803b158015613c5857600080fd5b505af1158015613c6c573d6000803e3d6000fd5b505050506040513d60e0811015613c8257600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08f015263ffffffff9081169a8e019a909a52908916908c0152908716908a0152600160a060020a031690880181905293169086015267ffffffffffffffff1684521515613cf657600080fd5b50506004805460055483516040805160e060020a6335f097f302815267ffffffffffffffff909216948201949094529251600160a060020a0392831693919092169183916335f097f39160248083019260209291908290030181600087803b158015613d6157600080fd5b505af1158015613d75573d6000803e3d6000fd5b505050506040513d6020811015613d8b57600080fd5b505180613e17575082516040805160e260020a632a11e9c702815267ffffffffffffffff909216600483015251600160a060020a0383169163a847a71c9160248083019260209291908290030181600087803b158015613dea57600080fd5b505af1158015613dfe573d6000803e3d6000fd5b505050506040513d6020811015613e1457600080fd5b50515b15613e2157600080fd5b60408084015181517f60c6ccb2000000000000000000000000000000000000000000000000000000008152600160a060020a03918216600482015267ffffffffffffffff881660248201529151908616916360c6ccb291604480830192600092919082900301818387803b158015613e9857600080fd5b505af1158015613eac573d6000803e3d6000fd5b5050506040808501519051879250600091600160a060020a031690600080516020614046833981519152908390a45050505050565b60408051610100810182526000808252602082018190529181018290526060808201526080810182905260a0810182905260c0810182905260e081019190915290565b60c0604051908101604052806006906020820280388339509192915050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613fb257805160ff1916838001178555613fdf565b82800160010185558215613fdf579182015b82811115613fdf578251825591602001919060010190613fc4565b506117f892915061402b565b50805460018160011615610100020316600290046000825580601f106140115750612119565b601f01602090049060005260206000209081019061211991905b611ec291905b808211156117f857600081556001016140315600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a7230582089a567cea9b3bb8422cf1b9a2493b8775bc1007b0c9f0a20c9626c790722f9b60029

Swarm Source

bzzr://89a567cea9b3bb8422cf1b9a2493b8775bc1007b0c9f0a20c9626c790722f9b6
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.