ETH Price: $3,344.35 (-4.09%)

Contract

0x4746b30E21BE31AA65a31AdfB1Ad476f4F9639c1
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Claim Tokens201201512024-06-18 17:32:35190 days ago1718731955IN
0x4746b30E...f4F9639c1
0 ETH0.0011150811.85895381
Claim Tokens201201502024-06-18 17:32:23190 days ago1718731943IN
0x4746b30E...f4F9639c1
0 ETH0.0012727111.07963829
Claim Tokens200233622024-06-05 4:53:23204 days ago1717563203IN
0x4746b30E...f4F9639c1
0 ETH0.000816525.47748596
Claim Tokens195534482024-03-31 11:01:35269 days ago1711882895IN
0x4746b30E...f4F9639c1
0 ETH0.0024346919.93247185
Claim Tokens182905982023-10-06 9:34:11446 days ago1696584851IN
0x4746b30E...f4F9639c1
0 ETH0.001232979.34281197
Claim Tokens182905722023-10-06 9:28:47446 days ago1696584527IN
0x4746b30E...f4F9639c1
0 ETH0.000196058.10184527
Claim Tokens178464282023-08-05 4:37:11509 days ago1691210231IN
0x4746b30E...f4F9639c1
0 ETH0.0018247714.66544995
Claim Tokens178338632023-08-03 10:26:11510 days ago1691058371IN
0x4746b30E...f4F9639c1
0 ETH0.0016742113.70656883
Claim Tokens177373522023-07-20 22:28:11524 days ago1689892091IN
0x4746b30E...f4F9639c1
0 ETH0.0045077132.3720667
Claim Tokens177327652023-07-20 7:02:35525 days ago1689836555IN
0x4746b30E...f4F9639c1
0 ETH0.0025517920.90970874
Claim Tokens170525542023-04-15 12:57:11620 days ago1681563431IN
0x4746b30E...f4F9639c1
0 ETH0.0031057723.53393339
Claim Tokens168405782023-03-16 13:03:23650 days ago1678971803IN
0x4746b30E...f4F9639c1
0 ETH0.0033670824.18274238
Claim Tokens168405432023-03-16 12:56:23650 days ago1678971383IN
0x4746b30E...f4F9639c1
0 ETH0.0032543723.37328539
Claim Tokens168245962023-03-14 7:06:59653 days ago1678777619IN
0x4746b30E...f4F9639c1
0 ETH0.0023310617.6652402
Claim Tokens168123632023-03-12 13:52:47654 days ago1678629167IN
0x4746b30E...f4F9639c1
0 ETH0.0022585919.66419828
Claim Tokens166685482023-02-20 8:23:47675 days ago1676881427IN
0x4746b30E...f4F9639c1
0 ETH0.0035310625.36044624
Claim Tokens166067392023-02-11 16:33:47683 days ago1676133227IN
0x4746b30E...f4F9639c1
0 ETH0.0055795155.92933277
Claim Tokens165922882023-02-09 16:07:59685 days ago1675958879IN
0x4746b30E...f4F9639c1
0 ETH0.0057720147.25
Claim Tokens165250182023-01-31 6:28:47695 days ago1675146527IN
0x4746b30E...f4F9639c1
0 ETH0.0016734913.72642766
Claim Tokens162157522022-12-19 2:28:11738 days ago1671416891IN
0x4746b30E...f4F9639c1
0 ETH0.001361111.87147939
Claim Tokens161920202022-12-15 18:55:47741 days ago1671130547IN
0x4746b30E...f4F9639c1
0 ETH0.0028429628.55675529
Claim Tokens161920132022-12-15 18:54:23741 days ago1671130463IN
0x4746b30E...f4F9639c1
0 ETH0.0029266629.40103232
Claim Tokens161920072022-12-15 18:53:11741 days ago1671130391IN
0x4746b30E...f4F9639c1
0 ETH0.0028663328.79151252
Claim Tokens161697392022-12-12 16:12:47744 days ago1670861567IN
0x4746b30E...f4F9639c1
0 ETH0.003385625.69664069
Claim Tokens161316702022-12-07 8:32:11750 days ago1670401931IN
0x4746b30E...f4F9639c1
0 ETH0.0023474316.88293557
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
LockerByBlock

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 1 of 6: LockerByBlock.sol
// SPDX-License-Identifier: MIT
// Platinum Software Dev Team
// Locker  Beta  version.

pragma solidity ^0.8.4;

import "./Locker.sol";

contract LockerByBlock is Locker {

    function _getAvailableAmountByLockIndex(uint256 _lockIndex) 
        internal 
        view
        override  
        returns(uint256)
    {
        VestingRecord[] memory v = lockerStorage[_lockIndex].vestings;
        uint256 res = 0;
        for (uint256 i = 0; i < v.length; i ++ ) {
            if  (v[i].unlockTime <= block.number && !v[i].isNFT) {
                res += v[i].amountUnlock;
            }
        }
        return res;
    }

}

File 2 of 6: Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 3 of 6: IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 4 of 6: Locker.sol
// SPDX-License-Identifier: MIT
// Platinum Software Dev Team
// Locker  Beta  version.

pragma solidity ^0.8.4;

import "./IERC20.sol";
import "./SafeERC20.sol";
import "./LockerTypes.sol";

