@merkl/api 0.20.98 → 0.20.99

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 (24) hide show
  1. package/dist/src/eden/index.d.ts +337 -12
  2. package/dist/src/engine/campaignTVL/factory.js +2 -0
  3. package/dist/src/engine/campaignTVL/implementations/UniswapV4.d.ts +7 -0
  4. package/dist/src/engine/campaignTVL/implementations/UniswapV4.js +87 -0
  5. package/dist/src/index.d.ts +121 -4
  6. package/dist/src/modules/v4/campaign/campaign.test.controller.d.ts +36 -2
  7. package/dist/src/modules/v4/dynamicData/dynamicData.service.js +1 -11
  8. package/dist/src/modules/v4/opportunity/opportunity.controller.d.ts +36 -2
  9. package/dist/src/modules/v4/opportunity/opportunity.repository.js +2 -0
  10. package/dist/src/modules/v4/opportunity/opportunity.service.d.ts +54 -3
  11. package/dist/src/modules/v4/opportunity/opportunity.service.js +1 -1
  12. package/dist/src/modules/v4/programPayload/programPayload.controller.d.ts +1 -0
  13. package/dist/src/modules/v4/programPayload/programPayload.model.d.ts +1 -0
  14. package/dist/src/modules/v4/programPayload/programPayload.model.js +1 -0
  15. package/dist/src/modules/v4/router.d.ts +121 -4
  16. package/dist/src/modules/v4/router.js +3 -1
  17. package/dist/src/modules/v4/turtle/turtle.controller.d.ts +68 -0
  18. package/dist/src/modules/v4/turtle/turtle.controller.js +20 -0
  19. package/dist/src/modules/v4/turtle/turtle.repository.d.ts +14 -0
  20. package/dist/src/modules/v4/turtle/turtle.repository.js +40 -0
  21. package/dist/src/modules/v4/turtle/turtle.service.d.ts +17 -0
  22. package/dist/src/modules/v4/turtle/turtle.service.js +28 -0
  23. package/dist/tsconfig.package.tsbuildinfo +1 -1
  24. package/package.json +1 -1
@@ -132,6 +132,23 @@ export declare const v4: Elysia<"/v4", false, {
132
132
  };
133
133
  response: {
134
134
  200: {
135
+ id: string;
136
+ name: string;
137
+ type: string;
138
+ status: import("@db/api").$Enums.Status;
139
+ tags: string[];
140
+ identifier: string;
141
+ action: import("@db/api").$Enums.OpportunityAction;
142
+ manualOverrides: import("@db/api").$Enums.OpportunityManualOverride[];
143
+ chainId: number;
144
+ depositUrl: string | null;
145
+ explorerAddress: string | null;
146
+ mainProtocolId: string | null;
147
+ tvl: number;
148
+ apr: number;
149
+ dailyRewards: number;
150
+ lastCampaignCreatedAt: Date;
151
+ } | {
135
152
  id: string;
136
153
  chainId: number;
137
154
  type: string;
@@ -158,7 +175,7 @@ export declare const v4: Elysia<"/v4", false, {
158
175
  depositUrl: any;
159
176
  explorerAddress: string | undefined;
160
177
  tags: string[];
161
- };
178
+ } | null;
162
179
  };
163
180
  };
164
181
  };
@@ -179,6 +196,23 @@ export declare const v4: Elysia<"/v4", false, {
179
196
  };
180
197
  response: {
181
198
  200: {
199
+ id: string;
200
+ name: string;
201
+ type: string;
202
+ status: import("@db/api").$Enums.Status;
203
+ tags: string[];
204
+ identifier: string;
205
+ action: import("@db/api").$Enums.OpportunityAction;
206
+ manualOverrides: import("@db/api").$Enums.OpportunityManualOverride[];
207
+ chainId: number;
208
+ depositUrl: string | null;
209
+ explorerAddress: string | null;
210
+ mainProtocolId: string | null;
211
+ tvl: number;
212
+ apr: number;
213
+ dailyRewards: number;
214
+ lastCampaignCreatedAt: Date;
215
+ } | {
182
216
  id: string;
183
217
  chainId: number;
184
218
  type: string;
@@ -205,7 +239,7 @@ export declare const v4: Elysia<"/v4", false, {
205
239
  depositUrl: any;
206
240
  explorerAddress: string | undefined;
207
241
  tags: string[];
208
- };
242
+ } | null;
209
243
  };
