Contract 0x4178aE7F878821E7B3A68CaFc06A8474aC29A73B

 

Contract Overview

Balance:
0 MATIC

MATIC Value:
$0.00

Token:
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x4d4037e90d53f267588ee1c45f8f5453f66b82e192a9fb671f97f893c7190a6cTopup Vesting Ba...314395052022-08-02 16:30:5810 days 56 mins ago0xe78068c0cc48c773d3808e9e31de908c03d01814 IN  0x4178ae7f878821e7b3a68cafc06a8474ac29a73b0 MATIC0.033875475386 484.198213121
0xe8e03cf9fcd79d46b6ac83d7e14e95cef343f415da3e03b258de8345aeb41a61Topup Vesting Ba...305319652022-07-09 17:58:0933 days 23 hrs ago0x83a23b81835bddee41beeedeaea1b04bd736add7 IN  0x4178ae7f878821e7b3a68cafc06a8474ac29a73b0 MATIC0.002388164059 31.943555011
0x8b217d28461859af6505ea8554dc981f8ae787dcb47339bb8bc21ef541d622acTopup Vesting Ba...302866762022-07-03 10:43:5540 days 6 hrs ago0xe78068c0cc48c773d3808e9e31de908c03d01814 IN  0x4178ae7f878821e7b3a68cafc06a8474ac29a73b0 MATIC0.003134301995 44.800062821
0xf068fcfef6098a5af0cab648de7b8181a2668d0ff52666dee51b910d8a50cb1eCreate Lock295277652022-06-13 19:09:2459 days 22 hrs ago0xdc8f3430e118a08bc3e945710bf372abbb3eed0d IN  0x4178ae7f878821e7b3a68cafc06a8474ac29a73b0 MATIC0.005446115513 35.922112232
0xe07521acc25ca9ba355f3eb4ed539795fb74ca5853012204437ec0faeffbe8d2Create Lock292430502022-06-06 17:10:1967 days 17 mins ago0xf51c207a1a3a2d589a9830326dcabd7833ccd2b9 IN  0x4178ae7f878821e7b3a68cafc06a8474ac29a73b0 MATIC0.004889432394 33.301996273
0xb91035f1af706574d20e50a8f44375df4bbcda4a129240987c1e8f16a3da3a70Topup Vesting Ba...290951622022-06-03 1:06:1570 days 16 hrs ago0xe78068c0cc48c773d3808e9e31de908c03d01814 IN  0x4178ae7f878821e7b3a68cafc06a8474ac29a73b0 MATIC0.0023752099 33.950000012
0x10bf90547472414ba709bec62addd73f99d0a451aaa001195903969951d6f899Topup Vesting Ba...287638162022-05-25 19:27:0978 days 22 hrs ago0x257f2d64a2c51584e2e650e9fd9bc4a0621c549f IN  0x4178ae7f878821e7b3a68cafc06a8474ac29a73b0 MATIC0.002177205245 31.114488895
0x945c9d952070e4e32c278a6a737aa9ee60df405e7d58e840c32263a07fdc2efcTopup Vesting Ba...281763532022-05-11 3:35:0093 days 13 hrs ago0x83a23b81835bddee41beeedeaea1b04bd736add7 IN  0x4178ae7f878821e7b3a68cafc06a8474ac29a73b0 MATIC0.007289572521 104.193312387
0x8e611e1d2c8b1298ebb1fcbc93f090510cd124739e217a75afed0af43eab20dfTopup Vesting Ba...281424202022-05-10 7:00:1694 days 10 hrs ago0xe78068c0cc48c773d3808e9e31de908c03d01814 IN  0x4178ae7f878821e7b3a68cafc06a8474ac29a73b0 MATIC0.004840333147 69.185174055
0x5359c90a5545efe8576245f900a68e6e14df9491f3709155e06d0552faa5e5d2Topup Vesting Ba...280168532022-05-07 3:45:0697 days 13 hrs ago0x4a4fb9bf3bece739cd0112aeb62c5895932cdf82 IN  0x4178ae7f878821e7b3a68cafc06a8474ac29a73b0 MATIC0.007004404074 100.100095386
0x31b9ad9eedde70f650b46bd2b8f271e6565c46a78d055a3ebe4e10b0b59bb53dTopup Vesting Ba...279835862022-05-06 7:30:4498 days 9 hrs ago0x722a4973f4e348b7c5e60d2b8a8e23752b98bee7 IN  0x4178ae7f878821e7b3a68cafc06a8474ac29a73b0 MATIC0.002820383958 37.712726424
0xe18734a03b1d2d0159989129f2482eaebdcd2ba55184717f1644765c282c87f9Topup Vesting Ba...278690822022-05-03 9:17:23101 days 8 hrs ago0x3e9493c49eb9874acb705b72d5182896dbf79ed2 IN  0x4178ae7f878821e7b3a68cafc06a8474ac29a73b0 MATIC0.002598926019 37.141309913
0x6a2d74bf4fb424a179c3a372b6bed9f72e4961a50c1a7a1d885ea8fe4c745d91Topup Vesting Ba...278510042022-05-02 22:26:14101 days 19 hrs ago0xe484a833e2b0516f5b3f851fde3f462b365716da IN  0x4178ae7f878821e7b3a68cafc06a8474ac29a73b0 MATIC0.000186905003 2.50000005
0x0f903f68ba8f40cb9b135ac3e9a81151a45cb301d799a58cd6b921bc693af317Topup Vesting Ba...278510042022-05-02 22:26:14101 days 19 hrs ago0xe484a833e2b0516f5b3f851fde3f462b365716da IN  0x4178ae7f878821e7b3a68cafc06a8474ac29a73b0 MATIC0.000186935001 2.500000016
0x721aca29f0f96c5e4bfb7953b9ebc6b96b1d91afd2a807d489732b80434a9a06Topup Vesting Ba...278058142022-05-01 18:47:34102 days 22 hrs ago0xe484a833e2b0516f5b3f851fde3f462b365716da IN  0x4178ae7f878821e7b3a68cafc06a8474ac29a73b0 MATIC0.000186935002 2.500000028
0xf61948330b6626a0aac7a2d34650417bf303f27b5107cbb785bd797409e5a989Topup Vesting Ba...277504812022-04-30 9:31:17104 days 7 hrs ago0x0c6415489a8cc61ca7d32a29f7cdc1e980af16f1 IN  0x4178ae7f878821e7b3a68cafc06a8474ac29a73b0 MATIC0.002468259359 35.279999995
0x6ce3e30218b78463eb90e52465b606d9af2c8445118bebce08e5a0efe2e31f71Topup Vesting Ba...276718952022-04-28 9:30:38106 days 7 hrs ago0x257f2d64a2c51584e2e650e9fd9bc4a0621c549f IN  0x4178ae7f878821e7b3a68cafc06a8474ac29a73b0 MATIC0.003133855566 44.786000031
0xe6cd1f74c458f0e9209f85cc2e4dfdc605104b5e8d118178dd44be8889ad9136Topup Vesting Ba...276497472022-04-27 20:05:01106 days 21 hrs ago0x4a4fb9bf3bece739cd0112aeb62c5895932cdf82 IN  0x4178ae7f878821e7b3a68cafc06a8474ac29a73b0 MATIC0.004205444005 60.100094393
0x43d361aeeeb9eeb96a2ee47e46aff018ba1d3f8d4647b8d2a6e69914a4240919Create Lock269454512022-04-09 22:22:38124 days 19 hrs ago0xf0cf7681e1ab4ded329c2679e8e2ab61490765dd IN  0x4178ae7f878821e7b3a68cafc06a8474ac29a73b0 MATIC0.00475925964 31.38918514
0xbcd23fa12d5b520a961950003ebc7fee23d3b4f334aeef8857203910458be187Topup Vesting Ba...269162182022-04-09 4:41:38125 days 12 hrs ago0x84cc43ffb48779dbd451dd340c5f7fd09f9cee06 IN  0x4178ae7f878821e7b3a68cafc06a8474ac29a73b0 MATIC0.001080977418 32.524293485
0x32ea83834aa7c4e389622b2129262e91a0da038410600858efcb956aa250dba4Topup Vesting Ba...269162182022-04-09 4:41:38125 days 12 hrs ago0x84cc43ffb48779dbd451dd340c5f7fd09f9cee06 IN  0x4178ae7f878821e7b3a68cafc06a8474ac29a73b0 MATIC0.001495620006 45.000000194
0x64c61321c0994a597f5d2e38a66c1414c1aff909f6be1f0325c90d02969c4d7dTopup Vesting Ba...269162182022-04-09 4:41:38125 days 12 hrs ago0x84cc43ffb48779dbd451dd340c5f7fd09f9cee06 IN  0x4178ae7f878821e7b3a68cafc06a8474ac29a73b0 MATIC0.001068352545 32.144438134
0xf5277bedc5ac4af4eb76d08cbd4ecba881719c9db9e866064a116aba4499aed0Topup Vesting Ba...269162182022-04-09 4:41:38125 days 12 hrs ago0x84cc43ffb48779dbd451dd340c5f7fd09f9cee06 IN  0x4178ae7f878821e7b3a68cafc06a8474ac29a73b0 MATIC0.001395912 42
0x32acfd945acfebc4aec2fcbf6e6e26383b2ccfe1ba0cc97456c6ed21fc975bcdTopup Vesting Ba...269162182022-04-09 4:41:38125 days 12 hrs ago0x84cc43ffb48779dbd451dd340c5f7fd09f9cee06 IN  0x4178ae7f878821e7b3a68cafc06a8474ac29a73b0 MATIC0.0013028512 39.200000005
0x686aa9dad5da4cfad021e84fa154d0079ec345a883e26f7b9092fc58ed6f50e5Topup Vesting Ba...269162182022-04-09 4:41:38125 days 12 hrs ago0x84cc43ffb48779dbd451dd340c5f7fd09f9cee06 IN  0x4178ae7f878821e7b3a68cafc06a8474ac29a73b0 MATIC0.001217311545 36.626295134
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DoubleDiceTokenLocking

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 6 : DoubleDiceTokenLocking.sol
// SPDX-License-Identifier: Unlicensed
pragma solidity 0.8.6;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";

