编译器
0.8.20+commit.a1b79de6
文件 1 的 8:Address.sol
pragma solidity ^0.8.1;
library Address {
function isContract(address account) internal view returns (bool) {
return account.code.length > 0;
}
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");
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
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");
}
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);
}
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
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);
}
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
文件 2 的 8: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;
}
}
文件 3 的 8:IERC20.sol
pragma solidity ^0.8.0;
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, 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 from,
address to,
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);
}
文件 4 的 8:Ownable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_transferOwnership(_msgSender());
}
function owner() public view virtual returns (address) {
return _owner;
}
modifier onlyOwner() {
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);
}
}
文件 5 的 8:ReentrancyGuard.sol
pragma solidity ^0.8.0;
abstract contract ReentrancyGuard {
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
modifier nonReentrant() {
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
_status = _ENTERED;
_;
_status = _NOT_ENTERED;
}
}
文件 6 的 8:SafeCast.sol
pragma solidity ^0.8.0;
library SafeCast {
function toUint128(uint256 value) internal pure returns (uint128) {
require(value < 2 ** 128, "SafeCast: value doesn't fit in 128 bits");
return uint128(value);
}
function toUint256(int256 value) internal pure returns (uint256) {
require(value >= 0, "SafeCast: value must be positive");
return uint256(value);
}
function toInt128(int256 value) internal pure returns (int128) {
require(value >= type(int128).min && value <= type(int128).max, "SafeCast: value doesn't fit in 128 bits");
return int128(value);
}
function fromUint128ToUint256(uint128 value) internal pure returns (uint256) {
uint256 newVal = uint256(value);
return newVal;
}
function fromUint48ToUint256(uint48 value) internal pure returns (uint256) {
uint256 newVal = uint256(value);
return newVal;
}
}
文件 7 的 8:SafeERC20.sol
pragma solidity ^0.8.0;
import "../IERC20.sol";
import "../../../utils/Address.sol";
library SafeERC20 {
using Address for address;
function safeTransfer(
IERC20 token,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
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(
IERC20 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(
IERC20 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));
}
}
function _callOptionalReturn(IERC20 token, bytes memory data) private {
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
文件 8 的 8:VECakeProxy.sol
pragma solidity ^0.8.10;
import "@openzeppelin-4.5.0/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin-4.5.0/contracts/access/Ownable.sol";
import "@openzeppelin-4.5.0/contracts/security/ReentrancyGuard.sol";
import "./libraries/SafeCast.sol";
contract VECakeProxy is Ownable, ReentrancyGuard {
using SafeERC20 for IERC20;
event Deposit(address indexed locker, uint256 value, uint256 indexed lockTime, uint256 lockType, uint256 timestamp);
event WithdrawAll(address indexed locker, address indexed to, uint256 value, uint256 timestamp);
event Supply(uint256 previousSupply, uint256 supply);
event CreateLockFromCakePool(address indexed user, address indexed proxy, uint256 amount, uint256 endTime);
struct Point {
int128 bias;
int128 slope;
uint256 timestamp;
uint256 blockNumber;
}
struct LockedBalance {
int128 amount;
uint256 end;
}
struct UserInfo {
address cakePoolProxy;
uint128 cakeAmount;
uint48 lockEndTime;
uint48 migrationTime;
uint16 cakePoolType;
uint16 withdrawFlag;
}
uint16 public constant MIGRATION_FROM_CAKE_POOL_FLAG = 1;
uint256 public constant ACTION_CREATE_LOCK = 1;
uint256 public constant ACTION_INCREASE_LOCK_AMOUNT = 2;
uint256 public constant ACTION_INCREASE_UNLOCK_TIME = 3;
uint256 public constant WEEK = 7 days;
uint256 public constant MAX_LOCK = (209 * WEEK) - 1;
uint256 public constant MULTIPLIER = 10**18;
uint256 public supply;
mapping(address => LockedBalance) public locks;
mapping(address => UserInfo) public userInfo;
mapping(address => bool) public isCakePoolProxy;
uint256 public epoch;
Point[] public pointHistory;
mapping(address => Point[]) public userPointHistory;
mapping(address => uint256) public userPointEpoch;
mapping(uint256 => int128) public slopeChanges;
string public name;
string public symbol;
uint8 public decimals;
address public receiver;
modifier onlyReceiver() {
require(msg.sender == receiver, "None receiver!");
_;
}
constructor() {
pointHistory.push(Point({bias: 0, slope: 0, timestamp: block.timestamp, blockNumber: block.number}));
decimals = 18;
name = "Vote-escrowed Cake CrossChain";
symbol = "veCake";
}
function getUserInfo(address _user)
external
view
returns (
int128 amount,
uint256 end,
address cakePoolProxy,
uint128 cakeAmount,
uint48 lockEndTime,
uint48 migrationTime,
uint16 cakePoolType,
uint16 withdrawFlag
)
{
LockedBalance memory lock = locks[_user];
UserInfo memory user = userInfo[_user];
amount = lock.amount;
end = lock.end;
cakePoolProxy = user.cakePoolProxy;
cakeAmount = user.cakeAmount;
lockEndTime = user.lockEndTime;
migrationTime = user.migrationTime;
cakePoolType = user.cakePoolType;
withdrawFlag = user.withdrawFlag;
}
function balanceOfAtForProxy(address _user, uint256 _blockNumber) external view returns (uint256) {
require(_blockNumber <= block.number, "bad _blockNumber");
UserInfo memory user = userInfo[_user];
if (user.cakePoolProxy != address(0)) {
return _balanceOfAt(user.cakePoolProxy, _blockNumber);
}
}
function balanceOfAt(address _user, uint256 _blockNumber) external view returns (uint256) {
require(_blockNumber <= block.number, "bad _blockNumber");
UserInfo memory user = userInfo[_user];
if (user.cakePoolProxy != address(0)) {
return _balanceOfAt(_user, _blockNumber) + _balanceOfAt(user.cakePoolProxy, _blockNumber);
} else {
return _balanceOfAt(_user, _blockNumber);
}
}
function balanceOfAtUser(address _user, uint256 _blockNumber) external view returns (uint256) {
return _balanceOfAt(_user, _blockNumber);
}
function _balanceOfAt(address _user, uint256 _blockNumber) internal view returns (uint256) {
uint256 _userEpoch = _findUserBlockEpoch(_user, _blockNumber);
if (_userEpoch == 0) {
return 0;
}
Point memory _userPoint = userPointHistory[_user][_userEpoch];
uint256 _maxEpoch = epoch;
uint256 _epoch = _findBlockEpoch(_blockNumber, _maxEpoch);
Point memory _point0 = pointHistory[_epoch];
uint256 _blockDelta = 0;
uint256 _timeDelta = 0;
if (_epoch < _maxEpoch) {
Point memory _point1 = pointHistory[_epoch + 1];
_blockDelta = _point1.blockNumber - _point0.blockNumber;
_timeDelta = _point1.timestamp - _point0.timestamp;
} else {
_blockDelta = block.number - _point0.blockNumber;
_timeDelta = block.timestamp - _point0.timestamp;
}
uint256 _blockTime = _point0.timestamp;
if (_blockDelta != 0) {
_blockTime += (_timeDelta * (_blockNumber - _point0.blockNumber)) / _blockDelta;
}
_userPoint.bias -= (_userPoint.slope * SafeCast.toInt128(int256(_blockTime - _userPoint.timestamp)));
if (_userPoint.bias < 0) {
return 0;
}
return SafeCast.toUint256(_userPoint.bias);
}
function balanceOfForProxy(address _user) external view returns (uint256) {
UserInfo memory user = userInfo[_user];
if (user.cakePoolProxy != address(0)) {
return _balanceOf(user.cakePoolProxy, block.timestamp);
}
}
function balanceOf(address _user) external view returns (uint256) {
UserInfo memory user = userInfo[_user];
if (user.cakePoolProxy != address(0)) {
return _balanceOf(_user, block.timestamp) + _balanceOf(user.cakePoolProxy, block.timestamp);
} else {
return _balanceOf(_user, block.timestamp);
}
}
function balanceOfUser(address _user) external view returns (uint256) {
return _balanceOf(_user, block.timestamp);
}
function balanceOfAtTime(address _user, uint256 _timestamp) external view returns (uint256) {
return _balanceOf(_user, _timestamp);
}
function _balanceOf(address _user, uint256 _timestamp) internal view returns (uint256) {
uint256 _epoch = userPointEpoch[_user];
if (_epoch == 0) {
return 0;
}
Point memory _lastPoint = userPointHistory[_user][_epoch];
_lastPoint.bias =
_lastPoint.bias -
(_lastPoint.slope * SafeCast.toInt128(int256(_timestamp - _lastPoint.timestamp)));
if (_lastPoint.bias < 0) {
_lastPoint.bias = 0;
}
return SafeCast.toUint256(_lastPoint.bias);
}
function _checkpoint(
address _address,
LockedBalance memory _prevLocked,
LockedBalance memory _newLocked
) internal {
Point memory _userPrevPoint = Point({slope: 0, bias: 0, timestamp: 0, blockNumber: 0});
Point memory _userNewPoint = Point({slope: 0, bias: 0, timestamp: 0, blockNumber: 0});
int128 _prevSlopeDelta = 0;
int128 _newSlopeDelta = 0;
uint256 _epoch = epoch;
if (_address != address(0)) {
if (_prevLocked.end > block.timestamp && _prevLocked.amount > 0) {
_userPrevPoint.slope = _prevLocked.amount / SafeCast.toInt128(int256(MAX_LOCK));
_userPrevPoint.bias =
_userPrevPoint.slope *
SafeCast.toInt128(int256(_prevLocked.end - block.timestamp));
}
if (_newLocked.end > block.timestamp && _newLocked.amount > 0) {
_userNewPoint.slope = _newLocked.amount / SafeCast.toInt128(int256(MAX_LOCK));
_userNewPoint.bias = _userNewPoint.slope * SafeCast.toInt128(int256(_newLocked.end - block.timestamp));
}
uint256 _userEpoch = userPointEpoch[_address];
if (_userEpoch == 0) {
userPointHistory[_address].push(_userPrevPoint);
}
userPointEpoch[_address] = _userEpoch + 1;
_userNewPoint.timestamp = block.timestamp;
_userNewPoint.blockNumber = block.number;
userPointHistory[_address].push(_userNewPoint);
_prevSlopeDelta = slopeChanges[_prevLocked.end];
if (_newLocked.end != 0) {
if (_newLocked.end == _prevLocked.end) {
_newSlopeDelta = _prevSlopeDelta;
} else {
_newSlopeDelta = slopeChanges[_newLocked.end];
}
}
}
Point memory _lastPoint = Point({bias: 0, slope: 0, timestamp: block.timestamp, blockNumber: block.number});
if (_epoch > 0) {
_lastPoint = pointHistory[_epoch];
}
uint256 _lastCheckpoint = _lastPoint.timestamp;
Point memory _initialLastPoint = Point({
bias: 0,
slope: 0,
timestamp: _lastPoint.timestamp,
blockNumber: _lastPoint.blockNumber
});
uint256 _blockSlope = 0;
if (block.timestamp > _lastPoint.timestamp) {
_blockSlope =
(MULTIPLIER * (block.number - _lastPoint.blockNumber)) /
(block.timestamp - _lastPoint.timestamp);
}
uint256 _weekCursor = _timestampToFloorWeek(_lastCheckpoint);
for (uint256 i = 0; i < 255; i++) {
_weekCursor = _weekCursor + WEEK;
int128 _slopeDelta = 0;
if (_weekCursor > block.timestamp) {
_weekCursor = block.timestamp;
} else {
_slopeDelta = slopeChanges[_weekCursor];
}
int128 _biasDelta = _lastPoint.slope * SafeCast.toInt128(int256((_weekCursor - _lastCheckpoint)));
_lastPoint.bias = _lastPoint.bias - _biasDelta;
_lastPoint.slope = _lastPoint.slope + _slopeDelta;
if (_lastPoint.bias < 0) {
_lastPoint.bias = 0;
}
if (_lastPoint.slope < 0) {
_lastPoint.slope = 0;
}
_lastCheckpoint = _weekCursor;
_lastPoint.timestamp = _weekCursor;
_lastPoint.blockNumber =
_initialLastPoint.blockNumber +
((_blockSlope * ((_weekCursor - _initialLastPoint.timestamp))) / MULTIPLIER);
_epoch = _epoch + 1;
if (_weekCursor == block.timestamp) {
_lastPoint.blockNumber = block.number;
break;
} else {
pointHistory.push(_lastPoint);
}
}
epoch = _epoch;
if (_address != address(0)) {
_lastPoint.slope = _lastPoint.slope + _userNewPoint.slope - _userPrevPoint.slope;
_lastPoint.bias = _lastPoint.bias + _userNewPoint.bias - _userPrevPoint.bias;
if (_lastPoint.slope < 0) {
_lastPoint.slope = 0;
}
if (_lastPoint.bias < 0) {
_lastPoint.bias = 0;
}
}
pointHistory.push(_lastPoint);
if (_address != address(0)) {
if (_prevLocked.end > block.timestamp) {
_prevSlopeDelta = _prevSlopeDelta + _userPrevPoint.slope;
if (_newLocked.end == _prevLocked.end) {
_prevSlopeDelta = _prevSlopeDelta - _userNewPoint.slope;
}
slopeChanges[_prevLocked.end] = _prevSlopeDelta;
}
if (_newLocked.end > block.timestamp) {
if (_newLocked.end > _prevLocked.end) {
_newSlopeDelta = _newSlopeDelta - _userNewPoint.slope;
slopeChanges[_newLocked.end] = _newSlopeDelta;
}
}
}
}
function checkpoint() external {
LockedBalance memory empty = LockedBalance({amount: 0, end: 0});
_checkpoint(address(0), empty, empty);
}
function createLockFromCakePool(address _for, address _proxy, uint256 _amount, uint256 _end) external onlyReceiver nonReentrant {
require(_proxy != address(0), "proxy address is empty");
UserInfo storage user = userInfo[_for];
require(user.cakePoolType == 0, "Already migrated");
user.cakePoolType = MIGRATION_FROM_CAKE_POOL_FLAG;
isCakePoolProxy[_proxy] = true;
user.cakePoolProxy = _proxy;
user.migrationTime = uint48(block.timestamp);
user.cakeAmount = uint128(_amount);
user.lockEndTime = uint48(_end);
_createLock(_proxy, _amount, _end);
emit CreateLockFromCakePool(msg.sender, _proxy, _amount, _end);
}
function createLock(address _for, uint256 _amount, uint256 _unlockTime) external onlyReceiver nonReentrant {
_createLock(_for, _amount, _unlockTime);
}
function _createLock(address _for, uint256 _amount, uint256 _unlockTime) internal {
_unlockTime = _timestampToFloorWeek(_unlockTime);
LockedBalance memory _locked = locks[_for];
require(_amount > 0, "Bad _amount");
require(_locked.amount == 0, "Already locked");
require(_unlockTime > block.timestamp, "_unlockTime too old");
require(_unlockTime <= block.timestamp + MAX_LOCK, "_unlockTime too long");
_depositFor(_for, _amount, _unlockTime, _locked, ACTION_CREATE_LOCK);
}
function _depositFor(
address _for,
uint256 _amount,
uint256 _unlockTime,
LockedBalance memory _prevLocked,
uint256 _actionType
) internal {
LockedBalance memory _newLocked = LockedBalance({amount: _prevLocked.amount, end: _prevLocked.end});
_newLocked.amount = _newLocked.amount + SafeCast.toInt128(int256(_amount));
if (_unlockTime != 0) {
_newLocked.end = _unlockTime;
}
locks[_for] = _newLocked;
_checkpoint(_for, _prevLocked, _newLocked);
emit Deposit(_for, _amount, _newLocked.end, _actionType, block.timestamp);
}
function _findBlockEpoch(uint256 _blockNumber, uint256 _maxEpoch) internal view returns (uint256) {
uint256 _min = 0;
uint256 _max = _maxEpoch;
for (uint256 i = 0; i < 128; i++) {
if (_min >= _max) {
break;
}
uint256 _mid = (_min + _max + 1) / 2;
if (pointHistory[_mid].blockNumber <= _blockNumber) {
_min = _mid;
} else {
_max = _mid - 1;
}
}
return _min;
}
function _findUserBlockEpoch(address _user, uint256 _blockNumber) internal view returns (uint256) {
uint256 _min = 0;
uint256 _max = userPointEpoch[_user];
for (uint256 i = 0; i < 128; i++) {
if (_min >= _max) {
break;
}
uint256 _mid = (_min + _max + 1) / 2;
if (userPointHistory[_user][_mid].blockNumber <= _blockNumber) {
_min = _mid;
} else {
_max = _mid - 1;
}
}
return _min;
}
function increaseLockAmount(address _for, uint256 _amount) external onlyReceiver nonReentrant {
LockedBalance memory _lock = LockedBalance({amount: locks[_for].amount, end: locks[_for].end});
require(_amount > 0, "Bad _amount");
require(_lock.amount > 0, "No lock found");
require(_lock.end > block.timestamp, "Lock expired");
_depositFor(_for, _amount, 0, _lock, ACTION_INCREASE_LOCK_AMOUNT);
}
function increaseUnlockTime(address _for, uint256 _newUnlockTime) external onlyReceiver nonReentrant {
LockedBalance memory _lock = LockedBalance({amount: locks[_for].amount, end: locks[_for].end});
_newUnlockTime = _timestampToFloorWeek(_newUnlockTime);
require(_lock.amount > 0, "No lock found");
require(_lock.end > block.timestamp, "Lock expired");
require(_newUnlockTime > _lock.end, "_newUnlockTime too old");
require(_newUnlockTime <= block.timestamp + MAX_LOCK, "_newUnlockTime too long");
_depositFor(_for, 0, _newUnlockTime, _lock, ACTION_INCREASE_UNLOCK_TIME);
}
function _timestampToFloorWeek(uint256 _timestamp) internal pure returns (uint256) {
return (_timestamp / WEEK) * WEEK;
}
function withdrawAll(address _for, address _to) external onlyReceiver nonReentrant {
LockedBalance memory _lock = locks[_for];
if (_to == address(0)) {
_to = _for;
}
uint256 _amount = SafeCast.toUint256(_lock.amount);
_unlock(_for, _lock, _amount);
emit WithdrawAll(_for, _to, _amount, block.timestamp);
}
function _unlock(
address _user,
LockedBalance memory _lock,
uint256 _withdrawAmount
) internal {
uint256 _lockedAmount = SafeCast.toUint256(_lock.amount);
require(_withdrawAmount <= _lockedAmount, "Amount too large");
LockedBalance memory _prevLock = LockedBalance({end: _lock.end, amount: _lock.amount});
_lock.end = _lockedAmount == _withdrawAmount ? 0 : _lock.end;
_lock.amount = SafeCast.toInt128(int256(_lockedAmount - _withdrawAmount));
locks[_user] = _lock;
_checkpoint(_user, _prevLock, _lock);
}
function updateReceiver(address _receiver) external onlyOwner {
require(receiver != _receiver, "receiver not change");
receiver = _receiver;
}
function updateTotalSupply(uint256 _supply) external nonReentrant onlyReceiver {
uint256 previousSupply = supply;
supply = _supply;
emit Supply(previousSupply, _supply);
}
function totalSupply() external view returns (uint256) {
return supply;
}
}
{
"compilationTarget": {
"contracts/VECakeProxy.sol": "VECakeProxy"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 1
},
"remappings": []
}
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"proxy","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"}],"name":"CreateLockFromCakePool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"locker","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"lockTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lockType","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"supply","type":"uint256"}],"name":"Supply","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"locker","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"WithdrawAll","type":"event"},{"inputs":[],"name":"ACTION_CREATE_LOCK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ACTION_INCREASE_LOCK_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ACTION_INCREASE_UNLOCK_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_LOCK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIGRATION_FROM_CAKE_POOL_FLAG","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MULTIPLIER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WEEK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_blockNumber","type":"uint256"}],"name":"balanceOfAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_blockNumber","type":"uint256"}],"name":"balanceOfAtForProxy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"balanceOfAtTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_blockNumber","type":"uint256"}],"name":"balanceOfAtUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"balanceOfForProxy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"balanceOfUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkpoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_unlockTime","type":"uint256"}],"name":"createLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"address","name":"_proxy","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_end","type":"uint256"}],"name":"createLockFromCakePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserInfo","outputs":[{"internalType":"int128","name":"amount","type":"int128"},{"internalType":"uint256","name":"end","type":"uint256"},{"internalType":"address","name":"cakePoolProxy","type":"address"},{"internalType":"uint128","name":"cakeAmount","type":"uint128"},{"internalType":"uint48","name":"lockEndTime","type":"uint48"},{"internalType":"uint48","name":"migrationTime","type":"uint48"},{"internalType":"uint16","name":"cakePoolType","type":"uint16"},{"internalType":"uint16","name":"withdrawFlag","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"increaseLockAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"uint256","name":"_newUnlockTime","type":"uint256"}],"name":"increaseUnlockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isCakePoolProxy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"locks","outputs":[{"internalType":"int128","name":"amount","type":"int128"},{"internalType":"uint256","name":"end","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pointHistory","outputs":[{"internalType":"int128","name":"bias","type":"int128"},{"internalType":"int128","name":"slope","type":"int128"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"receiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"slopeChanges","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"updateReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"}],"name":"updateTotalSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"address","name":"cakePoolProxy","type":"address"},{"internalType":"uint128","name":"cakeAmount","type":"uint128"},{"internalType":"uint48","name":"lockEndTime","type":"uint48"},{"internalType":"uint48","name":"migrationTime","type":"uint48"},{"internalType":"uint16","name":"cakePoolType","type":"uint16"},{"internalType":"uint16","name":"withdrawFlag","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userPointEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userPointHistory","outputs":[{"internalType":"int128","name":"bias","type":"int128"},{"internalType":"int128","name":"slope","type":"int128"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]