Contract 0x4d3814D4DA8083b41861dEC2F45B4840e8b72d68 2

 
Txn Hash Method
Block
From
To
Value
0xf8c442727fc453b2dd34d79ef6ce71f1c69f5a855f0d61b63eb27220ccfe8427Transfer From(pending)2021-10-24 15:41:486 mins ago0x4fdb4b85244a8a64f48236cf6c6762f815c04096 IN 0x4d3814d4da8083b41861dec2f45b4840e8b72d680 Ether(Pending)(Pending)
0x13c254fde3472a7e4e52819c657d2e3b2b48b04cef7b72a57899ec79fb614bbdBatch Spawn Asse...134241992021-10-15 18:18:238 days 21 hrs ago0xf37c7e281c6bb8507467a0acf1f1a5f095bb5151 IN  0x4d3814d4da8083b41861dec2f45b4840e8b72d680 Ether0.054251752226
0x285f9f888225625bb599acccf7af6aae6cebce08d1984a43965adca5099e323aSet Approval For...133396112021-10-02 11:34:3422 days 4 hrs ago0xee5280e9eb7b9d33ca03332db7382b24f4a2d009 IN  0x4d3814d4da8083b41861dec2f45b4840e8b72d680 Ether0.002652316453 56.168155134
0x0d0dfca8772d44f4df4b518e5dfa001b15986b45bd34a8b4cf16900aa3ed9ad6Transfer From133382882021-10-02 6:33:3622 days 9 hrs ago0xddb74dddb5be31f3a357a19f8bebcfe3f9723368 IN  0x4d3814d4da8083b41861dec2f45b4840e8b72d680 Ether0.003810138294 39.128104409
0x5bdbd9e01d82b2fd932d3755bdf4b54d69f4b59a3cc0fce116d6d05c0b92f317Transfer From133290072021-09-30 19:42:5123 days 20 hrs ago0x63244b5f1ebcb999ea012da652dffee6653bf8f5 IN  0x4d3814d4da8083b41861dec2f45b4840e8b72d680 Ether0.012595607232 126.365496537
0x17aeea3022eb680f176c56722459093cb902069518490230fd1f20b0232648e1Set Approval For...133274122021-09-30 13:45:3824 days 2 hrs ago0x4c40468a127ced157a4b21bf927fe471033d4770 IN  0x4d3814d4da8083b41861dec2f45b4840e8b72d680 Ether0.004187025503 88.691255977
0xef1b4f647d875fea9c5283ca236e3f3a7b28ecb0dde5972068cd087412ab29b6Batch Spawn Asse...132901902021-09-24 18:51:5229 days 20 hrs ago0xf37c7e281c6bb8507467a0acf1f1a5f095bb5151 IN  0x4d3814d4da8083b41861dec2f45b4840e8b72d680 Ether0.0337338378
0xea23205c8caf90cdb618393d4daa6445a2f850921013a7bab59952874405b9bfSet Approval For...132900542021-09-24 18:24:1229 days 21 hrs ago0x8f99446027f05462cf1cfadedffde3203a3c548c IN  0x4d3814d4da8083b41861dec2f45b4840e8b72d680 Ether0.002835958494 60.072411914
0xc3db7e27a70538c0d30478072f8c27bcbc65f91daa997a06130d60f1e9390a8bTransfer From132710162021-09-21 19:30:4232 days 20 hrs ago0xd81be2dd1fe5e3f9aada3ffea6d64e62506edacc IN  0x4d3814d4da8083b41861dec2f45b4840e8b72d680 Ether0.010725694491 107.592633936
0xff9247876de331fe35ccaf2f03a6e8a7c732d96670ac713f448e2f37bcb6f94bTransfer From132709972021-09-21 19:25:3432 days 20 hrs ago0xd81be2dd1fe5e3f9aada3ffea6d64e62506edacc IN  0x4d3814d4da8083b41861dec2f45b4840e8b72d680 Ether0.0123327222 123.713207214
0x9f721d092846a70adcd707349a18b93d691d5bd80010eb631b5a6674d9272193Set Approval For...132688022021-09-21 11:17:4933 days 4 hrs ago0x66eb3d80528c8dde86b379e507287bccd310fcab IN  0x4d3814d4da8083b41861dec2f45b4840e8b72d680 Ether0.001803157914 38.185508881
0x02899893e7fa83b1f62aebcd49778a50c30a5941e005872cfcff300cbf87ccfbBatch Spawn Asse...132009942021-09-10 23:26:2443 days 16 hrs ago0xf37c7e281c6bb8507467a0acf1f1a5f095bb5151 IN  0x4d3814d4da8083b41861dec2f45b4840e8b72d680 Ether0.12524971286
0xd78c5b2d0a35a7afbdb6cb351118b0104799d555c884d12848206c769e8ff5b4Batch Spawn Asse...132009822021-09-10 23:22:3143 days 16 hrs ago0xf37c7e281c6bb8507467a0acf1f1a5f095bb5151 IN  0x4d3814d4da8083b41861dec2f45b4840e8b72d680 Ether0.0854940387
0x4f498d6af17b95d29fe9d27c370d785d6b70d2d5b40f803bd94ecd77a2552365Batch Spawn Asse...132009622021-09-10 23:18:0743 days 16 hrs ago0xf37c7e281c6bb8507467a0acf1f1a5f095bb5151 IN  0x4d3814d4da8083b41861dec2f45b4840e8b72d680 Ether0.391221408204
0x491765e31e73d570c4175faf569a582b395dec666f983650a2a92a8ef0453b95Batch Spawn Asse...132009392021-09-10 23:13:5443 days 16 hrs ago0xf37c7e281c6bb8507467a0acf1f1a5f095bb5151 IN  0x4d3814d4da8083b41861dec2f45b4840e8b72d680 Ether0.11300935115
0xd5801bdebdeb4137584d89b438b18d3e899086b9af3a52f1efd0b942cf345a96Batch Spawn Asse...132009322021-09-10 23:11:2043 days 16 hrs ago0xf37c7e281c6bb8507467a0acf1f1a5f095bb5151 IN  0x4d3814d4da8083b41861dec2f45b4840e8b72d680 Ether0.0963036298
0xd5f8c5c7a68e1e963ebef82030cd3087562e68ff5f36864f9de7650c1a466f96Batch Spawn Asse...131996242021-09-10 18:18:5543 days 21 hrs ago0xf37c7e281c6bb8507467a0acf1f1a5f095bb5151 IN  0x4d3814d4da8083b41861dec2f45b4840e8b72d680 Ether0.112093794111
0xafb5ad0732c69f8a5c27c9e3f1c145418f23c47cbb526ac1e75249ad1b50d237Set Approval For...131934742021-09-09 19:37:4544 days 20 hrs ago0xc6aa469c8be10600532936935a63c973674adadd IN  0x4d3814d4da8083b41861dec2f45b4840e8b72d680 Ether0.003386016737 123.934582824
0x514c6ece7e554b02d9f0348f379cbee8b2dfb3a42dbf1d06f7ad5be8b6046265Set Approval For...131934742021-09-09 19:37:4544 days 20 hrs ago0xc6aa469c8be10600532936935a63c973674adadd IN  0x4d3814d4da8083b41861dec2f45b4840e8b72d680 Ether0.005852314935 123.934582824
0x80d1199ee1e05d81a4bc5ef0682e62325f2d07d2e93714401d8645243f055b2eTransfer From131869312021-09-08 19:03:0845 days 20 hrs ago0x49b74d33a6b3e03c96c8a9584866c9236b429be3 IN  0x4d3814d4da8083b41861dec2f45b4840e8b72d680 Ether0.016562348046 170.065593773
0xd0cfe2e0df70ee50fae309030975acfeb419d74877ade9223782c00a351c75bbSet Approval For...131866542021-09-08 18:03:5645 days 21 hrs ago0xa98134e1a6c341c9564987061568f4a3983c6dd3 IN  0x4d3814d4da8083b41861dec2f45b4840e8b72d680 Ether0.00749728358 158.770114569
0xdc542c8a675a18bcbf98a38f7ef4a4b52e93fbcf69eae6939da2c921b5c752b8Transfer From131655632021-09-05 11:57:3149 days 3 hrs ago0xdea7608e580b5d2af3ee58fa03144cbd4ae9c083 IN  0x4d3814d4da8083b41861dec2f45b4840e8b72d680 Ether0.003048624911 62.105298888
0x0336990a9d1be4e14caeb7ef77d273bff8658f010a85d79bd6ead2c10b517a0cTransfer From131567252021-09-04 3:14:0150 days 12 hrs ago0x2269914ab680f5ba01a05197429d72281ab101f5 IN  0x4d3814d4da8083b41861dec2f45b4840e8b72d680 Ether0.013588474025 136.32643791
0x6c6caa922b49d76565ede9bab4e26f6a4e5266b419d1d3e2f16a416bba14e816Transfer From131496602021-09-03 0:58:4151 days 14 hrs ago0x16ec5874193113e2d2df1798379d2b9da6983eb5 IN  0x4d3814d4da8083b41861dec2f45b4840e8b72d680 Ether0.00763862354 78.454290502
0x84500f3c5b97ca433353ce8066366ab2df94c96931bf25488a252c6ea65dbc51Transfer From131496532021-09-03 0:57:4651 days 14 hrs ago0x16ec5874193113e2d2df1798379d2b9da6983eb5 IN  0x4d3814d4da8083b41861dec2f45b4840e8b72d680 Ether0.011000403399 92.235740877
[ Download CSV Export 
View more zero value Internal Transactions in Advanced View mode
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CSCNFTFactory

Compiler Version
v0.4.23+commit.124ca40d

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-07-30
*/

pragma solidity ^0.4.23;

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

}

/* Controls state and access rights for contract functions
 * @title Operational Control
 * @author Fazri Zubair & Farhan Khwaja (Lucid Sight, Inc.)
 * Inspired and adapted from contract created by OpenZeppelin
 * Ref: https://github.com/OpenZeppelin/zeppelin-solidity/
 */
