Skip to content

Commit 1926816

Browse files
committed
fix: leave vp_value computation only to async script
1 parent 433aa17 commit 1926816

File tree

3 files changed

+38
-114
lines changed

3 files changed

+38
-114
lines changed

src/helpers/votesVpValue.ts

Lines changed: 38 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,51 @@
1+
import { capture } from '@snapshot-labs/snapshot-sentry';
12
import snapshot from '@snapshot-labs/snapshot.js';
3+
import { z } from 'zod';
24
import db from './mysql';
35
import { CB } from '../constants';
46

5-
const REFRESH_INTERVAL = 10 * 1000;
6-
const BATCH_SIZE = 100;
7-
8-
/**
9-
* Calculates the total vote value based on the voting power and the proposal's value per strategy.
10-
* @returns The total vote value, in the currency unit specified by the proposal's vp_value_by_strategy values
11-
**/
12-
export function getVoteValue(vp_value_by_strategy: number[], vp_by_strategy: number[]): number {
13-
if (!vp_value_by_strategy.length) return 0;
14-
15-
if (vp_value_by_strategy.length !== vp_by_strategy.length) {
16-
throw new Error('invalid data to compute vote value');
17-
}
18-
19-
return vp_value_by_strategy.reduce((sum, value, index) => sum + value * vp_by_strategy[index], 0);
20-
}
21-
227
type Datum = {
238
id: string;
24-
vp_state: string;
25-
vp_by_strategy: number[];
26-
vp_value_by_strategy: number[];
9+
vpState: string;
10+
vpByStrategy: number[];
11+
vpValueByStrategy: number[];
2712
};
2813

14+
const REFRESH_INTERVAL = 10 * 1000;
15+
const BATCH_SIZE = 100;
16+
17+
const datumSchema = z
18+
.object({
19+
id: z.string(),
20+
vpState: z.string(),
21+
vpValueByStrategy: z.array(z.number().finite()),
22+
vpByStrategy: z.array(z.number().finite())
23+
})
24+
.refine(data => data.vpValueByStrategy.length === data.vpByStrategy.length, {
25+
message: 'Array length mismatch: vpValueByStrategy and vpByStrategy must have the same length'
26+
});
27+
2928
async function getVotes(): Promise<Datum[]> {
3029
const query = `
3130
SELECT votes.id, votes.vp_state, votes.vp_by_strategy, proposals.vp_value_by_strategy
3231
FROM votes
3332
JOIN proposals ON votes.proposal = proposals.id
34-
WHERE proposals.cb IN (?) AND votes.cb IN (?)
33+
WHERE proposals.cb IN (?) AND votes.cb = ?
3534
ORDER BY votes.created ASC
3635
LIMIT ?`;
3736
const results = await db.queryAsync(query, [
3837
[CB.PENDING_FINAL, CB.PENDING_COMPUTE, CB.FINAL],
39-
[CB.PENDING_SYNC, CB.PENDING_COMPUTE],
38+
CB.PENDING_COMPUTE,
4039
BATCH_SIZE
4140
]);
4241

4342
return results.map((r: any) => {
44-
r.vp_value_by_strategy = JSON.parse(r.vp_value_by_strategy);
45-
r.vp_by_strategy = JSON.parse(r.vp_by_strategy);
46-
return r;
43+
return {
44+
id: r.id,
45+
vpState: r.vp_state,
46+
vpValueByStrategy: JSON.parse(r.vp_value_by_strategy),
47+
vpByStrategy: JSON.parse(r.vp_by_strategy)
48+
};
4749
});
4850
}
4951

@@ -55,11 +57,19 @@ async function refreshVotesVpValues(data: Datum[]) {
5557
query.push('UPDATE votes SET vp_value = ?, cb = ? WHERE id = ? LIMIT 1');
5658

5759
try {
58-
const value = getVoteValue(datum.vp_value_by_strategy, datum.vp_by_strategy);
60+
const validatedDatum = datumSchema.parse(datum);
61+
const value = validatedDatum.vpValueByStrategy.reduce(
62+
(sum, value, index) => sum + value * validatedDatum.vpByStrategy[index],
63+
0
64+
);
5965

60-
params.push(value, datum.vp_state === 'final' ? CB.FINAL : CB.PENDING_FINAL, datum.id);
66+
params.push(
67+
value,
68+
validatedDatum.vpState === 'final' ? CB.FINAL : CB.PENDING_FINAL,
69+
validatedDatum.id
70+
);
6171
} catch (e) {
62-
console.log(e);
72+
capture(e);
6373
params.push(0, CB.INELIGIBLE, datum.id);
6474
}
6575
}

src/scores.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import log from './helpers/log';
44
import db from './helpers/mysql';
55
import { getDecryptionKey } from './helpers/shutter';
66
import { hasStrategyOverride, sha256 } from './helpers/utils';
7-
import { getVoteValue } from './helpers/votesVpValue';
87

98
const scoreAPIUrl = process.env.SCORE_API_URL || 'https://score.snapshot.org';
109
const FINALIZE_SCORE_SECONDS_DELAY = 60;
@@ -166,7 +165,6 @@ export async function updateProposalAndVotes(proposalId: string, force = false)
166165
votes = votes.map((vote: any) => {
167166
vote.scores = proposal.strategies.map((strategy, i) => scores[i][vote.voter] || 0);
168167
vote.balance = vote.scores.reduce((a, b: any) => a + b, 0);
169-
vote.vp_value = getVoteValue(proposal, vote);
170168
return vote;
171169
});
172170
}

test/unit/helpers/votesVpValue.test.ts

Lines changed: 0 additions & 84 deletions
This file was deleted.

0 commit comments

Comments
 (0)