Skip to content

Commit ea12af7

Browse files
committed
fix: Convert poolMargin from double to BigDecimal to fix rounding issue in preview (1 lovelace diff in preview epoch 372 where margin = 99.99%)
1 parent 619455d commit ea12af7

File tree

2 files changed

+9
-10
lines changed

2 files changed

+9
-10
lines changed

calculation/src/main/java/org/cardanofoundation/rewards/calculation/EpochCalculation.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public static EpochCalculationResult calculateEpochRewardPots(final int epoch,
6565

6666
if (epochInfo != null) {
6767
activeStakeInEpoch = epochInfo.getActiveStake();
68-
totalFeesForCurrentEpoch = epochInfo.getFees();
68+
totalFeesForCurrentEpoch = epochInfo.getFees() != null? epochInfo.getFees(): BigInteger.ZERO;
6969
totalBlocksInEpoch = epochInfo.getBlockCount();
7070
if (isLower(decentralizationParameter, BigDecimal.valueOf(0.8)) && isHigher(decentralizationParameter, BigDecimal.ZERO)) {
7171
totalBlocksInEpoch = epochInfo.getNonOBFTBlockCount();

calculation/src/main/java/org/cardanofoundation/rewards/calculation/PoolRewardsCalculation.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
package org.cardanofoundation.rewards.calculation;
22

3+
import lombok.extern.slf4j.Slf4j;
34
import org.cardanofoundation.rewards.calculation.config.NetworkConfig;
45
import org.cardanofoundation.rewards.calculation.domain.*;
56

67
import java.math.BigDecimal;
78
import java.math.BigInteger;
8-
import java.util.*;
9+
import java.util.HashSet;
10+
import java.util.Set;
911

1012
import static org.cardanofoundation.rewards.calculation.util.BigNumberUtils.*;
11-
import static org.cardanofoundation.rewards.calculation.util.BigNumberUtils.divide;
12-
13-
import lombok.extern.slf4j.Slf4j;
1413

1514
@Slf4j
1615
public class PoolRewardsCalculation {
@@ -97,14 +96,14 @@ public static BigInteger calculatePoolReward(BigInteger optimalPoolReward, BigDe
9796
* This method calculates the pool operator reward regarding the formula described
9897
* in the shelly-ledger.pdf p. 61, figure 47
9998
*/
100-
public static BigInteger calculateLeaderReward(BigInteger poolReward, double margin, BigInteger poolCost,
99+
public static BigInteger calculateLeaderReward(BigInteger poolReward, BigDecimal margin, BigInteger poolCost,
101100
BigDecimal relativeOwnerStake, BigDecimal relativeStakeOfPool) {
102101
if (isLowerOrEquals(poolReward, poolCost)) {
103102
return poolReward;
104103
}
105104

106105
return add(poolCost, floor(multiply(subtract(poolReward, poolCost),
107-
add(margin, multiply((1 - margin), divide(relativeOwnerStake, relativeStakeOfPool))))));
106+
add(margin, multiply(BigDecimal.ONE.subtract(margin), divide(relativeOwnerStake, relativeStakeOfPool))))));
108107
}
109108

110109
/*
@@ -113,7 +112,7 @@ public static BigInteger calculateLeaderReward(BigInteger poolReward, double mar
113112
*
114113
* See Haskell implementation: https://github.com/input-output-hk/cardano-ledger/blob/aed5dde9cd1096cfc2e255879cd617c0d64f8d9d/eras/shelley/impl/src/Cardano/Ledger/Shelley/Rewards.hs#L117
115114
*/
116-
public static BigInteger calculateMemberReward(BigInteger poolReward, double margin, BigInteger poolCost,
115+
public static BigInteger calculateMemberReward(BigInteger poolReward, BigDecimal margin, BigInteger poolCost,
117116
BigDecimal relativeMemberStake, BigDecimal relativeStakeOfPool) {
118117
if (isLowerOrEquals(poolReward, poolCost)) {
119118
return BigInteger.ZERO;
@@ -156,11 +155,11 @@ public static PoolRewardCalculationResult calculatePoolRewardInEpoch(final Strin
156155

157156
final BigInteger poolStake = poolStateCurrentEpoch.getActiveStake();
158157
final BigInteger poolPledge = poolStateCurrentEpoch.getPledge();
159-
final double poolMargin = poolStateCurrentEpoch.getMargin();
158+
final BigDecimal poolMargin = BigDecimal.valueOf(poolStateCurrentEpoch.getMargin());
160159
final BigInteger poolFixedCost = poolStateCurrentEpoch.getFixedCost();
161160
final int blocksPoolHasMinted = poolStateCurrentEpoch.getBlockCount();
162161

163-
poolRewardCalculationResult.setPoolMargin(poolMargin);
162+
poolRewardCalculationResult.setPoolMargin(poolStateCurrentEpoch.getMargin());
164163
poolRewardCalculationResult.setPoolCost(poolFixedCost);
165164
poolRewardCalculationResult.setRewardAddress(poolStateCurrentEpoch.getRewardAddress());
166165

0 commit comments

Comments
 (0)