文件 1 的 3:IERC20.sol
pragma solidity >=0.8.0;
interface IERC20 {
function mint(address _to, uint256 _value) external;
function allowance(address owner, address spender)
external
view
returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function increaseAllowance(address spender, uint256 addedValue)
external
returns (bool);
function transfer(address _to, uint256 _value)
external
returns (bool success);
function transferFrom(
address _from,
address _to,
uint256 _value
) external returns (bool success);
function balanceOf(address _owner) external view returns (uint256 balance);
}
文件 2 的 3:ILockUnlockLP.sol
pragma solidity >=0.8.0;
import "./IERC20.sol";
interface ILockUnlockLP {
function owner() external view returns (address);
function setOwner(address _owner) external;
function canLock() external view returns (bool);
function setCanLock(bool _canLock) external;
function isAllowedToken(address token) external view returns (bool);
function lockLimit(address token) external view returns (uint256);
function setLockLimit(address token, uint256 _lockLimit) external;
function tokenSupply(address token) external view returns (uint256);
function totalSupply() external view returns (uint256);
function setIsAllowedToken(address token, bool _isAllowedToken) external;
function balance(address token, address depositer)
external
view
returns (uint256);
function lock(address token, uint256 amount) external;
function unlock(address token, uint256 amount) external;
event SetOwner(address indexed ownerOld, address indexed ownerNew);
event Lock(
address indexed token,
address indexed sender,
address indexed receiver,
uint256 amount
);
event Unlock(
address indexed token,
address indexed sender,
address indexed receiver,
uint256 amount
);
event SetIsAllowedToken(
address indexed owner,
address indexed token,
bool indexed newBool
);
event SetLockLimit(
address indexed owner,
address indexed token,
uint256 indexed _lockLimit
);
event SetCanLock(address indexed owner, bool indexed newBool);
}
文件 3 的 3:LockUnlockLP.sol
pragma solidity >=0.8.0;
import "./interfaces/ILockUnlockLP.sol";
contract LockUnlockLP is ILockUnlockLP {
address public override owner;
modifier isOwner() {
require(msg.sender == owner, "ACW");
_;
}
mapping(address => bool) public override isAllowedToken;
mapping(address => uint256) public override lockLimit;
mapping(address => mapping(address => uint256)) internal _balance;
mapping(address => uint256) public override tokenSupply;
uint256 public override totalSupply;
bool public override canLock;
constructor(address[] memory allowedTokens) {
owner = msg.sender;
for (uint256 i = 0; i < allowedTokens.length; i++) {
isAllowedToken[allowedTokens[i]] = true;
}
}
function setOwner(address _owner) external override isOwner {
address ownerOld = owner;
owner = _owner;
emit SetOwner(ownerOld, _owner);
}
function setIsAllowedToken(address token, bool _isAllowedToken)
external
override
isOwner
{
isAllowedToken[token] = _isAllowedToken;
emit SetIsAllowedToken(owner, token, _isAllowedToken);
}
function setLockLimit(address token, uint256 _lockLimit)
external
override
isOwner
{
lockLimit[token] = _lockLimit;
emit SetLockLimit(owner, token, _lockLimit);
}
function setCanLock(bool _canLock) external override isOwner {
canLock = _canLock;
emit SetCanLock(owner, _canLock);
}
function balance(address token, address depositer)
external
view
override
returns (uint256)
{
return _balance[token][depositer];
}
function lock(address token, uint256 amount) external override {
require(canLock, "LP1");
require(isAllowedToken[token], "LP2");
require(amount >= lockLimit[token], "LP3");
_balance[token][msg.sender] += amount;
tokenSupply[token] += amount;
totalSupply += amount;
IERC20(token).transferFrom(msg.sender, address(this), amount);
emit Lock(token, msg.sender, msg.sender, amount);
}
function unlock(address token, uint256 amount) external override {
require(_balance[token][msg.sender] >= amount, "LP4");
_balance[token][msg.sender] -= amount;
tokenSupply[token] -= amount;
totalSupply -= amount;
IERC20(token).transfer(msg.sender, amount);
emit Unlock(token, msg.sender, msg.sender, amount);
}
}
{
"compilationTarget": {
"LockUnlockLP.sol": "LockUnlockLP"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address[]","name":"allowedTokens","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Lock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"bool","name":"newBool","type":"bool"}],"name":"SetCanLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"bool","name":"newBool","type":"bool"}],"name":"SetIsAllowedToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"_lockLimit","type":"uint256"}],"name":"SetLockLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"ownerOld","type":"address"},{"indexed":true,"internalType":"address","name":"ownerNew","type":"address"}],"name":"SetOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Unlock","type":"event"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"depositer","type":"address"}],"name":"balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canLock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAllowedToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lockLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_canLock","type":"bool"}],"name":"setCanLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"_isAllowedToken","type":"bool"}],"name":"setIsAllowedToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"_lockLimit","type":"uint256"}],"name":"setLockLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"}]