ETH Price: $2,627.74 (-0.31%)
Gas: 2 Gwei

Contract

0x1A7208627fFe43a69f13f3C393a41712fa4a7831
 

Overview

ETH Balance

0.15035675 ETH

Eth Value

$395.10 (@ $2,627.74/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Mining One Free95048422020-02-18 4:01:321635 days ago1581998492IN
0x1A720862...2fa4a7831
0 ETH0.001278198
Mining One Free95048422020-02-18 4:01:321635 days ago1581998492IN
0x1A720862...2fa4a7831
0 ETH0.00127778
Mining One Free77777432019-05-17 12:22:181911 days ago1558095738IN
0x1A720862...2fa4a7831
0 ETH0.000601394
Mining One Self71894992019-02-07 19:32:312010 days ago1549567951IN
0x1A720862...2fa4a7831
0.01 ETH0.000636684
Mining One Self71894682019-02-07 19:23:362010 days ago1549567416IN
0x1A720862...2fa4a7831
0.01 ETH0.000636574
Mining One Self69257902018-12-21 9:06:082059 days ago1545383168IN
0x1A720862...2fa4a7831
0.01 ETH0.001433499
Mining Five68794582018-12-13 14:18:132066 days ago1544710693IN
0x1A720862...2fa4a7831
0.0475 ETH0.000447225
Mining One Self68717652018-12-12 7:58:572068 days ago1544601537IN
0x1A720862...2fa4a7831
0.01 ETH0.000795635
Mining One Self68608912018-12-10 12:46:482069 days ago1544446008IN
0x1A720862...2fa4a7831
0.01 ETH0.00063684
Mining Ten68346512018-12-06 4:45:392074 days ago1544071539IN
0x1A720862...2fa4a7831
0.09 ETH0.000449855
Mining Ten68345222018-12-06 4:15:572074 days ago1544069757IN
0x1A720862...2fa4a7831
0.09 ETH0.000449855
Mining One Free68331152018-12-05 22:34:582074 days ago1544049298IN
0x1A720862...2fa4a7831
0 ETH0.001051847
Mining One Self67645282018-11-24 14:54:472085 days ago1543071287IN
0x1A720862...2fa4a7831
0.01 ETH0.000955456
Mining One Self67542542018-11-22 22:40:012087 days ago1542926401IN
0x1A720862...2fa4a7831
0.01 ETH0.000636784
Mining One Self67438472018-11-21 5:34:292089 days ago1542778469IN
0x1A720862...2fa4a7831
0.01 ETH0.000636964
Mining One Free66887702018-11-12 4:58:092098 days ago1541998689IN
0x1A720862...2fa4a7831
0 ETH0.000751375
Mining One Free66887632018-11-12 4:56:502098 days ago1541998610IN
0x1A720862...2fa4a7831
0 ETH0.00075145
Mining One Free66887602018-11-12 4:56:312098 days ago1541998591IN
0x1A720862...2fa4a7831
0 ETH0.000751245
Mining One Self66839182018-11-11 9:54:332099 days ago1541930073IN
0x1A720862...2fa4a7831
0.01 ETH0.000477423
Mining One Self66839052018-11-11 9:51:282099 days ago1541929888IN
0x1A720862...2fa4a7831
0.01 ETH0.000477633
Mining One Self66800682018-11-10 18:44:222099 days ago1541875462IN
0x1A720862...2fa4a7831
0.01 ETH0.000318482
Mining One Self66792452018-11-10 15:38:472099 days ago1541864327IN
0x1A720862...2fa4a7831
0.01 ETH0.000350252.2
Mining One Self66791332018-11-10 15:15:152099 days ago1541862915IN
0x1A720862...2fa4a7831
0.01 ETH0.000477523
Mining One Self66791272018-11-10 15:13:322099 days ago1541862812IN
0x1A720862...2fa4a7831
0.01 ETH0.000477513
Mining Five66767782018-11-10 5:57:132100 days ago1541829433IN
0x1A720862...2fa4a7831
0.0475 ETH0.000357784
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
71894992019-02-07 19:32:312010 days ago1549567951
0x1A720862...2fa4a7831
0.005 ETH
71894992019-02-07 19:32:312010 days ago1549567951
0x1A720862...2fa4a7831
0.005 ETH
71894682019-02-07 19:23:362010 days ago1549567416
0x1A720862...2fa4a7831
0.005 ETH
71894682019-02-07 19:23:362010 days ago1549567416
0x1A720862...2fa4a7831
0.005 ETH
69257902018-12-21 9:06:082059 days ago1545383168
0x1A720862...2fa4a7831
0.005 ETH
69257902018-12-21 9:06:082059 days ago1545383168
0x1A720862...2fa4a7831
0.005 ETH
68794582018-12-13 14:18:132066 days ago1544710693
0x1A720862...2fa4a7831
0.02375 ETH
68794582018-12-13 14:18:132066 days ago1544710693
0x1A720862...2fa4a7831
0.02375 ETH
68717652018-12-12 7:58:572068 days ago1544601537
0x1A720862...2fa4a7831
0.005 ETH
68717652018-12-12 7:58:572068 days ago1544601537
0x1A720862...2fa4a7831
0.005 ETH
68608912018-12-10 12:46:482069 days ago1544446008
0x1A720862...2fa4a7831
0.005 ETH
68608912018-12-10 12:46:482069 days ago1544446008
0x1A720862...2fa4a7831
0.005 ETH
68346512018-12-06 4:45:392074 days ago1544071539
0x1A720862...2fa4a7831
0.045 ETH
68346512018-12-06 4:45:392074 days ago1544071539
0x1A720862...2fa4a7831
0.045 ETH
68345222018-12-06 4:15:572074 days ago1544069757
0x1A720862...2fa4a7831
0.045 ETH
68345222018-12-06 4:15:572074 days ago1544069757
0x1A720862...2fa4a7831
0.045 ETH
67645282018-11-24 14:54:472085 days ago1543071287
0x1A720862...2fa4a7831
0.005 ETH
67645282018-11-24 14:54:472085 days ago1543071287
0x1A720862...2fa4a7831
0.005 ETH
67542542018-11-22 22:40:012087 days ago1542926401
0x1A720862...2fa4a7831
0.005 ETH
67542542018-11-22 22:40:012087 days ago1542926401
0x1A720862...2fa4a7831
0.005 ETH
67438472018-11-21 5:34:292089 days ago1542778469
0x1A720862...2fa4a7831
0.005 ETH
67438472018-11-21 5:34:292089 days ago1542778469
0x1A720862...2fa4a7831
0.005 ETH
66839182018-11-11 9:54:332099 days ago1541930073
0x1A720862...2fa4a7831
0.005 ETH
66839182018-11-11 9:54:332099 days ago1541930073
0x1A720862...2fa4a7831
0.005 ETH
66839052018-11-11 9:51:282099 days ago1541929888
0x1A720862...2fa4a7831
0.005 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ActionMining

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

/* ==================================================================== */
/* Copyright (c) 2018 The ether.online Project.  All rights reserved.
/* 
/* https://ether.online  The first RPG game of blockchain 
/*  
/* authors [email protected]   
/*         [email protected]            
/* ==================================================================== */

pragma solidity ^0.4.20;

/// @title ERC-165 Standard Interface Detection
/// @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-165.md
interface ERC165 {
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}

/// @title ERC-721 Non-Fungible Token Standard
/// @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
contract ERC721 is ERC165 {
    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) external view returns (uint256);
    function ownerOf(uint256 _tokenId) external view returns (address);
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external;
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external;
    function transferFrom(address _from, address _to, uint256 _tokenId) external;
    function approve(address _approved, uint256 _tokenId) external;
    function setApprovalForAll(address _operator, bool _approved) external;
    function getApproved(uint256 _tokenId) external view returns (address);
    function isApprovedForAll(address _owner, address _operator) external view returns (bool);
}

/// @title ERC-721 Non-Fungible Token Standard
interface ERC721TokenReceiver {
	function onERC721Received(address _from, uint256 _tokenId, bytes data) external returns(bytes4);
}

contract AccessAdmin {
    bool public isPaused = false;
    address public addrAdmin;  

    event AdminTransferred(address indexed preAdmin, address indexed newAdmin);

    function AccessAdmin() public {
        addrAdmin = msg.sender;
    }  


    modifier onlyAdmin() {
        require(msg.sender == addrAdmin);
        _;
    }

    modifier whenNotPaused() {
        require(!isPaused);
        _;
    }

    modifier whenPaused {
        require(isPaused);
        _;
    }

    function setAdmin(address _newAdmin) external onlyAdmin {
        require(_newAdmin != address(0));
        AdminTransferred(addrAdmin, _newAdmin);
        addrAdmin = _newAdmin;
    }

    function doPause() external onlyAdmin whenNotPaused {
        isPaused = true;
    }

    function doUnpause() external onlyAdmin whenPaused {
        isPaused = false;
    }
}

