@marinade.finance/scoring 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/dist/computing/cluster.d.ts +10 -0
  2. package/dist/computing/cluster.js +95 -0
  3. package/dist/computing/cluster.js.map +1 -0
  4. package/dist/computing/eligibility.d.ts +19 -0
  5. package/dist/computing/eligibility.js +163 -0
  6. package/dist/computing/eligibility.js.map +1 -0
  7. package/dist/computing/score.d.ts +20 -0
  8. package/dist/computing/score.js +174 -0
  9. package/dist/computing/score.js.map +1 -0
  10. package/dist/computing/stake.d.ts +26 -0
  11. package/dist/computing/stake.js +197 -0
  12. package/dist/computing/stake.js.map +1 -0
  13. package/dist/computing/validators.d.ts +16 -0
  14. package/dist/computing/validators.js +123 -0
  15. package/dist/computing/validators.js.map +1 -0
  16. package/dist/constants/marinade.json +38 -0
  17. package/dist/dto/bonds.dto.d.ts +12 -0
  18. package/dist/dto/bonds.dto.js +3 -0
  19. package/dist/dto/bonds.dto.js.map +1 -0
  20. package/dist/dto/cluster.dto.d.ts +12 -0
  21. package/dist/dto/cluster.dto.js +3 -0
  22. package/dist/dto/cluster.dto.js.map +1 -0
  23. package/{dto/eligibility.dto.ts → dist/dto/eligibility.dto.d.ts} +15 -15
  24. package/dist/dto/eligibility.dto.js +3 -0
  25. package/dist/dto/eligibility.dto.js.map +1 -0
  26. package/dist/dto/jito.dto.d.ts +9 -0
  27. package/dist/dto/jito.dto.js +10 -0
  28. package/dist/dto/jito.dto.js.map +1 -0
  29. package/dist/dto/marinade.dto.d.ts +18 -0
  30. package/dist/dto/marinade.dto.js +3 -0
  31. package/dist/dto/marinade.dto.js.map +1 -0
  32. package/dist/dto/rewards.dto.d.ts +17 -0
  33. package/dist/dto/rewards.dto.js +18 -0
  34. package/dist/dto/rewards.dto.js.map +1 -0
  35. package/dist/dto/scoring.dto.d.ts +101 -0
  36. package/dist/dto/scoring.dto.js +3 -0
  37. package/dist/dto/scoring.dto.js.map +1 -0
  38. package/dist/dto/snapshots.dto.d.ts +15 -0
  39. package/dist/dto/snapshots.dto.js +13 -0
  40. package/dist/dto/snapshots.dto.js.map +1 -0
  41. package/dist/dto/stakes.dto.d.ts +30 -0
  42. package/dist/dto/stakes.dto.js +3 -0
  43. package/dist/dto/stakes.dto.js.map +1 -0
  44. package/dist/dto/validators.dto.d.ts +110 -0
  45. package/dist/dto/validators.dto.js +19 -0
  46. package/dist/dto/validators.dto.js.map +1 -0
  47. package/dist/errors/fetching.d.ts +22 -0
  48. package/dist/errors/fetching.js +30 -0
  49. package/dist/errors/fetching.js.map +1 -0
  50. package/dist/index.d.ts +24 -0
  51. package/dist/index.js +41 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/interfaces/data-provider.interface.d.ts +16 -0
  54. package/dist/interfaces/data-provider.interface.js +3 -0
  55. package/dist/interfaces/data-provider.interface.js.map +1 -0
  56. package/dist/logging/logger.d.ts +3 -0
  57. package/dist/logging/logger.js +72 -0
  58. package/dist/logging/logger.js.map +1 -0
  59. package/dist/providers/api-data.provider.d.ts +30 -0
  60. package/dist/providers/api-data.provider.js +227 -0
  61. package/dist/providers/api-data.provider.js.map +1 -0
  62. package/dist/providers/file-data.provider.d.ts +29 -0
  63. package/dist/providers/file-data.provider.js +96 -0
  64. package/dist/providers/file-data.provider.js.map +1 -0
  65. package/dist/tsconfig.tsbuildinfo +1 -0
  66. package/dist/utils/csv.d.ts +2 -0
  67. package/dist/utils/csv.js +53 -0
  68. package/dist/utils/csv.js.map +1 -0
  69. package/dist/utils/maths.d.ts +8 -0
  70. package/dist/utils/maths.js +56 -0
  71. package/dist/utils/maths.js.map +1 -0
  72. package/dist/utils/solana.d.ts +1 -0
  73. package/dist/utils/solana.js +9 -0
  74. package/dist/utils/solana.js.map +1 -0
  75. package/dist/utils/zip.d.ts +2 -0
  76. package/dist/utils/zip.js +15 -0
  77. package/dist/utils/zip.js.map +1 -0
  78. package/package.json +7 -13
  79. package/computing/cluster.ts +0 -102
  80. package/computing/eligibility.ts +0 -163
  81. package/computing/score.ts +0 -164
  82. package/computing/stake.ts +0 -246
  83. package/computing/validators.ts +0 -133
  84. package/constants/marinade.json +0 -38
  85. package/dto/bonds.dto.ts +0 -12
  86. package/dto/cluster.dto.ts +0 -12
  87. package/dto/jito.dto.ts +0 -9
  88. package/dto/marinade.dto.ts +0 -18
  89. package/dto/rewards.dto.ts +0 -19
  90. package/dto/scoring.dto.ts +0 -103
  91. package/dto/snapshots.dto.ts +0 -16
  92. package/dto/stakes.dto.ts +0 -31
  93. package/dto/validators.dto.ts +0 -110
  94. package/errors/fetching.ts +0 -25
  95. package/interfaces/data-provider.interface.ts +0 -17
  96. package/providers/api-data.provider.ts +0 -261
  97. package/providers/file-data.provider.ts +0 -117
  98. package/utils/csv.ts +0 -30
  99. package/utils/maths.ts +0 -75
  100. package/utils/solana.ts +0 -9
  101. package/utils/zip.ts +0 -12