contract OperationalControl {
    // Facilitates access & control for the game.
    // Roles:
    //  -The Managers (Primary/Secondary): Has universal control of all elements (No ability to withdraw)
    //  -The Banker: The Bank can withdraw funds and adjust fees / prices.
    //  -otherManagers: Contracts that need access to functions for gameplay

    /// @dev Emited when contract is upgraded
    event ContractUpgrade(address newContract);

    // The addresses of the accounts (or contracts) that can execute actions within each roles.
    address public managerPrimary;
    address public managerSecondary;
    address public bankManager;

    // Contracts that require access for gameplay
    mapping(address => uint8) public otherManagers;

    // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked
    bool public paused = false;

    // @dev Keeps track whether the contract erroredOut. When that is true, most actions are blocked & refund can be claimed
    bool public error = false;

    /// @dev Operation modifiers for limiting access
    modifier onlyManager() {
        require(msg.sender == managerPrimary || msg.sender == managerSecondary);
        _;
    }

    modifier onlyBanker() {
        require(msg.sender == bankManager);
        _;
    }

    modifier onlyOtherManagers() {
        require(otherManagers[msg.sender] == 1);
        _;
    }


    modifier anyOperator() {
        require(
            msg.sender == managerPrimary ||
            msg.sender == managerSecondary ||
            msg.sender == bankManager ||
            otherManagers[msg.sender] == 1
        );
        _;
    }

    /// @dev Assigns a new address to act as the Other Manager. (State = 1 is active, 0 is disabled)
    function setOtherManager(address _newOp, uint8 _state) external onlyManager {
        require(_newOp != address(0));

        otherManagers[_newOp] = _state;
    }

    /// @dev Assigns a new address to act as the Primary Manager.
    function setPrimaryManager(address _newGM) external onlyManager {
        require(_newGM != address(0));

        managerPrimary = _newGM;
    }

    /// @dev Assigns a new address to act as the Secondary Manager.
    function setSecondaryManager(address _newGM) external onlyManager {
        require(_newGM != address(0));

        managerSecondary = _newGM;
    }

    /// @dev Assigns a new address to act as the Banker.
    function setBanker(address _newBK) external onlyManager {
        require(_newBK != address(0));

        bankManager = _newBK;
    }

    /*** Pausable functionality adapted from OpenZeppelin ***/

    /// @dev Modifier to allow actions only when the contract IS NOT paused
    modifier whenNotPaused() {
        require(!paused);
        _;
    }

    /// @dev Modifier to allow actions only when the contract IS paused
    modifier whenPaused {
        require(paused);
        _;
    }

    /// @dev Modifier to allow actions only when the contract has Error
    modifier whenError {
        require(error);
        _;
    }

    /// @dev Called by any Operator role to pause the contract.
    /// Used only if a bug or exploit is discovered (Here to limit losses / damage)
    function pause() external onlyManager whenNotPaused {
        paused = true;
    }

    /// @dev Unpauses the smart contract. Can only be called by the Game Master
    /// @notice This is public rather than external so it can be called by derived contracts. 
    function unpause() public onlyManager whenPaused {
        // can't unpause if contract was upgraded
        paused = false;
    }

    /// @dev Unpauses the smart contract. Can only be called by the Game Master
    /// @notice This is public rather than external so it can be called by derived contracts. 
    function hasError() public onlyManager whenPaused {
        error = true;
    }

    /// @dev Unpauses the smart contract. Can only be called by the Game Master
    /// @notice This is public rather than external so it can be called by derived contracts. 
    function noError() public onlyManager whenPaused {
        error = false;
    }
}

/**
 * @title ERC721 Non-Fungible Token Standard basic interface
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Basic {
    event Transfer(
        address indexed _from,
        address indexed _to,
        uint256 _tokenId
    );
    event Approval(
        address indexed _owner,
        address indexed _approved,
        uint256 _tokenId
    );
    event ApprovalForAll(
        address indexed _owner,
        address indexed _operator,
        bool _approved
    );

    function balanceOf(address _owner) public view returns (uint256 _balance);
    function ownerOf(uint256 _tokenId) public view returns (address _owner);
    function exists(uint256 _tokenId) public view returns (bool _exists);

    function approve(address _to, uint256 _tokenId) public;
    function getApproved(uint256 _tokenId)
        public view returns (address _operator);

    function setApprovalForAll(address _operator, bool _approved) public;
    function isApprovedForAll(address _owner, address _operator)
        public view returns (bool);

    function transferFrom(address _from, address _to, uint256 _tokenId) public;
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) public;

    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _tokenId,
        bytes _data
    )
        public;
}

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Enumerable is ERC721Basic {
    function totalSupply() public view returns (uint256);
    function tokenOfOwnerByIndex(
        address _owner,
        uint256 _index
    )
        public
        view
        returns (uint256 _tokenId);

    function tokenByIndex(uint256 _index) public view returns (uint256);
}

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Metadata is ERC721Basic {
    function name() public view returns (string _name);
    function symbol() public view returns (string _symbol);
    function tokenURI(uint256 _tokenId) public view returns (string);
}

/**
 * @title ERC-721 Non-Fungible Token Standard, full implementation interface
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721 is ERC721Basic, ERC721Enumerable, ERC721Metadata {
}

/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721BasicToken is ERC721Basic {
    using SafeMath for uint256;
    using AddressUtils for address;

    // Equals to `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`
    // which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`
    bytes4 constant ERC721_RECEIVED = 0xf0b9e5ba;

    // Mapping from token ID to owner
    mapping (uint256 => address) internal tokenOwner;

    // Mapping from token ID to approved address
    mapping (uint256 => address) internal tokenApprovals;

    // Mapping from owner to number of owned token
    mapping (address => uint256) internal ownedTokensCount;

    // Mapping from owner to operator approvals
    mapping (address => mapping (address => bool)) internal operatorApprovals;

    /**
    * @dev Guarantees msg.sender is owner of the given token
    * @param _tokenId uint256 ID of the token to validate its ownership belongs to msg.sender
    */
    modifier onlyOwnerOf(uint256 _tokenId) {
        require(ownerOf(_tokenId) == msg.sender);
        _;
    }

    /**
    * @dev Checks msg.sender can transfer a token, by being owner, approved, or operator
    * @param _tokenId uint256 ID of the token to validate
    */
    modifier canTransfer(uint256 _tokenId) {
        require(isApprovedOrOwner(msg.sender, _tokenId));
        _;
    }

    /**
    * @dev Gets the balance of the specified address
    * @param _owner address to query the balance of
    * @return uint256 representing the amount owned by the passed address
    */
    function balanceOf(address _owner) public view returns (uint256) {
        require(_owner != address(0));
        return ownedTokensCount[_owner];
    }

    /**
    * @dev Gets the owner of the specified token ID
    * @param _tokenId uint256 ID of the token to query the owner of
    * @return owner address currently marked as the owner of the given token ID
    */
    function ownerOf(uint256 _tokenId) public view returns (address) {
        address owner = tokenOwner[_tokenId];
        require(owner != address(0));
        return owner;
    }

    /**
    * @dev Returns whether the specified token exists
    * @param _tokenId uint256 ID of the token to query the existence of
    * @return whether the token exists
    */
    function exists(uint256 _tokenId) public view returns (bool) {
        address owner = tokenOwner[_tokenId];
        return owner != address(0);
    }

    /**
    * @dev Approves another address to transfer the given token ID
    * @dev The zero address indicates there is no approved address.
    * @dev There can only be one approved address per token at a given time.
    * @dev Can only be called by the token owner or an approved operator.
    * @param _to address to be approved for the given token ID
    * @param _tokenId uint256 ID of the token to be approved
    */
    function approve(address _to, uint256 _tokenId) public {
        address owner = ownerOf(_tokenId);
        require(_to != owner);
        require(msg.sender == owner || isApprovedForAll(owner, msg.sender));

        if (getApproved(_tokenId) != address(0) || _to != address(0)) {
            tokenApprovals[_tokenId] = _to;
            emit Approval(owner, _to, _tokenId);
        }
    }

    /**
    * @dev Gets the approved address for a token ID, or zero if no address set
    * @param _tokenId uint256 ID of the token to query the approval of
    * @return address currently approved for the given token ID
    */
    function getApproved(uint256 _tokenId) public view returns (address) {
        return tokenApprovals[_tokenId];
    }

    /**
    * @dev Sets or unsets the approval of a given operator
    * @dev An operator is allowed to transfer all tokens of the sender on their behalf
    * @param _to operator address to set the approval
    * @param _approved representing the status of the approval to be set
    */
    function setApprovalForAll(address _to, bool _approved) public {
        require(_to != msg.sender);
        operatorApprovals[msg.sender][_to] = _approved;
        emit ApprovalForAll(msg.sender, _to, _approved);
    }

    /**
    * @dev Tells whether an operator is approved by a given owner
    * @param _owner owner address which you want to query the approval of
    * @param _operator operator address which you want to query the approval of
    * @return bool whether the given operator is approved by the given owner
    */
    function isApprovedForAll(
        address _owner,
        address _operator
    )
        public
        view
        returns (bool)
    {
        return operatorApprovals[_owner][_operator];
    }

    /**
    * @dev Transfers the ownership of a given token ID to another address
    * @dev Usage of this method is discouraged, use `safeTransferFrom` whenever possible
    * @dev Requires the msg sender to be the owner, approved, or operator
    * @param _from current owner of the token
    * @param _to address to receive the ownership of the given token ID
    * @param _tokenId uint256 ID of the token to be transferred
    */
    function transferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    )
        public
        canTransfer(_tokenId)
    {
        require(_from != address(0));
        require(_to != address(0));

        clearApproval(_from, _tokenId);
        removeTokenFrom(_from, _tokenId);
        addTokenTo(_to, _tokenId);

        emit Transfer(_from, _to, _tokenId);
    }

    /**
    * @dev Safely transfers the ownership of a given token ID to another address
    * @dev If the target address is a contract, it must implement `onERC721Received`,
    *  which is called upon a safe transfer, and return the magic value
    *  `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`; otherwise,
    *  the transfer is reverted.
    * @dev Requires the msg sender to be the owner, approved, or operator
    * @param _from current owner of the token
    * @param _to address to receive the ownership of the given token ID
    * @param _tokenId uint256 ID of the token to be transferred
    */
    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    )
        public
        canTransfer(_tokenId)
    {
        // solium-disable-next-line arg-overflow
        safeTransferFrom(_from, _to, _tokenId, "");
    }

    /**
    * @dev Safely transfers the ownership of a given token ID to another address
    * @dev If the target address is a contract, it must implement `onERC721Received`,
    *  which is called upon a safe transfer, and return the magic value
    *  `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`; otherwise,
    *  the transfer is reverted.
    * @dev Requires the msg sender to be the owner, approved, or operator
    * @param _from current owner of the token
    * @param _to address to receive the ownership of the given token ID
    * @param _tokenId uint256 ID of the token to be transferred
    * @param _data bytes data to send along with a safe transfer check
    */
    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _tokenId,
        bytes _data
    )
        public
        canTransfer(_tokenId)
    {
        transferFrom(_from, _to, _tokenId);
        // solium-disable-next-line arg-overflow
        require(checkAndCallSafeTransfer(_from, _to, _tokenId, _data));
    }

    /**
    * @dev Returns whether the given spender can transfer a given token ID
    * @param _spender address of the spender to query
    * @param _tokenId uint256 ID of the token to be transferred
    * @return bool whether the msg.sender is approved for the given token ID,
    *  is an operator of the owner, or is the owner of the token
    */
    function isApprovedOrOwner(
        address _spender,
        uint256 _tokenId
    )
        internal
        view
        returns (bool)
    {
        address owner = ownerOf(_tokenId);
        // Disable solium check because of
        // https://github.com/duaraghav8/Solium/issues/175
        // solium-disable-next-line operator-whitespace
        return (
        _spender == owner ||
        getApproved(_tokenId) == _spender ||
        isApprovedForAll(owner, _spender)
        );
    }

    /**
    * @dev Internal function to mint a new token
    * @dev Reverts if the given token ID already exists
    * @param _to The address that will own the minted token
    * @param _tokenId uint256 ID of the token to be minted by the msg.sender
    */
    function _mint(address _to, uint256 _tokenId) internal {
        require(_to != address(0));
        addTokenTo(_to, _tokenId);
        emit Transfer(address(0), _to, _tokenId);
    }

    /**
    * @dev Internal function to burn a specific token
    * @dev Reverts if the token does not exist
    * @param _tokenId uint256 ID of the token being burned by the msg.sender
    */
    function _burn(address _owner, uint256 _tokenId) internal {
        clearApproval(_owner, _tokenId);
        removeTokenFrom(_owner, _tokenId);
        emit Transfer(_owner, address(0), _tokenId);
    }

    /**
    * @dev Internal function to clear current approval of a given token ID
    * @dev Reverts if the given address is not indeed the owner of the token
    * @param _owner owner of the token
    * @param _tokenId uint256 ID of the token to be transferred
    */
    function clearApproval(address _owner, uint256 _tokenId) internal {
        require(ownerOf(_tokenId) == _owner);
        if (tokenApprovals[_tokenId] != address(0)) {
            tokenApprovals[_tokenId] = address(0);
            emit Approval(_owner, address(0), _tokenId);
        }
    }

    /**
    * @dev Internal function to add a token ID to the list of a given address
    * @param _to address representing the new owner of the given token ID
    * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address
    */
    function addTokenTo(address _to, uint256 _tokenId) internal {
        require(tokenOwner[_tokenId] == address(0));
        tokenOwner[_tokenId] = _to;
        ownedTokensCount[_to] = ownedTokensCount[_to].add(1);
    }

    /**
    * @dev Internal function to remove a token ID from the list of a given address
    * @param _from address representing the previous owner of the given token ID
    * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address
    */
    function removeTokenFrom(address _from, uint256 _tokenId) internal {
        require(ownerOf(_tokenId) == _from);
        ownedTokensCount[_from] = ownedTokensCount[_from].sub(1);
        tokenOwner[_tokenId] = address(0);
    }

    /**
    * @dev Internal function to invoke `onERC721Received` on a target address
    * @dev The call is not executed if the target address is not a contract
    * @param _from address representing the previous owner of the given token ID
    * @param _to target address that will receive the tokens
    * @param _tokenId uint256 ID of the token to be transferred
    * @param _data bytes optional data to send along with the call
    * @return whether the call correctly returned the expected magic value
    */
    function checkAndCallSafeTransfer(
        address _from,
        address _to,
        uint256 _tokenId,
        bytes _data
    )
        internal
        returns (bool)
    {
        if (!_to.isContract()) {
            return true;
        }
        bytes4 retval = ERC721Receiver(_to).onERC721Received(
        _from, _tokenId, _data);
        return (retval == ERC721_RECEIVED);
    }
}

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 *  from ERC721 asset contracts.
 */
