@marinade.finance/scoring 1.0.1 → 1.0.3

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 +166 -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 +16 -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 +52 -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
@@ -1,246 +0,0 @@
1
- import { ValidatorsEligibilities } from '../dto/eligibility.dto';
2
- import { Scores, ScoringConfig } from '../dto/scoring.dto';
3
- import { Votes } from '../dto/snapshots.dto';
4
- import { ProcessedVotesAndTVLs, Stakes, StakesConfig, StakingVariables } from '../dto/stakes.dto';
5
- import { AggregatedValidators } from '../dto/validators.dto';
6
- import { Parser } from 'expr-eval';
7
- import { sum } from '../utils/maths';
8
- import { error } from 'logger';
9
-
10
- export interface ComputeStakesForValidatorsParams {
11
- stakingVariables: StakingVariables;
12
- eligibleValidators: string[];
13
- scores: Scores;
14
- eligibilities: ValidatorsEligibilities;
15
- stakesConfig: StakesConfig;
16
- mSolVotes: Votes;
17
- veMndeVotes: Votes;
18
- totalMsolVotes: number;
19
- totalVeMndeVotes: number;
20
- mSolTvl: number;
21
- veMndeTvl: number;
22
- algoTvl: number;
23
- blockSize: number;
24
- }
25
- export function removeFromVotes(votes: Votes, toRemove: string): Votes {
26
- const votesCopy = { ...votes };
27
- delete votesCopy[toRemove];
28
- return votesCopy;
29
- }
30
- export function processVotesAndCalculateTVLs(
31
- mSolVotes: Votes,
32
- veMndeVotes: Votes,
33
- stakesConfig: StakesConfig,
34
- scoringConfig: ScoringConfig
35
- ): ProcessedVotesAndTVLs {
36
- const updatedVeMndeVotes = removeFromVotes({ ...veMndeVotes }, scoringConfig.DS_PUBKEY);
37
- const veMndeVotesForDS = veMndeVotes[scoringConfig.DS_PUBKEY] ?? 0;
38
- const totalVeMndeVotes = sum(Object.values(veMndeVotes));
39
- const veMndeTvl = Math.round(
40
- totalVeMndeVotes > 0
41
- ? (1 - veMndeVotesForDS / totalVeMndeVotes) * stakesConfig.veMndeControl * stakesConfig.tvl
42
- : 0
43
- );
44
-
45
- const updatedMSolVotes = removeFromVotes({ ...mSolVotes }, scoringConfig.DS_PUBKEY);
46
- const mSolVotesForDS = mSolVotes[scoringConfig.DS_PUBKEY] ?? 0;
47
- const totalMSolVotes = sum(Object.values(mSolVotes));
48
- const mSolTvl = Math.round(
49
- totalMSolVotes > 0
50
- ? (1 - mSolVotesForDS / totalMSolVotes) * stakesConfig.mSolControl * stakesConfig.tvl
51
- : 0
52
- );
53
-
54
- return {
55
- updatedMSolVotes,
56
- updatedVeMndeVotes,
57
- mSolTvl,
58
- veMndeTvl,
59
- totalTvl: stakesConfig.tvl
60
- };
61
- }
62
- export function filterEligibleValidators(aggregatedValidators: AggregatedValidators, eligibilities: ValidatorsEligibilities): string[] {
63
- return Object.keys(aggregatedValidators).filter(voteAccount => eligibilities[voteAccount]?.basicEligibility);
64
- }
65
- export function initStakes(eligibleValidators: string[]): Stakes {
66
- const result: Stakes = {};
67
- for (const voteAccount of eligibleValidators) {
68
- result[voteAccount] = {
69
- algoStake: 0,
70
- mSolStake: 0,
71
- veMndeStake: 0,
72
- totalStake: 0,
73
- algoStakeFromOverflow: 0,
74
- mSolStakeFromOverflow: 0,
75
- veMndeStakeFromOverflow: 0,
76
- totalStakeFromOverlfow: 0,
77
- };
78
- }
79
- return result;
80
- }
81
- export function computeStakesForValidators(
82
- params: ComputeStakesForValidatorsParams
83
- ): Stakes {
84
- let updatedTotalMSolVotes = params.totalMsolVotes;
85
- let updatedTotalVeMndeVotes = params.totalVeMndeVotes;
86
- let algoStakeDistributed = 0;
87
- let mSolStakeDistributed = 0;
88
- let veMndeStakeDistributed = 0;
89
- const stakes = initStakes(params.eligibleValidators);
90
-
91
- let round = 1;
92
- while (round <= 100 && (params.mSolTvl - mSolStakeDistributed > 1 || params.veMndeTvl - veMndeStakeDistributed > 1)) {
93
- let someStakeIncreased = false;
94
- const mSolStakeDistributedBeforeRound = mSolStakeDistributed;
95
- const veMndeStakeDistributedBeforeRound = veMndeStakeDistributed;
96
- for (const voteAccount of params.eligibleValidators) {
97
- if (!stakes[voteAccount] || !params.scores[voteAccount] || !params.eligibilities[voteAccount]) {
98
- continue;
99
- }
100
-
101
- let blocks = 0;
102
-
103
- if (round === 1) {
104
- if (params.eligibilities[voteAccount]!.bonusEligibility) {
105
- blocks += params.stakesConfig.stakeBlocksFromBonus;
106
- }
107
-
108
- blocks += Parser.evaluate(params.stakesConfig.formulaStakeBlocksFromScore, { ...params.stakingVariables, score: params.scores[voteAccount]!.score });
109
- }
110
-
111
- const algoStake = Math.round(Math.min(params.blockSize * blocks, Math.max(params.algoTvl - algoStakeDistributed, 0)));
112
- const mSolStake = updatedTotalMSolVotes > 0 ? Math.round((params.mSolVotes[voteAccount] ?? 0) / updatedTotalMSolVotes * Math.max(params.mSolTvl - mSolStakeDistributedBeforeRound, 0)) : 0;
113
- const veMndeStake = updatedTotalVeMndeVotes > 0 ? Math.round((params.veMndeVotes[voteAccount] ?? 0) / updatedTotalVeMndeVotes * Math.max(params.veMndeTvl - veMndeStakeDistributedBeforeRound, 0)) : 0;
114
- const stake = algoStake + veMndeStake + mSolStake;
115
-
116
- if (!stake) {
117
- continue;
118
- }
119
-
120
- const cappedStake = Math.min(params.eligibilities[voteAccount]!.capFromBond - stakes[voteAccount]!.totalStake, params.eligibilities[voteAccount]!.capFromExternalStake - stakes[voteAccount]!.totalStake, stake);
121
- const stakeOverflow = stake - cappedStake;
122
- const algoStakeOverflow = Math.round(algoStake / stake * stakeOverflow);
123
- const mSolStakeOverflow = Math.round(mSolStake / stake * stakeOverflow);
124
- const veMndeStakeOverflow = Math.round(veMndeStake / stake * stakeOverflow);
125
- const cappedAlgoStake = algoStake - algoStakeOverflow;
126
- const cappedMSolStake = mSolStake - mSolStakeOverflow;
127
- const cappedVeMndeStake = veMndeStake - veMndeStakeOverflow;
128
-
129
- if (cappedAlgoStake + cappedMSolStake + cappedVeMndeStake > 0) {
130
- someStakeIncreased = true;
131
- }
132
-
133
- algoStakeDistributed += cappedAlgoStake;
134
- mSolStakeDistributed += cappedMSolStake;
135
- veMndeStakeDistributed += cappedVeMndeStake;
136
-
137
- stakes[voteAccount]!.algoStake += cappedAlgoStake;
138
- stakes[voteAccount]!.mSolStake += cappedMSolStake;
139
- stakes[voteAccount]!.veMndeStake += cappedVeMndeStake;
140
- stakes[voteAccount]!.totalStake += cappedAlgoStake + cappedMSolStake + cappedVeMndeStake;
141
- if (round > 1) {
142
- stakes[voteAccount]!.algoStakeFromOverflow += cappedAlgoStake;
143
- stakes[voteAccount]!.mSolStakeFromOverflow += cappedMSolStake;
144
- stakes[voteAccount]!.veMndeStakeFromOverflow += cappedVeMndeStake;
145
- stakes[voteAccount]!.totalStakeFromOverlfow += cappedAlgoStake + cappedMSolStake + cappedVeMndeStake;
146
- }
147
- }
148
-
149
- round++;
150
-
151
- if (!someStakeIncreased) {
152
- break;
153
- }
154
-
155
- for (const voteAccount of params.eligibleValidators) {
156
- if (Math.round(stakes[voteAccount]!.totalStake) === Math.round(params.eligibilities[voteAccount]!.capFromExternalStake)) {
157
- params.veMndeVotes = removeFromVotes(params.veMndeVotes, voteAccount);
158
- params.mSolVotes = removeFromVotes(params.mSolVotes, voteAccount);
159
- }
160
- }
161
- updatedTotalVeMndeVotes = sum(Object.values(params.veMndeVotes));
162
- updatedTotalMSolVotes = sum(Object.values(params.mSolVotes));
163
- }
164
-
165
- const remainingAlgoTvl = Math.max(params.algoTvl - algoStakeDistributed, 0);
166
- const remainingMSolTvl = Math.max(params.mSolTvl - mSolStakeDistributed, 0);
167
- const remainingVeMndeTvl = Math.max(params.veMndeTvl - veMndeStakeDistributed, 0);
168
- for (const voteAccount of params.eligibleValidators) {
169
- if (!stakes[voteAccount]) {
170
- continue;
171
- }
172
- if (algoStakeDistributed) {
173
- const extraStake = Math.round((stakes[voteAccount]?.algoStake ?? 0) / algoStakeDistributed * remainingAlgoTvl);
174
- stakes[voteAccount]!.totalStake += extraStake;
175
- stakes[voteAccount]!.algoStake += extraStake;
176
- stakes[voteAccount]!.algoStakeFromOverflow += extraStake;
177
- }
178
- if (mSolStakeDistributed) {
179
- const extraStake = Math.round((stakes[voteAccount]?.algoStake ?? 0) / mSolStakeDistributed * remainingMSolTvl);
180
- stakes[voteAccount]!.totalStake += extraStake;
181
- stakes[voteAccount]!.mSolStake += extraStake;
182
- stakes[voteAccount]!.mSolStakeFromOverflow += extraStake;
183
- }
184
- if (veMndeStakeDistributed) {
185
- const extraStake = Math.round((stakes[voteAccount]?.algoStake ?? 0) / veMndeStakeDistributed * remainingVeMndeTvl);
186
- stakes[voteAccount]!.totalStake += extraStake;
187
- stakes[voteAccount]!.veMndeStake += extraStake;
188
- stakes[voteAccount]!.veMndeStakeFromOverflow += extraStake;
189
- }
190
- }
191
- return stakes;
192
- }
193
- export function computeValidatorsStakes(
194
- aggregatedValidators: AggregatedValidators,
195
- scores: Scores,
196
- eligibilities: ValidatorsEligibilities,
197
- stakesConfig: StakesConfig,
198
- scoringConfig: ScoringConfig,
199
- mSolVotes: Votes,
200
- veMndeVotes: Votes
201
- ): Stakes {
202
- let updatedMSolVotes = { ...mSolVotes };
203
- let updatedVeMndeVotes = { ...veMndeVotes };
204
-
205
- const processedVotesAndTvls = processVotesAndCalculateTVLs(updatedMSolVotes, updatedVeMndeVotes, stakesConfig, scoringConfig);
206
-
207
- updatedMSolVotes = processedVotesAndTvls.updatedMSolVotes;
208
- updatedVeMndeVotes = processedVotesAndTvls.updatedVeMndeVotes;
209
- const algoTvl = stakesConfig.tvl - processedVotesAndTvls.mSolTvl - processedVotesAndTvls.veMndeTvl;
210
-
211
- try {
212
- const eligibleValidators = filterEligibleValidators(aggregatedValidators, eligibilities);
213
- const stakingVariables: StakingVariables = { tvl: algoTvl };
214
- const blockSize = Parser.evaluate(stakesConfig.formulaStakeBlockSize, stakingVariables);
215
-
216
- Object.keys(aggregatedValidators).filter((v) => !eligibilities[v]?.basicEligibility).forEach((voteAccount) => {
217
- updatedVeMndeVotes = removeFromVotes(updatedVeMndeVotes, voteAccount);
218
- updatedMSolVotes = removeFromVotes(updatedMSolVotes, voteAccount);
219
- });
220
- const updatedTotalVeMndeVotes = sum(Object.values(updatedVeMndeVotes));
221
- const updatedTotalMSolVotes = sum(Object.values(updatedMSolVotes));
222
- eligibleValidators.sort((a, b) => {
223
- const scoreA = scores[a]?.score ?? 0;
224
- const scoreB = scores[b]?.score ?? 0;
225
- return scoreB - scoreA;
226
- });
227
-
228
- return computeStakesForValidators({
229
- stakingVariables: stakingVariables,
230
- eligibleValidators: eligibleValidators,
231
- scores: scores,
232
- eligibilities: eligibilities,
233
- stakesConfig: stakesConfig,
234
- mSolVotes: updatedMSolVotes,
235
- veMndeVotes: updatedVeMndeVotes,
236
- totalMsolVotes: updatedTotalMSolVotes,
237
- totalVeMndeVotes: updatedTotalVeMndeVotes,
238
- mSolTvl: processedVotesAndTvls.mSolTvl,
239
- veMndeTvl: processedVotesAndTvls.veMndeTvl,
240
- algoTvl: algoTvl,
241
- blockSize: blockSize
242
- });
243
- } catch (err) {
244
- error("Computing validators stakes failed.", err);
245
- }
246
- }
@@ -1,133 +0,0 @@
1
- import { AggregatedValidator, AggregatedValidators, ValidatorDto } from '../dto/validators.dto';
2
- import { JitoValidatorDto } from '../dto/jito.dto';
3
- import { mean, sum } from '../utils/maths';
4
- import { ClusterInfo } from '../dto/cluster.dto';
5
-
6
- export function aggregateValidatorData (
7
- validator: ValidatorDto,
8
- mevRecord: JitoValidatorDto,
9
- blacklist: Set<string>,
10
- firstEpoch: number,
11
- lastEpoch: number
12
- ): AggregatedValidator {
13
- const currentMarinadeStake = Number(validator.epochStats[lastEpoch]?.marinade_native_stake || 0) / 1e9 + Number(validator.epochStats[lastEpoch]?.marinade_stake || 0) / 1e9;
14
- const voteAccount = validator.vote_account;
15
- const name = validator.info_name || 'Unknown';
16
- const epochs: number[] = [];
17
- const commission: number[] = [];
18
- const stake: number[] = [];
19
- const externalStake: number[] = [];
20
- const credits: number[] = [];
21
- const blocksProduced: number[] = [];
22
- const leaderSlots: number[] = [];
23
- const dataAvailable: boolean[] = [];
24
-
25
- const currentStake = Number(validator.epochStats[lastEpoch]?.activated_stake || 0) / 1e9;
26
-
27
- const blacklisted = blacklist.has(voteAccount);
28
-
29
- for (let epoch = lastEpoch; epoch >= firstEpoch; epoch--) {
30
- const epochStat = validator.epochStats?.[epoch];
31
-
32
- epochs.push(epoch);
33
- commission.push(epochStat?.commission_max_observed || epochStat?.commission_advertised || 0);
34
- stake.push(Number(epochStat?.activated_stake || 0) / 1e9);
35
- externalStake.push(Number(epochStat?.activated_stake || 0) / 1e9 - Number(epochStat?.marinade_stake || 0) / 1e9 - Number(epochStat?.marinade_native_stake || 0) / 1e9);
36
- credits.push(epochStat?.credits || 0);
37
- blocksProduced.push(epochStat?.blocks_produced || 0);
38
- leaderSlots.push(epochStat?.leader_slots || 0);
39
- dataAvailable.push(!!epochStat);
40
- }
41
-
42
- const mevCommission = mevRecord?.running_jito ? mevRecord.mev_commission_bps / 100 : 100;
43
- return {
44
- voteAccount,
45
- name,
46
- epochs,
47
- currentMarinadeStake,
48
- currentStake,
49
- commission,
50
- stake,
51
- externalStake,
52
- credits,
53
- blocksProduced,
54
- leaderSlots,
55
- dataAvailable,
56
- mevCommission,
57
- country: validator.dc_country || 'Unknown',
58
- city: validator.dc_full_city || 'Unknown',
59
- aso: validator.dc_aso || 'Unknown',
60
- blacklisted,
61
- version: validator.version
62
- };
63
- }
64
- export async function aggregateValidatorsData (
65
- validators: ValidatorDto[],
66
- basicEligibilityEpochs: number,
67
- bonusEligibilityExtraEpochs: number
68
- ): Promise<AggregatedValidators> {
69
- const lastEpoch = this.getMaxEpoch(validators);
70
- const firstEpoch = lastEpoch - basicEligibilityEpochs - bonusEligibilityExtraEpochs;
71
-
72
- const jitoMevRecords: Record<string, JitoValidatorDto> = await this.dataProvider.fetchValidatorsJitoMEV(true);
73
- const blacklist: Set<string> = await this.dataProvider.fetchBlacklist(true);
74
-
75
- const result: { [voteAccount: string]: AggregatedValidator } = {};
76
-
77
- for (const validator of validators) {
78
- const mevRecord = jitoMevRecords[validator.vote_account] ?? {
79
- vote_account: validator.vote_account,
80
- mev_commission_bps: 100,
81
- running_jito: false,
82
- active_stake: Number(validator.activated_stake)
83
- } as JitoValidatorDto;
84
-
85
- if (mevRecord) {
86
- const aggregatedData = this.aggregateValidatorData(validator, mevRecord, blacklist, firstEpoch, lastEpoch);
87
- result[validator.vote_account] = aggregatedData;
88
- }
89
- }
90
-
91
- return result;
92
- }
93
- export function getMaxEpoch (validators: ValidatorDto[]): number {
94
- return validators.reduce((maxEpoch, validator) => {
95
- const validatorMaxEpoch = validator.epoch_stats.reduce((max, { epoch }) => {
96
- return Math.max(epoch, max);
97
- }, 0);
98
- return Math.max(maxEpoch, validatorMaxEpoch);
99
- }, 0);
100
- }
101
- export function selectExternalStakeMin (validator: AggregatedValidator, fullEpochs: number): number {
102
- if (validator.externalStake.length === 0) {
103
- throw new Error('Validator has no external stake data.');
104
- }
105
- return Math.min(...validator.externalStake.slice(0, fullEpochs + 1));
106
- }
107
- export function selectCreditsPctMean (validator: AggregatedValidator, clusterInfo: ClusterInfo, fullEpochs: number): number {
108
- return mean(validator.epochs.slice(1, fullEpochs + 1).map((epoch, fullEpochIndex) =>
109
- (validator.credits[fullEpochIndex + 1] ?? 0) / (clusterInfo.targetCreditsByEpoch.get(epoch) ?? 1)));
110
- }
111
- export function selectBlockProductionMean (validator: AggregatedValidator, fullEpochs: number): number {
112
- const leaderSlots = sum(validator.leaderSlots.slice(1, fullEpochs + 1));
113
- return leaderSlots === 0 ? 1 : sum(validator.blocksProduced.slice(1, fullEpochs + 1)) / leaderSlots;
114
- }
115
- export function selectCommissionInflationMax (validator: AggregatedValidator, epochs: number): number {
116
- return Math.max(...validator.commission.slice(0, epochs));
117
- }
118
- export function selectCommissionMEV (validator: AggregatedValidator): number {
119
- return validator.mevCommission;
120
- }
121
- export function selectCountryStakeConcentration (validator: AggregatedValidator, clusterInfo: ClusterInfo): number {
122
- return clusterInfo.country.get(validator.country ?? '???') ?? 0;
123
- }
124
- export function selectCityStakeConcentration (validator: AggregatedValidator, clusterInfo: ClusterInfo): number {
125
- return clusterInfo.city.get(validator.city ?? '???') ?? 0;
126
- }
127
- export function selectASOStakeConcentration (validator: AggregatedValidator, clusterInfo: ClusterInfo): number {
128
- return clusterInfo.aso.get(validator.aso ?? '???') ?? 0;
129
- }
130
- export function selectNodeStake (validator: AggregatedValidator): number {
131
- return validator.stake[0] ?? 0;
132
- }
133
-
@@ -1,38 +0,0 @@
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
- }
package/dto/bonds.dto.ts DELETED
@@ -1,12 +0,0 @@
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>;
@@ -1,12 +0,0 @@
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
- }
package/dto/jito.dto.ts DELETED
@@ -1,9 +0,0 @@
1
- export class JitoValidatorDto {
2
- vote_account: string;
3
- mev_commission_bps: number;
4
- running_jito: boolean;
5
- active_stake: number;
6
- }
7
- export class JitoValidatorsResponseDto {
8
- validators: JitoValidatorDto[];
9
- }
@@ -1,18 +0,0 @@
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
- }
@@ -1,19 +0,0 @@
1
- export class RewardPairDto {
2
- epoch: number;
3
- amount: number;
4
-
5
- constructor (pair: [number, number]) {
6
- this.epoch = pair[0];
7
- this.amount = pair[1];
8
- }
9
- }
10
- export class RewardsResponseDto {
11
- rewards_mev: RewardPairDto[];
12
- rewards_inflation_est: RewardPairDto[];
13
-
14
- constructor (data: { rewards_mev: [number, number][], rewards_inflation_est: [number, number][] }) {
15
- this.rewards_mev = data.rewards_mev.map(pair => new RewardPairDto(pair));
16
- this.rewards_inflation_est = data.rewards_inflation_est.map(pair => new RewardPairDto(pair));
17
- }
18
- }
19
- export type Rewards = { inflation: number, mev: number }
@@ -1,103 +0,0 @@
1
- import { ClusterInfo } from './cluster.dto';
2
- import { AggregatedValidator } from './validators.dto';
3
-
4
- export type ScoreDto = {
5
- score: number,
6
- concentrationScore: number,
7
- scores: number[]
8
- values: number[]
9
- scoreErrors: boolean[]
10
- tooltips: string[]
11
- }
12
- export type Score = {
13
- vote_account: string,
14
- score: string,
15
- score_credits: string,
16
- score_block_production: string,
17
- score_inflation_commission: string,
18
- score_mev_commission: string,
19
- score_country_concentration: string,
20
- score_city_concentration: string,
21
- score_aso_concentration: string,
22
- score_node_concentration: string,
23
- ui_hints: string,
24
- eligible_stake_algo: number;
25
- eligible_bonus: number;
26
- in_algo_stake_set: number;
27
- msol_votes: string;
28
- vemnde_votes: string;
29
- blacklisted: number,
30
- rank: number,
31
- version: string,
32
- max_commission: number,
33
- marinade_stake: string,
34
- target_stake_vemnde: string,
35
- target_stake_msol: string,
36
- target_stake_algo: string,
37
- target_stake: string,
38
- }
39
- export type ScoreConfig = {
40
- epochs: number,
41
- concentrationParams: number[]
42
- }
43
- export type ScoringConfig = {
44
- DS_PUBKEY: string;
45
- REWARDS_PAST_EPOCHS: number;
46
- CAP_FROM_BOND: number;
47
- formulaStakeBlockSize: string;
48
- formulaStakeBlocksFromScore: string;
49
- formulaVoteCredits: string;
50
- formulaBlockProduction: string;
51
- formulaInflationCommission: string;
52
- formulaMEVCommission: string;
53
- formulaStakeConcentrationCountry: string;
54
- formulaStakeConcentrationCity: string;
55
- formulaStakeConcentrationASO: string;
56
- formulaStakeConcentrationNode: string;
57
- weightTargetSumOfRewards: number;
58
- weightMevHeuristic: number;
59
- weightVoteCredits: number;
60
- weightBlockProduction: number;
61
- weightInflationCommission: number;
62
- weightMEVCommission: number;
63
- weightStakeConcentrationCountry: number;
64
- weightStakeConcentrationCity: number;
65
- weightStakeConcentrationASO: number;
66
- weightStakeConcentrationNode: number;
67
- basicEligibilityEpochs: number;
68
- bonusEligibilityExtraEpochs: number;
69
- maxCommission: number;
70
- voteCreditsWarning: number;
71
- voteCreditsLow: number;
72
- minExternalStake: number;
73
- minScore: number;
74
- maxStakeShare: number;
75
- maxWarnings: number;
76
- mSolControl: number;
77
- veMndeControl: number;
78
- stakeBlocksFromBonus: number;
79
- concentrationParams: number[];
80
- };
81
-
82
- export type Variables = {
83
- bp_cluster_mean: number;
84
- bp_cluster_std_dev: number;
85
- credits_pct_mean: number;
86
- bp_mean: number;
87
- commission_inflation_max: number;
88
- commission_mev: number;
89
- country_stake_concentration_last: number;
90
- city_stake_concentration_last: number;
91
- aso_stake_concentration_last: number;
92
- node_stake_last: number;
93
- };
94
- export type Scores = Record<string, ScoreDto>
95
- export type ScoreTooltipBuilder = (validator: AggregatedValidator, clusterInfo: ClusterInfo) => string
96
- export type UnstakeHint = {
97
- vote_account: string;
98
- marinade_stake: string;
99
- hints: string[];
100
- };
101
- export type UnstakeHints = {
102
- unstake_hints: UnstakeHint[];
103
- };
@@ -1,16 +0,0 @@
1
- export class RecordDto {
2
- amount: string | null;
3
- tokenOwner: string;
4
- validatorVoteAccount: string;
5
- }
6
- export class veMNDESnapshotDto {
7
- voteRecordsCreatedAt: string;
8
- records: RecordDto[];
9
- }
10
- export class mSolSnapshotDto {
11
- mSolSnapshotCreatedAt: string;
12
- voteRecordsCreatedAt: string;
13
- records: RecordDto[];
14
- }
15
- export type Votes = Record<string, number>
16
-
package/dto/stakes.dto.ts DELETED
@@ -1,31 +0,0 @@
1
- import { Votes } from './snapshots.dto';
2
-
3
- export type StakesConfig = {
4
- tvl: number
5
- mSolControl: number
6
- veMndeControl: number
7
- stakeBlocksFromBonus: number
8
- formulaStakeBlockSize: string
9
- formulaStakeBlocksFromScore: string
10
- }
11
- export type Stake = {
12
- algoStake: number
13
- mSolStake: number
14
- veMndeStake: number
15
- totalStake: number
16
- algoStakeFromOverflow: number
17
- mSolStakeFromOverflow: number
18
- veMndeStakeFromOverflow: number
19
- totalStakeFromOverlfow: number
20
- }
21
- export type ProcessedVotesAndTVLs = {
22
- updatedMSolVotes: Votes;
23
- updatedVeMndeVotes: Votes;
24
- mSolTvl: number;
25
- veMndeTvl: number;
26
- totalTvl: number;
27
- };
28
- export type StakingVariables = {
29
- tvl: number;
30
- }
31
- export type Stakes = Record<string, Stake>