@@ -9,6 +9,8 @@ type ProposalVpValues = Map<string, { cb: number; vpValueByStrategy: number[] }>
99
1010type Datum = {
1111 id : string ;
12+ voter : string ;
13+ space : string ;
1214 vpState : string ;
1315 vpByStrategy : number [ ] ;
1416 vpValueByStrategy : number [ ] ;
@@ -22,6 +24,8 @@ const PROPOSALS_BATCH_SIZE = 50000;
2224const datumSchema = z
2325 . object ( {
2426 id : z . string ( ) ,
27+ voter : z . string ( ) ,
28+ space : z . string ( ) ,
2529 vpState : z . string ( ) ,
2630 vpValueByStrategy : z . array ( z . number ( ) . finite ( ) ) ,
2731 vpByStrategy : z . array ( z . number ( ) . finite ( ) )
@@ -31,17 +35,26 @@ const datumSchema = z
3135 } ) ;
3236
3337async function getPendingVotes ( ) : Promise <
34- { id : string ; proposal : string ; vpState : string ; vpByStrategy : number [ ] } [ ]
38+ {
39+ id : string ;
40+ voter : string ;
41+ space : string ;
42+ proposal : string ;
43+ vpState : string ;
44+ vpByStrategy : number [ ] ;
45+ } [ ]
3546> {
3647 const query = `
37- SELECT id, proposal, vp_state, vp_by_strategy
48+ SELECT id, voter, space, proposal, vp_state, vp_by_strategy
3849 FROM votes
3950 WHERE cb = ?
4051 LIMIT ?` ;
4152 const results = await db . queryAsync ( query , [ CB . PENDING_COMPUTE , DEFAULT_BATCH_SIZE ] ) ;
4253
4354 return results . map ( ( r : any ) => ( {
4455 id : r . id ,
56+ voter : r . voter ,
57+ space : r . space ,
4558 proposal : r . proposal ,
4659 vpState : r . vp_state ,
4760 vpByStrategy : JSON . parse ( r . vp_by_strategy )
@@ -88,6 +101,7 @@ async function refreshVotesVpValues(data: Datum[]) {
88101 const ids : string [ ] = [ ] ;
89102 const vpValues : Map < string , number > = new Map ( ) ;
90103 const cbValues : Map < string , number > = new Map ( ) ;
104+ const leaderboardUpdates : { value : number ; voter : string ; space : string } [ ] = [ ] ;
91105
92106 for ( const datum of data ) {
93107 if ( datum . proposalCb === CB . INELIGIBLE ) {
@@ -110,6 +124,16 @@ async function refreshVotesVpValues(data: Datum[]) {
110124 validatedDatum . id ,
111125 validatedDatum . vpState === 'final' ? CB . FINAL : CB . PENDING_FINAL
112126 ) ;
127+
128+ // Leaderboard update only for final votes
129+ // to avoid vp fluctuations with overriding strategies
130+ if ( validatedDatum . vpState === 'final' ) {
131+ leaderboardUpdates . push ( {
132+ value,
133+ voter : validatedDatum . voter ,
134+ space : validatedDatum . space
135+ } ) ;
136+ }
113137 } catch ( e ) {
114138 capture ( e ) ;
115139 ids . push ( datum . id ) ;
@@ -132,8 +156,21 @@ async function refreshVotesVpValues(data: Datum[]) {
132156 cbParams . push ( id , cbValues . get ( id ) ! ) ;
133157 }
134158
135- const query = `UPDATE votes SET vp_value = CASE ${ vpCases } END, cb = CASE ${ cbCases } END WHERE id IN (${ placeholders } )` ;
136- await db . queryAsync ( query , [ ...vpParams , ...cbParams , ...ids ] ) ;
159+ const queries : string [ ] = [
160+ `UPDATE votes SET vp_value = CASE ${ vpCases } END, cb = CASE ${ cbCases } END WHERE id IN (${ placeholders } )`
161+ ] ;
162+ const params : ( number | string ) [ ] = [ ...vpParams , ...cbParams , ...ids ] ;
163+
164+ for ( const update of leaderboardUpdates ) {
165+ queries . push (
166+ `UPDATE leaderboard
167+ SET vp_value = vp_value + ?
168+ WHERE user = ? AND space = ?`
169+ ) ;
170+ params . push ( update . value , update . voter , update . space ) ;
171+ }
172+
173+ await db . queryAsync ( queries . join ( ';' ) , params ) ;
137174}
138175
139176async function processBatch ( proposalVpValues : ProposalVpValues ) : Promise < number > {
@@ -146,6 +183,8 @@ async function processBatch(proposalVpValues: ProposalVpValues): Promise<number>
146183 const proposal = proposalVpValues . get ( v . proposal ) ! ;
147184 return {
148185 id : v . id ,
186+ voter : v . voter ,
187+ space : v . space ,
149188 vpState : v . vpState ,
150189 vpByStrategy : v . vpByStrategy ,
151190 vpValueByStrategy : proposal . vpValueByStrategy ,
0 commit comments