@merkl/api 0.10.133 → 0.10.134

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.
@@ -378,6 +378,31 @@ declare const eden: {
378
378
  200: number;
379
379
  }>>;
380
380
  };
381
+ aggregate: ((params: {
382
+ field: string | number;
383
+ }) => {
384
+ get: (options: {
385
+ headers?: Record<string, unknown> | undefined;
386
+ query: {
387
+ sort?: undefined;
388
+ name?: string | undefined;
389
+ tokens?: string | undefined;
390
+ status?: string | undefined;
391
+ items?: number | undefined;
392
+ tags?: string | undefined;
393
+ chainId?: string | undefined;
394
+ page?: number | undefined;
395
+ action?: string | undefined;
396
+ mainProtocolId?: string | undefined;
397
+ order?: undefined;
398
+ };
399
+ fetch?: RequestInit | undefined;
400
+ }) => Promise<import("@elysiajs/eden").Treaty.TreatyResponse<{
401
+ 200: {
402
+ sum: File;
403
+ };
404
+ }>>;
405
+ }) & {};
381
406
  };
382
407
  campaigns: {
383
408
  index: {
@@ -2215,6 +2240,38 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
2215
2240
  };
2216
2241
  };
2217
2242
  };
2243
+ } & {
2244
+ opportunities: {
2245
+ aggregate: {
2246
+ ":field": {
2247
+ get: {
2248
+ body: unknown;
2249
+ params: {
2250
+ field: never;
2251
+ };
2252
+ query: {
2253
+ sort?: undefined;
2254
+ name?: string | undefined;
2255
+ tokens?: string | undefined;
2256
+ status?: string | undefined;
2257
+ items?: number | undefined;
2258
+ tags?: string | undefined;
2259
+ chainId?: string | undefined;
2260
+ page?: number | undefined;
2261
+ action?: string | undefined;
2262
+ mainProtocolId?: string | undefined;
2263
+ order?: undefined;
2264
+ };
2265
+ headers: unknown;
2266
+ response: {
2267
+ 200: {
2268
+ sum: File;
2269
+ };
2270
+ };
2271
+ };
2272
+ };
2273
+ };
2274
+ };
2218
2275
  };
2219
2276
  } & {
2220
2277
  v4: {
@@ -4379,6 +4436,31 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
4379
4436
  200: number;
4380
4437
  }>>;
4381
4438
  };
4439
+ aggregate: ((params: {
4440
+ field: string | number;
4441
+ }) => {
4442
+ get: (options: {
4443
+ headers?: Record<string, unknown> | undefined;
4444
+ query: {
4445
+ sort?: undefined;
4446
+ name?: string | undefined;
4447
+ tokens?: string | undefined;
4448
+ status?: string | undefined;
4449
+ items?: number | undefined;
4450
+ tags?: string | undefined;
4451
+ chainId?: string | undefined;
4452
+ page?: number | undefined;
4453
+ action?: string | undefined;
4454
+ mainProtocolId?: string | undefined;
4455
+ order?: undefined;
4456
+ };
4457
+ fetch?: RequestInit | undefined;
4458
+ }) => Promise<import("@elysiajs/eden").Treaty.TreatyResponse<{
4459
+ 200: {
4460
+ sum: File;
4461
+ };
4462
+ }>>;
4463
+ }) & {};
4382
4464
  };
4383
4465
  campaigns: {
4384
4466
  index: {
@@ -435,6 +435,38 @@ declare const app: Elysia<"", false, {
435
435
  };
436
436
  };
437
437
  };
438
+ } & {
439
+ opportunities: {
440
+ aggregate: {
441
+ ":field": {
442
+ get: {
443
+ body: unknown;
444
+ params: {
445
+ field: never;
446
+ };
447
+ query: {
448
+ sort?: undefined;
449
+ name?: string | undefined;
450
+ tokens?: string | undefined;
451
+ status?: string | undefined;
452
+ items?: number | undefined;
453
+ tags?: string | undefined;
454
+ chainId?: string | undefined;
455
+ page?: number | undefined;
456
+ action?: string | undefined;
457
+ mainProtocolId?: string | undefined;
458
+ order?: undefined;
459
+ };
460
+ headers: unknown;
461
+ response: {
462
+ 200: {
463
+ sum: File;
464
+ };
465
+ };
466
+ };
467
+ };
468
+ };
469
+ };
438
470
  };
