ETH Price: $3,405.17 (-1.96%)
Gas: 5 Gwei

Token

( (CSCPF))
 

Overview

Max Total Supply

870 CSCPF

Holders

185

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 0 Decimals)

Balance
1 CSCPF

Value
$0.00
0xf8ba7ebb3a328779d906ae4873a01e7d5bfc8659
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CSCPreSaleManager

Compiler Version
v0.4.21+commit.dfe3193c

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

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

pragma solidity ^0.4.19;

/* Adapted from strings.sol created by Nick Johnson <[email protected]>
 * Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol
 * @title String & slice utility library for Solidity contracts.
 * @author Nick Johnson <[email protected]>
 */
library strings {
    
    struct slice {
        uint _len;
        uint _ptr;
    }

    /*
     * @dev Returns a slice containing the entire string.
     * @param self The string to make a slice from.
     * @return A newly allocated slice containing the entire string.
     */
    function toSlice(string self) internal pure returns (slice) {
        uint ptr;
        assembly {
            ptr := add(self, 0x20)
        }
        return slice(bytes(self).length, ptr);
    }

    function memcpy(uint dest, uint src, uint len) private pure {
        // Copy word-length chunks while possible
        for(; len >= 32; len -= 32) {
            assembly {
                mstore(dest, mload(src))
            }
            dest += 32;
            src += 32;
        }

        // Copy remaining bytes
        uint mask = 256 ** (32 - len) - 1;
        assembly {
            let srcpart := and(mload(src), not(mask))
            let destpart := and(mload(dest), mask)
            mstore(dest, or(destpart, srcpart))
        }
    }

    
    function concat(slice self, slice other) internal returns (string) {
        var ret = new string(self._len + other._len);
        uint retptr;
        assembly { retptr := add(ret, 32) }
        memcpy(retptr, self._ptr, self._len);
        memcpy(retptr + self._len, other._ptr, other._len);
        return ret;
    }

    /*
     * @dev Counts the number of nonoverlapping occurrences of `needle` in `self`.
     * @param self The slice to search.
     * @param needle The text to search for in `self`.
     * @return The number of occurrences of `needle` found in `self`.
     */
    function count(slice self, slice needle) internal returns (uint cnt) {
        uint ptr = findPtr(self._len, self._ptr, needle._len, needle._ptr) + needle._len;
        while (ptr <= self._ptr + self._len) {
            cnt++;
            ptr = findPtr(self._len - (ptr - self._ptr), ptr, needle._len, needle._ptr) + needle._len;
        }
    }

    // Returns the memory address of the first byte of the first occurrence of
    // `needle` in `self`, or the first byte after `self` if not found.
    function findPtr(uint selflen, uint selfptr, uint needlelen, uint needleptr) private returns (uint) {
        uint ptr;
        uint idx;

        if (needlelen <= selflen) {
            if (needlelen <= 32) {
                // Optimized assembly for 68 gas per byte on short strings
                assembly {
                    let mask := not(sub(exp(2, mul(8, sub(32, needlelen))), 1))
                    let needledata := and(mload(needleptr), mask)
                    let end := add(selfptr, sub(selflen, needlelen))
                    ptr := selfptr
                    loop:
                    jumpi(exit, eq(and(mload(ptr), mask), needledata))
                    ptr := add(ptr, 1)
                    jumpi(loop, lt(sub(ptr, 1), end))
                    ptr := add(selfptr, selflen)
                    exit:
                }
                return ptr;
            } else {
                // For long needles, use hashing
                bytes32 hash;
                assembly { hash := sha3(needleptr, needlelen) }
                ptr = selfptr;
                for (idx = 0; idx <= selflen - needlelen; idx++) {
                    bytes32 testHash;
                    assembly { testHash := sha3(ptr, needlelen) }
                    if (hash == testHash)
                        return ptr;
                    ptr += 1;
                }
            }
        }
        return selfptr + selflen;
    }

    /*
     * @dev Splits the slice, setting `self` to everything after the first
     *      occurrence of `needle`, and `token` to everything before it. If
     *      `needle` does not occur in `self`, `self` is set to the empty slice,
     *      and `token` is set to the entirety of `self`.
     * @param self The slice to split.
     * @param needle The text to search for in `self`.
     * @param token An output parameter to which the first token is written.
     * @return `token`.
     */
    function split(slice self, slice needle, slice token) internal returns (slice) {
        uint ptr = findPtr(self._len, self._ptr, needle._len, needle._ptr);
        token._ptr = self._ptr;
        token._len = ptr - self._ptr;
        if (ptr == self._ptr + self._len) {
            // Not found
            self._len = 0;
        } else {
            self._len -= token._len + needle._len;
            self._ptr = ptr + needle._len;
        }
        return token;
    }

     /*
     * @dev Splits the slice, setting `self` to everything after the first
     *      occurrence of `needle`, and returning everything before it. If
     *      `needle` does not occur in `self`, `self` is set to the empty slice,
     *      and the entirety of `self` is returned.
     * @param self The slice to split.
     * @param needle The text to search for in `self`.
     * @return The part of `self` up to the first occurrence of `delim`.
     */
    function split(slice self, slice needle) internal returns (slice token) {
        split(self, needle, token);
    }

    /*
     * @dev Copies a slice to a new string.
     * @param self The slice to copy.
     * @return A newly allocated string containing the slice's text.
     */
    function toString(slice self) internal pure returns (string) {
        var ret = new string(self._len);
        uint retptr;
        assembly { retptr := add(ret, 32) }

        memcpy(retptr, self._ptr, self._len);
        return ret;
    }

}

/* Helper String Functions for Game Manager Contract
 * @title String Healpers
 * @author Fazri Zubair & Farhan Khwaja (Lucid Sight, Inc.)
 */
contract StringHelpers {
    using strings for *;
    
    function stringToBytes32(string memory source) internal returns (bytes32 result) {
        bytes memory tempEmptyStringTest = bytes(source);
        if (tempEmptyStringTest.length == 0) {
            return 0x0;
        }
    
        assembly {
            result := mload(add(source, 32))
        }
    }

    function bytes32ToString(bytes32 x) constant internal returns (string) {
        bytes memory bytesString = new bytes(32);
        uint charCount = 0;
        for (uint j = 0; j < 32; j++) {
            byte char = byte(bytes32(uint(x) * 2 ** (8 * j)));
            if (char != 0) {
                bytesString[charCount] = char;
                charCount++;
            }
        }
        bytes memory bytesStringTrimmed = new bytes(charCount);
        for (j = 0; j < charCount; j++) {
            bytesStringTrimmed[j] = bytesString[j];
        }
        return string(bytesStringTrimmed);
    }
}

/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens
/// @author Dieter Shirley <[email protected]> (https://github.com/dete)
contract ERC721 {
  // Required methods
  function balanceOf(address _owner) public view returns (uint256 balance);
  function ownerOf(uint256 _tokenId) public view returns (address owner);
  function approve(address _to, uint256 _tokenId) public;
  function transfer(address _to, uint256 _tokenId) public;
  function transferFrom(address _from, address _to, uint256 _tokenId) public;
  function implementsERC721() public pure returns (bool);
  function takeOwnership(uint256 _tokenId) public;
  function totalSupply() public view returns (uint256 total);

  event Transfer(address indexed from, address indexed to, uint256 tokenId);
  event Approval(address indexed owner, address indexed approved, uint256 tokenId);

  // Optional
  // function name() public view returns (string name);
  // function symbol() public view returns (string symbol);
  // function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256 tokenId);
  // function tokenMetadata(uint256 _tokenId) public view returns (string infoUrl);

  // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)
  function supportsInterface(bytes4 _interfaceID) external view returns (bool);
}