contract Locker is LockerTypes {
    using SafeERC20 for IERC20;

    string  constant public name = "Lock & Registry v0.0.3";


    /**
     * @dev Then more records in VestingRecord array then more gas will spend
     * in  `lockTokens` method  and in every getter call_getAvailableAmountByLockIndex.
     * So in some case it can revert After test we decide use yhis value. But it
     * is not up limit and you can try more
     */
    uint256 constant public MAX_VESTING_RECORDS_PER_LOCK  = 21;
    /**
     * @dev Then more records in _beneficiaries then more gas will spend
     * in  `lockTokens` method. After test we decide use yhis value. But it
     * is not up limit and you can try more
     */    
    uint256 constant public MAX_BENEFICIARIES_PER_LOCK    = 160;
    uint256 constant public MAX_LOCkS_PER_BENEFICIARY    = 1000;

    /**
     * @dev Then more TOTAL_IN_PERCENT then more precision.
     * but be attention with _beneficiariesShares array
     * accordingly this value
     */
    uint256 constant public TOTAL_IN_PERCENT = 1e13;
    LockStorageRecord[] lockerStorage;

    //map from users(investors)  to locked shares
    mapping(address => RegistryShare[])  public registry;

    //map from lockIndex to beneficiaries list
    mapping(uint256 => address[]) beneficiariesInLock;

    
    event NewLock(address indexed erc20, address indexed who, uint256 lockedAmount, uint256 lockId);
    
    /**
     * @dev Any who have token balance > 0 can lock  it here.
     *
     * Emits a NewLock event.
     *
     * Requirements:
     *
     * - `_ERC20` token contract address for lock.
     * - `_amount` amount of tokens to be locked.
     * - `_unlockedFrom` array of unlock dates in unixtime format.
     * - `_unlockAmount` array of unlock amounts.
     * - `_beneficiaries` array of address for beneficiaries.
     * - `_beneficiariesShares` array of beneficiaries shares, in % but 
     * - scaled on TOTAL_IN_PERCENT/100. So 20% = 2000 if TOTAL_IN_PERCENT=10000, 0.1% = 10 and etc.
     * Caller must approve _ERC20 tokens to this contract address before lock
     */
    function lockTokens(
        address _ERC20, 
        uint256 _amount, 
        uint256[] memory _unlockedFrom, 
        uint256[] memory _unlockAmount,
        address[] memory _beneficiaries,
        uint256[] memory _beneficiariesShares

    )
        external 

    {
        require(_amount > 0, "Cant lock 0 amount");
        require(IERC20(_ERC20).allowance(msg.sender, address(this)) >= _amount, "Please approve first");
        require(_getArraySum(_unlockAmount) == _amount, "Sum vesting records must be equal lock amount");
        require(_unlockedFrom.length == _unlockAmount.length, "Length of periods and amounts arrays must be equal");
        require(_beneficiaries.length == _beneficiariesShares.length, "Length of beneficiaries and shares arrays must be equal");
        require(_getArraySum(_beneficiariesShares) == TOTAL_IN_PERCENT, "Sum of shares array must be equal to 100%");
        require(_beneficiaries.length < MAX_BENEFICIARIES_PER_LOCK,   "MAX_BENEFICIARIES_PER_LOCK LIMIT");
        require(_unlockedFrom.length  < MAX_VESTING_RECORDS_PER_LOCK, "MAX_VESTING_RECORDS_PER_LOCK LIMIT");

        //Lets prepare vestings array
        VestingRecord[] memory v = new VestingRecord[](_unlockedFrom.length);
        for (uint256 i = 0; i < _unlockedFrom.length; i ++ ) {
                v[i].unlockTime = _unlockedFrom[i];
                v[i].amountUnlock = _unlockAmount[i]; 
        }
        
        //Save lock info in storage
        LockStorageRecord storage lock = lockerStorage.push();
        lock.ltype = LockType.ERC20;
        lock.token = _ERC20;
        lock.amount = _amount;


        //Copying of type struct LockerTypes.VestingRecord memory[] memory 
        //to storage not yet supported.
        //so we need this cycle
        for (uint256 i = 0; i < _unlockedFrom.length; i ++ ) {
            lock.vestings.push(v[i]);    
        }

        //Lets save _beneficiaries for this lock
        for (uint256 i = 0; i < _beneficiaries.length; i ++ ) {
            require(_beneficiaries[i] != address(0), 'Cant add zero address');
            require(_beneficiaries[i] != address(this), 'Bad idea');
            RegistryShare[] storage shares = registry[_beneficiaries[i]];
            require(
                shares.length <= MAX_LOCkS_PER_BENEFICIARY, 
                'MAX_LOCkS_PER_BENEFICIARY LIMIT'
            );
            shares.push(RegistryShare({
                lockIndex: lockerStorage.length - 1,
                sharePercent: _beneficiariesShares[i],
                claimedAmount: 0
            }));
            //Save beneficaries in one map for use in child conatrcts
            beneficiariesInLock[lockerStorage.length - 1].push(_beneficiaries[i]);
        }

        
        IERC20 token = IERC20(_ERC20);
        token.safeTransferFrom(msg.sender, address(this), _amount);
        emit NewLock(_ERC20, msg.sender, _amount, lockerStorage.length - 1);

    }

    /**
     * @dev Any _beneficiaries can claim their tokens after vesting lock time is expired.
     *
     * Requirements:
     *
     * - `_lockIndex` array index, number of lock record in  storage. For one project lock case = 0
     * - `_desiredAmount` amount of tokens to be unlocked. Only after vesting lock time is expired
     * - If now date less then vesting lock time tx will be revert
     */
    function claimTokens(uint256 _lockIndex, uint256 _desiredAmount) external {
        //Lets get our lockRecord by index
        require(_lockIndex < lockerStorage.length, "Lock record not saved yet");
        require(_desiredAmount > 0, "Cant claim zero");
        LockStorageRecord memory lock = lockerStorage[_lockIndex];
        (uint256 percentShares, uint256 wasClaimed) = 
            _getUserSharePercentAndClaimedAmount(msg.sender, _lockIndex);
        uint256 availableAmount =
            _getAvailableAmountByLockIndex(_lockIndex)
            * percentShares / TOTAL_IN_PERCENT
            - wasClaimed;

        require(_desiredAmount <= availableAmount, "Insufficient for now");
        availableAmount = _desiredAmount;

        //update claimed amount
        _decreaseAvailableAmount(msg.sender, _lockIndex, availableAmount);

        //send tokens
        IERC20 token = IERC20(lock.token);
        token.safeTransfer(msg.sender, availableAmount);
    }

    

    /**
     * @dev Returns array of shares for user (beneficiary).
     * See LockerTypes.RegistryShare description.
     * In case of one project this will only one record
     * 
     * Requirements:
     *
     * - `_user` beneficiary address
     */
    function getUserShares(address _user) external view returns (RegistryShare[] memory) {
        return _getUsersShares(_user);
    }


    /**
     * @dev Returns tuple (totalBalance, available balance).
     * totalBalance - amount of all user shares minus already claimed
     * available - user balance that available for NOW, minus already claimed
     * -
     * Requirements:
     *
     * - `_user` beneficiary address
     * - `_lockIndex` array index, number of lock record in  storage. For one project lock case = 0
     */
    function getUserBalances(address _user, uint256 _lockIndex) external view returns (uint256, uint256) {
        return _getUserBalances(_user, _lockIndex);
    }

    /**
     * @dev Returns LockStorageRecord data struture.See LockerTypes.LockStorageRecord description.
     * -
     * Requirements:
     *
     * - `_index` array index, number of lock record in  storage. For one project lock case = 0
     */
    function getLockRecordByIndex(uint256 _index) external view returns (LockStorageRecord memory){
        return _getLockRecordByIndex(_index);
    }

    
    /**
     * @dev Returns LockStorage Record count, for iteration from app.
     * 
     */
    function getLockCount() external view returns (uint256) {
        return lockerStorage.length;
    }



    /**
     * @dev Just helper for array summ.
     * 
     */
    function getArraySum(uint256[] memory _array) external pure returns (uint256) {
        return _getArraySum(_array);
    }

    ////////////////////////////////////////////////////////////
    /////////// Internals           ////////////////////////////
    ////////////////////////////////////////////////////////////
    function _decreaseAvailableAmount(address user, uint256 _lockIndex, uint256 _amount) internal {
        RegistryShare[] storage shares = registry[user];
        for (uint256 i = 0; i < shares.length; i ++ ) {
            if  (shares[i].lockIndex == _lockIndex) {
                //It does not matter what record will update
                // with same _lockIndex. but only one!!!!
                shares[i].claimedAmount += _amount;
                break;
            }
        }

    }

    function _getArraySum(uint256[] memory _array) internal pure returns (uint256) {
        uint256 res = 0;
        for (uint256 i = 0; i < _array.length; i++) {
            res += _array[i];           
        }
        return res;
    }

    function _getAvailableAmountByLockIndex(uint256 _lockIndex) 
        internal 
        view 
        virtual
        returns(uint256)
    {
        VestingRecord[] memory v = lockerStorage[_lockIndex].vestings;
        uint256 res = 0;
        for (uint256 i = 0; i < v.length; i ++ ) {
            if  (v[i].unlockTime <= block.timestamp && !v[i].isNFT) {
                res += v[i].amountUnlock;
            }
        }
        return res;
    }


    function _getUserSharePercentAndClaimedAmount(address _user, uint256 _lockIndex) 
        internal 
        view 
        returns(uint256 percent, uint256 claimed)
    {
        RegistryShare[] memory shares = registry[_user];
        for (uint256 i = 0; i < shares.length; i ++ ) {
            if  (shares[i].lockIndex == _lockIndex) {
                //We do this cycle because one address can exist
                //more then once in one lock
                percent += shares[i].sharePercent;
                claimed += shares[i].claimedAmount;
            }
        }
        return (percent, claimed);
    }

    function _getUsersShares(address _user) internal view returns (RegistryShare[] memory) {
        return registry[_user];
    }

    function _getUserBalances(address _user, uint256 _lockIndex) internal view returns (uint256, uint256) {

        (uint256 percentShares, uint256 wasClaimed) =
            _getUserSharePercentAndClaimedAmount(_user, _lockIndex);

        uint256 totalBalance =
        lockerStorage[_lockIndex].amount
        * percentShares / TOTAL_IN_PERCENT
        - wasClaimed;

        uint256 available =
        _getAvailableAmountByLockIndex(_lockIndex)
        * percentShares / TOTAL_IN_PERCENT
        - wasClaimed;

        return (totalBalance, available);
     }


    function _getVestingsByLockIndex(uint256 _index) internal view returns (VestingRecord[] memory) {
        VestingRecord[] memory v = _getLockRecordByIndex(_index).vestings;
        return v;

    }

    function _getLockRecordByIndex(uint256 _index) internal view returns (LockStorageRecord memory){
        return lockerStorage[_index];
    }

}

File 5 of 6: LockerTypes.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/**
 * @dev Base datstructures for Locker contracts set
 * 
 */
abstract contract LockerTypes {
    //Just enum for good readability
    enum LockType {ERC20, LP}
    
    //Lock storage record
    struct  LockStorageRecord {
        LockType ltype;  //Most time it equal ERC20
        address token;   //Address of project token smart contract to lock
        uint256 amount;  //Lock amount for all investors/lendings
        VestingRecord[] vestings; //Array of vedtings records (see below)
    }

    //One vesting record
    struct VestingRecord {
        uint256 unlockTime;  //only after this moment locked amount will be available
        uint256 amountUnlock;//after unlockTime this amount will be available for all investors according  percentage share
        bool isNFT; //for use with futeres lock
    }

    //Investor's share record
    struct RegistryShare {
        uint256 lockIndex;     //Array index of lock record
        uint256 sharePercent;  //Investors share in this lock
        uint256 claimedAmount; //Already claimed amount
    }

}

File 6 of 6: SafeERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"erc20","type":"address"},{"indexed":true,"internalType":"address","name":"who","type":"address"},{"indexed":false,"internalType":"uint256","name":"lockedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lockId","type":"uint256"}],"name":"NewLock","type":"event"},{"inputs":[],"name":"MAX_BENEFICIARIES_PER_LOCK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_LOCkS_PER_BENEFICIARY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_VESTING_RECORDS_PER_LOCK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_IN_PERCENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lockIndex","type":"uint256"},{"internalType":"uint256","name":"_desiredAmount","type":"uint256"}],"name":"claimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_array","type":"uint256[]"}],"name":"getArraySum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getLockCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getLockRecordByIndex","outputs":[{"components":[{"internalType":"enum LockerTypes.LockType","name":"ltype","type":"uint8"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"components":[{"internalType":"uint256","name":"unlockTime","type":"uint256"},{"internalType":"uint256","name":"amountUnlock","type":"uint256"},{"internalType":"bool","name":"isNFT","type":"bool"}],"internalType":"struct LockerTypes.VestingRecord[]","name":"vestings","type":"tuple[]"}],"internalType":"struct LockerTypes.LockStorageRecord","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_lockIndex","type":"uint256"}],"name":"getUserBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserShares","outputs":[{"components":[{"internalType":"uint256","name":"lockIndex","type":"uint256"},{"internalType":"uint256","name":"sharePercent","type":"uint256"},{"internalType":"uint256","name":"claimedAmount","type":"uint256"}],"internalType":"struct LockerTypes.RegistryShare[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_ERC20","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256[]","name":"_unlockedFrom","type":"uint256[]"},{"internalType":"uint256[]","name":"_unlockAmount","type":"uint256[]"},{"internalType":"address[]","name":"_beneficiaries","type":"address[]"},{"internalType":"uint256[]","name":"_beneficiariesShares","type":"uint256[]"}],"name":"lockTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"registry","outputs":[{"internalType":"uint256","name":"lockIndex","type":"uint256"},{"internalType":"uint256","name":"sharePercent","type":"uint256"},{"internalType":"uint256","name":"claimedAmount","type":"uint256"}],"stateMutability":"view","type":"function"}]