contract AccessService is AccessAdmin {
    address public addrService;
    address public addrFinance;

    modifier onlyService() {
        require(msg.sender == addrService);
        _;
    }

    modifier onlyFinance() {
        require(msg.sender == addrFinance);
        _;
    }

    function setService(address _newService) external {
        require(msg.sender == addrService || msg.sender == addrAdmin);
        require(_newService != address(0));
        addrService = _newService;
    }

    function setFinance(address _newFinance) external {
        require(msg.sender == addrFinance || msg.sender == addrAdmin);
        require(_newFinance != address(0));
        addrFinance = _newFinance;
    }

    function withdraw(address _target, uint256 _amount) 
        external 
    {
        require(msg.sender == addrFinance || msg.sender == addrAdmin);
        require(_amount > 0);
        address receiver = _target == address(0) ? addrFinance : _target;
        uint256 balance = this.balance;
        if (_amount < balance) {
            receiver.transfer(_amount);
        } else {
            receiver.transfer(this.balance);
        }      
    }
}

interface IDataMining {
    function getRecommender(address _target) external view returns(address);
    function subFreeMineral(address _target) external returns(bool);
}

interface IDataEquip {
    function isEquiped(address _target, uint256 _tokenId) external view returns(bool);
    function isEquipedAny2(address _target, uint256 _tokenId1, uint256 _tokenId2) external view returns(bool);
    function isEquipedAny3(address _target, uint256 _tokenId1, uint256 _tokenId2, uint256 _tokenId3) external view returns(bool);
}

contract Random {
    uint256 _seed;

    function _rand() internal returns (uint256) {
        _seed = uint256(keccak256(_seed, block.blockhash(block.number - 1), block.coinbase, block.difficulty));
        return _seed;
    }

    function _randBySeed(uint256 _outSeed) internal view returns (uint256) {
        return uint256(keccak256(_outSeed, block.blockhash(block.number - 1), block.coinbase, block.difficulty));
    }
}