439
471
  } & {
440
472
  v4: {
@@ -408,6 +408,38 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
408
408
  };
409
409
  };
410
410
  };
411
+ } & {
412
+ opportunities: {
413
+ aggregate: {
414
+ ":field": {
415
+ get: {
416
+ body: unknown;
417
+ params: {
418
+ field: never;
419
+ };
420
+ query: {
421
+ sort?: undefined;
422
+ name?: string | undefined;
423
+ tokens?: string | undefined;
424
+ status?: string | undefined;
425
+ items?: number | undefined;
426
+ tags?: string | undefined;
427
+ chainId?: string | undefined;
428
+ page?: number | undefined;
429
+ action?: string | undefined;
430
+ mainProtocolId?: string | undefined;
431
+ order?: undefined;
432
+ };
433
+ headers: unknown;
434
+ response: {
435
+ 200: {
436
+ sum: File;
437
+ };
438
+ };
439
+ };
440
+ };
441
+ };
442
+ };
411
443
  }, {
412
444
  derive: {};
413
445
  resolve: {};
@@ -1,7 +1,7 @@
1
1
  import { NotFoundError } from "../../../errors";
2
2
  import { AuthorizationHeadersDto, TokenAuthGuard } from "../../../guards/TokenAuth.guard";
3
3
  import Elysia from "elysia";
4
- import { CreateOpportunityDto, GetOpportunitiesQueryDto, OpportunityUniqueDto } from "./opportunity.model";
4
+ import { CreateOpportunityDto, GetOpportunitiesQueryDto, OpportunityAggregateFieldDto, OpportunityUniqueDto, } from "./opportunity.model";
5
5
  import { OpportunityService } from "./opportunity.service";
6
6
  import { transformId } from "./transform-id.pipe";
7
7
  import { validateId } from "./validate-id.pipe";
@@ -60,4 +60,9 @@ export const OpportunityController = new Elysia({ prefix: "/opportunities", deta
60
60
  query: GetOpportunitiesQueryDto,
61
61
  })
62
62
  // ─── Get Opportunities Count ─────────────────────────────────────────
63
- .get("/count", async ({ query }) => await OpportunityService.countMany(query), { query: GetOpportunitiesQueryDto });
63
+ .get("/count", async ({ query }) => await OpportunityService.countMany(query), { query: GetOpportunitiesQueryDto })
64
+ // ─── Get Aggregate fields ─────────────────────────────────────────
65
+ .get("/aggregate/:field", async ({ query, params }) => await OpportunityService.aggregate(query, params.field), {
66
+ params: OpportunityAggregateFieldDto,
67
+ query: GetOpportunitiesQueryDto,
68
+ });
@@ -107,7 +107,11 @@ export declare const CreateOpportunityDto: import("@sinclair/typebox").TObject<{
107
107
  protocols: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
108
108
  mainProtocol: import("@sinclair/typebox").TString;
109
109
  }>;
110
+ export declare const OpportunityAggregateFieldDto: import("@sinclair/typebox").TObject<{
111
+ field: import("@sinclair/typebox").TUnion<import("@sinclair/typebox").TLiteral<"dailyRewards">[]>;
112
+ }>;
110
113
  export type GetOpportunitiesQueryEntity = typeof GetOpportunitiesQueryDto.static;
111
114
  export type CreateOpportunityModel = typeof CreateOpportunityDto.static & {
112
115
  id: string;
113
116
  };
117
+ export type OpportunityAggregateField = typeof OpportunityAggregateFieldDto.static;
@@ -34,3 +34,6 @@ export const CreateOpportunityDto = t.Object({
34
34
  protocols: t.Array(t.String()),
35
35
  mainProtocol: t.String(),
36
36
  });
37
+ export const OpportunityAggregateFieldDto = t.Object({
38
+ field: t.Union(["dailyRewards"].map(v => t.Literal(v))),
39
+ });
@@ -476,4 +476,7 @@ export declare abstract class OpportunityRepository {
476
476
  apr: number;
477
477
  dailyRewards: number;
478
478
  }>;
479
+ static aggregateSum(field: keyof Prisma.OpportunitySumAggregateInputType, query: GetOpportunitiesQueryEntity): Promise<{
480
+ sum: never;
481
+ }>;
479
482
  }