/* 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.

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

    // @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 anyOperator() {
        require(
            msg.sender == managerPrimary ||
            msg.sender == managerSecondary ||
            msg.sender == bankManager
        );
        _;
    }

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

contract CSCPreSaleItemBase is ERC721, OperationalControl, StringHelpers {

    /*** EVENTS ***/
    /// @dev The Created event is fired whenever a new collectible comes into existence.
    event CollectibleCreated(address owner, uint256 globalId, uint256 collectibleType, uint256 collectibleClass, uint256 sequenceId, bytes32 collectibleName);
    
    /*** CONSTANTS ***/
    
    /// @notice Name and symbol of the non fungible token, as defined in ERC721.
    string public constant NAME = "CSCPreSaleFactory";
    string public constant SYMBOL = "CSCPF";
    bytes4 constant InterfaceSignature_ERC165 = bytes4(keccak256('supportsInterface(bytes4)'));
    bytes4 constant InterfaceSignature_ERC721 =
        bytes4(keccak256('name()')) ^
        bytes4(keccak256('symbol()')) ^
        bytes4(keccak256('totalSupply()')) ^
        bytes4(keccak256('balanceOf(address)')) ^
        bytes4(keccak256('ownerOf(uint256)')) ^
        bytes4(keccak256('approve(address,uint256)')) ^
        bytes4(keccak256('transfer(address,uint256)')) ^
        bytes4(keccak256('transferFrom(address,address,uint256)')) ^
        bytes4(keccak256('tokensOfOwner(address)')) ^
        bytes4(keccak256('tokenMetadata(uint256,string)'));
    
    /// @dev CSC Pre Sale Struct, having details of the collectible
    struct CSCPreSaleItem {
    
        /// @dev sequence ID i..e Local Index
        uint256 sequenceId;
        
        /// @dev name of the collectible stored in bytes
        bytes32 collectibleName;
        
        /// @dev Collectible Type
        uint256 collectibleType;
        
        /// @dev Collectible Class
        uint256 collectibleClass;
        
        /// @dev owner address
        address owner;
        
        /// @dev redeemed flag (to help whether it got redeemed or not)
        bool isRedeemed;
    }
    
    /// @dev array of CSCPreSaleItem type holding information on the Collectibles Created
    CSCPreSaleItem[] allPreSaleItems;
    
    /// @dev Max Count for preSaleItem type -> preSaleItem class -> max. limit
    mapping(uint256 => mapping(uint256 => uint256)) public preSaleItemTypeToClassToMaxLimit;
    
    /// @dev Map from preSaleItem type -> preSaleItem class -> max. limit set (bool)
    mapping(uint256 => mapping(uint256 => bool)) public preSaleItemTypeToClassToMaxLimitSet;

    /// @dev Map from preSaleItem type -> preSaleItem class -> Name (string / bytes32)
    mapping(uint256 => mapping(uint256 => bytes32)) public preSaleItemTypeToClassToName;
    
    // @dev mapping which holds all the possible addresses which are allowed to interact with the contract
    mapping (address => bool) approvedAddressList;
    
    // @dev mapping holds the preSaleItem -> owner details
    mapping (uint256 => address) public preSaleItemIndexToOwner;
    
    // @dev A mapping from owner address to count of tokens that address owns.
    //  Used internally inside balanceOf() to resolve ownership count.
    mapping (address => uint256) private ownershipTokenCount;
    
    /// @dev A mapping from preSaleItem to an address that has been approved to call
    ///  transferFrom(). Each Collectible can only have one approved address for transfer
    ///  at any time. A zero value means no approval is outstanding.
    mapping (uint256 => address) public preSaleItemIndexToApproved;
    
    /// @dev A mapping of preSaleItem Type to Type Sequence Number to Collectible
    mapping (uint256 => mapping (uint256 => mapping ( uint256 => uint256 ) ) ) public preSaleItemTypeToSequenceIdToCollectible;
    
    /// @dev A mapping from Pre Sale Item Type IDs to the Sequqence Number .
    mapping (uint256 => mapping ( uint256 => uint256 ) ) public preSaleItemTypeToCollectibleCount;

    /// @dev Token Starting Index taking into account the old presaleContract total assets that can be generated
    uint256 public STARTING_ASSET_BASE = 3000;
    
    /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).
    ///  Returns true for any standardized interfaces implemented by this contract. We implement
    ///  ERC-165 (obviously!) and ERC-721.
    function supportsInterface(bytes4 _interfaceID) external view returns (bool)
    {
        // DEBUG ONLY
        //require((InterfaceSignature_ERC165 == 0x01ffc9a7) && (InterfaceSignature_ERC721 == 0x9a20483d));
        return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));
    }
    
    function setMaxLimit(string _collectibleName, uint256 _collectibleType, uint256 _collectibleClass, uint256 _maxLimit) external onlyManager whenNotPaused {
        require(_maxLimit > 0);
        require(_collectibleType >= 0 && _collectibleClass >= 0);
        require(stringToBytes32(_collectibleName) != stringToBytes32(""));

        require(!preSaleItemTypeToClassToMaxLimitSet[_collectibleType][_collectibleClass]);
        preSaleItemTypeToClassToMaxLimit[_collectibleType][_collectibleClass] = _maxLimit;
        preSaleItemTypeToClassToMaxLimitSet[_collectibleType][_collectibleClass] = true;
        preSaleItemTypeToClassToName[_collectibleType][_collectibleClass] = stringToBytes32(_collectibleName);
    }
    
    /// @dev Method to fetch collectible details
    function getCollectibleDetails(uint256 _tokenId) external view returns(uint256 assetId, uint256 sequenceId, uint256 collectibleType, uint256 collectibleClass, string collectibleName, bool isRedeemed, address owner) {

        require (_tokenId > STARTING_ASSET_BASE);
        uint256 generatedCollectibleId = _tokenId - STARTING_ASSET_BASE;
        
        CSCPreSaleItem memory _Obj = allPreSaleItems[generatedCollectibleId];
        assetId = _tokenId;
        sequenceId = _Obj.sequenceId;
        collectibleType = _Obj.collectibleType;
        collectibleClass = _Obj.collectibleClass;
        collectibleName = bytes32ToString(_Obj.collectibleName);
        owner = _Obj.owner;
        isRedeemed = _Obj.isRedeemed;
    }
    
    /*** PUBLIC FUNCTIONS ***/
    /// @notice Grant another address the right to transfer token via takeOwnership() and transferFrom().
    /// @param _to The address to be granted transfer approval. Pass address(0) to
    ///  clear all approvals.
    /// @param _tokenId The ID of the Token that can be transferred if this call succeeds.
    /// @dev Required for ERC-721 compliance.
    function approve(address _to, uint256 _tokenId) public {
        // Caller must own token.
        require (_tokenId > STARTING_ASSET_BASE);
        
        require(_owns(msg.sender, _tokenId));
        preSaleItemIndexToApproved[_tokenId] = _to;
        
        Approval(msg.sender, _to, _tokenId);
    }
    
    /// For querying balance of a particular account
    /// @param _owner The address for balance query
    /// @dev Required for ERC-721 compliance.
    function balanceOf(address _owner) public view returns (uint256 balance) {
        return ownershipTokenCount[_owner];
    }
    
    function implementsERC721() public pure returns (bool) {
        return true;
    }
    
    /// For querying owner of token
    /// @param _tokenId The tokenID for owner inquiry
    /// @dev Required for ERC-721 compliance.
    function ownerOf(uint256 _tokenId) public view returns (address owner) {
        require (_tokenId > STARTING_ASSET_BASE);

        owner = preSaleItemIndexToOwner[_tokenId];
        require(owner != address(0));
    }
    
    /// @dev Required for ERC-721 compliance.
    function symbol() public pure returns (string) {
        return SYMBOL;
    }
    
    /// @notice Allow pre-approved user to take ownership of a token
    /// @param _tokenId The ID of the Token that can be transferred if this call succeeds.
    /// @dev Required for ERC-721 compliance.
    function takeOwnership(uint256 _tokenId) public {
        require (_tokenId > STARTING_ASSET_BASE);

        address newOwner = msg.sender;
        address oldOwner = preSaleItemIndexToOwner[_tokenId];
        
        // Safety check to prevent against an unexpected 0x0 default.
        require(_addressNotNull(newOwner));
        
        // Making sure transfer is approved
        require(_approved(newOwner, _tokenId));
        
        _transfer(oldOwner, newOwner, _tokenId);
    }
    
    /// @param _owner The owner whose collectibles 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 CSCPreSaleItem array looking for collectibles 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 totalCount = totalSupply() + 1 + STARTING_ASSET_BASE;
            uint256 resultIndex = 0;
        
            // We count on the fact that all LS PreSaleItems have IDs starting at 0 and increasing
            // sequentially up to the total count.
            uint256 _tokenId;
        
            for (_tokenId = STARTING_ASSET_BASE; _tokenId < totalCount; _tokenId++) {
                if (preSaleItemIndexToOwner[_tokenId] == _owner) {
                    result[resultIndex] = _tokenId;
                    resultIndex++;
                }
            }
        
            return result;
        }
    }
    
    /// For querying totalSupply of token
    /// @dev Required for ERC-721 compliance.
    function totalSupply() public view returns (uint256 total) {
        return allPreSaleItems.length - 1; //Removed 0 index
    }
    
    /// Owner initates the transfer of the token to another account
    /// @param _to The address for the token to be transferred to.
    /// @param _tokenId The ID of the Token that can be transferred if this call succeeds.
    /// @dev Required for ERC-721 compliance.
    function transfer(address _to, uint256 _tokenId) public {

        require (_tokenId > STARTING_ASSET_BASE);
        
        require(_addressNotNull(_to));
        require(_owns(msg.sender, _tokenId));
        
        _transfer(msg.sender, _to, _tokenId);
    }
    
    /// Third-party initiates transfer of token from address _from to address _to
    /// @param _from The address for the token to be transferred from.
    /// @param _to The address for the token to be transferred to.
    /// @param _tokenId The ID of the Token that can be transferred if this call succeeds.
    /// @dev Required for ERC-721 compliance.
    function transferFrom(address _from, address _to, uint256 _tokenId) public {
        require (_tokenId > STARTING_ASSET_BASE);

        require(_owns(_from, _tokenId));
        require(_approved(_to, _tokenId));
        require(_addressNotNull(_to));
        
        _transfer(_from, _to, _tokenId);
    }
    
    /*** PRIVATE FUNCTIONS ***/
    /// @dev  Safety check on _to address to prevent against an unexpected 0x0 default.
    function _addressNotNull(address _to) internal pure returns (bool) {
        return _to != address(0);
    }
    
    /// @dev  For checking approval of transfer for address _to
    function _approved(address _to, uint256 _tokenId) internal view returns (bool) {
        return preSaleItemIndexToApproved[_tokenId] == _to;
    }
    
    /// @dev For creating CSC Collectible
    function _createCollectible(bytes32 _collectibleName, uint256 _collectibleType, uint256 _collectibleClass) internal returns(uint256) {
        uint256 _sequenceId = uint256(preSaleItemTypeToCollectibleCount[_collectibleType][_collectibleClass]) + 1;
        
        // These requires are not strictly necessary, our calling code should make
        // sure that these conditions are never broken.
        require(_sequenceId == uint256(uint32(_sequenceId)));
        
        CSCPreSaleItem memory _collectibleObj = CSCPreSaleItem(
          _sequenceId,
          _collectibleName,
          _collectibleType,
          _collectibleClass,
          address(0),
          false
        );
        
        uint256 generatedCollectibleId = allPreSaleItems.push(_collectibleObj) - 1;
        uint256 collectibleIndex = generatedCollectibleId + STARTING_ASSET_BASE;
        
        preSaleItemTypeToSequenceIdToCollectible[_collectibleType][_collectibleClass][_sequenceId] = collectibleIndex;
        preSaleItemTypeToCollectibleCount[_collectibleType][_collectibleClass] = _sequenceId;
        
        // emit Created event
        // CollectibleCreated(address owner, uint256 globalId, uint256 collectibleType, uint256 collectibleClass, uint256 sequenceId, bytes32 collectibleName);
        CollectibleCreated(address(this), collectibleIndex, _collectibleType, _collectibleClass, _sequenceId, _collectibleObj.collectibleName);
        
        // This will assign ownership, and also emit the Transfer event as
        // per ERC721 draft
        _transfer(address(0), address(this), collectibleIndex);
        
        return collectibleIndex;
    }
    
    /// @dev Check for token ownership
    function _owns(address claimant, uint256 _tokenId) internal view returns (bool) {
        return claimant == preSaleItemIndexToOwner[_tokenId];
    }
    
    /// @dev Assigns ownership of a specific preSaleItem to an address.
    function _transfer(address _from, address _to, uint256 _tokenId) internal {
        uint256 generatedCollectibleId = _tokenId - STARTING_ASSET_BASE;

        // Updating the owner details of the collectible
        CSCPreSaleItem memory _Obj = allPreSaleItems[generatedCollectibleId];
        _Obj.owner = _to;
        allPreSaleItems[generatedCollectibleId] = _Obj;
        
        // Since the number of preSaleItem is capped to 2^32 we can't overflow this
        ownershipTokenCount[_to]++;
        
        //transfer ownership
        preSaleItemIndexToOwner[_tokenId] = _to;
        
        // When creating new collectibles _from is 0x0, but we can't account that address.
        if (_from != address(0)) {
          ownershipTokenCount[_from]--;
          // clear any previously approved ownership exchange
          delete preSaleItemIndexToApproved[_tokenId];
        }
        
        // Emit the transfer event.
        Transfer(_from, _to, _tokenId);
    }
    
    /// @dev Checks if a given address currently has transferApproval for a particular CSCPreSaleItem.
    /// 0 is a valid value as it will be the starter
    function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {
        require(_tokenId > STARTING_ASSET_BASE);

        return preSaleItemIndexToApproved[_tokenId] == _claimant;
    }
}