/**
 * @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) {
        if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        assert(c / a == b);
        return c;
    }

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

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

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

contract WarToken is ERC721, AccessAdmin {
    /// @dev The equipment info
    struct Fashion {
        uint16 protoId;     // 0  Equipment ID
        uint16 quality;     // 1  Rarity: 1 Coarse/2 Good/3 Rare/4 Epic/5 Legendary
        uint16 pos;         // 2  Slots: 1 Weapon/2 Hat/3 Cloth/4 Pant/5 Shoes/9 Pets
        uint16 health;      // 3  Health
        uint16 atkMin;      // 4  Min attack
        uint16 atkMax;      // 5  Max attack
        uint16 defence;     // 6  Defennse
        uint16 crit;        // 7  Critical rate
        uint16 isPercent;   // 8  Attr value type
        uint16 attrExt1;    // 9  future stat 1
        uint16 attrExt2;    // 10 future stat 2
        uint16 attrExt3;    // 11 future stat 3
    }

    /// @dev All equipments tokenArray (not exceeding 2^32-1)
    Fashion[] public fashionArray;

    /// @dev Amount of tokens destroyed
    uint256 destroyFashionCount;

    /// @dev Equipment token ID vs owner address
    mapping (uint256 => address) fashionIdToOwner;

    /// @dev Equipments owner by the owner (array)
    mapping (address => uint256[]) ownerToFashionArray;

    /// @dev Equipment token ID search in owner array
    mapping (uint256 => uint256) fashionIdToOwnerIndex;

    /// @dev The authorized address for each WAR
    mapping (uint256 => address) fashionIdToApprovals;

    /// @dev The authorized operators for each address
    mapping (address => mapping (address => bool)) operatorToApprovals;

    /// @dev Trust contract
    mapping (address => bool) actionContracts;

    function setActionContract(address _actionAddr, bool _useful) external onlyAdmin {
        actionContracts[_actionAddr] = _useful;
    }

    function getActionContract(address _actionAddr) external view onlyAdmin returns(bool) {
        return actionContracts[_actionAddr];
    }

    /// @dev This emits when the approved address for an WAR is changed or reaffirmed.
    event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId);

    /// @dev This emits when an operator is enabled or disabled for an owner.
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

    /// @dev This emits when the equipment ownership changed 
    event Transfer(address indexed from, address indexed to, uint256 tokenId);

    /// @dev This emits when the equipment created
    event CreateFashion(address indexed owner, uint256 tokenId, uint16 protoId, uint16 quality, uint16 pos, uint16 createType);

    /// @dev This emits when the equipment's attributes changed
    event ChangeFashion(address indexed owner, uint256 tokenId, uint16 changeType);

    /// @dev This emits when the equipment destroyed
    event DeleteFashion(address indexed owner, uint256 tokenId, uint16 deleteType);
    
    function WarToken() public {
        addrAdmin = msg.sender;
        fashionArray.length += 1;
    }

    // modifier
    /// @dev Check if token ID is valid
    modifier isValidToken(uint256 _tokenId) {
        require(_tokenId >= 1 && _tokenId <= fashionArray.length);
        require(fashionIdToOwner[_tokenId] != address(0)); 
        _;
    }

    modifier canTransfer(uint256 _tokenId) {
        address owner = fashionIdToOwner[_tokenId];
        require(msg.sender == owner || msg.sender == fashionIdToApprovals[_tokenId] || operatorToApprovals[owner][msg.sender]);
        _;
    }

    // ERC721
    function supportsInterface(bytes4 _interfaceId) external view returns(bool) {
        // ERC165 || ERC721 || ERC165^ERC721
        return (_interfaceId == 0x01ffc9a7 || _interfaceId == 0x80ac58cd || _interfaceId == 0x8153916a) && (_interfaceId != 0xffffffff);
    }
        
    function name() public pure returns(string) {
        return "WAR Token";
    }

    function symbol() public pure returns(string) {
        return "WAR";
    }

    /// @dev Search for token quantity address
    /// @param _owner Address that needs to be searched
    /// @return Returns token quantity
    function balanceOf(address _owner) external view returns(uint256) {
        require(_owner != address(0));
        return ownerToFashionArray[_owner].length;
    }

    /// @dev Find the owner of an WAR
    /// @param _tokenId The tokenId of WAR
    /// @return Give The address of the owner of this WAR
    function ownerOf(uint256 _tokenId) external view /*isValidToken(_tokenId)*/ returns (address owner) {
        return fashionIdToOwner[_tokenId];
    }

    /// @dev Transfers the ownership of an WAR from one address to another address
    /// @param _from The current owner of the WAR
    /// @param _to The new owner
    /// @param _tokenId The WAR to transfer
    /// @param data Additional data with no specified format, sent in call to `_to`
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) 
        external
        whenNotPaused
    {
        _safeTransferFrom(_from, _to, _tokenId, data);
    }

    /// @dev Transfers the ownership of an WAR from one address to another address
    /// @param _from The current owner of the WAR
    /// @param _to The new owner
    /// @param _tokenId The WAR to transfer
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) 
        external
        whenNotPaused
    {
        _safeTransferFrom(_from, _to, _tokenId, "");
    }

    /// @dev Transfer ownership of an WAR, '_to' must be a vaild address, or the WAR will lost
    /// @param _from The current owner of the WAR
    /// @param _to The new owner
    /// @param _tokenId The WAR to transfer
    function transferFrom(address _from, address _to, uint256 _tokenId)
        external
        whenNotPaused
        isValidToken(_tokenId)
        canTransfer(_tokenId)
    {
        address owner = fashionIdToOwner[_tokenId];
        require(owner != address(0));
        require(_to != address(0));
        require(owner == _from);
        
        _transfer(_from, _to, _tokenId);
    }

    /// @dev Set or reaffirm the approved address for an WAR
    /// @param _approved The new approved WAR controller
    /// @param _tokenId The WAR to approve
    function approve(address _approved, uint256 _tokenId)
        external
        whenNotPaused
    {
        address owner = fashionIdToOwner[_tokenId];
        require(owner != address(0));
        require(msg.sender == owner || operatorToApprovals[owner][msg.sender]);

        fashionIdToApprovals[_tokenId] = _approved;
        Approval(owner, _approved, _tokenId);
    }

    /// @dev Enable or disable approval for a third party ("operator") to manage all your asset.
    /// @param _operator Address to add to the set of authorized operators.
    /// @param _approved True if the operators is approved, false to revoke approval
    function setApprovalForAll(address _operator, bool _approved) 
        external 
        whenNotPaused
    {
        operatorToApprovals[msg.sender][_operator] = _approved;
        ApprovalForAll(msg.sender, _operator, _approved);
    }

    /// @dev Get the approved address for a single WAR
    /// @param _tokenId The WAR to find the approved address for
    /// @return The approved address for this WAR, or the zero address if there is none
    function getApproved(uint256 _tokenId) external view isValidToken(_tokenId) returns (address) {
        return fashionIdToApprovals[_tokenId];
    }

    /// @dev Query if an address is an authorized operator for another address
    /// @param _owner The address that owns the WARs
    /// @param _operator The address that acts on behalf of the owner
    /// @return True if `_operator` is an approved operator for `_owner`, false otherwise
    function isApprovedForAll(address _owner, address _operator) external view returns (bool) {
        return operatorToApprovals[_owner][_operator];
    }

    /// @dev Count WARs tracked by this contract
    /// @return A count of valid WARs tracked by this contract, where each one of
    ///  them has an assigned and queryable owner not equal to the zero address
    function totalSupply() external view returns (uint256) {
        return fashionArray.length - destroyFashionCount - 1;
    }

    /// @dev Do the real transfer with out any condition checking
    /// @param _from The old owner of this WAR(If created: 0x0)
    /// @param _to The new owner of this WAR 
    /// @param _tokenId The tokenId of the WAR
    function _transfer(address _from, address _to, uint256 _tokenId) internal {
        if (_from != address(0)) {
            uint256 indexFrom = fashionIdToOwnerIndex[_tokenId];
            uint256[] storage fsArray = ownerToFashionArray[_from];
            require(fsArray[indexFrom] == _tokenId);

            // If the WAR is not the element of array, change it to with the last
            if (indexFrom != fsArray.length - 1) {
                uint256 lastTokenId = fsArray[fsArray.length - 1];
                fsArray[indexFrom] = lastTokenId; 
                fashionIdToOwnerIndex[lastTokenId] = indexFrom;
            }
            fsArray.length -= 1; 
            
            if (fashionIdToApprovals[_tokenId] != address(0)) {
                delete fashionIdToApprovals[_tokenId];
            }      
        }

        // Give the WAR to '_to'
        fashionIdToOwner[_tokenId] = _to;
        ownerToFashionArray[_to].push(_tokenId);
        fashionIdToOwnerIndex[_tokenId] = ownerToFashionArray[_to].length - 1;
        
        Transfer(_from != address(0) ? _from : this, _to, _tokenId);
    }

    /// @dev Actually perform the safeTransferFrom
    function _safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) 
        internal
        isValidToken(_tokenId) 
        canTransfer(_tokenId)
    {
        address owner = fashionIdToOwner[_tokenId];
        require(owner != address(0));
        require(_to != address(0));
        require(owner == _from);
        
        _transfer(_from, _to, _tokenId);

        // Do the callback after everything is done to avoid reentrancy attack
        uint256 codeSize;
        assembly { codeSize := extcodesize(_to) }
        if (codeSize == 0) {
            return;
        }
        bytes4 retval = ERC721TokenReceiver(_to).onERC721Received(_from, _tokenId, data);
        // bytes4(keccak256("onERC721Received(address,uint256,bytes)")) = 0xf0b9e5ba;
        require(retval == 0xf0b9e5ba);
    }

    //----------------------------------------------------------------------------------------------------------

    /// @dev Equipment creation
    /// @param _owner Owner of the equipment created
    /// @param _attrs Attributes of the equipment created
    /// @return Token ID of the equipment created
    function createFashion(address _owner, uint16[9] _attrs, uint16 _createType) 
        external 
        whenNotPaused
        returns(uint256)
    {
        require(actionContracts[msg.sender]);
        require(_owner != address(0));

        uint256 newFashionId = fashionArray.length;
        require(newFashionId < 4294967296);

        fashionArray.length += 1;
        Fashion storage fs = fashionArray[newFashionId];
        fs.protoId = _attrs[0];
        fs.quality = _attrs[1];
        fs.pos = _attrs[2];
        if (_attrs[3] != 0) {
            fs.health = _attrs[3];
        }
        
        if (_attrs[4] != 0) {
            fs.atkMin = _attrs[4];
            fs.atkMax = _attrs[5];
        }
       
        if (_attrs[6] != 0) {
            fs.defence = _attrs[6];
        }
        
        if (_attrs[7] != 0) {
            fs.crit = _attrs[7];
        }

        if (_attrs[8] != 0) {
            fs.isPercent = _attrs[8];
        }
        
        _transfer(0, _owner, newFashionId);
        CreateFashion(_owner, newFashionId, _attrs[0], _attrs[1], _attrs[2], _createType);
        return newFashionId;
    }

    /// @dev One specific attribute of the equipment modified
    function _changeAttrByIndex(Fashion storage _fs, uint16 _index, uint16 _val) internal {
        if (_index == 3) {
            _fs.health = _val;
        } else if(_index == 4) {
            _fs.atkMin = _val;
        } else if(_index == 5) {
            _fs.atkMax = _val;
        } else if(_index == 6) {
            _fs.defence = _val;
        } else if(_index == 7) {
            _fs.crit = _val;
        } else if(_index == 9) {
            _fs.attrExt1 = _val;
        } else if(_index == 10) {
            _fs.attrExt2 = _val;
        } else if(_index == 11) {
            _fs.attrExt3 = _val;
        }
    }

    /// @dev Equiment attributes modified (max 4 stats modified)
    /// @param _tokenId Equipment Token ID
    /// @param _idxArray Stats order that must be modified
    /// @param _params Stat value that must be modified
    /// @param _changeType Modification type such as enhance, socket, etc.
    function changeFashionAttr(uint256 _tokenId, uint16[4] _idxArray, uint16[4] _params, uint16 _changeType) 
        external 
        whenNotPaused
        isValidToken(_tokenId) 
    {
        require(actionContracts[msg.sender]);

        Fashion storage fs = fashionArray[_tokenId];
        if (_idxArray[0] > 0) {
            _changeAttrByIndex(fs, _idxArray[0], _params[0]);
        }

        if (_idxArray[1] > 0) {
            _changeAttrByIndex(fs, _idxArray[1], _params[1]);
        }

        if (_idxArray[2] > 0) {
            _changeAttrByIndex(fs, _idxArray[2], _params[2]);
        }

        if (_idxArray[3] > 0) {
            _changeAttrByIndex(fs, _idxArray[3], _params[3]);
        }

        ChangeFashion(fashionIdToOwner[_tokenId], _tokenId, _changeType);
    }

    /// @dev Equipment destruction
    /// @param _tokenId Equipment Token ID
    /// @param _deleteType Destruction type, such as craft
    function destroyFashion(uint256 _tokenId, uint16 _deleteType)
        external 
        whenNotPaused
        isValidToken(_tokenId) 
    {
        require(actionContracts[msg.sender]);

        address _from = fashionIdToOwner[_tokenId];
        uint256 indexFrom = fashionIdToOwnerIndex[_tokenId];
        uint256[] storage fsArray = ownerToFashionArray[_from]; 
        require(fsArray[indexFrom] == _tokenId);

        if (indexFrom != fsArray.length - 1) {
            uint256 lastTokenId = fsArray[fsArray.length - 1];
            fsArray[indexFrom] = lastTokenId; 
            fashionIdToOwnerIndex[lastTokenId] = indexFrom;
        }
        fsArray.length -= 1; 

        fashionIdToOwner[_tokenId] = address(0);
        delete fashionIdToOwnerIndex[_tokenId];
        destroyFashionCount += 1;

        Transfer(_from, 0, _tokenId);

        DeleteFashion(_from, _tokenId, _deleteType);
    }

    /// @dev Safe transfer by trust contracts
    function safeTransferByContract(uint256 _tokenId, address _to) 
        external
        whenNotPaused
    {
        require(actionContracts[msg.sender]);

        require(_tokenId >= 1 && _tokenId <= fashionArray.length);
        address owner = fashionIdToOwner[_tokenId];
        require(owner != address(0));
        require(_to != address(0));
        require(owner != _to);

        _transfer(owner, _to, _tokenId);
    }

    //----------------------------------------------------------------------------------------------------------

    /// @dev Get fashion attrs by tokenId
    function getFashion(uint256 _tokenId) external view isValidToken(_tokenId) returns (uint16[12] datas) {
        Fashion storage fs = fashionArray[_tokenId];
        datas[0] = fs.protoId;
        datas[1] = fs.quality;
        datas[2] = fs.pos;
        datas[3] = fs.health;
        datas[4] = fs.atkMin;
        datas[5] = fs.atkMax;
        datas[6] = fs.defence;
        datas[7] = fs.crit;
        datas[8] = fs.isPercent;
        datas[9] = fs.attrExt1;
        datas[10] = fs.attrExt2;
        datas[11] = fs.attrExt3;
    }

    /// @dev Get tokenIds and flags by owner
    function getOwnFashions(address _owner) external view returns(uint256[] tokens, uint32[] flags) {
        require(_owner != address(0));
        uint256[] storage fsArray = ownerToFashionArray[_owner];
        uint256 length = fsArray.length;
        tokens = new uint256[](length);
        flags = new uint32[](length);
        for (uint256 i = 0; i < length; ++i) {
            tokens[i] = fsArray[i];
            Fashion storage fs = fashionArray[fsArray[i]];
            flags[i] = uint32(uint32(fs.protoId) * 100 + uint32(fs.quality) * 10 + fs.pos);
        }
    }

    /// @dev WAR token info returned based on Token ID transfered (64 at most)
    function getFashionsAttrs(uint256[] _tokens) external view returns(uint16[] attrs) {
        uint256 length = _tokens.length;
        require(length <= 64);
        attrs = new uint16[](length * 11);
        uint256 tokenId;
        uint256 index;
        for (uint256 i = 0; i < length; ++i) {
            tokenId = _tokens[i];
            if (fashionIdToOwner[tokenId] != address(0)) {
                index = i * 11;
                Fashion storage fs = fashionArray[tokenId];
                attrs[index] = fs.health;
                attrs[index + 1] = fs.atkMin;
                attrs[index + 2] = fs.atkMax;
                attrs[index + 3] = fs.defence;
                attrs[index + 4] = fs.crit;
                attrs[index + 5] = fs.isPercent;
                attrs[index + 6] = fs.attrExt1;
                attrs[index + 7] = fs.attrExt2;
                attrs[index + 8] = fs.attrExt3;
            }   
        }
    }
}

