编译器
0.8.17+commit.8df45f5f
文件 1 的 3:Context.sol
pragma solidity ^0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
文件 2 的 3:Ownable.sol
pragma solidity ^0.8.0;
import "./Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_transferOwnership(_msgSender());
}
modifier onlyOwner() {
_checkOwner();
_;
}
function owner() public view virtual returns (address) {
return _owner;
}
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
文件 3 的 3:esLBRBoost.sol
pragma solidity 0.8.17;
import "./Ownable.sol";
contract esLBRBoost is Ownable {
esLBRLockSetting[] public esLBRLockSettings;
mapping(address => LockStatus) public userLockStatus;
struct esLBRLockSetting {
uint256 duration;
uint256 miningBoost;
}
struct LockStatus {
uint256 unlockTime;
uint256 duration;
uint256 miningBoost;
}
constructor(
) {
esLBRLockSettings.push(esLBRLockSetting(30 days, 20 * 1e18));
esLBRLockSettings.push(esLBRLockSetting(90 days, 30 * 1e18));
esLBRLockSettings.push(esLBRLockSetting(180 days, 50 * 1e18));
esLBRLockSettings.push(esLBRLockSetting(365 days, 100 * 1e18));
}
function addLockSetting(esLBRLockSetting memory setting) external onlyOwner {
esLBRLockSettings.push(setting);
}
function setLockStatus(uint256 id) external {
esLBRLockSetting memory _setting = esLBRLockSettings[id];
LockStatus memory userStatus = userLockStatus[msg.sender];
if(userStatus.unlockTime > block.timestamp) {
require(userStatus.duration <= _setting.duration, "Your lock-in period has not ended, and the term can only be extended, not reduced.");
}
userLockStatus[msg.sender] = LockStatus(block.timestamp + _setting.duration, _setting.duration, _setting.miningBoost);
}
function getUnlockTime(address user) external view returns(uint256 unlockTime) {
unlockTime = userLockStatus[user].unlockTime;
}
function getUserBoost(address user, uint256 userUpdatedAt, uint256 finishAt) external view returns(uint256) {
uint256 boostEndTime = userLockStatus[user].unlockTime;
uint256 maxBoost = userLockStatus[user].miningBoost;
if(userUpdatedAt >= boostEndTime || userUpdatedAt >= finishAt) {
return 0;
}
if (finishAt <= boostEndTime || block.timestamp <= boostEndTime) {
return maxBoost;
} else {
uint256 time = block.timestamp > finishAt ? finishAt : block.timestamp;
return
((boostEndTime - userUpdatedAt) *
maxBoost) /
(time - userUpdatedAt);
}
}
}
{
"compilationTarget": {
"contracts/esLBRBoost.sol": "esLBRBoost"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"components":[{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"miningBoost","type":"uint256"}],"internalType":"struct esLBRBoost.esLBRLockSetting","name":"setting","type":"tuple"}],"name":"addLockSetting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"esLBRLockSettings","outputs":[{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"miningBoost","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUnlockTime","outputs":[{"internalType":"uint256","name":"unlockTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"userUpdatedAt","type":"uint256"},{"internalType":"uint256","name":"finishAt","type":"uint256"}],"name":"getUserBoost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"setLockStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userLockStatus","outputs":[{"internalType":"uint256","name":"unlockTime","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"miningBoost","type":"uint256"}],"stateMutability":"view","type":"function"}]