@@ -214,4 +214,14 @@ export class OpportunityRepository {
214
214
  static async updateApr(id, apr) {
215
215
  return await apiDbClient.opportunity.update({ where: { id }, data: { apr } });
216
216
  }
217
+ static async aggregateSum(field, query) {
218
+ const args = OpportunityRepository.#transformQueryToPrismaFilters(query);
219
+ const result = await apiDbClient.opportunity.aggregate({
220
+ _sum: {
221
+ [field]: true,
222
+ },
223
+ ...args,
224
+ });
225
+ return { sum: result._sum[field] ?? null };
226
+ }
217
227
  }
@@ -1,4 +1,5 @@
1
1
  import { type CreateCampaignModel } from "../campaign";
2
+ import { Prisma } from "../../../../database/api/.generated";
2
3
  import type { ChainId } from "@sdk";
3
4
  import type { CreateOpportunityModel, GetOpportunitiesQueryEntity, LightOpportunityFromDB, OpportunityMetadata, OpportunityUnique } from "./opportunity.model";
4
5
  import { OpportunityRepository } from "./opportunity.repository";
@@ -438,4 +439,7 @@ export declare abstract class OpportunityService {
438
439
  apr: number;
439
440
  dailyRewards: number;
440
441
  };
442
+ static aggregate(query: GetOpportunitiesQueryEntity, field: keyof Prisma.OpportunitySumAggregateInputType): Promise<{
443
+ sum: never;
444
+ }>;
441
445
  }
@@ -177,4 +177,7 @@ export class OpportunityService {
177
177
  protocol: MainProtocol ?? undefined,
178
178
  };
179
179
  }
180
+ static aggregate(query, field) {
181
+ return OpportunityRepository.aggregateSum(field, query);
182
+ }
180
183
  }
@@ -417,6 +417,38 @@ export declare const v4: Elysia<"/v4", false, {
417
417
  };
418
418
  };
419
419
  };
420
+ } & {
421
+ opportunities: {
422
+ aggregate: {
423
+ ":field": {
424
+ get: {
425
+ body: unknown;
426
+ params: {
427
+ field: never;
428
+ };
429
+ query: {
430
+ sort?: undefined;
431
+ name?: string | undefined;
432
+ tokens?: string | undefined;
433
+ status?: string | undefined;
434
+ items?: number | undefined;
435
+ tags?: string | undefined;
436
+ chainId?: string | undefined;
437
+ page?: number | undefined;
438
+ action?: string | undefined;
439
+ mainProtocolId?: string | undefined;
440
+ order?: undefined;
441
+ };
442
+ headers: unknown;
443
+ response: {
444
+ 200: {
445
+ sum: File;
446
+ };
447
+ };
448
+ };
449
+ };
450
+ };
451
+ };
420
452
  };
421
453
  } & {
422
454
  v4: {
@@ -443,6 +443,38 @@ declare const _default: (app: App) => import("elysia").default<"", false, {
443
443
  };
444
444
  };
445
445
  };
446
+ } & {
447
+ opportunities: {
448
+ aggregate: {
449
+ ":field": {
450
+ get: {
451
+ body: unknown;
452
+ params: {
453
+ field: never;
454
+ };
455
+ query: {
456
+ sort?: undefined;
457
+ name?: string | undefined;
458
+ tokens?: string | undefined;
459
+ status?: string | undefined;
460
+ items?: number | undefined;
461
+ tags?: string | undefined;
462
+ chainId?: string | undefined;
463
+ page?: number | undefined;
464
+ action?: string | undefined;
465
+ mainProtocolId?: string | undefined;
466
+ order?: undefined;
467
+ };
468
+ headers: unknown;
469
+ response: {
470
+ 200: {
471
+ sum: File;
472
+ };
473
+ };
474
+ };
475
+ };
476
+ };
477
+ };
446
478
  };
447
479
  } & {
448
480
  v4: {
@@ -441,6 +441,38 @@ declare const _default: (app: App) => import("elysia").default<"", false, {
441
441
  };
442
442
  };
443
443
  };
