Contract 0x47F21A0EC081df4c18A244a451b40f4773ED49CA 1

Contract Overview

Balance:
0 Ether
Txn Hash
Method
Block
From
To
Value
0x8cec7e4cfcd5f96d7e538c26148fc4aedf62f2b892f3241dd290821cd1dc11730x6080604082490752021-03-17 8:22:00476 days 12 hrs ago0x640a7ae1839d17633be0754342d3d004db560833 IN  Create: OneCCGlobal0 Ether0.002353151
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
OneCCGlobal

Compiler Version
v0.4.26+commit.4563c3fc

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-03-17
*/

pragma solidity ^0.4.26;

library SafeMath {

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

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

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

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

contract Ownable {
  address public owner;


  event OwnershipRenounced(address indexed previousOwner);
  event OwnershipTransferred(
    address indexed previousOwner,
    address indexed newOwner
  );


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  constructor() public {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) public onlyOwner {
    require(newOwner != address(0));
    emit OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }

  /**
   * @dev Allows the current owner to relinquish control of the contract.
   */
  function renounceOwnership() public onlyOwner {
    emit OwnershipRenounced(owner);
    owner = address(0);
  }
}

contract ERC20Basic {
  function totalSupply() public view returns (uint256);
  function balanceOf(address who) public view returns (uint256);
  function transfer(address to, uint256 value) public returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
}

contract ERC20 is ERC20Basic {
  function allowance(address owner, address spender)
    public view returns (uint256);

  function transferFrom(address from, address to, uint256 value)
    public returns (bool);

  function approve(address spender, uint256 value) public returns (bool);
  event Approval(
    address indexed owner,
    address indexed spender,
    uint256 value
  );
}

library ArrayUtils {

    /**
     * Replace bytes in an array with bytes in another array, guarded by a bitmask
     * Efficiency of this function is a bit unpredictable because of the EVM's word-specific model (arrays under 32 bytes will be slower)
     * 
     * @dev Mask must be the size of the byte array. A nonzero byte means the byte array can be changed.
     * @param array The original array
     * @param desired The target array
     * @param mask The mask specifying which bits can be changed
     * @return The updated byte array (the parameter will be modified inplace)
     */
    function guardedArrayReplace(bytes memory array, bytes memory desired, bytes memory mask)
        internal
        pure
    {
        require(array.length == desired.length);
        require(array.length == mask.length);

        uint words = array.length / 0x20;
        uint index = words * 0x20;
        assert(index / 0x20 == words);
        uint i;

        for (i = 0; i < words; i++) {
            /* Conceptually: array[i] = (!mask[i] && array[i]) || (mask[i] && desired[i]), bitwise in word chunks. */
            assembly {
                let commonIndex := mul(0x20, add(1, i))
                let maskValue := mload(add(mask, commonIndex))
                mstore(add(array, commonIndex), or(and(not(maskValue), mload(add(array, commonIndex))), and(maskValue, mload(add(desired, commonIndex)))))
            }
        }

        /* Deal with the last section of the byte array. */
        if (words > 0) {
            /* This overlaps with bytes already set but is still more efficient than iterating through each of the remaining bytes individually. */
            i = words;
            assembly {
                let commonIndex := mul(0x20, add(1, i))
                let maskValue := mload(add(mask, commonIndex))
                mstore(add(array, commonIndex), or(and(not(maskValue), mload(add(array, commonIndex))), and(maskValue, mload(add(desired, commonIndex)))))
            }
        } else {
            /* If the byte array is shorter than a word, we must unfortunately do the whole thing bytewise.
               (bounds checks could still probably be optimized away in assembly, but this is a rare case) */
            for (i = index; i < array.length; i++) {
                array[i] = ((mask[i] ^ 0xff) & array[i]) | (mask[i] & desired[i]);
            }
        }
    }

    /**
     * Test if two arrays are equal
     * Source: https://github.com/GNSPS/solidity-bytes-utils/blob/master/contracts/BytesLib.sol
     * 
     * @dev Arrays must be of equal length, otherwise will return false
     * @param a First array
     * @param b Second array
     * @return Whether or not all bytes in the arrays are equal
     */
    function arrayEq(bytes memory a, bytes memory b)
        internal
        pure
        returns (bool)
    {
        bool success = true;

        assembly {
            let length := mload(a)

            // if lengths don't match the arrays are not equal
            switch eq(length, mload(b))
            case 1 {
                // cb is a circuit breaker in the for loop since there's
                //  no said feature for inline assembly loops
                // cb = 1 - don't breaker
                // cb = 0 - break
                let cb := 1

                let mc := add(a, 0x20)
                let end := add(mc, length)

                for {
                    let cc := add(b, 0x20)
                // the next line is the loop condition:
                // while(uint(mc < end) + cb == 2)
                } eq(add(lt(mc, end), cb), 2) {
                    mc := add(mc, 0x20)
                    cc := add(cc, 0x20)
                } {
                    // if any of these checks fails then arrays are not equal
                    if iszero(eq(mload(mc), mload(cc))) {
                        // unsuccess:
                        success := 0
                        cb := 0
                    }
                }
            }
            default {
                // unsuccess:
                success := 0
            }
        }

        return success;
    }

    /**
     * Unsafe write byte array into a memory location
     *
     * @param index Memory location
     * @param source Byte array to write
     * @return End memory index
     */
    function unsafeWriteBytes(uint index, bytes source)
        internal
        pure
        returns (uint)
    {
        if (source.length > 0) {
            assembly {
                let length := mload(source)
                let end := add(source, add(0x20, length))
                let arrIndex := add(source, 0x20)
                let tempIndex := index
                for { } eq(lt(arrIndex, end), 1) {
                    arrIndex := add(arrIndex, 0x20)
                    tempIndex := add(tempIndex, 0x20)
                } {
                    mstore(tempIndex, mload(arrIndex))
                }
                index := add(index, length)
            }
        }
        return index;
    }

    /**
     * Unsafe write address into a memory location
     *
     * @param index Memory location
     * @param source Address to write
     * @return End memory index
     */
    function unsafeWriteAddress(uint index, address source)
        internal
        pure
        returns (uint)
    {
        uint conv = uint(source) << 0x60;
        assembly {
            mstore(index, conv)
            index := add(index, 0x14)
        }
        return index;
    }

    /**
     * Unsafe write uint into a memory location
     *
     * @param index Memory location
     * @param source uint to write
     * @return End memory index
     */
    function unsafeWriteUint(uint index, uint source)
        internal
        pure
        returns (uint)
    {
        assembly {
            mstore(index, source)
            index := add(index, 0x20)
        }
        return index;
    }

    /**
     * Unsafe write uint8 into a memory location
     *
     * @param index Memory location
     * @param source uint8 to write
     * @return End memory index
     */
    function unsafeWriteUint8(uint index, uint8 source)
        internal
        pure
        returns (uint)
    {
        assembly {
            mstore8(index, source)
            index := add(index, 0x1)
        }
        return index;
    }

}

contract ReentrancyGuarded {

    bool reentrancyLock = false;

    /* Prevent a contract function from being reentrant-called. */
    modifier reentrancyGuard {
        if (reentrancyLock) {
            revert();
        }
        reentrancyLock = true;
        _;
        reentrancyLock = false;
    }

}

contract TokenRecipient {
    event ReceivedEther(address indexed sender, uint amount);
    event ReceivedTokens(address indexed from, uint256 value, address indexed token, bytes extraData);

    /**
     * @dev Receive tokens and generate a log event
     * @param from Address from which to transfer tokens
     * @param value Amount of tokens to transfer
     * @param token Address of token
     * @param extraData Additional data to log
     */
    function receiveApproval(address from, uint256 value, address token, bytes extraData) public {
        ERC20 t = ERC20(token);
        require(t.transferFrom(from, this, value));
        emit ReceivedTokens(from, value, token, extraData);
    }

    /**
     * @dev Receive Ether and generate a log event
     */
    function () payable public {
        emit ReceivedEther(msg.sender, msg.value);
    }
}

contract ProxyRegistry is Ownable {

    /* DelegateProxy implementation contract. Must be initialized. */
    address public delegateProxyImplementation;

    /* Authenticated proxies by user. */
    mapping(address => OwnableDelegateProxy) public proxies;

    /* Contracts pending access. */
    mapping(address => uint) public pending;

    /* Contracts allowed to call those proxies. */
    mapping(address => bool) public contracts;

    /* Delay period for adding an authenticated contract.
       This mitigates a particular class of potential attack on the Wyvern DAO (which owns this registry) - if at any point the value of assets held by proxy contracts exceeded the value of half the WYV supply (votes in the DAO),
       a malicious but rational attacker could buy half the Wyvern and grant themselves access to all the proxy contracts. A delay period renders this attack nonthreatening - given two weeks, if that happened, users would have
       plenty of time to notice and transfer their assets.
    */
    uint public DELAY_PERIOD = 2 weeks;

    /**
     * Start the process to enable access for specified contract. Subject to delay period.
     *
     * @dev ProxyRegistry owner only
     * @param addr Address to which to grant permissions
     */
    function startGrantAuthentication (address addr)
        public
        onlyOwner
    {
        require(!contracts[addr] && pending[addr] == 0);
        pending[addr] = now;
    }

    /**
     * End the process to nable access for specified contract after delay period has passed.
     *
     * @dev ProxyRegistry owner only
     * @param addr Address to which to grant permissions
     */
    function endGrantAuthentication (address addr)
        public
        onlyOwner
    {
        require(!contracts[addr] && pending[addr] != 0 && ((pending[addr] + DELAY_PERIOD) < now));
        pending[addr] = 0;
        contracts[addr] = true;
    }

    /**
     * Revoke access for specified contract. Can be done instantly.
     *
     * @dev ProxyRegistry owner only
     * @param addr Address of which to revoke permissions
     */    
    function revokeAuthentication (address addr)
        public
        onlyOwner
    {
        contracts[addr] = false;
    }

    /**
     * Register a proxy contract with this registry
     *
     * @dev Must be called by the user which the proxy is for, creates a new AuthenticatedProxy
     * @return New AuthenticatedProxy contract
     */
    function registerProxy()
        public
        returns (OwnableDelegateProxy proxy)
    {
        require(proxies[msg.sender] == address(0));
        proxy = new OwnableDelegateProxy(msg.sender, delegateProxyImplementation, abi.encodeWithSignature("initialize(address,address)", msg.sender, address(this)));
        proxies[msg.sender] = proxy;
        return proxy;
    }

}

contract TokenTransferProxy {

    /* Authentication registry. */
    ProxyRegistry public registry;

    /**
     * Call ERC20 `transferFrom`
     *
     * @dev Authenticated contract only
     * @param token ERC20 token address
     * @param from From address
     * @param to To address
     * @param amount Transfer amount
     */
    function transferFrom(address token, address from, address to, uint amount)
        public
        returns (bool)
    {
        require(registry.contracts(msg.sender));
        return ERC20(token).transferFrom(from, to, amount);
    }

}

library SaleKindInterface {

    /**
     * Side: buy or sell.
     */
    enum Side { Buy, Sell }

    /**
     * Currently supported kinds of sale: fixed price, Dutch auction. 
     * English auctions cannot be supported without stronger escrow guarantees.
     * Future interesting options: Vickrey auction, nonlinear Dutch auctions.
     */
    enum SaleKind { FixedPrice, DutchAuction }

    /**
     * @dev Check whether the parameters of a sale are valid
     * @param saleKind Kind of sale
     * @param expirationTime Order expiration time
     * @return Whether the parameters were valid
     */
    function validateParameters(SaleKind saleKind, uint expirationTime)
        pure
        internal
        returns (bool)
    {
        /* Auctions must have a set expiration date. */
        return (saleKind == SaleKind.FixedPrice || expirationTime > 0);
    }

    /**
     * @dev Return whether or not an order can be settled
     * @dev Precondition: parameters have passed validateParameters
     * @param listingTime Order listing time
     * @param expirationTime Order expiration time
     */
    function canSettleOrder(uint listingTime, uint expirationTime)
        view
        internal
        returns (bool)
    {
        return (listingTime < now) && (expirationTime == 0 || now < expirationTime);
    }

    /**
     * @dev Calculate the settlement price of an order
     * @dev Precondition: parameters have passed validateParameters.
     * @param side Order side
     * @param saleKind Method of sale
     * @param basePrice Order base price
     * @param extra Order extra price data
     * @param listingTime Order listing time
     * @param expirationTime Order expiration time
     */
    function calculateFinalPrice(Side side, SaleKind saleKind, uint basePrice, uint extra, uint listingTime, uint expirationTime)
        view
        internal
        returns (uint finalPrice)
    {
        if (saleKind == SaleKind.FixedPrice) {
            return basePrice;
        } else if (saleKind == SaleKind.DutchAuction) {
            uint diff = SafeMath.div(SafeMath.mul(extra, SafeMath.sub(now, listingTime)), SafeMath.sub(expirationTime, listingTime));
            if (side == Side.Sell) {
                /* Sell-side - start price: basePrice. End price: basePrice - extra. */
                return SafeMath.sub(basePrice, diff);
            } else {
                /* Buy-side - start price: basePrice. End price: basePrice + extra. */
                return SafeMath.add(basePrice, diff);
            }
        }
    }

}

contract OwnedUpgradeabilityStorage {

  // Current implementation
  address internal _implementation;

  // Owner of the contract
  address private _upgradeabilityOwner;

  /**
   * @dev Tells the address of the owner
   * @return the address of the owner
   */
  function upgradeabilityOwner() public view returns (address) {
    return _upgradeabilityOwner;
  }

  /**
   * @dev Sets the address of the owner
   */
  function setUpgradeabilityOwner(address newUpgradeabilityOwner) internal {
    _upgradeabilityOwner = newUpgradeabilityOwner;
  }

  /**
  * @dev Tells the address of the current implementation
  * @return address of the current implementation
  */
  function implementation() public view returns (address) {
    return _implementation;
  }

  /**
  * @dev Tells the proxy type (EIP 897)
  * @return Proxy type, 2 for forwarding proxy
  */
  function proxyType() public pure returns (uint256 proxyTypeId) {
    return 2;
  }
}

contract AuthenticatedProxy is TokenRecipient, OwnedUpgradeabilityStorage {

    /* Whether initialized. */
    bool initialized = false;

    /* Address which owns this proxy. */
    address public user;

    /* Associated registry with contract authentication information. */
    ProxyRegistry public registry;

    /* Whether access has been revoked. */
    bool public revoked;

    /* Delegate call could be used to atomically transfer multiple assets owned by the proxy contract with one order. */
    enum HowToCall { Call, DelegateCall }

    /* Event fired when the proxy access is revoked or unrevoked. */
    event Revoked(bool revoked);

    /**
     * Initialize an AuthenticatedProxy
     *
     * @param addrUser Address of user on whose behalf this proxy will act
     * @param addrRegistry Address of ProxyRegistry contract which will manage this proxy
     */
    function initialize (address addrUser, ProxyRegistry addrRegistry)
        public
    {
        require(!initialized);
        initialized = true;
        user = addrUser;
        registry = addrRegistry;
    }

    /**
     * Set the revoked flag (allows a user to revoke ProxyRegistry access)
     *
     * @dev Can be called by the user only
     * @param revoke Whether or not to revoke access
     */
    function setRevoke(bool revoke)
        public
    {
        require(msg.sender == user);
        revoked = revoke;
        emit Revoked(revoke);
    }

    /**
     * Execute a message call from the proxy contract
     *
     * @dev Can be called by the user, or by a contract authorized by the registry as long as the user has not revoked access
     * @param dest Address to which the call will be sent
     * @param howToCall Which kind of call to make
     * @param calldata Calldata to send
     * @return Result of the call (success or failure)
     */
    function proxy(address dest, HowToCall howToCall, bytes calldata)
        public
        returns (bool result)
    {
        require(msg.sender == user || (!revoked && registry.contracts(msg.sender)));
        if (howToCall == HowToCall.Call) {
            result = dest.call(calldata);
        } else if (howToCall == HowToCall.DelegateCall) {
            result = dest.delegatecall(calldata);
        }
        return result;
    }

    /**
     * Execute a message call and assert success
     * 
     * @dev Same functionality as `proxy`, just asserts the return value
     * @param dest Address to which the call will be sent
     * @param howToCall What kind of call to make
     * @param calldata Calldata to send
     */
    function proxyAssert(address dest, HowToCall howToCall, bytes calldata)
        public
    {
        require(proxy(dest, howToCall, calldata));
    }

}

contract Proxy {

  /**
  * @dev Tells the address of the implementation where every call will be delegated.
  * @return address of the implementation to which it will be delegated
  */
  function implementation() public view returns (address);

  /**
  * @dev Tells the type of proxy (EIP 897)
  * @return Type of proxy, 2 for upgradeable proxy
  */
  function proxyType() public pure returns (uint256 proxyTypeId);

  /**
  * @dev Fallback function allowing to perform a delegatecall to the given implementation.
  * This function will return whatever the implementation call returns
  */
  function () payable public {
    address _impl = implementation();
    require(_impl != address(0));

    assembly {
      let ptr := mload(0x40)
      calldatacopy(ptr, 0, calldatasize)
      let result := delegatecall(gas, _impl, ptr, calldatasize, 0, 0)
      let size := returndatasize
      returndatacopy(ptr, 0, size)

      switch result
      case 0 { revert(ptr, size) }
      default { return(ptr, size) }
    }
  }
}

contract OwnedUpgradeabilityProxy is Proxy, OwnedUpgradeabilityStorage {
  /**
  * @dev Event to show ownership has been transferred
  * @param previousOwner representing the address of the previous owner
  * @param newOwner representing the address of the new owner
  */
  event ProxyOwnershipTransferred(address previousOwner, address newOwner);

  /**
  * @dev This event will be emitted every time the implementation gets upgraded
  * @param implementation representing the address of the upgraded implementation
  */
  event Upgraded(address indexed implementation);

  /**
  * @dev Upgrades the implementation address
  * @param implementation representing the address of the new implementation to be set
  */
  function _upgradeTo(address implementation) internal {
    require(_implementation != implementation);
    _implementation = implementation;
    emit Upgraded(implementation);
  }

  /**
  * @dev Throws if called by any account other than the owner.
  */
  modifier onlyProxyOwner() {
    require(msg.sender == proxyOwner());
    _;
  }

  /**
   * @dev Tells the address of the proxy owner
   * @return the address of the proxy owner
   */
  function proxyOwner() public view returns (address) {
    return upgradeabilityOwner();
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to.
   */
  function transferProxyOwnership(address newOwner) public onlyProxyOwner {
    require(newOwner != address(0));
    emit ProxyOwnershipTransferred(proxyOwner(), newOwner);
    setUpgradeabilityOwner(newOwner);
  }

  /**
   * @dev Allows the upgradeability owner to upgrade the current implementation of the proxy.
   * @param implementation representing the address of the new implementation to be set.
   */
  function upgradeTo(address implementation) public onlyProxyOwner {
    _upgradeTo(implementation);
  }

  /**
   * @dev Allows the upgradeability owner to upgrade the current implementation of the proxy
   * and delegatecall the new implementation for initialization.
   * @param implementation representing the address of the new implementation to be set.
   * @param data represents the msg.data to bet sent in the low level call. This parameter may include the function
   * signature of the implementation to be called with the needed payload
   */
  function upgradeToAndCall(address implementation, bytes data) payable public onlyProxyOwner {
    upgradeTo(implementation);
    require(address(this).delegatecall(data));
  }
}

contract OwnableDelegateProxy is OwnedUpgradeabilityProxy {

    constructor(address owner, address initialImplementation, bytes calldata)
        public
    {
        setUpgradeabilityOwner(owner);
        _upgradeTo(initialImplementation);
        require(initialImplementation.delegatecall(calldata));
    }

}




/*
* @title: 1cc global
* @desc: onecc global smart contract
*/
contract OneCCGlobal is ReentrancyGuarded, Ownable{
    
    ERC20 public investToken;
    
    /* User registry. */
    ProxyRegistry public registry;

    /* Token transfer proxy. */
    TokenTransferProxy public tokenTransferProxy;
    
    using SafeMath for uint256;

    struct PlayerDeposit {
        uint256 amount;
        uint256 totalWithdraw;
        uint256 time;
        uint256 period;
        uint256 expire;
    }

    struct Player {
        address referral;
        uint256 token_balance;
        uint256 eth_balance;
        uint256 dividends;
        uint256 day_devidends;
        uint256 referral_bonus;
        uint256 last_payout;
        uint256 total_invested;
        uint256 total_withdrawn;
        uint256 total_referral_bonus;
        PlayerDeposit[] deposits;
        PlayerDeposit crowd;
        uint8 is_shareholder;
        mapping(uint8 => uint256) referrals_per_level;
    }

    address public owner;
    
    
    /* invest contract address and decimal */
    address public invest_token_address = 0x58548c2a07bf1d72104ca1834e945d92a74dcedf;
    uint256 public invest_token_decimal = 18;

    uint8 constant public investment_days = 10;
    uint256 constant public investment_perc = 1800;

    uint256 public total_investors;
    uint256 public total_invested;
    uint256 public total_withdrawn;
    uint256 public total_referral_bonus;
    
    /* Current corwded shareholder number */
    uint256 public total_crowded_num; 
    
    /* Total shareholder join number */
    uint256 constant public total_shareholder_num = 30; 
    
    
    uint256 constant public soft_release = 1615600800;
    uint256 constant public full_release = 1615608000;

    /* Referral bonuses data  define*/
    uint8[] public referral_gens = [1,2,3,4,5,6];
    uint8[] public referral_bonuses = [10,8,6,4,2,1];
    
    
    //loan period and profit parameter define
    uint256[] public invest_period_months =    [1,  2,  3,  6,   12];   //month
    uint256[] public invest_period_day_rates = [30, 35, 40, 45,  50];   //Ten thousand of
    
    // 1cc (10 coin) cny price
    uint8 public invest_10_1cc_cny_price = 65;
    uint8 public invest_reward_eth_rate = 5;   //invest reward eth rate (%)
    
    //invest amount limit define
    uint256 constant public invest_min_amount = 100;
    uint256 constant public invest_max_amount = 10000;

    //user data list define
    mapping(address => Player) public players;

    event Deposit(address indexed addr, uint256 amount, uint256 month);
    event Withdraw(address indexed addr, uint256 amount);
    event WithdrawEth(address indexed addr, uint256 amount);
    event Reinvest(address indexed addr, uint256 amount, uint8 month);
    event ReferralPayout(address indexed addr, uint256 amount, uint8 level);

    
    constructor() public {
        
        owner = msg.sender;
        
        /* Create invest token instace  */
        investToken = ERC20(invest_token_address);  
    }
    
    /**
     * @dev Transfer tokens
     * @param token Token to transfer
     * @param from Address to charge fees
     * @param to Address to receive fees
     * @param amount Amount of protocol tokens to charge
     */
    function transferTokens(address token, address from, address to, uint amount)
        internal
    {
        if (amount > 0) {
            require(tokenTransferProxy.transferFrom(token, from, to, amount));
        }
    }
    
    
    /*
    * desc: user do deposit action
    */
    function deposit(address _referral, uint256 _amount, uint256 _month) 
        external 
        payable 
    {
        
        uint256 token_decimals = 10 ** invest_token_decimal;

        require(uint256(block.timestamp) > soft_release, "Not launched");
        require(_amount >= 1e8, "Zero amount");
        require(_amount >= invest_min_amount, "Minimal deposit: 100 1CC");
        require(_amount <= invest_max_amount, "Maxinum deposit: 10000 1CC");
        
        Player storage player = players[msg.sender];
        require(player.deposits.length < 2000, "Max 2000 deposits per address");

        _setReferral(msg.sender, _referral);
        
        /* get the period total time (total secones) */
        uint256 period_time = _month.mul(30).mul(86400);
        
        player.deposits.push(PlayerDeposit({
            amount: _amount,
            totalWithdraw: 0,
            time: uint256(block.timestamp),
            period: _month,
            expire:uint256(block.timestamp).add(period_time)
        }));

        if(player.total_invested == 0x0){
            total_investors += 1;
        }

        player.total_invested += _amount;
        total_invested += _amount;

        //_referralPayout(msg.sender, _amount);

        //owner.transfer(msg.value.mul(20).div(100));
        
        /* Transfer msg sender user token to contract address */
        uint256 tokenAmount = _amount*token_decimals;
        transferTokens(investToken, msg.sender, address(this), tokenAmount);
        
        emit Deposit(msg.sender, _amount, _month);
    }
    
    /*
    * @desc: user do withdraw action
    */
    function withdraw(uint256 _amount) payable external 
    {
        
        Player storage player = players[msg.sender];

        //_payout(msg.sender);

        require(player.token_balance > 0, "Zero amount");
        require(player.token_balance > _amount, "Insufficient balance in token account");

        //uint256 amount = player.dividends + player.referral_bonus;
        //========== get50Percent
        //uint256 _25Percent = amount.mul(50).div(100);
        //uint256 amountLess25 = amount.sub(_25Percent);
        
        //autoReInvest(_25Percent);
        //player.dividends = 0;
        //player.referral_bonus = 0;
        
        player.token_balance -= _amount;
        
        player.total_withdrawn += _amount;
        total_withdrawn += _amount;

        //msg.sender.transfer(amountLess25);
        
        transferTokens(investToken, address(this), msg.sender, _amount);

        emit Withdraw(msg.sender, _amount);
    }


    /*
    * @desc: user auto reinvest in Withdraw
    */
    function autoReInvest(uint256 _amount,uint256 _month) private {
        Player storage player = players[msg.sender];
        
        /* get the period total time (total secones) */
        uint256 period_time = _month.mul(30).mul(86400);
        
        player.deposits.push(PlayerDeposit({
            amount: _amount,
            totalWithdraw: 0,
            time: uint256(block.timestamp),
            period:_month,
            expire:uint256(block.timestamp).add(period_time)
        }));

        player.total_invested += _amount;
        total_invested += _amount;
    }

    
    /*
    * @desc: update user referral data
    */
    function _setReferral(address _addr, address _referral) private {
        
        /* if user referral is not set */
        if(players[_addr].referral == address(0)) {
            players[_addr].referral = _referral;

            /*
            for(uint8 i = 0; i < referral_bonuses.length; i++) {
                players[_referral].referrals_per_level[i]++;
                _referral = players[_referral].referral;
                if(_referral == address(0)) break;
            }
            */
        }
    }
    
    
    /*
    * @desc: user referral payout 
    */
    function _referralPayout(address _addr, uint256 _amount) private 
    {
        address ref = players[_addr].referral;

        for(uint8 i = 0; i < referral_bonuses.length; i++) {
            if(ref == address(0)) break;
            uint256 bonus = _amount * referral_bonuses[i] / 100;

            if(uint256(block.timestamp) < full_release){
                bonus = bonus * 2;
            }

            players[ref].referral_bonus += bonus;
            players[ref].total_referral_bonus += bonus;
            total_referral_bonus += bonus;

            emit ReferralPayout(ref, bonus, (i+1));
            ref = players[ref].referral;
        }
    }


    function _payout(address _addr) private 
    {
        uint256 payout = this.payoutOf(_addr);

        if(payout > 0) {
            _updateTotalPayout(_addr);
            players[_addr].last_payout = uint256(block.timestamp);
            players[_addr].dividends += payout;
        }
    }

    /*
    * @desc: update user total withdraw data
    */
    function _updateTotalPayout(address _addr) 
        private
    {
        Player storage player = players[_addr];

        for(uint256 i = 0; i < player.deposits.length; i++) {
            PlayerDeposit storage dep = player.deposits[i];

            uint256 time_end = dep.time + investment_days * 86400;
            uint256 from = player.last_payout > dep.time ? player.last_payout : dep.time;
            uint256 to = block.timestamp > time_end ? time_end : uint256(block.timestamp);

            if(from < to) {
                player.deposits[i].totalWithdraw += dep.amount * (to - from) * investment_perc / investment_days / 8640000;
            }
        }
    }
    
    /*
    * @desc: get day deposit profit
    */
    function payoutOf(address _addr) 
        view 
        external 
        returns(uint256 value) 
    {
        Player storage player = players[_addr];

        for(uint256 i = 0; i < player.deposits.length; i++) {
            PlayerDeposit storage dep = player.deposits[i];

            uint256 time_end = dep.time + investment_days * 86400;
            uint256 from = player.last_payout > dep.time ? player.last_payout : dep.time;
            uint256 to = block.timestamp > time_end ? time_end : uint256(block.timestamp);

            if(from < to) {
                value += dep.amount * (to - from) * investment_perc / investment_days / 8640000;
            }
        }

        return value;
    }

    /*
    * @desc: get contract data info 
    */
    function contractInfo() 
        view 
        external 
        returns(uint256 _total_invested, uint256 _total_investors, uint256 _total_withdrawn, uint256 _total_referral_bonus) 
    {
        return (total_invested, total_investors, total_withdrawn, total_referral_bonus);
    }
    
    /*
    * @desc: get user info
    */
    function userInfo(address _addr) 
        view 
        external 
        returns(uint256 for_withdraw, uint256 withdrawable_referral_bonus, uint256 total_deposits, uint256 withdrawn, uint256 referral_bonus, uint256[8] memory referrals) 
    {
        Player storage player = players[_addr];
        uint256 payout = this.payoutOf(_addr);

        for(uint8 i = 0; i < referral_bonuses.length; i++) {
            referrals[i] = player.referrals_per_level[i];
        }
        return (
            payout + player.dividends + player.referral_bonus,
            player.referral_bonus,
            player.total_invested,
            player.total_withdrawn,
            player.total_referral_bonus,
            referrals
        );
    }
    
    /*
    * @desc: get user investment list
    */
    function investmentsInfo(address _addr) 
        view 
        external 
        returns(uint256[] memory times, uint256[] memory amounts, uint256[] memory totalWithdraws,uint256[] memory endTimes) 
    {
        Player storage player = players[_addr];
        uint256[] memory _times = new uint256[](player.deposits.length);
        uint256[] memory _endTimes = new uint256[](player.deposits.length);
        uint256[] memory _amounts = new uint256[](player.deposits.length);
        uint256[] memory _totalWithdraws = new uint256[](player.deposits.length);

        for(uint256 i = 0; i < player.deposits.length; i++) {
          PlayerDeposit storage dep = player.deposits[i];

          _amounts[i] = dep.amount;
          _totalWithdraws[i] = dep.totalWithdraw;
          _times[i] = dep.time + investment_days * 86400;
          _endTimes[i] = dep.expire;
        }
        return (
          _times,
          _amounts,
          _totalWithdraws,
           _endTimes
        );
    }
}

Contract ABI

[{"constant":true,"inputs":[],"name":"total_crowded_num","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenTransferProxy","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_referral","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_month","type":"uint256"}],"name":"deposit","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"contractInfo","outputs":[{"name":"_total_invested","type":"uint256"},{"name":"_total_investors","type":"uint256"},{"name":"_total_withdrawn","type":"uint256"},{"name":"_total_referral_bonus","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"userInfo","outputs":[{"name":"for_withdraw","type":"uint256"},{"name":"withdrawable_referral_bonus","type":"uint256"},{"name":"total_deposits","type":"uint256"},{"name":"withdrawn","type":"uint256"},{"name":"referral_bonus","type":"uint256"},{"name":"referrals","type":"uint256[8]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"referral_gens","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"invest_10_1cc_cny_price","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"soft_release","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"total_withdrawn","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"total_shareholder_num","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"investment_perc","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"total_invested","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"investmentsInfo","outputs":[{"name":"times","type":"uint256[]"},{"name":"amounts","type":"uint256[]"},{"name":"totalWithdraws","type":"uint256[]"},{"name":"endTimes","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"payoutOf","outputs":[{"name":"value","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"invest_token_address","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"invest_reward_eth_rate","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"invest_period_day_rates","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"registry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"total_referral_bonus","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"investment_days","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"full_release","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"invest_period_months","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"invest_max_amount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"total_investors","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"invest_min_amount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"investToken","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"referral_bonuses","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"players","outputs":[{"name":"referral","type":"address"},{"name":"token_balance","type":"uint256"},{"name":"eth_balance","type":"uint256"},{"name":"dividends","type":"uint256"},{"name":"day_devidends","type":"uint256"},{"name":"referral_bonus","type":"uint256"},{"name":"last_payout","type":"uint256"},{"name":"total_invested","type":"uint256"},{"name":"total_withdrawn","type":"uint256"},{"name":"total_referral_bonus","type":"uint256"},{"components":[{"name":"amount","type":"uint256"},{"name":"totalWithdraw","type":"uint256"},{"name":"time","type":"uint256"},{"name":"period","type":"uint256"},{"name":"expire","type":"uint256"}],"name":"crowd","type":"tuple"},{"name":"is_shareholder","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"invest_token_decimal","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addr","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"month","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addr","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addr","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"WithdrawEth","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addr","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"month","type":"uint8"}],"name":"Reinvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addr","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"level","type":"uint8"}],"name":"ReferralPayout","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

608060405260008060006101000a81548160ff0219169083151502179055507358548c2a07bf1d72104ca1834e945d92a74dcedf600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601260065560c060405190810160405280600160ff168152602001600260ff168152602001600360ff168152602001600460ff168152602001600560ff168152602001600660ff16815250600c906006620000d0929190620002f9565b5060c060405190810160405280600a60ff168152602001600860ff168152602001600660ff168152602001600460ff168152602001600260ff168152602001600160ff16815250600d90600662000129929190620002f9565b5060a060405190810160405280600160ff168152602001600260ff168152602001600360ff168152602001600660ff168152602001600c60ff16815250600e90600562000178929190620003a7565b5060a060405190810160405280601e60ff168152602001602360ff168152602001602860ff168152602001602d60ff168152602001603260ff16815250600f906005620001c7929190620003a7565b506041601060006101000a81548160ff021916908360ff1602179055506005601060016101000a81548160ff021916908360ff1602179055503480156200020d57600080fd5b5033600060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000459565b82805482825590600052602060002090601f01602090048101928215620003945791602002820160005b838211156200036357835183826101000a81548160ff021916908360ff160217905550926020019260010160208160000104928301926001030262000323565b8015620003925782816101000a81549060ff021916905560010160208160000104928301926001030262000363565b505b509050620003a39190620003fe565b5090565b828054828255906000526020600020908101928215620003eb579160200282015b82811115620003ea578251829060ff16905591602001919060010190620003c8565b5b509050620003fa919062000431565b5090565b6200042e91905b808211156200042a57600081816101000a81549060ff02191690555060010162000405565b5090565b90565b6200045691905b808211156200045257600081600090555060010162000438565b5090565b90565b611f2280620004696000396000f3006080604052600436106101a1576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806307e7dcab146101a65780630eefdbad146101d15780630efe6a8b1461022857806315c43aaf146102725780631959a002146102b257806322a20858146103545780632e1a7d4d1461039b5780632f60ecbc146103bb5780632fe9ce78146103ec57806343bfdd5d14610417578063512d0f4d14610442578063542139831461046d5780635f45527b146104985780636b59d0d0146104c35780636da61d1e14610633578063715018a61461068a57806374a172fc146106a1578063785a5351146106f857806379aa965e146107295780637b1039991461076a57806388d2786c146107c1578063890e5f8c146107ec5780638da5cb5b1461081d5780638ddfb250146108745780639f6de7271461089f578063a39abbcf146108e0578063a6b165ee1461090b578063b0c70e6014610936578063badf822b14610961578063c0c9a4a0146109b8578063e2eb41ff146109ff578063ee64db3814610ad5578063f2fde38b14610b00575b600080fd5b3480156101b257600080fd5b506101bb610b43565b6040518082815260200191505060405180910390f35b3480156101dd57600080fd5b506101e6610b49565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610270600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050610b6f565b005b34801561027e57600080fd5b50610287610fcf565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b3480156102be57600080fd5b506102f3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610fef565b6040518087815260200186815260200185815260200184815260200183815260200182600860200280838360005b8381101561033c578082015181840152602081019050610321565b50505050905001965050505050505060405180910390f35b34801561036057600080fd5b5061037f600480360381019080803590602001909291905050506111af565b604051808260ff1660ff16815260200191505060405180910390f35b6103b9600480360381019080803590602001909291905050506111e2565b005b3480156103c757600080fd5b506103d06113f6565b604051808260ff1660ff16815260200191505060405180910390f35b3480156103f857600080fd5b50610401611409565b6040518082815260200191505060405180910390f35b34801561042357600080fd5b5061042c611411565b6040518082815260200191505060405180910390f35b34801561044e57600080fd5b50610457611417565b6040518082815260200191505060405180910390f35b34801561047957600080fd5b5061048261141c565b6040518082815260200191505060405180910390f35b3480156104a457600080fd5b506104ad611422565b6040518082815260200191505060405180910390f35b3480156104cf57600080fd5b50610504600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611428565b6040518080602001806020018060200180602001858103855289818151815260200191508051906020019060200280838360005b83811015610553578082015181840152602081019050610538565b50505050905001858103845288818151815260200191508051906020019060200280838360005b8381101561059557808201518184015260208101905061057a565b50505050905001858103835287818151815260200191508051906020019060200280838360005b838110156105d75780820151818401526020810190506105bc565b50505050905001858103825286818151815260200191508051906020019060200280838360005b838110156106195780820151818401526020810190506105fe565b505050509050019850505050505050505060405180910390f35b34801561063f57600080fd5b50610674600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061164e565b6040518082815260200191505060405180910390f35b34801561069657600080fd5b5061069f61176a565b005b3480156106ad57600080fd5b506106b661186e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561070457600080fd5b5061070d611894565b604051808260ff1660ff16815260200191505060405180910390f35b34801561073557600080fd5b50610754600480360381019080803590602001909291905050506118a7565b6040518082815260200191505060405180910390f35b34801561077657600080fd5b5061077f6118ca565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107cd57600080fd5b506107d66118f0565b6040518082815260200191505060405180910390f35b3480156107f857600080fd5b506108016118f6565b604051808260ff1660ff16815260200191505060405180910390f35b34801561082957600080fd5b506108326118fb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561088057600080fd5b50610889611921565b6040518082815260200191505060405180910390f35b3480156108ab57600080fd5b506108ca60048036038101908080359060200190929190505050611929565b6040518082815260200191505060405180910390f35b3480156108ec57600080fd5b506108f561194c565b6040518082815260200191505060405180910390f35b34801561091757600080fd5b50610920611952565b6040518082815260200191505060405180910390f35b34801561094257600080fd5b5061094b611958565b6040518082815260200191505060405180910390f35b34801561096d57600080fd5b5061097661195d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156109c457600080fd5b506109e360048036038101908080359060200190929190505050611983565b604051808260ff1660ff16815260200191505060405180910390f35b348015610a0b57600080fd5b50610a40600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119b6565b604051808d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018c81526020018b81526020018a81526020018981526020018881526020018781526020018681526020018581526020018481526020018381526020018260ff1660ff1681526020019c5050505050505050505050505060405180910390f35b348015610ae157600080fd5b50610aea611a80565b6040518082815260200191505060405180910390f35b348015610b0c57600080fd5b50610b41600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a86565b005b600b5481565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600654600a0a935063604c1ca042111515610bf8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4e6f74206c61756e63686564000000000000000000000000000000000000000081525060200191505060405180910390fd5b6305f5e1008610151515610c74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f5a65726f20616d6f756e7400000000000000000000000000000000000000000081525060200191505060405180910390fd5b60648610151515610ced576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4d696e696d616c206465706f7369743a2031303020314343000000000000000081525060200191505060405180910390fd5b6127108611151515610d67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4d6178696e756d206465706f7369743a2031303030302031434300000000000081525060200191505060405180910390fd5b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002092506107d083600a0180549050101515610e28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4d61782032303030206465706f7369747320706572206164647265737300000081525060200191505060405180910390fd5b610e323388611bde565b610e5b62015180610e4d601e88611cfb90919063ffffffff16565b611cfb90919063ffffffff16565b915082600a0160a06040519081016040528088815260200160008152602001428152602001878152602001610e998542611d3390919063ffffffff16565b815250908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000015560208201518160010155604082015181600201556060820151816003015560808201518160040155505050600083600701541415610f1b5760016007600082825401925050819055505b858360070160008282540192505081905550856008600082825401925050819055508386029050610f70600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16333084611d4f565b3373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a158787604051808381526020018281526020019250505060405180910390a250505050505050565b600080600080600854600754600954600a54935093509350935090919293565b6000806000806000610fff611ed2565b6000806000601160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002092503073ffffffffffffffffffffffffffffffffffffffff16636da61d1e8b6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156110e057600080fd5b505af11580156110f4573d6000803e3d6000fd5b505050506040513d602081101561110a57600080fd5b81019080805190602001909291905050509150600090505b600d805490508160ff161015611175578260110160008260ff1660ff16815260200190815260200160002054848260ff1660088110151561115f57fe5b6020020181815250508080600101915050611122565b8260050154836003015483010183600501548460070154856008015486600901548898509850985098509850985050505091939550919395565b600c818154811015156111be57fe5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600101541115156112a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f5a65726f20616d6f756e7400000000000000000000000000000000000000000081525060200191505060405180910390fd5b818160010154111515611342576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001807f496e73756666696369656e742062616c616e636520696e20746f6b656e20616381526020017f636f756e7400000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b818160010160008282540392505081905550818160080160008282540192505081905550816009600082825401925050819055506113a4600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16303385611d4f565b3373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364836040518082815260200191505060405180910390a25050565b601060009054906101000a900460ff1681565b63604c1ca081565b60095481565b601e81565b61070881565b60085481565b6060806060806000606080606080600080601160008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020965086600a01805490506040519080825280602002602001820160405280156114b05781602001602082028038833980820191505090505b50955086600a01805490506040519080825280602002602001820160405280156114e95781602001602082028038833980820191505090505b50945086600a01805490506040519080825280602002602001820160405280156115225781602001602082028038833980820191505090505b50935086600a018054905060405190808252806020026020018201604052801561155b5781602001602082028038833980820191505090505b509250600091505b86600a01805490508210156116345786600a018281548110151561158357fe5b90600052602060002090600502019050806000015484838151811015156115a657fe5b9060200190602002018181525050806001015483838151811015156115c757fe5b906020019060200201818152505062015180600a60ff160262ffffff1681600201540186838151811015156115f857fe5b90602001906020020181815250508060040154858381518110151561161957fe5b90602001906020020181815250508180600101925050611563565b858484879a509a509a509a50505050505050509193509193565b6000806000806000806000601160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209550600094505b85600a018054905085101561175c5785600a01858154811015156116bf57fe5b9060005260206000209060050201935062015180600a60ff160262ffffff16846002015401925083600201548660060154116116ff578360020154611705565b85600601545b91508242116117145742611716565b825b90508082101561174f576283d600600a60ff166107088484038760000154020281151561173f57fe5b0481151561174957fe5b04870196505b848060010195505061169f565b869650505050505050919050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156117c657600080fd5b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a260008060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601060019054906101000a900460ff1681565b600f818154811015156118b657fe5b906000526020600020016000915090505481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b600a81565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b63604c38c081565b600e8181548110151561193857fe5b906000526020600020016000915090505481565b61271081565b60075481565b606481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d8181548110151561199257fe5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b60116020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201549080600301549080600401549080600501549080600601549080600701549080600801549080600901549080600b0160a0604051908101604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050908060100160009054906101000a900460ff1690508c565b60065481565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ae257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611b1e57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600073ffffffffffffffffffffffffffffffffffffffff16601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611cf75780601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5050565b600080831415611d0e5760009050611d2d565b8183029050818382811515611d1f57fe5b04141515611d2957fe5b8090505b92915050565b60008183019050828110151515611d4657fe5b80905092915050565b6000811115611ecc57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea858585856040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b158015611e8557600080fd5b505af1158015611e99573d6000803e3d6000fd5b505050506040513d6020811015611eaf57600080fd5b81019080805190602001909291905050501515611ecb57600080fd5b5b50505050565b610100604051908101604052806008906020820280388339808201915050905050905600a165627a7a723058208399dd813ed0ce3c904d9ebb3ff72a95fbdd1102a0540c50480b7ef8a05e658f0029

Deployed ByteCode Sourcemap

24712:12346:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26198:32;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26198:32:0;;;;;;;;;;;;;;;;;;;;;;;24909:44;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24909:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;28306:1609;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34875:288;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34875:288:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35219:753;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35219:753:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;35219:753:0;;;;;;;;;;;;;;;;;;;;;26509:44;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26509:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29981:978;;;;;;;;;;;;;;;;;;;;;;;;;;26884:41;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26884:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;26355:49;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26355:49:0;;;;;;;;;;;;;;;;;;;;;;;26067:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26067:30:0;;;;;;;;;;;;;;;;;;;;;;;26285:50;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26285:50:0;;;;;;;;;;;;;;;;;;;;;;;25939:46;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25939:46:0;;;;;;;;;;;;;;;;;;;;;;;26031:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26031:29:0;;;;;;;;;;;;;;;;;;;;;;;36039:1016;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36039:1016:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;36039:1016:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;36039:1016:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;36039:1016:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;36039:1016:0;;;;;;;;;;;;;;;;;;;;;;;34091:722;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34091:722:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2073:114;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2073:114:0;;;;;;25754:80;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25754:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;26932:39;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26932:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;26755:64;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26755:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24838:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24838:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;26104:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26104:35:0;;;;;;;;;;;;;;;;;;;;;;;25890:42;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25890:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;25668:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25668:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;26411:49;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26411:49:0;;;;;;;;;;;;;;;;;;;;;;;26674:64;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26674:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27103:49;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27103:49:0;;;;;;;;;;;;;;;;;;;;;;;25994:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25994:30:0;;;;;;;;;;;;;;;;;;;;;;;27049:47;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27049:47:0;;;;;;;;;;;;;;;;;;;;;;;24775:24;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24775:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;26560:48;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26560:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27190:41;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27190:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25841:40;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25841:40:0;;;;;;;;;;;;;;;;;;;;;;;1800:178;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1800:178:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26198:32;;;;:::o;24909:44::-;;;;;;;;;;;;;:::o;28306:1609::-;28439:22;28791:21;29042:19;29723;28470:20;;28464:2;:26;28439:51;;26394:10;28519:15;28511:39;28503:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28597:3;28586:7;:14;;28578:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27093:3;28635:7;:28;;28627:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27147:5;28711:7;:28;;28703:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28815:7;:19;28823:10;28815:19;;;;;;;;;;;;;;;28791:43;;28878:4;28853:6;:15;;:22;;;;:29;28845:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28929:35;28942:10;28954:9;28929:12;:35::i;:::-;29064:25;29083:5;29064:14;29075:2;29064:6;:10;;:14;;;;:::i;:::-;:18;;:25;;;;:::i;:::-;29042:47;;29110:6;:15;;29131:224;;;;;;;;;29168:7;29131:224;;;;29205:1;29131:224;;;;29235:15;29131:224;;;;29274:6;29131:224;;;;29302:41;29331:11;29310:15;29302:28;;:41;;;;:::i;:::-;29131:224;;;29110:246;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;29110:246:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29397:3;29372:6;:21;;;:28;29369:79;;;29435:1;29416:15;;:20;;;;;;;;;;;29369:79;29485:7;29460:6;:21;;;:32;;;;;;;;;;;29521:7;29503:14;;:25;;;;;;;;;;;29753:14;29745:7;:22;29723:44;;29778:67;29793:11;;;;;;;;;;;29806:10;29826:4;29833:11;29778:14;:67::i;:::-;29879:10;29871:36;;;29891:7;29900:6;29871:36;;;;;;;;;;;;;;;;;;;;;;;;28306:1609;;;;;;;:::o;34875:288::-;34951:23;34976:24;35002;35028:29;35084:14;;35100:15;;35117;;35134:20;;35076:79;;;;;;;;34875:288;;;;:::o;35219:753::-;35304:20;35326:35;35363:22;35387:17;35406:22;35430:27;;:::i;:::-;35476:21;35525:14;35579:7;35500;:14;35508:5;35500:14;;;;;;;;;;;;;;;35476:38;;35542:4;:13;;;35556:5;35542:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35542:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35542:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35542:20:0;;;;;;;;;;;;;;;;35525:37;;35589:1;35579:11;;35575:122;35596:16;:23;;;;35592:1;:27;;;35575:122;;;35656:6;:26;;:29;35683:1;35656:29;;;;;;;;;;;;;;;;35641:9;35651:1;35641:12;;;;;;;;;;;;;;:44;;;;;35621:3;;;;;;;35575:122;;;35757:6;:21;;;35738:6;:16;;;35729:6;:25;:49;35793:6;:21;;;35829:6;:21;;;35865:6;:22;;;35902:6;:27;;;35944:9;35707:257;;;;;;;;;;;;35219:753;;;;;;;;;;:::o;26509:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29981:978::-;30060:21;30084:7;:19;30092:10;30084:19;;;;;;;;;;;;;;;30060:43;;30181:1;30158:6;:20;;;:24;30150:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30240:7;30217:6;:20;;;:30;30209:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30674:7;30650:6;:20;;;:31;;;;;;;;;;;30728:7;30702:6;:22;;;:33;;;;;;;;;;;30765:7;30746:15;;:26;;;;;;;;;;;30841:63;30856:11;;;;;;;;;;;30877:4;30884:10;30896:7;30841:14;:63::i;:::-;30931:10;30922:29;;;30943:7;30922:29;;;;;;;;;;;;;;;;;;29981:978;;:::o;26884:41::-;;;;;;;;;;;;;:::o;26355:49::-;26394:10;26355:49;:::o;26067:30::-;;;;:::o;26285:50::-;26333:2;26285:50;:::o;25939:46::-;25981:4;25939:46;:::o;26031:29::-;;;;:::o;36039:1016::-;36131:22;36155:24;36181:31;36213:25;36257:21;36306:23;36380:26;36457:25;36533:32;36622:9;36683:25;36281:7;:14;36289:5;36281:14;;;;;;;;;;;;;;;36257:38;;36346:6;:15;;:22;;;;36332:37;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;36332:37:0;;;;36306:63;;36423:6;:15;;:22;;;;36409:37;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;36409:37:0;;;;36380:66;;36499:6;:15;;:22;;;;36485:37;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;36485:37:0;;;;36457:65;;36582:6;:15;;:22;;;;36568:37;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;36568:37:0;;;;36533:72;;36634:1;36622:13;;36618:310;36641:6;:15;;:22;;;;36637:1;:26;36618:310;;;36711:6;:15;;36727:1;36711:18;;;;;;;;;;;;;;;;;;;;36683:46;;36758:3;:10;;;36744:8;36753:1;36744:11;;;;;;;;;;;;;;;;;:24;;;;;36802:3;:17;;;36781:15;36797:1;36781:18;;;;;;;;;;;;;;;;;:38;;;;;36873:5;25930:2;36855:23;;;36844:34;;:3;:8;;;:34;36832:6;36839:1;36832:9;;;;;;;;;;;;;;;;;:46;;;;;36906:3;:10;;;36891:9;36901:1;36891:12;;;;;;;;;;;;;;;;;:25;;;;;36665:3;;;;;;;36618:310;;;36958:6;36977:8;36998:15;37027:9;36938:109;;;;;;;;36039:1016;;;;;;;;;;;;:::o;34091:722::-;34176:13;34208:21;34263:9;34326:25;34389:16;34457:12;34548:10;34232:7;:14;34240:5;34232:14;;;;;;;;;;;;;;;34208:38;;34275:1;34263:13;;34259:522;34282:6;:15;;:22;;;;34278:1;:26;34259:522;;;34354:6;:15;;34370:1;34354:18;;;;;;;;;;;;;;;;;;;;34326:46;;34437:5;25930:2;34419:23;;;34408:34;;:3;:8;;;:34;34389:53;;34493:3;:8;;;34472:6;:18;;;:29;:61;;34525:3;:8;;;34472:61;;;34504:6;:18;;;34472:61;34457:76;;34579:8;34561:15;:26;:64;;34609:15;34561:64;;;34590:8;34561:64;34548:77;;34652:2;34645:4;:9;34642:128;;;34747:7;25930:2;34684:60;;25981:4;34703;34698:2;:9;34684:3;:10;;;:24;:42;:60;;;;;;;;:70;;;;;;;;34675:79;;;;34642:128;34306:3;;;;;;;34259:522;;;34800:5;34793:12;;34091:722;;;;;;;;;:::o;2073:114::-;1613:5;;;;;;;;;;;1599:19;;:10;:19;;;1591:28;;;;;;;;2150:5;;;;;;;;;;;2131:25;;;;;;;;;;;;2179:1;2163:5;;:18;;;;;;;;;;;;;;;;;;2073:114::o;25754:80::-;;;;;;;;;;;;;:::o;26932:39::-;;;;;;;;;;;;;:::o;26755:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24838:29::-;;;;;;;;;;;;;:::o;26104:35::-;;;;:::o;25890:42::-;25930:2;25890:42;:::o;25668:20::-;;;;;;;;;;;;;:::o;26411:49::-;26450:10;26411:49;:::o;26674:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27103:49::-;27147:5;27103:49;:::o;25994:30::-;;;;:::o;27049:47::-;27093:3;27049:47;:::o;24775:24::-;;;;;;;;;;;;;:::o;26560:48::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27190:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25841:40::-;;;;:::o;1800:178::-;1613:5;;;;;;;;;;;1599:19;;:10;:19;;;1591:28;;;;;;;;1897:1;1877:22;;:8;:22;;;;1869:31;;;;;;;;1940:8;1912:37;;1933:5;;;;;;;;;;;1912:37;;;;;;;;;;;;1964:8;1956:5;;:16;;;;;;;;;;;;;;;;;;1800:178;:::o;31696:526::-;31862:1;31827:37;;:7;:14;31835:5;31827:14;;;;;;;;;;;;;;;:23;;;;;;;;;;;;:37;;;31824:391;;;31907:9;31881:7;:14;31889:5;31881:14;;;;;;;;;;;;;;;:23;;;:35;;;;;;;;;;;;;;;;;;31824:391;31696:526;;:::o;119:174::-;177:9;204:1;199;:6;195:37;;;223:1;216:8;;;;195:37;246:1;242;:5;238:9;;270:1;265;261;:5;;;;;;;;:10;254:18;;;;;;286:1;279:8;;119:174;;;;;:::o;954:127::-;1012:9;1038:1;1034;:5;1030:9;;1058:1;1053;:6;;1046:14;;;;;;1074:1;1067:8;;954:127;;;;:::o;28009:227::-;28134:1;28125:6;:10;28121:108;;;28160:18;;;;;;;;;;;:31;;;28192:5;28199:4;28205:2;28209:6;28160:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28160:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28160:56:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28160:56:0;;;;;;;;;;;;;;;;28152:65;;;;;;;;28121:108;28009:227;;;;:::o;24712:12346::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;24712:12346:0;;;;:::o

Swarm Source

bzzr://8399dd813ed0ce3c904d9ebb3ff72a95fbdd1102a0540c50480b7ef8a05e658f
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading

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.