contract DoubleDiceTokenLocking is Ownable {

    using SafeERC20 for IERC20;

    IERC20 public token;

    uint256 public minLockDuration = 90 days;
    uint256 public minLockAmount;
    uint16 public constant MAX_LOCK_AMOUNT_TOPUP_MULTIPLIER = 6;

    struct LockedAsset {
        uint256 amount;
        uint256 startTime;
        uint256 expiryTime;
        bool    claimed;
    }

    struct UserVestedBaseLockInfo {
        bytes32 lockId;
        uint256 initialAmount;
        uint256 updatedAmount;
        bool    isWhitelisted; 
        bool    hasReservedLock; 
    }

    mapping(address => mapping(bytes32 => LockedAsset)) public lockedAsset;
    mapping(address => UserVestedBaseLockInfo) public userVestedBaseLockInfo;
    mapping(bytes32 => address) public lockIdOwners;
    
    event Claim(
        bytes32 indexed lockId, 
        address indexed beneficiary
    );
    
    event Lock(
        bytes32 indexed lockId, 
        address indexed beneficiary, 
        uint256 amount,
        uint256 startTime,
        uint256 expiryTime,
        bool    isVested
    );    
    
    event TopupVestingBasedLock(
        bytes32 indexed lockId, 
        address indexed beneficiary, 
        uint256 amount
    );    
    
    event UpdateLockExpiry(
        bytes32 indexed lockId, 
        address indexed beneficiary, 
        uint256 oldExpiryTime,
        uint256 newExpiryTime
    );
    
    modifier onlyLockOwner(bytes32 lockId) {
        require(lockedAsset[msg.sender][lockId].expiryTime != 0, "LockId does not belong to sender");
        _;
    }   
    
    constructor(
        address tokenAddress,
        uint256 minLockAmount_
    ) {
        require(tokenAddress != address(0), "Not a valid token address");
        require(minLockAmount_ != 0, "Minimum lock amount must not be equal to zero");
        token = IERC20(tokenAddress);
        minLockAmount = minLockAmount_;
    }

    function createLock(uint256 amount, uint256 expiryTime) external {
        require(expiryTime != 0, "Expiry must not be equal to zero");
        require(expiryTime >= (block.timestamp + minLockDuration), "Expiry time is too low");
        
        require(amount >= minLockAmount, "Token amount is too low");
        
        bytes32 nextLockId = keccak256(abi.encode(amount, expiryTime, msg.sender, block.timestamp));

        require(lockIdOwners[nextLockId] == address(0), "User with this lock id already created");
        
        lockIdOwners[nextLockId] = msg.sender;

        lockedAsset[msg.sender][nextLockId] = LockedAsset({
            amount: amount,
            startTime: block.timestamp,
            expiryTime: expiryTime,
            claimed: false
        });
        token.transferFrom(msg.sender, address(this), amount);
        emit Lock(nextLockId, msg.sender, amount, block.timestamp, expiryTime, false);
        
    }

    function createVestingBasedLock(uint256 amount, uint256 expiryTime) external {
        
        require(expiryTime != 0, "Expiry must not be equal to zero");
        require(expiryTime >= (block.timestamp + minLockDuration), "Expiry time is too low");
        require(amount >= minLockAmount, "Token amount is too low");
        require(userVestedBaseLockInfo[msg.sender].isWhitelisted, "Sender is not whitelisted");
        require(!userVestedBaseLockInfo[msg.sender].hasReservedLock, "Sender already have a reserved lock");

        bytes32 nextLockId = keccak256(abi.encode(amount, expiryTime, msg.sender, block.timestamp));
        require(lockIdOwners[nextLockId] == address(0), "User with this lock id already created");
        
        userVestedBaseLockInfo[msg.sender].lockId = nextLockId;
        userVestedBaseLockInfo[msg.sender].hasReservedLock = true;
        lockIdOwners[nextLockId] = msg.sender;
            
        userVestedBaseLockInfo[msg.sender].initialAmount = amount;
        userVestedBaseLockInfo[msg.sender].updatedAmount = amount;

        lockedAsset[msg.sender][nextLockId] = LockedAsset({
            amount: amount,
            startTime: block.timestamp,
            expiryTime: expiryTime,
            claimed: false
        });

       token.transferFrom(msg.sender, address(this), amount);

       emit Lock(
           nextLockId, 
           msg.sender, 
           amount, 
           block.timestamp, 
           expiryTime,
           true
       );
        
    }

    function topupVestingBasedLock(bytes32 lockId, uint256 amount) external onlyLockOwner(lockId) {
        UserVestedBaseLockInfo storage _userVestedBaseLockInfo = userVestedBaseLockInfo[msg.sender];
        require(_userVestedBaseLockInfo.lockId == lockId, "Invalid Lock id");
        require(_userVestedBaseLockInfo.hasReservedLock, "Sender does not have a reserved lock");
        require((MAX_LOCK_AMOUNT_TOPUP_MULTIPLIER * _userVestedBaseLockInfo.initialAmount) >= (_userVestedBaseLockInfo.updatedAmount + amount), "Amount exceed the reserved amount");

       _userVestedBaseLockInfo.updatedAmount = _userVestedBaseLockInfo.updatedAmount + amount;
       lockedAsset[msg.sender][lockId].amount = lockedAsset[msg.sender][lockId].amount + amount;

       token.transferFrom(msg.sender, address(this), amount);

       emit TopupVestingBasedLock(
           lockId, 
           msg.sender, 
           amount
       );
        
    }


    function claim(bytes32 lockId) external onlyLockOwner(lockId) {
        
        LockedAsset storage _lockedAsset = lockedAsset[msg.sender][lockId];
        
        require(block.timestamp >= _lockedAsset.expiryTime, "Asset have not expired");
        require(!_lockedAsset.claimed, "Asset have already been claimed");
        
        _lockedAsset.claimed = true;
        
        token.transfer(msg.sender, _lockedAsset.amount);
        
        emit Claim(
            lockId,
            msg.sender
        );
        
    }

    function updateLockExpiry(bytes32 lockId, uint256 newExpiryTime) external onlyLockOwner(lockId) {
        LockedAsset storage _lockedAsset = lockedAsset[msg.sender][lockId];
        uint256 oldExpiryTime = _lockedAsset.expiryTime;
        
        require(!_lockedAsset.claimed, "Asset have already been claimed");
        require(newExpiryTime > oldExpiryTime, "Low new expiry date");
        
        _lockedAsset.expiryTime = newExpiryTime;
        
        emit UpdateLockExpiry(
            lockId, 
            msg.sender, 
            oldExpiryTime,
            newExpiryTime
        );
        
    }
    
    function addToWhiteList(address user) external onlyOwner {
        require(!userVestedBaseLockInfo[user].isWhitelisted, "User already whitelisted");
        userVestedBaseLockInfo[user].isWhitelisted = true;
    }    

    function updateMinLockDuration(uint256 newLockDuration) external onlyOwner {
        require(newLockDuration != 0, "New lock duration can not be equal to zero");
        minLockDuration = newLockDuration;
    }

    function updateMinLockAmount(uint256 newMinLockAmount) external onlyOwner {
        require(newMinLockAmount != 0, "New lock amount can not be equal to zero");
        minLockAmount = newMinLockAmount;
    }

    function getlockIdOwners(bytes32 lockId) external view returns(address) {
        return lockIdOwners[lockId];
    }

    function getLockDetails(address user, bytes32 lockId) external view returns(LockedAsset memory) {
        return lockedAsset[user][lockId];
    }
    
    function getUserVestedBaseLockInfo(address user) external view returns(UserVestedBaseLockInfo memory) {
        return userVestedBaseLockInfo[user];
    }
    
    

}

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

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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

