编译器
0.8.11+commit.d7f03943
文件 1 的 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;
}
}
文件 2 的 10:IClaim.sol
pragma solidity 0.8.11;
interface IClaim {
function initClaim(address _payee, uint256 _amount) external payable;
}
文件 3 的 10:IERC721Receiver.sol
pragma solidity ^0.8.0;
interface IERC721Receiver {
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
文件 4 的 10:NFTContractFunctions.sol
pragma solidity 0.8.11;
interface NFTContractFunctions {
function balanceOf(address owner) external view returns (uint256);
function ownerOf(uint256 tokenId) external view returns (address owner);
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
function setApprovalForAll(address operator, bool _approved) external;
function isApprovedForAll(address owner, address operator)
external
view
returns (bool);
function approve(address to, uint256 tokenId) external;
}
文件 5 的 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());
}
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);
}
}
文件 6 的 10:Pausable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Pausable is Context {
event Paused(address account);
event Unpaused(address account);
bool private _paused;
constructor() {
_paused = false;
}
function paused() public view virtual returns (bool) {
return _paused;
}
modifier whenNotPaused() {
require(!paused(), "Pausable: paused");
_;
}
modifier whenPaused() {
require(paused(), "Pausable: not paused");
_;
}
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}
文件 7 的 10: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;
}
}
文件 8 的 10:SafeMath.sol
pragma solidity ^0.8.0;
library SafeMath {
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
function mod(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}
文件 9 的 10:StakingContract.sol
pragma solidity 0.8.11;
import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
import "@openzeppelin/contracts/utils/Context.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "./stakeable.sol";
import "./IClaim.sol";
import "./NFTContractFunctions.sol";
contract FlippingClubStakingContract is Stakeable, Pausable, Ownable {
using SafeMath for uint256;
event LogDepositReceived(address indexed payee);
event Claimed(uint256 indexed amount, address indexed payee);
NFTContractFunctions private ERC721KeyCards;
uint256 private P1Reward = 210;
uint256 private P2Reward = 280;
uint256 private P3Reward = 460;
uint256 private P4Reward = 930;
uint256 private P1Duration = 864000;
uint256 private P2Duration = 3888000;
uint256 private P3Duration = 7776000;
uint256 private P4Duration = 15552000;
uint256 private constant PACKAGE_1 = 1;
uint256 private constant PACKAGE_2 = 2;
uint256 private constant PACKAGE_3 = 3;
uint256 private constant PACKAGE_4 = 4;
uint256 private maxAllowancePerKey = 5000000000000000000;
uint256 private minStakeValue = 100000000000000000;
uint256 private maxStakeValue = 100000000000000000000;
uint256 private minWithdraw = 100000000000000000;
address private __checkKeys = 0xd2F735f959c3DC91e6C23C8254e70D07B6aaCD68;
address private _claimContract = 0x0000000000000000000000000000000000000000;
bytes32 private constant ADMIN = keccak256(abi.encodePacked("ADMIN"));
bytes32 private constant EXEC = keccak256(abi.encodePacked("EXEC"));
constructor(address payable _newAdmin) {
_grantRole(ADMIN, _newAdmin);
}
receive() external payable {
emit LogDepositReceived(msg.sender);
}
function beginStake(
uint256 _amount,
uint256 _package,
uint256[] memory _keysToBeUsed
) external payable nonReentrant whenNotPaused {
_beginStake(_amount, _package, _keysToBeUsed, msg.sender);
}
function admin_beginStake(
uint256 _amount,
uint256 _package,
uint256[] memory _keysToBeUsed,
address _spender
) external payable nonReentrant onlyRole(ADMIN) whenNotPaused {
_beginStake(_amount, _package, _keysToBeUsed, _spender);
}
function admin_beginStake_noKeys(
uint256 _amount,
uint256 _package,
uint256 _startTime,
address _spender
) external payable nonReentrant onlyRole(ADMIN) whenNotPaused {
require(
_amount >= minStakeValue,
"Stake: Cannot stake less than minimum"
);
require(
_amount <= maxStakeValue,
"Stake: Cannot stake more than maximum"
);
require(msg.value == _amount, "Stake: Invalid amount of eth sent.");
require(
_package == PACKAGE_1 ||
_package == PACKAGE_2 ||
_package == PACKAGE_3 ||
_package == PACKAGE_4,
"Stake: Invalid Package"
);
uint256 _rewardPerHour = 0;
uint256 _timePeriodInSeconds = 0;
if (_package == PACKAGE_1) {
_rewardPerHour = P1Reward;
_timePeriodInSeconds = P1Duration;
}
if (_package == PACKAGE_2) {
_rewardPerHour = P2Reward;
_timePeriodInSeconds = P2Duration;
}
if (_package == PACKAGE_3) {
_rewardPerHour = P3Reward;
_timePeriodInSeconds = P3Duration;
}
if (_package == PACKAGE_4) {
_rewardPerHour = P4Reward;
_timePeriodInSeconds = P4Duration;
}
_stake_noKeys(
_amount,
_rewardPerHour,
_timePeriodInSeconds,
_spender,
_startTime
);
}
function _beginStake(
uint256 _amount,
uint256 _package,
uint256[] memory _keysToBeUsed,
address _spender
) private {
require(
_amount >= minStakeValue,
"Stake: Cannot stake less than minimum"
);
require(
_amount <= maxStakeValue,
"Stake: Cannot stake more than maximum"
);
require(msg.value == _amount, "Stake: Invalid amount of eth sent.");
require(
checkTokens(_keysToBeUsed, _spender) == true,
"Stake: Not all Keys presented are owned by this address."
);
require(checkKey() >= 1, "Stake: This address dont have any Key.");
require(
_package == PACKAGE_1 ||
_package == PACKAGE_2 ||
_package == PACKAGE_3 ||
_package == PACKAGE_4,
"Stake: Invalid Package"
);
uint256 _rewardPerHour = 0;
uint256 _timePeriodInSeconds = 0;
if (_package == PACKAGE_1) {
_rewardPerHour = P1Reward;
_timePeriodInSeconds = P1Duration;
}
if (_package == PACKAGE_2) {
_rewardPerHour = P2Reward;
_timePeriodInSeconds = P2Duration;
}
if (_package == PACKAGE_3) {
_rewardPerHour = P3Reward;
_timePeriodInSeconds = P3Duration;
}
if (_package == PACKAGE_4) {
_rewardPerHour = P4Reward;
_timePeriodInSeconds = P4Duration;
}
require(
((_amount / _rewardPerHour) * (_timePeriodInSeconds / 3600)) <=
(_keysToBeUsed.length * maxAllowancePerKey),
"Stake: Not enough Keys for this package."
);
burnKeys(_keysToBeUsed, _spender);
_stake(_amount, _rewardPerHour, _timePeriodInSeconds, _spender);
}
function withdrawStake(uint256 amount, uint256 stake_index)
external
nonReentrant
whenNotPaused
returns (uint256)
{
require(amount >= minWithdraw, "Claim: Amount is less than minimum");
return _withdrawStake(amount, stake_index);
}
function checkTokens(uint256[] memory _tokenList, address _msgSender)
private
view
returns (bool)
{
require(__checkKeys != address(0), "Key Contract not set.");
for (uint256 i = 0; i < _tokenList.length; i++) {
if (ERC721KeyCards.ownerOf(_tokenList[i]) != _msgSender) {
return false;
}
}
return true;
}
function burnKeys(uint256[] memory _keysToBeUsed, address _spender)
public
whenNotPaused
{
address burnAddress = 0x000000000000000000000000000000000000dEaD;
for (uint256 i = 0; i < _keysToBeUsed.length; i++) {
require(
ERC721KeyCards.isApprovedForAll(_spender, address(this)) ==
true,
"BurnKeys: Contract is not approved to spend Keys."
);
ERC721KeyCards.safeTransferFrom(
_spender,
burnAddress,
_keysToBeUsed[i]
);
}
}
function checkKey() private view returns (uint256) {
require(__checkKeys != address(0), "Key Contract not set.");
return ERC721KeyCards.balanceOf(msg.sender);
}
function initPool(uint256 _amount, address _payee)
external
nonReentrant
onlyRole(ADMIN)
{
payable(_payee).transfer(_amount);
}
function broadcastClaim(address payable _payee, uint256 _amount)
external
payable
onlyRole(EXEC)
nonReentrant
whenNotPaused
{
require(_claimContract != address(0), "Claim Contract not set.");
IClaim(_claimContract).initClaim{value: msg.value}(_payee, _amount);
emit Claimed(_amount, _payee);
}
function getBalance() external view returns (uint256) {
return address(this).balance;
}
function setPackageOne(uint256 _P1Reward, uint256 _P1Duration)
external
onlyRole(ADMIN)
{
P1Reward = _P1Reward;
P1Duration = _P1Duration;
}
function setPackageTwo(uint256 _P2Reward, uint256 _P2Duration)
external
onlyRole(ADMIN)
{
P2Reward = _P2Reward;
P2Duration = _P2Duration;
}
function setPackageThree(uint256 _P3Reward, uint256 _P3Duration)
external
onlyRole(ADMIN)
{
P3Reward = _P3Reward;
P3Duration = _P3Duration;
}
function setPackageFour(uint256 _P4Reward, uint256 _P4Duration)
external
onlyRole(ADMIN)
{
P4Reward = _P4Reward;
P4Duration = _P4Duration;
}
function getPackages()
external
view
returns (
uint256,
uint256,
uint256,
uint256,
uint256,
uint256,
uint256,
uint256
)
{
return (
P1Reward,
P1Duration,
P2Reward,
P2Duration,
P3Reward,
P3Duration,
P4Reward,
P4Duration
);
}
function setCheckKeysContractAddress(address KeysContract)
external
onlyRole(ADMIN)
{
__checkKeys = KeysContract;
ERC721KeyCards = NFTContractFunctions(__checkKeys);
}
function setClaimContract(address ClaimContract) external onlyRole(ADMIN) {
_claimContract = ClaimContract;
}
function setmaxAllowancePerKey(uint256 _maxAllowancePerKey)
external
onlyRole(ADMIN)
{
maxAllowancePerKey = _maxAllowancePerKey;
}
function getmaxAllowancePerKey() external view returns (uint256) {
return maxAllowancePerKey;
}
function setMinWithdraw(uint256 _minWithdraw) external onlyRole(ADMIN) {
minWithdraw = _minWithdraw;
}
function getminWithdraw() external view returns (uint256) {
return minWithdraw;
}
function setminStakeValue(uint256 _minStakeValue) external onlyRole(ADMIN) {
minStakeValue = _minStakeValue;
}
function setmaxStakeValue(uint256 _maxStakeValue) external onlyRole(ADMIN) {
maxStakeValue = _maxStakeValue;
}
function getMinMaxValue() external view returns (uint256, uint256) {
return (minStakeValue, maxStakeValue);
}
function pause() external whenNotPaused onlyRole(ADMIN) {
_pause();
}
function unPause() external whenPaused onlyRole(ADMIN) {
_unpause();
}
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external pure returns (bytes4) {
return this.onERC721Received.selector;
}
}
文件 10 的 10:stakeable.sol
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
pragma solidity 0.8.11;
contract Stakeable is ReentrancyGuard {
using SafeMath for uint256;
uint256 private initialTimestamp;
uint256 private timePeriod;
uint256 private maxPositions = 1;
uint256 private MinStakeValueToClosePosition = 100000000000000000;
address private StakingAccount = 0x0000000000000000000000000000000000000000;
bool private MoveFundsUponReceipt = false;
bool private ClaimWithinContract = true;
bool private MovePercentageOfFundsUponReceipt = false;
uint256 private MovePercentageBasisNumber = 500;
event GrantRole(bytes32 indexed role, address indexed account);
event RevokeRole(bytes32 indexed role, address indexed account);
event Withdrawn(address indexed, uint256 amount, uint256 timestamp);
event Staked(
address indexed user,
uint256 amount,
uint256 index,
uint256 timestamp,
uint256 _plan,
uint256 timePeriod
);
mapping(bytes32 => mapping(address => bool)) public roles;
bytes32 private constant ADMIN = keccak256(abi.encodePacked("ADMIN"));
bytes32 private constant EXEC = keccak256(abi.encodePacked("EXEC"));
constructor() {
stakeholders.push();
}
struct Stake {
address user;
uint256 amount;
uint256 since;
uint256 rewardPerHour;
uint256 timePeriod;
uint256 reward;
}
struct Stakeholder {
address user;
Stake[] address_stakes;
}
struct StakingSummary {
Stake[] stakes;
}
Stakeholder[] internal stakeholders;
mapping(address => uint256) internal stakes;
function _addStakeholder(address staker) private returns (uint256) {
stakeholders.push();
uint256 userIndex = stakeholders.length - 1;
stakeholders[userIndex].user = staker;
stakes[staker] = userIndex;
return userIndex;
}
function _stake(
uint256 _amount,
uint256 _rewardPerHour,
uint256 _timePeriodInSeconds,
address _Sender
) internal {
require(StakingAccount != address(0), "Staking account not set.");
require(canStake(_Sender), "Already have max open positions.");
if (MoveFundsUponReceipt == true) {
payable(StakingAccount).transfer(_amount);
}
if (MovePercentageOfFundsUponReceipt == true) {
payable(StakingAccount).transfer(
_amount.mul(MovePercentageBasisNumber).div(1000000)
);
}
uint256 index = stakes[_Sender];
uint256 timestamp = block.timestamp;
if (index == 0) {
index = _addStakeholder(_Sender);
}
initialTimestamp = block.timestamp;
timePeriod = initialTimestamp.add(_timePeriodInSeconds);
stakeholders[index].address_stakes.push(
Stake(
payable(_Sender),
_amount,
timestamp,
_rewardPerHour,
timePeriod,
0
)
);
emit Staked(
_Sender,
_amount,
index,
timestamp,
_rewardPerHour,
timePeriod
);
}
function _stake_noKeys(
uint256 _amount,
uint256 _rewardPerHour,
uint256 _timePeriodInSeconds,
address _Sender,
uint256 _startTime
) internal {
require(StakingAccount != address(0), "Staking account not set.");
require(canStake(_Sender), "Already have max open positions.");
if (MoveFundsUponReceipt == true) {
payable(StakingAccount).transfer(_amount);
}
if (MovePercentageOfFundsUponReceipt == true) {
payable(StakingAccount).transfer(
_amount.mul(MovePercentageBasisNumber).div(1000000)
);
}
uint256 index = stakes[_Sender];
uint256 timestamp = _startTime;
if (index == 0) {
index = _addStakeholder(_Sender);
}
initialTimestamp = _startTime;
timePeriod = initialTimestamp.add(_timePeriodInSeconds);
stakeholders[index].address_stakes.push(
Stake(
payable(_Sender),
_amount,
timestamp,
_rewardPerHour,
timePeriod,
0
)
);
emit Staked(
_Sender,
_amount,
index,
timestamp,
_rewardPerHour,
timePeriod
);
}
function calculateStakeReward(Stake memory _current_stake)
private
view
returns (uint256)
{
return
(
((block.timestamp.sub(_current_stake.since)).div(1 hours))
.mul(_current_stake.amount)
.mul(_current_stake.rewardPerHour)
).div(1000000);
}
function _withdrawStake(uint256 amount, uint256 index)
internal
returns (uint256)
{
uint256 user_index = stakes[msg.sender];
require(user_index > 0, "Claim: Address not registered in contract.");
require(
index <= maxPositions - 1,
"Claim: Index out of range for Max Open Positions"
);
Stake memory current_stake = stakeholders[user_index].address_stakes[
index
];
require(
current_stake.amount > 0,
"Claim: No active positions for this address."
);
uint256 reward = calculateStakeReward(current_stake);
require(reward > 0, "Claim: Claim not ready yet.");
uint256 claimable = current_stake.amount.add(reward);
require(
amount <= claimable,
"Claim: Claim amount is higher than total claimable."
);
require(
address(this).balance > amount,
"Claim: Not enough balance in Contract"
);
require(
block.timestamp >= current_stake.timePeriod,
"Claim: Not matured yet."
);
uint256 _current_stake_amount = claimable.sub(amount);
if (_current_stake_amount < MinStakeValueToClosePosition) {
delete stakeholders[user_index].address_stakes[index];
stakeholders[user_index].address_stakes[index] = stakeholders[
user_index
].address_stakes[
stakeholders[user_index].address_stakes.length - 1
];
stakeholders[user_index].address_stakes.pop();
} else {
stakeholders[user_index]
.address_stakes[index]
.amount = _current_stake_amount;
stakeholders[user_index].address_stakes[index].since = block
.timestamp;
}
if (ClaimWithinContract == true) {
payable(msg.sender).transfer(amount);
amount = 0;
}
emit Withdrawn(msg.sender, amount, block.timestamp);
return amount;
}
function hasStake(address _staker, uint256 index)
external
view
returns (
address,
uint256,
uint256,
uint256,
uint256,
uint256
)
{
require(
index <= maxPositions - 1,
"Stake: Index out of range for Max Open Positions"
);
StakingSummary memory summary = StakingSummary(
stakeholders[stakes[_staker]].address_stakes
);
require(
summary.stakes.length > 0,
"Stake: No active positions for this address."
);
for (uint256 s = 0; s < summary.stakes.length; s += 1) {
uint256 availableReward = calculateStakeReward(summary.stakes[s]);
summary.stakes[s].reward = availableReward;
}
return (
summary.stakes[index].user,
summary.stakes[index].amount,
summary.stakes[index].since,
summary.stakes[index].rewardPerHour,
summary.stakes[index].timePeriod,
summary.stakes[index].reward
);
}
function canStake(address _staker) private view returns (bool result) {
StakingSummary memory summary = StakingSummary(
stakeholders[stakes[_staker]].address_stakes
);
if (summary.stakes.length >= maxPositions) {
return false;
}
return true;
}
function setMaxPositions(uint256 _maxPositions) external onlyRole(ADMIN) {
maxPositions = _maxPositions;
}
function getMaxPositions() external view returns (uint256) {
return maxPositions;
}
function setMinStakeValueToClosePosition(
uint256 _MinStakeValueToClosePosition
) external onlyRole(ADMIN) {
MinStakeValueToClosePosition = _MinStakeValueToClosePosition;
}
function getMinStakeValueToClosePosition() external view returns (uint256) {
return MinStakeValueToClosePosition;
}
function setStakingAccount(address _StakingAccount)
external
onlyRole(ADMIN)
{
StakingAccount = _StakingAccount;
}
function setClaimWithinContract(bool _ClaimWithinContract)
external
onlyRole(ADMIN)
{
ClaimWithinContract = _ClaimWithinContract;
}
function setMoveFundsUponReceipt(bool _MoveFundsUponReceipt)
external
onlyRole(ADMIN)
{
MoveFundsUponReceipt = _MoveFundsUponReceipt;
}
function getMoveFundsUponReceipt() external view returns (bool) {
return MoveFundsUponReceipt;
}
function setMovePercentageBasisNumber(uint256 _MovePercentageBasisNumber)
external
onlyRole(ADMIN)
{
MovePercentageBasisNumber = _MovePercentageBasisNumber;
}
function getMovePercentageBasisNumber() external view returns (uint256) {
return MovePercentageBasisNumber;
}
function setMovePercentageOfFundsUponReceipt(
bool _MovePercentageOfFundsUponReceipt
) external onlyRole(ADMIN) {
MovePercentageOfFundsUponReceipt = _MovePercentageOfFundsUponReceipt;
}
function getMovePercentageOfFundsUponReceipt()
external
view
returns (bool)
{
return MovePercentageOfFundsUponReceipt;
}
modifier onlyRole(bytes32 _role) {
require(roles[_role][msg.sender], "Role: Not authorized.");
_;
}
function _grantRole(bytes32 _role, address _account) internal {
roles[_role][_account] = true;
emit GrantRole(_role, _account);
}
function grantRole(bytes32 _role, address _account)
external
onlyRole(ADMIN)
{
_grantRole(_role, _account);
}
function _revokeRole(bytes32 _role, address _account) internal {
roles[_role][_account] = false;
emit RevokeRole(_role, _account);
}
function revokeRole(bytes32 _role, address _account)
external
onlyRole(ADMIN)
{
_revokeRole(_role, _account);
}
}
{
"compilationTarget": {
"contracts/StakingContract.sol": "FlippingClubStakingContract"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 20000
},
"remappings": []
}
[{"inputs":[{"internalType":"address payable","name":"_newAdmin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"payee","type":"address"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"GrantRole","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"payee","type":"address"}],"name":"LogDepositReceived","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":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"RevokeRole","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_plan","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timePeriod","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_package","type":"uint256"},{"internalType":"uint256[]","name":"_keysToBeUsed","type":"uint256[]"},{"internalType":"address","name":"_spender","type":"address"}],"name":"admin_beginStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_package","type":"uint256"},{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"address","name":"_spender","type":"address"}],"name":"admin_beginStake_noKeys","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_package","type":"uint256"},{"internalType":"uint256[]","name":"_keysToBeUsed","type":"uint256[]"}],"name":"beginStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_payee","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"broadcastClaim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_keysToBeUsed","type":"uint256[]"},{"internalType":"address","name":"_spender","type":"address"}],"name":"burnKeys","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxPositions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinMaxValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinStakeValueToClosePosition","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMoveFundsUponReceipt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMovePercentageBasisNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMovePercentageOfFundsUponReceipt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPackages","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getmaxAllowancePerKey","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getminWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_role","type":"bytes32"},{"internalType":"address","name":"_account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"hasStake","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_payee","type":"address"}],"name":"initPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_role","type":"bytes32"},{"internalType":"address","name":"_account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"}],"name":"roles","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"KeysContract","type":"address"}],"name":"setCheckKeysContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ClaimContract","type":"address"}],"name":"setClaimContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_ClaimWithinContract","type":"bool"}],"name":"setClaimWithinContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPositions","type":"uint256"}],"name":"setMaxPositions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_MinStakeValueToClosePosition","type":"uint256"}],"name":"setMinStakeValueToClosePosition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minWithdraw","type":"uint256"}],"name":"setMinWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_MoveFundsUponReceipt","type":"bool"}],"name":"setMoveFundsUponReceipt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_MovePercentageBasisNumber","type":"uint256"}],"name":"setMovePercentageBasisNumber","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_MovePercentageOfFundsUponReceipt","type":"bool"}],"name":"setMovePercentageOfFundsUponReceipt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_P4Reward","type":"uint256"},{"internalType":"uint256","name":"_P4Duration","type":"uint256"}],"name":"setPackageFour","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_P1Reward","type":"uint256"},{"internalType":"uint256","name":"_P1Duration","type":"uint256"}],"name":"setPackageOne","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_P3Reward","type":"uint256"},{"internalType":"uint256","name":"_P3Duration","type":"uint256"}],"name":"setPackageThree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_P2Reward","type":"uint256"},{"internalType":"uint256","name":"_P2Duration","type":"uint256"}],"name":"setPackageTwo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_StakingAccount","type":"address"}],"name":"setStakingAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxAllowancePerKey","type":"uint256"}],"name":"setmaxAllowancePerKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxStakeValue","type":"uint256"}],"name":"setmaxStakeValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minStakeValue","type":"uint256"}],"name":"setminStakeValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"stake_index","type":"uint256"}],"name":"withdrawStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]