608060405234801561001057600080fd5b50611c18806100206000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063769c3cb31161008c578063ba0cb22b11610066578063ba0cb22b146101c9578063c3ac8b33146101e9578063d05cb545146101f6578063dfbe88811461022457600080fd5b8063769c3cb3146101865780638ea6bde3146101ae57806394493c43146101c157600080fd5b806306fdde03146100d457806308f999471461011f578063096dbaba14610135578063136fa5151461014a5780633098b74b146101535780636f5dde5214610166575b600080fd5b610109604051806040016040528060168152602001754c6f636b20262052656769737472792076302e302e3360501b81525081565b604051610116919061199b565b60405180910390f35b610127601581565b604051908152602001610116565b6101486101433660046117ad565b61022c565b005b6101276103e881565b610127610161366004611873565b610a99565b6101796101743660046118d2565b610aaa565b60405161011691906119ce565b610199610194366004611783565b610add565b60408051928352602083019190915201610116565b6101486101bc366004611904565b610af5565b600054610127565b6101dc6101d7366004611768565b610d58565b6040516101169190611942565b6101276509184e72a00081565b610209610204366004611783565b610d63565b60408051938452602084019290925290820152606001610116565b61012760a081565b600085116102765760405162461bcd60e51b815260206004820152601260248201527110d85b9d081b1bd8dac80c08185b5bdd5b9d60721b60448201526064015b60405180910390fd5b604051636eb1769f60e11b815233600482015230602482015285906001600160a01b0388169063dd62ed3e9060440160206040518083038186803b1580156102bd57600080fd5b505afa1580156102d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102f591906118eb565b101561033a5760405162461bcd60e51b8152602060048201526014602482015273141b19585cd948185c1c1c9bdd9948199a5c9cdd60621b604482015260640161026d565b8461034484610da5565b146103a75760405162461bcd60e51b815260206004820152602d60248201527f53756d2076657374696e67207265636f726473206d757374206265206571756160448201526c1b081b1bd8dac8185b5bdd5b9d609a1b606482015260840161026d565b82518451146104135760405162461bcd60e51b815260206004820152603260248201527f4c656e677468206f6620706572696f647320616e6420616d6f756e74732061726044820152711c985e5cc81b5d5cdd08189948195c5d585b60721b606482015260840161026d565b805182511461048a5760405162461bcd60e51b815260206004820152603760248201527f4c656e677468206f662062656e6566696369617269657320616e64207368617260448201527f657320617272617973206d75737420626520657175616c000000000000000000606482015260840161026d565b6509184e72a00061049a82610da5565b146104f95760405162461bcd60e51b815260206004820152602960248201527f53756d206f6620736861726573206172726179206d75737420626520657175616044820152686c20746f203130302560b81b606482015260840161026d565b60a082511061054a5760405162461bcd60e51b815260206004820181905260248201527f4d41585f42454e454649434941524945535f5045525f4c4f434b204c494d4954604482015260640161026d565b60158451106105a65760405162461bcd60e51b815260206004820152602260248201527f4d41585f56455354494e475f5245434f5244535f5045525f4c4f434b204c494d604482015261125560f21b606482015260840161026d565b6000845167ffffffffffffffff8111156105c2576105c2611bcc565b60405190808252806020026020018201604052801561061957816020015b610606604051806060016040528060008152602001600081526020016000151581525090565b8152602001906001900390816105e05790505b50905060005b85518110156106b05785818151811061063a5761063a611bb6565b602002602001015182828151811061065457610654611bb6565b6020026020010151600001818152505084818151811061067657610676611bb6565b602002602001015182828151811061069057610690611bb6565b6020908102919091018101510152806106a881611b6f565b91505061061f565b50600080546001810182558180526003027f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563810180546001600160a81b0319166101006001600160a01b038c16021781557f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e564909101889055905b86518110156107a9578160020183828151811061074957610749611bb6565b602090810291909101810151825460018082018555600094855293839020825160039092020190815591810151928201929092556040909101516002909101805460ff1916911515919091179055806107a181611b6f565b91505061072a565b5060005b8451811015610a1f5760006001600160a01b03168582815181106107d3576107d3611bb6565b60200260200101516001600160a01b0316141561082a5760405162461bcd60e51b815260206004820152601560248201527443616e7420616464207a65726f206164647265737360581b604482015260640161026d565b306001600160a01b031685828151811061084657610846611bb6565b60200260200101516001600160a01b031614156108905760405162461bcd60e51b8152602060048201526008602482015267426164206964656160c01b604482015260640161026d565b6000600160008784815181106108a8576108a8611bb6565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002090506103e8818054905011156109285760405162461bcd60e51b815260206004820152601f60248201527f4d41585f4c4f436b535f5045525f42454e4546494349415259204c494d495400604482015260640161026d565b80604051806060016040528060016000805490506109469190611b2c565b815260200187858151811061095d5761095d611bb6565b60209081029190910181015182526000918101829052835460018181018655948352818320845160039092020190815590830151818501556040909201516002928301558054919290916109b19190611b2c565b81526020019081526020016000208683815181106109d1576109d1611bb6565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790555080610a1781611b6f565b9150506107ad565b5087610a366001600160a01b03821633308b610df3565b60005433906001600160a01b038b16907f360b683997b87e650f5af8bb848bb2f19f0ae44eccf0c5b82553fdd11cc0d371908b90610a7690600190611b2c565b6040805192835260208301919091520160405180910390a3505050505050505050565b6000610aa482610da5565b92915050565b610ad460408051608081019091528060008152600060208201819052604082015260609081015290565b610aa482610e64565b600080610aea8484610fa6565b915091509250929050565b6000548210610b465760405162461bcd60e51b815260206004820152601960248201527f4c6f636b207265636f7264206e6f742073617665642079657400000000000000604482015260640161026d565b60008111610b885760405162461bcd60e51b815260206004820152600f60248201526e43616e7420636c61696d207a65726f60881b604482015260640161026d565b6000808381548110610b9c57610b9c611bb6565b6000918252602090912060408051608081019091526003909202018054829060ff166001811115610bcf57610bcf611ba0565b6001811115610be057610be0611ba0565b81526020016000820160019054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020016000905b82821015610c935760008481526020908190206040805160608101825260038602909201805483526001808201548486015260029091015460ff161515918301919091529083529092019101610c42565b50505050815250509050600080610caa338661104b565b915091506000816509184e72a00084610cc28961117c565b610ccc9190611b0d565b610cd69190611aeb565b610ce09190611b2c565b905080851115610d295760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e7420666f72206e6f7760601b604482015260640161026d565b5083610d363387836112ba565b6020840151610d4f6001600160a01b038216338461135f565b50505050505050565b6060610aa482611394565b60016020528160005260406000208181548110610d7f57600080fd5b600091825260209091206003909102018054600182015460029092015490935090915083565b600080805b8351811015610dec57838181518110610dc557610dc5611bb6565b602002602001015182610dd89190611ad3565b915080610de481611b6f565b915050610daa565b5092915050565b6040516001600160a01b0380851660248301528316604482015260648101829052610e5e9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611427565b50505050565b610e8e60408051608081019091528060008152600060208201819052604082015260609081015290565b60008281548110610ea157610ea1611bb6565b6000918252602090912060408051608081019091526003909202018054829060ff166001811115610ed457610ed4611ba0565b6001811115610ee557610ee5611ba0565b81526020016000820160019054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020016000905b82821015610f985760008481526020908190206040805160608101825260038602909201805483526001808201548486015260029091015460ff161515918301919091529083529092019101610f47565b505050915250909392505050565b600080600080610fb6868661104b565b915091506000816509184e72a0008460008981548110610fd857610fd8611bb6565b906000526020600020906003020160010154610ff49190611b0d565b610ffe9190611aeb565b6110089190611b2c565b90506000826509184e72a0008561101e8a61117c565b6110289190611b0d565b6110329190611aeb565b61103c9190611b2c565b91989197509095505050505050565b6001600160a01b0382166000908152600160209081526040808320805482518185028101850190935280835284938493929190849084015b828210156110d35783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190611083565b50505050905060005b815181101561117357848282815181106110f8576110f8611bb6565b60200260200101516000015114156111615781818151811061111c5761111c611bb6565b602002602001015160200151846111339190611ad3565b935081818151811061114757611147611bb6565b6020026020010151604001518361115e9190611ad3565b92505b8061116b81611b6f565b9150506110dc565b50509250929050565b6000806000838154811061119257611192611bb6565b9060005260206000209060030201600201805480602002602001604051908101604052809291908181526020016000905b828210156112145760008481526020908190206040805160608101825260038602909201805483526001808201548486015260029091015460ff1615159183019190915290835290920191016111c3565b5050505090506000805b82518110156112b2574383828151811061123a5761123a611bb6565b6020026020010151600001511115801561126f575082818151811061126157611261611bb6565b602002602001015160400151155b156112a05782818151811061128657611286611bb6565b6020026020010151602001518261129d9190611ad3565b91505b806112aa81611b6f565b91505061121e565b509392505050565b6001600160a01b0383166000908152600160205260408120905b815481101561135857838282815481106112f0576112f0611bb6565b9060005260206000209060030201600001541415611346578282828154811061131b5761131b611bb6565b9060005260206000209060030201600201600082825461133b9190611ad3565b909155506113589050565b8061135081611b6f565b9150506112d4565b5050505050565b6040516001600160a01b03831660248201526044810182905261138f90849063a9059cbb60e01b90606401610e27565b505050565b6001600160a01b0381166000908152600160209081526040808320805482518185028101850190935280835260609492939192909184015b8282101561141c57838290600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050815260200190600101906113cc565b505050509050919050565b600061147c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166114f99092919063ffffffff16565b80519091501561138f578080602001905181019061149a91906118b0565b61138f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161026d565b60606115088484600085611512565b90505b9392505050565b6060824710156115735760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161026d565b843b6115c15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161026d565b600080866001600160a01b031685876040516115dd9190611926565b60006040518083038185875af1925050503d806000811461161a576040519150601f19603f3d011682016040523d82523d6000602084013e61161f565b606091505b509150915061162f82828661163a565b979650505050505050565b6060831561164957508161150b565b8251156116595782518084602001fd5b8160405162461bcd60e51b815260040161026d919061199b565b80356001600160a01b038116811461168a57600080fd5b919050565b600082601f8301126116a057600080fd5b813560206116b56116b083611aaf565b611a7e565b80838252828201915082860187848660051b89010111156116d557600080fd5b60005b858110156116fb576116e982611673565b845292840192908401906001016116d8565b5090979650505050505050565b600082601f83011261171957600080fd5b813560206117296116b083611aaf565b80838252828201915082860187848660051b890101111561174957600080fd5b60005b858110156116fb5781358452928401929084019060010161174c565b60006020828403121561177a57600080fd5b61150b82611673565b6000806040838503121561179657600080fd5b61179f83611673565b946020939093013593505050565b60008060008060008060c087890312156117c657600080fd5b6117cf87611673565b955060208701359450604087013567ffffffffffffffff808211156117f357600080fd5b6117ff8a838b01611708565b9550606089013591508082111561181557600080fd5b6118218a838b01611708565b9450608089013591508082111561183757600080fd5b6118438a838b0161168f565b935060a089013591508082111561185957600080fd5b5061186689828a01611708565b9150509295509295509295565b60006020828403121561188557600080fd5b813567ffffffffffffffff81111561189c57600080fd5b6118a884828501611708565b949350505050565b6000602082840312156118c257600080fd5b8151801515811461150b57600080fd5b6000602082840312156118e457600080fd5b5035919050565b6000602082840312156118fd57600080fd5b5051919050565b6000806040838503121561191757600080fd5b50508035926020909101359150565b60008251611938818460208701611b43565b9190910192915050565b602080825282518282018190526000919060409081850190868401855b8281101561198e578151805185528681015187860152850151858501526060909301929085019060010161195f565b5091979650505050505050565b60208152600082518060208401526119ba816040850160208701611b43565b601f01601f19169190910160400192915050565b6000602080835260a083018451600281106119f957634e487b7160e01b600052602160045260246000fd5b84830152848201516001600160a01b03166040808601919091528086015160608087019190915280870151608080880152805193849052840192600092919060c08801905b80851015611a71578551805183528781015188840152840151151584830152948601946001949094019390820190611a3e565b5098975050505050505050565b604051601f8201601f1916810167ffffffffffffffff81118282101715611aa757611aa7611bcc565b604052919050565b600067ffffffffffffffff821115611ac957611ac9611bcc565b5060051b60200190565b60008219821115611ae657611ae6611b8a565b500190565b600082611b0857634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611b2757611b27611b8a565b500290565b600082821015611b3e57611b3e611b8a565b500390565b60005b83811015611b5e578181015183820152602001611b46565b83811115610e5e5750506000910152565b6000600019821415611b8357611b83611b8a565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220596b5811bd6b06faec92fbe52724693e2e2ce3b9621245a3166cdae7ca725e8f64736f6c63430008060033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063769c3cb31161008c578063ba0cb22b11610066578063ba0cb22b146101c9578063c3ac8b33146101e9578063d05cb545146101f6578063dfbe88811461022457600080fd5b8063769c3cb3146101865780638ea6bde3146101ae57806394493c43146101c157600080fd5b806306fdde03146100d457806308f999471461011f578063096dbaba14610135578063136fa5151461014a5780633098b74b146101535780636f5dde5214610166575b600080fd5b610109604051806040016040528060168152602001754c6f636b20262052656769737472792076302e302e3360501b81525081565b604051610116919061199b565b60405180910390f35b610127601581565b604051908152602001610116565b6101486101433660046117ad565b61022c565b005b6101276103e881565b610127610161366004611873565b610a99565b6101796101743660046118d2565b610aaa565b60405161011691906119ce565b610199610194366004611783565b610add565b60408051928352602083019190915201610116565b6101486101bc366004611904565b610af5565b600054610127565b6101dc6101d7366004611768565b610d58565b6040516101169190611942565b6101276509184e72a00081565b610209610204366004611783565b610d63565b60408051938452602084019290925290820152606001610116565b61012760a081565b600085116102765760405162461bcd60e51b815260206004820152601260248201527110d85b9d081b1bd8dac80c08185b5bdd5b9d60721b60448201526064015b60405180910390fd5b604051636eb1769f60e11b815233600482015230602482015285906001600160a01b0388169063dd62ed3e9060440160206040518083038186803b1580156102bd57600080fd5b505afa1580156102d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102f591906118eb565b101561033a5760405162461bcd60e51b8152602060048201526014602482015273141b19585cd948185c1c1c9bdd9948199a5c9cdd60621b604482015260640161026d565b8461034484610da5565b146103a75760405162461bcd60e51b815260206004820152602d60248201527f53756d2076657374696e67207265636f726473206d757374206265206571756160448201526c1b081b1bd8dac8185b5bdd5b9d609a1b606482015260840161026d565b82518451146104135760405162461bcd60e51b815260206004820152603260248201527f4c656e677468206f6620706572696f647320616e6420616d6f756e74732061726044820152711c985e5cc81b5d5cdd08189948195c5d585b60721b606482015260840161026d565b805182511461048a5760405162461bcd60e51b815260206004820152603760248201527f4c656e677468206f662062656e6566696369617269657320616e64207368617260448201527f657320617272617973206d75737420626520657175616c000000000000000000606482015260840161026d565b6509184e72a00061049a82610da5565b146104f95760405162461bcd60e51b815260206004820152602960248201527f53756d206f6620736861726573206172726179206d75737420626520657175616044820152686c20746f203130302560b81b606482015260840161026d565b60a082511061054a5760405162461bcd60e51b815260206004820181905260248201527f4d41585f42454e454649434941524945535f5045525f4c4f434b204c494d4954604482015260640161026d565b60158451106105a65760405162461bcd60e51b815260206004820152602260248201527f4d41585f56455354494e475f5245434f5244535f5045525f4c4f434b204c494d604482015261125560f21b606482015260840161026d565b6000845167ffffffffffffffff8111156105c2576105c2611bcc565b60405190808252806020026020018201604052801561061957816020015b610606604051806060016040528060008152602001600081526020016000151581525090565b8152602001906001900390816105e05790505b50905060005b85518110156106b05785818151811061063a5761063a611bb6565b602002602001015182828151811061065457610654611bb6565b6020026020010151600001818152505084818151811061067657610676611bb6565b602002602001015182828151811061069057610690611bb6565b6020908102919091018101510152806106a881611b6f565b91505061061f565b50600080546001810182558180526003027f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563810180546001600160a81b0319166101006001600160a01b038c16021781557f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e564909101889055905b86518110156107a9578160020183828151811061074957610749611bb6565b602090810291909101810151825460018082018555600094855293839020825160039092020190815591810151928201929092556040909101516002909101805460ff1916911515919091179055806107a181611b6f565b91505061072a565b5060005b8451811015610a1f5760006001600160a01b03168582815181106107d3576107d3611bb6565b60200260200101516001600160a01b0316141561082a5760405162461bcd60e51b815260206004820152601560248201527443616e7420616464207a65726f206164647265737360581b604482015260640161026d565b306001600160a01b031685828151811061084657610846611bb6565b60200260200101516001600160a01b031614156108905760405162461bcd60e51b8152602060048201526008602482015267426164206964656160c01b604482015260640161026d565b6000600160008784815181106108a8576108a8611bb6565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002090506103e8818054905011156109285760405162461bcd60e51b815260206004820152601f60248201527f4d41585f4c4f436b535f5045525f42454e4546494349415259204c494d495400604482015260640161026d565b80604051806060016040528060016000805490506109469190611b2c565b815260200187858151811061095d5761095d611bb6565b60209081029190910181015182526000918101829052835460018181018655948352818320845160039092020190815590830151818501556040909201516002928301558054919290916109b19190611b2c565b81526020019081526020016000208683815181106109d1576109d1611bb6565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790555080610a1781611b6f565b9150506107ad565b5087610a366001600160a01b03821633308b610df3565b60005433906001600160a01b038b16907f360b683997b87e650f5af8bb848bb2f19f0ae44eccf0c5b82553fdd11cc0d371908b90610a7690600190611b2c565b6040805192835260208301919091520160405180910390a3505050505050505050565b6000610aa482610da5565b92915050565b610ad460408051608081019091528060008152600060208201819052604082015260609081015290565b610aa482610e64565b600080610aea8484610fa6565b915091509250929050565b6000548210610b465760405162461bcd60e51b815260206004820152601960248201527f4c6f636b207265636f7264206e6f742073617665642079657400000000000000604482015260640161026d565b60008111610b885760405162461bcd60e51b815260206004820152600f60248201526e43616e7420636c61696d207a65726f60881b604482015260640161026d565b6000808381548110610b9c57610b9c611bb6565b6000918252602090912060408051608081019091526003909202018054829060ff166001811115610bcf57610bcf611ba0565b6001811115610be057610be0611ba0565b81526020016000820160019054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020016000905b82821015610c935760008481526020908190206040805160608101825260038602909201805483526001808201548486015260029091015460ff161515918301919091529083529092019101610c42565b50505050815250509050600080610caa338661104b565b915091506000816509184e72a00084610cc28961117c565b610ccc9190611b0d565b610cd69190611aeb565b610ce09190611b2c565b905080851115610d295760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e7420666f72206e6f7760601b604482015260640161026d565b5083610d363387836112ba565b6020840151610d4f6001600160a01b038216338461135f565b50505050505050565b6060610aa482611394565b60016020528160005260406000208181548110610d7f57600080fd5b600091825260209091206003909102018054600182015460029092015490935090915083565b600080805b8351811015610dec57838181518110610dc557610dc5611bb6565b602002602001015182610dd89190611ad3565b915080610de481611b6f565b915050610daa565b5092915050565b6040516001600160a01b0380851660248301528316604482015260648101829052610e5e9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611427565b50505050565b610e8e60408051608081019091528060008152600060208201819052604082015260609081015290565b60008281548110610ea157610ea1611bb6565b6000918252602090912060408051608081019091526003909202018054829060ff166001811115610ed457610ed4611ba0565b6001811115610ee557610ee5611ba0565b81526020016000820160019054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020016000905b82821015610f985760008481526020908190206040805160608101825260038602909201805483526001808201548486015260029091015460ff161515918301919091529083529092019101610f47565b505050915250909392505050565b600080600080610fb6868661104b565b915091506000816509184e72a0008460008981548110610fd857610fd8611bb6565b906000526020600020906003020160010154610ff49190611b0d565b610ffe9190611aeb565b6110089190611b2c565b90506000826509184e72a0008561101e8a61117c565b6110289190611b0d565b6110329190611aeb565b61103c9190611b2c565b91989197509095505050505050565b6001600160a01b0382166000908152600160209081526040808320805482518185028101850190935280835284938493929190849084015b828210156110d35783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190611083565b50505050905060005b815181101561117357848282815181106110f8576110f8611bb6565b60200260200101516000015114156111615781818151811061111c5761111c611bb6565b602002602001015160200151846111339190611ad3565b935081818151811061114757611147611bb6565b6020026020010151604001518361115e9190611ad3565b92505b8061116b81611b6f565b9150506110dc565b50509250929050565b6000806000838154811061119257611192611bb6565b9060005260206000209060030201600201805480602002602001604051908101604052809291908181526020016000905b828210156112145760008481526020908190206040805160608101825260038602909201805483526001808201548486015260029091015460ff1615159183019190915290835290920191016111c3565b5050505090506000805b82518110156112b2574383828151811061123a5761123a611bb6565b6020026020010151600001511115801561126f575082818151811061126157611261611bb6565b602002602001015160400151155b156112a05782818151811061128657611286611bb6565b6020026020010151602001518261129d9190611ad3565b91505b806112aa81611b6f565b91505061121e565b509392505050565b6001600160a01b0383166000908152600160205260408120905b815481101561135857838282815481106112f0576112f0611bb6565b9060005260206000209060030201600001541415611346578282828154811061131b5761131b611bb6565b9060005260206000209060030201600201600082825461133b9190611ad3565b909155506113589050565b8061135081611b6f565b9150506112d4565b5050505050565b6040516001600160a01b03831660248201526044810182905261138f90849063a9059cbb60e01b90606401610e27565b505050565b6001600160a01b0381166000908152600160209081526040808320805482518185028101850190935280835260609492939192909184015b8282101561141c57838290600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050815260200190600101906113cc565b505050509050919050565b600061147c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166114f99092919063ffffffff16565b80519091501561138f578080602001905181019061149a91906118b0565b61138f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161026d565b60606115088484600085611512565b90505b9392505050565b6060824710156115735760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161026d565b843b6115c15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161026d565b600080866001600160a01b031685876040516115dd9190611926565b60006040518083038185875af1925050503d806000811461161a576040519150601f19603f3d011682016040523d82523d6000602084013e61161f565b606091505b509150915061162f82828661163a565b979650505050505050565b6060831561164957508161150b565b8251156116595782518084602001fd5b8160405162461bcd60e51b815260040161026d919061199b565b80356001600160a01b038116811461168a57600080fd5b919050565b600082601f8301126116a057600080fd5b813560206116b56116b083611aaf565b611a7e565b80838252828201915082860187848660051b89010111156116d557600080fd5b60005b858110156116fb576116e982611673565b845292840192908401906001016116d8565b5090979650505050505050565b600082601f83011261171957600080fd5b813560206117296116b083611aaf565b80838252828201915082860187848660051b890101111561174957600080fd5b60005b858110156116fb5781358452928401929084019060010161174c565b60006020828403121561177a57600080fd5b61150b82611673565b6000806040838503121561179657600080fd5b61179f83611673565b946020939093013593505050565b60008060008060008060c087890312156117c657600080fd5b6117cf87611673565b955060208701359450604087013567ffffffffffffffff808211156117f357600080fd5b6117ff8a838b01611708565b9550606089013591508082111561181557600080fd5b6118218a838b01611708565b9450608089013591508082111561183757600080fd5b6118438a838b0161168f565b935060a089013591508082111561185957600080fd5b5061186689828a01611708565b9150509295509295509295565b60006020828403121561188557600080fd5b813567ffffffffffffffff81111561189c57600080fd5b6118a884828501611708565b949350505050565b6000602082840312156118c257600080fd5b8151801515811461150b57600080fd5b6000602082840312156118e457600080fd5b5035919050565b6000602082840312156118fd57600080fd5b5051919050565b6000806040838503121561191757600080fd5b50508035926020909101359150565b60008251611938818460208701611b43565b9190910192915050565b602080825282518282018190526000919060409081850190868401855b8281101561198e578151805185528681015187860152850151858501526060909301929085019060010161195f565b5091979650505050505050565b60208152600082518060208401526119ba816040850160208701611b43565b601f01601f19169190910160400192915050565b6000602080835260a083018451600281106119f957634e487b7160e01b600052602160045260246000fd5b84830152848201516001600160a01b03166040808601919091528086015160608087019190915280870151608080880152805193849052840192600092919060c08801905b80851015611a71578551805183528781015188840152840151151584830152948601946001949094019390820190611a3e565b5098975050505050505050565b604051601f8201601f1916810167ffffffffffffffff81118282101715611aa757611aa7611bcc565b604052919050565b600067ffffffffffffffff821115611ac957611ac9611bcc565b5060051b60200190565b60008219821115611ae657611ae6611b8a565b500190565b600082611b0857634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611b2757611b27611b8a565b500290565b600082821015611b3e57611b3e611b8a565b500390565b60005b83811015611b5e578181015183820152602001611b46565b83811115610e5e5750506000910152565b6000600019821415611b8357611b83611b8a565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220596b5811bd6b06faec92fbe52724693e2e2ce3b9621245a3166cdae7ca725e8f64736f6c63430008060033