contract ERC721Receiver {
    /**
    * @dev Magic value to be returned upon successful reception of an NFT
    *  Equals to `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`,
    *  which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`
    */
    bytes4 constant ERC721_RECEIVED = 0xf0b9e5ba;

    /**
    * @notice Handle the receipt of an NFT
    * @dev The ERC721 smart contract calls this function on the recipient
    *  after a `safetransfer`. This function MAY throw to revert and reject the
    *  transfer. This function MUST use 50,000 gas or less. Return of other
    *  than the magic value MUST result in the transaction being reverted.
    *  Note: the contract address is always the message sender.
    * @param _from The sending address
    * @param _tokenId The NFT identifier which is being transfered
    * @param _data Additional data with no specified format
    * @return `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`
    */
    function onERC721Received(
        address _from,
        uint256 _tokenId,
        bytes _data
    )
        public
        returns(bytes4);
}
contract ERC721Holder is ERC721Receiver {
    function onERC721Received(address, uint256, bytes) public returns(bytes4) {
        return ERC721_RECEIVED;
    }
}

/**
 * @title Full ERC721 Token
 * This implementation includes all the required and some optional functionality of the ERC721 standard
 * Moreover, it includes approve all functionality using operator terminology
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Token is ERC721, ERC721BasicToken {

    // Token name
    string internal name_;

    // Token symbol
    string internal symbol_;

    // Mapping from owner to list of owned token IDs
    mapping(address => uint256[]) internal ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) internal ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] internal allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) internal allTokensIndex;

    // Base Server Address for Token MetaData URI
    string internal tokenURIBase;

    /**
    * @dev Returns an URI for a given token ID. Only returns the based location, you will have to appending a token ID to this
    * @dev Throws if the token ID does not exist. May return an empty string.
    * @param _tokenId uint256 ID of the token to query
    */
    function tokenURI(uint256 _tokenId) public view returns (string) {
        require(exists(_tokenId));
        return tokenURIBase;
    }

    /**
    * @dev Gets the token ID at a given index of the tokens list of the requested owner
    * @param _owner address owning the tokens list to be accessed
    * @param _index uint256 representing the index to be accessed of the requested tokens list
    * @return uint256 token ID at the given index of the tokens list owned by the requested address
    */
    function tokenOfOwnerByIndex(
        address _owner,
        uint256 _index
    )
        public
        view
        returns (uint256)
    {
        require(_index < balanceOf(_owner));
        return ownedTokens[_owner][_index];
    }

    /**
    * @dev Gets the total amount of tokens stored by the contract
    * @return uint256 representing the total amount of tokens
    */
    function totalSupply() public view returns (uint256) {
        return allTokens.length;
    }

    /**
    * @dev Gets the token ID at a given index of all the tokens in this contract
    * @dev Reverts if the index is greater or equal to the total number of tokens
    * @param _index uint256 representing the index to be accessed of the tokens list
    * @return uint256 token ID at the given index of the tokens list
    */
    function tokenByIndex(uint256 _index) public view returns (uint256) {
        require(_index < totalSupply());
        return allTokens[_index];
    }


    /**
    * @dev Internal function to set the token URI for a given token
    * @dev Reverts if the token ID does not exist
    * @param _uri string URI to assign
    */
    function _setTokenURIBase(string _uri) internal {
        tokenURIBase = _uri;
    }

    /**
    * @dev Internal function to add a token ID to the list of a given address
    * @param _to address representing the new owner of the given token ID
    * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address
    */
    function addTokenTo(address _to, uint256 _tokenId) internal {
        super.addTokenTo(_to, _tokenId);
        uint256 length = ownedTokens[_to].length;
        ownedTokens[_to].push(_tokenId);
        ownedTokensIndex[_tokenId] = length;
    }

    /**
    * @dev Internal function to remove a token ID from the list of a given address
    * @param _from address representing the previous owner of the given token ID
    * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address
    */
    function removeTokenFrom(address _from, uint256 _tokenId) internal {
        super.removeTokenFrom(_from, _tokenId);

        uint256 tokenIndex = ownedTokensIndex[_tokenId];
        uint256 lastTokenIndex = ownedTokens[_from].length.sub(1);
        uint256 lastToken = ownedTokens[_from][lastTokenIndex];

        ownedTokens[_from][tokenIndex] = lastToken;
        ownedTokens[_from][lastTokenIndex] = 0;
        // Note that this will handle single-element arrays. In that case, both tokenIndex and lastTokenIndex are going to
        // be zero. Then we can make sure that we will remove _tokenId from the ownedTokens list since we are first swapping
        // the lastToken to the first position, and then dropping the element placed in the last position of the list

        ownedTokens[_from].length--;
        ownedTokensIndex[_tokenId] = 0;
        ownedTokensIndex[lastToken] = tokenIndex;
    }

    /**
    * @dev Gets the token name
    * @return string representing the token name
    */
    function name() public view returns (string) {
        return name_;
    }

    /**
    * @dev Gets the token symbol
    * @return string representing the token symbol
    */
    function symbol() public view returns (string) {
        return symbol_;
    }

    /**
    * @dev Internal function to mint a new token
    * @dev Reverts if the given token ID already exists
    * @param _to address the beneficiary that will own the minted token
    * @param _tokenId uint256 ID of the token to be minted by the msg.sender
    */
    function _mint(address _to, uint256 _tokenId) internal {
        super._mint(_to, _tokenId);

        allTokensIndex[_tokenId] = allTokens.length;
        allTokens.push(_tokenId);
    }

    /**
    * @dev Internal function to burn a specific token
    * @dev Reverts if the token does not exist
    * @param _owner owner of the token to burn
    * @param _tokenId uint256 ID of the token being burned by the msg.sender
    */
    function _burn(address _owner, uint256 _tokenId) internal {
        super._burn(_owner, _tokenId);

        // Reorg all tokens array
        uint256 tokenIndex = allTokensIndex[_tokenId];
        uint256 lastTokenIndex = allTokens.length.sub(1);
        uint256 lastToken = allTokens[lastTokenIndex];

        allTokens[tokenIndex] = lastToken;
        allTokens[lastTokenIndex] = 0;

        allTokens.length--;
        allTokensIndex[_tokenId] = 0;
        allTokensIndex[lastToken] = tokenIndex;
    }

    bytes4 constant InterfaceSignature_ERC165 = 0x01ffc9a7;
    /*
    bytes4(keccak256('supportsInterface(bytes4)'));
    */

    bytes4 constant InterfaceSignature_ERC721Enumerable = 0x780e9d63;
    /*
    bytes4(keccak256('totalSupply()')) ^
    bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) ^
    bytes4(keccak256('tokenByIndex(uint256)'));
    */

    bytes4 constant InterfaceSignature_ERC721Metadata = 0x5b5e139f;
    /*
    bytes4(keccak256('name()')) ^
    bytes4(keccak256('symbol()')) ^
    bytes4(keccak256('tokenURI(uint256)'));
    */

    bytes4 constant InterfaceSignature_ERC721 = 0x80ac58cd;
    /*
    bytes4(keccak256('balanceOf(address)')) ^
    bytes4(keccak256('ownerOf(uint256)')) ^
    bytes4(keccak256('approve(address,uint256)')) ^
    bytes4(keccak256('getApproved(uint256)')) ^
    bytes4(keccak256('setApprovalForAll(address,bool)')) ^
    bytes4(keccak256('isApprovedForAll(address,address)')) ^
    bytes4(keccak256('transferFrom(address,address,uint256)')) ^
    bytes4(keccak256('safeTransferFrom(address,address,uint256)')) ^
    bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)'));
    */

    bytes4 public constant InterfaceSignature_ERC721Optional =- 0x4f558e79;
    /*
    bytes4(keccak256('exists(uint256)'));
    */

    /**
    * @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).
    * @dev Returns true for any standardized interfaces implemented by this contract.
    * @param _interfaceID bytes4 the interface to check for
    * @return true for any standardized interfaces implemented by this contract.
    */
    function supportsInterface(bytes4 _interfaceID) external view returns (bool)
    {
        return ((_interfaceID == InterfaceSignature_ERC165)
        || (_interfaceID == InterfaceSignature_ERC721)
        || (_interfaceID == InterfaceSignature_ERC721Enumerable)
        || (_interfaceID == InterfaceSignature_ERC721Metadata));
    }

    function implementsERC721() public pure returns (bool) {
        return true;
    }

}

