@merkl/api 0.21.4 → 0.21.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/dist/database/api/.generated/edge.js +2 -2
  2. package/dist/database/api/.generated/index.js +2 -2
  3. package/dist/database/api/.generated/package.json +1 -1
  4. package/dist/database/api/.generated/schema.prisma +1 -0
  5. package/dist/src/eden/index.d.ts +1110 -581
  6. package/dist/src/index.d.ts +448 -261
  7. package/dist/src/modules/v4/campaign/campaign.controller.d.ts +11 -2
  8. package/dist/src/modules/v4/campaign/campaign.controller.js +3 -3
  9. package/dist/src/modules/v4/campaign/campaign.repository.d.ts +44 -3
  10. package/dist/src/modules/v4/campaign/campaign.repository.js +46 -2
  11. package/dist/src/modules/v4/campaign/campaign.service.d.ts +36 -2
  12. package/dist/src/modules/v4/campaign/campaign.service.js +20 -8
  13. package/dist/src/modules/v4/creator/creator.controller.d.ts +236 -34
  14. package/dist/src/modules/v4/creator/creator.controller.js +28 -21
  15. package/dist/src/modules/v4/creator/creator.model.d.ts +29 -5
  16. package/dist/src/modules/v4/creator/creator.model.js +21 -1
  17. package/dist/src/modules/v4/creator/creator.repository.d.ts +52 -6
  18. package/dist/src/modules/v4/creator/creator.repository.js +16 -13
  19. package/dist/src/modules/v4/creator/creator.service.d.ts +161 -14
  20. package/dist/src/modules/v4/creator/creator.service.js +49 -11
  21. package/dist/src/modules/v4/dynamicData/dynamicData.service.js +1 -1
  22. package/dist/src/modules/v4/opportunity/opportunity.repository.js +4 -3
  23. package/dist/src/modules/v4/router.d.ts +448 -261
  24. package/dist/src/modules/v4/user/user.controller.d.ts +177 -192
  25. package/dist/src/modules/v4/user/user.controller.js +38 -56
  26. package/dist/src/modules/v4/user/user.model.d.ts +1 -1
  27. package/dist/src/modules/v4/user/user.model.js +1 -1
  28. package/dist/src/modules/v4/user/user.repository.d.ts +1 -1
  29. package/dist/src/modules/v4/user/user.repository.js +1 -1
  30. package/dist/src/modules/v4/user/user.service.d.ts +1 -1
  31. package/dist/tsconfig.package.tsbuildinfo +1 -1
  32. package/package.json +1 -1
@@ -457,7 +457,7 @@ export declare const CampaignController: Elysia<"/campaigns", false, {
457
457
  };