/* Lucid Sight, Inc. ERC-721 Collectibles Manager. 
 * @title LSPreSaleManager - Lucid Sight, Inc. Non-Fungible Token
 * @author Fazri Zubair & Farhan Khwaja (Lucid Sight, Inc.)
 */
contract CSCPreSaleManager is CSCPreSaleItemBase {

    event RefundClaimed(address owner, uint256 refundValue);

    /// @dev defines if preSaleItem type -> preSaleItem class -> Vending Machine to set limit (bool)
    mapping(uint256 => mapping(uint256 => bool)) public preSaleItemTypeToClassToCanBeVendingMachine;

    /// @dev defines if preSaleItem type -> preSaleItem class -> Vending Machine Fee
    mapping(uint256 => mapping(uint256 => uint256)) public preSaleItemTypeToClassToVendingFee;

    /// @dev Mapping created store the amount of value a wallet address used to buy assets
    mapping(address => uint256) public addressToValue;
    
    bool CSCPreSaleInit = false;
    /// @dev Constructor creates a reference to the NFT (ERC721) ownership contract
    function CSCPreSaleManager() public {
        require(msg.sender != address(0));
        paused = true;
        error = false;
        managerPrimary = msg.sender;
    }

    /// @dev allows the contract to accept ETH
    function() external payable {
    }
    
    /// @dev Function to add approved address to the 
    /// approved address list
    function addToApprovedAddress (address _newAddr) onlyManager whenNotPaused {
        require(_newAddr != address(0));
        require(!approvedAddressList[_newAddr]);
        approvedAddressList[_newAddr] = true;
    }
    
    /// @dev Function to remove an approved address from the 
    /// approved address list
    function removeFromApprovedAddress (address _newAddr) onlyManager whenNotPaused {
        require(_newAddr != address(0));
        require(approvedAddressList[_newAddr]);
        approvedAddressList[_newAddr] = false;
    }

    /// @dev Function toggle vending for collectible
    function toggleVending (uint256 _collectibleType, uint256 _collectibleClass) external onlyManager {
        if(preSaleItemTypeToClassToCanBeVendingMachine[_collectibleType][_collectibleClass] == false) {
            preSaleItemTypeToClassToCanBeVendingMachine[_collectibleType][_collectibleClass] = true;
        } else {
            preSaleItemTypeToClassToCanBeVendingMachine[_collectibleType][_collectibleClass] = false;
        }
    }

    /// @dev Function toggle vending for collectible
    function setVendingFee (uint256 _collectibleType, uint256 _collectibleClass, uint fee) external onlyManager {
        preSaleItemTypeToClassToVendingFee[_collectibleType][_collectibleClass] = fee;
    }
    
    /// @dev This helps in creating a collectible and then 
    /// transfer it _toAddress
    function createCollectible(uint256 _collectibleType, uint256 _collectibleClass, address _toAddress) onlyManager external whenNotPaused {
        require(msg.sender != address(0));
        require(msg.sender != address(this));
        
        require(_toAddress != address(0));
        require(_toAddress != address(this));
        
        require(preSaleItemTypeToClassToMaxLimitSet[_collectibleType][_collectibleClass]);
        require(preSaleItemTypeToCollectibleCount[_collectibleType][_collectibleClass] < preSaleItemTypeToClassToMaxLimit[_collectibleType][_collectibleClass]);
        
        uint256 _tokenId = _createCollectible(preSaleItemTypeToClassToName[_collectibleType][_collectibleClass], _collectibleType, _collectibleClass);
        
        _transfer(address(this), _toAddress, _tokenId);
    }


    /// @dev This helps in creating a collectible and then 
    /// transfer it _toAddress
    function vendingCreateCollectible(uint256 _collectibleType, uint256 _collectibleClass, address _toAddress) payable external whenNotPaused {
        
        //Only if Vending is Allowed for this Asset
        require(preSaleItemTypeToClassToCanBeVendingMachine[_collectibleType][_collectibleClass]);

        require(msg.value >= preSaleItemTypeToClassToVendingFee[_collectibleType][_collectibleClass]);

        require(msg.sender != address(0));
        require(msg.sender != address(this));
        
        require(_toAddress != address(0));
        require(_toAddress != address(this));
        
        require(preSaleItemTypeToClassToMaxLimitSet[_collectibleType][_collectibleClass]);
        require(preSaleItemTypeToCollectibleCount[_collectibleType][_collectibleClass] < preSaleItemTypeToClassToMaxLimit[_collectibleType][_collectibleClass]);
        
        uint256 _tokenId = _createCollectible(preSaleItemTypeToClassToName[_collectibleType][_collectibleClass], _collectibleType, _collectibleClass);
        uint256 excessBid = msg.value - preSaleItemTypeToClassToVendingFee[_collectibleType][_collectibleClass];
        
        if(excessBid > 0) {
            msg.sender.transfer(excessBid);
        }

        addressToValue[msg.sender] += preSaleItemTypeToClassToVendingFee[_collectibleType][_collectibleClass];
        
        _transfer(address(this), _toAddress, _tokenId);
    }

    
    
    /// @dev Override unpause so it requires all external contract addresses
    ///  to be set before contract can be unpaused. Also, we can't have
    ///  newContractAddress set either, because then the contract was upgraded.
    /// @notice This is public rather than external so we can call super.unpause
    ///  without using an expensive CALL.
    function unpause() public onlyManager whenPaused {
        // Actually unpause the contract.
        super.unpause();
    }

    /// @dev Override unpause so it requires all external contract addresses
    ///  to be set before contract can be unpaused. Also, we can't have
    ///  newContractAddress set either, because then the contract was upgraded.
    /// @notice This is public rather than external so we can call super.unpause
    ///  without using an expensive CALL.
    function hasError() public onlyManager whenPaused {
        // Actually error out the contract.
        super.hasError();
    }
    
    /// @dev Function does the init step and thus allow
    /// to create a Dummy 0th colelctible
    function preSaleInit() onlyManager {
        require(!CSCPreSaleInit);
        require(allPreSaleItems.length == 0);
        
        CSCPreSaleInit = true;
        
        //Fill in index 0 to null requests
        CSCPreSaleItem memory _Obj = CSCPreSaleItem(0, stringToBytes32("DummyAsset"), 0, 0, address(this), true);
        allPreSaleItems.push(_Obj);
    }

    /// @dev Remove all Ether from the contract, which is the owner's cuts
    ///  as well as any Ether sent directly to the contract address.
    ///  Always transfers to the NFT (ERC721) contract, but can be called either by
    ///  the owner or the NFT (ERC721) contract.
    function withdrawBalance() onlyBanker {
        // We are using this boolean method to make sure that even if one fails it will still work
        bankManager.transfer(this.balance);
    }

    // @dev a function to claim refund if and only if theres an error in the contract
    function claimRefund(address _ownerAddress) whenError {
        uint256 refundValue = addressToValue[_ownerAddress];

        require (refundValue > 0);
        
        addressToValue[_ownerAddress] = 0;

        _ownerAddress.transfer(refundValue);
        RefundClaimed(_ownerAddress, refundValue);
    }
    

    /// @dev Function used to set the flag isRedeemed to true
    /// can be called by addresses in the approvedAddressList
    function isRedeemed(uint256 _tokenId) {
        require(approvedAddressList[msg.sender]);
        require(_tokenId > STARTING_ASSET_BASE);
        uint256 generatedCollectibleId = _tokenId - STARTING_ASSET_BASE;
        
        CSCPreSaleItem memory _Obj = allPreSaleItems[generatedCollectibleId];
        _Obj.isRedeemed = true;
        
        allPreSaleItems[generatedCollectibleId] = _Obj;
    }
}

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":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"implementsERC721","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"total","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_collectibleType","type":"uint256"},{"name":"_collectibleClass","type":"uint256"},{"name":"_toAddress","type":"address"}],"name":"createCollectible","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":"uint256"},{"name":"","type":"uint256"}],"name":"preSaleItemTypeToClassToVendingFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_collectibleType","type":"uint256"},{"name":"_collectibleClass","type":"uint256"},{"name":"_toAddress","type":"address"}],"name":"vendingCreateCollectible","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"name":"preSaleItemTypeToClassToMaxLimitSet","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"name":"preSaleItemTypeToClassToMaxLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newAddr","type":"address"}],"name":"removeFromApprovedAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"isRedeemed","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"name":"preSaleItemTypeToClassToName","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"name":"preSaleItemTypeToSequenceIdToCollectible","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_collectibleType","type":"uint256"},{"name":"_collectibleClass","type":"uint256"}],"name":"toggleVending","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"STARTING_ASSET_BASE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","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":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getCollectibleDetails","outputs":[{"name":"assetId","type":"uint256"},{"name":"sequenceId","type":"uint256"},{"name":"collectibleType","type":"uint256"},{"name":"collectibleClass","type":"uint256"},{"name":"collectibleName","type":"string"},{"name":"isRedeemed","type":"bool"},{"name":"owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_collectibleName","type":"string"},{"name":"_collectibleType","type":"uint256"},{"name":"_collectibleClass","type":"uint256"},{"name":"_maxLimit","type":"uint256"}],"name":"setMaxLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","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":true,"inputs":[{"name":"","type":"uint256"}],"name":"preSaleItemIndexToOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"noError","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"NAME","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"preSaleItemIndexToApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"preSaleInit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"hasError","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"takeOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"managerPrimary","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newAddr","type":"address"}],"name":"addToApprovedAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_collectibleType","type":"uint256"},{"name":"_collectibleClass","type":"uint256"},{"name":"fee","type":"uint256"}],"name":"setVendingFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"addressToValue","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_ownerAddress","type":"address"}],"name":"claimRefund","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newGM","type":"address"}],"name":"setPrimaryManager","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":"","type":"uint256"},{"name":"","type":"uint256"}],"name":"preSaleItemTypeToClassToCanBeVendingMachine","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":false,"inputs":[{"name":"_newBK","type":"address"}],"name":"setBanker","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":"","type":"uint256"},{"name":"","type":"uint256"}],"name":"preSaleItemTypeToCollectibleCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"refundValue","type":"uint256"}],"name":"RefundClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"globalId","type":"uint256"},{"indexed":false,"name":"collectibleType","type":"uint256"},{"indexed":false,"name":"collectibleClass","type":"uint256"},{"indexed":false,"name":"sequenceId","type":"uint256"},{"indexed":false,"name":"collectibleName","type":"bytes32"}],"name":"CollectibleCreated","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"}]

