Address Contract Partially Verified
Address
0x76255ba5FfdeF8aB8752b6Ce52E409Eb83e3d269
Balance
0 ETH
Nonce
1
Code Size
4161 bytes
Creator
0x7BF2f06D...B613 at tx 0x52edf85b...c60566
Indexed Transactions
0
Contract Bytecode
4161 bytes
0x60806040526004361061008a5760003560e01c8063a0ef91df11610059578063a0ef91df14610174578063af74e62914610189578063b05fb26f146101ed578063d88e7f4e14610217578063f2fde38b1461023757600080fd5b80633ccfd60b146100965780634c02bf0b146100ad578063894760691461012c5780638da5cb5b1461014c57600080fd5b3661009157005b600080fd5b3480156100a257600080fd5b506100ab610257565b005b3480156100b957600080fd5b506100c2610408565b604080519a15158b5264ffffffffff998a1660208c01526001600160a01b03988916908b015295871660608a015293861660808901529190941660a087015292841660c08601529190921660e0840152610100830152610120820152610140015b60405180910390f35b34801561013857600080fd5b506100ab610147366004610d5c565b610505565b34801561015857600080fd5b506000546040516001600160a01b039091168152602001610123565b34801561018057600080fd5b506100ab6106f6565b34801561019557600080fd5b5061019e6107ba565b60408051981515895264ffffffffff90971660208901526001600160a01b0395861696880196909652939092166060860152608085015260a084015260c083015260e082015261010001610123565b3480156101f957600080fd5b50600154600160a01b900460ff166040519015158152602001610123565b34801561022357600080fd5b506100ab610232366004610d80565b6108fa565b34801561024357600080fd5b506100ab610252366004610d5c565b610b63565b6000546001600160a01b0316331461028a5760405162461bcd60e51b815260040161028190610dba565b60405180910390fd5b600354600160f01b900460ff16156102b45760405162461bcd60e51b815260040161028190610e02565b6003805460ff60f01b1916600160f01b179081905564ffffffffff600160c81b90910481164290911610156103355760405162461bcd60e51b815260206004820152602160248201527f5761697420756e74696c20756e6c6f636b54696d6520746f20776974686472616044820152607760f81b6064820152608401610281565b6002546001600160a01b031663a9059cbb6103586000546001600160a01b031690565b610360610b99565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156103ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103cf9190610e6c565b506040517f2610969932116214bd675dc19941eeba897ba78afe8423eaaa3046445eea28cd90600090a16003805460ff60f01b19169055565b60015460ff600160a01b8204169064ffffffffff600160a81b909104163060008080808080806104406000546001600160a01b031690565b6002546003549198506001600160a01b0390811697508116955064ffffffffff600160a01b820481169550600160c81b90910416925061047e610b99565b9150600260009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f79190610e8e565b905090919293949596979899565b6000546001600160a01b0316331461052f5760405162461bcd60e51b815260040161028190610dba565b600354600160f01b900460ff16156105595760405162461bcd60e51b815260040161028190610e02565b6003805460ff60f01b1916600160f01b1790556002546001600160a01b03828116911614156105e65760405162461bcd60e51b815260206004820152603360248201527f557365202777697468647261772720746f2077697468647261772074686520706044820152723934b6b0b93c903637b1b5b2b2103a37b5b2b760691b6064820152608401610281565b806001600160a01b03811663a9059cbb6106086000546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa15801561064c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106709190610e8e565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156106bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106df9190610e6c565b50506003805460ff60f01b1916905550565b905090565b6000546001600160a01b031633146107205760405162461bcd60e51b815260040161028190610dba565b600354600160f01b900460ff161561074a5760405162461bcd60e51b815260040161028190610e02565b6003805460ff60f01b1916600160f01b17905560006107716000546001600160a01b031690565b6040519091506001600160a01b038216904780156108fc02916000818181858888f193505050501580156107a9573d6000803e3d6000fd5b50506003805460ff60f01b19169055565b600154600090600160a81b810464ffffffffff1690829081908190819081908190600160a01b900460ff166107f257600097506108f0565b600254604051632590dc9d60e01b81526001600160a01b039091166004820152738bf6fa865f15887a95d3af202ab34ed0c754a2de90632590dc9d9060240160c060405180830381865af492505050801561086a575060408051601f3d908101601f1916820190925261086791810190610ea7565b60015b6108dc57610876610f05565b806308c379a014156108a0575061088b610f5c565b8061089657506108a2565b60009850506108f0565b505b3d8080156108cc576040519150601f19603f3d011682016040523d82523d6000602084013e6108d1565b606091505b5060009850506108f0565b60019d50949a509298509096509450925090505b9091929394959697565b6000546001600160a01b031633146109245760405162461bcd60e51b815260040161028190610dba565b600354600160f01b900460ff161561094e5760405162461bcd60e51b815260040161028190610e02565b6003805460ff60f01b1916600160f01b17905564ffffffffff811615610a6f5760035464ffffffffff600160c81b9091048116908216108015906109a057504264ffffffffff168164ffffffffff1610155b610a125760405162461bcd60e51b815260206004820152603f60248201527f4e657720756e6c6f636b2074696d65206d75737420626520612066757475726560448201527f2074696d65206265796f6e64207468652070726576696f75732076616c7565006064820152608401610281565b6003805464ffffffffff60c81b1916600160c81b64ffffffffff8481168202929092179283905560405192041681527fd316ae9629b69e6caec00227e7056a9d6b297beb56bf61e651212156c716567e9060200160405180910390a15b81156107a9576000610a7f610b99565b6002549091506001600160a01b03166323b872dd336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604481018690526064016020604051808303816000875af1158015610ae7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0b9190610e6c565b507f2a89b2e3d580398d6dc2db5e0f336b52602bbaa51afa9bb5cdf59239cf0d2bea81610b36610b99565b610b409190610fe6565b60405190815260200160405180910390a15050506003805460ff60f01b19169055565b6000546001600160a01b03163314610b8d5760405162461bcd60e51b815260040161028190610dba565b610b9681610c06565b50565b6002546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610be2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f19190610e8e565b6000546001600160a01b03163314610c305760405162461bcd60e51b815260040161028190610dba565b6000546001600160a01b0316610c4582610ccd565b600154600354604051634c7ababd60e01b8152600160a81b830464ffffffffff1660048201526001600160a01b03858116602483015284811660448301529182166064820152911690634c7ababd90608401600060405180830381600087803b158015610cb157600080fd5b505af1158015610cc5573d6000803e3d6000fd5b505050505050565b6000546001600160a01b03163314610cf75760405162461bcd60e51b815260040161028190610dba565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610b9657600080fd5b600060208284031215610d6e57600080fd5b8135610d7981610d47565b9392505050565b60008060408385031215610d9357600080fd5b82359150602083013564ffffffffff81168114610daf57600080fd5b809150509250929050565b60208082526028908201527f4f6e6c7920746865206f776e65722063616e2065786563757465207468697320604082015267333ab731ba34b7b760c11b606082015260800190565b60208082526044908201527f5472616e73666572696e67206973206c6f636b65642e205761697420666f722060408201527f7468652070726576696f7573207472616e73616374696f6e20746f20636f6d706060820152636c65746560e01b608082015260a00190565b600060208284031215610e7e57600080fd5b81518015158114610d7957600080fd5b600060208284031215610ea057600080fd5b5051919050565b60008060008060008060c08789031215610ec057600080fd5b8651610ecb81610d47565b6020880151909650610edc81610d47565b6040880151606089015160808a015160a0909a0151989b929a5090989097909650945092505050565b600060033d1115610f1e5760046000803e5060005160e01c5b90565b601f8201601f1916810167ffffffffffffffff81118282101715610f5557634e487b7160e01b600052604160045260246000fd5b6040525050565b600060443d1015610f6a5790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715610f9a57505050505090565b8285019150815181811115610fb25750505050505090565b843d8701016020828501011115610fcc5750505050505090565b610fdb60208286010187610f21565b509095945050505050565b60008282101561100657634e487b7160e01b600052601160045260246000fd5b50039056fea2646970667358221220d5ba3b406add7fd6a96edf916b9b4aa1d066d210efe5d7e7f521ad625204af1864736f6c634300080a0033
Verified Source Code Partial Match
Compiler: v0.8.10+commit.fc410830
EVM: london
Optimization: Yes (200 runs)
Util.sol 86 lines
// SPDX-License-Identifier: UNLICENSED
/**
/$$$$$$ /$$ /$$ /$$
/$$__ $$ | $$ | $$$ /$$$
| $$ \ $$ /$$$$$$$ | $$ /$$ /$$| $$$$ /$$$$ /$$$$$$ /$$$$$$ /$$$$$$$ /$$$$$$$
| $$ | $$| $$__ $$| $$| $$ | $$| $$ $$/$$ $$ /$$__ $$ /$$__ $$| $$__ $$ /$$_____/
| $$ | $$| $$ \ $$| $$| $$ | $$| $$ $$$| $$| $$ \ $$| $$ \ $$| $$ \ $$| $$$$$$
| $$ | $$| $$ | $$| $$| $$ | $$| $$\ $ | $$| $$ | $$| $$ | $$| $$ | $$ \____ $$
| $$$$$$/| $$ | $$| $$| $$$$$$$| $$ \/ | $$| $$$$$$/| $$$$$$/| $$ | $$ /$$$$$$$/
\______/ |__/ |__/|__/ \____ $$|__/ |__/ \______/ \______/ |__/ |__/|_______/
/$$ | $$
| $$$$$$/
\______/
https://onlymoons.io/
*/
pragma solidity ^0.8.0;
import { IERC20 } from "./library/IERC20.sol";
import { IUniswapV2Pair } from "./library/Dex.sol";
library Util {
/**
* @dev retrieves basic information about a token, including sender balance
*/
function getTokenData(address address_) external view returns (
string memory name,
string memory symbol,
uint8 decimals,
uint256 totalSupply,
uint256 balance
){
IERC20 _token = IERC20(address_);
name = _token.name();
symbol = _token.symbol();
decimals = _token.decimals();
totalSupply = _token.totalSupply();
balance = _token.balanceOf(msg.sender);
}
/**
* @dev this throws an error on false, instead of returning false,
* but can still be used the same way on frontend.
*/
function isLpToken(address address_) external view returns (bool) {
IUniswapV2Pair pair = IUniswapV2Pair(address_);
try pair.token0() returns (address tokenAddress_) {
// any address returned successfully should be valid?
// but we might as well check that it's not 0
return tokenAddress_ != address(0);
} catch Error(string memory /* reason */) {
return false;
} catch (bytes memory /* lowLevelData */) {
return false;
}
}
/**
* @dev this function will revert the transaction if it's called
* on a token that isn't an LP token. so, it's recommended to be
* sure that it's being called on an LP token, or expect the error.
*/
function getLpData(address address_) external view returns (
address token0,
address token1,
uint256 balance0,
uint256 balance1,
uint256 price0,
uint256 price1
) {
IUniswapV2Pair _pair = IUniswapV2Pair(address_);
token0 = _pair.token0();
token1 = _pair.token1();
balance0 = IERC20(token0).balanceOf(address(_pair));
balance1 = IERC20(token1).balanceOf(address(_pair));
price0 = _pair.price0CumulativeLast();
price1 = _pair.price1CumulativeLast();
}
}
Ownable.sol 65 lines
// SPDX-License-Identifier: UNLICENSED
/**
/$$$$$$ /$$ /$$ /$$
/$$__ $$ | $$ | $$$ /$$$
| $$ \ $$ /$$$$$$$ | $$ /$$ /$$| $$$$ /$$$$ /$$$$$$ /$$$$$$ /$$$$$$$ /$$$$$$$
| $$ | $$| $$__ $$| $$| $$ | $$| $$ $$/$$ $$ /$$__ $$ /$$__ $$| $$__ $$ /$$_____/
| $$ | $$| $$ \ $$| $$| $$ | $$| $$ $$$| $$| $$ \ $$| $$ \ $$| $$ \ $$| $$$$$$
| $$ | $$| $$ | $$| $$| $$ | $$| $$\ $ | $$| $$ | $$| $$ | $$| $$ | $$ \____ $$
| $$$$$$/| $$ | $$| $$| $$$$$$$| $$ \/ | $$| $$$$$$/| $$$$$$/| $$ | $$ /$$$$$$$/
\______/ |__/ |__/|__/ \____ $$|__/ |__/ \______/ \______/ |__/ |__/|_______/
/$$ | $$
| $$$$$$/
\______/
https://onlymoons.io/
*/
pragma solidity ^0.8.0;
import { Context } from "./library/Context.sol";
/**
* @title Ownable
*
* parent for ownable contracts
*/
abstract contract Ownable is Context {
constructor(address owner_) {
_owner_ = owner_;
emit OwnershipTransferred(address(0), _owner());
}
address private _owner_;
event OwnershipTransferred(address indexed oldOwner, address indexed newOwner);
function _owner() internal view returns (address) {
return _owner_;
}
function owner() external view returns (address) {
return _owner();
}
modifier onlyOwner() {
require(_owner() == _msgSender(), "Only the owner can execute this function");
_;
}
function _transferOwnership(address newOwner_) virtual internal onlyOwner {
// keep track of old owner for event
address oldOwner = _owner();
// set the new owner
_owner_ = newOwner_;
// emit event about ownership change
emit OwnershipTransferred(oldOwner, _owner());
}
function transferOwnership(address newOwner_) external onlyOwner {
_transferOwnership(newOwner_);
}
}
Dex.sol 205 lines
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2;
interface IUniswapV2Factory {
event PairCreated(address indexed token0, address indexed token1, address pair, uint);
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(uint) external view returns (address pair);
function allPairsLength() external view returns (uint);
function createPair(address tokenA, address tokenB) external returns (address pair);
function setFeeTo(address) external;
function setFeeToSetter(address) external;
}
interface IUniswapV2Pair {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint 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 (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint 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 (uint);
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
event Mint(address indexed sender, uint amount0, uint amount1);
event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
event Swap(
address indexed sender,
uint amount0In,
uint amount1In,
uint amount0Out,
uint amount1Out,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function MINIMUM_LIQUIDITY() external pure returns (uint);
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 (uint);
function price1CumulativeLast() external view returns (uint);
function kLast() external view returns (uint);
function mint(address to) external returns (uint liquidity);
function burn(address to) external returns (uint amount0, uint amount1);
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
function skim(address to) external;
function sync() external;
function initialize(address, address) external;
}
interface IUniswapV2Router01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}
interface IUniswapV2Router02 is IUniswapV2Router01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
}
TokenLockerV1.sol 200 lines
// SPDX-License-Identifier: UNLICENSED
/**
/$$$$$$ /$$ /$$ /$$
/$$__ $$ | $$ | $$$ /$$$
| $$ \ $$ /$$$$$$$ | $$ /$$ /$$| $$$$ /$$$$ /$$$$$$ /$$$$$$ /$$$$$$$ /$$$$$$$
| $$ | $$| $$__ $$| $$| $$ | $$| $$ $$/$$ $$ /$$__ $$ /$$__ $$| $$__ $$ /$$_____/
| $$ | $$| $$ \ $$| $$| $$ | $$| $$ $$$| $$| $$ \ $$| $$ \ $$| $$ \ $$| $$$$$$
| $$ | $$| $$ | $$| $$| $$ | $$| $$\ $ | $$| $$ | $$| $$ | $$| $$ | $$ \____ $$
| $$$$$$/| $$ | $$| $$| $$$$$$$| $$ \/ | $$| $$$$$$/| $$$$$$/| $$ | $$ /$$$$$$$/
\______/ |__/ |__/|__/ \____ $$|__/ |__/ \______/ \______/ |__/ |__/|_______/
/$$ | $$
| $$$$$$/
\______/
https://onlymoons.io/
*/
pragma solidity ^0.8.0;
import { ITokenLockerManagerV1 } from "./ITokenLockerManagerV1.sol";
import { Ownable } from "./Ownable.sol";
import { IUniswapV2Pair } from "./library/Dex.sol";
import { IERC20 } from "./library/IERC20.sol";
import { Util } from "./Util.sol";
contract TokenLockerV1 is Ownable {
event Extended(uint40 newUnlockTime);
event Deposited(uint256 amount);
event Withdrew();
constructor(address manager_, uint40 id_, address owner_, address tokenAddress_, uint40 unlockTime_) Ownable(owner_) {
require(unlockTime_ > uint40(block.timestamp), "Unlock time must be in the future");
_manager = ITokenLockerManagerV1(manager_);
_id = id_;
_token = IERC20(tokenAddress_);
_createdBy = owner_;
_createdAt = uint40(block.timestamp);
_unlockTime = unlockTime_;
_isLpToken = Util.isLpToken(tokenAddress_);
}
ITokenLockerManagerV1 private _manager;
bool private _isLpToken;
uint40 private _id;
IERC20 private _token;
address private _createdBy;
uint40 private _createdAt;
uint40 private _unlockTime;
bool private _transferLocked;
modifier transferLocked() {
require(!_transferLocked, "Transfering is locked. Wait for the previous transaction to complete");
_transferLocked = true;
_;
_transferLocked = false;
}
function _balance() private view returns (uint256) {
return _token.balanceOf(address(this));
}
function getIsLpToken() external view returns (bool) {
return _isLpToken;
}
function getLockData() external view returns (
bool isLpToken,
uint40 id,
address contractAddress,
address lockOwner,
address token,
address createdBy,
uint40 createdAt,
uint40 unlockTime,
uint256 balance,
uint256 totalSupply
){
isLpToken = _isLpToken;
id = _id;
contractAddress = address(this);
lockOwner = _owner();
token = address(_token);
createdBy = _createdBy;
createdAt = _createdAt;
unlockTime = _unlockTime;
balance = _balance();
totalSupply = _token.totalSupply();
}
function getLpData() external view returns (
bool hasLpData,
uint40 id,
address token0,
address token1,
uint256 balance0,
uint256 balance1,
uint256 price0,
uint256 price1
) {
// always return the id
id = _id;
if (!_isLpToken) {
// if this isn't an lp token, don't even bother calling getLpData
hasLpData = false;
} else {
// this is an lp token, so let's get some data
try Util.getLpData(address(_token)) returns (
address token0_,
address token1_,
uint256 balance0_,
uint256 balance1_,
uint256 price0_,
uint256 price1_
){
hasLpData = true;
token0 = token0_;
token1 = token1_;
balance0 = balance0_;
balance1 = balance1_;
price0 = price0_;
price1 = price1_;
} catch Error(string memory /* reason */) {
hasLpData = false;
} catch (bytes memory /* lowLevelData */) {
hasLpData = false;
}
}
}
/**
* @dev deposit and extend duration in one call
*/
function deposit(uint256 amount_, uint40 newUnlockTime_) external onlyOwner transferLocked {
if (newUnlockTime_ != 0) {
require(
newUnlockTime_ >= _unlockTime && newUnlockTime_ >= uint40(block.timestamp),
"New unlock time must be a future time beyond the previous value"
);
_unlockTime = newUnlockTime_;
emit Extended(_unlockTime);
}
if (amount_ != 0) {
uint256 oldBalance = _balance();
_token.transferFrom(_msgSender(), address(this), amount_);
emit Deposited(_balance() - oldBalance);
}
}
/**
* @dev withdraw all of the deposited token
*/
function withdraw() external onlyOwner transferLocked {
require(uint40(block.timestamp) >= _unlockTime, "Wait until unlockTime to withdraw");
_token.transfer(_owner(), _balance());
emit Withdrew();
}
/**
* @dev recovery function -
* just in case this contract winds up with additional tokens (from dividends, etc).
* attempting to withdraw the locked token will revert.
*/
function withdrawToken(address address_) external onlyOwner transferLocked {
require(address_ != address(_token), "Use 'withdraw' to withdraw the primary locked token");
IERC20 theToken = IERC20(address_);
theToken.transfer(_owner(), theToken.balanceOf(address(this)));
}
/**
* @dev recovery function -
* just in case this contract winds up with eth in it (from dividends etc)
*/
function withdrawEth() external onlyOwner transferLocked {
address payable receiver = payable(_owner());
receiver.transfer(address(this).balance);
}
function _transferOwnership(address newOwner_) override internal onlyOwner {
address previousOwner = _owner();
super._transferOwnership(newOwner_);
// we need to notify the manager contract that we transferred
// ownership, so that the new owner is searchable.
_manager.notifyLockerOwnerChange(_id, newOwner_, previousOwner, _createdBy);
}
receive() external payable {
// we need this function to receive eth,
// which might happen from dividend tokens.
// use `withdrawEth` to remove eth from the contract.
}
}
IERC20.sol 19 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.0.0/contracts/token/ERC20/IERC20.sol
interface IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function totalSupply() external view returns (uint256);
function decimals() external view returns (uint8);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
Context.sol 24 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.3.2 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
ITokenLockerManagerV1.sol 55 lines
// SPDX-License-Identifier: UNLICENSED
/**
/$$$$$$ /$$ /$$ /$$
/$$__ $$ | $$ | $$$ /$$$
| $$ \ $$ /$$$$$$$ | $$ /$$ /$$| $$$$ /$$$$ /$$$$$$ /$$$$$$ /$$$$$$$ /$$$$$$$
| $$ | $$| $$__ $$| $$| $$ | $$| $$ $$/$$ $$ /$$__ $$ /$$__ $$| $$__ $$ /$$_____/
| $$ | $$| $$ \ $$| $$| $$ | $$| $$ $$$| $$| $$ \ $$| $$ \ $$| $$ \ $$| $$$$$$
| $$ | $$| $$ | $$| $$| $$ | $$| $$\ $ | $$| $$ | $$| $$ | $$| $$ | $$ \____ $$
| $$$$$$/| $$ | $$| $$| $$$$$$$| $$ \/ | $$| $$$$$$/| $$$$$$/| $$ | $$ /$$$$$$$/
\______/ |__/ |__/|__/ \____ $$|__/ |__/ \______/ \______/ |__/ |__/|_______/
/$$ | $$
| $$$$$$/
\______/
https://onlymoons.io/
*/
pragma solidity ^0.8.0;
interface ITokenLockerManagerV1 {
function tokenLockerCount() external view returns (uint40);
function creationEnabled() external view returns (bool);
function setCreationEnabled(bool value_) external;
function createTokenLocker(
address tokenAddress_,
uint256 amount_,
uint40 unlockTime_
) external;
function getTokenLockAddress(uint40 id_) external view returns (address);
function getTokenLockData(uint40 id_) external view returns (
bool isLpToken,
uint40 id,
address contractAddress,
address lockOwner,
address token,
address createdBy,
uint40 createdAt,
uint40 unlockTime,
uint256 balance,
uint256 totalSupply
);
function getLpData(uint40 id_) external view returns (
bool hasLpData,
uint40 id,
address token0,
address token1,
uint256 balance0,
uint256 balance1,
uint256 price0,
uint256 price1
);
function getTokenLockersForAddress(address address_) external view returns (uint40[] memory);
function notifyLockerOwnerChange(uint40 id_, address newOwner_, address previousOwner_, address createdBy_) external;
}
Read Contract
getIsLpToken 0xb05fb26f → bool
getLockData 0x4c02bf0b → bool, uint40, address, address, address, address, uint40, uint40, uint256, uint256
getLpData 0xaf74e629 → bool, uint40, address, address, uint256, uint256, uint256, uint256
owner 0x8da5cb5b → address
Write Contract 5 functions
These functions modify contract state and require a wallet transaction to execute.
deposit 0xd88e7f4e
uint256 amount_
uint40 newUnlockTime_
transferOwnership 0xf2fde38b
address newOwner_
withdraw 0x3ccfd60b
No parameters
withdrawEth 0xa0ef91df
No parameters
withdrawToken 0x89476069
address address_
Recent Transactions
No transactions found for this address