contract CSCNFTFactory is ERC721Token, OperationalControl {

    /*** EVENTS ***/
    /// @dev The Created event is fired whenever a new asset comes into existence.
    event AssetCreated(address owner, uint256 assetId, uint256 assetType, uint256 sequenceId, uint256 creationTime);

    event DetachRequest(address owner, uint256 assetId, uint256 timestamp);

    event NFTDetached(address requester, uint256 assetId);

    event NFTAttached(address requester, uint256 assetId);

    // Mapping from assetId to uint encoded data for NFT
    mapping(uint256 => uint256) internal nftDataA;
    mapping(uint256 => uint128) internal nftDataB;

    // Mapping from Asset Types to count of that type in exsistance
    mapping(uint32 => uint64) internal assetTypeTotalCount;

    mapping(uint32 => uint64) internal assetTypeBurnedCount;
  
    // Mapping from index of a Asset Type to get AssetID
    mapping(uint256 => mapping(uint32 => uint64) ) internal sequenceIDToTypeForID;

     // Mapping from Asset Type to string name of type
    mapping(uint256 => string) internal assetTypeName;

    // Mapping from assetType to creation limit
    mapping(uint256 => uint32) internal assetTypeCreationLimit;

    // Indicates if attached system is Active (Transfers will be blocked if attached and active)
    bool public attachedSystemActive;

    // Is Asset Burning Active
    bool public canBurn;

    // Time LS Oracle has to respond to detach requests
    uint32 public detachmentTime = 300;

    /**
    * @dev Constructor function
    */
    constructor() public {
        require(msg.sender != address(0));
        paused = true;
        error = false;
        canBurn = false;
        managerPrimary = msg.sender;
        managerSecondary = msg.sender;
        bankManager = msg.sender;

        name_ = "CSCNFTFactory";
        symbol_ = "CSCNFT";
    }

    /**
    * @dev Checks msg.sender can transfer a token, by being owner, approved, or operator
    * @param _tokenId uint256 ID of the token to validate
    */
    modifier canTransfer(uint256 _tokenId) {
        uint256 isAttached = getIsNFTAttached(_tokenId);
        if(isAttached == 2) {
            //One-Time Auth for Physical Card Transfers
            require(msg.sender == managerPrimary ||
                msg.sender == managerSecondary ||
                msg.sender == bankManager ||
                otherManagers[msg.sender] == 1
            );
            updateIsAttached(_tokenId, 1);
        } else if(attachedSystemActive == true && isAttached >= 1) {
            require(msg.sender == managerPrimary ||
                msg.sender == managerSecondary ||
                msg.sender == bankManager ||
                otherManagers[msg.sender] == 1
            );
        }
        else {
            require(isApprovedOrOwner(msg.sender, _tokenId));
        }
        
    _;
    }

    /** Public Functions */

    // Returns the AssetID for the Nth assetID for a specific type
    function getAssetIDForTypeSequenceID(uint256 _seqId, uint256 _type) public view returns (uint256 _assetID) {
        return sequenceIDToTypeForID[_seqId][uint32(_type)];
    }

    function getAssetDetails(uint256 _assetId) public view returns(
        uint256 assetId,
        uint256 ownersIndex,
        uint256 assetTypeSeqId,
        uint256 assetType,
        uint256 createdTimestamp,
        uint256 isAttached,
        address creator,
        address owner
    ) {
        require(exists(_assetId));

        uint256 nftData = nftDataA[_assetId];
        uint256 nftDataBLocal = nftDataB[_assetId];

        assetId = _assetId;
        ownersIndex = ownedTokensIndex[_assetId];
        createdTimestamp = uint256(uint48(nftData>>160));
        assetType = uint256(uint32(nftData>>208));
        assetTypeSeqId = uint256(uint64(nftDataBLocal));
        isAttached = uint256(uint48(nftDataBLocal>>64));
        creator = address(nftData);
        owner = ownerOf(_assetId);
    }

    function totalSupplyOfType(uint256 _type) public view returns (uint256 _totalOfType) {
        return assetTypeTotalCount[uint32(_type)] - assetTypeBurnedCount[uint32(_type)];
    }

    function totalCreatedOfType(uint256 _type) public view returns (uint256 _totalOfType) {
        return assetTypeTotalCount[uint32(_type)];
    }

    function totalBurnedOfType(uint256 _type) public view returns (uint256 _totalOfType) {
        return assetTypeBurnedCount[uint32(_type)];
    }

    function getAssetRawMeta(uint256 _assetId) public view returns(
        uint256 dataA,
        uint128 dataB
    ) {
        require(exists(_assetId));

        dataA = nftDataA[_assetId];
        dataB = nftDataB[_assetId];
    }

    function getAssetIdItemType(uint256 _assetId) public view returns(
        uint256 assetType
    ) {
        require(exists(_assetId));
        uint256 dataA = nftDataA[_assetId];
        assetType = uint256(uint32(dataA>>208));
    }

    function getAssetIdTypeSequenceId(uint256 _assetId) public view returns(
        uint256 assetTypeSequenceId
    ) {
        require(exists(_assetId));
        uint256 dataB = nftDataB[_assetId];
        assetTypeSequenceId = uint256(uint64(dataB));
    }
    
    function getIsNFTAttached( uint256 _assetId) 
    public view returns(
        uint256 isAttached
    ) {
        uint256 nftData = nftDataB[_assetId];
        isAttached = uint256(uint48(nftData>>64));
    }

    function getAssetIdCreator(uint256 _assetId) public view returns(
        address creator
    ) {
        require(exists(_assetId));
        uint256 dataA = nftDataA[_assetId];
        creator = address(dataA);
    }

    function isAssetIdOwnerOrApproved(address requesterAddress, uint256 _assetId) public view returns(
        bool
    ) {
        return isApprovedOrOwner(requesterAddress, _assetId);
    }

    function getAssetIdOwner(uint256 _assetId) public view returns(
        address owner
    ) {
        require(exists(_assetId));

        owner = ownerOf(_assetId);
    }

    function getAssetIdOwnerIndex(uint256 _assetId) public view returns(
        uint256 ownerIndex
    ) {
        require(exists(_assetId));
        ownerIndex = ownedTokensIndex[_assetId];
    }

    /// @param _owner The owner whose ships tokens we are interested in.
    /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly
    ///  expensive (it walks the entire NFT owners array looking for NFT belonging to owner),
    ///  but it also returns a dynamic array, which is only supported for web3 calls, and
    ///  not contract-to-contract calls.
    function tokensOfOwner(address _owner) external view returns(uint256[] ownerTokens) {
        uint256 tokenCount = balanceOf(_owner);

        if (tokenCount == 0) {
            // Return an empty array
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 resultIndex = 0;

            // We count on the fact that all Asset have IDs starting at 0 and increasing
            // sequentially up to the total count.
            uint256 _itemIndex;

            for (_itemIndex = 0; _itemIndex < tokenCount; _itemIndex++) {
                result[resultIndex] = tokenOfOwnerByIndex(_owner,_itemIndex);
                resultIndex++;
            }

            return result;
        }
    }

    // Get the name of the Asset type
    function getTypeName (uint32 _type) public returns(string) {
        return assetTypeName[_type];
    }


    /**
    * @dev Transfers the ownership of a given token ID to another address, modified to prevent transfer if attached and system is active
    */
    function transferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    )
        public
        canTransfer(_tokenId)
    {
        require(_from != address(0));
        require(_to != address(0));

        clearApproval(_from, _tokenId);
        removeTokenFrom(_from, _tokenId);
        addTokenTo(_to, _tokenId);

        emit Transfer(_from, _to, _tokenId);
    }
    

    
    function multiBatchTransferFrom(
        uint256[] _assetIds, 
        address[] _fromB, 
        address[] _toB) 
        public
    {
        uint256 _id;
        address _to;
        address _from;
        
        for (uint256 i = 0; i < _assetIds.length; ++i) {
            _id = _assetIds[i];
            _to = _toB[i];
            _from = _fromB[i];

            require(isApprovedOrOwner(msg.sender, _id));

            require(_from != address(0));
            require(_to != address(0));
    
            clearApproval(_from, _id);
            removeTokenFrom(_from, _id);
            addTokenTo(_to, _id);
    
            emit Transfer(_from, _to, _id);
        }
        
    }
    
    function batchTransferFrom(uint256[] _assetIds, address _from, address _to) 
        public
    {
        uint256 _id;
        
        for (uint256 i = 0; i < _assetIds.length; ++i) {
            _id = _assetIds[i];

            require(isApprovedOrOwner(msg.sender, _id));

            require(_from != address(0));
            require(_to != address(0));
    
            clearApproval(_from, _id);
            removeTokenFrom(_from, _id);
            addTokenTo(_to, _id);
    
            emit Transfer(_from, _to, _id);
        }
    }
    
    function multiBatchSafeTransferFrom(
        uint256[] _assetIds, 
        address[] _fromB, 
        address[] _toB
        )
        public
    {
        uint256 _id;
        address _to;
        address _from;
        
        for (uint256 i = 0; i < _assetIds.length; ++i) {
            _id = _assetIds[i];
            _to  = _toB[i];
            _from  = _fromB[i];

            safeTransferFrom(_from, _to, _id);
        }
    }

    function batchSafeTransferFrom(
        uint256[] _assetIds, 
        address _from, 
        address _to
        )
        public
    {
        uint256 _id;
        for (uint256 i = 0; i < _assetIds.length; ++i) {
            _id = _assetIds[i];
            safeTransferFrom(_from, _to, _id);
        }
    }


    function batchApprove(
        uint256[] _assetIds, 
        address _spender
        )
        public
    {
        uint256 _id;
        for (uint256 i = 0; i < _assetIds.length; ++i) {
            _id = _assetIds[i];
            approve(_spender, _id);
        }
        
    }


    function batchSetApprovalForAll(
        address[] _spenders,
        bool _approved
        )
        public
    {
        address _spender;
        for (uint256 i = 0; i < _spenders.length; ++i) {
            _spender = _spenders[i];
            setApprovalForAll(_spender, _approved);
        }
    }  
    
    function requestDetachment(
        uint256 _tokenId
    )
        public
    {
        //Request can only be made by owner or approved address
        require(isApprovedOrOwner(msg.sender, _tokenId));

        uint256 isAttached = getIsNFTAttached(_tokenId);

        require(isAttached >= 1);

        if(attachedSystemActive == true) {
            //Checks to see if request was made and if time elapsed
            if(isAttached > 1 && block.timestamp - isAttached > detachmentTime) {
                isAttached = 0;
            } else if(isAttached > 1) {
                //Fail if time is already set for attachment
                require(isAttached == 1);
            } else {
                //Is attached, set detachment time and make request to detach
                emit DetachRequest(msg.sender, _tokenId, block.timestamp);
                isAttached = block.timestamp;
            }           
        } else {
            isAttached = 0;
        } 

        if(isAttached == 0) {
            emit NFTDetached(msg.sender, _tokenId);
        }

        updateIsAttached(_tokenId, isAttached);
    }

    function attachAsset(
        uint256 _tokenId
    )
        public
        canTransfer(_tokenId)
    {
        uint256 isAttached = getIsNFTAttached(_tokenId);

        require(isAttached == 0);
        isAttached = 1;

        updateIsAttached(_tokenId, isAttached);

        emit NFTAttached(msg.sender, _tokenId);
    }

    function batchAttachAssets(uint256[] _ids) public {
        for(uint i = 0; i < _ids.length; i++) {
            attachAsset(_ids[i]);
        }
    }

    function batchDetachAssets(uint256[] _ids) public {
        for(uint i = 0; i < _ids.length; i++) {
            requestDetachment(_ids[i]);
        }
    }

    function requestDetachmentOnPause (uint256 _tokenId) public 
    whenPaused {
        //Request can only be made by owner or approved address
        require(isApprovedOrOwner(msg.sender, _tokenId));

        updateIsAttached(_tokenId, 0);
    }

    function batchBurnAssets(uint256[] _assetIDs) public {
        uint256 _id;
        for(uint i = 0; i < _assetIDs.length; i++) {
            _id = _assetIDs[i];
            burnAsset(_id);
        }
    }

    function burnAsset(uint256 _assetID) public {
        // Is Burn Enabled
        require(canBurn == true);

        // Deny Action if Attached
        require(getIsNFTAttached(_assetID) == 0);

        require(isApprovedOrOwner(msg.sender, _assetID) == true);
        
        //Updates Type Total Count
        uint256 _assetType = getAssetIdItemType(_assetID);
        assetTypeBurnedCount[uint32(_assetType)] += 1;
        
        _burn(msg.sender, _assetID);
    }


    /** Dev Functions */

    function setTokenURIBase (string _tokenURI) public onlyManager {
        _setTokenURIBase(_tokenURI);
    }

    function setPermanentLimitForType (uint32 _type, uint256 _limit) public onlyManager {
        //Only allows Limit to be set once
        require(assetTypeCreationLimit[_type] == 0);

        assetTypeCreationLimit[_type] = uint32(_limit);
    }

    function setTypeName (uint32 _type, string _name) public anyOperator {
        assetTypeName[_type] = _name;
    }

    // Minting Function
    function batchSpawnAsset(address _to, uint256[] _assetTypes, uint256[] _assetIds, uint256 _isAttached) public anyOperator {
        uint256 _id;
        uint256 _assetType;
        for(uint i = 0; i < _assetIds.length; i++) {
            _id = _assetIds[i];
            _assetType = _assetTypes[i];
            _createAsset(_to, _assetType, _id, _isAttached, address(0));
        }
    }

    function batchSpawnAsset(address[] _toB, uint256[] _assetTypes, uint256[] _assetIds, uint256 _isAttached) public anyOperator {
        address _to;
        uint256 _id;
        uint256 _assetType;
        for(uint i = 0; i < _assetIds.length; i++) {
            _to = _toB[i];
            _id = _assetIds[i];
            _assetType = _assetTypes[i];
            _createAsset(_to, _assetType, _id, _isAttached, address(0));
        }
    }

    function batchSpawnAssetWithCreator(address[] _toB, uint256[] _assetTypes, uint256[] _assetIds, uint256[] _isAttacheds, address[] _creators) public anyOperator {
        address _to;
        address _creator;
        uint256 _id;
        uint256 _assetType;
        uint256 _isAttached;
        for(uint i = 0; i < _assetIds.length; i++) {
            _to = _toB[i];
            _id = _assetIds[i];
            _assetType = _assetTypes[i];
            _creator = _creators[i];
            _isAttached = _isAttacheds[i];
            _createAsset(_to, _assetType, _id, _isAttached, _creator);
        }
    }

    function spawnAsset(address _to, uint256 _assetType, uint256 _assetID, uint256 _isAttached) public anyOperator {
        _createAsset(_to, _assetType, _assetID, _isAttached, address(0));
    }

    function spawnAssetWithCreator(address _to, uint256 _assetType, uint256 _assetID, uint256 _isAttached, address _creator) public anyOperator {
        _createAsset(_to, _assetType, _assetID, _isAttached, _creator);
    }

    /// @dev Remove all Ether from the contract, shouldn't have any but just incase.
    function withdrawBalance() public onlyBanker {
        // We are using this boolean method to make sure that even if one fails it will still work
        bankManager.transfer(address(this).balance);
    }

    // Burn Functions

    function setCanBurn(bool _state) public onlyManager {
        canBurn = _state;
    }

    function burnAssetOperator(uint256 _assetID) public anyOperator {
        
        require(getIsNFTAttached(_assetID) > 0);

        //Updates Type Total Count
        uint256 _assetType = getAssetIdItemType(_assetID);
        assetTypeBurnedCount[uint32(_assetType)] += 1;
        
        _burn(ownerOf(_assetID), _assetID);
    }

    function toggleAttachedEnforement (bool _state) public onlyManager {
        attachedSystemActive = _state;
    }

    function setDetachmentTime (uint256 _time) public onlyManager {
        //Detactment Time can not be set greater than 2 weeks.
        require(_time <= 1209600);
        detachmentTime = uint32(_time);
    }

    function setNFTDetached(uint256 _assetID) public anyOperator {
        require(getIsNFTAttached(_assetID) > 0);

        updateIsAttached(_assetID, 0);
        emit NFTDetached(msg.sender, _assetID);
    }

    function setBatchDetachCollectibles(uint256[] _assetIds) public anyOperator {
        uint256 _id;
        for(uint i = 0; i < _assetIds.length; i++) {
            _id = _assetIds[i];
            setNFTDetached(_id);
        }
    }



    /** Internal Functions */

    // @dev For creating NFT Collectible
    function _createAsset(address _to, uint256 _assetType, uint256 _assetID, uint256 _attachState, address _creator) internal returns(uint256) {
        
        uint256 _sequenceId = uint256(assetTypeTotalCount[uint32(_assetType)]) + 1;

        //Will not allow creation if over limit
        require(assetTypeCreationLimit[uint32(_assetType)] == 0 || assetTypeCreationLimit[uint32(_assetType)] > _sequenceId);
        
        // These requires are not strictly necessary, our calling code should make
        // sure that these conditions are never broken.
        require(_sequenceId == uint256(uint64(_sequenceId)));

        //Creates NFT
        _mint(_to, _assetID);

        uint256 nftData = uint256(_creator); // 160 bit address of creator
        nftData |= now<<160; // 48 bit creation timestamp
        nftData |= _assetType<<208; // 32 bit item type 

        uint256 nftDataContinued = uint256(_sequenceId); // 64 bit sequence id of item
        nftDataContinued |= _attachState<<64; // 48 bit state and/or timestamp for detachment

        nftDataA[_assetID] = nftData;
        nftDataB[_assetID] = uint128(nftDataContinued);

        assetTypeTotalCount[uint32(_assetType)] += 1;
        sequenceIDToTypeForID[_sequenceId][uint32(_assetType)] = uint64(_assetID);

        // emit Created event
        emit AssetCreated(_to, _assetID, _assetType, _sequenceId, now);

        return _assetID;
    }

    function updateIsAttached(uint256 _assetID, uint256 _isAttached) 
    internal
    {
        uint256 nftData = nftDataB[_assetID];

        uint256 assetTypeSeqId = uint256(uint64(nftData));

        uint256 nftDataContinued = uint256(assetTypeSeqId); // 64 bit sequence id of item
        nftDataContinued |= _isAttached<<64; // 48 bit state and/or timestamp for detachment

        nftDataB[_assetID] = uint128(nftDataContinued);
    }



}

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":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_assetIds","type":"uint256[]"},{"name":"_fromB","type":"address[]"},{"name":"_toB","type":"address[]"}],"name":"multiBatchSafeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","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":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_type","type":"uint256"}],"name":"totalBurnedOfType","outputs":[{"name":"_totalOfType","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"requestDetachment","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_assetID","type":"uint256"}],"name":"burnAssetOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"implementsERC721","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_spenders","type":"address[]"},{"name":"_approved","type":"bool"}],"name":"batchSetApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_assetId","type":"uint256"}],"name":"getAssetIdOwner","outputs":[{"name":"owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_assetId","type":"uint256"}],"name":"getAssetRawMeta","outputs":[{"name":"dataA","type":"uint256"},{"name":"dataB","type":"uint128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"detachmentTime","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_assetId","type":"uint256"}],"name":"getAssetIdItemType","outputs":[{"name":"assetType","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_assetIds","type":"uint256[]"},{"name":"_fromB","type":"address[]"},{"name":"_toB","type":"address[]"}],"name":"multiBatchTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","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":"","type":"address"}],"name":"otherManagers","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_type","type":"uint32"},{"name":"_name","type":"string"}],"name":"setTypeName","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":"_state","type":"bool"}],"name":"setCanBurn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_assetIds","type":"uint256[]"},{"name":"_spender","type":"address"}],"name":"batchApprove","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","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":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"name":"","type":"bool"}],"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":"_time","type":"uint256"}],"name":"setDetachmentTime","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_type","type":"uint256"}],"name":"totalCreatedOfType","outputs":[{"name":"_totalOfType","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"InterfaceSignature_ERC721Optional","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_toB","type":"address[]"},{"name":"_assetTypes","type":"uint256[]"},{"name":"_assetIds","type":"uint256[]"},{"name":"_isAttacheds","type":"uint256[]"},{"name":"_creators","type":"address[]"}],"name":"batchSpawnAssetWithCreator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"attachedSystemActive","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_assetId","type":"uint256"}],"name":"getAssetIdOwnerIndex","outputs":[{"name":"ownerIndex","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_ids","type":"uint256[]"}],"name":"batchDetachAssets","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":false,"inputs":[{"name":"_newGM","type":"address"}],"name":"setSecondaryManager","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"name":"ownerTokens","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_ids","type":"uint256[]"}],"name":"batchAttachAssets","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"noError","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_assetID","type":"uint256"}],"name":"burnAsset","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_assetIds","type":"uint256[]"},{"name":"_from","type":"address"},{"name":"_to","type":"address"}],"name":"batchTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_assetIds","type":"uint256[]"},{"name":"_from","type":"address"},{"name":"_to","type":"address"}],"name":"batchSafeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_assetId","type":"uint256"}],"name":"getAssetIdCreator","outputs":[{"name":"creator","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_assetId","type":"uint256"}],"name":"getAssetDetails","outputs":[{"name":"assetId","type":"uint256"},{"name":"ownersIndex","type":"uint256"},{"name":"assetTypeSeqId","type":"uint256"},{"name":"assetType","type":"uint256"},{"name":"createdTimestamp","type":"uint256"},{"name":"isAttached","type":"uint256"},{"name":"creator","type":"address"},{"name":"owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_assetTypes","type":"uint256[]"},{"name":"_assetIds","type":"uint256[]"},{"name":"_isAttached","type":"uint256"}],"name":"batchSpawnAsset","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_assetIds","type":"uint256[]"}],"name":"setBatchDetachCollectibles","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_assetId","type":"uint256"}],"name":"getIsNFTAttached","outputs":[{"name":"isAttached","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"hasError","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_type","type":"uint32"}],"name":"getTypeName","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_type","type":"uint256"}],"name":"totalSupplyOfType","outputs":[{"name":"_totalOfType","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"managerPrimary","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":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newOp","type":"address"},{"name":"_state","type":"uint8"}],"name":"setOtherManager","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_assetType","type":"uint256"},{"name":"_assetID","type":"uint256"},{"name":"_isAttached","type":"uint256"},{"name":"_creator","type":"address"}],"name":"spawnAssetWithCreator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newGM","type":"address"}],"name":"setPrimaryManager","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"attachAsset","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"canBurn","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_type","type":"uint32"},{"name":"_limit","type":"uint256"}],"name":"setPermanentLimitForType","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"error","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_assetIDs","type":"uint256[]"}],"name":"batchBurnAssets","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_assetId","type":"uint256"}],"name":"getAssetIdTypeSequenceId","outputs":[{"name":"assetTypeSequenceId","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenURI","type":"string"}],"name":"setTokenURIBase","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"requestDetachmentOnPause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_assetID","type":"uint256"}],"name":"setNFTDetached","outputs":[],"payable":false,"stateMutability":"nonpayable","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":"bankManager","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"managerSecondary","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_seqId","type":"uint256"},{"name":"_type","type":"uint256"}],"name":"getAssetIDForTypeSequenceID","outputs":[{"name":"_assetID","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_assetType","type":"uint256"},{"name":"_assetID","type":"uint256"},{"name":"_isAttached","type":"uint256"}],"name":"spawnAsset","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newBK","type":"address"}],"name":"setBanker","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_state","type":"bool"}],"name":"toggleAttachedEnforement","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"requesterAddress","type":"address"},{"name":"_assetId","type":"uint256"}],"name":"isAssetIdOwnerOrApproved","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_toB","type":"address[]"},{"name":"_assetTypes","type":"uint256[]"},{"name":"_assetIds","type":"uint256[]"},{"name":"_isAttached","type":"uint256"}],"name":"batchSpawnAsset","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"assetId","type":"uint256"},{"indexed":false,"name":"assetType","type":"uint256"},{"indexed":false,"name":"sequenceId","type":"uint256"},{"indexed":false,"name":"creationTime","type":"uint256"}],"name":"AssetCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"assetId","type":"uint256"},{"indexed":false,"name":"timestamp","type":"uint256"}],"name":"DetachRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"requester","type":"address"},{"indexed":false,"name":"assetId","type":"uint256"}],"name":"NFTDetached","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"requester","type":"address"},{"indexed":false,"name":"assetId","type":"uint256"}],"name":"NFTAttached","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newContract","type":"address"}],"name":"ContractUpgrade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_approved","type":"address"},{"indexed":false,"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"}]