210
244
  };
211
245
  };
@@ -1842,6 +1876,23 @@ export declare const v4: Elysia<"/v4", false, {
1842
1876
  };
1843
1877
  response: {
1844
1878
  200: {
1879
+ id: string;
1880
+ name: string;
1881
+ type: string;
1882
+ status: import("@db/api").$Enums.Status;
1883
+ tags: string[];
1884
+ identifier: string;
1885
+ action: import("@db/api").$Enums.OpportunityAction;
1886
+ manualOverrides: import("@db/api").$Enums.OpportunityManualOverride[];
1887
+ chainId: number;
1888
+ depositUrl: string | null;
1889
+ explorerAddress: string | null;
1890
+ mainProtocolId: string | null;
1891
+ tvl: number;
1892
+ apr: number;
1893
+ dailyRewards: number;
1894
+ lastCampaignCreatedAt: Date;
1895
+ } | {
1845
1896
  id: string;
1846
1897
  chainId: number;
1847
1898
  type: string;
@@ -1868,7 +1919,7 @@ export declare const v4: Elysia<"/v4", false, {
1868
1919
  depositUrl: any;
1869
1920
  explorerAddress: string | undefined;
1870
1921
  tags: string[];
1871
- };
1922
+ } | null;
1872
1923
  };
1873
1924
  };
1874
1925
  };
@@ -1888,6 +1939,23 @@ export declare const v4: Elysia<"/v4", false, {
1888
1939
  };
1889
1940
  response: {
1890
1941
  200: {
1942
+ id: string;
1943
+ name: string;
1944
+ type: string;
1945
+ status: import("@db/api").$Enums.Status;
1946
+ tags: string[];
1947
+ identifier: string;
1948
+ action: import("@db/api").$Enums.OpportunityAction;
1949
+ manualOverrides: import("@db/api").$Enums.OpportunityManualOverride[];
1950
+ chainId: number;
1951
+ depositUrl: string | null;
1952
+ explorerAddress: string | null;
1953
+ mainProtocolId: string | null;
1954
+ tvl: number;
1955
+ apr: number;
1956
+ dailyRewards: number;
1957
+ lastCampaignCreatedAt: Date;
1958
+ } | {
1891
1959
  id: string;
1892
1960
  chainId: number;
1893
1961
  type: string;
@@ -1914,7 +1982,7 @@ export declare const v4: Elysia<"/v4", false, {
1914
1982
  depositUrl: any;
1915
1983
  explorerAddress: string | undefined;
1916
1984
  tags: string[];
1917
- };
1985
+ } | null;
1918
1986
  };
1919
1987
  };
1920
1988
  };
@@ -4442,6 +4510,7 @@ export declare const v4: Elysia<"/v4", false, {
4442
4510
  blacklist?: string[] | undefined;
4443
4511
  poolAddress?: string | undefined;
4444
4512
  contract?: string | undefined;
4513
+ tokenId?: string | undefined;
4445
4514
  marketId?: string | undefined;
4446
4515
  strategy?: string | undefined;
4447
4516
  poolId?: string | undefined;
@@ -5000,6 +5069,54 @@ export declare const v4: Elysia<"/v4", false, {
5000
5069
  };
5001
5070
  };
5002
5071
  };