60606040526002805460a060020a61ffff0219169055610bb8600d556011805460ff19169055341561003057600080fd5b33600160a060020a0316151561004557600080fd5b6002805460a860020a60ff021960a060020a60ff0219909116740100000000000000000000000000000000000000001716905560008054600160a060020a033316600160a060020a03199091161790556126e5806100a46000396000f3006060604052600436106102455763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166301ffc9a78114610247578063095ea7b3146102935780631051db34146102b557806318160ddd146102c85780631f1e6c4e146102ed57806323b872dd14610312578063285acfb01461033a5780632bac0b3b146103535780632e1921751461036d5780632f3380d91461038657806330a7351c1461039f57806332d33cd0146103be5780633499bbf3146103d45780633f4ba83a146103ed57806341255ea7146104005780634a7143781461041c578063524a8131146104355780635c975abb146104485780635fd8c7101461045b5780636352211e1461046e57806370994b31146104a057806370a08231146105655780638084ee5814610584578063825bdb74146105ac5780638456cb59146105cb5780638462151c146105de578063884bd204146106505780638a53f2301461066657806395d89b4114610679578063a3f4df7e14610703578063a4d5ed1314610716578063a7c198411461072c578063a9059cbb1461073f578063ad5e46cb14610761578063b2e6ceeb14610774578063b777cad71461078a578063b86dab461461079d578063bc37d7b8146107bc578063bff2e095146107d8578063bffa55d5146107f7578063c0619c7014610816578063c79f8b6214610835578063e78d622514610848578063e9e2990e14610861578063ee70f39214610874578063f1ff732b14610887578063f76f8d78146108a6578063f973ece9146108b9575b005b341561025257600080fd5b61027f7fffffffff00000000000000000000000000000000000000000000000000000000600435166108d2565b604051901515815260200160405180910390f35b341561029e57600080fd5b610245600160a060020a0360043516602435610b59565b34156102c057600080fd5b61027f610be6565b34156102d357600080fd5b6102db610bec565b60405190815260200160405180910390f35b34156102f857600080fd5b610245600435602435600160a060020a0360443516610bf6565b341561031d57600080fd5b610245600160a060020a0360043581169060243516604435610d48565b341561034557600080fd5b6102db600435602435610da4565b610245600435602435600160a060020a0360443516610dc1565b341561037857600080fd5b61027f600435602435610fbf565b341561039157600080fd5b6102db600435602435610fdf565b34156103aa57600080fd5b610245600160a060020a0360043516610ffc565b34156103c957600080fd5b6102456004356110a6565b34156103df57600080fd5b6102db6004356024356111ee565b34156103f857600080fd5b61024561120b565b341561040b57600080fd5b6102db600435602435604435611263565b341561042757600080fd5b610245600435602435611286565b341561044057600080fd5b6102db61132e565b341561045357600080fd5b61027f611334565b341561046657600080fd5b610245611344565b341561047957600080fd5b610484600435611398565b604051600160a060020a03909116815260200160405180910390f35b34156104ab57600080fd5b6104b66004356113ce565b60405187815260208101879052604081018690526060810185905282151560a0820152600160a060020a03821660c082015260e06080820181815290820185818151815260200191508051906020019080838360005b8381101561052457808201518382015260200161050c565b50505050905090810190601f1680156105515780820380516001836020036101000a031916815260200191505b509850505050505050505060405180910390f35b341561057057600080fd5b6102db600160a060020a03600435166114b0565b341561058f57600080fd5b6102456024600480358281019291013590356044356064356114cb565b34156105b757600080fd5b610245600160a060020a0360043516611655565b34156105d657600080fd5b6102456116c2565b34156105e957600080fd5b6105fd600160a060020a0360043516611727565b60405160208082528190810183818151815260200191508051906020019060200280838360005b8381101561063c578082015183820152602001610624565b505050509050019250505060405180910390f35b341561065b57600080fd5b610484600435611811565b341561067157600080fd5b61024561182c565b341561068457600080fd5b61068c61189b565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156106c85780820151838201526020016106b0565b50505050905090810190601f1680156106f55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561070e57600080fd5b61068c6118dc565b341561072157600080fd5b610484600435611913565b341561073757600080fd5b61024561192e565b341561074a57600080fd5b610245600160a060020a0360043516602435611aa8565b341561076c57600080fd5b610245611aea565b341561077f57600080fd5b610245600435611b40565b341561079557600080fd5b610484611ba3565b34156107a857600080fd5b610245600160a060020a0360043516611bb2565b34156107c757600080fd5b610245600435602435604435611c5e565b34156107e357600080fd5b6102db600160a060020a0360043516611cb0565b341561080257600080fd5b610245600160a060020a0360043516611cc2565b341561082157600080fd5b610245600160a060020a0360043516611da1565b341561084057600080fd5b61027f611e0e565b341561085357600080fd5b61027f600435602435611e30565b341561086c57600080fd5b610484611e50565b341561087f57600080fd5b610484611e5f565b341561089257600080fd5b610245600160a060020a0360043516611e6e565b34156108b157600080fd5b61068c611edb565b34156108c457600080fd5b6102db600435602435611f12565b60006040517f737570706f727473496e7465726661636528627974657334290000000000000081526019016040518091039020600160e060020a03191682600160e060020a0319161480610b5157506040517f746f6b656e4d657461646174612875696e743235362c737472696e67290000008152601d0160405180910390206040517f746f6b656e734f664f776e657228616464726573732900000000000000000000815260160160405180910390206040517f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81527f7432353629000000000000000000000000000000000000000000000000000000602082015260250160405180910390206040517f7472616e7366657228616464726573732c75696e743235362900000000000000815260190160405180910390206040517f617070726f766528616464726573732c75696e74323536290000000000000000815260180160405180910390206040517f6f776e65724f662875696e743235362900000000000000000000000000000000815260100160405180910390206040517f62616c616e63654f662861646472657373290000000000000000000000000000815260120160405180910390206040517f746f74616c537570706c792829000000000000000000000000000000000000008152600d0160405180910390206040517f73796d626f6c2829000000000000000000000000000000000000000000000000815260080160405180910390206040517f6e616d652829000000000000000000000000000000000000000000000000000081526006016040518091039020181818181818181818600160e060020a03191682600160e060020a031916145b90505b919050565b600d548111610b6757600080fd5b610b713382611f2f565b1515610b7c57600080fd5b6000818152600a6020526040908190208054600160a060020a031916600160a060020a038581169182179092559133909116907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259084905190815260200160405180910390a35050565b60015b90565b6003546000190190565b6000805433600160a060020a0390811691161480610c22575060015433600160a060020a039081169116145b1515610c2d57600080fd5b60025460a060020a900460ff1615610c4457600080fd5b33600160a060020a03161515610c5957600080fd5b30600160a060020a031633600160a060020a031614151515610c7a57600080fd5b600160a060020a0382161515610c8f57600080fd5b30600160a060020a031682600160a060020a031614151515610cb057600080fd5b600084815260056020908152604080832086845290915290205460ff161515610cd857600080fd5b6000848152600460209081526040808320868452825280832054878452600c83528184208785529092529091205410610d1057600080fd5b6000848152600660209081526040808320868452909152902054610d35908585611f4f565b9050610d42308383612126565b50505050565b600d548111610d5657600080fd5b610d608382611f2f565b1515610d6b57600080fd5b610d75828261230c565b1515610d8057600080fd5b610d898261232c565b1515610d9457600080fd5b610d9f838383612126565b505050565b600f60209081526000928352604080842090915290825290205481565b600254600090819060a060020a900460ff1615610ddd57600080fd5b6000858152600e6020908152604080832087845290915290205460ff161515610e0557600080fd5b6000858152600f60209081526040808320878452909152902054341015610e2b57600080fd5b33600160a060020a03161515610e4057600080fd5b30600160a060020a031633600160a060020a031614151515610e6157600080fd5b600160a060020a0383161515610e7657600080fd5b30600160a060020a031683600160a060020a031614151515610e9757600080fd5b600085815260056020908152604080832087845290915290205460ff161515610ebf57600080fd5b6000858152600460209081526040808320878452825280832054888452600c83528184208885529092529091205410610ef757600080fd5b6000858152600660209081526040808320878452909152902054610f1c908686611f4f565b6000868152600f6020908152604080832088845290915281205491935034919091039150811115610f7857600160a060020a03331681156108fc0282604051600060405180830381858888f193505050501515610f7857600080fd5b6000858152600f60209081526040808320878452825280832054600160a060020a0333168452601090925290912080549091019055610fb8308484612126565b5050505050565b600560209081526000928352604080842090915290825290205460ff1681565b600460209081526000928352604080842090915290825290205481565b60005433600160a060020a0390811691161480611027575060015433600160a060020a039081169116145b151561103257600080fd5b60025460a060020a900460ff161561104957600080fd5b600160a060020a038116151561105e57600080fd5b600160a060020a03811660009081526007602052604090205460ff16151561108557600080fd5b600160a060020a03166000908152600760205260409020805460ff19169055565b60006110b06125fc565b600160a060020a03331660009081526007602052604090205460ff1615156110d757600080fd5b600d5483116110e557600080fd5b600d54830391506003828154811015156110fb57fe5b906000526020600020906005020160c060405190810160409081528254825260018084015460208401526002840154918301919091526003808401546060840152600490930154600160a060020a0316608083015260a082015281549092508291908490811061116757fe5b9060005260206000209060050201600082015181556020820151600182015560408201518160020155606082015181600301556080820151600482018054600160a060020a031916600160a060020a039290921691909117905560a08201516004909101805491151560a060020a0260a060020a60ff021990921691909117905550505050565b600660209081526000928352604080842090915290825290205481565b60005433600160a060020a0390811691161480611236575060015433600160a060020a039081169116145b151561124157600080fd5b60025460a060020a900460ff16151561125957600080fd5b61126161233a565b565b600b60209081526000938452604080852082529284528284209052825290205481565b60005433600160a060020a03908116911614806112b1575060015433600160a060020a039081169116145b15156112bc57600080fd5b6000828152600e6020908152604080832084845290915290205460ff161515611308576000828152600e602090815260408083208484529091529020805460ff1916600117905561132a565b6000828152600e602090815260408083208484529091529020805460ff191690555b5050565b600d5481565b60025460a060020a900460ff1681565b60025433600160a060020a0390811691161461135f57600080fd5b600254600160a060020a039081169030163180156108fc0290604051600060405180830381858888f19350505050151561126157600080fd5b600d5460009082116113a957600080fd5b50600081815260086020526040902054600160a060020a0316801515610b5457600080fd5b6000806000806113dc612631565b60008060006113e96125fc565b600d548a116113f757600080fd5b600d548a03915060038281548110151561140d57fe5b906000526020600020906005020160c06040519081016040908152825482526001830154602083015260028301549082015260038201546060820152600490910154600160a060020a038116608083015260a060020a900460ff16151560a08201528a99509050805197508060400151965080606001519550611493816020015161239a565b9450806080015192508060a0015193505050919395979092949650565b600160a060020a031660009081526009602052604090205490565b60005433600160a060020a03908116911614806114f6575060015433600160a060020a039081169116145b151561150157600080fd5b60025460a060020a900460ff161561151857600080fd5b6000811161152557600080fd5b60008310158015611537575060008210155b151561154257600080fd5b61155960206040519081016040526000815261254a565b6115908686806020601f8201819004810201604051908101604052818152929190602084018383808284375061254a945050505050565b141561159b57600080fd5b600083815260056020908152604080832085845290915290205460ff16156115c257600080fd5b6000838152600460209081526040808320858452825280832084905585835260058252808320858452825291829020805460ff1916600117905561163491879187918291601f83018190048102019051908101604052818152929190602084018383808284375061254a945050505050565b60009384526006602090815260408086209486529390529190922055505050565b60005433600160a060020a0390811691161480611680575060015433600160a060020a039081169116145b151561168b57600080fd5b600160a060020a03811615156116a057600080fd5b60018054600160a060020a031916600160a060020a0392909216919091179055565b60005433600160a060020a03908116911614806116ed575060015433600160a060020a039081169116145b15156116f857600080fd5b60025460a060020a900460ff161561170f57600080fd5b6002805460a060020a60ff02191660a060020a179055565b61172f612631565b6000611739612631565b6000806000611747876114b0565b945084151561177757600060405180591061175f5750595b90808252806020026020018201604052509550611807565b846040518059106117855750595b90808252806020026020018201604052509350600d546117a3610bec565b60010101925060009150600d5490505b8281101561180357600081815260086020526040902054600160a060020a03888116911614156117fb57808483815181106117ea57fe5b602090810290910101526001909101905b6001016117b3565b8395505b5050505050919050565b600860205260009081526040902054600160a060020a031681565b60005433600160a060020a0390811691161480611857575060015433600160a060020a039081169116145b151561186257600080fd5b60025460a060020a900460ff16151561187a57600080fd5b6002805475ff00000000000000000000000000000000000000000019169055565b6118a3612631565b60408051908101604052600581527f43534350460000000000000000000000000000000000000000000000000000006020820152905090565b60408051908101604052601181527f43534350726553616c65466163746f7279000000000000000000000000000000602082015281565b600a60205260009081526040902054600160a060020a031681565b6119366125fc565b60005433600160a060020a0390811691161480611961575060015433600160a060020a039081169116145b151561196c57600080fd5b60115460ff161561197c57600080fd5b6003541561198957600080fd5b6011805460ff1916600117905560c060405190810160405280600081526020016119e560408051908101604052600a81527f44756d6d79417373657400000000000000000000000000000000000000000000602082015261254a565b81526000602082018190526040820152600160a060020a0330166060820152600160809091018190526003805492935091908101611a238382612643565b60009283526020909220839160050201815181556020820151600182015560408201518160020155606082015181600301556080820151600482018054600160a060020a031916600160a060020a039290921691909117905560a08201516004909101805491151560a060020a0260a060020a60ff0219909216919091179055505050565b600d548111611ab657600080fd5b611abf8261232c565b1515611aca57600080fd5b611ad43382611f2f565b1515611adf57600080fd5b61132a338383612126565b60005433600160a060020a0390811691161480611b15575060015433600160a060020a039081169116145b1515611b2057600080fd5b60025460a060020a900460ff161515611b3857600080fd5b611261612575565b600080600d5483111515611b5357600080fd5b50506000818152600860205260409020543390600160a060020a0316611b788261232c565b1515611b8357600080fd5b611b8d828461230c565b1515611b9857600080fd5b610d9f818385612126565b600054600160a060020a031681565b60005433600160a060020a0390811691161480611bdd575060015433600160a060020a039081169116145b1515611be857600080fd5b60025460a060020a900460ff1615611bff57600080fd5b600160a060020a0381161515611c1457600080fd5b600160a060020a03811660009081526007602052604090205460ff1615611c3a57600080fd5b600160a060020a03166000908152600760205260409020805460ff19166001179055565b60005433600160a060020a0390811691161480611c89575060015433600160a060020a039081169116145b1515611c9457600080fd5b6000928352600f60209081526040808520938552929052912055565b60106020526000908152604090205481565b6002546000907501000000000000000000000000000000000000000000900460ff161515611cef57600080fd5b50600160a060020a038116600090815260106020526040812054908111611d1557600080fd5b600160a060020a0382166000818152601060205260408082209190915582156108fc0290839051600060405180830381858888f193505050501515611d5957600080fd5b7f358fe4192934d3bf28ae181feda1f4bd08ca67f5e2fad55582cce5eb67304ae98282604051600160a060020a03909216825260208201526040908101905180910390a15050565b60005433600160a060020a0390811691161480611dcc575060015433600160a060020a039081169116145b1515611dd757600080fd5b600160a060020a0381161515611dec57600080fd5b60008054600160a060020a031916600160a060020a0392909216919091179055565b6002547501000000000000000000000000000000000000000000900460ff1681565b600e60209081526000928352604080842090915290825290205460ff1681565b600254600160a060020a031681565b600154600160a060020a031681565b60005433600160a060020a0390811691161480611e99575060015433600160a060020a039081169116145b1515611ea457600080fd5b600160a060020a0381161515611eb957600080fd5b60028054600160a060020a031916600160a060020a0392909216919091179055565b60408051908101604052600581527f4353435046000000000000000000000000000000000000000000000000000000602082015281565b600c60209081526000928352604080842090915290825290205481565b600090815260086020526040902054600160a060020a0390811691161490565b600080611f5a6125fc565b6000858152600c6020908152604080832087845290915281205460010192508063ffffffff84168414611f8c57600080fd5b60c06040519081016040908152858252602082018a905281018890526060810187905260006080820181905260a082015260038054919450600191808301611fd48382612643565b60009283526020909220869160050201815181556020820151600182015560408201518160020155606082015181600301556080820151600482018054600160a060020a031916600160a060020a039290921691909117905560a08201516004909101805491151560a060020a0260a060020a60ff021990921691909117905550600d5460008a8152600b602090815260408083208c845282528083208a8452825280832095909403928301948590558b8252600c81528382208b8352815292902087905593509091507f21b6aa36302fbeb5de063ccfac1338053e8cb8939202417afc214d741f22bb6190309083908a908a908990890151604051600160a060020a03909616865260208601949094526040808601939093526060850191909152608084015260a083019190915260c0909101905180910390a161211b60003083612126565b979650505050505050565b60006121306125fc565b600d548303915060038281548110151561214657fe5b906000526020600020906005020160c060405190810160409081528254825260018301546020830152600283015490820152600380830154606083015260049092015460a060020a900460ff16151560a0820152600160a060020a03861660808201528154909250829190849081106121bb57fe5b9060005260206000209060050201600082015181556020820151600182015560408201518160020155606082015181600301556080820151600482018054600160a060020a031916600160a060020a039290921691909117905560a08201516004909101805491151560a060020a0260a060020a60ff021990921691909117905550600160a060020a03808516600081815260096020908152604080832080546001019055878352600890915290208054600160a060020a03191690911790558516156122be57600160a060020a03851660009081526009602090815260408083208054600019019055858352600a90915290208054600160a060020a03191690555b83600160a060020a031685600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405190815260200160405180910390a35050505050565b6000908152600a6020526040902054600160a060020a0391821691161490565b600160a060020a0316151590565b60005433600160a060020a0390811691161480612365575060015433600160a060020a039081169116145b151561237057600080fd5b60025460a060020a900460ff16151561238857600080fd5b6002805460a060020a60ff0219169055565b6123a2612631565b6123aa612631565b60008060006123b7612631565b60206040518059106123c65750595b818152601f19601f83011681016020016040529050945060009350600092505b6020831015612471576008830260020a870291507fff00000000000000000000000000000000000000000000000000000000000000821615612466578185858151811061242f57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001909301925b6001909201916123e6565b8360405180591061247f5750595b818152601f19601f830116810160200160405290509050600092505b83831015612540578483815181106124af57fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000281848151811061250557fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060019092019161249b565b9695505050505050565b6000612554612631565b508180511515612567576000915061256f565b602083015191505b50919050565b60005433600160a060020a03908116911614806125a0575060015433600160a060020a039081169116145b15156125ab57600080fd5b60025460a060020a900460ff1615156125c357600080fd5b6002805475ff00000000000000000000000000000000000000000019167501000000000000000000000000000000000000000000179055565b60c06040519081016040908152600080835260208301819052908201819052606082018190526080820181905260a082015290565b60206040519081016040526000815290565b815481835581811511610d9f57600083815260209020610d9f91610be99160059182028101918502015b808211156126b55760008082556001820181905560028201819055600382015560048101805474ffffffffffffffffffffffffffffffffffffffffff1916905560050161266d565b50905600a165627a7a72305820b2b9dd3bf5ecc3d49a61c5cef8fc7f3e01428a82af13e7c297d4116e962a67b10029