@@ -0,0 +1,197 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.computeValidatorsStakes = exports.computeStakesForValidators = exports.initStakes = exports.filterEligibleValidators = exports.processVotesAndCalculateTVLs = exports.removeFromVotes = void 0;
4
+ const expr_eval_1 = require("expr-eval");
5
+ const maths_1 = require("../utils/maths");
6
+ const logger_1 = require("../logging/logger");
7
+ function removeFromVotes(votes, toRemove) {
8
+ const votesCopy = { ...votes };
9
+ delete votesCopy[toRemove];
10
+ return votesCopy;
11
+ }
12
+ exports.removeFromVotes = removeFromVotes;
13
+ function processVotesAndCalculateTVLs(mSolVotes, veMndeVotes, stakesConfig, scoringConfig) {
14
+ const updatedVeMndeVotes = removeFromVotes({ ...veMndeVotes }, scoringConfig.DS_PUBKEY);
15
+ const veMndeVotesForDS = veMndeVotes[scoringConfig.DS_PUBKEY] ?? 0;
16
+ const totalVeMndeVotes = (0, maths_1.sum)(Object.values(veMndeVotes));
17
+ const veMndeTvl = Math.round(totalVeMndeVotes > 0
18
+ ? (1 - veMndeVotesForDS / totalVeMndeVotes) * stakesConfig.veMndeControl * stakesConfig.tvl
19
+ : 0);
20
+ const updatedMSolVotes = removeFromVotes({ ...mSolVotes }, scoringConfig.DS_PUBKEY);
21
+ const mSolVotesForDS = mSolVotes[scoringConfig.DS_PUBKEY] ?? 0;
22
+ const totalMSolVotes = (0, maths_1.sum)(Object.values(mSolVotes));
23
+ const mSolTvl = Math.round(totalMSolVotes > 0
24
+ ? (1 - mSolVotesForDS / totalMSolVotes) * stakesConfig.mSolControl * stakesConfig.tvl
25
+ : 0);
26
+ return {
27
+ updatedMSolVotes,
28
+ updatedVeMndeVotes,
29
+ mSolTvl,
30
+ veMndeTvl,
31
+ totalTvl: stakesConfig.tvl
32
+ };
33
+ }
34
+ exports.processVotesAndCalculateTVLs = processVotesAndCalculateTVLs;
35
+ function filterEligibleValidators(aggregatedValidators, eligibilities) {
36
+ return Object.keys(aggregatedValidators).filter(voteAccount => eligibilities[voteAccount]?.basicEligibility);
37
+ }
38
+ exports.filterEligibleValidators = filterEligibleValidators;
39
+ function initStakes(eligibleValidators) {
40
+ const result = {};
41
+ for (const voteAccount of eligibleValidators) {
42
+ result[voteAccount] = {
43
+ algoStake: 0,
44
+ mSolStake: 0,
45
+ veMndeStake: 0,
46
+ totalStake: 0,
47
+ algoStakeFromOverflow: 0,
48
+ mSolStakeFromOverflow: 0,
49
+ veMndeStakeFromOverflow: 0,
50
+ totalStakeFromOverlfow: 0,
51
+ };
52
+ }
53
+ return result;
54
+ }
55
+ exports.initStakes = initStakes;
56
+ function computeStakesForValidators(params) {
57
+ let updatedTotalMSolVotes = params.totalMsolVotes;
58
+ let updatedTotalVeMndeVotes = params.totalVeMndeVotes;
59
+ let algoStakeDistributed = 0;
60
+ let mSolStakeDistributed = 0;
61
+ let veMndeStakeDistributed = 0;
62
+ const stakes = initStakes(params.eligibleValidators);
63
+ let round = 1;
64
+ while (round <= 100 && (params.mSolTvl - mSolStakeDistributed > 1 || params.veMndeTvl - veMndeStakeDistributed > 1)) {
65
+ let someStakeIncreased = false;
66
+ const mSolStakeDistributedBeforeRound = mSolStakeDistributed;
67
+ const veMndeStakeDistributedBeforeRound = veMndeStakeDistributed;
68
+ for (const voteAccount of params.eligibleValidators) {
69
+ if (!stakes[voteAccount] || !params.scores[voteAccount] || !params.eligibilities[voteAccount]) {
70
+ continue;
71
+ }
72
+ let blocks = 0;
73
+ if (round === 1) {
74
+ if (params.eligibilities[voteAccount].bonusEligibility) {
75
+ blocks += params.stakesConfig.stakeBlocksFromBonus;
76
+ }
77
+ blocks += expr_eval_1.Parser.evaluate(params.stakesConfig.formulaStakeBlocksFromScore, { ...params.stakingVariables, score: params.scores[voteAccount].score });
78
+ }
79
+ const algoStake = Math.round(Math.min(params.blockSize * blocks, Math.max(params.algoTvl - algoStakeDistributed, 0)));
80
+ const mSolStake = updatedTotalMSolVotes > 0 ? Math.round((params.mSolVotes[voteAccount] ?? 0) / updatedTotalMSolVotes * Math.max(params.mSolTvl - mSolStakeDistributedBeforeRound, 0)) : 0;
81
+ const veMndeStake = updatedTotalVeMndeVotes > 0 ? Math.round((params.veMndeVotes[voteAccount] ?? 0) / updatedTotalVeMndeVotes * Math.max(params.veMndeTvl - veMndeStakeDistributedBeforeRound, 0)) : 0;
82
+ const stake = algoStake + veMndeStake + mSolStake;
83
+ if (!stake) {
84
+ continue;
85
+ }
86
+ const cappedStake = Math.min(params.eligibilities[voteAccount].capFromBond - stakes[voteAccount].totalStake, params.eligibilities[voteAccount].capFromExternalStake - stakes[voteAccount].totalStake, stake);
87
+ const stakeOverflow = stake - cappedStake;
88
+ const algoStakeOverflow = Math.round(algoStake / stake * stakeOverflow);
89
+ const mSolStakeOverflow = Math.round(mSolStake / stake * stakeOverflow);
90
+ const veMndeStakeOverflow = Math.round(veMndeStake / stake * stakeOverflow);
91
+ const cappedAlgoStake = algoStake - algoStakeOverflow;
92
+ const cappedMSolStake = mSolStake - mSolStakeOverflow;
93
+ const cappedVeMndeStake = veMndeStake - veMndeStakeOverflow;
94
+ if (cappedAlgoStake + cappedMSolStake + cappedVeMndeStake > 0) {
95
+ someStakeIncreased = true;
96
+ }
97
+ algoStakeDistributed += cappedAlgoStake;
98
+ mSolStakeDistributed += cappedMSolStake;
99
+ veMndeStakeDistributed += cappedVeMndeStake;
100
+ stakes[voteAccount].algoStake += cappedAlgoStake;
101
+ stakes[voteAccount].mSolStake += cappedMSolStake;
102
+ stakes[voteAccount].veMndeStake += cappedVeMndeStake;
103
+ stakes[voteAccount].totalStake += cappedAlgoStake + cappedMSolStake + cappedVeMndeStake;
104
+ if (round > 1) {
105
+ stakes[voteAccount].algoStakeFromOverflow += cappedAlgoStake;
106
+ stakes[voteAccount].mSolStakeFromOverflow += cappedMSolStake;
107
+ stakes[voteAccount].veMndeStakeFromOverflow += cappedVeMndeStake;
108
+ stakes[voteAccount].totalStakeFromOverlfow += cappedAlgoStake + cappedMSolStake + cappedVeMndeStake;
109
+ }
110
+ }
111
+ round++;
112
+ if (!someStakeIncreased) {
113
+ break;
114
+ }
115
+ for (const voteAccount of params.eligibleValidators) {
116
+ if (Math.round(stakes[voteAccount].totalStake) === Math.round(params.eligibilities[voteAccount].capFromExternalStake)) {
117
+ params.veMndeVotes = removeFromVotes(params.veMndeVotes, voteAccount);
118
+ params.mSolVotes = removeFromVotes(params.mSolVotes, voteAccount);
119
+ }
120
+ }
121
+ updatedTotalVeMndeVotes = (0, maths_1.sum)(Object.values(params.veMndeVotes));
122
+ updatedTotalMSolVotes = (0, maths_1.sum)(Object.values(params.mSolVotes));
123
+ }
124
+ const remainingAlgoTvl = Math.max(params.algoTvl - algoStakeDistributed, 0);
125
+ const remainingMSolTvl = Math.max(params.mSolTvl - mSolStakeDistributed, 0);
126
+ const remainingVeMndeTvl = Math.max(params.veMndeTvl - veMndeStakeDistributed, 0);
127
+ for (const voteAccount of params.eligibleValidators) {
128
+ if (!stakes[voteAccount]) {
129
+ continue;
130
+ }
131
+ if (algoStakeDistributed) {
132
+ const extraStake = Math.round((stakes[voteAccount]?.algoStake ?? 0) / algoStakeDistributed * remainingAlgoTvl);
133
+ stakes[voteAccount].totalStake += extraStake;
134
+ stakes[voteAccount].algoStake += extraStake;
135
+ stakes[voteAccount].algoStakeFromOverflow += extraStake;
136
+ }
137
+ if (mSolStakeDistributed) {
138
+ const extraStake = Math.round((stakes[voteAccount]?.algoStake ?? 0) / mSolStakeDistributed * remainingMSolTvl);
139
+ stakes[voteAccount].totalStake += extraStake;
140
+ stakes[voteAccount].mSolStake += extraStake;
141
+ stakes[voteAccount].mSolStakeFromOverflow += extraStake;
142
+ }
143
+ if (veMndeStakeDistributed) {
144
+ const extraStake = Math.round((stakes[voteAccount]?.algoStake ?? 0) / veMndeStakeDistributed * remainingVeMndeTvl);
145
+ stakes[voteAccount].totalStake += extraStake;
146
+ stakes[voteAccount].veMndeStake += extraStake;
147
+ stakes[voteAccount].veMndeStakeFromOverflow += extraStake;
148
+ }
149
+ }
150
+ return stakes;
151
+ }
152
+ exports.computeStakesForValidators = computeStakesForValidators;
153
+ function computeValidatorsStakes(aggregatedValidators, scores, eligibilities, stakesConfig, scoringConfig, mSolVotes, veMndeVotes) {
154
+ let updatedMSolVotes = { ...mSolVotes };
155
+ let updatedVeMndeVotes = { ...veMndeVotes };
156
+ const processedVotesAndTvls = processVotesAndCalculateTVLs(updatedMSolVotes, updatedVeMndeVotes, stakesConfig, scoringConfig);
157
+ updatedMSolVotes = processedVotesAndTvls.updatedMSolVotes;
158
+ updatedVeMndeVotes = processedVotesAndTvls.updatedVeMndeVotes;
159
+ const algoTvl = stakesConfig.tvl - processedVotesAndTvls.mSolTvl - processedVotesAndTvls.veMndeTvl;
160
+ try {
161
+ const eligibleValidators = filterEligibleValidators(aggregatedValidators, eligibilities);
162
+ const stakingVariables = { tvl: algoTvl };
163
+ const blockSize = expr_eval_1.Parser.evaluate(stakesConfig.formulaStakeBlockSize, stakingVariables);
164
+ Object.keys(aggregatedValidators).filter((v) => !eligibilities[v]?.basicEligibility).forEach((voteAccount) => {
165
+ updatedVeMndeVotes = removeFromVotes(updatedVeMndeVotes, voteAccount);
166
+ updatedMSolVotes = removeFromVotes(updatedMSolVotes, voteAccount);
167
+ });
168
+ const updatedTotalVeMndeVotes = (0, maths_1.sum)(Object.values(updatedVeMndeVotes));
169
+ const updatedTotalMSolVotes = (0, maths_1.sum)(Object.values(updatedMSolVotes));
170
+ eligibleValidators.sort((a, b) => {
171
+ const scoreA = scores[a]?.score ?? 0;
172
+ const scoreB = scores[b]?.score ?? 0;
173
+ return scoreB - scoreA;
174
+ });
175
+ return computeStakesForValidators({
176
+ stakingVariables: stakingVariables,
177
+ eligibleValidators: eligibleValidators,
178
+ scores: scores,
179
+ eligibilities: eligibilities,
180
+ stakesConfig: stakesConfig,
181
+ mSolVotes: updatedMSolVotes,
182
+ veMndeVotes: updatedVeMndeVotes,
183
+ totalMsolVotes: updatedTotalMSolVotes,
184
+ totalVeMndeVotes: updatedTotalVeMndeVotes,
185
+ mSolTvl: processedVotesAndTvls.mSolTvl,
186
+ veMndeTvl: processedVotesAndTvls.veMndeTvl,
187
+ algoTvl: algoTvl,
188
+ blockSize: blockSize
189
+ });
190
+ }
191
+ catch (err) {
192
+ (0, logger_1.error)("Computing validators stakes failed.", err);
193
+ throw err;
194
+ }
195
+ }
196
+ exports.computeValidatorsStakes = computeValidatorsStakes;
197
+ //# sourceMappingURL=stake.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stake.js","sourceRoot":"","sources":["../../src/computing/stake.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { AggregatedValidator, AggregatedValidators, ValidatorDto } from '../dto/validators.dto';
2
+ import { JitoValidatorDto } from '../dto/jito.dto';
3
+ import { ClusterInfo } from '../dto/cluster.dto';
4
+ import { IDataProvider } from '../interfaces/data-provider.interface';
5
+ export declare function aggregateValidatorData(validator: ValidatorDto, mevRecord: JitoValidatorDto, blacklist: Set<string>, firstEpoch: number, lastEpoch: number): AggregatedValidator;
6
+ export declare function aggregateValidatorsData(validators: ValidatorDto[], basicEligibilityEpochs: number, bonusEligibilityExtraEpochs: number, dataProvider: IDataProvider): Promise<AggregatedValidators>;
7
+ export declare function getMaxEpoch(validators: ValidatorDto[]): number;
8
+ export declare function selectExternalStakeMin(validator: AggregatedValidator, fullEpochs: number): number;
9
+ export declare function selectCreditsPctMean(validator: AggregatedValidator, clusterInfo: ClusterInfo, fullEpochs: number): number;
10
+ export declare function selectBlockProductionMean(validator: AggregatedValidator, fullEpochs: number): number;
11
+ export declare function selectCommissionInflationMax(validator: AggregatedValidator, epochs: number): number;
12
+ export declare function selectCommissionMEV(validator: AggregatedValidator): number;
13
+ export declare function selectCountryStakeConcentration(validator: AggregatedValidator, clusterInfo: ClusterInfo): number;
14
+ export declare function selectCityStakeConcentration(validator: AggregatedValidator, clusterInfo: ClusterInfo): number;
15
+ export declare function selectASOStakeConcentration(validator: AggregatedValidator, clusterInfo: ClusterInfo): number;
16
+ export declare function selectNodeStake(validator: AggregatedValidator): number;
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.selectNodeStake = exports.selectASOStakeConcentration = exports.selectCityStakeConcentration = exports.selectCountryStakeConcentration = exports.selectCommissionMEV = exports.selectCommissionInflationMax = exports.selectBlockProductionMean = exports.selectCreditsPctMean = exports.selectExternalStakeMin = exports.getMaxEpoch = exports.aggregateValidatorsData = exports.aggregateValidatorData = void 0;
4
+ const maths_1 = require("../utils/maths");
5
+ function aggregateValidatorData(validator, mevRecord, blacklist, firstEpoch, lastEpoch) {
6
+ const currentMarinadeStake = Number(validator.epochStats[lastEpoch]?.marinade_native_stake || 0) / 1e9 + Number(validator.epochStats[lastEpoch]?.marinade_stake || 0) / 1e9;
7
+ const voteAccount = validator.vote_account;
8
+ const name = validator.info_name || 'Unknown';
9
+ const epochs = [];
10
+ const commission = [];
11
+ const stake = [];
12
+ const externalStake = [];
13
+ const credits = [];
14
+ const blocksProduced = [];
15
+ const leaderSlots = [];
16
+ const dataAvailable = [];
17
+ const currentStake = Number(validator.epochStats[lastEpoch]?.activated_stake || 0) / 1e9;
18
+ const blacklisted = blacklist.has(voteAccount);
19
+ for (let epoch = lastEpoch; epoch >= firstEpoch; epoch--) {
20
+ const epochStat = validator.epochStats?.[epoch];
21
+ epochs.push(epoch);
22
+ commission.push(epochStat?.commission_max_observed || epochStat?.commission_advertised || 0);
23
+ stake.push(Number(epochStat?.activated_stake || 0) / 1e9);
24
+ externalStake.push(Number(epochStat?.activated_stake || 0) / 1e9 - Number(epochStat?.marinade_stake || 0) / 1e9 - Number(epochStat?.marinade_native_stake || 0) / 1e9);
25
+ credits.push(epochStat?.credits || 0);
26
+ blocksProduced.push(epochStat?.blocks_produced || 0);
27
+ leaderSlots.push(epochStat?.leader_slots || 0);
28
+ dataAvailable.push(!!epochStat);
29
+ }
30
+ const mevCommission = mevRecord?.running_jito ? mevRecord.mev_commission_bps / 100 : 100;
31
+ return {
32
+ voteAccount,
33
+ name,
34
+ epochs,
35
+ currentMarinadeStake,
36
+ currentStake,
37
+ commission,
38
+ stake,
39
+ externalStake,
40
+ credits,
41
+ blocksProduced,
42
+ leaderSlots,
43
+ dataAvailable,
44
+ mevCommission,
45
+ country: validator.dc_country || 'Unknown',
46
+ city: validator.dc_full_city || 'Unknown',
47
+ aso: validator.dc_aso || 'Unknown',
48
+ blacklisted,
49
+ version: validator.version
50
+ };
51
+ }
52
+ exports.aggregateValidatorData = aggregateValidatorData;
53
+ async function aggregateValidatorsData(validators, basicEligibilityEpochs, bonusEligibilityExtraEpochs, dataProvider) {
54
+ const lastEpoch = getMaxEpoch(validators);
55
+ const firstEpoch = lastEpoch - basicEligibilityEpochs - bonusEligibilityExtraEpochs;
56
+ const jitoMevRecords = await dataProvider.fetchValidatorsJitoMEV(true);
57
+ const blacklist = await dataProvider.fetchBlacklist(true);
58
+ const result = {};
59
+ for (const validator of validators) {
60
+ const mevRecord = jitoMevRecords[validator.vote_account] ?? {
61
+ vote_account: validator.vote_account,
62
+ mev_commission_bps: 100,
63
+ running_jito: false,
64
+ active_stake: Number(validator.activated_stake)
65
+ };
66
+ if (mevRecord) {
67
+ const aggregatedData = aggregateValidatorData(validator, mevRecord, blacklist, firstEpoch, lastEpoch);
68
+ result[validator.vote_account] = aggregatedData;
69
+ }
70
+ }
71
+ return result;
72
+ }
73
+ exports.aggregateValidatorsData = aggregateValidatorsData;
74
+ function getMaxEpoch(validators) {
75
+ return validators.reduce((maxEpoch, validator) => {
76
+ const validatorMaxEpoch = validator.epoch_stats.reduce((max, { epoch }) => {
77
+ return Math.max(epoch, max);
78
+ }, 0);
79
+ return Math.max(maxEpoch, validatorMaxEpoch);
80
+ }, 0);
81
+ }
82
+ exports.getMaxEpoch = getMaxEpoch;
83
+ function selectExternalStakeMin(validator, fullEpochs) {
84
+ if (validator.externalStake.length === 0) {
85
+ throw new Error('Validator has no external stake data.');
86
+ }
87
+ return Math.min(...validator.externalStake.slice(0, fullEpochs + 1));
88
+ }
89
+ exports.selectExternalStakeMin = selectExternalStakeMin;
90
+ function selectCreditsPctMean(validator, clusterInfo, fullEpochs) {
91
+ return (0, maths_1.mean)(validator.epochs.slice(1, fullEpochs + 1).map((epoch, fullEpochIndex) => (validator.credits[fullEpochIndex + 1] ?? 0) / (clusterInfo.targetCreditsByEpoch.get(epoch) ?? 1)));
92
+ }
93
+ exports.selectCreditsPctMean = selectCreditsPctMean;
94
+ function selectBlockProductionMean(validator, fullEpochs) {
95
+ const leaderSlots = (0, maths_1.sum)(validator.leaderSlots.slice(1, fullEpochs + 1));
96
+ return leaderSlots === 0 ? 1 : (0, maths_1.sum)(validator.blocksProduced.slice(1, fullEpochs + 1)) / leaderSlots;
97
+ }
98
+ exports.selectBlockProductionMean = selectBlockProductionMean;
99
+ function selectCommissionInflationMax(validator, epochs) {
100
+ return Math.max(...validator.commission.slice(0, epochs));
101
+ }
102
+ exports.selectCommissionInflationMax = selectCommissionInflationMax;
103
+ function selectCommissionMEV(validator) {
104
+ return validator.mevCommission;
105
+ }
106
+ exports.selectCommissionMEV = selectCommissionMEV;
107
+ function selectCountryStakeConcentration(validator, clusterInfo) {
108
+ return clusterInfo.country.get(validator.country ?? '???') ?? 0;
109
+ }
110
+ exports.selectCountryStakeConcentration = selectCountryStakeConcentration;
111
+ function selectCityStakeConcentration(validator, clusterInfo) {
112
+ return clusterInfo.city.get(validator.city ?? '???') ?? 0;
113
+ }
114
+ exports.selectCityStakeConcentration = selectCityStakeConcentration;
115
+ function selectASOStakeConcentration(validator, clusterInfo) {
116
+ return clusterInfo.aso.get(validator.aso ?? '???') ?? 0;
117
+ }
118
+ exports.selectASOStakeConcentration = selectASOStakeConcentration;
119
+ function selectNodeStake(validator) {
120
+ return validator.stake[0] ?? 0;
121
+ }
122
+ exports.selectNodeStake = selectNodeStake;
123
+ //# sourceMappingURL=validators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/computing/validators.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ {
2
+ "DS_PUBKEY": "MarinadeA1gorithmicDe1egationStrategy111111",
3
+ "REWARDS_PAST_EPOCHS": 14,
4
+ "CAP_FROM_BOND": 1000000000,
5
+ "formulaStakeBlockSize": "tvl / ((6000000 / 30000) * 1.5 ^ (log(tvl / 6000000) / log(2)))",
6
+ "formulaStakeBlocksFromScore": "1 + ((max(0.94, score) - 0.94) / (1 - 0.94)) ^ 10",
7
+ "formulaVoteCredits": "min(credits_pct_mean ^ 10, 1)",
8
+ "formulaBlockProduction": "piecewise((bp_mean - bp_cluster_mean) / bp_cluster_std_dev < -1, bp_mean / (bp_cluster_mean - bp_cluster_std_dev), 1)",
9
+ "formulaInflationCommission": "piecewise(commission_inflation_max <= 10, (100 - commission_inflation_max) / 100, 0)",
10
+ "formulaMEVCommission": "(100 - commission_mev) / 100",
11
+ "formulaStakeConcentrationCountry": "piecewise(country_stake_concentration_last < 1/3, (1 - (3 * country_stake_concentration_last)) ^ (1/3), 0)",
12
+ "formulaStakeConcentrationCity": "piecewise(city_stake_concentration_last < 1/3, (1 - (3 * city_stake_concentration_last)) ^ (1/3), 0)",
13
+ "formulaStakeConcentrationASO": "piecewise(aso_stake_concentration_last < 1/3, (1 - (3 * aso_stake_concentration_last)) ^ (1/3), 0)",
14
+ "formulaStakeConcentrationNode": "piecewise(node_stake_last < 100000, 1, node_stake_last < 4000000, 1 - (node_stake_last - 100000) / (4000000 - 100000), 0)",
15
+ "weightTargetSumOfRewards": 5,
16
+ "weightMevHeuristic": 0.1,
17
+ "weightVoteCredits": 10,
18
+ "weightBlockProduction": 5,
19
+ "weightInflationCommission": 4.9,
20
+ "weightMEVCommission": 0.1,
21
+ "weightStakeConcentrationCountry": 2,
22
+ "weightStakeConcentrationCity": 3,
23
+ "weightStakeConcentrationASO": 4,
24
+ "weightStakeConcentrationNode": 2,
25
+ "basicEligibilityEpochs": 14,
26
+ "bonusEligibilityExtraEpochs": 0,
27
+ "maxCommission": 7,
28
+ "voteCreditsWarning": 0,
29
+ "voteCreditsLow": 80,
30
+ "minExternalStake": 0,
31
+ "minScore": 0.8,
32
+ "maxStakeShare": 0.8,
33
+ "maxWarnings": 1,
34
+ "mSolControl": 0.2,
35
+ "veMndeControl": 0.2,
36
+ "stakeBlocksFromBonus": 0,
37
+ "concentrationParams": [4, 5, 6, 7]
38
+ }
@@ -0,0 +1,12 @@
1
+ export type BondDto = {
2
+ pubkey: string;
3
+ vote_account: string;
4
+ authority: string;
5
+ cpmpe: number;
6
+ updated_at: string;
7
+ epoch: number;
8
+ };
9
+ export type BondsDto = {
10
+ bonds: BondDto[];
11
+ };
12
+ export type Bonds = Record<string, number>;
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=bonds.dto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bonds.dto.js","sourceRoot":"","sources":["../../src/dto/bonds.dto.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ export type ClusterInfo = {
2
+ city: Map<string, number>;
3
+ country: Map<string, number>;
4
+ aso: Map<string, number>;
5
+ targetCreditsByEpoch: Map<number, number>;
6
+ meanBlockProductionOverBasicEligibilityPeriod: number;
7
+ stdDevBlockProductionOverBasicEligibilityPeriod: number;
8
+ };
9
+ export type BlockProductionResult = {
10
+ mean: number;
11
+ stdDev: number;
12
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=cluster.dto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cluster.dto.js","sourceRoot":"","sources":["../../src/dto/cluster.dto.ts"],"names":[],"mappings":""}
@@ -8,31 +8,31 @@ export type EligibilityConfig = {
8
8
  minScore: number;
9
9
  maxStakeShare: number;
10
10
  maxWarnings: number;
11
- }
11
+ };
12
12
  export type ValidatorEligibility = {
13
13
  basicEligibility: boolean;
14
14
  bonusEligibility: boolean;
15
15
  issuesCollection: Issue[][];
16
16
  capFromBond: number;
17
17
  capFromExternalStake: number;
18
- }
18
+ };
19
19
  export type EvaluationResult = {
20
20
  criticals: number;
21
21
  warnings: number;
22
- }
22
+ };
23
23
  export type Issue = {
24
24
  type: IssueType;
25
25
  message: string;
26
+ };
27
+ export declare const enum IssueType {
28
+ NO_DATA = "NO_DATA",
29
+ NO_BOND = "NO_BOND",
30
+ SCORE = "SCORE",
31
+ BLACKLIST = "BLACKLIST",
32
+ COMMISSION = "COMMISSION",
33
+ EXTERNAL_STAKE = "EXTERNAL_STAKE",
34
+ CENTRALIZATION = "CENTRALIZATION",
35
+ VOTE_CREDITS_LOW = "VOTE_CREDITS_LOW",
36
+ VOTE_CREDITS_WARNING = "VOTE_CREDITS_WARNING"
26
37
  }
