Skip to content

Commit

Permalink
chore: improve noStakingInteractionsForExtendedPeriodIsFine() spec (#…
Browse files Browse the repository at this point in the history
…15388)

Signed-off-by: Michael Tinker <[email protected]>
  • Loading branch information
tinker-michaelj authored Sep 9, 2024
1 parent 7bbbf80 commit 0fd5d57
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -80,11 +80,11 @@ public static RewardSumHistory calculateRewardSumHistory(
final boolean requireMinStakeToReward) {
final var currRewardSumHistory = currentInfo.rewardSumHistory();
final var newRewardSumHistory = new ArrayList<>(currRewardSumHistory);
final var droppedRewardSum = currRewardSumHistory.get(currRewardSumHistory.size() - 1);
final var droppedRewardSum = currRewardSumHistory.getLast();
for (int i = currRewardSumHistory.size() - 1; i > 0; i--) {
newRewardSumHistory.set(i, currRewardSumHistory.get(i - 1) - droppedRewardSum);
}
newRewardSumHistory.set(0, currRewardSumHistory.get(0) - droppedRewardSum);
newRewardSumHistory.set(0, currRewardSumHistory.getFirst() - droppedRewardSum);

long perHbarRateThisNode = 0;
// If this node was "active"---i.e., node.numRoundsWithJudge / numRoundsInPeriod >= activeThreshold---and it had
Expand All @@ -108,7 +108,7 @@ public static RewardSumHistory calculateRewardSumHistory(
}
}
perHbarRateThisNode = Math.min(perHbarRateThisNode, maxPerHbarRate);
newRewardSumHistory.set(0, newRewardSumHistory.get(0) + perHbarRateThisNode);
newRewardSumHistory.set(0, newRewardSumHistory.getFirst() + perHbarRateThisNode);

return new RewardSumHistory(newRewardSumHistory, perHbarRateThisNode);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ void givesEffectivePeriodCorrectly() {

final var expectedEffectivePeriod = LocalDate.ofInstant(Instant.ofEpochSecond(12345678910L), ZONE_UTC)
.toEpochDay();
assertEquals(expectedEffectivePeriod - 365, period);
assertEquals(expectedEffectivePeriod - 366, period);
assertEquals(expectedEffectivePeriod - 10, subject.effectivePeriod(stakePeriod - 10));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ static long epochSecondAtStartOfPeriod(final long stakePeriod, final long stakeP
static long clampedStakePeriodStart(
final long stakePeriodStart, final long currentStakePeriod, final int numStoredPeriods) {
if (stakePeriodStart > -1 && stakePeriodStart < currentStakePeriod - numStoredPeriods) {
return currentStakePeriod - numStoredPeriods;
return currentStakePeriod - numStoredPeriods - 1;
}
return stakePeriodStart;
}
Expand All @@ -205,7 +205,7 @@ private static long rewardFor(
return 0;
}

final var firstRewardSum = rewardSumHistory.get(0);
final var firstRewardSum = rewardSumHistory.getFirst();
final var rewardFromSum = rewardSumHistory.get(rewardFrom);
if (account.stakeAtStartOfLastRewardedPeriod() != -1) {
final var rewardFromMinus1Sum = rewardSumHistory.get(rewardFrom - 1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

import static com.hedera.services.bdd.junit.RepeatableReason.NEEDS_VIRTUAL_TIME_FOR_FAST_EXECUTION;
import static com.hedera.services.bdd.spec.HapiSpec.hapiTest;
import static com.hedera.services.bdd.spec.queries.QueryVerbs.getTxnRecord;
import static com.hedera.services.bdd.spec.transactions.TxnVerbs.cryptoCreate;
import static com.hedera.services.bdd.spec.transactions.TxnVerbs.cryptoTransfer;
import static com.hedera.services.bdd.spec.transactions.crypto.HapiCryptoTransfer.tinyBarsFromTo;
Expand All @@ -32,20 +33,26 @@
import static com.hedera.services.bdd.suites.HapiSuite.STAKING_REWARD;

import com.hedera.services.bdd.junit.RepeatableHapiTest;
import java.util.List;
import java.util.stream.Stream;
import org.apache.commons.lang3.tuple.Pair;
import org.junit.jupiter.api.DynamicTest;

/**
* Validates that staking metadata stays up-to-date even when returning to a staked account
* after a long period of inactivity.
*/
public class RepeatableStakingTests {
@RepeatableHapiTest(NEEDS_VIRTUAL_TIME_FOR_FAST_EXECUTION)
Stream<DynamicTest> noStakingInteractionsForExtendedPeriodIsFine() {
final var numPeriodsToElapse = 367;
final var numPeriodsToElapse = 366;
return hapiTest(
overridingThree(
"staking.startThreshold", "" + 10 * ONE_HBAR,
"staking.perHbarRewardRate", "1",
"staking.rewardBalanceThreshold", "0"),
cryptoTransfer(tinyBarsFromTo(GENESIS, STAKING_REWARD, ONE_MILLION_HBARS)),
cryptoCreate("forgottenStaker").stakedNodeId(0).balance(ONE_MILLION_HBARS),
cryptoCreate("forgottenStaker").stakedNodeId(0).balance(ONE_HBAR),
withOpContext((spec, opLog) -> {
for (int i = 0; i < numPeriodsToElapse; i++) {
allRunFor(
Expand All @@ -54,6 +61,7 @@ Stream<DynamicTest> noStakingInteractionsForExtendedPeriodIsFine() {
cryptoTransfer(tinyBarsFromTo(GENESIS, FUNDING, 1L)));
}
}),
cryptoTransfer(tinyBarsFromTo(GENESIS, "forgottenStaker", 1L)));
cryptoTransfer(tinyBarsFromTo(GENESIS, "forgottenStaker", 1L)).via("collection"),
getTxnRecord("collection").hasPaidStakingRewards(List.of(Pair.of("forgottenStaker", 365L))));
}
}

0 comments on commit 0fd5d57

Please sign in to comment.