5072
+ } & {
5073
+ v4: {
5074
+ turtle: {
5075
+ tac: {
5076
+ total: {
5077
+ get: {
5078
+ body: unknown;
5079
+ params: {};
5080
+ query: unknown;
5081
+ headers: unknown;
5082
+ response: {
5083
+ 200: {
5084
+ total: number;
5085
+ breakdown: {
5086
+ [key: string]: number;
5087
+ };
5088
+ };
5089
+ };
5090
+ };
5091
+ };
5092
+ };
5093
+ };
5094
+ } & {
5095
+ turtle: {
5096
+ tac: {
5097
+ ":address": {
5098
+ get: {
5099
+ body: unknown;
5100
+ params: {
5101
+ address: string;
5102
+ };
5103
+ query: unknown;
5104
+ headers: unknown;
5105
+ response: {
5106
+ 200: {
5107
+ [x: string]: {
5108
+ vaultSymbol: string;
5109
+ balance: number;
5110
+ maxBalance: number;
5111
+ turtle: number;
5112
+ };
5113
+ };
5114
+ };
5115
+ };
5116
+ };
5117
+ };
5118
+ };
5119
+ };
5003
5120
  }, {
5004
5121
  derive: {};
5005
5122
  resolve: {};
@@ -32,6 +32,7 @@ import { AlwaysOffSampler, BatchSpanProcessor } from "@opentelemetry/sdk-trace-n
32
32
  import { PrismaInstrumentation } from "@prisma/instrumentation";
33
33
  import Elysia from "elysia";
34
34
  import { ReferralController } from "./referral/referral.controller";
35
+ import { TurtleController } from "./turtle/turtle.controller";
35
36
  // ─── V4 Router ───────────────────────────────────────────────────────────────
36
37
  export const v4 = new Elysia({ tags: ["v4"], prefix: "/v4" })
37
38
  // ─── OpenTelemetry ───────────────────────────────────────────────────
@@ -88,4 +89,5 @@ export const v4 = new Elysia({ tags: ["v4"], prefix: "/v4" })
88
89
  .use(ComputedValueController)
89
90
  .use(CreatorController)
90
91
  .use(ReferralController)
91
- .use(UniswapController);
92
+ .use(UniswapController)
93
+ .use(TurtleController);
@@ -0,0 +1,68 @@
1
+ import Elysia from "elysia";
2
+ export declare const TurtleController: Elysia<"/turtle", false, {
3
+ decorator: {};
4
+ store: {};
5
+ derive: {};
6
+ resolve: {};
7
+ }, {
8
+ type: {};
9
+ error: {};
10
+ }, {
11
+ schema: {};
12
+ macro: {};
13
+ macroFn: {};
14
+ }, {
15
+ turtle: {
16
+ tac: {
17
+ total: {
18
+ get: {
19
+ body: unknown;
20
+ params: {};
21
+ query: unknown;
22
+ headers: unknown;
23
+ response: {
24
+ 200: {
25
+ total: number;
26
+ breakdown: {
27
+ [key: string]: number;
28
+ };
29
+ };
30
+ };
31
+ };
32
+ };
33
+ };
34
+ };
35
+ } & {
36
+ turtle: {
37
+ tac: {
38
+ ":address": {
39
+ get: {
40
+ body: unknown;
41
+ params: {
42
+ address: string;
43
+ };
44
+ query: unknown;
45
+ headers: unknown;
46
+ response: {
47
+ 200: {
48
+ [x: string]: {
49
+ vaultSymbol: string;
50
+ balance: number;
51
+ maxBalance: number;
52
+ turtle: number;
53
+ };
54
+ };
55
+ };
56
+ };
57
+ };
58
+ };
59
+ };
60
+ }, {
61
+ derive: {};
62
+ resolve: {};
63
+ schema: {};
64
+ }, {
65
+ derive: {};
66
+ resolve: {};
67
+ schema: {};
68
+ }>;
@@ -0,0 +1,20 @@
1
+ import { throwOnInvalidRequiredAddress } from "@/utils/throw";
2
+ import Elysia from "elysia";
3
+ import { UserUniqueDto } from "../user/user.model";
4
+ import { TurtleService } from "./turtle.service";
5
+ // ─── Claim Controller ───────────────────────────────────────────────────────
6
+ export const TurtleController = new Elysia({ prefix: "/turtle", detail: { tags: ["Turtle"] } })
7
+ .get("/tac/total", async () => await TurtleService.getTotalDistributed(), {
8
+ detail: {
9
+ description: "Get total TAC distributed and the associated breakdown",
10
+ },
11
+ })
12
+ .get("/tac/:address", async ({ params }) => await TurtleService.getUserData(params), {
13
+ params: UserUniqueDto,
14
+ beforeHandle: ({ params }) => {
15
+ params.address = throwOnInvalidRequiredAddress(params.address);
16
+ },
17
+ detail: {
18
+ description: "Get the max balance and balance of the user for its turtle vaults",
19
+ },
20
+ });
@@ -0,0 +1,14 @@
1
+ export declare class TurtleRepository {
2
+ static fetchUserBalances(address: string): Promise<{
3
+ balance: string;
4
+ maxBalance: string;
5
+ tokenSymbol: string;
6
+ token: string;
7
+ turtleDepositBonus: string;
8
+ user: string;
9
+ }[]>;
10
+ static fetchTotals(): Promise<{
11
+ amount: number;
12
+ id: string;
13
+ }[]>;
14
+ }
@@ -0,0 +1,40 @@
1
+ import request, { gql } from "graphql-request";
2
+ const TURTLE_SUBGRAPH_URL = "https://api.goldsky.com/api/public/project_cltpyx1eh5g5v01xi0a5h5xea/subgraphs/merkl-tacTurtle-mainnet/prod/gn";
3
+ export class TurtleRepository {
4
+ static async fetchUserBalances(address) {
5
+ try {
6
+ return (await request(TURTLE_SUBGRAPH_URL, gql `query UserBalances($where: UserBalance_filter) {
7
+ userBalances(where: $where) {
8
+ balance
9
+ maxBalance
10
+ tokenSymbol
11
+ token
12
+ turtleDepositBonus
13
+ user
14
+ }
15
+ }
16
+ `, {
17
+ where: {
18
+ user: address.toLowerCase(),
19
+ },
20
+ })).userBalances;
21
+ }
22
+ catch {
23
+ return [];
24
+ }
25
+ }
26
+ static async fetchTotals() {
27
+ try {
28
+ return (await request(TURTLE_SUBGRAPH_URL, gql `query TurtleDistributeds {
29
+ turtleDistributeds {
30
+ amount
31
+ id
32
+ }
33
+ }
34
+ `, {})).turtleDistributeds;
35
+ }
36
+ catch {
37
+ return [];
38
+ }
39
+ }
40
+ }
@@ -0,0 +1,17 @@
1
+ import type { UserUniqueModel } from "../user/user.model";
2
+ export declare abstract class TurtleService {
3
+ static getUserData(params: UserUniqueModel): Promise<{
4
+ [key: string]: {
5
+ vaultSymbol: string;
6
+ balance: number;
7
+ maxBalance: number;
8
+ turtle: number;
9
+ };
10
+ }>;
11
+ static getTotalDistributed(): Promise<{
12
+ total: number;
13
+ breakdown: {
14
+ [key: string]: number;
15
+ };
16
+ }>;
17
+ }
@@ -0,0 +1,28 @@
1
+ import { TurtleRepository } from "./turtle.repository";
2
+ export class TurtleService {
3
+ // ─── Get Turtle User data ─────────────────────────────────────────────────
4
+ static async getUserData(params) {
5
+ const userBalances = await TurtleRepository.fetchUserBalances(params.address);
6
+ return userBalances.reduce((acc, userBalance) => {
7
+ acc[userBalance.token] = {
8
+ vaultSymbol: userBalance.tokenSymbol,
9
+ balance: Number(userBalance.balance),
10
+ maxBalance: Number(userBalance.maxBalance),
11
+ turtle: Number(userBalance.turtleDepositBonus),
12
+ };
13
+ return acc;
14
+ }, {});
15
+ }
16
+ // ─── Get Total Turtle Distributed ─────────────────────────────────────────
17
+ static async getTotalDistributed() {
18
+ const totals = await TurtleRepository.fetchTotals();
19
+ return totals.reduce((acc, item) => {
20
+ if (item.id === "total") {
21
+ acc.total = Number(item.amount);
22
+ return acc;
23
+ }
24
+ acc.breakdown[item.id] = Number(item.amount);
25
+ return acc;
26
+ }, { total: 0, breakdown: {} });
27
+ }
28
+ }