PAID Network
About
Stats
Public Functions
42
Event Types
9
Code Size
75,253 bytes
Library Use
Uses SafeMathUpgradeable for uint256.
Uses EnumerableSetUpgradeable for EnumerableSetUpgradeable.AddressSet.
Events (9) keyboard_arrow_up
Structs (3) keyboard_arrow_up
Constants (4) keyboard_arrow_up
State Variables (32) keyboard_arrow_up
Functions
hasRole keyboard_arrow_up
getRoleMemberCount keyboard_arrow_up
getRoleMember keyboard_arrow_up
getRoleAdmin keyboard_arrow_up
grantRole keyboard_arrow_up
Requirements help
null
Source Code
function grantRole(bytes32 role, address account) public virtual {
require(
hasRole(_roles[role].adminRole, _msgSender()),
"AccessControl: sender must be an admin to grant"
);
_grantRole(role, account);
}
revokeRole keyboard_arrow_up
Requirements help
null
Source Code
function revokeRole(bytes32 role, address account) public virtual {
require(
hasRole(_roles[role].adminRole, _msgSender()),
"AccessControl: sender must be an admin to revoke"
);
_revokeRole(role, account);
}
renounceRole keyboard_arrow_up
Requirements help
Source Code
function renounceRole(bytes32 role, address account) public virtual {
require(
account == _msgSender(),
"AccessControl: can only renounce roles for self"
);
_revokeRole(role, account);
}
initialize keyboard_arrow_up
Modifiers help
initializer checks for the following:
One or more of the following:
-_initialized must not be true - ORnull - OR_initializing must be true
Source Code
function initialize(address _manager, address _migrator) public initializer {
_setupRole(MANAGER_ROLE, _manager);
_setupRole(MIGRATOR_ROLE, _migrator);
init_ = false;
}
sessionsOf_ keyboard_arrow_up
stake keyboard_arrow_up
Modifiers help
pausable checks for the following:
Requirements help
Source Code
function stake(uint256 amount, uint256 stakingDays) external pausable {
require(stakingDays != 0, "Staking: Staking days < 1");
require(stakingDays <= 5555, "Staking: Staking days > 5555");
stakeInternal(amount, stakingDays, msg.sender);
IToken(addresses.mainToken).burn(msg.sender, amount);
}
externalStake keyboard_arrow_up
Modifiers help
onlyExternalStaker checks for the following:
null
pausable checks for the following:
Requirements help
Source Code
function externalStake(
uint256 amount,
uint256 stakingDays,
address staker
) external override onlyExternalStaker pausable {
require(stakingDays != 0, "Staking: Staking days < 1");
require(stakingDays <= 5555, "Staking: Staking days > 5555");
stakeInternal(amount, stakingDays, staker);
}
calculateStakingInterest keyboard_arrow_up
Source Code
function calculateStakingInterest(
uint256 firstPayout,
uint256 lastPayout,
uint256 shares
) public view returns (uint256) {
uint256 stakingInterest;
uint256 lastIndex = MathUpgradeable.min(payouts.length, lastPayout);
for (uint256 i = firstPayout; i < lastIndex; i++) {
uint256 payout = payouts[i].payout.mul(shares).div(
payouts[i].sharesTotalSupply
);
stakingInterest = stakingInterest.add(payout);
}
return stakingInterest;
}
unstake keyboard_arrow_up
Modifiers help
pausable checks for the following:
Requirements help
Source Code
function unstake(uint256 sessionId) external pausable {
Session storage session = sessionDataOf[msg.sender][sessionId];
require(
session.shares != 0 && session.withdrawn == false,
"Staking: Stake withdrawn or not set"
);
uint256 actualEnd = now;
uint256 amountOut = unstakeInternal(session, sessionId, actualEnd);
// To account
_initPayout(msg.sender, amountOut);
}
unstakeV1 keyboard_arrow_up
Modifiers help
pausable checks for the following:
Requirements help
Source Code
function unstakeV1(uint256 sessionId) external pausable {
require(sessionId <= lastSessionIdV1, "Staking: Invalid sessionId");
Session storage session = sessionDataOf[msg.sender][sessionId];
// Unstaked already
require(
session.shares == 0 && session.withdrawn == false,
"Staking: Stake withdrawn"
);
(
uint256 amount,
uint256 start,
uint256 end,
uint256 shares,
uint256 firstPayout
) = stakingV1.sessionDataOf(msg.sender, sessionId);
// Unstaked in v1 / doesn't exist
require(shares != 0, "Staking: Stake withdrawn or not set");
uint256 stakingDays = (end - start) / stepTimestamp;
uint256 lastPayout = stakingDays + firstPayout;
uint256 actualEnd = now;
uint256 amountOut = unstakeV1Internal(
sessionId,
amount,
start,
end,
actualEnd,
shares,
firstPayout,
lastPayout,
stakingDays
);
// To account
_initPayout(msg.sender, amountOut);
}
getAmountOutAndPenalty keyboard_arrow_up
Parameters help
Source Code
function getAmountOutAndPenalty(
uint256 amount,
uint256 start,
uint256 end,
uint256 stakingInterest
) public view returns (uint256, uint256) {
uint256 stakingSeconds = end.sub(start);
uint256 stakingDays = stakingSeconds.div(stepTimestamp);
uint256 secondsStaked = now.sub(start);
uint256 daysStaked = secondsStaked.div(stepTimestamp);
uint256 amountAndInterest = amount.add(stakingInterest);
// Early
if (stakingDays > daysStaked) {
uint256 payOutAmount = amountAndInterest.mul(secondsStaked).div(
stakingSeconds
);
uint256 earlyUnstakePenalty = amountAndInterest.sub(payOutAmount);
return (payOutAmount, earlyUnstakePenalty);
// In time
} else if (daysStaked < stakingDays.add(14)) {
return (amountAndInterest, 0);
// Late
} else if (daysStaked < stakingDays.add(714)) {
uint256 daysAfterStaking = daysStaked - stakingDays;
uint256 payOutAmount = amountAndInterest
.mul(uint256(714).sub(daysAfterStaking))
.div(700);
uint256 lateUnstakePenalty = amountAndInterest.sub(payOutAmount);
return (payOutAmount, lateUnstakePenalty);
// Nothing
} else {
return (0, amountAndInterest);
}
}
makePayout keyboard_arrow_up
Parameters help
This function has no parameters.
Requirements help
Source Code
function makePayout() public {
require(now >= nextPayoutCall, "Staking: Wrong payout time");
uint256 payout = _getPayout();
payouts.push(Payout({payout: payout, sharesTotalSupply: sharesTotalSupply}));
nextPayoutCall = nextPayoutCall.add(stepTimestamp);
updateShareRate(payout);
emit MakePayout(payout, sharesTotalSupply, now);
}
readPayout keyboard_arrow_up
Parameters help
This function has no parameters.
Source Code
function readPayout() external view returns (uint256) {
uint256 amountTokenInDay = IERC20Upgradeable(addresses.mainToken).balanceOf(
address(this)
);
uint256 currentTokenTotalSupply = (
IERC20Upgradeable(addresses.mainToken).totalSupply()
)
.add(globalPayin);
uint256 inflation = uint256(8)
.mul(currentTokenTotalSupply.add(totalStakedAmount))
.div(36500);
return amountTokenInDay.add(inflation);
}
restake keyboard_arrow_up
Modifiers help
pausable checks for the following:
Requirements help
Source Code
function restake(
uint256 sessionId,
uint256 stakingDays,
uint256 topup
) external pausable {
require(stakingDays != 0, "Staking: Staking days < 1");
require(stakingDays <= 5555, "Staking: Staking days > 5555");
Session storage session = sessionDataOf[msg.sender][sessionId];
require(
session.shares != 0 && session.withdrawn == false,
"Staking: Stake withdrawn/invalid"
);
uint256 actualEnd = now;
require(session.end <= actualEnd, "Staking: Stake not mature");
uint256 amountOut = unstakeInternal(session, sessionId, actualEnd);
if (topup != 0) {
IToken(addresses.mainToken).burn(msg.sender, topup);
amountOut = amountOut.add(topup);
}
stakeInternal(amountOut, stakingDays, msg.sender);
}
restakeV1 keyboard_arrow_up
Modifiers help
pausable checks for the following:
Requirements help
Source Code
function restakeV1(
uint256 sessionId,
uint256 stakingDays,
uint256 topup
) external pausable {
require(sessionId <= lastSessionIdV1, "Staking: Invalid sessionId");
require(stakingDays != 0, "Staking: Staking days < 1");
require(stakingDays <= 5555, "Staking: Staking days > 5555");
Session storage session = sessionDataOf[msg.sender][sessionId];
require(
session.shares == 0 && session.withdrawn == false,
"Staking: Stake withdrawn"
);
(
uint256 amount,
uint256 start,
uint256 end,
uint256 shares,
uint256 firstPayout
) = stakingV1.sessionDataOf(msg.sender, sessionId);
// Unstaked in v1 / doesn't exist
require(shares != 0, "Staking: Stake withdrawn");
uint256 actualEnd = now;
require(end <= actualEnd, "Staking: Stake not mature");
uint256 sessionStakingDays = (end - start) / stepTimestamp;
uint256 lastPayout = sessionStakingDays + firstPayout;
uint256 amountOut = unstakeV1Internal(
sessionId,
amount,
start,
end,
actualEnd,
shares,
firstPayout,
lastPayout,
sessionStakingDays
);
if (topup != 0) {
IToken(addresses.mainToken).burn(msg.sender, topup);
amountOut = amountOut.add(topup);
}
stakeInternal(amountOut, stakingDays, msg.sender);
}
withdrawDivToken keyboard_arrow_up
Source Code
function withdrawDivToken(address tokenAddress) external {
uint256 tokenInterestEarned = getTokenInterestEarnedInternal(
msg.sender,
tokenAddress
);
/** 0xFF... is our ethereum placeholder address */
if (tokenAddress != address(0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF)) {
IERC20Upgradeable(tokenAddress).transfer(msg.sender, tokenInterestEarned);
} else {
msg.sender.transfer(tokenInterestEarned);
}
deductBalances[msg.sender][tokenAddress] = totalSharesOf[msg.sender].mul(
tokenPricePerShare[tokenAddress]
);
emit WithdrawLiquidDiv(msg.sender, tokenAddress, tokenInterestEarned);
}
getTokenInterestEarned keyboard_arrow_up
Source Code
function getTokenInterestEarned(address accountAddress, address tokenAddress)
external
view
returns (uint256)
{
return getTokenInterestEarnedInternal(accountAddress, tokenAddress);
}
setTotalSharesOfAccount keyboard_arrow_up
Requirements help
Source Code
function setTotalSharesOfAccount(address _address) external {
setTotalSharesOfAccountInternal(_address);
}
updateTokenPricePerShare keyboard_arrow_up
Parameters help
Modifiers help
onlyAuction checks for the following:
Source Code
function updateTokenPricePerShare(
address payable bidderAddress,
address payable originAddress,
address tokenAddress,
uint256 amountBought
) external payable override onlyAuction {
// uint256 amountForBidder = amountBought.mul(10526315789473685).div(1e17);
uint256 amountForOrigin = amountBought.mul(5).div(100);
uint256 amountForBidder = amountBought.mul(10).div(100);
uint256 amountForDivs = amountBought.sub(amountForOrigin).sub(
amountForBidder
);
if (tokenAddress != address(0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF)) {
IERC20Upgradeable(tokenAddress).transfer(bidderAddress, amountForBidder);
IERC20Upgradeable(tokenAddress).transfer(originAddress, amountForOrigin);
} else {
bidderAddress.transfer(amountForBidder);
originAddress.transfer(amountForOrigin);
}
tokenPricePerShare[tokenAddress] = tokenPricePerShare[tokenAddress].add(
amountForDivs.mul(10**36).div(totalVcaRegisteredShares)
);
}
addDivToken keyboard_arrow_up
Modifiers help
onlyAuction checks for the following:
Source Code
function addDivToken(address tokenAddress) external override onlyAuction {
if (!divTokens.contains(tokenAddress)) {
divTokens.add(tokenAddress);
}
}
setShareRateScalingFactor keyboard_arrow_up
Modifiers help
onlyManager checks for the following:
null
Source Code
function setShareRateScalingFactor(uint256 _scalingFactor)
external
onlyManager
{
shareRateScalingFactor = _scalingFactor;
}
maxShare keyboard_arrow_up
Modifiers help
pausable checks for the following:
Requirements help
Source Code
function maxShare(uint256 sessionId) external pausable {
Session storage session = sessionDataOf[msg.sender][sessionId];
require(
session.shares != 0 && session.withdrawn == false,
"STAKING: Stake withdrawn or not set"
);
(
uint256 newStart,
uint256 newEnd,
uint256 newAmount,
uint256 newShares
) = maxShareUpgrade(
session.firstPayout,
session.lastPayout,
session.shares,
session.amount
);
uint256 stakingDays = (session.end - session.start) / stepTimestamp;
if (stakingDays >= basePeriod) {
ISubBalances(addresses.subBalances).createMaxShareSession(
sessionId,
newStart,
newEnd,
newShares,
session.shares
);
} else {
ISubBalances(addresses.subBalances).callIncomeStakerTrigger(
msg.sender,
sessionId,
newStart,
newEnd,
newShares
);
}
maxShareInternal(
sessionId,
session.shares,
newShares,
session.amount,
newAmount,
newStart,
newEnd
);
sessionDataOf[msg.sender][sessionId].amount = newAmount;
sessionDataOf[msg.sender][sessionId].end = newEnd;
sessionDataOf[msg.sender][sessionId].start = newStart;
sessionDataOf[msg.sender][sessionId].shares = newShares;
sessionDataOf[msg.sender][sessionId].firstPayout = payouts.length;
sessionDataOf[msg.sender][sessionId].lastPayout = payouts.length + 5555;
}
maxShareV1 keyboard_arrow_up
Modifiers help
pausable checks for the following:
Requirements help
Source Code
function maxShareV1(uint256 sessionId) external pausable {
require(sessionId <= lastSessionIdV1, "STAKING: Invalid sessionId");
Session storage session = sessionDataOf[msg.sender][sessionId];
require(
session.shares == 0 && session.withdrawn == false,
"STAKING: Stake withdrawn"
);
(
uint256 amount,
uint256 start,
uint256 end,
uint256 shares,
uint256 firstPayout
) = stakingV1.sessionDataOf(msg.sender, sessionId);
uint256 stakingDays = (end - start) / stepTimestamp;
uint256 lastPayout = stakingDays + firstPayout;
(
uint256 newStart,
uint256 newEnd,
uint256 newAmount,
uint256 newShares
) = maxShareUpgrade(firstPayout, lastPayout, shares, amount);
if (stakingDays >= basePeriod) {
ISubBalances(addresses.subBalances).createMaxShareSessionV1(
msg.sender,
sessionId,
newStart,
newEnd,
newShares, // new shares
shares // old shares
);
} else {
ISubBalances(addresses.subBalances).callIncomeStakerTrigger(
msg.sender,
sessionId,
newStart,
newEnd,
newShares
);
}
maxShareInternal(
sessionId,
shares,
newShares,
amount,
newAmount,
newStart,
newEnd
);
sessionDataOf[msg.sender][sessionId] = Session({
amount: newAmount,
start: newStart,
end: newEnd,
shares: newShares,
firstPayout: payouts.length,
lastPayout: payouts.length + 5555,
withdrawn: false,
payout: 0
});
sessionsOf[msg.sender].push(sessionId);
}
calculateStepsFromStart keyboard_arrow_up
setMaxShareEventActive keyboard_arrow_up
getMaxShareEventActive keyboard_arrow_up
setMaxShareMaxDays keyboard_arrow_up
Modifiers help
onlyManager checks for the following:
null
Source Code
function setMaxShareMaxDays(uint16 _maxShareMaxDays) external onlyManager {
maxShareMaxDays = _maxShareMaxDays;
}
setTotalVcaRegisteredShares keyboard_arrow_up
setPaused keyboard_arrow_up
Requirements help
One or more of the following:
-null - ORnull
Source Code
function setPaused(bool _paused) external {
require(
hasRole(MIGRATOR_ROLE, msg.sender) || hasRole(MANAGER_ROLE, msg.sender),
"STAKING: User must be manager or migrator"
);
paused = _paused;
}
getPaused keyboard_arrow_up
getMaxShareMaxDays keyboard_arrow_up
setupRole keyboard_arrow_up
getDivTokens keyboard_arrow_up
Parameters help
This function has no parameters.
Source Code
function getDivTokens() external view returns (address[] memory) {
address[] memory divTokenAddresses = new address[](divTokens.length());
for (uint8 i = 0; i < divTokens.length(); i++) {
divTokenAddresses[i] = divTokens.at(i);
}
return divTokenAddresses;
}
getTotalSharesOf keyboard_arrow_up
getTotalVcaRegisteredShares keyboard_arrow_up
getIsVCARegistered keyboard_arrow_up
resetTotalSharesOfAccount keyboard_arrow_up
Modifiers help
onlyMigrator checks for the following:
null
Source Code
function resetTotalSharesOfAccount(address staker) external onlyMigrator {
isVcaRegistered[staker] = false;
totalVcaRegisteredShares = totalVcaRegisteredShares.sub(
totalSharesOf[staker]
);
totalSharesOf[staker] = 0;
}
fixV1Stake keyboard_arrow_up
Modifiers help
onlyMigrator checks for the following:
null
Requirements help
Source Code
function fixV1Stake(address _staker, uint256 _sessionId) external onlyMigrator {
require(isVcaRegistered[_staker] == true, "Must be VCA Registered");
require(_sessionId <= lastSessionIdV1, "Staking: Invalid sessionId"); // Require that the sessionId we are looking for is > v1Id
// Ensure that the session does not exist
Session storage session = sessionDataOf[_staker][_sessionId];
require(
session.shares == 0 && session.withdrawn == false,
"Staking: Stake already fixed and or withdrawn"
);
// Find the v1 stake && ensure the stake has not been withdrawn
(
uint256 amount,
uint256 start,
uint256 end,
uint256 shares,
uint256 firstPayout
) = stakingV1.sessionDataOf(_staker, _sessionId);
require(shares == 0, "Staking: Stake has not been withdrawn");
// Get # of staking days
uint256 stakingDays = (end.sub(start)).div(stepTimestamp);
stakeInternalCommon(
_sessionId,
amount,
start,
end < now ? now : end,
stakingDays,
firstPayout,
_staker
);
}
Internal Functions
Internal functions are parts of the contract that can't be used directly, but instead are used by the public functions listed above.
internal Staking.stakeInternal keyboard_arrow_up
Source Code
function stakeInternal(
uint256 amount,
uint256 stakingDays,
address staker
) internal {
if (now >= nextPayoutCall) makePayout();
if (isVcaRegistered[staker] == false) setTotalSharesOfAccountInternal(staker);
uint256 start = now;
uint256 end = now.add(stakingDays.mul(stepTimestamp));
lastSessionId = lastSessionId.add(1);
stakeInternalCommon(
lastSessionId,
amount,
start,
end,
stakingDays,
payouts.length,
staker
);
}
internal Staking._initPayout keyboard_arrow_up
internal Staking._getPayout keyboard_arrow_up
Parameters help
This function has no parameters.
Source Code
function _getPayout() internal returns (uint256) {
uint256 amountTokenInDay = IERC20Upgradeable(addresses.mainToken).balanceOf(
address(this)
);
globalPayin = globalPayin.add(amountTokenInDay);
if (globalPayin > globalPayout) {
globalPayin = globalPayin.sub(globalPayout);
globalPayout = 0;
} else {
globalPayin = 0;
globalPayout = 0;
}
uint256 currentTokenTotalSupply = (
IERC20Upgradeable(addresses.mainToken).totalSupply()
)
.add(globalPayin);
IToken(addresses.mainToken).burn(address(this), amountTokenInDay);
uint256 inflation = uint256(8)
.mul(currentTokenTotalSupply.add(totalStakedAmount))
.div(36500);
globalPayin = globalPayin.add(inflation);
return amountTokenInDay.add(inflation);
}
internal Staking._getStakersSharesAmount keyboard_arrow_up
Source Code
function _getStakersSharesAmount(
uint256 amount,
uint256 start,
uint256 end
) internal view returns (uint256) {
uint256 stakingDays = (end.sub(start)).div(stepTimestamp);
uint256 numerator = amount.mul(uint256(1819).add(stakingDays));
uint256 denominator = uint256(1820).mul(shareRate);
return (numerator).mul(1e18).div(denominator);
}
internal Staking._getShareRate keyboard_arrow_up
Parameters help
Source Code
function _getShareRate(
uint256 amount,
uint256 shares,
uint256 start,
uint256 end,
uint256 stakingInterest
) internal view returns (uint256) {
uint256 stakingDays = (end.sub(start)).div(stepTimestamp);
uint256 numerator = (amount.add(stakingInterest)).mul(
uint256(1819).add(stakingDays)
);
uint256 denominator = uint256(1820).mul(shares);
return (numerator).mul(1e18).div(denominator);
}
internal Staking.unstakeInternal keyboard_arrow_up
Source Code
function unstakeInternal(
Session storage session,
uint256 sessionId,
uint256 actualEnd
) internal returns (uint256) {
uint256 amountOut = unstakeInternalCommon(
sessionId,
session.amount,
session.start,
session.end,
actualEnd,
session.shares,
session.firstPayout,
session.lastPayout
);
uint256 stakingDays = (session.end - session.start) / stepTimestamp;
if (stakingDays >= basePeriod) {
ISubBalances(addresses.subBalances).callOutcomeStakerTrigger(
sessionId,
session.start,
session.end,
actualEnd,
session.shares
);
}
session.end = actualEnd;
session.withdrawn = true;
session.payout = amountOut;
return amountOut;
}
internal Staking.unstakeV1Internal keyboard_arrow_up
Parameters help
Source Code
function unstakeV1Internal(
uint256 sessionId,
uint256 amount,
uint256 start,
uint256 end,
uint256 actualEnd,
uint256 shares,
uint256 firstPayout,
uint256 lastPayout,
uint256 stakingDays
) internal returns (uint256) {
uint256 amountOut = unstakeInternalCommon(
sessionId,
amount,
start,
end,
actualEnd,
shares,
firstPayout,
lastPayout
);
if (stakingDays >= basePeriod) {
ISubBalances(addresses.subBalances).callOutcomeStakerTriggerV1(
msg.sender,
sessionId,
start,
end,
actualEnd,
shares
);
}
sessionDataOf[msg.sender][sessionId] = Session({
amount: amount,
start: start,
end: actualEnd,
shares: shares,
firstPayout: firstPayout,
lastPayout: lastPayout,
withdrawn: true,
payout: amountOut
});
sessionsOf[msg.sender].push(sessionId);
return amountOut;
}
internal Staking.unstakeInternalCommon keyboard_arrow_up
Parameters help
Source Code
function unstakeInternalCommon(
uint256 sessionId,
uint256 amount,
uint256 start,
uint256 end,
uint256 actualEnd,
uint256 shares,
uint256 firstPayout,
uint256 lastPayout
) internal returns (uint256) {
if (now >= nextPayoutCall) makePayout();
if (isVcaRegistered[msg.sender] == false)
setTotalSharesOfAccountInternal(msg.sender);
uint256 stakingInterest = calculateStakingInterest(
firstPayout,
lastPayout,
shares
);
sharesTotalSupply = sharesTotalSupply.sub(shares);
totalStakedAmount = totalStakedAmount.sub(amount);
totalVcaRegisteredShares = totalVcaRegisteredShares.sub(shares);
uint256 oldTotalSharesOf = totalSharesOf[msg.sender];
totalSharesOf[msg.sender] = totalSharesOf[msg.sender].sub(shares);
rebalance(msg.sender, oldTotalSharesOf);
(uint256 amountOut, uint256 penalty) = getAmountOutAndPenalty(
amount,
start,
end,
stakingInterest
);
// To auction
if (penalty != 0) {
_initPayout(addresses.auction, penalty);
IAuction(addresses.auction).callIncomeDailyTokensTrigger(penalty);
}
emit Unstake(msg.sender, sessionId, amountOut, start, actualEnd, shares);
return amountOut;
}
internal Staking.stakeInternalCommon keyboard_arrow_up
Parameters help
Source Code
function stakeInternalCommon(
uint256 sessionId,
uint256 amount,
uint256 start,
uint256 end,
uint256 stakingDays,
uint256 firstPayout,
address staker
) internal {
uint256 shares = _getStakersSharesAmount(amount, start, end);
sharesTotalSupply = sharesTotalSupply.add(shares);
totalStakedAmount = totalStakedAmount.add(amount);
totalVcaRegisteredShares = totalVcaRegisteredShares.add(shares);
uint256 oldTotalSharesOf = totalSharesOf[staker];
totalSharesOf[staker] = totalSharesOf[staker].add(shares);
rebalance(staker, oldTotalSharesOf);
sessionDataOf[staker][sessionId] = Session({
amount: amount,
start: start,
end: end,
shares: shares,
firstPayout: firstPayout,
lastPayout: firstPayout + stakingDays,
withdrawn: false,
payout: 0
});
sessionsOf[staker].push(sessionId);
if (stakingDays >= basePeriod) {
ISubBalances(addresses.subBalances).callIncomeStakerTrigger(
staker,
sessionId,
start,
end,
shares
);
}
emit Stake(staker, sessionId, amount, start, end, shares);
}
internal Staking.getTokenInterestEarnedInternal keyboard_arrow_up
Source Code
function getTokenInterestEarnedInternal(
address accountAddress,
address tokenAddress
) internal view returns (uint256) {
return
totalSharesOf[accountAddress]
.mul(tokenPricePerShare[tokenAddress])
.sub(deductBalances[accountAddress][tokenAddress])
.div(10**36);
}
internal Staking.rebalance keyboard_arrow_up
Source Code
function rebalance(address staker, uint256 oldTotalSharesOf) internal {
for (uint8 i = 0; i < divTokens.length(); i++) {
uint256 tokenInterestEarned = oldTotalSharesOf
.mul(tokenPricePerShare[divTokens.at(i)])
.sub(deductBalances[staker][divTokens.at(i)]);
deductBalances[staker][divTokens.at(i)] = totalSharesOf[staker]
.mul(tokenPricePerShare[divTokens.at(i)])
.sub(tokenInterestEarned);
}
}
internal Staking.setTotalSharesOfAccountInternal keyboard_arrow_up
Modifiers help
pausable checks for the following:
Requirements help
Source Code
function setTotalSharesOfAccountInternal(address account) internal pausable {
require(
isVcaRegistered[account] == false || hasRole(MIGRATOR_ROLE, msg.sender),
"STAKING: Account already registered."
);
uint256 totalShares;
uint256[] storage sessionsOfAccount = sessionsOf[account];
for (uint256 i = 0; i < sessionsOfAccount.length; i++) {
if (sessionDataOf[account][sessionsOfAccount[i]].withdrawn) continue;
totalShares = totalShares.add(
sessionDataOf[account][sessionsOfAccount[i]].shares
);
}
uint256[] memory v1SessionsOfAccount = stakingV1.sessionsOf_(account);
for (uint256 i = 0; i < v1SessionsOfAccount.length; i++) {
if (sessionDataOf[account][v1SessionsOfAccount[i]].shares != 0) continue;
if (v1SessionsOfAccount[i] > lastSessionIdV1) continue;
(
uint256 amount,
uint256 start,
uint256 end,
uint256 shares,
uint256 firstPayout
) = stakingV1.sessionDataOf(account, v1SessionsOfAccount[i]);
(amount);
(start);
(end);
(firstPayout);
if (shares == 0) continue;
totalShares = totalShares.add(shares);
}
isVcaRegistered[account] = true;
if (totalShares != 0) {
totalSharesOf[account] = totalShares;
totalVcaRegisteredShares = totalVcaRegisteredShares.add(totalShares);
for (uint256 i = 0; i < divTokens.length(); i++) {
deductBalances[account][divTokens.at(i)] = totalShares.mul(
tokenPricePerShare[divTokens.at(i)]
);
}
}
emit AccountRegistered(account, totalShares);
}
internal Staking.updateShareRate keyboard_arrow_up
Source Code
function updateShareRate(uint256 _payout) internal {
uint256 currentTokenTotalSupply = IERC20Upgradeable(addresses.mainToken)
.totalSupply();
uint256 growthFactor = _payout.mul(1e18).div(
currentTokenTotalSupply + totalStakedAmount + 1
);
if (shareRateScalingFactor == 0) {
shareRateScalingFactor = 1;
}
shareRate = shareRate
.mul(1e18 + shareRateScalingFactor.mul(growthFactor))
.div(1e18);
}
internal Staking.maxShareUpgrade keyboard_arrow_up
Parameters help
Requirements help
Source Code
function maxShareUpgrade(
uint256 firstPayout,
uint256 lastPayout,
uint256 shares,
uint256 amount
)
internal
view
returns (
uint256,
uint256,
uint256,
uint256
)
{
require(
maxShareEventActive == true,
"STAKING: Max Share event is not active"
);
require(
lastPayout - firstPayout <= maxShareMaxDays,
"STAKING: Max Share Upgrade - Stake must be less then max share max days"
);
uint256 stakingInterest = calculateStakingInterest(
firstPayout,
lastPayout,
shares
);
uint256 newStart = now;
uint256 newEnd = newStart + (stepTimestamp * 5555);
uint256 newAmount = stakingInterest + amount;
uint256 newShares = _getStakersSharesAmount(newAmount, newStart, newEnd);
require(
newShares > shares,
"STAKING: New shares are not greater then previous shares"
);
return (newStart, newEnd, newAmount, newShares);
}
internal Staking.maxShareInternal keyboard_arrow_up
Parameters help
Source Code
function maxShareInternal(
uint256 sessionId,
uint256 oldShares,
uint256 newShares,
uint256 oldAmount,
uint256 newAmount,
uint256 newStart,
uint256 newEnd
) internal {
if (now >= nextPayoutCall) makePayout();
if (isVcaRegistered[msg.sender] == false)
setTotalSharesOfAccountInternal(msg.sender);
sharesTotalSupply = sharesTotalSupply.add(newShares - oldShares);
totalStakedAmount = totalStakedAmount.add(newAmount - oldAmount);
totalVcaRegisteredShares = totalVcaRegisteredShares.add(
newShares - oldShares
);
uint256 oldTotalSharesOf = totalSharesOf[msg.sender];
totalSharesOf[msg.sender] = totalSharesOf[msg.sender].add(
newShares - oldShares
);
rebalance(msg.sender, oldTotalSharesOf);
emit MaxShareUpgrade(
msg.sender,
sessionId,
oldAmount,
newAmount,
oldShares,
newShares,
newStart,
newEnd
);
}
internal Initializable._isConstructor keyboard_arrow_up
internal AccessControlUpgradeable.__AccessControl_init keyboard_arrow_up
Parameters help
This function has no parameters.
Modifiers help
initializer checks for the following:
One or more of the following:
-_initialized must not be true - ORnull - OR_initializing must be true
Source Code
function __AccessControl_init() internal initializer {
__Context_init_unchained();
__AccessControl_init_unchained();
}
internal AccessControlUpgradeable.__AccessControl_init_unchained keyboard_arrow_up
Parameters help
This function has no parameters.
Modifiers help
initializer checks for the following:
One or more of the following:
-_initialized must not be true - ORnull - OR_initializing must be true
Source Code
function __AccessControl_init_unchained() internal initializer {}
internal AccessControlUpgradeable._setupRole keyboard_arrow_up
internal AccessControlUpgradeable._setRoleAdmin keyboard_arrow_up
Source Code
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
emit RoleAdminChanged(role, _roles[role].adminRole, adminRole);
_roles[role].adminRole = adminRole;
}
internal AccessControlUpgradeable._grantRole keyboard_arrow_up
internal AccessControlUpgradeable._revokeRole keyboard_arrow_up
internal Initializable._isConstructor keyboard_arrow_up
internal ContextUpgradeable.__Context_init keyboard_arrow_up
Parameters help
This function has no parameters.
Modifiers help
initializer checks for the following:
One or more of the following:
-_initialized must not be true - ORnull - OR_initializing must be true
Source Code
function __Context_init() internal initializer {
__Context_init_unchained();
}
internal ContextUpgradeable.__Context_init_unchained keyboard_arrow_up
Parameters help
This function has no parameters.
Modifiers help
initializer checks for the following:
One or more of the following:
-_initialized must not be true - ORnull - OR_initializing must be true
Source Code
function __Context_init_unchained() internal initializer {}
internal ContextUpgradeable._msgSender keyboard_arrow_up
internal ContextUpgradeable._msgData keyboard_arrow_up
Parameters help
This function has no parameters.
Source Code
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}