Deployed Bytecode Sourcemap

138:490:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;262:55:2;;;;;;;;;;;;;;;-1:-1:-1;;;262:55:2;;;;;;;;;;;;:::i;:::-;;;;;;;;632:58;;688:2;632:58;;;;;14893:25:6;;;14881:2;14866:18;632:58:2;14848:76:6;2300:2927:2;;;;;;:::i;:::-;;:::i;:::-;;974:59;;1029:4;974:59;;8251:122;;;;;;:::i;:::-;;:::i;7827:147::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;7413:160::-;;;;;;:::i;:::-;;:::i;:::-;;;;15103:25:6;;;15159:2;15144:18;;15137:34;;;;15076:18;7413:160:2;15058:119:6;5640:969:2;;;;;;:::i;:::-;;:::i;8079:100::-;8126:7;8152:20;8079:100;;6876:131;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1202:47::-;;1245:4;1202:47;;1345:52;;;;;;:::i;:::-;;:::i;:::-;;;;15384:25:6;;;15440:2;15425:18;;15418:34;;;;15468:18;;;15461:34;15372:2;15357:18;1345:52:2;15339:162:6;909:59:2;;965:3;909:59;;2300:2927;2598:1;2588:7;:11;2580:42;;;;-1:-1:-1;;;2580:42:2;;8667:2:6;2580:42:2;;;8649:21:6;8706:2;8686:18;;;8679:30;-1:-1:-1;;;8725:18:6;;;8718:48;8783:18;;2580:42:2;;;;;;;;;2640:51;;-1:-1:-1;;;2640:51:2;;2665:10;2640:51;;;4954:34:6;2685:4:2;5004:18:6;;;4997:43;2695:7:2;;-1:-1:-1;;;;;2640:24:2;;;;;4889:18:6;;2640:51:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;;2632:95;;;;-1:-1:-1;;;2632:95:2;;12504:2:6;2632:95:2;;;12486:21:6;12543:2;12523:18;;;12516:30;-1:-1:-1;;;12562:18:6;;;12555:50;12622:18;;2632:95:2;12476:170:6;2632:95:2;2776:7;2745:27;2758:13;2745:12;:27::i;:::-;:38;2737:96;;;;-1:-1:-1;;;2737:96:2;;7160:2:6;2737:96:2;;;7142:21:6;7199:2;7179:18;;;7172:30;7238:34;7218:18;;;7211:62;-1:-1:-1;;;7289:18:6;;;7282:43;7342:19;;2737:96:2;7132:235:6;2737:96:2;2875:13;:20;2851:13;:20;:44;2843:107;;;;-1:-1:-1;;;2843:107:2;;10595:2:6;2843:107:2;;;10577:21:6;10634:2;10614:18;;;10607:30;10673:34;10653:18;;;10646:62;-1:-1:-1;;;10724:18:6;;;10717:48;10782:19;;2843:107:2;10567:240:6;2843:107:2;2993:20;:27;2968:14;:21;:52;2960:120;;;;-1:-1:-1;;;2960:120:2;;9417:2:6;2960:120:2;;;9399:21:6;9456:2;9436:18;;;9429:30;9495:34;9475:18;;;9468:62;9566:25;9546:18;;;9539:53;9609:19;;2960:120:2;9389:245:6;2960:120:2;1245:4;3098:34;3111:20;3098:12;:34::i;:::-;:54;3090:108;;;;-1:-1:-1;;;3090:108:2;;10185:2:6;3090:108:2;;;10167:21:6;10224:2;10204:18;;;10197:30;10263:34;10243:18;;;10236:62;-1:-1:-1;;;10314:18:6;;;10307:39;10363:19;;3090:108:2;10157:231:6;3090:108:2;965:3;3216:14;:21;:50;3208:97;;;;-1:-1:-1;;;3208:97:2;;11014:2:6;3208:97:2;;;10996:21:6;;;11033:18;;;11026:30;11092:34;11072:18;;;11065:62;11144:18;;3208:97:2;10986:182:6;3208:97:2;688:2;3323:13;:20;:52;3315:99;;;;-1:-1:-1;;;3315:99:2;;9014:2:6;3315:99:2;;;8996:21:6;9053:2;9033:18;;;9026:30;9092:34;9072:18;;;9065:62;-1:-1:-1;;;9143:18:6;;;9136:32;9185:19;;3315:99:2;8986:224:6;3315:99:2;3463:24;3510:13;:20;3490:41;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;3490:41:2;;;;;;;;;;;;;;;;;3463:68;;3546:9;3541:171;3565:13;:20;3561:1;:24;3541:171;;;3630:13;3644:1;3630:16;;;;;;;;:::i;:::-;;;;;;;3612:1;3614;3612:4;;;;;;;;:::i;:::-;;;;;;;:15;;:34;;;;;3684:13;3698:1;3684:16;;;;;;;;:::i;:::-;;;;;;;3664:1;3666;3664:4;;;;;;;;:::i;:::-;;;;;;;;;;;;:17;:36;3587:4;;;;:::i;:::-;;;;3541:171;;;-1:-1:-1;3766:30:2;3799:20;;;;;;;;;;;;;;;3829:27;;-1:-1:-1;;;;;;3866:19:2;;-1:-1:-1;;;;;3866:19:2;;;;;;3895:11;;;;:21;;;3799:20;4076:106;4100:13;:20;4096:1;:24;4076:106;;;4143:4;:13;;4162:1;4164;4162:4;;;;;;;;:::i;:::-;;;;;;;;;;;;4143:24;;;;;;;;-1:-1:-1;4143:24:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4143:24:2;;;;;;;;;;4122:4;;;;:::i;:::-;;;;4076:106;;;;4246:9;4241:785;4265:14;:21;4261:1;:25;4241:785;;;4346:1;-1:-1:-1;;;;;4317:31:2;:14;4332:1;4317:17;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;4317:31:2;;;4309:65;;;;-1:-1:-1;;;4309:65:2;;7910:2:6;4309:65:2;;;7892:21:6;7949:2;7929:18;;;7922:30;-1:-1:-1;;;7968:18:6;;;7961:51;8029:18;;4309:65:2;7882:171:6;4309:65:2;4425:4;-1:-1:-1;;;;;4396:34:2;:14;4411:1;4396:17;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;4396:34:2;;;4388:55;;;;-1:-1:-1;;;4388:55:2;;7574:2:6;4388:55:2;;;7556:21:6;7613:1;7593:18;;;7586:29;-1:-1:-1;;;7631:18:6;;;7624:38;7679:18;;4388:55:2;7546:157:6;4388:55:2;4457:30;4490:8;:27;4499:14;4514:1;4499:17;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;4490:27:2;-1:-1:-1;;;;;4490:27:2;;;;;;;;;;;;4457:60;;1029:4;4556:6;:13;;;;:42;;4531:133;;;;-1:-1:-1;;;4531:133:2;;11733:2:6;4531:133:2;;;11715:21:6;11772:2;11752:18;;;11745:30;11811:33;11791:18;;;11784:61;11862:18;;4531:133:2;11705:181:6;4531:133:2;4678:6;4690:171;;;;;;;;4756:1;4733:13;:20;;;;:24;;;;:::i;:::-;4690:171;;;;4789:20;4810:1;4789:23;;;;;;;;:::i;:::-;;;;;;;;;;;;4690:171;;4845:1;4690:171;;;;;;4678:184;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4966:20;;4678:184;;4845:1;;4966:24;;4678:184;4966:24;:::i;:::-;4946:45;;;;;;;;;;;4997:14;5012:1;4997:17;;;;;;;;:::i;:::-;;;;;;;;;;;;4946:69;;;;;;;-1:-1:-1;4946:69:2;;;;;;;;;;-1:-1:-1;;;;;;4946:69:2;-1:-1:-1;;;;;4946:69:2;;;;;;;;;-1:-1:-1;4288:4:2;;;;:::i;:::-;;;;4241:785;;;-1:-1:-1;5067:6:2;5084:58;-1:-1:-1;;;;;5084:22:2;;5107:10;5127:4;5134:7;5084:22;:58::i;:::-;5194:13;:20;5173:10;;-1:-1:-1;;;;;5157:62:2;;;;;5185:7;;5194:24;;5217:1;;5194:24;:::i;:::-;5157:62;;;15103:25:6;;;15159:2;15144:18;;15137:34;;;;15076:18;5157:62:2;;;;;;;2570:2657;;;2300:2927;;;;;;:::o;8251:122::-;8320:7;8346:20;8359:6;8346:12;:20::i;:::-;8339:27;8251:122;-1:-1:-1;;8251:122:2:o;7827:147::-;7896:24;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7896:24:2;7938:29;7960:6;7938:21;:29::i;7413:160::-;7496:7;7505;7531:35;7548:5;7555:10;7531:16;:35::i;:::-;7524:42;;;;7413:160;;;;;:::o;5640:969::-;5788:13;:20;5775:33;;5767:71;;;;-1:-1:-1;;;5767:71:2;;13202:2:6;5767:71:2;;;13184:21:6;13241:2;13221:18;;;13214:30;13280:27;13260:18;;;13253:55;13325:18;;5767:71:2;13174:175:6;5767:71:2;5873:1;5856:14;:18;5848:46;;;;-1:-1:-1;;;5848:46:2;;9841:2:6;5848:46:2;;;9823:21:6;9880:2;9860:18;;;9853:30;-1:-1:-1;;;9899:18:6;;;9892:45;9954:18;;5848:46:2;9813:165:6;5848:46:2;5904:29;5936:13;5950:10;5936:25;;;;;;;;:::i;:::-;;;;;;;;;5904:57;;;;;;;;;5936:25;;;;;5904:57;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5904:57:2;-1:-1:-1;;;;;5904:57:2;-1:-1:-1;;;;;5904:57:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5972:21;5995:18;6030:60;6067:10;6079;6030:36;:60::i;:::-;5971:119;;;;6100:23;6242:10;1245:4;6195:13;6138:42;6169:10;6138:30;:42::i;:::-;:70;;;;:::i;:::-;:89;;;;:::i;:::-;:114;;;;:::i;:::-;6100:152;;6289:15;6271:14;:33;;6263:66;;;;-1:-1:-1;;;6263:66:2;;12853:2:6;6263:66:2;;;12835:21:6;12892:2;12872:18;;;12865:30;-1:-1:-1;;;12911:18:6;;;12904:50;12971:18;;6263:66:2;12825:170:6;6263:66:2;-1:-1:-1;6357:14:2;6414:65;6439:10;6451;6357:14;6414:24;:65::i;:::-;6534:10;;;;6555:47;-1:-1:-1;;;;;6555:18:2;;6574:10;6586:15;6555:18;:47::i;:::-;5714:895;;;;;5640:969;;:::o;6876:131::-;6937:22;6978;6994:5;6978:15;:22::i;1345:52::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1345:52:2;;-1:-1:-1;1345:52:2;:::o;9067:236::-;9137:7;;;9181:96;9205:6;:13;9201:1;:17;9181:96;;;9246:6;9253:1;9246:9;;;;;;;;:::i;:::-;;;;;;;9239:16;;;;;:::i;:::-;;-1:-1:-1;9220:3:2;;;;:::i;:::-;;;;9181:96;;;-1:-1:-1;9293:3:2;9067:236;-1:-1:-1;;9067:236:2:o;801:203:5:-;928:68;;-1:-1:-1;;;;;5309:15:6;;;928:68:5;;;5291:34:6;5361:15;;5341:18;;;5334:43;5393:18;;;5386:34;;;901:96:5;;921:5;;-1:-1:-1;;;951:27:5;5226:18:6;;928:68:5;;;;-1:-1:-1;;928:68:5;;;;;;;;;;;;;;-1:-1:-1;;;;;928:68:5;-1:-1:-1;;;;;;928:68:5;;;;;;;;;;901:19;:96::i;:::-;801:203;;;;:::o;11286:140:2:-;11356:24;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11356:24:2;11398:13;11412:6;11398:21;;;;;;;;:::i;:::-;;;;;;;;;11391:28;;;;;;;;;11398:21;;;;;11391:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11391:28:2;-1:-1:-1;;;;;11391:28:2;-1:-1:-1;;;;;11391:28:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11391:28:2;;-1:-1:-1;11391:28:2;;11286:140;-1:-1:-1;;;11286:140:2:o;10516:560::-;10600:7;10609;10630:21;10653:18;10687:55;10724:5;10731:10;10687:36;:55::i;:::-;10629:113;;;;10753:20;10870:10;1245:4;10827:13;10784;10798:10;10784:25;;;;;;;;:::i;:::-;;;;;;;;;;;:32;;;:56;;;;:::i;:::-;:75;;;;:::i;:::-;:96;;;;:::i;:::-;10753:127;;10891:17;11015:10;1245:4;10972:13;10919:42;10950:10;10919:30;:42::i;:::-;:66;;;;:::i;:::-;:85;;;;:::i;:::-;:106;;;;:::i;:::-;11044:12;;;;-1:-1:-1;10516:560:2;;-1:-1:-1;;;;;;10516:560:2:o;9764:614::-;-1:-1:-1;;;;;9974:15:2;;9894;9974;;;:8;:15;;;;;;;;9942:47;;;;;;;;;;;;;;;;;9894:15;;;;9942:47;9974:15;9942:47;9894:15;;9942:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10004:9;9999:338;10023:6;:13;10019:1;:17;9999:338;;;10087:10;10064:6;10071:1;10064:9;;;;;;;;:::i;:::-;;;;;;;:19;;;:33;10059:268;;;10238:6;10245:1;10238:9;;;;;;;;:::i;:::-;;;;;;;:22;;;10227:33;;;;;:::i;:::-;;;10289:6;10296:1;10289:9;;;;;;;;:::i;:::-;;;;;;;:23;;;10278:34;;;;;:::i;:::-;;;10059:268;10038:4;;;;:::i;:::-;;;;9999:338;;;;10346:25;9764:614;;;;;:::o;178:447:3:-;305:7;328:24;355:13;369:10;355:25;;;;;;;;:::i;:::-;;;;;;;;;;;:34;;328:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;399:11;429:9;424:175;448:1;:8;444:1;:12;424:175;;;503:12;484:1;486;484:4;;;;;;;;:::i;:::-;;;;;;;:15;;;:31;;:46;;;;;520:1;522;520:4;;;;;;;;:::i;:::-;;;;;;;:10;;;519:11;484:46;479:110;;;557:1;559;557:4;;;;;;;;:::i;:::-;;;;;;;:17;;;550:24;;;;;:::i;:::-;;;479:110;458:4;;;;:::i;:::-;;;;424:175;;;-1:-1:-1;615:3:3;178:447;-1:-1:-1;;;178:447:3:o;8574:487:2:-;-1:-1:-1;;;;;8711:14:2;;8678:30;8711:14;;;:8;:14;;;;;;8735:319;8759:13;;8755:17;;8735:319;;;8823:10;8800:6;8807:1;8800:9;;;;;;;;:::i;:::-;;;;;;;;;;;:19;;;:33;8795:249;;;8999:7;8972:6;8979:1;8972:9;;;;;;;;:::i;:::-;;;;;;;;;;;:23;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;9024:5:2;;-1:-1:-1;9024:5:2;8795:249;8774:4;;;;:::i;:::-;;;;8735:319;;;;8668:393;8574:487;;;:::o;620:175:5:-;729:58;;-1:-1:-1;;;;;5623:32:6;;729:58:5;;;5605:51:6;5672:18;;;5665:34;;;702:86:5;;722:5;;-1:-1:-1;;;752:23:5;5578:18:6;;729:58:5;5560:145:6;702:86:5;620:175;;;:::o;10384:126:2:-;-1:-1:-1;;;;;10488:15:2;;;;;;:8;:15;;;;;;;;10481:22;;;;;;;;;;;;;;;;;10447;;10481;;10488:15;;10481:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10384:126;;;:::o;3008:751:5:-;3427:23;3453:69;3481:4;3453:69;;;;;;;;;;;;;;;;;3461:5;-1:-1:-1;;;;;3453:27:5;;;:69;;;;;:::i;:::-;3536:17;;3427:95;;-1:-1:-1;3536:21:5;3532:221;;3676:10;3665:30;;;;;;;;;;;;:::i;:::-;3657:85;;;;-1:-1:-1;;;3657:85:5;;12093:2:6;3657:85:5;;;12075:21:6;12132:2;12112:18;;;12105:30;12171:34;12151:18;;;12144:62;-1:-1:-1;;;12222:18:6;;;12215:40;12272:19;;3657:85:5;12065:232:6;3573:193:0;3676:12;3707:52;3729:6;3737:4;3743:1;3746:12;3707:21;:52::i;:::-;3700:59;;3573:193;;;;;;:::o;4600:523::-;4727:12;4784:5;4759:21;:30;;4751:81;;;;-1:-1:-1;;;4751:81:0;;8260:2:6;4751:81:0;;;8242:21:6;8299:2;8279:18;;;8272:30;8338:34;8318:18;;;8311:62;-1:-1:-1;;;8389:18:6;;;8382:36;8435:19;;4751:81:0;8232:228:6;4751:81:0;1078:20;;4842:60;;;;-1:-1:-1;;;4842:60:0;;11375:2:6;4842:60:0;;;11357:21:6;11414:2;11394:18;;;11387:30;11453:31;11433:18;;;11426:59;11502:18;;4842:60:0;11347:179:6;4842:60:0;4973:12;4987:23;5014:6;-1:-1:-1;;;;;5014:11:0;5034:5;5042:4;5014:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4972:75;;;;5064:52;5082:7;5091:10;5103:12;5064:17;:52::i;:::-;5057:59;4600:523;-1:-1:-1;;;;;;;4600:523:0:o;7083:725::-;7198:12;7226:7;7222:580;;;-1:-1:-1;7256:10:0;7249:17;;7222:580;7367:17;;:21;7363:429;;7625:10;7619:17;7685:15;7672:10;7668:2;7664:19;7657:44;7363:429;7764:12;7757:20;;-1:-1:-1;;;7757:20:0;;;;;;;;:::i;14:173:6:-;82:20;;-1:-1:-1;;;;;131:31:6;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:679::-;246:5;299:3;292:4;284:6;280:17;276:27;266:2;;317:1;314;307:12;266:2;353:6;340:20;379:4;403:60;419:43;459:2;419:43;:::i;:::-;403:60;:::i;:::-;485:3;509:2;504:3;497:15;537:2;532:3;528:12;521:19;;572:2;564:6;560:15;624:3;619:2;613;610:1;606:10;598:6;594:23;590:32;587:41;584:2;;;641:1;638;631:12;584:2;663:1;673:169;687:2;684:1;681:9;673:169;;;744:23;763:3;744:23;:::i;:::-;732:36;;788:12;;;;820;;;;705:1;698:9;673:169;;;-1:-1:-1;860:5:6;;256:615;-1:-1:-1;;;;;;;256:615:6:o;876:673::-;930:5;983:3;976:4;968:6;964:17;960:27;950:2;;1001:1;998;991:12;950:2;1037:6;1024:20;1063:4;1087:60;1103:43;1143:2;1103:43;:::i;1087:60::-;1169:3;1193:2;1188:3;1181:15;1221:2;1216:3;1212:12;1205:19;;1256:2;1248:6;1244:15;1308:3;1303:2;1297;1294:1;1290:10;1282:6;1278:23;1274:32;1271:41;1268:2;;;1325:1;1322;1315:12;1268:2;1347:1;1357:163;1371:2;1368:1;1365:9;1357:163;;;1428:17;;1416:30;;1466:12;;;;1498;;;;1389:1;1382:9;1357:163;;1554:186;1613:6;1666:2;1654:9;1645:7;1641:23;1637:32;1634:2;;;1682:1;1679;1672:12;1634:2;1705:29;1724:9;1705:29;:::i;1745:254::-;1813:6;1821;1874:2;1862:9;1853:7;1849:23;1845:32;1842:2;;;1890:1;1887;1880:12;1842:2;1913:29;1932:9;1913:29;:::i;:::-;1903:39;1989:2;1974:18;;;;1961:32;;-1:-1:-1;;;1832:167:6:o;2004:1192::-;2208:6;2216;2224;2232;2240;2248;2301:3;2289:9;2280:7;2276:23;2272:33;2269:2;;;2318:1;2315;2308:12;2269:2;2341:29;2360:9;2341:29;:::i;:::-;2331:39;;2417:2;2406:9;2402:18;2389:32;2379:42;;2472:2;2461:9;2457:18;2444:32;2495:18;2536:2;2528:6;2525:14;2522:2;;;2552:1;2549;2542:12;2522:2;2575:61;2628:7;2619:6;2608:9;2604:22;2575:61;:::i;:::-;2565:71;;2689:2;2678:9;2674:18;2661:32;2645:48;;2718:2;2708:8;2705:16;2702:2;;;2734:1;2731;2724:12;2702:2;2757:63;2812:7;2801:8;2790:9;2786:24;2757:63;:::i;:::-;2747:73;;2873:3;2862:9;2858:19;2845:33;2829:49;;2903:2;2893:8;2890:16;2887:2;;;2919:1;2916;2909:12;2887:2;2942:63;2997:7;2986:8;2975:9;2971:24;2942:63;:::i;:::-;2932:73;;3058:3;3047:9;3043:19;3030:33;3014:49;;3088:2;3078:8;3075:16;3072:2;;;3104:1;3101;3094:12;3072:2;;3127:63;3182:7;3171:8;3160:9;3156:24;3127:63;:::i;:::-;3117:73;;;2259:937;;;;;;;;:::o;3201:348::-;3285:6;3338:2;3326:9;3317:7;3313:23;3309:32;3306:2;;;3354:1;3351;3344:12;3306:2;3394:9;3381:23;3427:18;3419:6;3416:30;3413:2;;;3459:1;3456;3449:12;3413:2;3482:61;3535:7;3526:6;3515:9;3511:22;3482:61;:::i;:::-;3472:71;3296:253;-1:-1:-1;;;;3296:253:6:o;3554:277::-;3621:6;3674:2;3662:9;3653:7;3649:23;3645:32;3642:2;;;3690:1;3687;3680:12;3642:2;3722:9;3716:16;3775:5;3768:13;3761:21;3754:5;3751:32;3741:2;;3797:1;3794;3787:12;3836:180;3895:6;3948:2;3936:9;3927:7;3923:23;3919:32;3916:2;;;3964:1;3961;3954:12;3916:2;-1:-1:-1;3987:23:6;;3906:110;-1:-1:-1;3906:110:6:o;4021:184::-;4091:6;4144:2;4132:9;4123:7;4119:23;4115:32;4112:2;;;4160:1;4157;4150:12;4112:2;-1:-1:-1;4183:16:6;;4102:103;-1:-1:-1;4102:103:6:o;4210:248::-;4278:6;4286;4339:2;4327:9;4318:7;4314:23;4310:32;4307:2;;;4355:1;4352;4345:12;4307:2;-1:-1:-1;;4378:23:6;;;4448:2;4433:18;;;4420:32;;-1:-1:-1;4297:161:6:o;4463:274::-;4592:3;4630:6;4624:13;4646:53;4692:6;4687:3;4680:4;4672:6;4668:17;4646:53;:::i;:::-;4715:16;;;;;4600:137;-1:-1:-1;;4600:137:6:o;5710:855::-;5943:2;5995:21;;;6065:13;;5968:18;;;6087:22;;;5914:4;;5943:2;6128;;6146:18;;;;6187:15;;;5914:4;6230:309;6244:6;6241:1;6238:13;6230:309;;;6303:13;;6341:9;;6329:22;;6391:11;;;6385:18;6371:12;;;6364:40;6444:11;;6438:18;6424:12;;;6417:40;6486:4;6477:14;;;;6514:15;;;;6266:1;6259:9;6230:309;;;-1:-1:-1;6556:3:6;;5923:642;-1:-1:-1;;;;;;;5923:642:6:o;6570:383::-;6719:2;6708:9;6701:21;6682:4;6751:6;6745:13;6794:6;6789:2;6778:9;6774:18;6767:34;6810:66;6869:6;6864:2;6853:9;6849:18;6844:2;6836:6;6832:15;6810:66;:::i;:::-;6937:2;6916:15;-1:-1:-1;;6912:29:6;6897:45;;;;6944:2;6893:54;;6691:262;-1:-1:-1;;6691:262:6:o;13354:1388::-;13516:4;13545:2;13574;13563:9;13556:21;13615:3;13604:9;13600:19;13644:6;13638:13;13677:1;13673:2;13670:9;13660:2;;13722:10;13717:3;13713:20;13710:1;13703:31;13757:4;13754:1;13747:15;13785:4;13782:1;13775:15;13660:2;13816:18;;;13809:30;13874:15;;;13868:22;-1:-1:-1;;;;;13947:38:6;13909:2;13927:18;;;13920:66;;;;14011:15;;;14005:22;14046:2;14064:18;;;14057:30;;;;14124:15;;;14118:22;14178:4;14156:20;;;14149:34;14232:21;;14262:22;;;;14342:23;;;-1:-1:-1;;13909:2:6;14046;14315:3;14300:19;;;14393:323;14407:6;14404:1;14401:13;14393:323;;;14466:13;;14504:9;;14492:22;;14554:11;;;14548:18;14534:12;;;14527:40;14621:11;;14615:18;14608:26;14601:34;14587:12;;;14580:56;14691:15;;;;14429:1;14422:9;;;;;14656:12;;;;14393:323;;;-1:-1:-1;14733:3:6;13525:1217;-1:-1:-1;;;;;;;;13525:1217:6:o;15506:275::-;15577:2;15571:9;15642:2;15623:13;;-1:-1:-1;;15619:27:6;15607:40;;15677:18;15662:34;;15698:22;;;15659:62;15656:2;;;15724:18;;:::i;:::-;15760:2;15753:22;15551:230;;-1:-1:-1;15551:230:6:o;15786:183::-;15846:4;15879:18;15871:6;15868:30;15865:2;;;15901:18;;:::i;:::-;-1:-1:-1;15946:1:6;15942:14;15958:4;15938:25;;15855:114::o;15974:128::-;16014:3;16045:1;16041:6;16038:1;16035:13;16032:2;;;16051:18;;:::i;:::-;-1:-1:-1;16087:9:6;;16022:80::o;16107:217::-;16147:1;16173;16163:2;;16217:10;16212:3;16208:20;16205:1;16198:31;16252:4;16249:1;16242:15;16280:4;16277:1;16270:15;16163:2;-1:-1:-1;16309:9:6;;16153:171::o;16329:168::-;16369:7;16435:1;16431;16427:6;16423:14;16420:1;16417:21;16412:1;16405:9;16398:17;16394:45;16391:2;;;16442:18;;:::i;:::-;-1:-1:-1;16482:9:6;;16381:116::o;16502:125::-;16542:4;16570:1;16567;16564:8;16561:2;;;16575:18;;:::i;:::-;-1:-1:-1;16612:9:6;;16551:76::o;16632:258::-;16704:1;16714:113;16728:6;16725:1;16722:13;16714:113;;;16804:11;;;16798:18;16785:11;;;16778:39;16750:2;16743:10;16714:113;;;16845:6;16842:1;16839:13;16836:2;;;-1:-1:-1;;16880:1:6;16862:16;;16855:27;16685:205::o;16895:135::-;16934:3;-1:-1:-1;;16955:17:6;;16952:2;;;16975:18;;:::i;:::-;-1:-1:-1;17022:1:6;17011:13;;16942:88::o;17035:127::-;17096:10;17091:3;17087:20;17084:1;17077:31;17127:4;17124:1;17117:15;17151:4;17148:1;17141:15;17167:127;17228:10;17223:3;17219:20;17216:1;17209:31;17259:4;17256:1;17249:15;17283:4;17280:1;17273:15;17299:127;17360:10;17355:3;17351:20;17348:1;17341:31;17391:4;17388:1;17381:15;17415:4;17412:1;17405:15;17431:127;17492:10;17487:3;17483:20;17480:1;17473:31;17523:4;17520:1;17513:15;17547:4;17544:1;17537:15

Swarm Source

ipfs://596b5811bd6b06faec92fbe52724693e2e2ce3b9621245a3166cdae7ca725e8f

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  ]

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.