444
+ } & {
445
+ opportunities: {
446
+ aggregate: {
447
+ ":field": {
448
+ get: {
449
+ body: unknown;
450
+ params: {
451
+ field: never;
452
+ };
453
+ query: {
454
+ sort?: undefined;
455
+ name?: string | undefined;
456
+ tokens?: string | undefined;
457
+ status?: string | undefined;
458
+ items?: number | undefined;
459
+ tags?: string | undefined;
460
+ chainId?: string | undefined;
461
+ page?: number | undefined;
462
+ action?: string | undefined;
463
+ mainProtocolId?: string | undefined;
464
+ order?: undefined;
465
+ };
466
+ headers: unknown;
467
+ response: {
468
+ 200: {
469
+ sum: File;
470
+ };
471
+ };
472
+ };
473
+ };
474
+ };
475
+ };
444
476
  };
445
477
  } & {
446
478
  v4: {
@@ -444,6 +444,38 @@ declare const _default: (app: App) => import("elysia").default<"", false, {
444
444
  };
445
445
  };
446
446
  };
447
+ } & {
448
+ opportunities: {
449
+ aggregate: {
450
+ ":field": {
451
+ get: {
452
+ body: unknown;
453
+ params: {
454
+ field: never;
455
+ };
456
+ query: {
457
+ sort?: undefined;
458
+ name?: string | undefined;
459
+ tokens?: string | undefined;
460
+ status?: string | undefined;
461
+ items?: number | undefined;
462
+ tags?: string | undefined;
463
+ chainId?: string | undefined;
464
+ page?: number | undefined;
465
+ action?: string | undefined;
466
+ mainProtocolId?: string | undefined;
467
+ order?: undefined;
468
+ };
469
+ headers: unknown;
470
+ response: {
471
+ 200: {
472
+ sum: File;
473
+ };
474
+ };
475
+ };
476
+ };
477
+ };
478
+ };
447
479
  };
448
480
  } & {
449
481
  v4: {
@@ -435,6 +435,38 @@ declare const _default: (app: App) => import("elysia").default<"", false, {
435
435
  };
436
436
  };
437
437
  };
438
+ } & {
439
+ opportunities: {
440
+ aggregate: {
441
+ ":field": {
442
+ get: {
443
+ body: unknown;
444
+ params: {
445
+ field: never;
446
+ };
447
+ query: {
448
+ sort?: undefined;
449
+ name?: string | undefined;
450
+ tokens?: string | undefined;
451
+ status?: string | undefined;
452
+ items?: number | undefined;
453
+ tags?: string | undefined;
454
+ chainId?: string | undefined;
455
+ page?: number | undefined;
456
+ action?: string | undefined;
457
+ mainProtocolId?: string | undefined;
458
+ order?: undefined;
459
+ };
460
+ headers: unknown;
461
+ response: {
462
+ 200: {
463
+ sum: File;
464
+ };
465
+ };
466
+ };
467
+ };
468
+ };
469
+ };
438
470
  };
439
471
  } & {
440
472
  v4: {
@@ -440,6 +440,38 @@ declare const _default: (app: App) => import("elysia").default<"", false, {
440
440
  };
441
441
  };
442
442
  };
443
+ } & {
444
+ opportunities: {
445
+ aggregate: {
446
+ ":field": {
447
+ get: {
448
+ body: unknown;
449
+ params: {
450
+ field: never;
451
+ };
452
+ query: {
453
+ sort?: undefined;
454
+ name?: string | undefined;
455
+ tokens?: string | undefined;
456
+ status?: string | undefined;
457
+ items?: number | undefined;
458
+ tags?: string | undefined;
459
+ chainId?: string | undefined;
460
+ page?: number | undefined;
461
+ action?: string | undefined;
462
+ mainProtocolId?: string | undefined;
463
+ order?: undefined;
464
+ };
465
+ headers: unknown;
466
+ response: {
467
+ 200: {
468
+ sum: File;
469
+ };
470
+ };
471
+ };
472
+ };
473
+ };
474
+ };
443
475
  };
