编译器
0.8.18+commit.87f61d96
文件 1 的 10: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 functionCallWithValue(target, data, 0, "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");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, 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) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, 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) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
文件 2 的 10: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 的 10:IERC20.sol
pragma solidity ^0.8.0;
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
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);
}
文件 4 的 10:IStakingGenesisNFT.sol
pragma solidity ^0.8.18;
interface IStakingGenesisNFT {
function setFinalTimestamp(uint256 finalTimestamp) external;
function stake(uint256[] calldata tokenIdsSmall, uint256[] calldata tokenIdsLarge) external;
function unstake(uint256[] calldata tokenIdsSmall, uint256[] calldata tokenIdsLarge) external;
function getRewardSmall(address account) external view returns (uint256);
function getRewardLarge(address account) external view returns (uint256);
function getStakedTokensSmall(address account) external view returns (uint256[] memory);
function getStakedTokensLarge(address account) external view returns (uint256[] memory);
}
文件 5 的 10:IStakingGenesisNFTVesting.sol
pragma solidity ^0.8.18;
interface IStakingGenesisNFTVesting {
struct Rewards {
address account;
uint256 series1Rewards;
uint256 series2Rewards;
}
event Released(address indexed beneficiary, uint256 indexed amount);
event RewardsSet(Rewards[] rewards);
event LostWalletSet(address indexed wallet);
event LostWalletReseted(address indexed wallet);
event EmergencyWithdrawalPerformed(address indexed from, address indexed to);
event DistributionStartTimestampSet(uint256 timestamp);
function release() external;
function setRewards(Rewards[] memory _rewards) external;
function setLostWallet(address _wallet) external;
function setDistributionStartTimestamp(uint256 _timestamp) external;
function resetLostWallet(address _wallet) external;
function emergencyWithdraw(address _from, address _to) external;
function releaseableAmount(address _account) external view returns (uint256);
function wlth() external view returns (address);
function allocation() external view returns (uint256);
function distributionStartTimestamp() external view returns (uint256);
function releasedAmount() external view returns (uint256);
function totalRewards() external view returns (uint256);
function userClaimed(address _account) external view returns (bool);
function series1Rewards(address _account) external view returns (uint256);
function series2Rewards(address _account) external view returns (uint256);
function lostWallet(address _wallet) external view returns (bool);
}
文件 6 的 10:IWithdrawal.sol
pragma solidity ^0.8.18;
interface IWithdrawal {
event LeftoversWithdrawn(address indexed account, uint256 indexed amount);
event SurplusWithdrawn(address indexed account, uint256 indexed amount);
function withdrawLeftovers(address _account) external;
function withdrawSurplus(address _account) external;
function leftoversUnlockDelay() external view returns (uint256);
}
文件 7 的 10: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());
}
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);
}
}
文件 8 的 10:SafeERC20.sol
pragma solidity ^0.8.0;
import "../IERC20.sol";
import "../extensions/draft-IERC20Permit.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 safePermit(
IERC20Permit token,
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) internal {
uint256 nonceBefore = token.nonces(owner);
token.permit(owner, spender, value, deadline, v, r, s);
uint256 nonceAfter = token.nonces(owner);
require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
}
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");
}
}
}
文件 9 的 10:StakingGenesisNFTVesting.sol
pragma solidity ^0.8.18;
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {IStakingGenesisNFT} from "../interfaces/IStakingGenesisNFT.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {IStakingGenesisNFTVesting} from "../interfaces/IStakingGenesisNFTVesting.sol";
import {IWithdrawal} from "../interfaces/IWithdrawal.sol";
error StakingGenesisNFTVesting__OwnerZeroAddress();
error StakingGenesisNFTVesting__WlthZeroAddress();
error StakingGenesisNFTVesting__AddressFromZeroAddress();
error StakingGenesisNFTVesting__AddressToZeroAddress();
error StakingGenesisNFTVesting__DistributionNotStarted();
error StakingGenesisNFTVesting__NotEnoughTokens();
error StakingGenesisNFTVesting__PastDistributionStartTimestamp();
error StakingGenesisNFTVesting__NoRewardsForUser(address account);
error StakingGenesisNFTVesting__RewardsTooHigh(uint256 allocation, uint256 totalRewards);
error StakingGenesisNFTVesting__DistributionStartTimestampAlreadySet();
error StakingGenesisNFTVesting__LeftoversWithdrawalLocked();
error StakingGenesisNFTVesting__WalletLost(address wallet);
error StakingGenesisNFTVesting__WalletAlreadyLost(address wallet);
error StakingGenesisNFTVesting__WalletNotLost(address wallet);
error StakingGenesisNFTVesting__NoSurplus(uint256 balance, uint256 released, uint256 allocation);
contract StakingGenesisNFTVesting is IStakingGenesisNFTVesting, IWithdrawal, Ownable {
using SafeERC20 for IERC20;
IERC20 private immutable i_wlth;
uint256 private immutable i_allocation;
uint256 private immutable i_leftoversUnlockDelay;
uint256 private s_distributionStartTimestamp;
uint256 private s_releasedAmount;
uint256 private s_totalRewards;
mapping(address => bool) private s_userClaimed;
mapping(address => uint256) private s_series1Rewards;
mapping(address => uint256) private s_series2Rewards;
mapping(address => bool) private s_walletAccessLost;
modifier distributionStarted() {
if (s_distributionStartTimestamp == 0 || block.timestamp < s_distributionStartTimestamp)
revert StakingGenesisNFTVesting__DistributionNotStarted();
_;
}
constructor(
address _owner,
address _wlth,
uint256 _allocation,
uint256 _distributionStartTimestamp,
uint256 _leftoversUnlockDelay
) {
if (_owner == address(0)) revert StakingGenesisNFTVesting__OwnerZeroAddress();
if (_wlth == address(0)) revert StakingGenesisNFTVesting__WlthZeroAddress();
if (_distributionStartTimestamp > 0 && _distributionStartTimestamp < block.timestamp)
revert StakingGenesisNFTVesting__PastDistributionStartTimestamp();
i_wlth = IERC20(_wlth);
i_allocation = _allocation;
i_leftoversUnlockDelay = _leftoversUnlockDelay;
s_distributionStartTimestamp = _distributionStartTimestamp;
_transferOwnership(_owner);
}
function release() external override {
if (s_walletAccessLost[msg.sender]) revert StakingGenesisNFTVesting__WalletLost(msg.sender);
_release(msg.sender, msg.sender);
}
function setRewards(Rewards[] calldata _rewards) external override onlyOwner {
uint256 rewards = s_totalRewards;
for (uint256 i; i < _rewards.length; ) {
rewards += _rewards[i].series1Rewards + _rewards[i].series2Rewards;
if (rewards > i_allocation) revert StakingGenesisNFTVesting__RewardsTooHigh(i_allocation, rewards);
s_series1Rewards[_rewards[i].account] = _rewards[i].series1Rewards;
s_series2Rewards[_rewards[i].account] = _rewards[i].series2Rewards;
unchecked {
i++;
}
}
s_totalRewards = rewards;
emit RewardsSet(_rewards);
}
function setLostWallet(address _wallet) external override onlyOwner {
if (s_walletAccessLost[_wallet]) revert StakingGenesisNFTVesting__WalletAlreadyLost(_wallet);
s_walletAccessLost[_wallet] = true;
emit LostWalletSet(_wallet);
}
function resetLostWallet(address _wallet) external override onlyOwner {
if (!s_walletAccessLost[_wallet]) revert StakingGenesisNFTVesting__WalletNotLost(_wallet);
s_walletAccessLost[_wallet] = false;
emit LostWalletReseted(_wallet);
}
function setDistributionStartTimestamp(uint256 _timestamp) external override onlyOwner {
if (s_distributionStartTimestamp != 0) revert StakingGenesisNFTVesting__DistributionStartTimestampAlreadySet();
if (_timestamp < block.timestamp) revert StakingGenesisNFTVesting__PastDistributionStartTimestamp();
s_distributionStartTimestamp = _timestamp;
emit DistributionStartTimestampSet(_timestamp);
}
function emergencyWithdraw(address _from, address _to) external override onlyOwner {
if (!s_walletAccessLost[_from]) revert StakingGenesisNFTVesting__WalletNotLost(_from);
emit EmergencyWithdrawalPerformed(_from, _to);
_release(_from, _to);
}
function withdrawLeftovers(address _account) external override onlyOwner distributionStarted {
if (block.timestamp < s_distributionStartTimestamp + i_leftoversUnlockDelay)
revert StakingGenesisNFTVesting__LeftoversWithdrawalLocked();
emit LeftoversWithdrawn(_account, i_wlth.balanceOf(address(this)));
i_wlth.safeTransfer(_account, i_wlth.balanceOf(address(this)));
}
function withdrawSurplus(address _wallet) external override onlyOwner {
uint256 balance = i_wlth.balanceOf(address(this));
uint256 alreadyReleased = s_releasedAmount;
if (balance + alreadyReleased <= i_allocation)
revert StakingGenesisNFTVesting__NoSurplus(balance, alreadyReleased, i_allocation);
uint256 surplus = balance + alreadyReleased - i_allocation;
emit SurplusWithdrawn(_wallet, surplus);
i_wlth.safeTransfer(_wallet, surplus);
}
function wlth() external view override returns (address) {
return address(i_wlth);
}
function allocation() external view override returns (uint256) {
return i_allocation;
}
function distributionStartTimestamp() external view override returns (uint256) {
return s_distributionStartTimestamp;
}
function releasedAmount() external view override returns (uint256) {
return s_releasedAmount;
}
function totalRewards() external view override returns (uint256) {
return s_totalRewards;
}
function userClaimed(address _account) external view override returns (bool) {
return s_userClaimed[_account];
}
function series1Rewards(address _account) external view override returns (uint256) {
return s_series1Rewards[_account];
}
function series2Rewards(address _account) external view override returns (uint256) {
return s_series2Rewards[_account];
}
function releaseableAmount(address _account) public view override returns (uint256) {
return s_userClaimed[_account] ? 0 : s_series1Rewards[_account] + s_series2Rewards[_account];
}
function leftoversUnlockDelay() external view override returns (uint256) {
return i_leftoversUnlockDelay;
}
function lostWallet(address _wallet) external view override returns (bool) {
return s_walletAccessLost[_wallet];
}
function _release(address _from, address _to) private distributionStarted {
if (_from == address(0)) revert StakingGenesisNFTVesting__AddressFromZeroAddress();
if (_to == address(0)) revert StakingGenesisNFTVesting__AddressToZeroAddress();
uint256 amount = releaseableAmount(_from);
if (amount == 0) revert StakingGenesisNFTVesting__NoRewardsForUser(_from);
if (amount > i_wlth.balanceOf(address(this))) revert StakingGenesisNFTVesting__NotEnoughTokens();
s_releasedAmount += amount;
s_userClaimed[_from] = true;
emit Released(_to, amount);
i_wlth.safeTransfer(_to, amount);
}
}
文件 10 的 10:draft-IERC20Permit.sol
pragma solidity ^0.8.0;
interface IERC20Permit {
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
function nonces(address owner) external view returns (uint256);
function DOMAIN_SEPARATOR() external view returns (bytes32);
}
{
"compilationTarget": {
"contracts/tge/StakingGenesisNFTVesting.sol": "StakingGenesisNFTVesting"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_wlth","type":"address"},{"internalType":"uint256","name":"_allocation","type":"uint256"},{"internalType":"uint256","name":"_distributionStartTimestamp","type":"uint256"},{"internalType":"uint256","name":"_leftoversUnlockDelay","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"StakingGenesisNFTVesting__AddressFromZeroAddress","type":"error"},{"inputs":[],"name":"StakingGenesisNFTVesting__AddressToZeroAddress","type":"error"},{"inputs":[],"name":"StakingGenesisNFTVesting__DistributionNotStarted","type":"error"},{"inputs":[],"name":"StakingGenesisNFTVesting__DistributionStartTimestampAlreadySet","type":"error"},{"inputs":[],"name":"StakingGenesisNFTVesting__LeftoversWithdrawalLocked","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"StakingGenesisNFTVesting__NoRewardsForUser","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"released","type":"uint256"},{"internalType":"uint256","name":"allocation","type":"uint256"}],"name":"StakingGenesisNFTVesting__NoSurplus","type":"error"},{"inputs":[],"name":"StakingGenesisNFTVesting__NotEnoughTokens","type":"error"},{"inputs":[],"name":"StakingGenesisNFTVesting__OwnerZeroAddress","type":"error"},{"inputs":[],"name":"StakingGenesisNFTVesting__PastDistributionStartTimestamp","type":"error"},{"inputs":[{"internalType":"uint256","name":"allocation","type":"uint256"},{"internalType":"uint256","name":"totalRewards","type":"uint256"}],"name":"StakingGenesisNFTVesting__RewardsTooHigh","type":"error"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"StakingGenesisNFTVesting__WalletAlreadyLost","type":"error"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"StakingGenesisNFTVesting__WalletLost","type":"error"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"StakingGenesisNFTVesting__WalletNotLost","type":"error"},{"inputs":[],"name":"StakingGenesisNFTVesting__WlthZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"DistributionStartTimestampSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"EmergencyWithdrawalPerformed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LeftoversWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"wallet","type":"address"}],"name":"LostWalletReseted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"wallet","type":"address"}],"name":"LostWalletSet","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":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Released","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"series1Rewards","type":"uint256"},{"internalType":"uint256","name":"series2Rewards","type":"uint256"}],"indexed":false,"internalType":"struct IStakingGenesisNFTVesting.Rewards[]","name":"rewards","type":"tuple[]"}],"name":"RewardsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SurplusWithdrawn","type":"event"},{"inputs":[],"name":"allocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distributionStartTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"leftoversUnlockDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"lostWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"releaseableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"releasedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"resetLostWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"series1Rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"series2Rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"setDistributionStartTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"setLostWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"series1Rewards","type":"uint256"},{"internalType":"uint256","name":"series2Rewards","type":"uint256"}],"internalType":"struct IStakingGenesisNFTVesting.Rewards[]","name":"_rewards","type":"tuple[]"}],"name":"setRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalRewards","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":"_account","type":"address"}],"name":"userClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"withdrawLeftovers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"withdrawSurplus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wlth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]