6080604052600f805461ffff191690556017805465ffffffff0000191663012c00001790553480156200003157600080fd5b5033600160a060020a031615156200004857600080fd5b600f805461ff001960ff199091166001178116909155601780549091169055600b8054600160a060020a033316600160a060020a03199182168117909255600c8054821683179055600d80549091169091178155604080518082019091528181527f4353434e4654466163746f7279000000000000000000000000000000000000006020909101908152620000e191600491906200012f565b506040805180820190915260068082527f4353434e46540000000000000000000000000000000000000000000000000000602090920191825262000128916005916200012f565b50620001d4565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200017257805160ff1916838001178555620001a2565b82800160010185558215620001a2579182015b82811115620001a257825182559160200191906001019062000185565b50620001b0929150620001b4565b5090565b620001d191905b80821115620001b05760008155600101620001bb565b90565b61409180620001e46000396000f30060806040526004361061039a5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166301ffc9a7811461039f57806306fdde03146103d557806307ff14131461045f578063081812fc14610528578063095ea7b31461055c578063099015d9146105805780630dec1c23146105aa5780630f23a104146105c25780631051db34146105da57806317342859146105ef57806318160ddd146106485780631a5d3b751461065d5780631b728ed4146106755780631b825e89146106b75780631b87ccae146106e557806321bcc5e5146106fd57806323b872dd146107c457806323d7af24146107ee578063289b5b15146108255780632f745c5914610889578063386c69f2146108ad57806338752e58146108c75780633f4ba83a1461092757806342842e0e1461093c5780634f558e79146109665780634f6ccce71461097e5780635bc8a672146109965780635c975abb146109ae5780635fd8c710146109c35780636143abba146109d8578063624de3d9146109f05780636352211e14610a22578063651883c114610a3a5780636554d17914610b73578063673478c314610b885780636ff2817c14610ba057806370a0823114610bf5578063825bdb7414610c165780638456cb5914610c375780638462151c14610c4c5780638920641114610cbd5780638a53f23014610d125780638f08d44d14610d2757806391177db414610d3f5780639493f01214610daa57806395d89b4114610e15578063a0cce3d214610e2a578063a1f24b3d14610e42578063a22cb46514610ea7578063a7ffe56014610ecd578063abd4455614610f6b578063aca67a8f14610fc0578063ad5e46cb14610fd8578063b3f936f214610fed578063b59712af1461100b578063b777cad714611023578063b88d4fde14611038578063bb1d45fc146110a7578063bc4af295146110ce578063c0619c7014611101578063c0f64f4314611122578063c1eb18401461113a578063c2e2a33e1461114f578063c79f8b6214611170578063c87b56dd14611185578063d98bce371461119d578063d99929db146111f2578063da2bbfc71461120a578063dd280c7a14611263578063e080241c1461127b578063e985e9c514611293578063e9e2990e146112ba578063ee70f392146112cf578063ef8d4a49146112e4578063efc58aea146112ff578063f1ff732b14611329578063f603fa921461134a578063f84af7f314611364578063ff950e9014611388575b600080fd5b3480156103ab57600080fd5b506103c1600160e060020a031960043516611451565b604080519115158252519081900360200190f35b3480156103e157600080fd5b506103ea611522565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561042457818101518382015260200161040c565b50505050905090810190601f1680156104515780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561046b57600080fd5b506040805160206004803580820135838102808601850190965280855261052695369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a9989019892975090820195509350839250850190849080828437509497506115b99650505050505050565b005b34801561053457600080fd5b50610540600435611632565b60408051600160a060020a039092168252519081900360200190f35b34801561056857600080fd5b50610526600160a060020a036004351660243561164d565b34801561058c57600080fd5b5061059860043561173b565b60408051918252519081900360200190f35b3480156105b657600080fd5b5061052660043561175d565b3480156105ce57600080fd5b50610526600435611893565b3480156105e657600080fd5b506103c1611974565b3480156105fb57600080fd5b506040805160206004803580820135838102808601850190965280855261052695369593946024949385019291829185019084908082843750949750505050913515159250611979915050565b34801561065457600080fd5b506105986119b8565b34801561066957600080fd5b506105406004356119be565b34801561068157600080fd5b5061068d6004356119dd565b604080519283526fffffffffffffffffffffffffffffffff90911660208301528051918290030190f35b3480156106c357600080fd5b506106cc611a2a565b6040805163ffffffff9092168252519081900360200190f35b3480156106f157600080fd5b50610598600435611a3c565b34801561070957600080fd5b506040805160206004803580820135838102808601850190965280855261052695369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750949750611a8b9650505050505050565b3480156107d057600080fd5b50610526600160a060020a0360043581169060243516604435611b86565b3480156107fa57600080fd5b5061080f600160a060020a0360043516611d51565b6040805160ff9092168252519081900360200190f35b34801561083157600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261052695833563ffffffff16953695604494919390910191908190840183828082843750949750611d669650505050505050565b34801561089557600080fd5b50610598600160a060020a0360043516602435611e01565b3480156108b957600080fd5b506105266004351515611e4e565b3480156108d357600080fd5b50604080516020600480358082013583810280860185019096528085526105269536959394602494938501929182918501908490808284375094975050509235600160a060020a03169350611e9e92505050565b34801561093357600080fd5b50610526611ed7565b34801561094857600080fd5b50610526600160a060020a0360043581169060243516604435611f2a565b34801561097257600080fd5b506103c1600435612090565b34801561098a57600080fd5b506105986004356120ad565b3480156109a257600080fd5b506105266004356120e2565b3480156109ba57600080fd5b506103c161214c565b3480156109cf57600080fd5b50610526612155565b3480156109e457600080fd5b506105986004356121ae565b3480156109fc57600080fd5b50610a056121d0565b60408051600160e060020a03199092168252519081900360200190f35b348015610a2e57600080fd5b506105406004356121f4565b348015610a4657600080fd5b506040805160206004803580820135838102808601850190965280855261052695369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a9989019892975090820195509350839250850190849080828437509497506122189650505050505050565b348015610b7f57600080fd5b506103c161234c565b348015610b9457600080fd5b50610598600435612355565b348015610bac57600080fd5b50604080516020600480358082013583810280860185019096528085526105269536959394602494938501929182918501908490808284375094975061237e9650505050505050565b348015610c0157600080fd5b50610598600160a060020a03600435166123b2565b348015610c2257600080fd5b50610526600160a060020a03600435166123e5565b348015610c4357600080fd5b50610526612452565b348015610c5857600080fd5b50610c6d600160a060020a03600435166124a7565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610ca9578181015183820152602001610c91565b505050509050019250505060405180910390f35b348015610cc957600080fd5b5060408051602060048035808201358381028086018501909652808552610526953695939460249493850192918291850190849080828437509497506125519650505050505050565b348015610d1e57600080fd5b50610526612585565b348015610d3357600080fd5b506105266004356125d9565b348015610d4b57600080fd5b50604080516020600480358082013583810280860185019096528085526105269536959394602494938501929182918501908490808284375094975050600160a060020a03853581169650602090950135909416935061266d92505050565b348015610db657600080fd5b50604080516020600480358082013583810280860185019096528085526105269536959394602494938501929182918501908490808284375094975050600160a060020a03853581169650602090950135909416935061273292505050565b348015610e2157600080fd5b506103ea61276c565b348015610e3657600080fd5b506105406004356127cd565b348015610e4e57600080fd5b50610e5a6004356127f8565b604080519889526020890197909752878701959095526060870193909352608086019190915260a0850152600160a060020a0390811660c08501521660e083015251908190036101000190f35b348015610eb357600080fd5b50610526600160a060020a036004351660243515156128db565b348015610ed957600080fd5b50604080516020600460248035828101358481028087018601909752808652610526968435600160a060020a031696369660449591949091019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750949750509335945061296a9350505050565b348015610f7757600080fd5b506040805160206004803580820135838102808601850190965280855261052695369593946024949385019291829185019084908082843750949750612a3e9650505050505050565b348015610fcc57600080fd5b50610598600435612af0565b348015610fe457600080fd5b50610526612b29565b348015610ff957600080fd5b506103ea63ffffffff60043516612b81565b34801561101757600080fd5b50610598600435612c29565b34801561102f57600080fd5b50610540612c5e565b34801561104457600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261052694600160a060020a038135811695602480359092169560443595369560849401918190840183828082843750949750612c6d9650505050505050565b3480156110b357600080fd5b50610526600160a060020a036004351660ff60243516612dda565b3480156110da57600080fd5b50610526600160a060020a0360043581169060243590604435906064359060843516612e52565b34801561110d57600080fd5b50610526600160a060020a0360043516612ed4565b34801561112e57600080fd5b50610526600435612f41565b34801561114657600080fd5b506103c16130f4565b34801561115b57600080fd5b5061052663ffffffff60043516602435613102565b34801561117c57600080fd5b506103c1613182565b34801561119157600080fd5b506103ea600435613190565b3480156111a957600080fd5b5060408051602060048035808201358381028086018501909652808552610526953695939460249493850192918291850190849080828437509497506132019650505050505050565b3480156111fe57600080fd5b50610598600435613239565b34801561121657600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261052694369492936024939284019190819084018382808284375094975061326e9650505050505050565b34801561126f57600080fd5b506105266004356132ad565b34801561128757600080fd5b506105266004356132de565b34801561129f57600080fd5b506103c1600160a060020a03600435811690602435166133ba565b3480156112c657600080fd5b506105406133e8565b3480156112db57600080fd5b506105406133f7565b3480156112f057600080fd5b50610598600435602435613406565b34801561130b57600080fd5b50610526600160a060020a0360043516602435604435606435613435565b34801561133557600080fd5b50610526600160a060020a03600435166134b8565b34801561135657600080fd5b506105266004351515613525565b34801561137057600080fd5b506103c1600160a060020a036004351660243561356e565b34801561139457600080fd5b506040805160206004803580820135838102808601850190965280855261052695369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a99890198929750908201955093508392508501908490808284375094975050933594506135819350505050565b6000600160e060020a031982167f01ffc9a70000000000000000000000000000000000000000000000000000000014806114b45750600160e060020a031982167f80ac58cd00000000000000000000000000000000000000000000000000000000145b806114e85750600160e060020a031982167f780e9d6300000000000000000000000000000000000000000000000000000000145b8061151c5750600160e060020a031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b92915050565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156115ae5780601f10611583576101008083540402835291602001916115ae565b820191906000526020600020905b81548152906001019060200180831161159157829003601f168201915b505050505090505b90565b60008080805b86518110156116295786818151811015156115d657fe5b90602001906020020151935084818151811015156115f057fe5b906020019060200201519250858181518110151561160a57fe5b906020019060200201519150611621828486611f2a565b6001016115bf565b50505050505050565b600090815260016020526040902054600160a060020a031690565b6000611658826121f4565b9050600160a060020a03838116908216141561167357600080fd5b80600160a060020a031633600160a060020a03161480611698575061169881336133ba565b15156116a357600080fd5b60006116ae83611632565b600160a060020a03161415806116cc5750600160a060020a03831615155b15611736576000828152600160209081526040918290208054600160a060020a031916600160a060020a03878116918217909255835186815293519093918516927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35b505050565b63ffffffff1660009081526013602052604090205467ffffffffffffffff1690565b6000611769338361367b565b151561177457600080fd5b61177d82612af0565b9050600181101561178d57600080fd5b60175460ff16151560011415611835576001811180156117bd575060175462010000900463ffffffff1642829003115b156117ca57506000611830565b60018111156117e557600181146117e057600080fd5b611830565b60408051600160a060020a033316815260208101849052428183015290517f13853dffc32e3d2134b52ca811da22f0849c5260cec50b0dafbb5516223aa4d29181900360600190a150425b611839565b5060005b8015156118855760408051600160a060020a03331681526020810184905281517fffc1fb52133080290c5e0540b2b3501c06e2369e230ba437804271c8a22f61f9929181900390910190a15b61188f82826136da565b5050565b600b5460009033600160a060020a03908116911614806118c15750600c5433600160a060020a039081169116145b806118da5750600d5433600160a060020a039081169116145b806119005750600160a060020a0333166000908152600e602052604090205460ff166001145b151561190b57600080fd5b600061191683612af0565b1161192057600080fd5b61192982611a3c565b63ffffffff81166000908152601360205260409020805467ffffffffffffffff8082166001011667ffffffffffffffff19909116179055905061188f61196e836121f4565b83613733565b600190565b6000805b83518110156119b257838181518110151561199457fe5b9060200190602002015191506119aa82846128db565b60010161197d565b50505050565b60085490565b60006119c982612090565b15156119d457600080fd5b61151c826121f4565b6000806119e983612090565b15156119f457600080fd5b505060009081526010602090815260408083205460119092529091205490916fffffffffffffffffffffffffffffffff90911690565b60175462010000900463ffffffff1681565b600080611a4883612090565b1515611a5357600080fd5b50506000908152601060205260409020547a010000000000000000000000000000000000000000000000000000900463ffffffff1690565b60008080805b8651811015611629578681815181101515611aa857fe5b9060200190602002015193508481815181101515611ac257fe5b9060200190602002015192508581815181101515611adc57fe5b906020019060200201519150611af2338561367b565b1515611afd57600080fd5b600160a060020a0382161515611b1257600080fd5b600160a060020a0383161515611b2757600080fd5b611b3182856137ef565b611b3b828561388f565b611b4583856139c8565b82600160a060020a031682600160a060020a0316600080516020614046833981519152866040518082815260200191505060405180910390a3600101611a91565b806000611b9282612af0565b90508060021415611c2257600b5433600160a060020a0390811691161480611bc85750600c5433600160a060020a039081169116145b80611be15750600d5433600160a060020a039081169116145b80611c075750600160a060020a0333166000908152600e602052604090205460ff166001145b1515611c1257600080fd5b611c1d8260016136da565b611cc9565b60175460ff1615156001148015611c3a575060018110155b15611cb457600b5433600160a060020a0390811691161480611c6a5750600c5433600160a060020a039081169116145b80611c835750600d5433600160a060020a039081169116145b80611ca95750600160a060020a0333166000908152600e602052604090205460ff166001145b1515611c1d57600080fd5b611cbe338361367b565b1515611cc957600080fd5b600160a060020a0385161515611cde57600080fd5b600160a060020a0384161515611cf357600080fd5b611cfd85846137ef565b611d07858461388f565b611d1184846139c8565b83600160a060020a031685600160a060020a0316600080516020614046833981519152856040518082815260200191505060405180910390a35050505050565b600e6020526000908152604090205460ff1681565b600b5433600160a060020a0390811691161480611d915750600c5433600160a060020a039081169116145b80611daa5750600d5433600160a060020a039081169116145b80611dd05750600160a060020a0333166000908152600e602052604090205460ff166001145b1515611ddb57600080fd5b63ffffffff82166000908152601560209081526040909120825161173692840190613f8d565b6000611e0c836123b2565b8210611e1757600080fd5b600160a060020a0383166000908152600660205260409020805483908110611e3b57fe5b9060005260206000200154905092915050565b600b5433600160a060020a0390811691161480611e795750600c5433600160a060020a039081169116145b1515611e8457600080fd5b601780549115156101000261ff0019909216919091179055565b6000805b83518110156119b2578381815181101515611eb957fe5b906020019060200201519150611ecf838361164d565b600101611ea2565b600b5433600160a060020a0390811691161480611f025750600c5433600160a060020a039081169116145b1515611f0d57600080fd5b600f5460ff161515611f1e57600080fd5b600f805460ff19169055565b806000611f3682612af0565b90508060021415611fc657600b5433600160a060020a0390811691161480611f6c5750600c5433600160a060020a039081169116145b80611f855750600d5433600160a060020a039081169116145b80611fab5750600160a060020a0333166000908152600e602052604090205460ff166001145b1515611fb657600080fd5b611fc18260016136da565b61206d565b60175460ff1615156001148015611fde575060018110155b1561205857600b5433600160a060020a039081169116148061200e5750600c5433600160a060020a039081169116145b806120275750600d5433600160a060020a039081169116145b8061204d5750600160a060020a0333166000908152600e602052604090205460ff166001145b1515611fc157600080fd5b612062338361367b565b151561206d57600080fd5b6120898585856020604051908101604052806000815250612c6d565b5050505050565b600090815260208190526040902054600160a060020a0316151590565b60006120b76119b8565b82106120c257600080fd5b60088054839081106120d057fe5b90600052602060002001549050919050565b600b5433600160a060020a039081169116148061210d5750600c5433600160a060020a039081169116145b151561211857600080fd5b6212750081111561212857600080fd5b6017805463ffffffff909216620100000265ffffffff000019909216919091179055565b600f5460ff1681565b600d5433600160a060020a0390811691161461217057600080fd5b600d54604051600160a060020a039182169130163180156108fc02916000818181858888f193505050501580156121ab573d6000803e3d6000fd5b50565b63ffffffff1660009081526012602052604090205467ffffffffffffffff1690565b7fb0aa71870000000000000000000000000000000000000000000000000000000081565b600081815260208190526040812054600160a060020a031680151561151c57600080fd5b600b546000908190819081908190819033600160a060020a03908116911614806122505750600c5433600160a060020a039081169116145b806122695750600d5433600160a060020a039081169116145b8061228f5750600160a060020a0333166000908152600e602052604090205460ff166001145b151561229a57600080fd5b5060005b885181101561233f578a818151811015156122b557fe5b90602001906020020151955088818151811015156122cf57fe5b90602001906020020151935089818151811015156122e957fe5b906020019060200201519250868181518110151561230357fe5b906020019060200201519450878181518110151561231d57fe5b9060200190602002015191506123368684868589613a11565b5060010161229e565b5050505050505050505050565b60175460ff1681565b600061236082612090565b151561236b57600080fd5b5060009081526007602052604090205490565b60005b815181101561188f576123aa828281518110151561239b57fe5b9060200190602002015161175d565b600101612381565b6000600160a060020a03821615156123c957600080fd5b50600160a060020a031660009081526002602052604090205490565b600b5433600160a060020a03908116911614806124105750600c5433600160a060020a039081169116145b151561241b57600080fd5b600160a060020a038116151561243057600080fd5b600c8054600160a060020a031916600160a060020a0392909216919091179055565b600b5433600160a060020a039081169116148061247d5750600c5433600160a060020a039081169116145b151561248857600080fd5b600f5460ff161561249857600080fd5b600f805460ff19166001179055565b6060600060606000806124b9866123b2565b93508315156124d8576040805160008152602081019091529450612548565b83604051908082528060200260200182016040528015612502578160200160208202803883390190505b50925060009150600090505b83811015612544576125208682611e01565b838381518110151561252e57fe5b602090810290910101526001918201910161250e565b8294505b50505050919050565b60005b815181101561188f5761257d828281518110151561256e57fe5b90602001906020020151612f41565b600101612554565b600b5433600160a060020a03908116911614806125b05750600c5433600160a060020a039081169116145b15156125bb57600080fd5b600f5460ff1615156125cc57600080fd5b600f805461ff0019169055565b60175460009060ff6101009091041615156001146125f657600080fd5b6125ff82612af0565b1561260957600080fd5b612613338361367b565b151560011461262157600080fd5b61262a82611a3c565b63ffffffff81166000908152601360205260409020805467ffffffffffffffff8082166001011667ffffffffffffffff19909116179055905061188f3383613733565b6000805b845181101561208957848181518110151561268857fe5b90602001906020020151915061269e338361367b565b15156126a957600080fd5b600160a060020a03841615156126be57600080fd5b600160a060020a03831615156126d357600080fd5b6126dd84836137ef565b6126e7848361388f565b6126f183836139c8565b82600160a060020a031684600160a060020a0316600080516020614046833981519152846040518082815260200191505060405180910390a3600101612671565b6000805b845181101561208957848181518110151561274d57fe5b906020019060200201519150612764848484611f2a565b600101612736565b60058054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156115ae5780601f10611583576101008083540402835291602001916115ae565b6000806127d983612090565b15156127e457600080fd5b505060009081526010602052604090205490565b6000806000806000806000806000806128108b612090565b151561281b57600080fd5b5050600089815260106020908152604080832054601183528184205460079093529220548b9a50985067ffffffffffffffff8116975063ffffffff7a010000000000000000000000000000000000000000000000000000830416965065ffffffffffff74010000000000000000000000000000000000000000830481169650680100000000000000006fffffffffffffffffffffffffffffffff90921691820416945090925082906128cc8a6121f4565b92505050919395975091939597565b33600160a060020a031682600160a060020a0316141515156128fc57600080fd5b600160a060020a03338116600081815260036020908152604080832094871680845294825291829020805486151560ff199091168117909155825190815291517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319281900390910190a35050565b600b546000908190819033600160a060020a039081169116148061299c5750600c5433600160a060020a039081169116145b806129b55750600d5433600160a060020a039081169116145b806129db5750600160a060020a0333166000908152600e602052604090205460ff166001145b15156129e657600080fd5b5060005b8451811015611629578481815181101515612a0157fe5b9060200190602002015192508581815181101515612a1b57fe5b906020019060200201519150612a35878385876000613a11565b506001016129ea565b600b54600090819033600160a060020a0390811691161480612a6e5750600c5433600160a060020a039081169116145b80612a875750600d5433600160a060020a039081169116145b80612aad5750600160a060020a0333166000908152600e602052604090205460ff166001145b1515612ab857600080fd5b5060005b8251811015611736578281815181101515612ad357fe5b906020019060200201519150612ae8826132de565b600101612abc565b600090815260116020526040902054680100000000000000006fffffffffffffffffffffffffffffffff9091160465ffffffffffff1690565b600b5433600160a060020a0390811691161480612b545750600c5433600160a060020a039081169116145b1515612b5f57600080fd5b600f5460ff161515612b7057600080fd5b600f805461ff001916610100179055565b63ffffffff811660009081526015602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845260609392830182828015612c1d5780601f10612bf257610100808354040283529160200191612c1d565b820191906000526020600020905b815481529060010190602001808311612c0057829003601f168201915b50505050509050919050565b63ffffffff1660009081526013602090815260408083205460129092529091205467ffffffffffffffff918216908216031690565b600b54600160a060020a031681565b816000612c7982612af0565b90508060021415612d0957600b5433600160a060020a0390811691161480612caf5750600c5433600160a060020a039081169116145b80612cc85750600d5433600160a060020a039081169116145b80612cee5750600160a060020a0333166000908152600e602052604090205460ff166001145b1515612cf957600080fd5b612d048260016136da565b612db0565b60175460ff1615156001148015612d21575060018110155b15612d9b57600b5433600160a060020a0390811691161480612d515750600c5433600160a060020a039081169116145b80612d6a5750600d5433600160a060020a039081169116145b80612d905750600160a060020a0333166000908152600e602052604090205460ff166001145b1515612d0457600080fd5b612da5338361367b565b1515612db057600080fd5b612dbb868686611b86565b612dc786868686613bf0565b1515612dd257600080fd5b505050505050565b600b5433600160a060020a0390811691161480612e055750600c5433600160a060020a039081169116145b1515612e1057600080fd5b600160a060020a0382161515612e2557600080fd5b600160a060020a03919091166000908152600e60205260409020805460ff191660ff909216919091179055565b600b5433600160a060020a0390811691161480612e7d5750600c5433600160a060020a039081169116145b80612e965750600d5433600160a060020a039081169116145b80612ebc5750600160a060020a0333166000908152600e602052604090205460ff166001145b1515612ec757600080fd5b612dd28585858585613a11565b600b5433600160a060020a0390811691161480612eff5750600c5433600160a060020a039081169116145b1515612f0a57600080fd5b600160a060020a0381161515612f1f57600080fd5b600b8054600160a060020a031916600160a060020a0392909216919091179055565b6000816000612f4f82612af0565b90508060021415612fdf57600b5433600160a060020a0390811691161480612f855750600c5433600160a060020a039081169116145b80612f9e5750600d5433600160a060020a039081169116145b80612fc45750600160a060020a0333166000908152600e602052604090205460ff166001145b1515612fcf57600080fd5b612fda8260016136da565b613086565b60175460ff1615156001148015612ff7575060018110155b1561307157600b5433600160a060020a03908116911614806130275750600c5433600160a060020a039081169116145b806130405750600d5433600160a060020a039081169116145b806130665750600160a060020a0333166000908152600e602052604090205460ff166001145b1515612fda57600080fd5b61307b338361367b565b151561308657600080fd5b61308f84612af0565b9250821561309c57600080fd5b600192506130aa84846136da565b60408051600160a060020a03331681526020810186905281517fe7c8cc4cd1ba9ec14824c73c2717e4b5e93246adeddc00ad99b58809de629893929181900390910190a150505050565b601754610100900460ff1681565b600b5433600160a060020a039081169116148061312d5750600c5433600160a060020a039081169116145b151561313857600080fd5b63ffffffff808316600090815260166020526040902054161561315a57600080fd5b63ffffffff9182166000908152601660205260409020805463ffffffff191691909216179055565b600f54610100900460ff1681565b606061319b82612090565b15156131a657600080fd5b600a805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015612c1d5780601f10612bf257610100808354040283529160200191612c1d565b6000805b825181101561173657828181518110151561321c57fe5b906020019060200201519150613231826125d9565b600101613205565b60008061324583612090565b151561325057600080fd5b505060009081526011602052604090205467ffffffffffffffff1690565b600b5433600160a060020a03908116911614806132995750600c5433600160a060020a039081169116145b15156132a457600080fd5b6121ab81613d61565b600f5460ff1615156132be57600080fd5b6132c8338261367b565b15156132d357600080fd5b6121ab8160006136da565b600b5433600160a060020a03908116911614806133095750600c5433600160a060020a039081169116145b806133225750600d5433600160a060020a039081169116145b806133485750600160a060020a0333166000908152600e602052604090205460ff166001145b151561335357600080fd5b600061335e82612af0565b1161336857600080fd5b6133738160006136da565b60408051600160a060020a03331681526020810183905281517fffc1fb52133080290c5e0540b2b3501c06e2369e230ba437804271c8a22f61f9929181900390910190a150565b600160a060020a03918216600090815260036020908152604080832093909416825291909152205460ff1690565b600d54600160a060020a031681565b600c54600160a060020a031681565b600091825260146020908152604080842063ffffffff93909316845291905290205467ffffffffffffffff1690565b600b5433600160a060020a03908116911614806134605750600c5433600160a060020a039081169116145b806134795750600d5433600160a060020a039081169116145b8061349f5750600160a060020a0333166000908152600e602052604090205460ff166001145b15156134aa57600080fd5b612089848484846000613a11565b600b5433600160a060020a03908116911614806134e35750600c5433600160a060020a039081169116145b15156134ee57600080fd5b600160a060020a038116151561350357600080fd5b600d8054600160a060020a031916600160a060020a0392909216919091179055565b600b5433600160a060020a03908116911614806135505750600c5433600160a060020a039081169116145b151561355b57600080fd5b6017805460ff1916911515919091179055565b600061357a838361367b565b9392505050565b600b5460009081908190819033600160a060020a03908116911614806135b55750600c5433600160a060020a039081169116145b806135ce5750600d5433600160a060020a039081169116145b806135f45750600160a060020a0333166000908152600e602052604090205460ff166001145b15156135ff57600080fd5b5060005b855181101561367157878181518110151561361a57fe5b906020019060200201519350858181518110151561363457fe5b906020019060200201519250868181518110151561364e57fe5b906020019060200201519150613668848385886000613a11565b50600101613603565b5050505050505050565b600080613687836121f4565b905080600160a060020a031684600160a060020a031614806136c2575083600160a060020a03166136b784611632565b600160a060020a0316145b806136d257506136d281856133ba565b949350505050565b60009182526011602052604090912080546801000000000000000090920267ffffffffffffffff8316176fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff19909216919091179055565b60008060006137428585613d74565b60008481526009602052604090205460085490935061376890600163ffffffff613dbb16565b915060088281548110151561377957fe5b906000526020600020015490508060088481548110151561379657fe5b600091825260208220019190915560088054849081106137b257fe5b60009182526020909120015560088054906137d190600019830161400b565b50600093845260096020526040808520859055908452909220555050565b81600160a060020a0316613802826121f4565b600160a060020a03161461381557600080fd5b600081815260016020526040902054600160a060020a03161561188f5760008181526001602090815260408083208054600160a060020a031916905580518481529051600160a060020a038616927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35050565b600080600061389e8585613dcd565b600084815260076020908152604080832054600160a060020a03891684526006909252909120549093506138d990600163ffffffff613dbb16565b600160a060020a03861660009081526006602052604090208054919350908390811061390157fe5b90600052602060002001549050806006600087600160a060020a0316600160a060020a031681526020019081526020016000208481548110151561394157fe5b6000918252602080832090910192909255600160a060020a038716815260069091526040812080548490811061397357fe5b6000918252602080832090910192909255600160a060020a03871681526006909152604090208054906139aa90600019830161400b565b50600093845260076020526040808520859055908452909220555050565b60006139d48383613e55565b50600160a060020a039091166000908152600660209081526040808320805460018101825590845282842081018590559383526007909152902055565b63ffffffff8085166000908152601260209081526040808320546016909252822054919267ffffffffffffffff9091166001019183918291161580613a6c575063ffffffff8089166000908152601660205260409020541683105b1515613a7757600080fd5b67ffffffffffffffff83168314613a8d57600080fd5b613a978988613ed7565b50506000858152601060209081526040808320600160a060020a0387811642740100000000000000000000000000000000000000008102919091177a0100000000000000000000000000000000000000000000000000008d0217928390556011855283862080546fffffffffffffffffffffffffffffffff1916680100000000000000008c0289176fffffffffffffffffffffffffffffffff81169190911790915563ffffffff8d1680885260128752858820805467ffffffffffffffff1980821667ffffffffffffffff9283166001018316179092558a8a5260148952878a20928a52918852978690208054909816908d16179096558351918d1682529381018a90528083018b905260608101869052608081019390935290519092917fa2571347e02ec8b09802baaecc0034c9e14fd9fc5d227678ae11e8d590fcba429160a0918190039190910190a15094979650505050505050565b600080613c0585600160a060020a0316613f26565b1515613c145760019150613d58565b84600160a060020a031663f0b9e5ba8786866040518463ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018084600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613cac578181015183820152602001613c94565b50505050905090810190601f168015613cd95780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015613cfa57600080fd5b505af1158015613d0e573d6000803e3d6000fd5b505050506040513d6020811015613d2457600080fd5b5051600160e060020a031981167ff0b9e5ba0000000000000000000000000000000000000000000000000000000014925090505b50949350505050565b805161188f90600a906020840190613f8d565b613d7e82826137ef565b613d88828261388f565b604080518281529051600091600160a060020a038516916000805160206140468339815191529181900360200190a35050565b600082821115613dc757fe5b50900390565b81600160a060020a0316613de0826121f4565b600160a060020a031614613df357600080fd5b600160a060020a038216600090815260026020526040902054613e1d90600163ffffffff613dbb16565b600160a060020a0390921660009081526002602090815260408083209490945591815290819052208054600160a060020a0319169055565b600081815260208190526040902054600160a060020a031615613e7757600080fd5b6000818152602081815260408083208054600160a060020a031916600160a060020a03871690811790915583526002909152902054613eb7906001613f2e565b600160a060020a0390921660009081526002602052604090209190915550565b613ee18282613f3b565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3015550565b6000903b1190565b8181018281101561151c57fe5b600160a060020a0382161515613f5057600080fd5b613f5a82826139c8565b604080518281529051600160a060020a038416916000916000805160206140468339815191529181900360200190a35050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613fce57805160ff1916838001178555613ffb565b82800160010185558215613ffb579182015b82811115613ffb578251825591602001919060010190613fe0565b5061400792915061402b565b5090565b815481835581811115611736576000838152602090206117369181019083015b6115b691905b8082111561400757600081556001016140315600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a723058207ba6d647dfc4c3d9f9692264302bcbfa1c1e96a6ec11a5a43f31a91efd079d650029

Swarm Source

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