Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion contracts/GlobalsAndUtility.sol
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,7 @@ contract GlobalsAndUtility is ERC20 {
uint256 _daysStored;
uint256 _stakeSharesTotal;
uint256 _nextStakeSharesTotal;
uint256 _heartsDaysTotal;
uint48 _latestStakeId;
// 2
uint256 _stakePenaltyPool;
Expand All @@ -172,6 +173,7 @@ contract GlobalsAndUtility is ERC20 {
uint16 daysStored;
uint80 stakeSharesTotal;
uint80 nextStakeSharesTotal;
uint256 heartsDaysTotal;
uint48 latestStakeId;
// 2
uint80 stakePenaltyPool;
Expand All @@ -188,6 +190,8 @@ contract GlobalsAndUtility is ERC20 {
/* Period data */
struct DailyDataStore {
uint80 dayPayoutTotal;
uint80 dayRewardTotal;
uint256 heartsDaysTotal;
uint80 dayStakeSharesTotal;
}

Expand Down Expand Up @@ -220,6 +224,7 @@ contract GlobalsAndUtility is ERC20 {
uint256 _mintContractBatch;
uint256 _mintOriginBatch;
uint256 _payoutTotal;
uint256 _rewardTotal;
}

/**
Expand Down Expand Up @@ -347,6 +352,7 @@ contract GlobalsAndUtility is ERC20 {
g._daysStored = globals.daysStored;
g._stakeSharesTotal = globals.stakeSharesTotal;
g._nextStakeSharesTotal = globals.nextStakeSharesTotal;
g._heartsDaysTotal = globals.heartsDaysTotal;
g._latestStakeId = globals.latestStakeId;
// 2
g._stakePenaltyPool = globals.stakePenaltyPool;
Expand All @@ -365,6 +371,7 @@ contract GlobalsAndUtility is ERC20 {
gSnapshot._daysStored = g._daysStored;
gSnapshot._stakeSharesTotal = g._stakeSharesTotal;
gSnapshot._nextStakeSharesTotal = g._nextStakeSharesTotal;
gSnapshot._heartsDaysTotal = g._heartsDaysTotal;
gSnapshot._latestStakeId = g._latestStakeId;
// 2
gSnapshot._stakePenaltyPool = g._stakePenaltyPool;
Expand All @@ -379,6 +386,7 @@ contract GlobalsAndUtility is ERC20 {
globals.daysStored = uint16(g._daysStored);
globals.stakeSharesTotal = uint80(g._stakeSharesTotal);
globals.nextStakeSharesTotal = uint80(g._nextStakeSharesTotal);
globals.heartsDaysTotal = g._heartsDaysTotal;
globals.latestStakeId = g._latestStakeId;
}

Expand All @@ -388,6 +396,7 @@ contract GlobalsAndUtility is ERC20 {
if (g._daysStored == gSnapshot._daysStored
&& g._stakeSharesTotal == gSnapshot._stakeSharesTotal
&& g._nextStakeSharesTotal == gSnapshot._nextStakeSharesTotal
&& g._heartsDaysTotal == gSnapshot._heartsDaysTotal
&& g._latestStakeId == gSnapshot._latestStakeId) {
return;
}
Expand Down Expand Up @@ -522,7 +531,10 @@ contract GlobalsAndUtility is ERC20 {
if (g._stakeSharesTotal != 0) {
_calcDailyRound(g, rs, day);
dailyData[day].dayPayoutTotal = uint80(rs._payoutTotal);
dailyData[day].dayRewardTotal = uint80(rs._rewardTotal);
dailyData[day].heartsDaysTotal = g._heartsDaysTotal;
dailyData[day].dayStakeSharesTotal = uint80(g._stakeSharesTotal);

} else {
if (day == CLAIM_REWARD_DAYS && g._unclaimedSatoshisTotal != 0) {
/*
Expand Down Expand Up @@ -676,7 +688,7 @@ contract GlobalsAndUtility is ERC20 {
*/
rs._payoutTotal += bonus;
_batchMintContract(rs, rs._payoutTotal);
rs._payoutTotal += reward;
rs._rewardTotal = reward;
_batchMintOrigin(rs, reward + bonus);
} else {
/*
Expand Down
13 changes: 13 additions & 0 deletions contracts/StakeableToken.sol
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ contract StakeableToken is UTXORedeemableToken {
_storeDailyDataBefore(g, g._currentDay);

uint256 newStakeShares = calcStakeShares(newStakedHearts, newStakedDays);
g._heartsDaysTotal += newStakedHearts * newStakedDays;

/*
The startStake timestamp will always be part-way through the current
Expand Down Expand Up @@ -139,6 +140,8 @@ contract StakeableToken is UTXORedeemableToken {
/* st._unpooledDay has changed */
_updateStake(stRef, st);

g._heartsDaysTotal -= st._stakedHearts * st._stakedDays;

_saveGlobals1(g);
_syncGlobals2(g, gSnapshot);
}
Expand Down Expand Up @@ -220,6 +223,8 @@ contract StakeableToken is UTXORedeemableToken {

_removeStakeFromList(stakeListRef, stakeIndex);

g._heartsDaysTotal -= st._stakedHearts * st._stakedDays;

_saveGlobals1(g);
_syncGlobals2(g, gSnapshot);
}
Expand Down Expand Up @@ -362,6 +367,14 @@ contract StakeableToken is UTXORedeemableToken {
stakeReturn = st._stakedHearts + payout;
} else {
payout = calcPayoutRewards(st._stakeShares, st._pooledDay, st._pooledDay + servedDays);
/*
If this stake spans across the end of claim phase, payout their portion of accumulated WAAS
in the amount of staked hearts * days / total hearts * days on last claim day
*/
if(st._pooledDay <= CLAIM_PHASE_DAYS && st._pooledDay + servedDays > CLAIM_PHASE_DAYS){
payout += dailyData[CLAIM_PHASE_DAYS].dayRewardTotal * st._stakedDays * st._stakedHearts / dailyData[CLAIM_PHASE_DAYS].heartsDaysTotal;
}

stakeReturn = st._stakedHearts + payout;

penalty = _calcLatePenalty(
Expand Down