Deployed Bytecode

0x6060604052600436106102455763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166301ffc9a78114610247578063095ea7b3146102935780631051db34146102b557806318160ddd146102c85780631f1e6c4e146102ed57806323b872dd14610312578063285acfb01461033a5780632bac0b3b146103535780632e1921751461036d5780632f3380d91461038657806330a7351c1461039f57806332d33cd0146103be5780633499bbf3146103d45780633f4ba83a146103ed57806341255ea7146104005780634a7143781461041c578063524a8131146104355780635c975abb146104485780635fd8c7101461045b5780636352211e1461046e57806370994b31146104a057806370a08231146105655780638084ee5814610584578063825bdb74146105ac5780638456cb59146105cb5780638462151c146105de578063884bd204146106505780638a53f2301461066657806395d89b4114610679578063a3f4df7e14610703578063a4d5ed1314610716578063a7c198411461072c578063a9059cbb1461073f578063ad5e46cb14610761578063b2e6ceeb14610774578063b777cad71461078a578063b86dab461461079d578063bc37d7b8146107bc578063bff2e095146107d8578063bffa55d5146107f7578063c0619c7014610816578063c79f8b6214610835578063e78d622514610848578063e9e2990e14610861578063ee70f39214610874578063f1ff732b14610887578063f76f8d78146108a6578063f973ece9146108b9575b005b341561025257600080fd5b61027f7fffffffff00000000000000000000000000000000000000000000000000000000600435166108d2565b604051901515815260200160405180910390f35b341561029e57600080fd5b610245600160a060020a0360043516602435610b59565b34156102c057600080fd5b61027f610be6565b34156102d357600080fd5b6102db610bec565b60405190815260200160405180910390f35b34156102f857600080fd5b610245600435602435600160a060020a0360443516610bf6565b341561031d57600080fd5b610245600160a060020a0360043581169060243516604435610d48565b341561034557600080fd5b6102db600435602435610da4565b610245600435602435600160a060020a0360443516610dc1565b341561037857600080fd5b61027f600435602435610fbf565b341561039157600080fd5b6102db600435602435610fdf565b34156103aa57600080fd5b610245600160a060020a0360043516610ffc565b34156103c957600080fd5b6102456004356110a6565b34156103df57600080fd5b6102db6004356024356111ee565b34156103f857600080fd5b61024561120b565b341561040b57600080fd5b6102db600435602435604435611263565b341561042757600080fd5b610245600435602435611286565b341561044057600080fd5b6102db61132e565b341561045357600080fd5b61027f611334565b341561046657600080fd5b610245611344565b341561047957600080fd5b610484600435611398565b604051600160a060020a03909116815260200160405180910390f35b34156104ab57600080fd5b6104b66004356113ce565b60405187815260208101879052604081018690526060810185905282151560a0820152600160a060020a03821660c082015260e06080820181815290820185818151815260200191508051906020019080838360005b8381101561052457808201518382015260200161050c565b50505050905090810190601f1680156105515780820380516001836020036101000a031916815260200191505b509850505050505050505060405180910390f35b341561057057600080fd5b6102db600160a060020a03600435166114b0565b341561058f57600080fd5b6102456024600480358281019291013590356044356064356114cb565b34156105b757600080fd5b610245600160a060020a0360043516611655565b34156105d657600080fd5b6102456116c2565b34156105e957600080fd5b6105fd600160a060020a0360043516611727565b60405160208082528190810183818151815260200191508051906020019060200280838360005b8381101561063c578082015183820152602001610624565b505050509050019250505060405180910390f35b341561065b57600080fd5b610484600435611811565b341561067157600080fd5b61024561182c565b341561068457600080fd5b61068c61189b565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156106c85780820151838201526020016106b0565b50505050905090810190601f1680156106f55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561070e57600080fd5b61068c6118dc565b341561072157600080fd5b610484600435611913565b341561073757600080fd5b61024561192e565b341561074a57600080fd5b610245600160a060020a0360043516602435611aa8565b341561076c57600080fd5b610245611aea565b341561077f57600080fd5b610245600435611b40565b341561079557600080fd5b610484611ba3565b34156107a857600080fd5b610245600160a060020a0360043516611bb2565b34156107c757600080fd5b610245600435602435604435611c5e565b34156107e357600080fd5b6102db600160a060020a0360043516611cb0565b341561080257600080fd5b610245600160a060020a0360043516611cc2565b341561082157600080fd5b610245600160a060020a0360043516611da1565b341561084057600080fd5b61027f611e0e565b341561085357600080fd5b61027f600435602435611e30565b341561086c57600080fd5b610484611e50565b341561087f57600080fd5b610484611e5f565b341561089257600080fd5b610245600160a060020a0360043516611e6e565b34156108b157600080fd5b61068c611edb565b34156108c457600080fd5b6102db600435602435611f12565b60006040517f737570706f727473496e7465726661636528627974657334290000000000000081526019016040518091039020600160e060020a03191682600160e060020a0319161480610b5157506040517f746f6b656e4d657461646174612875696e743235362c737472696e67290000008152601d0160405180910390206040517f746f6b656e734f664f776e657228616464726573732900000000000000000000815260160160405180910390206040517f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81527f7432353629000000000000000000000000000000000000000000000000000000602082015260250160405180910390206040517f7472616e7366657228616464726573732c75696e743235362900000000000000815260190160405180910390206040517f617070726f766528616464726573732c75696e74323536290000000000000000815260180160405180910390206040517f6f776e65724f662875696e743235362900000000000000000000000000000000815260100160405180910390206040517f62616c616e63654f662861646472657373290000000000000000000000000000815260120160405180910390206040517f746f74616c537570706c792829000000000000000000000000000000000000008152600d0160405180910390206040517f73796d626f6c2829000000000000000000000000000000000000000000000000815260080160405180910390206040517f6e616d652829000000000000000000000000000000000000000000000000000081526006016040518091039020181818181818181818600160e060020a03191682600160e060020a031916145b90505b919050565b600d548111610b6757600080fd5b610b713382611f2f565b1515610b7c57600080fd5b6000818152600a6020526040908190208054600160a060020a031916600160a060020a038581169182179092559133909116907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259084905190815260200160405180910390a35050565b60015b90565b6003546000190190565b6000805433600160a060020a0390811691161480610c22575060015433600160a060020a039081169116145b1515610c2d57600080fd5b60025460a060020a900460ff1615610c4457600080fd5b33600160a060020a03161515610c5957600080fd5b30600160a060020a031633600160a060020a031614151515610c7a57600080fd5b600160a060020a0382161515610c8f57600080fd5b30600160a060020a031682600160a060020a031614151515610cb057600080fd5b600084815260056020908152604080832086845290915290205460ff161515610cd857600080fd5b6000848152600460209081526040808320868452825280832054878452600c83528184208785529092529091205410610d1057600080fd5b6000848152600660209081526040808320868452909152902054610d35908585611f4f565b9050610d42308383612126565b50505050565b600d548111610d5657600080fd5b610d608382611f2f565b1515610d6b57600080fd5b610d75828261230c565b1515610d8057600080fd5b610d898261232c565b1515610d9457600080fd5b610d9f838383612126565b505050565b600f60209081526000928352604080842090915290825290205481565b600254600090819060a060020a900460ff1615610ddd57600080fd5b6000858152600e6020908152604080832087845290915290205460ff161515610e0557600080fd5b6000858152600f60209081526040808320878452909152902054341015610e2b57600080fd5b33600160a060020a03161515610e4057600080fd5b30600160a060020a031633600160a060020a031614151515610e6157600080fd5b600160a060020a0383161515610e7657600080fd5b30600160a060020a031683600160a060020a031614151515610e9757600080fd5b600085815260056020908152604080832087845290915290205460ff161515610ebf57600080fd5b6000858152600460209081526040808320878452825280832054888452600c83528184208885529092529091205410610ef757600080fd5b6000858152600660209081526040808320878452909152902054610f1c908686611f4f565b6000868152600f6020908152604080832088845290915281205491935034919091039150811115610f7857600160a060020a03331681156108fc0282604051600060405180830381858888f193505050501515610f7857600080fd5b6000858152600f60209081526040808320878452825280832054600160a060020a0333168452601090925290912080549091019055610fb8308484612126565b5050505050565b600560209081526000928352604080842090915290825290205460ff1681565b600460209081526000928352604080842090915290825290205481565b60005433600160a060020a0390811691161480611027575060015433600160a060020a039081169116145b151561103257600080fd5b60025460a060020a900460ff161561104957600080fd5b600160a060020a038116151561105e57600080fd5b600160a060020a03811660009081526007602052604090205460ff16151561108557600080fd5b600160a060020a03166000908152600760205260409020805460ff19169055565b60006110b06125fc565b600160a060020a03331660009081526007602052604090205460ff1615156110d757600080fd5b600d5483116110e557600080fd5b600d54830391506003828154811015156110fb57fe5b906000526020600020906005020160c060405190810160409081528254825260018084015460208401526002840154918301919091526003808401546060840152600490930154600160a060020a0316608083015260a082015281549092508291908490811061116757fe5b9060005260206000209060050201600082015181556020820151600182015560408201518160020155606082015181600301556080820151600482018054600160a060020a031916600160a060020a039290921691909117905560a08201516004909101805491151560a060020a0260a060020a60ff021990921691909117905550505050565b600660209081526000928352604080842090915290825290205481565b60005433600160a060020a0390811691161480611236575060015433600160a060020a039081169116145b151561124157600080fd5b60025460a060020a900460ff16151561125957600080fd5b61126161233a565b565b600b60209081526000938452604080852082529284528284209052825290205481565b60005433600160a060020a03908116911614806112b1575060015433600160a060020a039081169116145b15156112bc57600080fd5b6000828152600e6020908152604080832084845290915290205460ff161515611308576000828152600e602090815260408083208484529091529020805460ff1916600117905561132a565b6000828152600e602090815260408083208484529091529020805460ff191690555b5050565b600d5481565b60025460a060020a900460ff1681565b60025433600160a060020a0390811691161461135f57600080fd5b600254600160a060020a039081169030163180156108fc0290604051600060405180830381858888f19350505050151561126157600080fd5b600d5460009082116113a957600080fd5b50600081815260086020526040902054600160a060020a0316801515610b5457600080fd5b6000806000806113dc612631565b60008060006113e96125fc565b600d548a116113f757600080fd5b600d548a03915060038281548110151561140d57fe5b906000526020600020906005020160c06040519081016040908152825482526001830154602083015260028301549082015260038201546060820152600490910154600160a060020a038116608083015260a060020a900460ff16151560a08201528a99509050805197508060400151965080606001519550611493816020015161239a565b9450806080015192508060a0015193505050919395979092949650565b600160a060020a031660009081526009602052604090205490565b60005433600160a060020a03908116911614806114f6575060015433600160a060020a039081169116145b151561150157600080fd5b60025460a060020a900460ff161561151857600080fd5b6000811161152557600080fd5b60008310158015611537575060008210155b151561154257600080fd5b61155960206040519081016040526000815261254a565b6115908686806020601f8201819004810201604051908101604052818152929190602084018383808284375061254a945050505050565b141561159b57600080fd5b600083815260056020908152604080832085845290915290205460ff16156115c257600080fd5b6000838152600460209081526040808320858452825280832084905585835260058252808320858452825291829020805460ff1916600117905561163491879187918291601f83018190048102019051908101604052818152929190602084018383808284375061254a945050505050565b60009384526006602090815260408086209486529390529190922055505050565b60005433600160a060020a0390811691161480611680575060015433600160a060020a039081169116145b151561168b57600080fd5b600160a060020a03811615156116a057600080fd5b60018054600160a060020a031916600160a060020a0392909216919091179055565b60005433600160a060020a03908116911614806116ed575060015433600160a060020a039081169116145b15156116f857600080fd5b60025460a060020a900460ff161561170f57600080fd5b6002805460a060020a60ff02191660a060020a179055565b61172f612631565b6000611739612631565b6000806000611747876114b0565b945084151561177757600060405180591061175f5750595b90808252806020026020018201604052509550611807565b846040518059106117855750595b90808252806020026020018201604052509350600d546117a3610bec565b60010101925060009150600d5490505b8281101561180357600081815260086020526040902054600160a060020a03888116911614156117fb57808483815181106117ea57fe5b602090810290910101526001909101905b6001016117b3565b8395505b5050505050919050565b600860205260009081526040902054600160a060020a031681565b60005433600160a060020a0390811691161480611857575060015433600160a060020a039081169116145b151561186257600080fd5b60025460a060020a900460ff16151561187a57600080fd5b6002805475ff00000000000000000000000000000000000000000019169055565b6118a3612631565b60408051908101604052600581527f43534350460000000000000000000000000000000000000000000000000000006020820152905090565b60408051908101604052601181527f43534350726553616c65466163746f7279000000000000000000000000000000602082015281565b600a60205260009081526040902054600160a060020a031681565b6119366125fc565b60005433600160a060020a0390811691161480611961575060015433600160a060020a039081169116145b151561196c57600080fd5b60115460ff161561197c57600080fd5b6003541561198957600080fd5b6011805460ff1916600117905560c060405190810160405280600081526020016119e560408051908101604052600a81527f44756d6d79417373657400000000000000000000000000000000000000000000602082015261254a565b81526000602082018190526040820152600160a060020a0330166060820152600160809091018190526003805492935091908101611a238382612643565b60009283526020909220839160050201815181556020820151600182015560408201518160020155606082015181600301556080820151600482018054600160a060020a031916600160a060020a039290921691909117905560a08201516004909101805491151560a060020a0260a060020a60ff0219909216919091179055505050565b600d548111611ab657600080fd5b611abf8261232c565b1515611aca57600080fd5b611ad43382611f2f565b1515611adf57600080fd5b61132a338383612126565b60005433600160a060020a0390811691161480611b15575060015433600160a060020a039081169116145b1515611b2057600080fd5b60025460a060020a900460ff161515611b3857600080fd5b611261612575565b600080600d5483111515611b5357600080fd5b50506000818152600860205260409020543390600160a060020a0316611b788261232c565b1515611b8357600080fd5b611b8d828461230c565b1515611b9857600080fd5b610d9f818385612126565b600054600160a060020a031681565b60005433600160a060020a0390811691161480611bdd575060015433600160a060020a039081169116145b1515611be857600080fd5b60025460a060020a900460ff1615611bff57600080fd5b600160a060020a0381161515611c1457600080fd5b600160a060020a03811660009081526007602052604090205460ff1615611c3a57600080fd5b600160a060020a03166000908152600760205260409020805460ff19166001179055565b60005433600160a060020a0390811691161480611c89575060015433600160a060020a039081169116145b1515611c9457600080fd5b6000928352600f60209081526040808520938552929052912055565b60106020526000908152604090205481565b6002546000907501000000000000000000000000000000000000000000900460ff161515611cef57600080fd5b50600160a060020a038116600090815260106020526040812054908111611d1557600080fd5b600160a060020a0382166000818152601060205260408082209190915582156108fc0290839051600060405180830381858888f193505050501515611d5957600080fd5b7f358fe4192934d3bf28ae181feda1f4bd08ca67f5e2fad55582cce5eb67304ae98282604051600160a060020a03909216825260208201526040908101905180910390a15050565b60005433600160a060020a0390811691161480611dcc575060015433600160a060020a039081169116145b1515611dd757600080fd5b600160a060020a0381161515611dec57600080fd5b60008054600160a060020a031916600160a060020a0392909216919091179055565b6002547501000000000000000000000000000000000000000000900460ff1681565b600e60209081526000928352604080842090915290825290205460ff1681565b600254600160a060020a031681565b600154600160a060020a031681565b60005433600160a060020a0390811691161480611e99575060015433600160a060020a039081169116145b1515611ea457600080fd5b600160a060020a0381161515611eb957600080fd5b60028054600160a060020a031916600160a060020a0392909216919091179055565b60408051908101604052600581527f4353435046000000000000000000000000000000000000000000000000000000602082015281565b600c60209081526000928352604080842090915290825290205481565b600090815260086020526040902054600160a060020a0390811691161490565b600080611f5a6125fc565b6000858152600c6020908152604080832087845290915281205460010192508063ffffffff84168414611f8c57600080fd5b60c06040519081016040908152858252602082018a905281018890526060810187905260006080820181905260a082015260038054919450600191808301611fd48382612643565b60009283526020909220869160050201815181556020820151600182015560408201518160020155606082015181600301556080820151600482018054600160a060020a031916600160a060020a039290921691909117905560a08201516004909101805491151560a060020a0260a060020a60ff021990921691909117905550600d5460008a8152600b602090815260408083208c845282528083208a8452825280832095909403928301948590558b8252600c81528382208b8352815292902087905593509091507f21b6aa36302fbeb5de063ccfac1338053e8cb8939202417afc214d741f22bb6190309083908a908a908990890151604051600160a060020a03909616865260208601949094526040808601939093526060850191909152608084015260a083019190915260c0909101905180910390a161211b60003083612126565b979650505050505050565b60006121306125fc565b600d548303915060038281548110151561214657fe5b906000526020600020906005020160c060405190810160409081528254825260018301546020830152600283015490820152600380830154606083015260049092015460a060020a900460ff16151560a0820152600160a060020a03861660808201528154909250829190849081106121bb57fe5b9060005260206000209060050201600082015181556020820151600182015560408201518160020155606082015181600301556080820151600482018054600160a060020a031916600160a060020a039290921691909117905560a08201516004909101805491151560a060020a0260a060020a60ff021990921691909117905550600160a060020a03808516600081815260096020908152604080832080546001019055878352600890915290208054600160a060020a03191690911790558516156122be57600160a060020a03851660009081526009602090815260408083208054600019019055858352600a90915290208054600160a060020a03191690555b83600160a060020a031685600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405190815260200160405180910390a35050505050565b6000908152600a6020526040902054600160a060020a0391821691161490565b600160a060020a0316151590565b60005433600160a060020a0390811691161480612365575060015433600160a060020a039081169116145b151561237057600080fd5b60025460a060020a900460ff16151561238857600080fd5b6002805460a060020a60ff0219169055565b6123a2612631565b6123aa612631565b60008060006123b7612631565b60206040518059106123c65750595b818152601f19601f83011681016020016040529050945060009350600092505b6020831015612471576008830260020a870291507fff00000000000000000000000000000000000000000000000000000000000000821615612466578185858151811061242f57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001909301925b6001909201916123e6565b8360405180591061247f5750595b818152601f19601f830116810160200160405290509050600092505b83831015612540578483815181106124af57fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000281848151811061250557fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060019092019161249b565b9695505050505050565b6000612554612631565b508180511515612567576000915061256f565b602083015191505b50919050565b60005433600160a060020a03908116911614806125a0575060015433600160a060020a039081169116145b15156125ab57600080fd5b60025460a060020a900460ff1615156125c357600080fd5b6002805475ff00000000000000000000000000000000000000000019167501000000000000000000000000000000000000000000179055565b60c06040519081016040908152600080835260208301819052908201819052606082018190526080820181905260a082015290565b60206040519081016040526000815290565b815481835581811511610d9f57600083815260209020610d9f91610be99160059182028101918502015b808211156126b55760008082556001820181905560028201819055600382015560048101805474ffffffffffffffffffffffffffffffffffffffffff1916905560050161266d565b50905600a165627a7a72305820b2b9dd3bf5ecc3d49a61c5cef8fc7f3e01428a82af13e7c297d4116e962a67b10029

Swarm Source

bzzr://b2b9dd3bf5ecc3d49a61c5cef8fc7f3e01428a82af13e7c297d4116e962a67b1
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.