1+ import { capture } from '@snapshot-labs/snapshot-sentry' ;
12import snapshot from '@snapshot-labs/snapshot.js' ;
3+ import { z } from 'zod' ;
24import db from './mysql' ;
35import { 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-
227type 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+
2928async 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 }
0 commit comments