pragma solidity ^0.8.0;

import "../IERC20.sol";
import "../../../utils/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'
        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
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

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

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 5 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 6 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;
        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");

        (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");

        (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");

        (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");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal 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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"minLockAmount_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"lockId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"lockId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"expiryTime","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isVested","type":"bool"}],"name":"Lock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"lockId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TopupVestingBasedLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"lockId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldExpiryTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newExpiryTime","type":"uint256"}],"name":"UpdateLockExpiry","type":"event"},{"inputs":[],"name":"MAX_LOCK_AMOUNT_TOPUP_MULTIPLIER","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"addToWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"lockId","type":"bytes32"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"expiryTime","type":"uint256"}],"name":"createLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"expiryTime","type":"uint256"}],"name":"createVestingBasedLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bytes32","name":"lockId","type":"bytes32"}],"name":"getLockDetails","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"expiryTime","type":"uint256"},{"internalType":"bool","name":"claimed","type":"bool"}],"internalType":"struct DoubleDiceTokenLocking.LockedAsset","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserVestedBaseLockInfo","outputs":[{"components":[{"internalType":"bytes32","name":"lockId","type":"bytes32"},{"internalType":"uint256","name":"initialAmount","type":"uint256"},{"internalType":"uint256","name":"updatedAmount","type":"uint256"},{"internalType":"bool","name":"isWhitelisted","type":"bool"},{"internalType":"bool","name":"hasReservedLock","type":"bool"}],"internalType":"struct DoubleDiceTokenLocking.UserVestedBaseLockInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"lockId","type":"bytes32"}],"name":"getlockIdOwners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"lockIdOwners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"lockedAsset","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"expiryTime","type":"uint256"},{"internalType":"bool","name":"claimed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minLockAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minLockDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"lockId","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"topupVestingBasedLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"lockId","type":"bytes32"},{"internalType":"uint256","name":"newExpiryTime","type":"uint256"}],"name":"updateLockExpiry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMinLockAmount","type":"uint256"}],"name":"updateMinLockAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLockDuration","type":"uint256"}],"name":"updateMinLockDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userVestedBaseLockInfo","outputs":[{"internalType":"bytes32","name":"lockId","type":"bytes32"},{"internalType":"uint256","name":"initialAmount","type":"uint256"},{"internalType":"uint256","name":"updatedAmount","type":"uint256"},{"internalType":"bool","name":"isWhitelisted","type":"bool"},{"internalType":"bool","name":"hasReservedLock","type":"bool"}],"stateMutability":"view","type":"function"}]

60806040526276a7006002553480156200001857600080fd5b506040516200180c3803806200180c8339810160408190526200003b9162000181565b620000463362000131565b6001600160a01b038216620000a25760405162461bcd60e51b815260206004820152601960248201527f4e6f7420612076616c696420746f6b656e20616464726573730000000000000060448201526064015b60405180910390fd5b80620001075760405162461bcd60e51b815260206004820152602d60248201527f4d696e696d756d206c6f636b20616d6f756e74206d757374206e6f742062652060448201526c657175616c20746f207a65726f60981b606482015260840162000099565b600180546001600160a01b0319166001600160a01b039390931692909217909155600355620001bd565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080604083850312156200019557600080fd5b82516001600160a01b0381168114620001ad57600080fd5b6020939093015192949293505050565b61163f80620001cd6000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c806399790b75116100b8578063d00aeaea1161007c578063d00aeaea146103cc578063d6a298e914610431578063e3c4615d1461043a578063e63733c414610482578063f2fde38b14610495578063fc0c546a146104a857600080fd5b806399790b751461036d578063b52c05fe14610380578063b601c7d414610393578063bd66528a146103a6578063cfb0c3fe146103b957600080fd5b80636d825572116100ff5780636d825572146102fd578063715018a6146103265780637c0eb05e1461032e5780637c306121146103415780638da5cb5b1461035c57600080fd5b8063088042751461013c5780632358c8e11461015857806325be8eee146101c557806347ee0394146102a7578063618ca972146102bc575b600080fd5b61014560035481565b6040519081526020015b60405180910390f35b610199610166366004611463565b60056020526000908152604090208054600182015460028301546003909301549192909160ff8082169161010090041685565b60408051958652602086019490945292840191909152151560608301521515608082015260a00161014f565b6102616101d3366004611463565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506001600160a01b0316600090815260056020908152604091829020825160a0810184528154815260018201549281019290925260028101549282019290925260039091015460ff80821615156060840152610100909104161515608082015290565b60405161014f9190600060a08201905082518252602083015160208301526040830151604083015260608301511515606083015260808301511515608083015292915050565b6102ba6102b5366004611463565b6104bb565b005b6102e56102ca3660046114d1565b6006602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161014f565b6102e561030b3660046114d1565b6000908152600660205260409020546001600160a01b031690565b6102ba610581565b6102ba61033c3660046114ea565b6105b7565b610349600681565b60405161ffff909116815260200161014f565b6000546001600160a01b03166102e5565b6102ba61037b3660046114ea565b610842565b6102ba61038e3660046114ea565b610bfc565b6102ba6103a13660046114d1565b610eb2565b6102ba6103b43660046114d1565b610f3f565b6102ba6103c73660046114ea565b611101565b61040f6103da366004611485565b600460209081526000928352604080842090915290825290208054600182015460028301546003909301549192909160ff1684565b604080519485526020850193909352918301521515606082015260800161014f565b61014560025481565b61044d610448366004611485565b611241565b60405161014f919081518152602080830151908201526040808301519082015260609182015115159181019190915260800190565b6102ba6104903660046114d1565b6112cd565b6102ba6104a3366004611463565b61135c565b6001546102e5906001600160a01b031681565b6000546001600160a01b031633146104ee5760405162461bcd60e51b81526004016104e590611541565b60405180910390fd5b6001600160a01b03811660009081526005602052604090206003015460ff161561055a5760405162461bcd60e51b815260206004820152601860248201527f5573657220616c72656164792077686974656c6973746564000000000000000060448201526064016104e5565b6001600160a01b03166000908152600560205260409020600301805460ff19166001179055565b6000546001600160a01b031633146105ab5760405162461bcd60e51b81526004016104e590611541565b6105b560006113f7565b565b33600090815260046020908152604080832085845290915290206002015482906105f35760405162461bcd60e51b81526004016104e59061150c565b336000908152600560205260409020805484146106445760405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a5908131bd8dac81a59608a1b60448201526064016104e5565b6003810154610100900460ff166106a95760405162461bcd60e51b8152602060048201526024808201527f53656e64657220646f6573206e6f7420686176652061207265736572766564206044820152636c6f636b60e01b60648201526084016104e5565b8281600201546106b991906115bc565b60018201546106c99060066115d4565b10156107215760405162461bcd60e51b815260206004820152602160248201527f416d6f756e74206578636565642074686520726573657276656420616d6f756e6044820152601d60fa1b60648201526084016104e5565b82816002015461073191906115bc565b600282015533600090815260046020908152604080832087845290915290205461075c9084906115bc565b3360008181526004602081815260408084208a8552909152918290209390935560015490516323b872dd60e01b815292830191909152306024830152604482018590526001600160a01b0316906323b872dd90606401602060405180830381600087803b1580156107cc57600080fd5b505af11580156107e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080491906114af565b50604051838152339085907ff86e971a0e1dc0bdd42108d2ccc523caf558d8d3074df75e358f41c86f73d3f99060200160405180910390a350505050565b8061088f5760405162461bcd60e51b815260206004820181905260248201527f457870697279206d757374206e6f7420626520657175616c20746f207a65726f60448201526064016104e5565b60025461089c90426115bc565b8110156108e45760405162461bcd60e51b81526020600482015260166024820152754578706972792074696d6520697320746f6f206c6f7760501b60448201526064016104e5565b6003548210156109305760405162461bcd60e51b8152602060048201526017602482015276546f6b656e20616d6f756e7420697320746f6f206c6f7760481b60448201526064016104e5565b3360009081526005602052604090206003015460ff166109925760405162461bcd60e51b815260206004820152601960248201527f53656e646572206973206e6f742077686974656c69737465640000000000000060448201526064016104e5565b33600090815260056020526040902060030154610100900460ff1615610a065760405162461bcd60e51b815260206004820152602360248201527f53656e64657220616c726561647920686176652061207265736572766564206c6044820152626f636b60e81b60648201526084016104e5565b604080516020810184905290810182905233606082015242608082015260009060a00160408051601f198184030181529181528151602092830120600081815260069093529120549091506001600160a01b031615610a775760405162461bcd60e51b81526004016104e590611576565b3360008181526005602090815260408083208581556003808201805461010061ff00199091161790558685526006845282852080546001600160a01b0319168717905560018083018a905560029283018a905583516080810185528a8152428187019081528186018b8152606083018981528a8a526004808a52888b208d8c529099529887902092518355905182840155519381019390935594519101805460ff1916911515919091179055915491516323b872dd60e01b815290810192909252306024830152604482018590526001600160a01b0316906323b872dd90606401602060405180830381600087803b158015610b7257600080fd5b505af1158015610b86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610baa91906114af565b506040805184815242602082015290810183905260016060820152339082907feb7a06ab815909906827f30c2d47b2a88d752ba80416bc11694eaae184c02ae1906080015b60405180910390a3505050565b80610c495760405162461bcd60e51b815260206004820181905260248201527f457870697279206d757374206e6f7420626520657175616c20746f207a65726f60448201526064016104e5565b600254610c5690426115bc565b811015610c9e5760405162461bcd60e51b81526020600482015260166024820152754578706972792074696d6520697320746f6f206c6f7760501b60448201526064016104e5565b600354821015610cea5760405162461bcd60e51b8152602060048201526017602482015276546f6b656e20616d6f756e7420697320746f6f206c6f7760481b60448201526064016104e5565b604080516020810184905290810182905233606082015242608082015260009060a00160408051601f198184030181529181528151602092830120600081815260069093529120549091506001600160a01b031615610d5b5760405162461bcd60e51b81526004016104e590611576565b60008181526006602090815260408083208054336001600160a01b031990911681179091558151608081018352878152428185019081528184018881526060830187815284885260048088528689208a8a52909752968590209251835590516001838101919091559051600283015594516003909101805460ff1916911515919091179055925490516323b872dd60e01b815291820192909252306024820152604481018590526001600160a01b03909116906323b872dd90606401602060405180830381600087803b158015610e3157600080fd5b505af1158015610e45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6991906114af565b506040805184815242602082015290810183905260006060820152339082907feb7a06ab815909906827f30c2d47b2a88d752ba80416bc11694eaae184c02ae190608001610bef565b6000546001600160a01b03163314610edc5760405162461bcd60e51b81526004016104e590611541565b80610f3a5760405162461bcd60e51b815260206004820152602860248201527f4e6577206c6f636b20616d6f756e742063616e206e6f7420626520657175616c60448201526720746f207a65726f60c01b60648201526084016104e5565b600355565b3360009081526004602090815260408083208484529091529020600201548190610f7b5760405162461bcd60e51b81526004016104e59061150c565b33600090815260046020908152604080832085845290915290206002810154421015610fe25760405162461bcd60e51b8152602060048201526016602482015275105cdcd95d081a185d99481b9bdd08195e1c1a5c995960521b60448201526064016104e5565b600381015460ff16156110375760405162461bcd60e51b815260206004820152601f60248201527f4173736574206861766520616c7265616479206265656e20636c61696d65640060448201526064016104e5565b60038101805460ff1916600190811790915554815460405163a9059cbb60e01b815233600482015260248101919091526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b15801561109657600080fd5b505af11580156110aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ce91906114af565b50604051339084907f15d625b4b35864ffb5bdbb3fc4b62ceb07b3c588af6945a1934ccb822a23975590600090a3505050565b336000908152600460209081526040808320858452909152902060020154829061113d5760405162461bcd60e51b81526004016104e59061150c565b33600090815260046020908152604080832086845290915290206002810154600382015460ff16156111b15760405162461bcd60e51b815260206004820152601f60248201527f4173736574206861766520616c7265616479206265656e20636c61696d65640060448201526064016104e5565b8084116111f65760405162461bcd60e51b81526020600482015260136024820152724c6f77206e657720657870697279206461746560681b60448201526064016104e5565b600282018490556040805182815260208101869052339187917f946ac51edb23f5ebfed5e122807d9f5d0197fa40a46be33f9391eed09a8a2902910160405180910390a35050505050565b61126e60405180608001604052806000815260200160008152602001600081526020016000151581525090565b506001600160a01b038216600090815260046020908152604080832084845282529182902082516080810184528154815260018201549281019290925260028101549282019290925260039091015460ff161515606082015292915050565b6000546001600160a01b031633146112f75760405162461bcd60e51b81526004016104e590611541565b806113575760405162461bcd60e51b815260206004820152602a60248201527f4e6577206c6f636b206475726174696f6e2063616e206e6f7420626520657175604482015269616c20746f207a65726f60b01b60648201526084016104e5565b600255565b6000546001600160a01b031633146113865760405162461bcd60e51b81526004016104e590611541565b6001600160a01b0381166113eb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104e5565b6113f4816113f7565b50565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80356001600160a01b038116811461145e57600080fd5b919050565b60006020828403121561147557600080fd5b61147e82611447565b9392505050565b6000806040838503121561149857600080fd5b6114a183611447565b946020939093013593505050565b6000602082840312156114c157600080fd5b8151801515811461147e57600080fd5b6000602082840312156114e357600080fd5b5035919050565b600080604083850312156114fd57600080fd5b50508035926020909101359150565b6020808252818101527f4c6f636b496420646f6573206e6f742062656c6f6e6720746f2073656e646572604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526026908201527f5573657220776974682074686973206c6f636b20696420616c726561647920636040820152651c99585d195960d21b606082015260800190565b600082198211156115cf576115cf6115f3565b500190565b60008160001904831182151516156115ee576115ee6115f3565b500290565b634e487b7160e01b600052601160045260246000fdfea26469706673582212209259ddaf34a302a1bce8963ebc11d712672a05e9bd032a325b40cf1cc48ba1ec64736f6c634300080600330000000000000000000000005b03ac408938c97e50db3bc5675d182606a013770000000000000000000000000000000000000000000069e10de76676d0800000

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

0000000000000000000000005b03ac408938c97e50db3bc5675d182606a013770000000000000000000000000000000000000000000069e10de76676d0800000

-----Decoded View---------------
Arg [0] : tokenAddress (address): 0x5b03ac408938c97e50db3bc5675d182606a01377
Arg [1] : minLockAmount_ (uint256): 500000000000000000000000

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000005b03ac408938c97e50db3bc5675d182606a01377
Arg [1] : 0000000000000000000000000000000000000000000069e10de76676d0800000


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.