Skip to content

Commit 75180bd

Browse files
committed
Merge branch 'fdc-minimal-conditions' into 'main'
min conditions FDC See merge request flarenetwork/ftso/ftso-scaling!155
2 parents f05d4f7 + c28015f commit 75180bd

File tree

8 files changed

+804
-658
lines changed

8 files changed

+804
-658
lines changed

apps/ftso-reward-calculation-process/src/services/calculator.service.ts

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,27 @@ import { EntityManager } from "typeorm";
55
import { DataManagerForRewarding } from "../../../../libs/fsp-rewards/src/DataManagerForRewarding";
66
import { IndexerClientForRewarding } from "../../../../libs/fsp-rewards/src/IndexerClientForRewarding";
77
import { BURN_ADDRESS, FUTURE_VOTING_ROUNDS } from "../../../../libs/fsp-rewards/src/constants";
8-
import { calculateMinimalConditions, extractNewPasses, updateClaimsForMinimalConditions } from "../../../../libs/fsp-rewards/src/reward-calculation/minimal-conditions/minimal-conditions";
9-
import { writeDataProviderConditions, writePassesInfo } from "../../../../libs/fsp-rewards/src/reward-calculation/minimal-conditions/minimal-conditions-data";
8+
import {
9+
calculateMinimalConditions,
10+
extractNewPasses,
11+
updateClaimsForMinimalConditions,
12+
} from "../../../../libs/fsp-rewards/src/reward-calculation/minimal-conditions/minimal-conditions";
13+
import {
14+
writeDataProviderConditions,
15+
writePassesInfo,
16+
} from "../../../../libs/fsp-rewards/src/reward-calculation/minimal-conditions/minimal-conditions-data";
1017
import { initializeRewardEpochStorage } from "../../../../libs/fsp-rewards/src/reward-calculation/reward-calculation";
1118
import { RewardClaim } from "../../../../libs/fsp-rewards/src/utils/RewardClaim";
1219
import { deserializeAggregatedClaimsForVotingRoundId } from "../../../../libs/fsp-rewards/src/utils/stat-info/aggregated-claims";
1320
import { serializeFinalRewardClaims } from "../../../../libs/fsp-rewards/src/utils/stat-info/final-reward-claims";
14-
import { getIncrementalCalculationsTempRewards, serializeIncrementalCalculationsTempRewards } from "../../../../libs/fsp-rewards/src/utils/stat-info/incremental-calculation-temp-rewards";
15-
import { getIncrementalCalculationsFeedSelections, serializeIncrementalCalculationsFeedSelections } from "../../../../libs/fsp-rewards/src/utils/stat-info/incremental-calculation-temp-selected-feeds";
21+
import {
22+
getIncrementalCalculationsTempRewards,
23+
serializeIncrementalCalculationsTempRewards,
24+
} from "../../../../libs/fsp-rewards/src/utils/stat-info/incremental-calculation-temp-rewards";
25+
import {
26+
getIncrementalCalculationsFeedSelections,
27+
serializeIncrementalCalculationsFeedSelections,
28+
} from "../../../../libs/fsp-rewards/src/utils/stat-info/incremental-calculation-temp-selected-feeds";
1629
import { recordProgress } from "../../../../libs/fsp-rewards/src/utils/stat-info/progress";
1730
import {
1831
RewardCalculationStatus,
@@ -137,7 +150,10 @@ export class CalculatorService {
137150
};
138151
fixRandomNumbersAndOffers(state, logger);
139152

140-
const feedSelections = getIncrementalCalculationsFeedSelections(rewardEpochDuration.rewardEpochId, state.nextVotingRoundIdWithNoSecureRandom - 1);
153+
const feedSelections = getIncrementalCalculationsFeedSelections(
154+
rewardEpochDuration.rewardEpochId,
155+
state.nextVotingRoundIdWithNoSecureRandom - 1
156+
);
141157
serializeIncrementalCalculationsFeedSelections(feedSelections);
142158

143159
await incrementalBatchClaimCatchup(rewardEpochDuration, state, options, logger);
@@ -149,7 +165,10 @@ export class CalculatorService {
149165
claimAggregation(rewardEpochDuration, votingRoundId, logger, true);
150166
}
151167

152-
const tempClaimData = getIncrementalCalculationsTempRewards(rewardEpochDuration.rewardEpochId, state.nextVotingRoundForClaimCalculation - 1);
168+
const tempClaimData = getIncrementalCalculationsTempRewards(
169+
rewardEpochDuration.rewardEpochId,
170+
state.nextVotingRoundForClaimCalculation - 1
171+
);
153172
serializeIncrementalCalculationsTempRewards(tempClaimData);
154173

155174
state.votingRoundId = end + 1;
@@ -174,12 +193,18 @@ export class CalculatorService {
174193
// await fixRandomNumbersOffersAndCalculateClaims(this.dataManager, state, options, logger);
175194
fixRandomNumbersAndOffers(state, logger);
176195

177-
const feedSelections = getIncrementalCalculationsFeedSelections(rewardEpochDuration.rewardEpochId, state.nextVotingRoundIdWithNoSecureRandom - 1);
196+
const feedSelections = getIncrementalCalculationsFeedSelections(
197+
rewardEpochDuration.rewardEpochId,
198+
state.nextVotingRoundIdWithNoSecureRandom - 1
199+
);
178200
serializeIncrementalCalculationsFeedSelections(feedSelections);
179201

180202
await calculateAndAggregateRemainingClaims(this.dataManager, state, options, logger);
181203

182-
const tempClaimData = getIncrementalCalculationsTempRewards(rewardEpochDuration.rewardEpochId, state.nextVotingRoundForClaimCalculation - 1);
204+
const tempClaimData = getIncrementalCalculationsTempRewards(
205+
rewardEpochDuration.rewardEpochId,
206+
state.nextVotingRoundForClaimCalculation - 1
207+
);
183208
serializeIncrementalCalculationsTempRewards(tempClaimData);
184209

185210
recordProgress(rewardEpochId);
@@ -346,6 +371,7 @@ export class CalculatorService {
346371
return;
347372
}
348373
if (options.incrementalCalculation) {
374+
// eslint-disable-next-line no-constant-condition
349375
while (true) {
350376
// Ends when the rewards for reward epoch are fully processed.
351377
await this.runRewardCalculationIncremental(options);

libs/fsp-rewards/src/reward-calculation/minimal-conditions/minimal-conditions-constants.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
// However, in order to earn passes, the provider must have at least 3M FLR in active self-bond and 15M in active stake.
99
// Providers with 80% total uptime and at least 1M FLR in active self-bond but not meeting both the 3M FLR active self-bond
1010
// and 15M active stake requirements neither earn nor lose passes, and still receive eligible rewards.
11+
//
12+
// FDC: Successful participation in 60% of all voting rounds in that reward epoch.
1113

1214
export const TOTAL_PPM = 1000000n;
1315
export const FTSO_SCALING_AVAILABILITY_THRESHOLD_PPM = 800000n; // 80%
@@ -19,3 +21,4 @@ export const STAKING_MIN_SELF_BOND_GWEI = 1000000000000000n; // 1M FLR
1921
export const STAKING_MIN_DESIRED_SELF_BOND_GWEI = 3000000000000000n; // 3M FLR
2022
export const STAKING_MIN_DESIRED_STAKE_GWEI = 15000000000000000n; // 15M FLR
2123
export const MAX_NUMBER_OF_PASSES = 3; // 3 passes
24+
export const FDC_REWARDED_SHARE_PPM = 600000n; // 60%
Lines changed: 48 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,78 +1,78 @@
1-
import { base58 } from '@scure/base';
1+
import { base58 } from "@scure/base";
22
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
33
import path from "path/posix";
44
import { bigIntReplacer, bigIntReviver } from "../../../../ftso-core/src/utils/big-number-serialization";
55
import { CALCULATIONS_FOLDER, STAKING_DATA_FOLDER } from "../../constants";
6-
import { MINIMAL_CONDITIONS_FILE, PASSES_FILE } from '../../utils/stat-info/constants';
7-
import { DataProviderConditions, DataProviderPasses, ListedProviderList, ValidatorInfo } from "./minimal-conditions-interfaces";
6+
import { MINIMAL_CONDITIONS_FILE, PASSES_FILE } from "../../utils/stat-info/constants";
7+
import {
8+
DataProviderConditions,
9+
DataProviderPasses,
10+
ListedProviderList,
11+
ValidatorInfo,
12+
} from "./minimal-conditions-interfaces";
813

914
/**
10-
* Reads the staking info for a given reward epoch id.
11-
* The data is stored in the staking data folder.
15+
* Reads the staking info for a given reward epoch id.
16+
* The data is stored in the staking data folder.
1217
*/
13-
export function readStakingInfo(
14-
rewardEpochId: number,
15-
stakingDataFolder = STAKING_DATA_FOLDER()
16-
): ValidatorInfo[] {
17-
const fname = path.join(stakingDataFolder, `${rewardEpochId}-nodes-data.json`);
18-
const data = readFileSync(fname, 'utf8');
19-
const result: ValidatorInfo[] = JSON.parse(data, bigIntReviver);
20-
for(let validatorInfo of result) {
21-
// "NodeID-2a7BPY7UeJv2njMuyUHfBSTeQCYZj6bwV"
22-
// Checksum is not validated
23-
validatorInfo.nodeId20Byte = "0x" + Buffer.from(base58.decode(validatorInfo.nodeId.slice(7)).subarray(0, -4)).toString("hex");
24-
}
25-
return result;
18+
export function readStakingInfo(rewardEpochId: number, stakingDataFolder = STAKING_DATA_FOLDER()): ValidatorInfo[] {
19+
const fname = path.join(stakingDataFolder, `${rewardEpochId}-nodes-data.json`);
20+
const data = readFileSync(fname, "utf8");
21+
const result: ValidatorInfo[] = JSON.parse(data, bigIntReviver);
22+
for (const validatorInfo of result) {
23+
// "NodeID-2a7BPY7UeJv2njMuyUHfBSTeQCYZj6bwV"
24+
// Checksum is not validated
25+
validatorInfo.nodeId20Byte =
26+
"0x" + Buffer.from(base58.decode(validatorInfo.nodeId.slice(7)).subarray(0, -4)).toString("hex");
27+
}
28+
return result;
2629
}
2730

2831
/**
2932
* Reads the passes info for a given reward epoch id.
3033
* The data is stored in the passes data folder.
3134
*/
32-
export function readPassesInfo(
33-
rewardEpochId: number,
34-
calculationFolder = CALCULATIONS_FOLDER()
35-
): DataProviderPasses[] {
36-
const fname = path.join(calculationFolder, `${rewardEpochId}`, PASSES_FILE);
37-
if(!existsSync(fname)) {
38-
throw new Error(`Passes file not found: ${fname}`);
39-
}
40-
const data = readFileSync(fname, 'utf8');
41-
return JSON.parse(data) as DataProviderPasses[];
35+
export function readPassesInfo(rewardEpochId: number, calculationFolder = CALCULATIONS_FOLDER()): DataProviderPasses[] {
36+
const fname = path.join(calculationFolder, `${rewardEpochId}`, PASSES_FILE);
37+
if (!existsSync(fname)) {
38+
throw new Error(`Passes file not found: ${fname}`);
39+
}
40+
const data = readFileSync(fname, "utf8");
41+
return JSON.parse(data) as DataProviderPasses[];
4242
}
4343

4444
/**
4545
* Writes the staking info for a given reward epoch id.
4646
*/
4747
export function writePassesInfo(
48-
rewardEpochId: number,
49-
data: DataProviderPasses[],
50-
calculationFolder = CALCULATIONS_FOLDER()
51-
): void {
52-
if (!existsSync(calculationFolder)) {
53-
mkdirSync(calculationFolder, { recursive: true });
54-
}
55-
const fname = path.join(calculationFolder, `${rewardEpochId}`, PASSES_FILE);
56-
writeFileSync(fname, JSON.stringify(data, null, 2));
48+
rewardEpochId: number,
49+
data: DataProviderPasses[],
50+
calculationFolder = CALCULATIONS_FOLDER()
51+
): void {
52+
if (!existsSync(calculationFolder)) {
53+
mkdirSync(calculationFolder, { recursive: true });
54+
}
55+
const fname = path.join(calculationFolder, `${rewardEpochId}`, PASSES_FILE);
56+
writeFileSync(fname, JSON.stringify(data, null, 2));
5757
}
5858

5959
/**
6060
* Writes the staking info for a given reward epoch id.
6161
*/
6262
export function writeDataProviderConditions(
63-
rewardEpochId: number,
64-
data: DataProviderConditions[],
65-
calculationFolder = CALCULATIONS_FOLDER()
63+
rewardEpochId: number,
64+
data: DataProviderConditions[],
65+
calculationFolder = CALCULATIONS_FOLDER()
6666
): void {
67-
if (!existsSync(calculationFolder)) {
68-
mkdirSync(calculationFolder, { recursive: true });
69-
}
70-
const fname = path.join(calculationFolder, `${rewardEpochId}`, MINIMAL_CONDITIONS_FILE);
71-
writeFileSync(fname, JSON.stringify(data, bigIntReplacer, 2));
67+
if (!existsSync(calculationFolder)) {
68+
mkdirSync(calculationFolder, { recursive: true });
69+
}
70+
const fname = path.join(calculationFolder, `${rewardEpochId}`, MINIMAL_CONDITIONS_FILE);
71+
writeFileSync(fname, JSON.stringify(data, bigIntReplacer, 2));
7272
}
7373

7474
export function readListedDataProviders(): ListedProviderList {
75-
const fname = path.join(`listed-data-providers`, `bifrost-wallet.providerlist.json`);
76-
const data = readFileSync(fname, 'utf8');
77-
return JSON.parse(data);
75+
const fname = path.join(`listed-data-providers`, `bifrost-wallet.providerlist.json`);
76+
const data = readFileSync(fname, "utf8");
77+
return JSON.parse(data);
7878
}

0 commit comments

Comments
 (0)