@@ -24,6 +24,7 @@ import { WindowAlreadySetException } from "./exceptions";
24
24
import { DepositsFilteredReferrals } from "../model/DepositsFilteredReferrals.entity" ;
25
25
import { DepositReferralStat } from "../../deposit/model/deposit-referral-stat.entity" ;
26
26
import { splitArrayInChunks } from "../../../utils" ;
27
+ import { Claim } from "../../scraper/model/claim.entity" ;
27
28
28
29
const REFERRAL_ADDRESS_DELIMITER = "d00dfeeddeadbeef" ;
29
30
const getReferralsSummaryCacheKey = ( address : string ) => `referrals:summary:${ address } ` ;
@@ -127,7 +128,6 @@ export class ReferralService {
127
128
. where ( "deposit.rewardsWindowIndex IS NULL" )
128
129
. andWhere ( "deposit.depositDate <= :maxDepositDate" , { maxDepositDate } )
129
130
. getMany ( ) ;
130
- console . log ( `found ${ deposits . length } deposits` ) ;
131
131
const { recipients, rewardsToDeposit } = this . calculateReferralRewards ( deposits ) ;
132
132
133
133
for ( const depositsChunk of splitArrayInChunks ( deposits , 100 ) ) {
@@ -274,19 +274,17 @@ export class ReferralService {
274
274
this . logger . log ( `start cumputeReferralStats()` ) ;
275
275
const t1 = performance . now ( ) ;
276
276
const window = - 1 ;
277
-
278
277
const deposits = await entityManager
279
278
. createQueryBuilder ( DepositsFilteredReferrals , "d" )
280
279
. select ( "d.stickyReferralAddress" )
281
- . where ( "d.referralClaimedWindowIndex = :claimedWindowIndex" , { claimedWindowIndex : window } )
282
280
. groupBy ( "d.stickyReferralAddress" )
283
281
. getMany ( ) ;
284
282
const referralAddresses = deposits . map ( ( deposit ) => deposit . stickyReferralAddress ) ;
285
283
this . logger . log ( `window ${ window } : ${ referralAddresses . length } referralAddresses` ) ;
286
284
await Bluebird . Promise . map (
287
285
referralAddresses ,
288
286
( address ) => {
289
- return this . computeStatsForReferralAddress ( entityManager , window , address ) ;
287
+ return this . computeStatsForReferralAddress ( entityManager , address ) ;
290
288
} ,
291
289
{ concurrency : 10 } ,
292
290
) ;
@@ -296,21 +294,33 @@ export class ReferralService {
296
294
} ) ;
297
295
}
298
296
299
- private async computeStatsForReferralAddress ( entityManager : EntityManager , window : number , referralAddress : string ) {
300
- const depositsResult = await entityManager
297
+ private async computeStatsForReferralAddress ( entityManager : EntityManager , referralAddress : string ) {
298
+ const claims = await entityManager
299
+ . createQueryBuilder ( Claim , "c" )
300
+ . where ( "c.account = :account" , { account : referralAddress } )
301
+ . orderBy ( "c.claimedAt" , "ASC" )
302
+ . getMany ( ) ;
303
+ const deposits = await entityManager
301
304
. createQueryBuilder ( DepositsFilteredReferrals , "d" )
302
- . where ( "d.referralClaimedWindowIndex = :claimedWindowIndex" , { claimedWindowIndex : window } )
303
305
. andWhere ( "d.stickyReferralAddress = :referralAddress" , { referralAddress } )
304
306
. getMany ( ) ;
307
+ const sortedDeposits = deposits . sort ( ( d1 , d2 ) => ( d1 . depositDate . getTime ( ) < d2 . depositDate . getTime ( ) ? - 1 : 0 ) ) ;
308
+ const sortedClaims = claims . sort ( ( c1 , c2 ) => ( c1 . claimedAt . getTime ( ) < c2 . claimedAt . getTime ( ) ? - 1 : 0 ) ) ;
309
+ const groupedDeposits = this . groupDepositsByClaimDate ( sortedDeposits , sortedClaims ) ;
310
+
311
+ for ( const deposits of Object . values ( groupedDeposits ) ) {
312
+ await this . computeReferralStatsForDeposits ( deposits , entityManager ) ;
313
+ }
314
+ }
315
+
316
+ private async computeReferralStatsForDeposits ( deposits : DepositsFilteredReferrals [ ] , entityManager : EntityManager ) {
305
317
const depositorAddrCounts = { } ;
306
318
const depositCounts = { } ;
307
319
const depositVolume = { } ;
308
320
let totalVolume = new BigNumber ( 0 ) ;
309
-
310
321
let currentCount = 0 ;
311
- const sortedDeposits = depositsResult . sort ( ( d1 , d2 ) => ( d1 . depositDate < d2 . depositDate ? - 1 : 0 ) ) ;
312
322
313
- for ( const deposit of sortedDeposits ) {
323
+ for ( const deposit of deposits ) {
314
324
const prevCount = depositorAddrCounts [ deposit . depositorAddr ] ;
315
325
316
326
if ( ! prevCount ) {
@@ -327,22 +337,35 @@ export class ReferralService {
327
337
depositVolume [ deposit . id ] = totalVolume ;
328
338
}
329
339
330
- for ( const depositsChunk of splitArrayInChunks ( sortedDeposits , 100 ) ) {
331
- const values : Partial < DepositReferralStat > [ ] = depositsChunk . map ( ( d ) => ( {
332
- depositId : d . id ,
333
- referralCount : depositCounts [ d . id ] ,
334
- referralVolume : depositVolume [ d . id ] . toFixed ( ) ,
335
- referralClaimedWindowIndex : d . referralClaimedWindowIndex ,
336
- } ) ) ;
337
- await entityManager
338
- . createQueryBuilder ( DepositReferralStat , "d" )
339
- . insert ( )
340
- . values ( values )
341
- . orUpdate ( {
342
- conflict_target : [ "depositId" ] ,
343
- overwrite : [ "referralCount" , "referralVolume" , "referralClaimedWindowIndex" ] ,
344
- } )
345
- . execute ( ) ;
346
- }
340
+ await Promise . all (
341
+ splitArrayInChunks ( deposits , 100 ) . map ( ( depositsChunk ) => {
342
+ const values : Partial < DepositReferralStat > [ ] = depositsChunk . map ( ( d ) => ( {
343
+ depositId : d . id ,
344
+ referralCount : depositCounts [ d . id ] ,
345
+ referralVolume : depositVolume [ d . id ] . toFixed ( ) ,
346
+ referralClaimedWindowIndex : d . referralClaimedWindowIndex ,
347
+ } ) ) ;
348
+ return entityManager
349
+ . createQueryBuilder ( DepositReferralStat , "d" )
350
+ . insert ( )
351
+ . values ( values )
352
+ . orUpdate ( {
353
+ conflict_target : [ "depositId" ] ,
354
+ overwrite : [ "referralCount" , "referralVolume" , "referralClaimedWindowIndex" ] ,
355
+ } )
356
+ . execute ( ) ;
357
+ } ) ,
358
+ ) ;
359
+ }
360
+
361
+ private groupDepositsByClaimDate ( deposits : DepositsFilteredReferrals [ ] , claims : Claim [ ] ) {
362
+ return deposits . reduce ( ( acc , deposit ) => {
363
+ const claim = claims . filter ( ( claim ) => claim . claimedAt . getTime ( ) >= deposit . depositDate . getTime ( ) ) [ 0 ] ;
364
+ const windowIndex = claim ?. windowIndex || - 1 ;
365
+ return {
366
+ ...acc ,
367
+ [ windowIndex ] : [ ...( acc [ windowIndex ] || [ ] ) , deposit ] ,
368
+ } ;
369
+ } , { } as Record < string , DepositsFilteredReferrals [ ] > ) ;
347
370
}
348
371
}
0 commit comments