444
476
  } & {
445
477
  v4: {
@@ -458,6 +458,38 @@ declare const _default: (app: App) => import("elysia").default<"", false, {
458
458
  };
459
459
  };
460
460
  };
461
+ } & {
462
+ opportunities: {
463
+ aggregate: {
464
+ ":field": {
465
+ get: {
466
+ body: unknown;
467
+ params: {
468
+ field: never;
469
+ };
470
+ query: {
471
+ sort?: undefined;
472
+ name?: string | undefined;
473
+ tokens?: string | undefined;
474
+ status?: string | undefined;
475
+ items?: number | undefined;
476
+ tags?: string | undefined;
477
+ chainId?: string | undefined;
478
+ page?: number | undefined;
479
+ action?: string | undefined;
480
+ mainProtocolId?: string | undefined;
481
+ order?: undefined;
482
+ };
483
+ headers: unknown;
484
+ response: {
485
+ 200: {
486
+ sum: File;
487
+ };
488
+ };
489
+ };
490
+ };
491
+ };
492
+ };
461
493
  };
462
494
  } & {
463
495
  v4: {
@@ -459,6 +459,38 @@ declare const _default: (app: App) => import("elysia").default<"", false, {
459
459
  };
460
460
  };
461
461
  };
462
+ } & {
463
+ opportunities: {
464
+ aggregate: {
465
+ ":field": {
466
+ get: {
467
+ body: unknown;
468
+ params: {
469
+ field: never;
470
+ };
471
+ query: {
472
+ sort?: undefined;
473
+ name?: string | undefined;
474
+ tokens?: string | undefined;
475
+ status?: string | undefined;
476
+ items?: number | undefined;
477
+ tags?: string | undefined;
478
+ chainId?: string | undefined;
479
+ page?: number | undefined;
480
+ action?: string | undefined;
481
+ mainProtocolId?: string | undefined;
482
+ order?: undefined;
483
+ };
484
+ headers: unknown;
485
+ response: {
486
+ 200: {
487
+ sum: File;
488
+ };
489
+ };
490
+ };
491
+ };
492
+ };
493
+ };
462
494
  };
463
495
  } & {
464
496
  v4: {
@@ -441,6 +441,38 @@ declare const _default: (app: App) => import("elysia").default<"", false, {
441
441
  };
442
442
  };
443
443
  };
444
+ } & {
445
+ opportunities: {
446
+ aggregate: {
447
+ ":field": {
448
+ get: {
449
+ body: unknown;
450
+ params: {
451
+ field: never;
452
+ };
453
+ query: {
454
+ sort?: undefined;
455
+ name?: string | undefined;
456
+ tokens?: string | undefined;
457
+ status?: string | undefined;
458
+ items?: number | undefined;
459
+ tags?: string | undefined;
460
+ chainId?: string | undefined;
461
+ page?: number | undefined;
462
+ action?: string | undefined;
463
+ mainProtocolId?: string | undefined;
464
+ order?: undefined;
465
+ };
466
+ headers: unknown;
467
+ response: {
468
+ 200: {
469
+ sum: File;
470
+ };
471
+ };
472
+ };
473
+ };
474
+ };
475
+ };
444
476
  };
445
477
  } & {
446
478
  v4: {
@@ -442,6 +442,38 @@ declare const _default: (app: App) => import("elysia").default<"", false, {
442
442
  };
443
443
  };
444
444
  };
445
+ } & {
446
+ opportunities: {
447
+ aggregate: {
448
+ ":field": {
449
+ get: {
450
+ body: unknown;
451
+ params: {
452
+ field: never;
453
+ };
454
+ query: {
455
+ sort?: undefined;
456
+ name?: string | undefined;
457
+ tokens?: string | undefined;
458
+ status?: string | undefined;
459
+ items?: number | undefined;
460
+ tags?: string | undefined;
461
+ chainId?: string | undefined;
462
+ page?: number | undefined;
463
+ action?: string | undefined;
464
+ mainProtocolId?: string | undefined;
465
+ order?: undefined;
466
+ };
467
+ headers: unknown;
468
+ response: {
469
+ 200: {
470
+ sum: File;
471
+ };
472
+ };
473
+ };
474
+ };
475
+ };
476
+ };
445
477
  };
446
478
  } & {
447
479
  v4: {