27
- export const enum IssueType {
28
- NO_DATA = 'NO_DATA',
29
- NO_BOND = 'NO_BOND',
30
- SCORE = 'SCORE',
31
- BLACKLIST = 'BLACKLIST',
32
- COMMISSION = 'COMMISSION',
33
- EXTERNAL_STAKE = 'EXTERNAL_STAKE',
34
- CENTRALIZATION = 'CENTRALIZATION',
35
- VOTE_CREDITS_LOW = 'VOTE_CREDITS_LOW',
36
- VOTE_CREDITS_WARNING = 'VOTE_CREDITS_WARNING',
37
- }
38
- export type ValidatorsEligibilities = Record<string, ValidatorEligibility>
38
+ export type ValidatorsEligibilities = Record<string, ValidatorEligibility>;
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=eligibility.dto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eligibility.dto.js","sourceRoot":"","sources":["../../src/dto/eligibility.dto.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ export declare class JitoValidatorDto {
2
+ vote_account: string;
3
+ mev_commission_bps: number;
4
+ running_jito: boolean;
5
+ active_stake: number;
6
+ }
7
+ export declare class JitoValidatorsResponseDto {
8
+ validators: JitoValidatorDto[];
9
+ }
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.JitoValidatorsResponseDto = exports.JitoValidatorDto = void 0;
4
+ class JitoValidatorDto {
5
+ }
6
+ exports.JitoValidatorDto = JitoValidatorDto;
7
+ class JitoValidatorsResponseDto {
8
+ }
9
+ exports.JitoValidatorsResponseDto = JitoValidatorsResponseDto;
10
+ //# sourceMappingURL=jito.dto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jito.dto.js","sourceRoot":"","sources":["../../src/dto/jito.dto.ts"],"names":[],"mappings":";;;AAAA,MAAa,gBAAgB;CAK5B;AALD,4CAKC;AACD,MAAa,yBAAyB;CAErC;AAFD,8DAEC"}
@@ -0,0 +1,18 @@
1
+ export type TvlStats = {
2
+ staked_sol: number;
3
+ staked_usd: number;
4
+ msol_directed_stake_sol: number;
5
+ msol_directed_stake_msol: number;
6
+ liquidity_sol: number;
7
+ liquidity_usd: number;
8
+ total_sol: number;
9
+ total_usd: number;
10
+ self_staked_sol: number;
11
+ self_staked_usd: number;
12
+ standard_staked_sol: number;
13
+ standard_staked_usd: number;
14
+ total_virtual_staked_sol: number;
15
+ total_virtual_staked_usd: number;
16
+ marinade_native_stake_sol: number;
17
+ marinade_native_stake_usd: number;
18
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=marinade.dto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marinade.dto.js","sourceRoot":"","sources":["../../src/dto/marinade.dto.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ export declare class RewardPairDto {
2
+ epoch: number;
3
+ amount: number;
4
+ constructor(pair: [number, number]);
5
+ }
6
+ export declare class RewardsResponseDto {
7
+ rewards_mev: RewardPairDto[];
8
+ rewards_inflation_est: RewardPairDto[];
9
+ constructor(data: {
10
+ rewards_mev: [number, number][];
11
+ rewards_inflation_est: [number, number][];
12
+ });
13
+ }
14
+ export type Rewards = {
15
+ inflation: number;
16
+ mev: number;
17
+ };
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RewardsResponseDto = exports.RewardPairDto = void 0;
4
+ class RewardPairDto {
5
+ constructor(pair) {
6
+ this.epoch = pair[0];
7
+ this.amount = pair[1];
8
+ }
9
+ }
10
+ exports.RewardPairDto = RewardPairDto;
11
+ class RewardsResponseDto {
12
+ constructor(data) {
13
+ this.rewards_mev = data.rewards_mev.map(pair => new RewardPairDto(pair));
14
+ this.rewards_inflation_est = data.rewards_inflation_est.map(pair => new RewardPairDto(pair));
15
+ }
16
+ }
17
+ exports.RewardsResponseDto = RewardsResponseDto;
18
+ //# sourceMappingURL=rewards.dto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewards.dto.js","sourceRoot":"","sources":["../../src/dto/rewards.dto.ts"],"names":[],"mappings":";;;AAAA,MAAa,aAAa;IAIxB,YAAa,IAAsB;QACjC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;CACF;AARD,sCAQC;AACD,MAAa,kBAAkB;IAI7B,YAAa,IAAoF;QAC/F,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QACzE,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/F,CAAC;CACF;AARD,gDAQC"}