@@ -15,6 +15,7 @@ import {
15
15
RecommenderMetrics ,
16
16
TokenPerformance ,
17
17
TradePerformance ,
18
+ TokenRecommendation ,
18
19
} from "../adapters/trustScoreDatabase.ts" ;
19
20
import settings from "@ai16z/eliza/src/settings.ts" ;
20
21
import {
@@ -33,6 +34,26 @@ interface sellDetails {
33
34
sell_amount : number ;
34
35
sell_recommender_id : string | null ;
35
36
}
37
+ interface RecommendationGroup {
38
+ recommendation : any ;
39
+ trustScore : number ;
40
+ }
41
+
42
+ interface RecommenderData {
43
+ recommenderId : string ;
44
+ trustScore : number ;
45
+ riskScore : number ;
46
+ consistencyScore : number ;
47
+ recommenderMetrics : RecommenderMetrics ;
48
+ }
49
+
50
+ interface TokenRecommendationSummary {
51
+ tokenAddress : string ;
52
+ averageTrustScore : number ;
53
+ averageRiskScore : number ;
54
+ averageConsistencyScore : number ;
55
+ recommenders : RecommenderData [ ] ;
56
+ }
36
57
export class TrustScoreManager {
37
58
private tokenProvider : TokenProvider ;
38
59
private trustScoreDb : TrustScoreDatabase ;
@@ -436,6 +457,96 @@ export class TrustScoreManager {
436
457
) ;
437
458
return sellDetailsData ;
438
459
}
460
+
461
+ // get all recommendations
462
+ async getRecommendations (
463
+ startDate : Date ,
464
+ endDate : Date
465
+ ) : Promise < Array < TokenRecommendationSummary > > {
466
+ const recommendations = this . trustScoreDb . getRecommendationsByDateRange (
467
+ startDate ,
468
+ endDate
469
+ ) ;
470
+
471
+ // Group recommendations by tokenAddress
472
+ const groupedRecommendations = recommendations . reduce (
473
+ ( acc , recommendation ) => {
474
+ const { tokenAddress } = recommendation ;
475
+ if ( ! acc [ tokenAddress ] ) acc [ tokenAddress ] = [ ] ;
476
+ acc [ tokenAddress ] . push ( recommendation ) ;
477
+ return acc ;
478
+ } ,
479
+ { } as Record < string , Array < TokenRecommendation > >
480
+ ) ;
481
+
482
+ const result = Object . keys ( groupedRecommendations ) . map (
483
+ ( tokenAddress ) => {
484
+ const tokenRecommendations =
485
+ groupedRecommendations [ tokenAddress ] ;
486
+
487
+ // Initialize variables to compute averages
488
+ let totalTrustScore = 0 ;
489
+ let totalRiskScore = 0 ;
490
+ let totalConsistencyScore = 0 ;
491
+ const recommenderData = [ ] ;
492
+
493
+ tokenRecommendations . forEach ( ( recommendation ) => {
494
+ const tokenPerformance =
495
+ this . trustScoreDb . getTokenPerformance (
496
+ recommendation . tokenAddress
497
+ ) ;
498
+ const recommenderMetrics =
499
+ this . trustScoreDb . getRecommenderMetrics (
500
+ recommendation . recommenderId
501
+ ) ;
502
+
503
+ const trustScore = this . calculateTrustScore (
504
+ tokenPerformance ,
505
+ recommenderMetrics
506
+ ) ;
507
+ const consistencyScore = this . calculateConsistencyScore (
508
+ tokenPerformance ,
509
+ recommenderMetrics
510
+ ) ;
511
+ const riskScore = this . calculateRiskScore ( tokenPerformance ) ;
512
+
513
+ // Accumulate scores for averaging
514
+ totalTrustScore += trustScore ;
515
+ totalRiskScore += riskScore ;
516
+ totalConsistencyScore += consistencyScore ;
517
+
518
+ recommenderData . push ( {
519
+ recommenderId : recommendation . recommenderId ,
520
+ trustScore,
521
+ riskScore,
522
+ consistencyScore,
523
+ recommenderMetrics,
524
+ } ) ;
525
+ } ) ;
526
+
527
+ // Calculate averages for this token
528
+ const averageTrustScore =
529
+ totalTrustScore / tokenRecommendations . length ;
530
+ const averageRiskScore =
531
+ totalRiskScore / tokenRecommendations . length ;
532
+ const averageConsistencyScore =
533
+ totalConsistencyScore / tokenRecommendations . length ;
534
+
535
+ return {
536
+ tokenAddress,
537
+ averageTrustScore,
538
+ averageRiskScore,
539
+ averageConsistencyScore,
540
+ recommenders : recommenderData ,
541
+ } ;
542
+ }
543
+ ) ;
544
+
545
+ // Sort recommendations by the highest average trust score
546
+ result . sort ( ( a , b ) => b . averageTrustScore - a . averageTrustScore ) ;
547
+
548
+ return result ;
549
+ }
439
550
}
440
551
441
552
export const trustScoreProvider : Provider = {
0 commit comments