contract ActionMining is Random, AccessService {
    using SafeMath for uint256;

    event MiningOrderCreated(uint256 indexed index, address indexed miner, uint64 chestCnt);
    event MiningResolved(uint256 indexed index, address indexed miner, uint64 chestCnt);

    struct MiningOrder {
        address miner;      
        uint64 chestCnt;    
        uint64 tmCreate;    
        uint64 tmResolve;   
    }

    /// @dev Max fashion suit id
    uint16 maxProtoId;
    /// @dev If the recommender can get reward 
    bool isRecommendOpen;
    /// @dev prizepool percent
    uint256 constant prizePoolPercent = 50;
    /// @dev prizepool contact address
    address poolContract;
    /// @dev WarToken(NFT) contract address
    WarToken public tokenContract;
    /// @dev DataMining contract address
    IDataMining public dataContract;
    /// @dev mining order array
    MiningOrder[] public ordersArray;

    mapping (uint16 => uint256) public protoIdToCount;


    function ActionMining(address _nftAddr, uint16 _maxProtoId) public {
        addrAdmin = msg.sender;
        addrService = msg.sender;
        addrFinance = msg.sender;

        tokenContract = WarToken(_nftAddr);
        maxProtoId = _maxProtoId;
        
        MiningOrder memory order = MiningOrder(0, 0, 1, 1);
        ordersArray.push(order);
    }

    function() external payable {

    }

    function getOrderCount() external view returns(uint256) {
        return ordersArray.length - 1;
    }

    function setDataMining(address _addr) external onlyAdmin {
        require(_addr != address(0));
        dataContract = IDataMining(_addr);
    }
    
    function setPrizePool(address _addr) external onlyAdmin {
        require(_addr != address(0));
        poolContract = _addr;
    }

    function setMaxProtoId(uint16 _maxProtoId) external onlyAdmin {
        require(_maxProtoId > 0 && _maxProtoId < 10000);
        require(_maxProtoId != maxProtoId);
        maxProtoId = _maxProtoId;
    }

    function setRecommendStatus(bool _isOpen) external onlyAdmin {
        require(_isOpen != isRecommendOpen);
        isRecommendOpen = _isOpen;
    }

    function setFashionSuitCount(uint16 _protoId, uint256 _cnt) external onlyAdmin {
        require(_protoId > 0 && _protoId <= maxProtoId);
        require(_cnt > 0 && _cnt <= 5);
        require(protoIdToCount[_protoId] != _cnt);
        protoIdToCount[_protoId] = _cnt;
    }

    function _getFashionParam(uint256 _seed) internal view returns(uint16[9] attrs) {
        uint256 curSeed = _seed;
        // quality
        uint256 rdm = curSeed % 10000;
        uint16 qtyParam;
        if (rdm < 6900) {
            attrs[1] = 1;
            qtyParam = 0;
        } else if (rdm < 8700) {
            attrs[1] = 2;
            qtyParam = 1;
        } else if (rdm < 9600) {
            attrs[1] = 3;
            qtyParam = 2;
        } else if (rdm < 9900) {
            attrs[1] = 4;
            qtyParam = 4;
        } else {
            attrs[1] = 5;
            qtyParam = 6;
        }

        // protoId
        curSeed /= 10000;
        rdm = ((curSeed % 10000) / (9999 / maxProtoId)) + 1;
        attrs[0] = uint16(rdm <= maxProtoId ? rdm : maxProtoId);

        // pos
        curSeed /= 10000;
        uint256 tmpVal = protoIdToCount[attrs[0]];
        if (tmpVal == 0) {
            tmpVal = 5;
        }
        rdm = ((curSeed % 10000) / (9999 / tmpVal)) + 1;
        uint16 pos = uint16(rdm <= tmpVal ? rdm : tmpVal);
        attrs[2] = pos;

        rdm = attrs[0] % 3;

        curSeed /= 10000;
        tmpVal = (curSeed % 10000) % 21 + 90;

        if (rdm == 0) {
            if (pos == 1) {
                uint256 attr = (200 + qtyParam * 200) * tmpVal / 100;              // +atk
                attrs[4] = uint16(attr * 40 / 100);
                attrs[5] = uint16(attr * 160 / 100);
            } else if (pos == 2) {
                attrs[6] = uint16((40 + qtyParam * 40) * tmpVal / 100);            // +def
            } else if (pos == 3) {
                attrs[3] = uint16((600 + qtyParam * 600) * tmpVal / 100);          // +hp
            } else if (pos == 4) {
                attrs[6] = uint16((60 + qtyParam * 60) * tmpVal / 100);            // +def
            } else {
                attrs[3] = uint16((400 + qtyParam * 400) * tmpVal / 100);          // +hp
            }
        } else if (rdm == 1) {
            if (pos == 1) {
                uint256 attr2 = (190 + qtyParam * 190) * tmpVal / 100;              // +atk
                attrs[4] = uint16(attr2 * 50 / 100);
                attrs[5] = uint16(attr2 * 150 / 100);
            } else if (pos == 2) {
                attrs[6] = uint16((42 + qtyParam * 42) * tmpVal / 100);            // +def
            } else if (pos == 3) {
                attrs[3] = uint16((630 + qtyParam * 630) * tmpVal / 100);          // +hp
            } else if (pos == 4) {
                attrs[6] = uint16((63 + qtyParam * 63) * tmpVal / 100);            // +def
            } else {
                attrs[3] = uint16((420 + qtyParam * 420) * tmpVal / 100);          // +hp
            }
        } else {
            if (pos == 1) {
                uint256 attr3 = (210 + qtyParam * 210) * tmpVal / 100;             // +atk
                attrs[4] = uint16(attr3 * 30 / 100);
                attrs[5] = uint16(attr3 * 170 / 100);
            } else if (pos == 2) {
                attrs[6] = uint16((38 + qtyParam * 38) * tmpVal / 100);            // +def
            } else if (pos == 3) {
                attrs[3] = uint16((570 + qtyParam * 570) * tmpVal / 100);          // +hp
            } else if (pos == 4) {
                attrs[6] = uint16((57 + qtyParam * 57) * tmpVal / 100);            // +def
            } else {
                attrs[3] = uint16((380 + qtyParam * 380) * tmpVal / 100);          // +hp
            }
        }
        attrs[8] = 0;
    }

    function _addOrder(address _miner, uint64 _chestCnt) internal {
        uint64 newOrderId = uint64(ordersArray.length);
        ordersArray.length += 1;
        MiningOrder storage order = ordersArray[newOrderId];
        order.miner = _miner;
        order.chestCnt = _chestCnt;
        order.tmCreate = uint64(block.timestamp);

        MiningOrderCreated(newOrderId, _miner, _chestCnt);
    }

    function _transferHelper(uint256 ethVal) private {
        bool recommenderSended = false;
        uint256 fVal;
        uint256 pVal;
        if (isRecommendOpen) {
            address recommender = dataContract.getRecommender(msg.sender);
            if (recommender != address(0)) {
                uint256 rVal = ethVal.div(10);
                fVal = ethVal.sub(rVal).mul(prizePoolPercent).div(100);
                addrFinance.transfer(fVal);
                recommenderSended = true;
                recommender.transfer(rVal);
                pVal = ethVal.sub(rVal).sub(fVal);
                if (poolContract != address(0) && pVal > 0) {
                    poolContract.transfer(pVal);
                }
            } 
        } 
        if (!recommenderSended) {
            fVal = ethVal.mul(prizePoolPercent).div(100);
            pVal = ethVal.sub(fVal);
            addrFinance.transfer(fVal);
            if (poolContract != address(0) && pVal > 0) {
                poolContract.transfer(pVal);
            }
        }
    }

    function miningOneFree()
        external
        whenNotPaused
    {
        require(dataContract != address(0));

        uint256 seed = _rand();
        uint16[9] memory attrs = _getFashionParam(seed);

        require(dataContract.subFreeMineral(msg.sender));

        tokenContract.createFashion(msg.sender, attrs, 3);

        MiningResolved(0, msg.sender, 1);
    }

    function miningOneSelf() 
        external 
        payable 
        whenNotPaused
    {
        require(msg.value >= 0.01 ether);

        uint256 seed = _rand();
        uint16[9] memory attrs = _getFashionParam(seed);

        tokenContract.createFashion(msg.sender, attrs, 2);
        _transferHelper(0.01 ether);

        if (msg.value > 0.01 ether) {
            msg.sender.transfer(msg.value - 0.01 ether);
        }

        MiningResolved(0, msg.sender, 1);
    }

    function miningOne() 
        external 
        payable 
        whenNotPaused
    {
        require(msg.value >= 0.01 ether);

        _addOrder(msg.sender, 1);
        _transferHelper(0.01 ether);

        if (msg.value > 0.01 ether) {
            msg.sender.transfer(msg.value - 0.01 ether);
        }
    }

    function miningThree() 
        external 
        payable 
        whenNotPaused
    {
        require(msg.value >= 0.03 ether);

        _addOrder(msg.sender, 3);
        _transferHelper(0.03 ether);

        if (msg.value > 0.03 ether) {
            msg.sender.transfer(msg.value - 0.03 ether);
        }
    }

    function miningFive() 
        external 
        payable 
        whenNotPaused
    {
        require(msg.value >= 0.0475 ether);

        _addOrder(msg.sender, 5);
        _transferHelper(0.0475 ether);

        if (msg.value > 0.0475 ether) {
            msg.sender.transfer(msg.value - 0.0475 ether);
        }
    }

    function miningTen() 
        external 
        payable 
        whenNotPaused
    {
        require(msg.value >= 0.09 ether);
        
        _addOrder(msg.sender, 10);
        _transferHelper(0.09 ether);

        if (msg.value > 0.09 ether) {
            msg.sender.transfer(msg.value - 0.09 ether);
        }
    }

    function miningResolve(uint256 _orderIndex, uint256 _seed) 
        external 
        onlyService
    {
        require(_orderIndex > 0 && _orderIndex < ordersArray.length);
        MiningOrder storage order = ordersArray[_orderIndex];
        require(order.tmResolve == 0);
        address miner = order.miner;
        require(miner != address(0));
        uint64 chestCnt = order.chestCnt;
        require(chestCnt >= 1 && chestCnt <= 10);

        uint256 rdm = _seed;
        uint16[9] memory attrs;
        for (uint64 i = 0; i < chestCnt; ++i) {
            rdm = _randBySeed(rdm);
            attrs = _getFashionParam(rdm);
            tokenContract.createFashion(miner, attrs, 2);
        }
        order.tmResolve = uint64(block.timestamp);
        MiningResolved(_orderIndex, miner, chestCnt);
    }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[],"name":"miningFive","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"dataContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_orderIndex","type":"uint256"},{"name":"_seed","type":"uint256"}],"name":"miningResolve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint16"}],"name":"protoIdToCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"doUnpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"}],"name":"setPrizePool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_maxProtoId","type":"uint16"}],"name":"setMaxProtoId","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tokenContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"doPause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newAdmin","type":"address"}],"name":"setAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"addrFinance","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getOrderCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"miningOneFree","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_protoId","type":"uint16"},{"name":"_cnt","type":"uint256"}],"name":"setFashionSuitCount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newFinance","type":"address"}],"name":"setFinance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"ordersArray","outputs":[{"name":"miner","type":"address"},{"name":"chestCnt","type":"uint64"},{"name":"tmCreate","type":"uint64"},{"name":"tmResolve","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isPaused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"miningOne","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_newService","type":"address"}],"name":"setService","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"addrAdmin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"miningOneSelf","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"miningTen","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"addrService","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_isOpen","type":"bool"}],"name":"setRecommendStatus","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"}],"name":"setDataMining","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"miningThree","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_target","type":"address"},{"name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_nftAddr","type":"address"},{"name":"_maxProtoId","type":"uint16"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"index","type":"uint256"},{"indexed":true,"name":"miner","type":"address"},{"indexed":false,"name":"chestCnt","type":"uint64"}],"name":"MiningOrderCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"index","type":"uint256"},{"indexed":true,"name":"miner","type":"address"},{"indexed":false,"name":"chestCnt","type":"uint64"}],"name":"MiningResolved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"preAdmin","type":"address"},{"indexed":true,"name":"newAdmin","type":"address"}],"name":"AdminTransferred","type":"event"}]

