文件 1 的 9:Declaration.sol
pragma solidity ^0.7.3;
abstract contract Declaration {
string public name = "Feyorra";
string public symbol = "FEY";
uint256 public decimals = 18;
uint256 public totalSupply = 1000000000E18;
uint256 public constant YEARLY_INTEREST = 410;
uint256 public constant MINIMUM_STAKE = 100E18;
uint256 public constant SECONDS_IN_DAY = 86400;
uint256 public constant MAX_STAKE_DAYS = 1825;
uint256 public immutable LAUNCH_TIME;
struct Globals {
uint256 stakingId;
uint256 currentFeyDay;
uint256 totalStakedAmount;
}
struct StakeElement {
address userAddress;
uint256 stakedAmount;
uint256 returnAmount;
uint256 interestAmount;
uint256 stakedAt;
bool isActive;
}
struct SnapShot {
uint256 totalSupply;
uint256 totalStakedAmount;
}
mapping(address => uint256) public balances;
mapping(address => mapping(address => uint256)) public allowances;
mapping(uint256 => SnapShot) public snapshots;
mapping(uint256 => StakeElement) public stakeList;
Globals public globals;
modifier incrementId() {
_;
globals.stakingId++;
}
constructor() {
LAUNCH_TIME = block.timestamp;
balances[msg.sender] = totalSupply;
}
}
文件 2 的 9:Events.sol
pragma solidity ^0.7.3;
abstract contract Events {
event StakeStart(
uint256 indexed _stakingId,
address _address,
uint256 _amount
);
event StakeEnd(
uint256 indexed _stakingId,
address _address,
uint256 _amount
);
event Transfer(
address indexed _from,
address indexed _to,
uint256 _value
);
event Approval(
address indexed _owner,
address indexed _spender,
uint256 _value
);
event ClosedGhostStake(
uint256 daysOld,
uint256 secondsOld,
uint256 stakeId
);
event SnapshotCaptured(
uint256 _totalSupply,
uint256 _totalStakedAmount,
uint64 _snapshotDay
);
}
文件 3 的 9:FEYToken.sol
import './Token.sol';
pragma solidity ^0.7.3;
contract FEYToken is Token {
using SafeMath for uint256;
function getInterestRateYearly(
uint256 _percentage
)
public
pure
returns (uint256 interestRate)
{
return _percentage > 100
? uint256(YEARLY_INTEREST).mul(uint256(10000)).div(_percentage)
: YEARLY_INTEREST.mul(100);
}
function getYearlyInterestLatest()
public
view
returns (
uint256 percentage,
uint256 interestRateYearly
)
{
percentage = getPercent(
globals.totalStakedAmount,
totalSupply,
4
);
interestRateYearly = getInterestRateYearly(
percentage
);
}
function getYearlyInterestHistorical(
uint256 _day
)
public
view
returns (
uint256 percentage,
uint256 interestRateYearly
)
{
SnapShot memory s = snapshots[_day];
if (s.totalSupply == 0) {
return getYearlyInterestLatest();
}
percentage = getPercent(
s.totalStakedAmount,
s.totalSupply,
4
);
interestRateYearly = getInterestRateYearly(
percentage
);
}
function getInterest(
uint256 _stakedAmount,
uint256 _totalStakedAmount,
uint256 _seconds
)
public
view
returns (uint256 durationInterestAmt)
{
uint256 percentage = getPercent(
_totalStakedAmount,
totalSupply,
4
);
uint256 interestRateYearly = getInterestRateYearly(
percentage
);
uint256 yearFullAmount = _stakedAmount
.mul(interestRateYearly)
.div(100);
uint256 dailyInterestAmt = getPercent(
yearFullAmount,
31556952,
0
);
durationInterestAmt = dailyInterestAmt
.mul(_seconds)
.div(100);
}
function closeGhostStake(
uint256 _stakingId
)
external
onlyOwner
{
(uint256 daysOld, uint256 secondsOld) =
getStakeAge(
_stakingId
);
require(
daysOld == MAX_STAKE_DAYS &&
secondsOld == SECONDS_IN_DAY,
'FEYToken: not old enough'
);
_closeStake(
stakeList[_stakingId].userAddress,
_stakingId
);
emit ClosedGhostStake(
daysOld,
secondsOld,
_stakingId
);
}
function getStakeAge(
uint256 _stakingId
)
public
view
returns (
uint256 daysTotal,
uint256 secondsToday
)
{
StakeElement memory _stakeElement = stakeList[_stakingId];
uint256 secondsTotal = getNow()
.sub(_stakeElement.stakedAt);
daysTotal = secondsTotal
.div(SECONDS_IN_DAY);
if (daysTotal > MAX_STAKE_DAYS) {
daysTotal = MAX_STAKE_DAYS;
secondsToday = SECONDS_IN_DAY;
} else {
secondsToday = secondsTotal
.mod(SECONDS_IN_DAY);
}
}
function getStakeInterest(
uint256 _stakingId
)
public
view
returns (
uint256 stakeInterest
)
{
StakeElement memory _stakeElement = stakeList[_stakingId];
if (_stakeElement.isActive == false) {
stakeInterest = _stakeElement.interestAmount;
} else {
(
uint256 daysTotal,
uint256 secondsToday
) = getStakeAge(_stakingId);
uint256 finalDay = _currentFeyDay();
uint256 startDay = finalDay.sub(daysTotal);
for (uint256 _day = startDay; _day < finalDay; _day++) {
stakeInterest += getInterest(
_stakeElement.stakedAmount,
snapshots[_day].totalStakedAmount,
SECONDS_IN_DAY
);
}
stakeInterest += getInterest(
_stakeElement.stakedAmount,
globals.totalStakedAmount,
secondsToday
);
}
}
function getStakePenalty(
uint256 _stakingId
)
public
view
returns (uint256 penaltyAmount)
{
StakeElement memory _stakeElement = stakeList[_stakingId];
uint256 daysDifference = getNow()
.sub(_stakeElement.stakedAt)
.div(SECONDS_IN_DAY);
if (daysDifference < 15) {
penaltyAmount = percentCalculator(
_stakeElement.stakedAmount,
750
);
} else if (daysDifference < 30) {
penaltyAmount = percentCalculator(
_stakeElement.stakedAmount,
500
);
} else if (daysDifference < 45) {
penaltyAmount = percentCalculator(
_stakeElement.stakedAmount,
250
);
}
}
function estimateReturn(
uint256 _stakingId
)
public
view
returns (uint256)
{
StakeElement memory _stakeElement = stakeList[_stakingId];
if (_stakeElement.isActive == false) {
return _stakeElement.returnAmount;
}
return _stakeElement.stakedAmount
.add(getStakeInterest(_stakingId))
.sub(getStakePenalty(_stakingId));
}
function closeStake(
uint256 _stakingId
)
public
snapshotTriggerOnClose
returns (
uint256 stakedAmount,
uint256 penaltyAmount,
uint256 interestAmount
)
{
return _closeStake(
msg.sender,
_stakingId
);
}
function _closeStake(
address _staker,
uint256 _stakingId
)
internal
returns (
uint256 stakedAmount,
uint256 penaltyAmount,
uint256 interestAmount
)
{
StakeElement memory _stakeElement = stakeList[_stakingId];
uint256 daysDifference = getNow()
.sub(_stakeElement.stakedAt)
.div(SECONDS_IN_DAY);
require(
daysDifference >= 3,
'FEYToken: immature stake'
);
require(
_stakeElement.userAddress == _staker,
'FEYToken: wrong stake owner'
);
require(
_stakeElement.isActive,
'FEYToken: stake not active'
);
_stakeElement.isActive = false;
stakedAmount = _stakeElement.stakedAmount;
if (daysDifference >= 45) {
interestAmount = getStakeInterest(
_stakingId
);
}
penaltyAmount = getStakePenalty(
_stakingId
);
totalSupply = totalSupply
.add(interestAmount)
.sub(penaltyAmount);
_stakeElement.interestAmount = interestAmount;
_stakeElement.returnAmount = stakedAmount
.add(interestAmount)
.sub(penaltyAmount);
stakeList[_stakingId] = _stakeElement;
balances[_staker] =
balances[_staker].add(_stakeElement.returnAmount);
globals.totalStakedAmount =
globals.totalStakedAmount.sub(stakedAmount);
emit StakeEnd(
_stakingId,
_staker,
_stakeElement.returnAmount
);
emit Transfer(
address(0x0),
_staker,
_stakeElement.returnAmount
);
}
function openStake(
uint256 _amount
)
external
incrementId
snapshotTriggerOnOpen
returns (bool)
{
require(
_transferCheck(
msg.sender,
address(0x0),
_amount,
true
),
'FEYToken: _transferCheck failed'
);
require(
_amount >= MINIMUM_STAKE,
'FEYToken: stake below minimum'
);
balances[msg.sender] =
balances[msg.sender].sub(_amount);
stakeList[globals.stakingId] = StakeElement(
msg.sender,
_amount,
0,
0,
getNow(),
true
);
globals.totalStakedAmount =
globals.totalStakedAmount.add(_amount);
emit StakeStart(
globals.stakingId,
msg.sender,
_amount
);
emit Transfer(
msg.sender,
address(0),
_amount
);
return true;
}
function getStaking(
uint256 _stakingId
)
external
view
returns (
uint256 _stakedAmount,
address _userAddress,
uint256 _returnAmount,
uint256 interestAmount,
uint256 _stakedAt,
bool _isActive
)
{
StakeElement memory _stakeElement = stakeList[_stakingId];
return (
_stakeElement.stakedAmount,
_stakeElement.userAddress,
_stakeElement.returnAmount,
_stakeElement.interestAmount,
_stakeElement.stakedAt,
_stakeElement.isActive
);
}
}
文件 4 的 9:Helper.sol
pragma solidity ^0.7.3;
import './Timing.sol';
import './Ownable.sol';
import './Events.sol';
import './SafeMath.sol';
contract Helper is Ownable, Timing, Events {
using SafeMath for uint256;
function burn(
uint256 _amount
)
external
onlyOwner
returns (bool)
{
require(
balances[msg.sender].sub(_amount) >= 0,
'FEYToken: exceeding balance'
);
totalSupply =
totalSupply.sub(_amount);
balances[msg.sender] =
balances[msg.sender].sub(_amount);
emit Transfer(
msg.sender,
address(0x0),
_amount
);
return true;
}
function _transferCheck(
address _sender,
address _recipient,
uint256 _amount,
bool _allowBurnAddress
)
internal
view
returns (bool)
{
if (_allowBurnAddress == false) {
require(
_recipient != address(0x0),
'FEYToken: cannot send to burn address'
);
}
require(
balances[_sender] >= _amount,
'FEYToken: exceeding balance'
);
require(
balances[_recipient].add(_amount) >= balances[_recipient],
'FEYToken: overflow detected'
);
return true;
}
function getPercent(
uint256 _numerator,
uint256 _denominator,
uint256 _precision
)
public
pure
returns(uint256 quotient)
{
uint256 numerator = _numerator * 10 ** (_precision + 1);
quotient = ((numerator / _denominator) + 5) / 10;
}
function percentCalculator(
uint256 _value,
uint256 _perc
)
public
pure
returns (uint256 percentageValue)
{
percentageValue = _value
.mul(_perc)
.div(10000);
}
}
文件 5 的 9:Ownable.sol
pragma solidity ^0.7.3;
contract Ownable {
address public owner;
event ownershipChanged(
address indexed _invoker,
address indexed _newOwner
);
constructor() {
owner = msg.sender;
}
modifier onlyOwner() {
require(
msg.sender == owner,
'Ownable: must be the owner'
);
_;
}
function changeOwner(
address _newOwner
)
external
onlyOwner
returns (bool)
{
require(
_newOwner != address(0),
'Ownable: new owner must not be the blackhole address'
);
owner = _newOwner;
emit ownershipChanged(
msg.sender,
_newOwner
);
return true;
}
}
文件 6 的 9:SafeMath.sol
pragma solidity ^0.7.0;
library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, 'SafeMath: addition overflow');
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a, 'SafeMath: subtraction overflow');
uint256 c = a - b;
return c;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, 'SafeMath: multiplication overflow');
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, 'SafeMath: division by zero');
uint256 c = a / b;
return c;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b != 0, 'SafeMath: modulo by zero');
return a % b;
}
}
文件 7 的 9:Snapshot.sol
pragma solidity ^0.7.3;
import "./Helper.sol";
abstract contract Snapshot is Helper {
using SafeMath for uint;
modifier snapshotTriggerOnOpen()
{
_;
_dailySnapshotPoint(
_currentFeyDay()
);
}
modifier snapshotTriggerOnClose()
{
_dailySnapshotPoint(
_currentFeyDay()
);
_;
}
function manualDailySnapshot()
external
{
_dailySnapshotPoint(
_currentFeyDay()
);
}
function _dailySnapshotPoint(
uint64 _updateDay
)
private
{
for (uint256 _day = globals.currentFeyDay; _day < _updateDay; _day++) {
SnapShot memory s = snapshots[_day];
s.totalSupply = totalSupply;
s.totalStakedAmount = globals.totalStakedAmount;
snapshots[_day] = s;
globals.currentFeyDay++;
}
emit SnapshotCaptured(
totalSupply,
globals.totalStakedAmount,
_updateDay
);
}
}
文件 8 的 9:Timing.sol
pragma solidity ^0.7.3;
import './Declaration.sol';
abstract contract Timing is Declaration {
function currentFeyDay()
public
view
returns (uint64)
{
return getNow() >= LAUNCH_TIME
? _currentFeyDay()
: 0;
}
function _currentFeyDay()
internal
view
returns (uint64)
{
return _feyDayFromStamp(getNow());
}
function _feyDayFromStamp(
uint256 _timestamp
)
internal
view
returns (uint64)
{
return uint64((_timestamp - LAUNCH_TIME) / SECONDS_IN_DAY);
}
function getNow()
public
view
returns (uint256)
{
return block.timestamp;
}
}
文件 9 的 9:Token.sol
pragma solidity ^0.7.3;
import "./Snapshot.sol";
contract Token is Snapshot {
using SafeMath for uint256;
function transfer(
address _receiver,
uint256 _amount
)
external
returns (bool)
{
require(
_transferCheck(
msg.sender,
_receiver,
_amount,
false
),
'Token: _transferCheck failed'
);
balances[msg.sender] =
balances[msg.sender].sub(_amount);
balances[_receiver] =
balances[_receiver].add(_amount);
emit Transfer(
msg.sender,
_receiver,
_amount
);
return true;
}
function transferFrom(
address _owner,
address _receiver,
uint256 _amount
)
external
returns (bool)
{
require(
_transferCheck(
_owner,
_receiver,
_amount,
false
),
'Token: _transferCheck failed'
);
require(
allowances[_owner][msg.sender] >= _amount,
'Token: exceeding allowance'
);
allowances[_owner][msg.sender] =
allowances[_owner][msg.sender].sub(_amount);
balances[_owner] =
balances[_owner].sub(_amount);
balances[_receiver] =
balances[_receiver].add(_amount);
emit Transfer(
_owner,
_receiver,
_amount
);
return true;
}
function approve(
address _spender,
uint256 _amount
)
external
returns (bool)
{
allowances[msg.sender][_spender] = _amount;
emit Approval(
msg.sender,
_spender,
_amount
);
return true;
}
function balanceOf(
address _address
)
external
view
returns (uint256)
{
return balances[_address];
}
function allowance(
address _owner,
address _spender
)
external
view
returns (uint256)
{
return allowances[_owner][_spender];
}
}
{
"compilationTarget": {
"FEYToken.sol": "FEYToken"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"daysOld","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"secondsOld","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakeId","type":"uint256"}],"name":"ClosedGhostStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_totalSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_totalStakedAmount","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"_snapshotDay","type":"uint64"}],"name":"SnapshotCaptured","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_stakingId","type":"uint256"},{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"StakeEnd","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_stakingId","type":"uint256"},{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"StakeStart","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_invoker","type":"address"},{"indexed":true,"internalType":"address","name":"_newOwner","type":"address"}],"name":"ownershipChanged","type":"event"},{"inputs":[],"name":"LAUNCH_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_STAKE_DAYS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM_STAKE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SECONDS_IN_DAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"YEARLY_INTEREST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"changeOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingId","type":"uint256"}],"name":"closeGhostStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingId","type":"uint256"}],"name":"closeStake","outputs":[{"internalType":"uint256","name":"stakedAmount","type":"uint256"},{"internalType":"uint256","name":"penaltyAmount","type":"uint256"},{"internalType":"uint256","name":"interestAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentFeyDay","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingId","type":"uint256"}],"name":"estimateReturn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakedAmount","type":"uint256"},{"internalType":"uint256","name":"_totalStakedAmount","type":"uint256"},{"internalType":"uint256","name":"_seconds","type":"uint256"}],"name":"getInterest","outputs":[{"internalType":"uint256","name":"durationInterestAmt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percentage","type":"uint256"}],"name":"getInterestRateYearly","outputs":[{"internalType":"uint256","name":"interestRate","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getNow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numerator","type":"uint256"},{"internalType":"uint256","name":"_denominator","type":"uint256"},{"internalType":"uint256","name":"_precision","type":"uint256"}],"name":"getPercent","outputs":[{"internalType":"uint256","name":"quotient","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingId","type":"uint256"}],"name":"getStakeAge","outputs":[{"internalType":"uint256","name":"daysTotal","type":"uint256"},{"internalType":"uint256","name":"secondsToday","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingId","type":"uint256"}],"name":"getStakeInterest","outputs":[{"internalType":"uint256","name":"stakeInterest","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingId","type":"uint256"}],"name":"getStakePenalty","outputs":[{"internalType":"uint256","name":"penaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingId","type":"uint256"}],"name":"getStaking","outputs":[{"internalType":"uint256","name":"_stakedAmount","type":"uint256"},{"internalType":"address","name":"_userAddress","type":"address"},{"internalType":"uint256","name":"_returnAmount","type":"uint256"},{"internalType":"uint256","name":"interestAmount","type":"uint256"},{"internalType":"uint256","name":"_stakedAt","type":"uint256"},{"internalType":"bool","name":"_isActive","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_day","type":"uint256"}],"name":"getYearlyInterestHistorical","outputs":[{"internalType":"uint256","name":"percentage","type":"uint256"},{"internalType":"uint256","name":"interestRateYearly","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getYearlyInterestLatest","outputs":[{"internalType":"uint256","name":"percentage","type":"uint256"},{"internalType":"uint256","name":"interestRateYearly","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globals","outputs":[{"internalType":"uint256","name":"stakingId","type":"uint256"},{"internalType":"uint256","name":"currentFeyDay","type":"uint256"},{"internalType":"uint256","name":"totalStakedAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualDailySnapshot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"openStake","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_perc","type":"uint256"}],"name":"percentCalculator","outputs":[{"internalType":"uint256","name":"percentageValue","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"snapshots","outputs":[{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"totalStakedAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakeList","outputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"uint256","name":"stakedAmount","type":"uint256"},{"internalType":"uint256","name":"returnAmount","type":"uint256"},{"internalType":"uint256","name":"interestAmount","type":"uint256"},{"internalType":"uint256","name":"stakedAt","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"}],"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":"_receiver","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]