458
458
  } & {
459
459
  ":id": {
460
- timeseries: {
460
+ metrics: {
461
461
  get: {
462
462
  body: unknown;
463
463
  params: {
@@ -473,8 +473,17 @@ export declare const CampaignController: Elysia<"/campaigns", false, {
473
473
  }[];
474
474
  aprRecords: {
475
475
  timestamp: bigint;
476
- cumulated: number;
476
+ apr: number;
477
477
  }[];
478
+ dailyRewardsRecords: {
479
+ total: number;
480
+ timestamp: bigint;
481
+ }[];
482
+ walletCount: {
483
+ timestamp: bigint;
484
+ walletCount: number;
485
+ }[];
486
+ tvlInflowPerDollar: bigint;
478
487
  };
479
488
  };
480
489
  };
@@ -100,11 +100,11 @@ export const CampaignController = new Elysia({ prefix: "/campaigns", detail: { t
100
100
  <p>This endpoint enables you to retrieve a campaign by providing its unique identifier.</p>`,
101
101
  },
102
102
  })
103
- .get("/:id/timeseries", async ({ params }) => {
103
+ .get("/:id/metrics", async ({ params }) => {
104
104
  if (!params.id.includes("-"))
105
- return await CampaignService.getTimeSeries(params.id);
105
+ return await CampaignService.getMetrics(params.id);
106
106
  const [distributionChain, campaignId] = params.id.split("-");
107
- return await CampaignService.getTimeSeries({ distributionChain: +distributionChain, campaignId });
107
+ return await CampaignService.getMetrics({ distributionChain: +distributionChain, campaignId });
108
108
  })
109
109
  .group("/campaigns-to-process", app => {
110
110
  return (app
@@ -1,4 +1,4 @@
1
- import type { CampaignUnique, CampaignWithParams, GetCampaignQueryModel } from "@/modules/v4/campaign/campaign.model";
1
+ import type { Campaign, CampaignUnique, CampaignWithParams, GetCampaignQueryModel } from "@/modules/v4/campaign/campaign.model";
2
2
  import { type CampaignManualOverride, Prisma } from "@db/api";
3
3
  import { type ChainId } from "@sdk";
4
4
  export declare abstract class CampaignRepository {
@@ -333,6 +333,8 @@ export declare abstract class CampaignRepository {
333
333
  static getPastCampaigns(query?: {
334
334
  computeChainId?: number;
335
335
  type?: string;
336
+ creatorId?: string;
337
+ creatorAddress?: string;
336
338
  }): Promise<({
337
339
  Opportunity: {
338
340
  status: import("@db/api").$Enums.Status;
@@ -386,6 +388,8 @@ export declare abstract class CampaignRepository {
386
388
  static getFutureCampaigns(query?: {
387
389
  computeChainId?: number;
388
390
  type?: string;
391
+ creatorId?: string;
392
+ creatorAddress?: string;
389
393
  }): Promise<({
390
394
  Opportunity: {
391
395
  status: import("@db/api").$Enums.Status;
@@ -440,6 +444,8 @@ export declare abstract class CampaignRepository {
440
444
  distributionChainId?: number;
441
445
  computeChainId?: number;
442
446
  type?: string;
447
+ creatorId?: string;
448
+ creatorAddress?: string;
443
449
  }): Promise<({
444
450
  RewardToken: {
445
451
  symbol: string;
@@ -477,6 +483,28 @@ export declare abstract class CampaignRepository {
477
483
  dailyRewards: number;
478
484
  lastCampaignCreatedAt: Date;
479
485
  };
486
+ RewardBreakdown: ({
487
+ Reward: {
488
+ pending: string;
489
+ id: string;
490
+ rewardTokenId: string;
491
+ amount: string;
492
+ root: string;
493
+ recipient: string;
494
+ claimed: string;
495
+ proofs: string[];
496
+ };
497
+ } & {
498
+ reason: string;
499
+ pending: string;
500
+ id: string;
501
+ campaignId: string;
502
+ amount: string;
503
+ claimed: string;
504
+ protocolId: string | null;
505
+ rewardId: string;
506
+ subCampaignId: string | null;
507
+ })[];
480
508
  } & {
481
509
  type: string;
482
510
  description: string | null;
@@ -831,12 +859,25 @@ export declare abstract class CampaignRepository {
831
859
  total: number;
832
860
  timestamp: bigint;
833
861
  }[]>;
834
- static getAprRecords(campaign: {
862
+ static getAprRecords(campaign: Campaign["raw"]): Promise<{
863
+ timestamp: bigint;
864
+ apr: number;
865
+ }[]>;
866
+ static getDailyRewardsRecords(campaign: {
867
+ opportunityId: string;
868
+ startTimestamp: bigint;
869
+ endTimestamp: bigint;
870
+ }): Promise<{
871
+ total: number;
872
+ timestamp: bigint;
873
+ }[]>;
874
+ static getWalletCountOverTime(campaign: {
875
+ id: string;
835
876
  opportunityId: string;
836
877
  startTimestamp: bigint;
837
878
  endTimestamp: bigint;
838
879
  }): Promise<{
839
880
  timestamp: bigint;
840
- cumulated: number;
881
+ walletCount: number;
841
882
  }[]>;
842
883
  }
@@ -148,6 +148,7 @@ export class CampaignRepository {
148
148
  include: {
149
149
  Opportunity: true,
150
150
  RewardToken: true,
151
+ RewardBreakdown: { include: { Reward: true } },
151
152
  },
152
153
  });
153
154
  }
@@ -466,12 +467,55 @@ export class CampaignRepository {
466
467
  });
467
468
  }
468
469
  static async getAprRecords(campaign) {
469
- return await apiDbClient.aprRecord.findMany({
470
+ return (await apiDbClient.aprRecord.findMany({
470
471
  where: {
471
472
  opportunityId: campaign.opportunityId,
472
473
  timestamp: { gte: campaign.startTimestamp, lte: campaign.endTimestamp },
473
474
  },
474
- select: { timestamp: true, cumulated: true },
475
+ select: {
476
+ timestamp: true,
477
+ AprBreakdown: {
478
+ select: {
479
+ value: true,
480
+ },
481
+ where: { type: "CAMPAIGN", identifier: campaign.campaignId },
482
+ },
483
+ },
484
+ })).map(record => ({
485
+ timestamp: record.timestamp,
486
+ apr: record.AprBreakdown[0]?.value,
487
+ }));
488
+ }
489
+ static async getDailyRewardsRecords(campaign) {
490
+ return await apiDbClient.dailyRewardsRecord.findMany({
491
+ where: {
492
+ opportunityId: campaign.opportunityId,
493
+ timestamp: { gte: campaign.startTimestamp, lte: campaign.endTimestamp },
494
+ },
495
+ select: { timestamp: true, total: true },
475
496
  });
476
497
  }
498
+ static async getWalletCountOverTime(campaign) {
499
+ const rewardBreakdowns = await apiDbClient.rewardBreakdown.findMany({
500
+ where: {
501
+ campaignId: campaign.id,
502
+ Reward: {
503
+ MerklRoot: { timestamp: { gte: campaign.startTimestamp, lte: campaign.endTimestamp } },
504
+ },
505
+ },
506
+ select: { Reward: { select: { recipient: true, MerklRoot: { select: { timestamp: true } } } } },
507
+ });
508
+ const walletCounts = {};
509
+ for (const { Reward } of rewardBreakdowns) {
510
+ const timestampKey = Reward.MerklRoot.timestamp.toString();
511
+ if (!walletCounts[timestampKey]) {
512
+ walletCounts[timestampKey] = new Set();
513
+ }
514
+ walletCounts[timestampKey].add(Reward.recipient);
515
+ }
516
+ return Object.entries(walletCounts).map(([timestampKey, recipients]) => ({
517
+ timestamp: BigInt(timestampKey),
518
+ walletCount: recipients.size,
519
+ }));
520
+ }
477
521
  }
@@ -9,6 +9,7 @@ export declare abstract class CampaignService {
9
9
  static getPastCampaigns(query?: {
10
10
  computeChainId?: number;
11
11
  type?: string;
12
+ creatorAddress?: string;
12
13
  }): Promise<({
13
14
  Opportunity: {
14
15
  status: import("@db/api").$Enums.Status;
@@ -54,6 +55,7 @@ export declare abstract class CampaignService {
54
55
  static getFutureCampaigns(query?: {
55
56
  computeChainId?: number;
56
57
  type?: string;
58
+ creatorAddress?: string;
57
59
  }): Promise<({
58
60
  Opportunity: {
59
61
  status: import("@db/api").$Enums.Status;
@@ -100,6 +102,7 @@ export declare abstract class CampaignService {
100
102
  distributionChainId?: number;
101
103
  computeChainId?: number;
102
104
  type?: string;
105
+ creatorAddress?: string;
103
106
  }): Promise<({
104
107
  RewardToken: {
105
108
  symbol: string;
@@ -137,6 +140,28 @@ export declare abstract class CampaignService {
137
140
  dailyRewards: number;
138
141
  lastCampaignCreatedAt: Date;
139
142
  };
143
+ RewardBreakdown: ({
144
+ Reward: {
145
+ pending: string;
146
+ id: string;
147
+ rewardTokenId: string;
148
+ amount: string;
149
+ root: string;
150
+ recipient: string;
151
+ claimed: string;
152
+ proofs: string[];
153
+ };
154
+ } & {
155
+ reason: string;
156
+ pending: string;
157
+ id: string;
158
+ campaignId: string;
159
+ amount: string;
160
+ claimed: string;
161
+ protocolId: string | null;
162
+ rewardId: string;
163
+ subCampaignId: string | null;
164
+ })[];
140
165
  } & {
141
166
  type: string;
142
167
  description: string | null;
@@ -938,14 +963,23 @@ export declare abstract class CampaignService {
938
963
  endTimestamp: any;
939
964
  params: string;
940
965
  };
941
- static getTimeSeries(campaignId: CampaignUnique | string): Promise<{
966
+ static getMetrics(campaignId: CampaignUnique | string): Promise<{
942
967
  tvlRecords: {
943
968
  total: number;
944
969
  timestamp: bigint;
945
970
  }[];
946
971
  aprRecords: {
947
972
  timestamp: bigint;
948
- cumulated: number;
973
+ apr: number;
974
+ }[];
975
+ dailyRewardsRecords: {
976
+ total: number;
977
+ timestamp: bigint;
978
+ }[];
979
+ walletCount: {
980
+ timestamp: bigint;
981
+ walletCount: number;
949
982
  }[];
983
+ tvlInflowPerDollar: bigint;
950
984
  }>;
951
985
  }
@@ -40,9 +40,8 @@ export class CampaignService {
40
40
  const [rewardToken] = await TokenService.findManyOrCreate([
41
41
  { chainId: body.chainId, address: body.rewardTokenAddress },
42
42
  ]);
43
- if (!rewardToken) {
43
+ if (!rewardToken)
44
44
  throw new Error(`unable to fetch data for token ${body.rewardTokenAddress}`);
45
- }
46
45
  const chain = await ChainService.findUniqueOrThrow(body.chainId);
47
46
  const params = JSON.parse(body.params);
48
47
  const campaign = {
@@ -73,8 +72,7 @@ export class CampaignService {
73
72
  if (dryRun)
74
73
  return opportunity;
75
74
  }
76
- catch (e) {
77
- console.error(e);
75
+ catch (_err) {
78
76
  throw new CannotParseOpportunity(campaign.campaignId, campaign.distributionChainId, campaign.type);
79
77
  }
80
78
  return await CampaignRepository.upsert(campaign, body.opportunityIdentifier);
@@ -388,11 +386,25 @@ export class CampaignService {
388
386
  params: JSON.stringify(fakeCampaign.campaignParameters),
389
387
  };
390
388
  }
391
- static async getTimeSeries(campaignId) {
389
+ static async getMetrics(campaignId) {
392
390
  const id = typeof campaignId === "string" ? campaignId : CampaignService.hashId(campaignId);
393
391
  const campaign = await CampaignRepository.findUniqueOrThrow(id, false);
394
- const tvlRecords = await CampaignRepository.getTvlRecords(campaign);
395
- const aprRecords = await CampaignRepository.getAprRecords(campaign);
396
- return { tvlRecords, aprRecords };
392
+ const [tvlRecords, aprRecords, dailyRewardsRecords, walletCount] = await Promise.all([
393
+ CampaignRepository.getTvlRecords(campaign),
394
+ CampaignRepository.getAprRecords(campaign),
395
+ CampaignRepository.getDailyRewardsRecords(campaign),
396
+ CampaignRepository.getWalletCountOverTime(campaign),
397
+ ]);
398
+ return {
399
+ tvlRecords,
400
+ aprRecords,
401
+ dailyRewardsRecords,
402
+ walletCount,
403
+ tvlInflowPerDollar: tvlRecords.length > 1
404
+ ? (BigInt(tvlRecords[tvlRecords.length - 1].total) - BigInt(tvlRecords[0].total)) /
405
+ ((BigInt(campaign.amount) / BigInt(10 ** campaign.RewardToken.decimals)) *
406
+ BigInt(campaign.RewardToken.price ?? 1))
407
+ : 0n,
408
+ };
397
409
  }
398
410
  }
@@ -12,12 +12,39 @@ export declare const CreatorController: Elysia<"/creators", false, {
12
12
  macro: {};
13
13
  macroFn: {};
14
14
  }, {
15
+ creators: {
16
+ index: {
17
+ post: {
18
+ body: {
19
+ icon?: string | undefined;
20
+ name: string;
21
+ id: string;
22
+ addresses: string[];
23
+ };
24
+ params: {};
25
+ query: unknown;
26
+ headers: {
27
+ authorization: string;
28
+ };
29
+ response: {
30
+ 200: {
31
+ name: string;
32
+ id: string;
33
+ icon: string | null;
34
+ rebateFee: number;
35
+ };
36
+ };
37
+ };
38
+ };
39
+ };
40
+ } & {
15
41
  creators: {
16
42
  index: {
17
43
  get: {
18
44
  body: unknown;
19
45
  params: {};
20
46
  query: {
47
+ id?: string | undefined;
21
48
  items?: number | undefined;
22
49
  page?: number | undefined;
23
50
  address?: string | undefined;
@@ -25,12 +52,14 @@ export declare const CreatorController: Elysia<"/creators", false, {
25
52
  headers: unknown;
26
53
  response: {
27
54
  200: ({
55
+ Users: {
56
+ address: string;
57
+ }[];
58
+ } & {
28
59
  name: string;
29
60
  id: string;
30
- addresses: string[];
31
- } & {
32
- icon?: string | undefined;
33
- rebateFee?: number | undefined;
61
+ icon: string | null;
62
+ rebateFee: number;
34
63
  })[];
35
64
  };
36
65
  };
@@ -38,21 +67,25 @@ export declare const CreatorController: Elysia<"/creators", false, {
38
67
  };
39
68
  } & {
40
69
  creators: {
41
- ":id": {
70
+ ":address": {
42
71
  get: {
43
72
  body: unknown;
44
73
  params: {
45
- id: string;
74
+ address: string;
46
75
  };
47
76
  query: unknown;
48
77
  headers: unknown;
49
78
  response: {
50
79
  200: {
80
+ Users: {
81
+ tags: string[];
82
+ address: string;
83
+ creatorId: string | null;
84
+ }[];
51
85
  name: string;
52
86
  id: string;
53
- addresses: string[];
54
- icon?: string | undefined;
55
- rebateFee?: number | undefined;
87
+ icon: string | null;
88
+ rebateFee: number;
56
89
  };
57
90
  };
58
91
  };
@@ -60,16 +93,16 @@ export declare const CreatorController: Elysia<"/creators", false, {
60
93
  };
61
94
  } & {
62
95
  creators: {
63
- index: {
64
- post: {
96
+ ":address": {
97
+ patch: {
65
98
  body: {
66
99
  icon?: string | undefined;
67
- rebateFee?: number | undefined;
68
100
  name: string;
69
- id: string;
70
101
  addresses: string[];
71
102
  };
72
- params: {};
103
+ params: {
104
+ address: string;
105
+ };
73
106
  query: unknown;
74
107
  headers: {
75
108
  authorization: string;
@@ -87,15 +120,11 @@ export declare const CreatorController: Elysia<"/creators", false, {
87
120
  };
88
121
  } & {
89
122
  creators: {
90
- ":id": {
91
- patch: {
92
- body: {
93
- icon?: string | undefined;
94
- name: string;
95
- addresses: string[];
96
- };
123
+ ":address": {
124
+ delete: {
125
+ body: unknown;
97
126
  params: {
98
- id: string;
127
+ address: string;
99
128
  };
100
129
  query: unknown;
101
130
  headers: {
@@ -114,25 +143,198 @@ export declare const CreatorController: Elysia<"/creators", false, {
114
143
  };
115
144
  } & {
116
145
  creators: {
117
- ":id": {
118
- rebate: {
119
- patch: {
120
- body: {
121
- rebate: number;
146
+ ":address": {
147
+ dashboard: {
148
+ get: {
149
+ body: unknown;
150
+ params: {
151
+ address: string;
122
152
  };
153
+ query: unknown;
154
+ headers: unknown;
155
+ response: {
156
+ 200: {
157
+ pastCampaigns: number;
158
+ liveCampaigns: number;
159
+ futureCampaigns: number;
160
+ incentivizedTvl: number;
161
+ totalCampaigns: number;
162
+ creatorId: string | null;
163
+ };
164
+ };
165
+ };
166
+ };
167
+ };
168
+ };
169
+ } & {
170
+ creators: {
171
+ ":address": {
172
+ campaigns: {
173
+ get: {
174
+ body: unknown;
175
+ params: {
176
+ address: string;
177
+ };
178
+ query: {
179
+ status?: "PAST" | "LIVE" | "FUTURE" | undefined;
180
+ };
181
+ headers: unknown;
182
+ response: {
183
+ 200: ({
184
+ Opportunity: {
185
+ status: import("@db/api").$Enums.Status;
186
+ type: string;
187
+ name: string;
188
+ description: string;
189
+ id: string;
190
+ tags: string[];
191
+ identifier: string;
192
+ action: import("@db/api").$Enums.OpportunityAction;
193
+ manualOverrides: import("@db/api").$Enums.OpportunityManualOverride[];
194
+ chainId: number;
195
+ howToSteps: string[];
196
+ depositUrl: string | null;
197
+ explorerAddress: string | null;
198
+ mainProtocolId: string | null;
199
+ tvl: number;
200
+ apr: number;
201
+ dailyRewards: number;
202
+ lastCampaignCreatedAt: Date;
203
+ };
204
+ } & {
205
+ type: string;
206
+ description: string | null;
207
+ id: string;
208
+ params: import("database/api/.generated/runtime/library").JsonValue;
209
+ subType: number | null;
210
+ computeChainId: number;
211
+ distributionChainId: number;
212
+ campaignId: string;
213
+ distributionType: import("@db/api").$Enums.DistributionType;
214
+ rewardTokenId: string;
215
+ amount: string;
216
+ opportunityId: string;
217
+ startTimestamp: bigint;
218
+ endTimestamp: bigint;
219
+ creatorAddress: string;
220
+ manualOverrides: import("@db/api").$Enums.CampaignManualOverride[];
221
+ createdAt: Date;
222
+ rootCampaignId: string | null;
223
+ parentCampaignId: string | null;
224
+ })[] | {
225
+ params: any;
226
+ chain: {
227
+ name: string;
228
+ id: number;
229
+ icon: string;
230
+ };
231
+ endTimestamp: number;
232
+ startTimestamp: number;
233
+ rewardToken: {
234
+ symbol: string;
235
+ name: string | null;
236
+ id: string;
237
+ icon: string;
238
+ address: string;
239
+ chainId: number;
240
+ decimals: number;
241
+ verified: boolean;
242
+ isTest: boolean;
243
+ isPoint: boolean;
244
+ isPreTGE: boolean;
245
+ isNative: boolean;
246
+ } & {
247
+ price?: number | null | undefined;
248
+ };
249
+ distributionChain: {
250
+ name: string;
251
+ id: number;
252
+ icon: string;
253
+ } | undefined;
254
+ campaignStatus: {
255
+ computedUntil: number;
256
+ processingStarted: number;
257
+ status: import("@db/api").$Enums.RunStatus;
258
+ error: string;
259
+ details: import("database/api/.generated/runtime/library").JsonValue;
260
+ campaignId: string;
261
+ } | undefined;
262
+ creatorAddress: string;
263
+ creator: {
264
+ tags: string[];
265
+ address: string;
266
+ creatorId: string | null;
267
+ };
268
+ createdAt: string;
269
+ description: string | undefined;
270
+ parentCampaignId: string | undefined;
271
+ rootCampaignId: string | undefined;
272
+ Opportunity: {
273
+ status: import("@db/api").$Enums.Status;
274
+ type: string;
275
+ name: string;
276
+ description: string;
277
+ id: string;
278
+ tags: string[];
279
+ identifier: string;
280
+ action: import("@db/api").$Enums.OpportunityAction;
281
+ manualOverrides: import("@db/api").$Enums.OpportunityManualOverride[];
282
+ chainId: number;
283
+ howToSteps: string[];
284
+ depositUrl: string | null;
285
+ explorerAddress: string | null;
286
+ mainProtocolId: string | null;
287
+ tvl: number;
288
+ apr: number;
289
+ dailyRewards: number;
290
+ lastCampaignCreatedAt: Date;
291
+ };
292
+ type: string;
293
+ id: string;
294
+ subType: number | null;
295
+ computeChainId: number;
296
+ distributionChainId: number;
297
+ campaignId: string;
298
+ distributionType: import("@db/api").$Enums.DistributionType;
299
+ rewardTokenId: string;
300
+ amount: string;
301
+ opportunityId: string;
302
+ }[];
303
+ };
304
+ };
305
+ };
306
+ };
307
+ };
308
+ } & {
309
+ creators: {
310
+ campaigns: {
311
+ ":id": {
312
+ get: {
313
+ body: unknown;
123
314
  params: {
124
315
  id: string;
125
316
  };
126
317
  query: unknown;
127
- headers: {
128
- authorization: string;
129
- };
318
+ headers: unknown;
130
319
  response: {
131
320
  200: {
132
- name: string;
133
- id: string;
134
- icon: string | null;
135
- rebateFee: number;
321
+ tvlRecords: {
322
+ total: number;
323
+ timestamp: bigint;
324
+ }[];
325
+ aprRecords: {
326
+ timestamp: bigint;
327
+ apr: number;
328
+ }[];
329
+ dailyRewardsRecords: {
330
+ total: number;
331
+ timestamp: bigint;
332
+ }[];
333
+ walletCount: {
334
+ timestamp: bigint;
335
+ walletCount: number;
336
+ }[];
337
+ tvlInflowPerDollar: bigint;
136
338
  };
137
339
  };
138
340
  };