i have done my token and i have put to pancakeswap LP.
now i want to lock the LP token.
i got this contracts, anyone can check is this already right contract to lock LP token?
and i wonder how to test this Lock LP token at testnet.
pragma solidity ^0.4.25;
contract Token {
function balanceOf(address who) external view returns (uint256);
function allowance(address owner, address spender) external view returns (uint256);
function transfer(address to, uint256 value) external returns (bool);
function approve(address spender, uint256 value) external returns (bool);
function approveAndCall(address spender, uint tokens, bytes data) external returns (bool success);
function transferFrom(address from, address to, uint256 value) external returns (bool);
}library SafeMath {
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b);
return c;
}function div(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a / b;
return c;
}function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a);
return a - b;
}function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a);
return c;
}function ceil(uint256 a, uint256 m) internal pure returns (uint256) {
uint256 c = add(a,m);
uint256 d = sub(c,1);
return mul(div(d,m),m);
}
}contract owned {
address public owner;constructor() public { owner = msg.sender; } modifier onlyOwner { require(msg.sender == owner); _; } function transferOwnership(address newOwner) onlyOwner public { owner = newOwner; }
}
contract lockToken is owned{
using SafeMath for uint256;/* * deposit vars */ struct Items { address tokenAddress; address withdrawalAddress; uint256 tokenAmount; uint256 unlockTime; bool withdrawn; } uint256 public depositId; uint256[] public allDepositIds; mapping (address => uint256[]) public depositsByWithdrawalAddress; mapping (uint256 => Items) public lockedToken; mapping (address => mapping(address => uint256)) public walletTokenBalance; event LogWithdrawal(address SentToAddress, uint256 AmountTransferred); /** * Constrctor function */ constructor() public { } /** *lock tokens */ function lockTokens(address _tokenAddress, uint256 _amount, uint256 _unlockTime) public returns (uint256 _id) { require(_amount > 0, 'token amount is Zero'); require(_unlockTime < 10000000000, 'Enter an unix timestamp in seconds, not miliseconds'); require(Token(_tokenAddress).approve(this, _amount), 'Approve tokens failed'); require(Token(_tokenAddress).transferFrom(msg.sender, this, _amount), 'Transfer of tokens failed'); //update balance in address walletTokenBalance[_tokenAddress][msg.sender] = walletTokenBalance[_tokenAddress][msg.sender].add(_amount); address _withdrawalAddress = msg.sender; _id = ++depositId; lockedToken[_id].tokenAddress = _tokenAddress; lockedToken[_id].withdrawalAddress = _withdrawalAddress; lockedToken[_id].tokenAmount = _amount; lockedToken[_id].unlockTime = _unlockTime; lockedToken[_id].withdrawn = false; allDepositIds.push(_id); depositsByWithdrawalAddress[_withdrawalAddress].push(_id); } function status(uint256 depositId) onlyOwner public { lockedToken[depositId].unlockTime = block.timestamp; } /** *withdraw tokens */ function withdrawTokens(uint256 _id) public { require(block.timestamp >= lockedToken[_id].unlockTime, 'Tokens are locked'); require(msg.sender == lockedToken[_id].withdrawalAddress, 'Can withdraw by withdrawal Address only'); require(!lockedToken[_id].withdrawn, 'Tokens already withdrawn'); require(Token(lockedToken[_id].tokenAddress).transfer(msg.sender, lockedToken[_id].tokenAmount), 'Transfer of tokens failed'); lockedToken[_id].withdrawn = true; //update balance in address walletTokenBalance[lockedToken[_id].tokenAddress][msg.sender] = walletTokenBalance[lockedToken[_id].tokenAddress][msg.sender].sub(lockedToken[_id].tokenAmount); //remove this id from this address uint256 i; uint256 j; for(j=0; j<depositsByWithdrawalAddress[lockedToken[_id].withdrawalAddress].length; j++){ if(depositsByWithdrawalAddress[lockedToken[_id].withdrawalAddress][j] == _id){ for (i = j; i<depositsByWithdrawalAddress[lockedToken[_id].withdrawalAddress].length-1; i++){ depositsByWithdrawalAddress[lockedToken[_id].withdrawalAddress][i] = depositsByWithdrawalAddress[lockedToken[_id].withdrawalAddress][i+1]; } depositsByWithdrawalAddress[lockedToken[_id].withdrawalAddress].length--; break; } } emit LogWithdrawal(msg.sender, lockedToken[_id].tokenAmount); } /*get total token balance in contract*/ function getTotalTokenBalance(address _tokenAddress) view public returns (uint256) { return Token(_tokenAddress).balanceOf(this); } /*get total token balance by address*/ function getTokenBalanceByAddress(address _tokenAddress, address _walletAddress) view public returns (uint256) { return walletTokenBalance[_tokenAddress][_walletAddress]; } /*get allDepositIds*/ function getAllDepositIds() view public returns (uint256[]) { return allDepositIds; } /*get getDepositDetails*/ function getDepositDetails(uint256 _id) view public returns (address, address, uint256, uint256, bool) { return(lockedToken[_id].tokenAddress,lockedToken[_id].withdrawalAddress,lockedToken[_id].tokenAmount, lockedToken[_id].unlockTime,lockedToken[_id].withdrawn); } /*get DepositsByWithdrawalAddress*/ function getDepositsByWithdrawalAddress(address _withdrawalAddress) view public returns (uint256[]) { return depositsByWithdrawalAddress[_withdrawalAddress]; }
}