More Info
Private Name Tags
ContractCreator
Multi Chain
Multichain Addresses
15 addresses found via
Latest 25 from a total of 442 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Unlock | 18173869 | 11 days 14 hrs ago | IN | 0 ETH | 0.00131826 | ||||
Unlock | 17911760 | 48 days 7 hrs ago | IN | 0 ETH | 0.00224459 | ||||
Unlock | 17758368 | 69 days 18 hrs ago | IN | 0 ETH | 0.00257963 | ||||
Unlock | 17695152 | 78 days 15 hrs ago | IN | 0 ETH | 0.00199149 | ||||
Edit Lock | 17537116 | 100 days 20 hrs ago | IN | 0 ETH | 0.0017783 | ||||
Unlock | 17385720 | 122 days 3 hrs ago | IN | 0 ETH | 0.00284873 | ||||
Unlock | 17268641 | 138 days 15 hrs ago | IN | 0 ETH | 0.00503466 | ||||
Edit Lock | 17175584 | 151 days 18 hrs ago | IN | 0 ETH | 0.00418038 | ||||
Unlock | 17174653 | 151 days 21 hrs ago | IN | 0 ETH | 0.01171855 | ||||
Unlock | 17140106 | 156 days 18 hrs ago | IN | 0 ETH | 0.00392409 | ||||
Lock | 17115615 | 160 days 4 hrs ago | IN | 0 ETH | 0.01804808 | ||||
Unlock | 17068094 | 166 days 21 hrs ago | IN | 0 ETH | 0.00391616 | ||||
Lock | 17060096 | 168 days 58 mins ago | IN | 0 ETH | 0.01129692 | ||||
Lock | 17059385 | 168 days 3 hrs ago | IN | 0 ETH | 0.01221307 | ||||
Lock | 17059104 | 168 days 4 hrs ago | IN | 0 ETH | 0.01129278 | ||||
Unlock | 16976844 | 179 days 22 hrs ago | IN | 0 ETH | 0.00375941 | ||||
Unlock | 16955692 | 182 days 22 hrs ago | IN | 0 ETH | 0.00347957 | ||||
Unlock | 16860810 | 196 days 6 hrs ago | IN | 0 ETH | 0.00145678 | ||||
Unlock | 16730571 | 214 days 13 hrs ago | IN | 0 ETH | 0.00254187 | ||||
Unlock | 16665378 | 223 days 17 hrs ago | IN | 0 ETH | 0.00209188 | ||||
Unlock | 16665376 | 223 days 17 hrs ago | IN | 0 ETH | 0.00226762 | ||||
Unlock | 16665343 | 223 days 18 hrs ago | IN | 0 ETH | 0.00457226 | ||||
Unlock | 16581034 | 235 days 13 hrs ago | IN | 0 ETH | 0.00358808 | ||||
Edit Lock | 16563386 | 238 days 30 mins ago | IN | 0 ETH | 0.00091639 | ||||
Edit Lock | 16563384 | 238 days 30 mins ago | IN | 0 ETH | 0.0009311 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
PinkLock
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity =0.8.4; import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; import "@openzeppelin/contracts-upgradeable/utils/structs/EnumerableSetUpgradeable.sol"; import "./interfaces/IUniswapV2Router02.sol"; import "./interfaces/IUniswapV2Pair.sol"; import "./interfaces/IUniswapV2Factory.sol"; import "./interfaces/IPoolManager.sol"; import "./interfaces/IPinkLock.sol"; contract PinkLock is IPinkLock { using AddressUpgradeable for address payable; using EnumerableSetUpgradeable for EnumerableSetUpgradeable.AddressSet; using EnumerableSetUpgradeable for EnumerableSetUpgradeable.UintSet; using SafeERC20Upgradeable for IERC20Upgradeable; struct Lock { uint256 id; address token; address owner; uint256 amount; uint256 lockDate; uint256 unlockDate; } struct CumulativeLockInfo { address token; address factory; uint256 amount; } Lock[] private _locks; mapping(address => EnumerableSetUpgradeable.UintSet) private _userLpLockIds; mapping(address => EnumerableSetUpgradeable.UintSet) private _userNormalLockIds; EnumerableSetUpgradeable.AddressSet private _lpLockedTokens; EnumerableSetUpgradeable.AddressSet private _normalLockedTokens; mapping(address => CumulativeLockInfo) public cumulativeLockInfo; mapping(address => EnumerableSetUpgradeable.UintSet) private _tokenToLockIds; event LockAdded( uint256 indexed id, address token, address owner, uint256 amount, uint256 unlockDate ); event LockUpdated( uint256 indexed id, address token, address owner, uint256 newAmount, uint256 newUnlockDate ); event LockRemoved( uint256 indexed id, address token, address owner, uint256 amount, uint256 unlockedAt ); modifier validLock(uint256 lockId) { require(lockId < _locks.length, "Invalid lock id"); _; } function lock( address owner, address token, bool isLpToken, uint256 amount, uint256 unlockDate ) external payable override returns (uint256 id) { require( unlockDate > block.timestamp, "Unlock date should be after current time" ); require(amount > 0, "Amount should be greater than 0"); if (isLpToken) { address possibleFactoryAddress; try IUniswapV2Pair(token).factory() returns (address factory) { possibleFactoryAddress = factory; } catch { revert("This token is not a LP token"); } require( possibleFactoryAddress != address(0) && _isValidLpToken(token, possibleFactoryAddress), "This token is not a LP token." ); id = _lockLpToken( owner, token, possibleFactoryAddress, amount, unlockDate ); } else { id = _lockNormalToken(owner, token, amount, unlockDate); } safeTransferFromEnsureExactAmount(token, msg.sender, address(this), amount); emit LockAdded(id, token, owner, amount, unlockDate); return id; } function _lockLpToken( address owner, address token, address factory, uint256 amount, uint256 unlockDate ) private returns (uint256 id) { id = _addLock(owner, token, amount, unlockDate); _userLpLockIds[owner].add(id); _lpLockedTokens.add(token); CumulativeLockInfo storage tokenInfo = cumulativeLockInfo[token]; if (tokenInfo.token == address(0)) { tokenInfo.token = token; tokenInfo.factory = factory; } tokenInfo.amount = tokenInfo.amount + amount; _tokenToLockIds[token].add(id); } function _lockNormalToken( address owner, address token, uint256 amount, uint256 unlockDate ) private returns (uint256 id) { id = _addLock(owner, token, amount, unlockDate); _userNormalLockIds[owner].add(id); _normalLockedTokens.add(token); CumulativeLockInfo storage tokenInfo = cumulativeLockInfo[token]; if (tokenInfo.token == address(0)) { tokenInfo.token = token; tokenInfo.factory = address(0); } tokenInfo.amount = tokenInfo.amount + amount; _tokenToLockIds[token].add(id); } function _addLock( address owner, address token, uint256 amount, uint256 unlockDate ) private returns (uint256 id) { id = _locks.length; Lock memory newLock = Lock({ id: id, token: token, owner: owner, amount: amount, lockDate: block.timestamp, unlockDate: unlockDate }); _locks.push(newLock); } function unlock(uint256 lockId) external override validLock(lockId) { Lock storage userLock = _locks[lockId]; require(userLock.owner == msg.sender, "You are not the owner of this lock"); require(block.timestamp >= userLock.unlockDate, "It is not time to unlock"); require(userLock.amount > 0, "Nothing to unlock"); CumulativeLockInfo storage tokenInfo = cumulativeLockInfo[userLock.token]; bool isLpToken = tokenInfo.factory != address(0); if (isLpToken) { _userLpLockIds[msg.sender].remove(lockId); } else { _userNormalLockIds[msg.sender].remove(lockId); } uint256 unlockAmount = userLock.amount; if (tokenInfo.amount <= unlockAmount) { tokenInfo.amount = 0; } else { tokenInfo.amount = tokenInfo.amount - unlockAmount; } if (tokenInfo.amount == 0) { if (isLpToken) { _lpLockedTokens.remove(userLock.token); } else { _normalLockedTokens.remove(userLock.token); } } userLock.amount = 0; _tokenToLockIds[userLock.token].remove(userLock.id); IERC20Upgradeable(userLock.token).safeTransfer(msg.sender, unlockAmount); emit LockRemoved( userLock.id, userLock.token, msg.sender, unlockAmount, block.timestamp ); } function editLock( uint256 lockId, uint256 newAmount, uint256 newUnlockDate ) external payable override validLock(lockId) { Lock storage userLock = _locks[lockId]; require(userLock.owner == msg.sender, "You are not the owner of this lock"); require(userLock.amount > 0, "Lock was unlocked"); if (newUnlockDate > 0) { require( newUnlockDate >= userLock.unlockDate && newUnlockDate > block.timestamp, "New unlock time should not be before old unlock time or current time" ); userLock.unlockDate = newUnlockDate; } if (newAmount > 0) { require( newAmount >= userLock.amount, "New amount should not be less than current amount" ); uint256 diff = newAmount - userLock.amount; if (diff > 0) { safeTransferFromEnsureExactAmount( userLock.token, msg.sender, address(this), diff ); userLock.amount = newAmount; CumulativeLockInfo storage tokenInfo = cumulativeLockInfo[ userLock.token ]; tokenInfo.amount = tokenInfo.amount + diff; } } emit LockUpdated( userLock.id, userLock.token, userLock.owner, userLock.amount, userLock.unlockDate ); } function safeTransferFromEnsureExactAmount( address token, address sender, address recipient, uint256 amount ) internal { uint256 oldRecipientBalance = IERC20Upgradeable(token).balanceOf(recipient); IERC20Upgradeable(token).safeTransferFrom(sender, recipient, amount); uint256 newRecipientBalance = IERC20Upgradeable(token).balanceOf(recipient); require( newRecipientBalance - oldRecipientBalance == amount, "Not enough token was transfered" ); } function allLocks() public view returns (Lock[] memory) { return _locks; } function getTotalLockCount() public view returns (uint256) { return _locks.length; } function getLock(uint256 index) public view returns (Lock memory) { return _locks[index]; } function allLpTokenLockedCount() public view returns (uint256) { return _lpLockedTokens.length(); } function allNormalTokenLockedCount() public view returns (uint256) { return _normalLockedTokens.length(); } function getCumulativeLpTokenLockInfoAt(uint256 index) public view returns (CumulativeLockInfo memory) { return cumulativeLockInfo[_lpLockedTokens.at(index)]; } function getCumulativeNormalTokenLockInfoAt(uint256 index) public view returns (CumulativeLockInfo memory) { return cumulativeLockInfo[_normalLockedTokens.at(index)]; } function getCumulativeLpTokenLockInfo(uint256 start, uint256 end) public view returns (CumulativeLockInfo[] memory) { if (end >= _lpLockedTokens.length()) { end = _lpLockedTokens.length() - 1; } uint256 length = end - start + 1; CumulativeLockInfo[] memory lockInfo = new CumulativeLockInfo[](length); uint256 currentIndex = 0; for (uint256 i = start; i <= end; i++) { lockInfo[currentIndex] = cumulativeLockInfo[_lpLockedTokens.at(i)]; currentIndex++; } return lockInfo; } function getCumulativeNormalTokenLockInfo(uint256 start, uint256 end) public view returns (CumulativeLockInfo[] memory) { if (end >= _normalLockedTokens.length()) { end = _normalLockedTokens.length() - 1; } uint256 length = end - start + 1; CumulativeLockInfo[] memory lockInfo = new CumulativeLockInfo[](length); uint256 currentIndex = 0; for (uint256 i = start; i <= end; i++) { lockInfo[currentIndex] = cumulativeLockInfo[_normalLockedTokens.at(i)]; currentIndex++; } return lockInfo; } function totalTokenLockedCount() public view returns (uint256) { return allLpTokenLockedCount() + allNormalTokenLockedCount(); } function lpLockCountForUser(address user) public view returns (uint256) { return _userLpLockIds[user].length(); } function lpLocksForUser(address user) public view returns (Lock[] memory) { uint256 length = _userLpLockIds[user].length(); Lock[] memory userLocks = new Lock[](length); for (uint256 i = 0; i < length; i++) { userLocks[i] = _locks[_userLpLockIds[user].at(i)]; } return userLocks; } function lpLockForUserAtIndex(address user, uint256 index) public view returns (Lock memory) { require(lpLockCountForUser(user) > index, "Invalid index"); return _locks[_userLpLockIds[user].at(index)]; } function normalLockCountForUser(address user) public view returns (uint256) { return _userNormalLockIds[user].length(); } function normalLocksForUser(address user) public view returns (Lock[] memory) { uint256 length = _userNormalLockIds[user].length(); Lock[] memory userLocks = new Lock[](length); for (uint256 i = 0; i < length; i++) { userLocks[i] = _locks[_userNormalLockIds[user].at(i)]; } return userLocks; } function normalLockForUserAtIndex(address user, uint256 index) public view returns (Lock memory) { require(normalLockCountForUser(user) > index, "Invalid index"); return _locks[_userNormalLockIds[user].at(index)]; } function totalLockCountForUser(address user) public view returns (uint256) { return normalLockCountForUser(user) + lpLockCountForUser(user); } function totalLockCountForToken(address token) public view returns (uint256) { return _tokenToLockIds[token].length(); } function getLocksForToken( address token, uint256 start, uint256 end ) public view returns (Lock[] memory) { if (end >= _tokenToLockIds[token].length()) { end = _tokenToLockIds[token].length() - 1; } uint256 length = end - start + 1; Lock[] memory locks = new Lock[](length); uint256 currentIndex = 0; for (uint256 i = start; i <= end; i++) { locks[currentIndex] = _locks[_tokenToLockIds[token].at(i)]; currentIndex++; } return locks; } function _isValidLpToken(address token, address factory) private view returns (bool) { IUniswapV2Pair pair = IUniswapV2Pair(token); address factoryPair = IUniswapV2Factory(factory).getPair( pair.token0(), pair.token1() ); return factoryPair == token; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @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 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); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC20Upgradeable.sol"; import "../../../utils/AddressUpgradeable.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 SafeERC20Upgradeable { using AddressUpgradeable for address; function safeTransfer( IERC20Upgradeable token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20Upgradeable 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( IERC20Upgradeable 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( IERC20Upgradeable 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( IERC20Upgradeable 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(IERC20Upgradeable 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"); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSetUpgradeable { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly { result := store } return result; } }
// SPDX-License-Identifier: MIT pragma solidity =0.8.4; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); } interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; }
// SPDX-License-Identifier: MIT pragma solidity =0.8.4; interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint256 value); event Transfer(address indexed from, address indexed to, uint256 value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn( address indexed sender, uint256 amount0, uint256 amount1, address indexed to ); event Swap( address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns ( uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast ); function price0CumulativeLast() external view returns (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize(address, address) external; }
// SPDX-License-Identifier: MIT pragma solidity =0.8.4; interface IUniswapV2Factory { event PairCreated( address indexed token0, address indexed token1, address pair, uint256 ); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint256) external view returns (address pair); function allPairsLength() external view returns (uint256); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; }
// SPDX-License-Identifier: MIT pragma solidity =0.8.4; interface IPoolManager { function isPoolGenerated(address pool) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity =0.8.4; interface IPinkLock { function lock( address owner, address token, bool isLpToken, uint256 amount, uint256 unlockDate ) external payable returns (uint256 id); function unlock(uint256 lockId) external; function editLock( uint256 lockId, uint256 newAmount, uint256 newUnlockDate ) external payable; }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unlockDate","type":"uint256"}],"name":"LockAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unlockedAt","type":"uint256"}],"name":"LockRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newUnlockDate","type":"uint256"}],"name":"LockUpdated","type":"event"},{"inputs":[],"name":"allLocks","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lockDate","type":"uint256"},{"internalType":"uint256","name":"unlockDate","type":"uint256"}],"internalType":"struct PinkLock.Lock[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allLpTokenLockedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allNormalTokenLockedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"cumulativeLockInfo","outputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"factory","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"lockId","type":"uint256"},{"internalType":"uint256","name":"newAmount","type":"uint256"},{"internalType":"uint256","name":"newUnlockDate","type":"uint256"}],"name":"editLock","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"getCumulativeLpTokenLockInfo","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"factory","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct PinkLock.CumulativeLockInfo[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getCumulativeLpTokenLockInfoAt","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"factory","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct PinkLock.CumulativeLockInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"getCumulativeNormalTokenLockInfo","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"factory","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct PinkLock.CumulativeLockInfo[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getCumulativeNormalTokenLockInfoAt","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"factory","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct PinkLock.CumulativeLockInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getLock","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lockDate","type":"uint256"},{"internalType":"uint256","name":"unlockDate","type":"uint256"}],"internalType":"struct PinkLock.Lock","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"getLocksForToken","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lockDate","type":"uint256"},{"internalType":"uint256","name":"unlockDate","type":"uint256"}],"internalType":"struct PinkLock.Lock[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalLockCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"isLpToken","type":"bool"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"unlockDate","type":"uint256"}],"name":"lock","outputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"lpLockCountForUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"lpLockForUserAtIndex","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lockDate","type":"uint256"},{"internalType":"uint256","name":"unlockDate","type":"uint256"}],"internalType":"struct PinkLock.Lock","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"lpLocksForUser","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lockDate","type":"uint256"},{"internalType":"uint256","name":"unlockDate","type":"uint256"}],"internalType":"struct PinkLock.Lock[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"normalLockCountForUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"normalLockForUserAtIndex","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lockDate","type":"uint256"},{"internalType":"uint256","name":"unlockDate","type":"uint256"}],"internalType":"struct PinkLock.Lock","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"normalLocksForUser","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lockDate","type":"uint256"},{"internalType":"uint256","name":"unlockDate","type":"uint256"}],"internalType":"struct PinkLock.Lock[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"totalLockCountForToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"totalLockCountForUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokenLockedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"lockId","type":"uint256"}],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b506127a7806100206000396000f3fe6080604052600436106101405760003560e01c8063aec640c6116100b6578063da1d8cff1161006f578063da1d8cff14610368578063e1444fd614610388578063e3676f88146103f7578063eb80bdae14610417578063eeacf78614610437578063fd981c661461045757600080fd5b8063aec640c6146102c0578063aef0e540146102e0578063b3b9aa4814610300578063b982922e14610313578063cd83eadc14610328578063d68f4dd11461034857600080fd5b8063618df7a311610108578063618df7a3146101e45780636198e3391461021157806364be5b391461023357806376c12822146102465780637e6706d314610273578063a20b8c18146102a057600080fd5b806307873ef1146101455780631982242c14610178578063332f26d71461018d578063475831c8146101ba5780635fbdf739146101cf575b600080fd5b34801561015157600080fd5b50610165610160366004612345565b61046c565b6040519081526020015b60405180910390f35b34801561018457600080fd5b50610165610493565b34801561019957600080fd5b506101ad6101a8366004612402565b6104b4565b60405161016f91906125cb565b3480156101c657600080fd5b50610165610697565b3480156101db57600080fd5b506101ad6106a3565b3480156101f057600080fd5b506102046101ff3660046123d7565b610744565b60405161016f91906126b1565b34801561021d57600080fd5b5061023161022c366004612452565b610843565b005b61016561024136600461237d565b610b08565b34801561025257600080fd5b50610266610261366004612482565b610d59565b60405161016f919061255b565b34801561027f57600080fd5b5061029361028e366004612452565b610ecc565b60405161016f9190612682565b3480156102ac57600080fd5b506102936102bb366004612452565b610f43565b3480156102cc57600080fd5b506102666102db366004612482565b610f6f565b3480156102ec57600080fd5b506101ad6102fb366004612345565b6110d7565b61023161030e3660046124a3565b611259565b34801561031f57600080fd5b50610165611531565b34801561033457600080fd5b50610165610343366004612345565b61153d565b34801561035457600080fd5b50610204610363366004612452565b61155b565b34801561037457600080fd5b506101ad610383366004612345565b6115ed565b34801561039457600080fd5b506103d16103a3366004612345565b6007602052600090815260409020805460018201546002909201546001600160a01b03918216929091169083565b604080516001600160a01b0394851681529390921660208401529082015260600161016f565b34801561040357600080fd5b50610165610412366004612345565b611767565b34801561042357600080fd5b50610165610432366004612345565b611788565b34801561044357600080fd5b506102046104523660046123d7565b6117a9565b34801561046357600080fd5b50600054610165565b6001600160a01b038116600090815260016020526040812061048d9061181a565b92915050565b600061049d610697565b6104a5611531565b6104af91906126bf565b905090565b6001600160a01b03831660009081526008602052604090206060906104d89061181a565b821061050f576001600160a01b03841660009081526008602052604090206001906105029061181a565b61050c91906126d7565b91505b600061051b84846126d7565b6105269060016126bf565b905060008167ffffffffffffffff81111561055157634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561058a57816020015b6105776122fd565b81526020019060019003908161056f5790505b5090506000855b858111610689576001600160a01b03881660009081526008602052604081206105ba9083611824565b815481106105d857634e487b7160e01b600052603260045260246000fd5b60009182526020918290206040805160c08101825260069093029091018054835260018101546001600160a01b0390811694840194909452600281015490931690820152600382015460608201526004820154608082015260059091015460a0820152835184908490811061065d57634e487b7160e01b600052603260045260246000fd5b602002602001018190525081806106739061271a565b92505080806106819061271a565b915050610591565b5090925050505b9392505050565b60006104af600561181a565b60606000805480602002602001604051908101604052809291908181526020016000905b8282101561073b5760008481526020908190206040805160c08101825260068602909201805483526001808201546001600160a01b03908116858701526002830154169284019290925260038101546060840152600481015460808401526005015460a083015290835290920191016106c7565b50505050905090565b61074c6122fd565b8161075684611788565b116107985760405162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b60448201526064015b60405180910390fd5b6001600160a01b03831660009081526002602052604081206107ba9084611824565b815481106107d857634e487b7160e01b600052603260045260246000fd5b60009182526020918290206040805160c08101825260069093029091018054835260018101546001600160a01b0390811694840194909452600281015490931690820152600382015460608201526004820154608082015260059091015460a0820152905092915050565b600054819081106108885760405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a59081b1bd8dac81a59608a1b604482015260640161078f565b60008083815481106108aa57634e487b7160e01b600052603260045260246000fd5b600091825260209091206002600690920201908101549091506001600160a01b031633146108ea5760405162461bcd60e51b815260040161078f90612640565b806005015442101561093e5760405162461bcd60e51b815260206004820152601860248201527f4974206973206e6f742074696d6520746f20756e6c6f636b0000000000000000604482015260640161078f565b60008160030154116109865760405162461bcd60e51b81526020600482015260116024820152704e6f7468696e6720746f20756e6c6f636b60781b604482015260640161078f565b6001808201546001600160a01b0390811660009081526007602052604090209182015416158015906109d1573360009081526001602052604090206109cb9086611830565b506109ec565b3360009081526002602052604090206109ea9086611830565b505b600383015460028301548110610a085760006002840155610a1e565b808360020154610a1891906126d7565b60028401555b6002830154610a69578115610a4d576001840154610a47906003906001600160a01b031661183c565b50610a69565b6001840154610a67906005906001600160a01b031661183c565b505b600060038501819055845460018601546001600160a01b0316825260086020526040909120610a9791611830565b506001840154610ab1906001600160a01b03163383611851565b835460018501546040517fc6532367992b32e42a62dd89fc3574876d97d081a263aa6e030f34b79b7e6e8b91610af8916001600160a01b0390911690339086904290612532565b60405180910390a2505050505050565b6000428211610b6a5760405162461bcd60e51b815260206004820152602860248201527f556e6c6f636b20646174652073686f756c642062652061667465722063757272604482015267656e742074696d6560c01b606482015260840161078f565b60008311610bba5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e742073686f756c642062652067726561746572207468616e203000604482015260640161078f565b8315610cf7576000856001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015610bfb57600080fd5b505afa925050508015610c2b575060408051601f3d908101601f19168201909252610c2891810190612361565b60015b610c775760405162461bcd60e51b815260206004820152601c60248201527f5468697320746f6b656e206973206e6f742061204c5020746f6b656e00000000604482015260640161078f565b90506001600160a01b03811615801590610c965750610c9686826118b9565b610ce25760405162461bcd60e51b815260206004820152601d60248201527f5468697320746f6b656e206973206e6f742061204c5020746f6b656e2e000000604482015260640161078f565b610cef8787838787611a49565b915050610d06565b610d0386868585611b1a565b90505b610d1285333086611be4565b807f694af1cc8727cdd0afbdd53d9b87b69248bd490224e9dd090e788546506e076f86888686604051610d489493929190612532565b60405180910390a295945050505050565b6060610d65600561181a565b8210610d84576001610d77600561181a565b610d8191906126d7565b91505b6000610d9084846126d7565b610d9b9060016126bf565b905060008167ffffffffffffffff811115610dc657634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610e1157816020015b6040805160608101825260008082526020808301829052928201528252600019909201910181610de45790505b5090506000855b858111610ec15760076000610e2e600584611824565b6001600160a01b03908116825260208083019390935260409182016000208251606081018452815483168152600182015490921693820193909352600290920154908201528351849084908110610e9557634e487b7160e01b600052603260045260246000fd5b60200260200101819052508180610eab9061271a565b9250508080610eb99061271a565b915050610e18565b509095945050505050565b604080516060810182526000808252602082018190529181019190915260076000610ef8600585611824565b6001600160a01b039081168252602080830193909352604091820160002082516060810184528154831681526001820154909216938201939093526002909201549082015292915050565b604080516060810182526000808252602082018190529181019190915260076000610ef8600385611824565b6060610f7b600361181a565b8210610f9a576001610f8d600361181a565b610f9791906126d7565b91505b6000610fa684846126d7565b610fb19060016126bf565b905060008167ffffffffffffffff811115610fdc57634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561102757816020015b6040805160608101825260008082526020808301829052928201528252600019909201910181610ffa5790505b5090506000855b858111610ec15760076000611044600384611824565b6001600160a01b039081168252602080830193909352604091820160002082516060810184528154831681526001820154909216938201939093526002909201549082015283518490849081106110ab57634e487b7160e01b600052603260045260246000fd5b602002602001018190525081806110c19061271a565b92505080806110cf9061271a565b91505061102e565b6001600160a01b0381166000908152600160205260408120606091906110fc9061181a565b905060008167ffffffffffffffff81111561112757634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561116057816020015b61114d6122fd565b8152602001906001900390816111455790505b50905060005b82811015611251576001600160a01b03851660009081526001602052604081206111909083611824565b815481106111ae57634e487b7160e01b600052603260045260246000fd5b60009182526020918290206040805160c08101825260069093029091018054835260018101546001600160a01b0390811694840194909452600281015490931690820152600382015460608201526004820154608082015260059091015460a0820152825183908390811061123357634e487b7160e01b600052603260045260246000fd5b602002602001018190525080806112499061271a565b915050611166565b509392505050565b6000548390811061129e5760405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a59081b1bd8dac81a59608a1b604482015260640161078f565b60008085815481106112c057634e487b7160e01b600052603260045260246000fd5b600091825260209091206002600690920201908101549091506001600160a01b031633146113005760405162461bcd60e51b815260040161078f90612640565b60008160030154116113485760405162461bcd60e51b8152602060048201526011602482015270131bd8dac81dd85cc81d5b9b1bd8dad959607a1b604482015260640161078f565b82156113e9578060050154831015801561136157504283115b6113e15760405162461bcd60e51b8152602060048201526044602482018190527f4e657720756e6c6f636b2074696d652073686f756c64206e6f74206265206265908201527f666f7265206f6c6420756e6c6f636b2074696d65206f722063757272656e742060648201526374696d6560e01b608482015260a40161078f565b600581018390555b83156114cd57806003015484101561145d5760405162461bcd60e51b815260206004820152603160248201527f4e657720616d6f756e742073686f756c64206e6f74206265206c657373207468604482015270185b8818dd5c9c995b9d08185b5bdd5b9d607a1b606482015260840161078f565b600081600301548561146f91906126d7565b905080156114cb576001820154611491906001600160a01b0316333084611be4565b6003820185905560018201546001600160a01b0316600090815260076020526040902060028101546114c49083906126bf565b6002909101555b505b805460018201546002830154600384015460058501546040517fa8b26360df8d5e154ffa5a8a7e894e85f781acfbbef0b744fb9551d8fd0fd36c94611522946001600160a01b03918216949116929091612532565b60405180910390a25050505050565b60006104af600361181a565b60006115488261046c565b61155183611788565b61048d91906126bf565b6115636122fd565b6000828154811061158457634e487b7160e01b600052603260045260246000fd5b60009182526020918290206040805160c08101825260069093029091018054835260018101546001600160a01b0390811694840194909452600281015490931690820152600382015460608201526004820154608082015260059091015460a082015292915050565b6001600160a01b0381166000908152600260205260408120606091906116129061181a565b905060008167ffffffffffffffff81111561163d57634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561167657816020015b6116636122fd565b81526020019060019003908161165b5790505b50905060005b82811015611251576001600160a01b03851660009081526002602052604081206116a69083611824565b815481106116c457634e487b7160e01b600052603260045260246000fd5b60009182526020918290206040805160c08101825260069093029091018054835260018101546001600160a01b0390811694840194909452600281015490931690820152600382015460608201526004820154608082015260059091015460a0820152825183908390811061174957634e487b7160e01b600052603260045260246000fd5b6020026020010181905250808061175f9061271a565b91505061167c565b6001600160a01b038116600090815260086020526040812061048d9061181a565b6001600160a01b038116600090815260026020526040812061048d9061181a565b6117b16122fd565b816117bb8461046c565b116117f85760405162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b604482015260640161078f565b6001600160a01b03831660009081526001602052604081206107ba9084611824565b600061048d825490565b60006106908383611d57565b60006106908383611d8f565b6000610690836001600160a01b038416611d8f565b6040516001600160a01b0383166024820152604481018290526118b490849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611eac565b505050565b6000808390506000836001600160a01b031663e6a43905836001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561190957600080fd5b505afa15801561191d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119419190612361565b846001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561197a57600080fd5b505afa15801561198e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b29190612361565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260440160206040518083038186803b1580156119f857600080fd5b505afa158015611a0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a309190612361565b6001600160a01b03908116908616149250505092915050565b6000611a5786868585611f7e565b6001600160a01b0387166000908152600160205260409020909150611a7c90826120d7565b50611a886003866120e3565b506001600160a01b0380861660009081526007602052604090208054909116611ad85780546001600160a01b038088166001600160a01b0319928316178355600183018054918816919092161790555b838160020154611ae891906126bf565b60028201556001600160a01b0386166000908152600860205260409020611b0f90836120d7565b505095945050505050565b6000611b2885858585611f7e565b6001600160a01b0386166000908152600260205260409020909150611b4d90826120d7565b50611b596005856120e3565b506001600160a01b0380851660009081526007602052604090208054909116611ba35780546001600160a01b0386166001600160a01b031991821617825560018201805490911690555b838160020154611bb391906126bf565b60028201556001600160a01b0385166000908152600860205260409020611bda90836120d7565b5050949350505050565b6040516370a0823160e01b81526001600160a01b038381166004830152600091908616906370a082319060240160206040518083038186803b158015611c2957600080fd5b505afa158015611c3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c61919061246a565b9050611c786001600160a01b0386168585856120f8565b6040516370a0823160e01b81526001600160a01b038481166004830152600091908716906370a082319060240160206040518083038186803b158015611cbd57600080fd5b505afa158015611cd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf5919061246a565b905082611d0283836126d7565b14611d4f5760405162461bcd60e51b815260206004820152601f60248201527f4e6f7420656e6f75676820746f6b656e20776173207472616e73666572656400604482015260640161078f565b505050505050565b6000826000018281548110611d7c57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b60008181526001830160205260408120548015611ea2576000611db36001836126d7565b8554909150600090611dc7906001906126d7565b9050818114611e48576000866000018281548110611df557634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080876000018481548110611e2657634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611e6757634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061048d565b600091505061048d565b6000611f01826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166121369092919063ffffffff16565b8051909150156118b45780806020019051810190611f1f9190612436565b6118b45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161078f565b600080546040805160c0810182528281526001600160a01b039687166020820190815297871691810191825260608101958652426080820190815260a0820195865260018401855593805251600683027f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381019190915596517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e564880180549188166001600160a01b031992831617905590517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e565880180549190971691161790945591517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56685015590517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e567840155517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5689092019190915590565b6000610690838361214d565b6000610690836001600160a01b03841661214d565b6040516001600160a01b03808516602483015283166044820152606481018290526121309085906323b872dd60e01b9060840161187d565b50505050565b6060612145848460008561219c565b949350505050565b60008181526001830160205260408120546121945750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561048d565b50600061048d565b6060824710156121fd5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161078f565b843b61224b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161078f565b600080866001600160a01b031685876040516122679190612516565b60006040518083038185875af1925050503d80600081146122a4576040519150601f19603f3d011682016040523d82523d6000602084013e6122a9565b606091505b50915091506122b98282866122c4565b979650505050505050565b606083156122d3575081610690565b8251156122e35782518084602001fd5b8160405162461bcd60e51b815260040161078f919061260d565b6040518060c001604052806000815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081525090565b600060208284031215612356578081fd5b81356106908161274b565b600060208284031215612372578081fd5b81516106908161274b565b600080600080600060a08688031215612394578081fd5b853561239f8161274b565b945060208601356123af8161274b565b935060408601356123bf81612763565b94979396509394606081013594506080013592915050565b600080604083850312156123e9578182fd5b82356123f48161274b565b946020939093013593505050565b600080600060608486031215612416578283fd5b83356124218161274b565b95602085013595506040909401359392505050565b600060208284031215612447578081fd5b815161069081612763565b600060208284031215612463578081fd5b5035919050565b60006020828403121561247b578081fd5b5051919050565b60008060408385031215612494578182fd5b50508035926020909101359150565b6000806000606084860312156124b7578283fd5b505081359360208301359350604090920135919050565b80518252602081015160018060a01b0380821660208501528060408401511660408501525050606081015160608301526080810151608083015260a081015160a08301525050565b600082516125288184602087016126ee565b9190910192915050565b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b6020808252825182820181905260009190848201906040850190845b818110156125bf576125ac83855180516001600160a01b03908116835260208083015190911690830152604090810151910152565b9284019260609290920191600101612577565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156125bf576125fa8385516124ce565b9284019260c092909201916001016125e7565b602081526000825180602084015261262c8160408501602087016126ee565b601f01601f19169190910160400192915050565b60208082526022908201527f596f7520617265206e6f7420746865206f776e6572206f662074686973206c6f604082015261636b60f01b606082015260800190565b81516001600160a01b03908116825260208084015190911690820152604080830151908201526060810161048d565b60c0810161048d82846124ce565b600082198211156126d2576126d2612735565b500190565b6000828210156126e9576126e9612735565b500390565b60005b838110156127095781810151838201526020016126f1565b838111156121305750506000910152565b600060001982141561272e5761272e612735565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461276057600080fd5b50565b801515811461276057600080fdfea26469706673582212208ae3dfe7f998c4a93df107ae4261bbec0c9d4a22be32baee65a812a73fbcd61764736f6c63430008040033
Deployed Bytecode
0x6080604052600436106101405760003560e01c8063aec640c6116100b6578063da1d8cff1161006f578063da1d8cff14610368578063e1444fd614610388578063e3676f88146103f7578063eb80bdae14610417578063eeacf78614610437578063fd981c661461045757600080fd5b8063aec640c6146102c0578063aef0e540146102e0578063b3b9aa4814610300578063b982922e14610313578063cd83eadc14610328578063d68f4dd11461034857600080fd5b8063618df7a311610108578063618df7a3146101e45780636198e3391461021157806364be5b391461023357806376c12822146102465780637e6706d314610273578063a20b8c18146102a057600080fd5b806307873ef1146101455780631982242c14610178578063332f26d71461018d578063475831c8146101ba5780635fbdf739146101cf575b600080fd5b34801561015157600080fd5b50610165610160366004612345565b61046c565b6040519081526020015b60405180910390f35b34801561018457600080fd5b50610165610493565b34801561019957600080fd5b506101ad6101a8366004612402565b6104b4565b60405161016f91906125cb565b3480156101c657600080fd5b50610165610697565b3480156101db57600080fd5b506101ad6106a3565b3480156101f057600080fd5b506102046101ff3660046123d7565b610744565b60405161016f91906126b1565b34801561021d57600080fd5b5061023161022c366004612452565b610843565b005b61016561024136600461237d565b610b08565b34801561025257600080fd5b50610266610261366004612482565b610d59565b60405161016f919061255b565b34801561027f57600080fd5b5061029361028e366004612452565b610ecc565b60405161016f9190612682565b3480156102ac57600080fd5b506102936102bb366004612452565b610f43565b3480156102cc57600080fd5b506102666102db366004612482565b610f6f565b3480156102ec57600080fd5b506101ad6102fb366004612345565b6110d7565b61023161030e3660046124a3565b611259565b34801561031f57600080fd5b50610165611531565b34801561033457600080fd5b50610165610343366004612345565b61153d565b34801561035457600080fd5b50610204610363366004612452565b61155b565b34801561037457600080fd5b506101ad610383366004612345565b6115ed565b34801561039457600080fd5b506103d16103a3366004612345565b6007602052600090815260409020805460018201546002909201546001600160a01b03918216929091169083565b604080516001600160a01b0394851681529390921660208401529082015260600161016f565b34801561040357600080fd5b50610165610412366004612345565b611767565b34801561042357600080fd5b50610165610432366004612345565b611788565b34801561044357600080fd5b506102046104523660046123d7565b6117a9565b34801561046357600080fd5b50600054610165565b6001600160a01b038116600090815260016020526040812061048d9061181a565b92915050565b600061049d610697565b6104a5611531565b6104af91906126bf565b905090565b6001600160a01b03831660009081526008602052604090206060906104d89061181a565b821061050f576001600160a01b03841660009081526008602052604090206001906105029061181a565b61050c91906126d7565b91505b600061051b84846126d7565b6105269060016126bf565b905060008167ffffffffffffffff81111561055157634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561058a57816020015b6105776122fd565b81526020019060019003908161056f5790505b5090506000855b858111610689576001600160a01b03881660009081526008602052604081206105ba9083611824565b815481106105d857634e487b7160e01b600052603260045260246000fd5b60009182526020918290206040805160c08101825260069093029091018054835260018101546001600160a01b0390811694840194909452600281015490931690820152600382015460608201526004820154608082015260059091015460a0820152835184908490811061065d57634e487b7160e01b600052603260045260246000fd5b602002602001018190525081806106739061271a565b92505080806106819061271a565b915050610591565b5090925050505b9392505050565b60006104af600561181a565b60606000805480602002602001604051908101604052809291908181526020016000905b8282101561073b5760008481526020908190206040805160c08101825260068602909201805483526001808201546001600160a01b03908116858701526002830154169284019290925260038101546060840152600481015460808401526005015460a083015290835290920191016106c7565b50505050905090565b61074c6122fd565b8161075684611788565b116107985760405162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b60448201526064015b60405180910390fd5b6001600160a01b03831660009081526002602052604081206107ba9084611824565b815481106107d857634e487b7160e01b600052603260045260246000fd5b60009182526020918290206040805160c08101825260069093029091018054835260018101546001600160a01b0390811694840194909452600281015490931690820152600382015460608201526004820154608082015260059091015460a0820152905092915050565b600054819081106108885760405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a59081b1bd8dac81a59608a1b604482015260640161078f565b60008083815481106108aa57634e487b7160e01b600052603260045260246000fd5b600091825260209091206002600690920201908101549091506001600160a01b031633146108ea5760405162461bcd60e51b815260040161078f90612640565b806005015442101561093e5760405162461bcd60e51b815260206004820152601860248201527f4974206973206e6f742074696d6520746f20756e6c6f636b0000000000000000604482015260640161078f565b60008160030154116109865760405162461bcd60e51b81526020600482015260116024820152704e6f7468696e6720746f20756e6c6f636b60781b604482015260640161078f565b6001808201546001600160a01b0390811660009081526007602052604090209182015416158015906109d1573360009081526001602052604090206109cb9086611830565b506109ec565b3360009081526002602052604090206109ea9086611830565b505b600383015460028301548110610a085760006002840155610a1e565b808360020154610a1891906126d7565b60028401555b6002830154610a69578115610a4d576001840154610a47906003906001600160a01b031661183c565b50610a69565b6001840154610a67906005906001600160a01b031661183c565b505b600060038501819055845460018601546001600160a01b0316825260086020526040909120610a9791611830565b506001840154610ab1906001600160a01b03163383611851565b835460018501546040517fc6532367992b32e42a62dd89fc3574876d97d081a263aa6e030f34b79b7e6e8b91610af8916001600160a01b0390911690339086904290612532565b60405180910390a2505050505050565b6000428211610b6a5760405162461bcd60e51b815260206004820152602860248201527f556e6c6f636b20646174652073686f756c642062652061667465722063757272604482015267656e742074696d6560c01b606482015260840161078f565b60008311610bba5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e742073686f756c642062652067726561746572207468616e203000604482015260640161078f565b8315610cf7576000856001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015610bfb57600080fd5b505afa925050508015610c2b575060408051601f3d908101601f19168201909252610c2891810190612361565b60015b610c775760405162461bcd60e51b815260206004820152601c60248201527f5468697320746f6b656e206973206e6f742061204c5020746f6b656e00000000604482015260640161078f565b90506001600160a01b03811615801590610c965750610c9686826118b9565b610ce25760405162461bcd60e51b815260206004820152601d60248201527f5468697320746f6b656e206973206e6f742061204c5020746f6b656e2e000000604482015260640161078f565b610cef8787838787611a49565b915050610d06565b610d0386868585611b1a565b90505b610d1285333086611be4565b807f694af1cc8727cdd0afbdd53d9b87b69248bd490224e9dd090e788546506e076f86888686604051610d489493929190612532565b60405180910390a295945050505050565b6060610d65600561181a565b8210610d84576001610d77600561181a565b610d8191906126d7565b91505b6000610d9084846126d7565b610d9b9060016126bf565b905060008167ffffffffffffffff811115610dc657634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610e1157816020015b6040805160608101825260008082526020808301829052928201528252600019909201910181610de45790505b5090506000855b858111610ec15760076000610e2e600584611824565b6001600160a01b03908116825260208083019390935260409182016000208251606081018452815483168152600182015490921693820193909352600290920154908201528351849084908110610e9557634e487b7160e01b600052603260045260246000fd5b60200260200101819052508180610eab9061271a565b9250508080610eb99061271a565b915050610e18565b509095945050505050565b604080516060810182526000808252602082018190529181019190915260076000610ef8600585611824565b6001600160a01b039081168252602080830193909352604091820160002082516060810184528154831681526001820154909216938201939093526002909201549082015292915050565b604080516060810182526000808252602082018190529181019190915260076000610ef8600385611824565b6060610f7b600361181a565b8210610f9a576001610f8d600361181a565b610f9791906126d7565b91505b6000610fa684846126d7565b610fb19060016126bf565b905060008167ffffffffffffffff811115610fdc57634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561102757816020015b6040805160608101825260008082526020808301829052928201528252600019909201910181610ffa5790505b5090506000855b858111610ec15760076000611044600384611824565b6001600160a01b039081168252602080830193909352604091820160002082516060810184528154831681526001820154909216938201939093526002909201549082015283518490849081106110ab57634e487b7160e01b600052603260045260246000fd5b602002602001018190525081806110c19061271a565b92505080806110cf9061271a565b91505061102e565b6001600160a01b0381166000908152600160205260408120606091906110fc9061181a565b905060008167ffffffffffffffff81111561112757634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561116057816020015b61114d6122fd565b8152602001906001900390816111455790505b50905060005b82811015611251576001600160a01b03851660009081526001602052604081206111909083611824565b815481106111ae57634e487b7160e01b600052603260045260246000fd5b60009182526020918290206040805160c08101825260069093029091018054835260018101546001600160a01b0390811694840194909452600281015490931690820152600382015460608201526004820154608082015260059091015460a0820152825183908390811061123357634e487b7160e01b600052603260045260246000fd5b602002602001018190525080806112499061271a565b915050611166565b509392505050565b6000548390811061129e5760405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a59081b1bd8dac81a59608a1b604482015260640161078f565b60008085815481106112c057634e487b7160e01b600052603260045260246000fd5b600091825260209091206002600690920201908101549091506001600160a01b031633146113005760405162461bcd60e51b815260040161078f90612640565b60008160030154116113485760405162461bcd60e51b8152602060048201526011602482015270131bd8dac81dd85cc81d5b9b1bd8dad959607a1b604482015260640161078f565b82156113e9578060050154831015801561136157504283115b6113e15760405162461bcd60e51b8152602060048201526044602482018190527f4e657720756e6c6f636b2074696d652073686f756c64206e6f74206265206265908201527f666f7265206f6c6420756e6c6f636b2074696d65206f722063757272656e742060648201526374696d6560e01b608482015260a40161078f565b600581018390555b83156114cd57806003015484101561145d5760405162461bcd60e51b815260206004820152603160248201527f4e657720616d6f756e742073686f756c64206e6f74206265206c657373207468604482015270185b8818dd5c9c995b9d08185b5bdd5b9d607a1b606482015260840161078f565b600081600301548561146f91906126d7565b905080156114cb576001820154611491906001600160a01b0316333084611be4565b6003820185905560018201546001600160a01b0316600090815260076020526040902060028101546114c49083906126bf565b6002909101555b505b805460018201546002830154600384015460058501546040517fa8b26360df8d5e154ffa5a8a7e894e85f781acfbbef0b744fb9551d8fd0fd36c94611522946001600160a01b03918216949116929091612532565b60405180910390a25050505050565b60006104af600361181a565b60006115488261046c565b61155183611788565b61048d91906126bf565b6115636122fd565b6000828154811061158457634e487b7160e01b600052603260045260246000fd5b60009182526020918290206040805160c08101825260069093029091018054835260018101546001600160a01b0390811694840194909452600281015490931690820152600382015460608201526004820154608082015260059091015460a082015292915050565b6001600160a01b0381166000908152600260205260408120606091906116129061181a565b905060008167ffffffffffffffff81111561163d57634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561167657816020015b6116636122fd565b81526020019060019003908161165b5790505b50905060005b82811015611251576001600160a01b03851660009081526002602052604081206116a69083611824565b815481106116c457634e487b7160e01b600052603260045260246000fd5b60009182526020918290206040805160c08101825260069093029091018054835260018101546001600160a01b0390811694840194909452600281015490931690820152600382015460608201526004820154608082015260059091015460a0820152825183908390811061174957634e487b7160e01b600052603260045260246000fd5b6020026020010181905250808061175f9061271a565b91505061167c565b6001600160a01b038116600090815260086020526040812061048d9061181a565b6001600160a01b038116600090815260026020526040812061048d9061181a565b6117b16122fd565b816117bb8461046c565b116117f85760405162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b604482015260640161078f565b6001600160a01b03831660009081526001602052604081206107ba9084611824565b600061048d825490565b60006106908383611d57565b60006106908383611d8f565b6000610690836001600160a01b038416611d8f565b6040516001600160a01b0383166024820152604481018290526118b490849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611eac565b505050565b6000808390506000836001600160a01b031663e6a43905836001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561190957600080fd5b505afa15801561191d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119419190612361565b846001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561197a57600080fd5b505afa15801561198e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b29190612361565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260440160206040518083038186803b1580156119f857600080fd5b505afa158015611a0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a309190612361565b6001600160a01b03908116908616149250505092915050565b6000611a5786868585611f7e565b6001600160a01b0387166000908152600160205260409020909150611a7c90826120d7565b50611a886003866120e3565b506001600160a01b0380861660009081526007602052604090208054909116611ad85780546001600160a01b038088166001600160a01b0319928316178355600183018054918816919092161790555b838160020154611ae891906126bf565b60028201556001600160a01b0386166000908152600860205260409020611b0f90836120d7565b505095945050505050565b6000611b2885858585611f7e565b6001600160a01b0386166000908152600260205260409020909150611b4d90826120d7565b50611b596005856120e3565b506001600160a01b0380851660009081526007602052604090208054909116611ba35780546001600160a01b0386166001600160a01b031991821617825560018201805490911690555b838160020154611bb391906126bf565b60028201556001600160a01b0385166000908152600860205260409020611bda90836120d7565b5050949350505050565b6040516370a0823160e01b81526001600160a01b038381166004830152600091908616906370a082319060240160206040518083038186803b158015611c2957600080fd5b505afa158015611c3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c61919061246a565b9050611c786001600160a01b0386168585856120f8565b6040516370a0823160e01b81526001600160a01b038481166004830152600091908716906370a082319060240160206040518083038186803b158015611cbd57600080fd5b505afa158015611cd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf5919061246a565b905082611d0283836126d7565b14611d4f5760405162461bcd60e51b815260206004820152601f60248201527f4e6f7420656e6f75676820746f6b656e20776173207472616e73666572656400604482015260640161078f565b505050505050565b6000826000018281548110611d7c57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b60008181526001830160205260408120548015611ea2576000611db36001836126d7565b8554909150600090611dc7906001906126d7565b9050818114611e48576000866000018281548110611df557634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080876000018481548110611e2657634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611e6757634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061048d565b600091505061048d565b6000611f01826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166121369092919063ffffffff16565b8051909150156118b45780806020019051810190611f1f9190612436565b6118b45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161078f565b600080546040805160c0810182528281526001600160a01b039687166020820190815297871691810191825260608101958652426080820190815260a0820195865260018401855593805251600683027f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381019190915596517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e564880180549188166001600160a01b031992831617905590517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e565880180549190971691161790945591517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56685015590517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e567840155517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5689092019190915590565b6000610690838361214d565b6000610690836001600160a01b03841661214d565b6040516001600160a01b03808516602483015283166044820152606481018290526121309085906323b872dd60e01b9060840161187d565b50505050565b6060612145848460008561219c565b949350505050565b60008181526001830160205260408120546121945750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561048d565b50600061048d565b6060824710156121fd5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161078f565b843b61224b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161078f565b600080866001600160a01b031685876040516122679190612516565b60006040518083038185875af1925050503d80600081146122a4576040519150601f19603f3d011682016040523d82523d6000602084013e6122a9565b606091505b50915091506122b98282866122c4565b979650505050505050565b606083156122d3575081610690565b8251156122e35782518084602001fd5b8160405162461bcd60e51b815260040161078f919061260d565b6040518060c001604052806000815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081525090565b600060208284031215612356578081fd5b81356106908161274b565b600060208284031215612372578081fd5b81516106908161274b565b600080600080600060a08688031215612394578081fd5b853561239f8161274b565b945060208601356123af8161274b565b935060408601356123bf81612763565b94979396509394606081013594506080013592915050565b600080604083850312156123e9578182fd5b82356123f48161274b565b946020939093013593505050565b600080600060608486031215612416578283fd5b83356124218161274b565b95602085013595506040909401359392505050565b600060208284031215612447578081fd5b815161069081612763565b600060208284031215612463578081fd5b5035919050565b60006020828403121561247b578081fd5b5051919050565b60008060408385031215612494578182fd5b50508035926020909101359150565b6000806000606084860312156124b7578283fd5b505081359360208301359350604090920135919050565b80518252602081015160018060a01b0380821660208501528060408401511660408501525050606081015160608301526080810151608083015260a081015160a08301525050565b600082516125288184602087016126ee565b9190910192915050565b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b6020808252825182820181905260009190848201906040850190845b818110156125bf576125ac83855180516001600160a01b03908116835260208083015190911690830152604090810151910152565b9284019260609290920191600101612577565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156125bf576125fa8385516124ce565b9284019260c092909201916001016125e7565b602081526000825180602084015261262c8160408501602087016126ee565b601f01601f19169190910160400192915050565b60208082526022908201527f596f7520617265206e6f7420746865206f776e6572206f662074686973206c6f604082015261636b60f01b606082015260800190565b81516001600160a01b03908116825260208084015190911690820152604080830151908201526060810161048d565b60c0810161048d82846124ce565b600082198211156126d2576126d2612735565b500190565b6000828210156126e9576126e9612735565b500390565b60005b838110156127095781810151838201526020016126f1565b838111156121305750506000910152565b600060001982141561272e5761272e612735565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461276057600080fd5b50565b801515811461276057600080fdfea26469706673582212208ae3dfe7f998c4a93df107ae4261bbec0c9d4a22be32baee65a812a73fbcd61764736f6c63430008040033
Loading...
Loading
Loading...
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.
[ 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.