编译器
0.8.11+commit.d7f03943
文件 1 的 11: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 的 11: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 的 11:ERC20.sol
pragma solidity ^0.8.0;
import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";
contract ERC20 is Context, IERC20, IERC20Metadata {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
function name() public view virtual override returns (string memory) {
return _name;
}
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
function decimals() public view virtual override returns (uint8) {
return 18;
}
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
function transfer(address to, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_transfer(owner, to, amount);
return true;
}
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_approve(owner, spender, amount);
return true;
}
function transferFrom(
address from,
address to,
uint256 amount
) public virtual override returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, amount);
_transfer(from, to, amount);
return true;
}
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, _allowances[owner][spender] + addedValue);
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
address owner = _msgSender();
uint256 currentAllowance = _allowances[owner][spender];
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
unchecked {
_approve(owner, spender, currentAllowance - subtractedValue);
}
return true;
}
function _transfer(
address from,
address to,
uint256 amount
) internal virtual {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(from, to, amount);
uint256 fromBalance = _balances[from];
require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[from] = fromBalance - amount;
}
_balances[to] += amount;
emit Transfer(from, to, amount);
_afterTokenTransfer(from, to, amount);
}
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply += amount;
_balances[account] += amount;
emit Transfer(address(0), account, amount);
_afterTokenTransfer(address(0), account, amount);
}
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
unchecked {
_balances[account] = accountBalance - amount;
}
_totalSupply -= amount;
emit Transfer(account, address(0), amount);
_afterTokenTransfer(account, address(0), amount);
}
function _approve(
address owner,
address spender,
uint256 amount
) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function _spendAllowance(
address owner,
address spender,
uint256 amount
) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
require(currentAllowance >= amount, "ERC20: insufficient allowance");
unchecked {
_approve(owner, spender, currentAllowance - amount);
}
}
}
function _beforeTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
function _afterTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
}
文件 4 的 11:IERC165.sol
pragma solidity ^0.8.0;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 5 的 11: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);
}
文件 6 的 11:IERC20Metadata.sol
pragma solidity ^0.8.0;
import "../IERC20.sol";
interface IERC20Metadata is IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
}
文件 7 的 11:IERC721.sol
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
interface IERC721 is IERC165 {
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
function balanceOf(address owner) external view returns (uint256 balance);
function ownerOf(uint256 tokenId) external view returns (address owner);
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
function approve(address to, uint256 tokenId) external;
function getApproved(uint256 tokenId) external view returns (address operator);
function setApprovalForAll(address operator, bool _approved) external;
function isApprovedForAll(address owner, address operator) external view returns (bool);
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
}
文件 8 的 11:IERC721Receiver.sol
pragma solidity ^0.8.0;
interface IERC721Receiver {
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
文件 9 的 11: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);
}
}
文件 10 的 11: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;
}
}
文件 11 的 11:growoperationv2.sol
pragma solidity 0.8.11;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
interface IRandomizer {
function random(
uint256 from,
uint256 to,
uint256 salty
) external view returns (uint256);
}
interface ITOKE {
function mint(address to, uint256 amount) external;
function burn(address from, uint256 amount) external;
function updateOriginAccess() external;
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
}
interface ISTAC {
function ownerOf(uint256 tokenId) external view returns (address owner);
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
function getTokenTraits(uint256 tokenId) external view returns (bool, uint256);
}
contract TheGrowOperationV2 is Ownable, IERC721Receiver, ReentrancyGuard {
uint8 public constant MAX_ALPHA = 10;
uint256 public ALPHA_RATIO = 1000;
struct Stake {
uint256 tokenId;
uint256 value;
address owner;
}
event TokenStaked(address indexed owner, uint256 indexed tokenId, uint256 value);
event FedApeClaimed(uint256 indexed tokenId, uint256 earned, bool unstaked);
event StonedApeClaimed(uint256 indexed tokenId, uint256 earned, bool unstaked);
ISTAC public stac;
ITOKE public toke;
IRandomizer randomizer;
address private devWallet;
mapping(uint256 => Stake) public GrowOperation;
mapping(uint256 => Stake[]) public dea;
mapping(uint256 => uint256) public deaIndices;
uint256 public totalAlphaStaked = 0;
uint256 public unaccountedRewards = 0;
uint256 public TokePerAlpha = 0;
uint256 public DAILY_TOKE_RATE = 10000 ether;
uint256 public PETS_DAILY_TOKE_RATE = 2000 ether;
uint256 public petsStartTokenId = 7500;
uint256 public petsEndTokenId = 10000;
uint256 public MINIMUM_TO_EXIT = 2 days;
uint256 public constant TOKE_CLAIM_TAX_PERCENTAGE = 20;
uint256 public MAXIMUM_GLOBAL_TOKE = 4200000000 ether;
uint256 public totalTOKEEarned;
uint256 public totalStonedApesStaked;
uint256 public lastClaimTimestamp;
uint256 public stakeStartTime = block.timestamp - 1;
bool public rescueEnabled = false;
modifier onlyDev() {
require(msg.sender == devWallet, "only dev");
_;
}
constructor() {
devWallet = msg.sender;
}
function stake(uint256[] calldata tokenIds) external nonReentrant {
require(block.timestamp > stakeStartTime, "not live");
for (uint256 i = 0; i < tokenIds.length; i++) {
uint256 tokenId = tokenIds[i];
require(stac.ownerOf(tokenId) == msg.sender, "msg.sender not owner of tokenID");
stac.transferFrom(msg.sender, address(this), tokenId);
if (!isFed(tokenId)) {
_addApeToGrowOperation(tokenId);
} else {
_addFedApeToDEA(tokenId);
}
}
}
function _addApeToGrowOperation(uint256 tokenId) internal _updateEarnings {
GrowOperation[tokenId] = Stake({ owner: msg.sender, tokenId: tokenId, value: block.timestamp });
totalStonedApesStaked += 1;
emit TokenStaked(msg.sender, tokenId, block.timestamp);
}
function _addFedApeToDEA(uint256 tokenId) internal {
uint256 alpha = _alphaForApe(tokenId);
totalAlphaStaked += alpha;
deaIndices[tokenId] = dea[alpha].length;
dea[alpha].push(Stake({ owner: msg.sender, tokenId: tokenId, value: TokePerAlpha }));
emit TokenStaked(msg.sender, tokenId, TokePerAlpha);
}
function claim(uint256[] calldata tokenIds, bool unstake) external _updateEarnings nonReentrant {
uint256 owed = 0;
for (uint256 i = 0; i < tokenIds.length; i++) {
if (!isFed(tokenIds[i])) {
owed += _claimStonedApeFromGrowOperation(tokenIds[i], unstake);
} else {
owed += _claimFedApeFromDEA(tokenIds[i], unstake);
}
}
toke.updateOriginAccess();
if (owed != 0) {
toke.mint(msg.sender, owed);
}
}
function _claimStonedApeFromGrowOperation(uint256 tokenId, bool unstake) internal returns (uint256 owed) {
Stake memory _stake = GrowOperation[tokenId];
require(_stake.owner == msg.sender, "msg.sender not stake.owner");
require(
!(unstake && block.timestamp - _stake.value < MINIMUM_TO_EXIT),
"block.timestamp - stake.value < MINIMUM_TO_EXIT"
);
owed = getOwedToke(tokenId);
if (unstake) {
if (randomizer.random(0, 100, tokenId) > 50) {
_payStonedApeTax(owed);
owed = 0;
}
stac.safeTransferFrom(address(this), msg.sender, tokenId, "");
delete GrowOperation[tokenId];
totalStonedApesStaked -= 1;
} else {
_payStonedApeTax((owed * TOKE_CLAIM_TAX_PERCENTAGE) / 100);
owed = (owed * (100 - TOKE_CLAIM_TAX_PERCENTAGE)) / 100;
GrowOperation[tokenId] = Stake({
owner: msg.sender,
tokenId: uint256(tokenId),
value: uint256(block.timestamp)
});
}
emit StonedApeClaimed(tokenId, owed, unstake);
}
function _claimFedApeFromDEA(uint256 tokenId, bool unstake) internal returns (uint256 owed) {
require(stac.ownerOf(tokenId) == address(this), "Fed Ape is not staked in the DEA");
uint256 alpha = _alphaForApe(tokenId);
Stake memory _stake = dea[alpha][deaIndices[tokenId]];
require(_stake.owner == msg.sender, "msg.sender is not stake.owner");
owed = getOwedToke(tokenId);
if (unstake) {
totalAlphaStaked -= alpha;
stac.safeTransferFrom(address(this), msg.sender, tokenId, "");
Stake memory lastStake = dea[alpha][dea[alpha].length - 1];
dea[alpha][deaIndices[tokenId]] = lastStake;
deaIndices[lastStake.tokenId] = deaIndices[tokenId];
dea[alpha].pop();
delete deaIndices[tokenId];
} else {
dea[alpha][deaIndices[tokenId]] = Stake({
owner: msg.sender,
tokenId: uint256(tokenId),
value: uint256(TokePerAlpha)
});
}
emit FedApeClaimed(tokenId, owed, unstake);
}
function rescue(uint256[] calldata tokenIds) external nonReentrant {
require(rescueEnabled, "RESCUE DISABLED");
uint256 tokenId;
Stake memory _stake;
Stake memory lastStake;
uint256 alpha;
for (uint256 i = 0; i < tokenIds.length; i++) {
tokenId = tokenIds[i];
if (!isFed(tokenId)) {
_stake = GrowOperation[tokenId];
require(_stake.owner == msg.sender, "msg.sender is not stake.owner");
stac.safeTransferFrom(address(this), msg.sender, tokenId, "");
delete GrowOperation[tokenId];
totalStonedApesStaked -= 1;
emit StonedApeClaimed(tokenId, 0, true);
} else {
alpha = _alphaForApe(tokenId);
_stake = dea[alpha][deaIndices[tokenId]];
require(_stake.owner == msg.sender, "msg.sender is not stake.owner");
totalAlphaStaked -= alpha;
stac.safeTransferFrom(address(this), msg.sender, tokenId, "");
lastStake = dea[alpha][dea[alpha].length - 1];
dea[alpha][deaIndices[tokenId]] = lastStake;
deaIndices[lastStake.tokenId] = deaIndices[tokenId];
dea[alpha].pop();
delete deaIndices[tokenId];
emit FedApeClaimed(tokenId, 0, true);
}
}
}
function _payStonedApeTax(uint256 amount) internal {
if (totalAlphaStaked == 0) {
unaccountedRewards += amount;
return;
}
TokePerAlpha += (amount + unaccountedRewards) / totalAlphaStaked;
unaccountedRewards = 0;
}
modifier _updateEarnings() {
if (totalTOKEEarned < MAXIMUM_GLOBAL_TOKE) {
totalTOKEEarned +=
((block.timestamp - lastClaimTimestamp) * totalStonedApesStaked * DAILY_TOKE_RATE) /
1 days;
lastClaimTimestamp = block.timestamp;
}
_;
}
function setMinimumToExit(uint256 _amount) external onlyOwner {
MINIMUM_TO_EXIT = _amount;
}
function setMaximumToke(uint256 _max) external onlyOwner {
MAXIMUM_GLOBAL_TOKE = _max;
}
function setStakeStartTime(uint256 newTime) external onlyOwner {
stakeStartTime = newTime;
}
function setDailyTokeRate(uint256 _newRate) external onlyOwner {
DAILY_TOKE_RATE = _newRate;
}
function setPetsDailyTokeRate(uint256 _newRate) external onlyOwner {
PETS_DAILY_TOKE_RATE = _newRate;
}
function setPetsStartTokenId(uint256 _tokenId) external onlyOwner {
petsStartTokenId = _tokenId;
}
function setPetsEndTokenId(uint256 _tokenId) external onlyOwner {
petsEndTokenId = _tokenId;
}
function setRescueEnabled(bool _enabled) external onlyDev {
rescueEnabled = _enabled;
}
function setToke(address payable _toke) external onlyOwner {
toke = ITOKE(_toke);
}
function setSTAC(address _stac) external onlyOwner {
stac = ISTAC(_stac);
}
function setRandomizer(address _newRandomizer) external onlyOwner {
randomizer = IRandomizer(_newRandomizer);
}
function setalphaRatio(uint256 _newRatio) external onlyDev {
ALPHA_RATIO = _newRatio;
}
function isFed(uint256 tokenId) public view returns (bool _isFed) {
(_isFed, ) = stac.getTokenTraits(tokenId);
if(isPet(tokenId) && _isFed) {
_isFed = false;
}
}
function isPet(uint256 tokenId) public view returns (bool _isPet) {
_isPet = (tokenId >= petsStartTokenId && tokenId <= petsEndTokenId);
}
function _alphaForApe(uint256 tokenId) internal view returns (uint256) {
(, uint256 alphaIndex) = stac.getTokenTraits(tokenId);
(tokenId);
return alphaIndex;
}
function randomFedApeOwner(uint256 seed) external view returns (address) {
if (totalAlphaStaked == 0) return address(0x0);
uint256 bucket = (seed & 0xFFFFFFFF) % totalAlphaStaked;
uint256 cumulative;
seed >>= 32;
for (uint256 i = 1; i <= MAX_ALPHA; i++) {
cumulative += dea[i].length * i;
if (bucket >= cumulative) continue;
return dea[i][seed % dea[i].length].owner;
}
return address(0x0);
}
function getOwedToke(uint256 tokenId) public view returns (uint256 owed) {
require(stac.ownerOf(tokenId) == address(this), "Token is not staked.");
Stake memory _stake = GrowOperation[tokenId];
if (!isFed(tokenId)) {
if (totalTOKEEarned < MAXIMUM_GLOBAL_TOKE && !isPet(tokenId)) {
owed = ((block.timestamp - _stake.value) * DAILY_TOKE_RATE) / 1 days;
}
else if (totalTOKEEarned < MAXIMUM_GLOBAL_TOKE && isPet(tokenId)) {
owed = ((block.timestamp - _stake.value) * PETS_DAILY_TOKE_RATE) / 1 days;
}
else if (_stake.value > lastClaimTimestamp) {
owed = 0;
} else {
owed = ((lastClaimTimestamp - _stake.value) * DAILY_TOKE_RATE) / 1 days;
}
return owed;
}
uint256 alpha = _alphaForApe(tokenId);
_stake = dea[alpha][deaIndices[tokenId]];
owed = ((alpha * ALPHA_RATIO) / 1000) * (TokePerAlpha - _stake.value);
return owed;
}
function onERC721Received(
address,
address,
uint256,
bytes calldata
) external pure override returns (bytes4) {
return IERC721Receiver.onERC721Received.selector;
}
function withdraw() external {
uint256 totalBalance = address(this).balance;
uint256 devFee = _calcPercentage(totalBalance, 500);
payable(owner()).transfer(totalBalance - devFee);
payable(devWallet).transfer(devFee);
}
function reclaimERC20(IERC20 erc20Token) external onlyOwner {
erc20Token.transfer(msg.sender, erc20Token.balanceOf(address(this)));
}
function reclaimERC721(IERC721 erc721Token, uint256 id) external onlyOwner {
erc721Token.safeTransferFrom(address(this), msg.sender, id);
}
function _calcPercentage(uint256 amount, uint256 basisPoints) internal pure returns (uint256) {
require(basisPoints >= 0);
return (amount * basisPoints) / 10000;
}
}
{
"compilationTarget": {
"STAC v2/growoperationv2.sol": "TheGrowOperationV2"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 2000
},
"remappings": []
}
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"earned","type":"uint256"},{"indexed":false,"internalType":"bool","name":"unstaked","type":"bool"}],"name":"FedApeClaimed","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":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"earned","type":"uint256"},{"indexed":false,"internalType":"bool","name":"unstaked","type":"bool"}],"name":"StonedApeClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TokenStaked","type":"event"},{"inputs":[],"name":"ALPHA_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DAILY_TOKE_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"GrowOperation","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_GLOBAL_TOKE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ALPHA","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM_TO_EXIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PETS_DAILY_TOKE_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKE_CLAIM_TAX_PERCENTAGE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TokePerAlpha","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"bool","name":"unstake","type":"bool"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"dea","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"deaIndices","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwedToke","outputs":[{"internalType":"uint256","name":"owed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isFed","outputs":[{"internalType":"bool","name":"_isFed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isPet","outputs":[{"internalType":"bool","name":"_isPet","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastClaimTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"petsEndTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"petsStartTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"seed","type":"uint256"}],"name":"randomFedApeOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"erc20Token","type":"address"}],"name":"reclaimERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC721","name":"erc721Token","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"reclaimERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"rescue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rescueEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newRate","type":"uint256"}],"name":"setDailyTokeRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setMaximumToke","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMinimumToExit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newRate","type":"uint256"}],"name":"setPetsDailyTokeRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"setPetsEndTokenId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"setPetsStartTokenId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newRandomizer","type":"address"}],"name":"setRandomizer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setRescueEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stac","type":"address"}],"name":"setSTAC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTime","type":"uint256"}],"name":"setStakeStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_toke","type":"address"}],"name":"setToke","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newRatio","type":"uint256"}],"name":"setalphaRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stac","outputs":[{"internalType":"contract ISTAC","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakeStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toke","outputs":[{"internalType":"contract ITOKE","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAlphaStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStonedApesStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTOKEEarned","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":[],"name":"unaccountedRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]