60606040526001805460ff1916905534156200001a57600080fd5b60405160408062001e6483398101604052808051919060200180519150620000439050620001d1565b6001805461010060a860020a031990811661010033600160a060020a0390811691820292831790931690911790925560028054600160a060020a031990811684179091556003805460058054841694891694909417909355911690911760a060020a61ffff0219167401000000000000000000000000000000000000000061ffff85160217905560806040519081016040908152600080835260208301526001908201819052606082018190526007805492935091908101620001078382620001f8565b6000928352602090922083916002020181518154600160a060020a031916600160a060020a0391909116178155602082015181546001604060020a0391909116740100000000000000000000000000000000000000000260a060020a60e060020a0319909116178155604082015160018201805467ffffffffffffffff19166001604060020a039290921691909117905560608201518160010160086101000a8154816001604060020a0302191690836001604060020a0316021790555050505050505062000284565b60806040519081016040908152600080835260208301819052908201819052606082015290565b81548183558181151162000227576002028160020283600052602060002091820191016200022791906200022c565b505050565b6200028191905b808211156200027d5780547fffffffff000000000000000000000000000000000000000000000000000000001681556001810180546001608060020a031916905560020162000233565b5090565b90565b611bd080620002946000396000f3006060604052600436106101445763ffffffff60e060020a600035041662cb527f81146101465780630d6688181461014e578063216ea2391461017d578063234dfdfd1461019657806330efb8d3146101c2578063336c6d39146101d557806345e3553e146101f457806355a373d61461020e57806367d0661d14610221578063704b6c021461023457806382cb9df9146102535780638d0a5fbb146102665780639714a27c1461027957806397ce8c431461028c5780639b8d3064146102a9578063a96c879e146102c8578063b187bd261461031f578063b3f17c2014610346578063bf8bdac11461034e578063bfae2f0e1461036d578063c16c085114610380578063cc4bf6a314610388578063cdd977e014610390578063d80162fc146103a3578063dbb62f24146103bb578063ec91b550146103da578063f3fef3a3146103e2575b005b610144610404565b341561015957600080fd5b610161610490565b604051600160a060020a03909116815260200160405180910390f35b341561018857600080fd5b61014460043560243561049f565b34156101a157600080fd5b6101b061ffff600435166106ed565b60405190815260200160405180910390f35b34156101cd57600080fd5b6101446106ff565b34156101e057600080fd5b610144600160a060020a036004351661073c565b34156101ff57600080fd5b61014461ffff600435166107a0565b341561021957600080fd5b610161610834565b341561022c57600080fd5b610144610843565b341561023f57600080fd5b610144600160a060020a0360043516610881565b341561025e57600080fd5b61016161092c565b341561027157600080fd5b6101b061093b565b341561028457600080fd5b610144610946565b341561029757600080fd5b61014461ffff60043516602435610af2565b34156102b457600080fd5b610144600160a060020a0360043516610b95565b34156102d357600080fd5b6102de600435610c14565b604051600160a060020a03909416845267ffffffffffffffff9283166020850152908216604080850191909152911660608301526080909101905180910390f35b341561032a57600080fd5b610332610c6e565b604051901515815260200160405180910390f35b610144610c77565b341561035957600080fd5b610144600160a060020a0360043516610d01565b341561037857600080fd5b610161610d80565b610144610d94565b610144610f27565b341561039b57600080fd5b610161610fb5565b34156103ae57600080fd5b6101446004351515610fc4565b34156103c657600080fd5b610144600160a060020a0360043516611058565b6101446110bc565b34156103ed57600080fd5b610144600160a060020a0360043516602435611146565b60015460ff161561041457600080fd5b66a8c0ff92d4c00034101561042857600080fd5b610433336005611244565b61044366a8c0ff92d4c000611345565b66a8c0ff92d4c00034111561048e57600160a060020a03331666a8c0ff92d4bfff19340180156108fc0290604051600060405180830381858888f19350505050151561048e57600080fd5b565b600654600160a060020a031681565b6000806000806104ad611aef565b60025460009033600160a060020a039081169116146104cb57600080fd5b6000881180156104dc575060075488105b15156104e757600080fd5b60078054899081106104f557fe5b60009182526020909120600290910201600181015490965068010000000000000000900467ffffffffffffffff161561052d57600080fd5b8554600160a060020a0316945084151561054657600080fd5b855460a060020a900467ffffffffffffffff169350600184108015906105775750600a8467ffffffffffffffff1611155b151561058257600080fd5b5085915060005b8367ffffffffffffffff168167ffffffffffffffff161015610668576105ae836115d0565b92506105b983611624565b600554909250600160a060020a0316639cc477b28684600260405160e060020a63ffffffff8616028152600160a060020a03841660048201908152906024018361012080838360005b8381101561061a578082015183820152602001610602565b505050509050018261ffff1681526020019350505050602060405180830381600087803b151561064957600080fd5b5af1151561065657600080fd5b50505060405180515050600101610589565b6001860180546fffffffffffffffff00000000000000001916680100000000000000004267ffffffffffffffff1602179055600160a060020a038516887f931def6cc112c3c517a58e0210803246f6b189e89b453503c88cf9a1e988ce2c8660405167ffffffffffffffff909116815260200160405180910390a35050505050505050565b60086020526000908152604090205481565b60015433600160a060020a03908116610100909204161461071f57600080fd5b60015460ff16151561073057600080fd5b6001805460ff19169055565b60015433600160a060020a03908116610100909204161461075c57600080fd5b600160a060020a038116151561077157600080fd5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60015433600160a060020a0390811661010090920416146107c057600080fd5b60008161ffff161180156107d957506127108161ffff16105b15156107e457600080fd5b60035461ffff82811660a060020a90920416141561080157600080fd5b6003805461ffff90921660a060020a0275ffff000000000000000000000000000000000000000019909216919091179055565b600554600160a060020a031681565b60015433600160a060020a03908116610100909204161461086357600080fd5b60015460ff161561087357600080fd5b6001805460ff191681179055565b60015433600160a060020a0390811661010090920416146108a157600080fd5b600160a060020a03811615156108b657600080fd5b600154600160a060020a03808316916101009004167ff8ccb027dfcd135e000e9d45e6cc2d662578a8825d4c45b5e32e0adf67e79ec660405160405180910390a360018054600160a060020a039092166101000274ffffffffffffffffffffffffffffffffffffffff0019909216919091179055565b600354600160a060020a031681565b600754600019015b90565b6000610950611aef565b60015460ff161561096057600080fd5b600654600160a060020a0316151561097757600080fd5b61097f611a36565b915061098a82611624565b600654909150600160a060020a031663d0946d003360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156109dd57600080fd5b5af115156109ea57600080fd5b5050506040518051905015156109ff57600080fd5b600554600160a060020a0316639cc477b23383600360405160e060020a63ffffffff8616028152600160a060020a03841660048201908152906024018361012080838360005b83811015610a5d578082015183820152602001610a45565b505050509050018261ffff1681526020019350505050602060405180830381600087803b1515610a8c57600080fd5b5af11515610a9957600080fd5b50505060405180515050600160a060020a03331660007f931def6cc112c3c517a58e0210803246f6b189e89b453503c88cf9a1e988ce2c600160405167ffffffffffffffff909116815260200160405180910390a35050565b60015433600160a060020a039081166101009092041614610b1257600080fd5b60008261ffff16118015610b37575060035461ffff60a060020a909104811690831611155b1515610b4257600080fd5b600081118015610b53575060058111155b1515610b5e57600080fd5b61ffff8216600090815260086020526040902054811415610b7e57600080fd5b61ffff909116600090815260086020526040902055565b60035433600160a060020a0390811691161480610bc5575060015433600160a060020a0390811661010090920416145b1515610bd057600080fd5b600160a060020a0381161515610be557600080fd5b6003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6007805482908110610c2257fe5b600091825260209091206002909102018054600190910154600160a060020a038216925067ffffffffffffffff60a060020a909204821691818116916801000000000000000090041684565b60015460ff1681565b60015460ff1615610c8757600080fd5b662386f26fc10000341015610c9b57600080fd5b610ca6336001611244565b610cb6662386f26fc10000611345565b662386f26fc1000034111561048e57600160a060020a033316662386f26fc0ffff19340180156108fc0290604051600060405180830381858888f19350505050151561048e57600080fd5b60025433600160a060020a0390811691161480610d31575060015433600160a060020a0390811661010090920416145b1515610d3c57600080fd5b600160a060020a0381161515610d5157600080fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6001546101009004600160a060020a031681565b6000610d9e611aef565b60015460ff1615610dae57600080fd5b662386f26fc10000341015610dc257600080fd5b610dca611a36565b9150610dd582611624565b600554909150600160a060020a0316639cc477b23383600260405160e060020a63ffffffff8616028152600160a060020a03841660048201908152906024018361012080838360005b83811015610e36578082015183820152602001610e1e565b505050509050018261ffff1681526020019350505050602060405180830381600087803b1515610e6557600080fd5b5af11515610e7257600080fd5b5050506040518051905050610e8d662386f26fc10000611345565b662386f26fc10000341115610ed857600160a060020a033316662386f26fc0ffff19340180156108fc0290604051600060405180830381858888f193505050501515610ed857600080fd5b33600160a060020a031660007f931def6cc112c3c517a58e0210803246f6b189e89b453503c88cf9a1e988ce2c600160405167ffffffffffffffff909116815260200160405180910390a35050565b60015460ff1615610f3757600080fd5b67013fbe85edc90000341015610f4c57600080fd5b610f5733600a611244565b610f6867013fbe85edc90000611345565b67013fbe85edc9000034111561048e57600160a060020a03331667013fbe85edc8ffff19340180156108fc0290604051600060405180830381858888f19350505050151561048e57600080fd5b600254600160a060020a031681565b60015433600160a060020a039081166101009092041614610fe457600080fd5b600354760100000000000000000000000000000000000000000000900460ff161515811515141561101457600080fd5b600380549115157601000000000000000000000000000000000000000000000276ff0000000000000000000000000000000000000000000019909216919091179055565b60015433600160a060020a03908116610100909204161461107857600080fd5b600160a060020a038116151561108d57600080fd5b6006805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60015460ff16156110cc57600080fd5b666a94d74f4300003410156110e057600080fd5b6110eb336003611244565b6110fb666a94d74f430000611345565b666a94d74f43000034111561048e57600160a060020a033316666a94d74f42ffff19340180156108fc0290604051600060405180830381858888f19350505050151561048e57600080fd5b600354600090819033600160a060020a039081169116148061117b575060015433600160a060020a0390811661010090920416145b151561118657600080fd5b6000831161119357600080fd5b600160a060020a038416156111a857836111b5565b600354600160a060020a03165b915050600160a060020a033016318083101561120157600160a060020a03821683156108fc0284604051600060405180830381858888f1935050505015156111fc57600080fd5b61123e565b81600160a060020a03166108fc30600160a060020a0316319081150290604051600060405180830381858888f19350505050151561123e57600080fd5b50505050565b6007805490600090600183019061125b9082611b18565b506007805467ffffffffffffffff841690811061127457fe5b60009182526020909120600290910201805467ffffffffffffffff80861660a060020a027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff600160a060020a03891673ffffffffffffffffffffffffffffffffffffffff1990941684171617835560018301805442831667ffffffffffffffff199091161790559192509083167f9e5df0d8f15bc55f160926347ca09880b1297e69d68f128ea6c3f6fb04cf17be8560405167ffffffffffffffff909116815260200160405180910390a350505050565b6003546000908190819081908190760100000000000000000000000000000000000000000000900460ff161561151157600654600160a060020a031663153154fd3360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156113c557600080fd5b5af115156113d257600080fd5b5050506040518051925050600160a060020a03821615611511576113fd86600a63ffffffff611a8f16565b9050611431606461142560326114198a8663ffffffff611aab16565b9063ffffffff611abd16565b9063ffffffff611a8f16565b600354909450600160a060020a031684156108fc0285604051600060405180830381858888f19350505050151561146757600080fd5b60019450600160a060020a03821681156108fc0282604051600060405180830381858888f19350505050151561149c57600080fd5b6114bc846114b0888463ffffffff611aab16565b9063ffffffff611aab16565b600454909350600160a060020a0316158015906114d95750600083115b1561151157600454600160a060020a031683156108fc0284604051600060405180830381858888f19350505050151561151157600080fd5b8415156115c85761152e606461142588603263ffffffff611abd16565b9350611540868563ffffffff611aab16565b600354909350600160a060020a031684156108fc0285604051600060405180830381858888f19350505050151561157657600080fd5b600454600160a060020a0316158015906115905750600083115b156115c857600454600160a060020a031683156108fc0284604051600060405180830381858888f1935050505015156115c857600080fd5b505050505050565b600081600143034041446040519384526020840192909252600160a060020a03166c010000000000000000000000000260408084019190915260548301919091526074909101905190819003902092915050565b61162c611aef565b81612710810660008080808080611af487101561165357600160208a0152600095506116ad565b6121fc87101561166d57600260208a0152600195506116ad565b61258087101561168757600360208a0152600295506116ad565b6126ac8710156116a157600460208a0181905295506116ad565b600560208a0152600695505b6003546127109098049760a060020a900461ffff1661270f8115156116ce57fe5b0461ffff1661271089068115156116e157fe5b046001019650600360149054906101000a900461ffff1661ffff168711156117165760035460a060020a900461ffff16611718565b865b61ffff16895261271090970496600860008a5161ffff168152602081019190915260400160002054945084151561174e57600594505b8461270f81151561175b57fe5b04612710890681151561176a57fe5b0460010196508487111561177e5784611780565b865b61ffff811660408b015293506003895161ffff1681151561179d57fe5b0661ffff16965061271088049750601561271089068115156117bb57fe5b06605a01945086600014156118ab578361ffff1660011415611817576064602860c88881020161ffff90811688028390049182028390041660808c0152935060a084025b048960055b61ffff90921660209290920201526118a6565b8361ffff166002141561183c57606461ffff6028808902011686025b04896006611804565b8361ffff166003141561186257606461ffff610258808902011686025b04896003611804565b8361ffff166004141561188257606461ffff603c80890201168602611833565b606461ffff610190808902011686025b048960035b61ffff90921660209290920201525b611a20565b8660011415611962578361ffff16600114156118ed576064603260be8881020161ffff90811688028390049182028390041660808c01529250609683026117ff565b8361ffff166002141561190d57606461ffff602a80890201168602611833565b8361ffff166003141561192e57606461ffff61027680890201168602611859565b8361ffff166004141561194e57606461ffff603f80890201168602611833565b606461ffff6101a480890201168602611892565b8361ffff166001141561199f57506064601e60d28781020161ffff90811687028390049182028390041660808b01529060aa820204896005611897565b8361ffff16600214156119c457606461ffff6026808902011686025b04896006611897565b8361ffff16600314156119e557606461ffff61023a80890201168602611892565b8361ffff1660041415611a0557606461ffff6039808902011686026119bb565b606461ffff61017c8881020181168702919091041660608a01525b5050600061010088015250949695505050505050565b60008054600143034041446040519384526020840192909252600160a060020a03166c01000000000000000000000000026040808401919091526054830191909152607490910190519081900390206000819055905090565b6000808284811515611a9d57fe5b0490508091505b5092915050565b600082821115611ab757fe5b50900390565b600080831515611ad05760009150611aa4565b50828202828482811515611ae057fe5b0414611ae857fe5b9392505050565b6101206040519081016040526009815b600081526000199091019060200181611aff5790505090565b815481835581811511611b4457600202816002028360005260206000209182019101611b449190611b49565b505050565b61094391905b80821115611ba05780547fffffffff000000000000000000000000000000000000000000000000000000001681556001810180546fffffffffffffffffffffffffffffffff19169055600201611b4f565b50905600a165627a7a72305820cbdc45b4c953770d691d66a0175ffa43b063a1ca735762fd435eef6d13d7c15e0029000000000000000000000000da9c03dfd4d137f926c3cf6953cb951832eb08b20000000000000000000000000000000000000000000000000000000000000005

Deployed Bytecode

0x6060604052600436106101445763ffffffff60e060020a600035041662cb527f81146101465780630d6688181461014e578063216ea2391461017d578063234dfdfd1461019657806330efb8d3146101c2578063336c6d39146101d557806345e3553e146101f457806355a373d61461020e57806367d0661d14610221578063704b6c021461023457806382cb9df9146102535780638d0a5fbb146102665780639714a27c1461027957806397ce8c431461028c5780639b8d3064146102a9578063a96c879e146102c8578063b187bd261461031f578063b3f17c2014610346578063bf8bdac11461034e578063bfae2f0e1461036d578063c16c085114610380578063cc4bf6a314610388578063cdd977e014610390578063d80162fc146103a3578063dbb62f24146103bb578063ec91b550146103da578063f3fef3a3146103e2575b005b610144610404565b341561015957600080fd5b610161610490565b604051600160a060020a03909116815260200160405180910390f35b341561018857600080fd5b61014460043560243561049f565b34156101a157600080fd5b6101b061ffff600435166106ed565b60405190815260200160405180910390f35b34156101cd57600080fd5b6101446106ff565b34156101e057600080fd5b610144600160a060020a036004351661073c565b34156101ff57600080fd5b61014461ffff600435166107a0565b341561021957600080fd5b610161610834565b341561022c57600080fd5b610144610843565b341561023f57600080fd5b610144600160a060020a0360043516610881565b341561025e57600080fd5b61016161092c565b341561027157600080fd5b6101b061093b565b341561028457600080fd5b610144610946565b341561029757600080fd5b61014461ffff60043516602435610af2565b34156102b457600080fd5b610144600160a060020a0360043516610b95565b34156102d357600080fd5b6102de600435610c14565b604051600160a060020a03909416845267ffffffffffffffff9283166020850152908216604080850191909152911660608301526080909101905180910390f35b341561032a57600080fd5b610332610c6e565b604051901515815260200160405180910390f35b610144610c77565b341561035957600080fd5b610144600160a060020a0360043516610d01565b341561037857600080fd5b610161610d80565b610144610d94565b610144610f27565b341561039b57600080fd5b610161610fb5565b34156103ae57600080fd5b6101446004351515610fc4565b34156103c657600080fd5b610144600160a060020a0360043516611058565b6101446110bc565b34156103ed57600080fd5b610144600160a060020a0360043516602435611146565b60015460ff161561041457600080fd5b66a8c0ff92d4c00034101561042857600080fd5b610433336005611244565b61044366a8c0ff92d4c000611345565b66a8c0ff92d4c00034111561048e57600160a060020a03331666a8c0ff92d4bfff19340180156108fc0290604051600060405180830381858888f19350505050151561048e57600080fd5b565b600654600160a060020a031681565b6000806000806104ad611aef565b60025460009033600160a060020a039081169116146104cb57600080fd5b6000881180156104dc575060075488105b15156104e757600080fd5b60078054899081106104f557fe5b60009182526020909120600290910201600181015490965068010000000000000000900467ffffffffffffffff161561052d57600080fd5b8554600160a060020a0316945084151561054657600080fd5b855460a060020a900467ffffffffffffffff169350600184108015906105775750600a8467ffffffffffffffff1611155b151561058257600080fd5b5085915060005b8367ffffffffffffffff168167ffffffffffffffff161015610668576105ae836115d0565b92506105b983611624565b600554909250600160a060020a0316639cc477b28684600260405160e060020a63ffffffff8616028152600160a060020a03841660048201908152906024018361012080838360005b8381101561061a578082015183820152602001610602565b505050509050018261ffff1681526020019350505050602060405180830381600087803b151561064957600080fd5b5af1151561065657600080fd5b50505060405180515050600101610589565b6001860180546fffffffffffffffff00000000000000001916680100000000000000004267ffffffffffffffff1602179055600160a060020a038516887f931def6cc112c3c517a58e0210803246f6b189e89b453503c88cf9a1e988ce2c8660405167ffffffffffffffff909116815260200160405180910390a35050505050505050565b60086020526000908152604090205481565b60015433600160a060020a03908116610100909204161461071f57600080fd5b60015460ff16151561073057600080fd5b6001805460ff19169055565b60015433600160a060020a03908116610100909204161461075c57600080fd5b600160a060020a038116151561077157600080fd5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60015433600160a060020a0390811661010090920416146107c057600080fd5b60008161ffff161180156107d957506127108161ffff16105b15156107e457600080fd5b60035461ffff82811660a060020a90920416141561080157600080fd5b6003805461ffff90921660a060020a0275ffff000000000000000000000000000000000000000019909216919091179055565b600554600160a060020a031681565b60015433600160a060020a03908116610100909204161461086357600080fd5b60015460ff161561087357600080fd5b6001805460ff191681179055565b60015433600160a060020a0390811661010090920416146108a157600080fd5b600160a060020a03811615156108b657600080fd5b600154600160a060020a03808316916101009004167ff8ccb027dfcd135e000e9d45e6cc2d662578a8825d4c45b5e32e0adf67e79ec660405160405180910390a360018054600160a060020a039092166101000274ffffffffffffffffffffffffffffffffffffffff0019909216919091179055565b600354600160a060020a031681565b600754600019015b90565b6000610950611aef565b60015460ff161561096057600080fd5b600654600160a060020a0316151561097757600080fd5b61097f611a36565b915061098a82611624565b600654909150600160a060020a031663d0946d003360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156109dd57600080fd5b5af115156109ea57600080fd5b5050506040518051905015156109ff57600080fd5b600554600160a060020a0316639cc477b23383600360405160e060020a63ffffffff8616028152600160a060020a03841660048201908152906024018361012080838360005b83811015610a5d578082015183820152602001610a45565b505050509050018261ffff1681526020019350505050602060405180830381600087803b1515610a8c57600080fd5b5af11515610a9957600080fd5b50505060405180515050600160a060020a03331660007f931def6cc112c3c517a58e0210803246f6b189e89b453503c88cf9a1e988ce2c600160405167ffffffffffffffff909116815260200160405180910390a35050565b60015433600160a060020a039081166101009092041614610b1257600080fd5b60008261ffff16118015610b37575060035461ffff60a060020a909104811690831611155b1515610b4257600080fd5b600081118015610b53575060058111155b1515610b5e57600080fd5b61ffff8216600090815260086020526040902054811415610b7e57600080fd5b61ffff909116600090815260086020526040902055565b60035433600160a060020a0390811691161480610bc5575060015433600160a060020a0390811661010090920416145b1515610bd057600080fd5b600160a060020a0381161515610be557600080fd5b6003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6007805482908110610c2257fe5b600091825260209091206002909102018054600190910154600160a060020a038216925067ffffffffffffffff60a060020a909204821691818116916801000000000000000090041684565b60015460ff1681565b60015460ff1615610c8757600080fd5b662386f26fc10000341015610c9b57600080fd5b610ca6336001611244565b610cb6662386f26fc10000611345565b662386f26fc1000034111561048e57600160a060020a033316662386f26fc0ffff19340180156108fc0290604051600060405180830381858888f19350505050151561048e57600080fd5b60025433600160a060020a0390811691161480610d31575060015433600160a060020a0390811661010090920416145b1515610d3c57600080fd5b600160a060020a0381161515610d5157600080fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6001546101009004600160a060020a031681565b6000610d9e611aef565b60015460ff1615610dae57600080fd5b662386f26fc10000341015610dc257600080fd5b610dca611a36565b9150610dd582611624565b600554909150600160a060020a0316639cc477b23383600260405160e060020a63ffffffff8616028152600160a060020a03841660048201908152906024018361012080838360005b83811015610e36578082015183820152602001610e1e565b505050509050018261ffff1681526020019350505050602060405180830381600087803b1515610e6557600080fd5b5af11515610e7257600080fd5b5050506040518051905050610e8d662386f26fc10000611345565b662386f26fc10000341115610ed857600160a060020a033316662386f26fc0ffff19340180156108fc0290604051600060405180830381858888f193505050501515610ed857600080fd5b33600160a060020a031660007f931def6cc112c3c517a58e0210803246f6b189e89b453503c88cf9a1e988ce2c600160405167ffffffffffffffff909116815260200160405180910390a35050565b60015460ff1615610f3757600080fd5b67013fbe85edc90000341015610f4c57600080fd5b610f5733600a611244565b610f6867013fbe85edc90000611345565b67013fbe85edc9000034111561048e57600160a060020a03331667013fbe85edc8ffff19340180156108fc0290604051600060405180830381858888f19350505050151561048e57600080fd5b600254600160a060020a031681565b60015433600160a060020a039081166101009092041614610fe457600080fd5b600354760100000000000000000000000000000000000000000000900460ff161515811515141561101457600080fd5b600380549115157601000000000000000000000000000000000000000000000276ff0000000000000000000000000000000000000000000019909216919091179055565b60015433600160a060020a03908116610100909204161461107857600080fd5b600160a060020a038116151561108d57600080fd5b6006805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60015460ff16156110cc57600080fd5b666a94d74f4300003410156110e057600080fd5b6110eb336003611244565b6110fb666a94d74f430000611345565b666a94d74f43000034111561048e57600160a060020a033316666a94d74f42ffff19340180156108fc0290604051600060405180830381858888f19350505050151561048e57600080fd5b600354600090819033600160a060020a039081169116148061117b575060015433600160a060020a0390811661010090920416145b151561118657600080fd5b6000831161119357600080fd5b600160a060020a038416156111a857836111b5565b600354600160a060020a03165b915050600160a060020a033016318083101561120157600160a060020a03821683156108fc0284604051600060405180830381858888f1935050505015156111fc57600080fd5b61123e565b81600160a060020a03166108fc30600160a060020a0316319081150290604051600060405180830381858888f19350505050151561123e57600080fd5b50505050565b6007805490600090600183019061125b9082611b18565b506007805467ffffffffffffffff841690811061127457fe5b60009182526020909120600290910201805467ffffffffffffffff80861660a060020a027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff600160a060020a03891673ffffffffffffffffffffffffffffffffffffffff1990941684171617835560018301805442831667ffffffffffffffff199091161790559192509083167f9e5df0d8f15bc55f160926347ca09880b1297e69d68f128ea6c3f6fb04cf17be8560405167ffffffffffffffff909116815260200160405180910390a350505050565b6003546000908190819081908190760100000000000000000000000000000000000000000000900460ff161561151157600654600160a060020a031663153154fd3360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156113c557600080fd5b5af115156113d257600080fd5b5050506040518051925050600160a060020a03821615611511576113fd86600a63ffffffff611a8f16565b9050611431606461142560326114198a8663ffffffff611aab16565b9063ffffffff611abd16565b9063ffffffff611a8f16565b600354909450600160a060020a031684156108fc0285604051600060405180830381858888f19350505050151561146757600080fd5b60019450600160a060020a03821681156108fc0282604051600060405180830381858888f19350505050151561149c57600080fd5b6114bc846114b0888463ffffffff611aab16565b9063ffffffff611aab16565b600454909350600160a060020a0316158015906114d95750600083115b1561151157600454600160a060020a031683156108fc0284604051600060405180830381858888f19350505050151561151157600080fd5b8415156115c85761152e606461142588603263ffffffff611abd16565b9350611540868563ffffffff611aab16565b600354909350600160a060020a031684156108fc0285604051600060405180830381858888f19350505050151561157657600080fd5b600454600160a060020a0316158015906115905750600083115b156115c857600454600160a060020a031683156108fc0284604051600060405180830381858888f1935050505015156115c857600080fd5b505050505050565b600081600143034041446040519384526020840192909252600160a060020a03166c010000000000000000000000000260408084019190915260548301919091526074909101905190819003902092915050565b61162c611aef565b81612710810660008080808080611af487101561165357600160208a0152600095506116ad565b6121fc87101561166d57600260208a0152600195506116ad565b61258087101561168757600360208a0152600295506116ad565b6126ac8710156116a157600460208a0181905295506116ad565b600560208a0152600695505b6003546127109098049760a060020a900461ffff1661270f8115156116ce57fe5b0461ffff1661271089068115156116e157fe5b046001019650600360149054906101000a900461ffff1661ffff168711156117165760035460a060020a900461ffff16611718565b865b61ffff16895261271090970496600860008a5161ffff168152602081019190915260400160002054945084151561174e57600594505b8461270f81151561175b57fe5b04612710890681151561176a57fe5b0460010196508487111561177e5784611780565b865b61ffff811660408b015293506003895161ffff1681151561179d57fe5b0661ffff16965061271088049750601561271089068115156117bb57fe5b06605a01945086600014156118ab578361ffff1660011415611817576064602860c88881020161ffff90811688028390049182028390041660808c0152935060a084025b048960055b61ffff90921660209290920201526118a6565b8361ffff166002141561183c57606461ffff6028808902011686025b04896006611804565b8361ffff166003141561186257606461ffff610258808902011686025b04896003611804565b8361ffff166004141561188257606461ffff603c80890201168602611833565b606461ffff610190808902011686025b048960035b61ffff90921660209290920201525b611a20565b8660011415611962578361ffff16600114156118ed576064603260be8881020161ffff90811688028390049182028390041660808c01529250609683026117ff565b8361ffff166002141561190d57606461ffff602a80890201168602611833565b8361ffff166003141561192e57606461ffff61027680890201168602611859565b8361ffff166004141561194e57606461ffff603f80890201168602611833565b606461ffff6101a480890201168602611892565b8361ffff166001141561199f57506064601e60d28781020161ffff90811687028390049182028390041660808b01529060aa820204896005611897565b8361ffff16600214156119c457606461ffff6026808902011686025b04896006611897565b8361ffff16600314156119e557606461ffff61023a80890201168602611892565b8361ffff1660041415611a0557606461ffff6039808902011686026119bb565b606461ffff61017c8881020181168702919091041660608a01525b5050600061010088015250949695505050505050565b60008054600143034041446040519384526020840192909252600160a060020a03166c01000000000000000000000000026040808401919091526054830191909152607490910190519081900390206000819055905090565b6000808284811515611a9d57fe5b0490508091505b5092915050565b600082821115611ab757fe5b50900390565b600080831515611ad05760009150611aa4565b50828202828482811515611ae057fe5b0414611ae857fe5b9392505050565b6101206040519081016040526009815b600081526000199091019060200181611aff5790505090565b815481835581811511611b4457600202816002028360005260206000209182019101611b449190611b49565b505050565b61094391905b80821115611ba05780547fffffffff000000000000000000000000000000000000000000000000000000001681556001810180546fffffffffffffffffffffffffffffffff19169055600201611b4f565b50905600a165627a7a72305820cbdc45b4c953770d691d66a0175ffa43b063a1ca735762fd435eef6d13d7c15e0029

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000da9c03dfd4d137f926c3cf6953cb951832eb08b20000000000000000000000000000000000000000000000000000000000000005

-----Decoded View---------------
Arg [0] : _nftAddr (address): 0xDA9c03dFd4D137F926c3cF6953cb951832Eb08b2
Arg [1] : _maxProtoId (uint16): 5

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000da9c03dfd4d137f926c3cf6953cb951832eb08b2
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000005


Swarm Source

bzzr://cbdc45b4c953770d691d66a0175ffa43b063a1ca735762fd435eef6d13d7c15e

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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