@merkl/api 0.16.18 → 0.16.20
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.
- package/dist/src/backgroundJobs/jobs/campaignsCacheUpdater.js +1 -1
- package/dist/src/backgroundJobs/jobs/sync.js +1 -1
- package/dist/src/cache/index.d.ts +1 -1
- package/dist/src/cache/index.js +2 -2
- package/dist/src/eden/index.d.ts +410 -35
- package/dist/src/entities/campaign.js +1 -1
- package/dist/src/index.d.ts +82 -7
- package/dist/src/libs/deprecated-merklv3/index.js +2 -2
- package/dist/src/modules/v4/accounting/accounting.controller.js +1 -1
- package/dist/src/modules/v4/accounting/accounting.service.d.ts +1 -1
- package/dist/src/modules/v4/accounting/accounting.service.js +1 -1
- package/dist/src/modules/v4/campaign/campaign.controller.d.ts +13 -1
- package/dist/src/modules/v4/campaign/campaign.repository.js +1 -1
- package/dist/src/modules/v4/campaign/campaign.service.d.ts +26 -2
- package/dist/src/modules/v4/chain/chain.controller.js +1 -1
- package/dist/src/modules/v4/chain/chain.repository.d.ts +1 -6
- package/dist/src/modules/v4/chain/chain.repository.js +2 -5
- package/dist/src/modules/v4/chain/chain.service.d.ts +1 -6
- package/dist/src/modules/v4/chain/chain.service.js +2 -5
- package/dist/src/modules/v4/enso/enso.service.js +4 -1
- package/dist/src/modules/v4/kyberzap/kyberzap.service.js +1 -1
- package/dist/src/modules/v4/opportunity/opportunity.controller.d.ts +40 -4
- package/dist/src/modules/v4/opportunity/opportunity.controller.js +1 -1
- package/dist/src/modules/v4/opportunity/opportunity.model.d.ts +2 -2
- package/dist/src/modules/v4/opportunity/opportunity.service.d.ts +109 -13
- package/dist/src/modules/v4/opportunity/opportunity.service.js +1 -1
- package/dist/src/modules/v4/opportunity/subservices/getClammMetadata.service.js +3 -3
- package/dist/src/modules/v4/protocol/protocol.controller.d.ts +1 -0
- package/dist/src/modules/v4/protocol/protocol.model.d.ts +1 -0
- package/dist/src/modules/v4/protocol/protocol.model.js +1 -0
- package/dist/src/modules/v4/protocol/protocol.repository.js +5 -1
- package/dist/src/modules/v4/protocol/protocol.service.d.ts +0 -2
- package/dist/src/modules/v4/protocol/protocol.service.js +1 -39
- package/dist/src/modules/v4/reward/reward.service.js +1 -1
- package/dist/src/modules/v4/router.d.ts +82 -7
- package/dist/src/modules/v4/token/token.controller.d.ts +28 -2
- package/dist/src/modules/v4/token/token.service.d.ts +71 -7
- package/dist/src/modules/v4/token/token.service.js +3 -3
- package/dist/src/modules/v4/user/user.service.js +1 -1
- package/dist/src/routes/v3/multiChainPositions.js +1 -1
- package/dist/src/routes/v3/opportunity.js +5 -0
- package/dist/src/utils/camelToKebabCase.d.ts +1 -0
- package/dist/src/utils/camelToKebabCase.js +3 -0
- package/dist/tsconfig.package.tsbuildinfo +1 -1
- package/package.json +1 -1
@@ -7,7 +7,7 @@ export const removeTestTokens = (v) => !["aglamerkl", "test"].includes(v.campaig
|
|
7
7
|
export async function getCampaignsFor(chainIds, filters = { onlyLive: false }) {
|
8
8
|
const cachePrefix = filters?.onlyLive ? "LiveCampaigns" : "Campaigns";
|
9
9
|
const cacheKeys = chainIds.map(chain => `${cachePrefix}_${chain}`);
|
10
|
-
return (await Redis.
|
10
|
+
return (await Redis.findMany(cacheKeys)).reduce((prev, allData, index) => {
|
11
11
|
if (!!allData) {
|
12
12
|
const chain = chainIds[index];
|
13
13
|
prev[chain] = Object.keys(allData).reduce((acc, curr) => {
|
package/dist/src/index.d.ts
CHANGED
@@ -223,8 +223,20 @@ declare const app: Elysia<"", false, {
|
|
223
223
|
name: string;
|
224
224
|
status: "PAST" | "LIVE" | "SOON";
|
225
225
|
action: import("../database/api/.generated").$Enums.OpportunityAction;
|
226
|
-
tokens:
|
227
|
-
|
226
|
+
tokens: ({
|
227
|
+
symbol: string;
|
228
|
+
name: string | null;
|
229
|
+
id: string;
|
230
|
+
icon: string;
|
231
|
+
chainId: number;
|
232
|
+
address: string;
|
233
|
+
decimals: number;
|
234
|
+
verified: boolean;
|
235
|
+
isTest: boolean;
|
236
|
+
} & {
|
237
|
+
price?: number | null | undefined;
|
238
|
+
})[];
|
239
|
+
mainProtocol: string | undefined;
|
228
240
|
depositUrl: any;
|
229
241
|
tags: string[];
|
230
242
|
};
|
@@ -309,7 +321,19 @@ declare const app: Elysia<"", false, {
|
|
309
321
|
};
|
310
322
|
id: string;
|
311
323
|
depositUrl: string | undefined;
|
312
|
-
tokens:
|
324
|
+
tokens: ({
|
325
|
+
symbol: string;
|
326
|
+
name: string | null;
|
327
|
+
id: string;
|
328
|
+
icon: string;
|
329
|
+
chainId: number;
|
330
|
+
address: string;
|
331
|
+
decimals: number;
|
332
|
+
verified: boolean;
|
333
|
+
isTest: boolean;
|
334
|
+
} & {
|
335
|
+
price?: number | null | undefined;
|
336
|
+
})[];
|
313
337
|
chain: {
|
314
338
|
name: string;
|
315
339
|
id: number;
|
@@ -596,7 +620,19 @@ declare const app: Elysia<"", false, {
|
|
596
620
|
id: number;
|
597
621
|
icon: string;
|
598
622
|
};
|
599
|
-
rewardToken:
|
623
|
+
rewardToken: {
|
624
|
+
symbol: string;
|
625
|
+
name: string | null;
|
626
|
+
id: string;
|
627
|
+
icon: string;
|
628
|
+
chainId: number;
|
629
|
+
address: string;
|
630
|
+
decimals: number;
|
631
|
+
verified: boolean;
|
632
|
+
isTest: boolean;
|
633
|
+
} & {
|
634
|
+
price?: number | null | undefined;
|
635
|
+
};
|
600
636
|
distributionChain: {
|
601
637
|
name: string;
|
602
638
|
id: number;
|
@@ -1076,7 +1112,19 @@ declare const app: Elysia<"", false, {
|
|
1076
1112
|
id: number;
|
1077
1113
|
icon: string;
|
1078
1114
|
};
|
1079
|
-
rewardToken:
|
1115
|
+
rewardToken: {
|
1116
|
+
symbol: string;
|
1117
|
+
name: string | null;
|
1118
|
+
id: string;
|
1119
|
+
icon: string;
|
1120
|
+
chainId: number;
|
1121
|
+
address: string;
|
1122
|
+
decimals: number;
|
1123
|
+
verified: boolean;
|
1124
|
+
isTest: boolean;
|
1125
|
+
} & {
|
1126
|
+
price?: number | null | undefined;
|
1127
|
+
};
|
1080
1128
|
distributionChain: {
|
1081
1129
|
name: string;
|
1082
1130
|
id: number;
|
@@ -1233,6 +1281,7 @@ declare const app: Elysia<"", false, {
|
|
1233
1281
|
items?: number | undefined;
|
1234
1282
|
tags?: string[] | undefined;
|
1235
1283
|
page?: number | undefined;
|
1284
|
+
ids?: string[] | undefined;
|
1236
1285
|
opportunityTag?: string | undefined;
|
1237
1286
|
};
|
1238
1287
|
headers: unknown;
|
@@ -1489,7 +1538,21 @@ declare const app: Elysia<"", false, {
|
|
1489
1538
|
};
|
1490
1539
|
headers: unknown;
|
1491
1540
|
response: {
|
1492
|
-
200:
|
1541
|
+
200: ({
|
1542
|
+
symbol: string;
|
1543
|
+
name: string | null;
|
1544
|
+
id: string;
|
1545
|
+
icon: string;
|
1546
|
+
chainId: number;
|
1547
|
+
address: string;
|
1548
|
+
decimals: number;
|
1549
|
+
verified: boolean;
|
1550
|
+
isTest: boolean;
|
1551
|
+
} & {
|
1552
|
+
price?: number | null | undefined;
|
1553
|
+
} & {
|
1554
|
+
balance: bigint;
|
1555
|
+
})[];
|
1493
1556
|
};
|
1494
1557
|
};
|
1495
1558
|
};
|
@@ -1511,7 +1574,19 @@ declare const app: Elysia<"", false, {
|
|
1511
1574
|
};
|
1512
1575
|
headers: unknown;
|
1513
1576
|
response: {
|
1514
|
-
200:
|
1577
|
+
200: ({
|
1578
|
+
symbol: string;
|
1579
|
+
name: string | null;
|
1580
|
+
id: string;
|
1581
|
+
icon: string;
|
1582
|
+
chainId: number;
|
1583
|
+
address: string;
|
1584
|
+
decimals: number;
|
1585
|
+
verified: boolean;
|
1586
|
+
isTest: boolean;
|
1587
|
+
} & {
|
1588
|
+
price?: number | null | undefined;
|
1589
|
+
})[];
|
1515
1590
|
};
|
1516
1591
|
};
|
1517
1592
|
};
|
@@ -9,7 +9,7 @@ const fetchCachedData = async (chainIds, onlyLive) => {
|
|
9
9
|
onlyLive = false;
|
10
10
|
}
|
11
11
|
const cacheKeys = chainIds.map(chainId => onlyLive ? `LiveCampaignsOldFormat_${chainId}` : `CampaignsOldFormat_${chainId}`);
|
12
|
-
return await Redis.
|
12
|
+
return await Redis.findMany(cacheKeys);
|
13
13
|
};
|
14
14
|
export async function getClamsInfo(chainIds, AMMs, user, onlyLive) {
|
15
15
|
if (!chainIds && !user && !AMMs) {
|
@@ -34,7 +34,7 @@ export async function getClamsInfo(chainIds, AMMs, user, onlyLive) {
|
|
34
34
|
const cachedData = await fetchCachedData(chainIds, onlyLive);
|
35
35
|
let chainData = [];
|
36
36
|
if (!!user) {
|
37
|
-
chainData = await Redis.
|
37
|
+
chainData = await Redis.findMany(chainIds.map(chainId => `MerklChainData_${chainId}`));
|
38
38
|
}
|
39
39
|
/** Parallel computation of data for each chain */
|
40
40
|
const result = {};
|
@@ -3,7 +3,7 @@ import { AccountingService, ChainDto, DateDto, GetTransactionsQueryModel, Revenu
|
|
3
3
|
import { throwOnInvalidRequiredAddress, throwOnUnsupportedChainId } from "../../../utils/throw";
|
4
4
|
import Elysia from "elysia";
|
5
5
|
export const AccountingController = new Elysia({ prefix: "/accounting", detail: { tags: ["Accounting"], hide: true } })
|
6
|
-
.get("/", async ({ query }) => await AccountingService.
|
6
|
+
.get("/", async ({ query }) => await AccountingService.findMany(query), {
|
7
7
|
query: GetTransactionsQueryModel,
|
8
8
|
headers: AuthorizationHeadersDto,
|
9
9
|
beforeHandle: async ({ headers }) => {
|
@@ -3,7 +3,7 @@ import { ChainId } from "@sdk";
|
|
3
3
|
export declare class AccountingService {
|
4
4
|
static hashId(chainId: ChainId, fromTokenId: string, toTokenId: string, timestamp: number): string;
|
5
5
|
static getTokenId(chainId: number, address: string): string;
|
6
|
-
static
|
6
|
+
static findMany(query: GetTransactionsQueryModel): Promise<{
|
7
7
|
id: string;
|
8
8
|
timestamp: number;
|
9
9
|
chainId: number;
|
@@ -8,7 +8,7 @@ export class AccountingService {
|
|
8
8
|
static getTokenId(chainId, address) {
|
9
9
|
return TokenService.hashId({ chainId, address });
|
10
10
|
}
|
11
|
-
static async
|
11
|
+
static async findMany(query) {
|
12
12
|
return await AccountingRepository.findMany(query);
|
13
13
|
}
|
14
14
|
static async getRevenue() {
|
@@ -138,7 +138,19 @@ export declare const CampaignController: Elysia<"/campaigns", false, {
|
|
138
138
|
id: number;
|
139
139
|
icon: string;
|
140
140
|
};
|
141
|
-
rewardToken:
|
141
|
+
rewardToken: {
|
142
|
+
symbol: string;
|
143
|
+
name: string | null;
|
144
|
+
id: string;
|
145
|
+
icon: string;
|
146
|
+
chainId: number;
|
147
|
+
address: string;
|
148
|
+
decimals: number;
|
149
|
+
verified: boolean;
|
150
|
+
isTest: boolean;
|
151
|
+
} & {
|
152
|
+
price?: number | null | undefined;
|
153
|
+
};
|
142
154
|
distributionChain: {
|
143
155
|
name: string;
|
144
156
|
id: number;
|
@@ -237,7 +237,7 @@ export class CampaignRepository {
|
|
237
237
|
status: {
|
238
238
|
not: RunStatus.PROCESSING,
|
239
239
|
},
|
240
|
-
computedUntil: { lt: currentTime }, // more than 10 min ago
|
240
|
+
computedUntil: { lt: currentTime - 10 * 60 }, // more than 10 min ago
|
241
241
|
},
|
242
242
|
{
|
243
243
|
status: RunStatus.PROCESSING,
|
@@ -58,7 +58,19 @@ export declare abstract class CampaignService {
|
|
58
58
|
id: number;
|
59
59
|
icon: string;
|
60
60
|
};
|
61
|
-
rewardToken:
|
61
|
+
rewardToken: {
|
62
|
+
symbol: string;
|
63
|
+
name: string | null;
|
64
|
+
id: string;
|
65
|
+
icon: string;
|
66
|
+
chainId: number;
|
67
|
+
address: string;
|
68
|
+
decimals: number;
|
69
|
+
verified: boolean;
|
70
|
+
isTest: boolean;
|
71
|
+
} & {
|
72
|
+
price?: number | null | undefined;
|
73
|
+
};
|
62
74
|
distributionChain: {
|
63
75
|
name: string;
|
64
76
|
id: number;
|
@@ -193,7 +205,19 @@ export declare abstract class CampaignService {
|
|
193
205
|
id: number;
|
194
206
|
icon: string;
|
195
207
|
};
|
196
|
-
rewardToken:
|
208
|
+
rewardToken: {
|
209
|
+
symbol: string;
|
210
|
+
name: string | null;
|
211
|
+
id: string;
|
212
|
+
icon: string;
|
213
|
+
chainId: number;
|
214
|
+
address: string;
|
215
|
+
decimals: number;
|
216
|
+
verified: boolean;
|
217
|
+
isTest: boolean;
|
218
|
+
} & {
|
219
|
+
price?: number | null | undefined;
|
220
|
+
};
|
197
221
|
distributionChain: {
|
198
222
|
name: string;
|
199
223
|
id: number;
|
@@ -17,7 +17,7 @@ export const ChainController = new Elysia({ prefix: "/chains", detail: { tags: [
|
|
17
17
|
})
|
18
18
|
// ─── Get All Supported Chains ────────────────────────────────────────
|
19
19
|
.get("/", async ({ query }) => {
|
20
|
-
const chains = await ChainService.
|
20
|
+
const chains = await ChainService.findMany(query);
|
21
21
|
return chains.map(({ Explorer, ...chain }) => ({ explorers: Explorer, ...chain }));
|
22
22
|
}, {
|
23
23
|
query: GetChainQueryDto,
|
@@ -22,7 +22,7 @@ export declare abstract class ChainRepository {
|
|
22
22
|
* @param query object with fields to search for
|
23
23
|
* @returns
|
24
24
|
*/
|
25
|
-
static
|
25
|
+
static findMany(query: ChainSearchDto): Promise<({
|
26
26
|
Explorer: {
|
27
27
|
type: import("../../../../database/api/.generated").$Enums.ExplorerType;
|
28
28
|
url: string;
|
@@ -53,11 +53,6 @@ export declare abstract class ChainRepository {
|
|
53
53
|
chainId: number;
|
54
54
|
}[];
|
55
55
|
}>;
|
56
|
-
static findMany(): Promise<{
|
57
|
-
name: string;
|
58
|
-
id: number;
|
59
|
-
icon: string;
|
60
|
-
}[]>;
|
61
56
|
static findUniqueOrThrow(id: number): Promise<{
|
62
57
|
Explorer: {
|
63
58
|
type: import("../../../../database/api/.generated").$Enums.ExplorerType;
|
@@ -13,14 +13,14 @@ export class ChainRepository {
|
|
13
13
|
}
|
14
14
|
static #transformQueryToPrismaFilters(query) {
|
15
15
|
return {
|
16
|
-
where: { name: { contains: query.name, mode: "insensitive" } },
|
16
|
+
where: { name: query.name ? { contains: query.name, mode: "insensitive" } : undefined },
|
17
17
|
};
|
18
18
|
}
|
19
19
|
/** Returns many chains based on query
|
20
20
|
* @param query object with fields to search for
|
21
21
|
* @returns
|
22
22
|
*/
|
23
|
-
static async
|
23
|
+
static async findMany(query) {
|
24
24
|
const args = ChainRepository.#transformQueryToPrismaFilters(query);
|
25
25
|
return apiDbClient.chain.findMany({
|
26
26
|
include: { Explorer: { take: 5 } },
|
@@ -56,9 +56,6 @@ export class ChainRepository {
|
|
56
56
|
await ExplorerRepository.create(data.id, data.explorerType, data.explorerUrl);
|
57
57
|
return await ChainRepository.findUniqueOrThrow(data.id);
|
58
58
|
}
|
59
|
-
static async findMany() {
|
60
|
-
return apiDbClient.chain.findMany();
|
61
|
-
}
|
62
59
|
static async findUniqueOrThrow(id) {
|
63
60
|
return apiDbClient.chain.findUniqueOrThrow({
|
64
61
|
where: {
|
@@ -12,12 +12,7 @@ export declare abstract class ChainService {
|
|
12
12
|
id: number;
|
13
13
|
icon: string;
|
14
14
|
}) | null>;
|
15
|
-
static findMany(): Promise<{
|
16
|
-
name: string;
|
17
|
-
id: number;
|
18
|
-
icon: string;
|
19
|
-
}[]>;
|
20
|
-
static getMany(query: ChainSearchDto): Promise<({
|
15
|
+
static findMany(query: ChainSearchDto): Promise<({
|
21
16
|
Explorer: {
|
22
17
|
type: import("../../../../database/api/.generated").$Enums.ExplorerType;
|
23
18
|
url: string;
|
@@ -7,11 +7,8 @@ export class ChainService {
|
|
7
7
|
return ChainRepository.read(chainId);
|
8
8
|
}
|
9
9
|
//TODO: determine find vs get nomenclature and cache handling
|
10
|
-
static async findMany() {
|
11
|
-
return await CacheService.wrap(TTLPresets.HOUR_4, ChainRepository.findMany);
|
12
|
-
}
|
13
|
-
static async getMany(query) {
|
14
|
-
return ChainRepository.readMany(query);
|
10
|
+
static async findMany(query) {
|
11
|
+
return await CacheService.wrap(TTLPresets.HOUR_4, ChainRepository.findMany, query);
|
15
12
|
}
|
16
13
|
static async countMany(query) {
|
17
14
|
return ChainRepository.countMany(query);
|
@@ -28,7 +28,10 @@ export class EnsoService {
|
|
28
28
|
.filter(p => query.chainId === undefined || p.chains.some(c => c.id === query.chainId))
|
29
29
|
.map(p => EnsoService.getProtocolId(p.slug))
|
30
30
|
.filter(id => id !== undefined);
|
31
|
-
return await ProtocolService.findMany({
|
31
|
+
return await ProtocolService.findMany({
|
32
|
+
id: protocolIds.length === 1 ? protocolIds[0] : undefined,
|
33
|
+
ids: protocolIds.length > 1 ? protocolIds : undefined,
|
34
|
+
});
|
32
35
|
}
|
33
36
|
static async getTokens(chainId, slug, identifier) {
|
34
37
|
const tokens = await EnsoService.#fetch("/v1/tokens", {
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import { TokenService } from "../token/token.service";
|
2
2
|
import { chainToKyberLabel, dexIdToProtocolId, } from "./kyberzap.model";
|
3
|
-
const KYBERZAP =
|
3
|
+
const KYBERZAP = "https://zap-api.kyberswap.com/";
|
4
4
|
export class KyberZapService {
|
5
5
|
static async #fetch(route, params) {
|
6
6
|
const res = await fetch(`${KYBERZAP}${chainToKyberLabel[params?.chainId] ?? ""}${route}?${params?.query ? new URLSearchParams(params?.query) : ""}`, {
|
@@ -78,8 +78,20 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
|
|
78
78
|
name: string;
|
79
79
|
status: "PAST" | "LIVE" | "SOON";
|
80
80
|
action: import("../../../../database/api/.generated").$Enums.OpportunityAction;
|
81
|
-
tokens:
|
82
|
-
|
81
|
+
tokens: ({
|
82
|
+
symbol: string;
|
83
|
+
name: string | null;
|
84
|
+
id: string;
|
85
|
+
icon: string;
|
86
|
+
chainId: number;
|
87
|
+
address: string;
|
88
|
+
decimals: number;
|
89
|
+
verified: boolean;
|
90
|
+
isTest: boolean;
|
91
|
+
} & {
|
92
|
+
price?: number | null | undefined;
|
93
|
+
})[];
|
94
|
+
mainProtocol: string | undefined;
|
83
95
|
depositUrl: any;
|
84
96
|
tags: string[];
|
85
97
|
};
|
@@ -164,7 +176,19 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
|
|
164
176
|
};
|
165
177
|
id: string;
|
166
178
|
depositUrl: string | undefined;
|
167
|
-
tokens:
|
179
|
+
tokens: ({
|
180
|
+
symbol: string;
|
181
|
+
name: string | null;
|
182
|
+
id: string;
|
183
|
+
icon: string;
|
184
|
+
chainId: number;
|
185
|
+
address: string;
|
186
|
+
decimals: number;
|
187
|
+
verified: boolean;
|
188
|
+
isTest: boolean;
|
189
|
+
} & {
|
190
|
+
price?: number | null | undefined;
|
191
|
+
})[];
|
168
192
|
chain: {
|
169
193
|
name: string;
|
170
194
|
id: number;
|
@@ -451,7 +475,19 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
|
|
451
475
|
id: number;
|
452
476
|
icon: string;
|
453
477
|
};
|
454
|
-
rewardToken:
|
478
|
+
rewardToken: {
|
479
|
+
symbol: string;
|
480
|
+
name: string | null;
|
481
|
+
id: string;
|
482
|
+
icon: string;
|
483
|
+
chainId: number;
|
484
|
+
address: string;
|
485
|
+
decimals: number;
|
486
|
+
verified: boolean;
|
487
|
+
isTest: boolean;
|
488
|
+
} & {
|
489
|
+
price?: number | null | undefined;
|
490
|
+
};
|
455
491
|
distributionChain: {
|
456
492
|
name: string;
|
457
493
|
id: number;
|
@@ -45,7 +45,7 @@ export const OpportunityController = new Elysia({
|
|
45
45
|
detail: { hide: true },
|
46
46
|
})
|
47
47
|
// ─── Get All Opportunities ───────────────────────────────────────────
|
48
|
-
.get("/", async ({ query }) => await OpportunityService.
|
48
|
+
.get("/", async ({ query }) => await OpportunityService.findMany(query), {
|
49
49
|
query: GetOpportunitiesQueryDto,
|
50
50
|
detail: {
|
51
51
|
description: `**Retrieve Multiple Opportunities**
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import { type AprRecord } from "../apr/apr.model";
|
2
2
|
import { type Campaign } from "../campaign/campaign.model";
|
3
3
|
import type { Resource } from "../prisma";
|
4
|
-
import { type Protocol
|
4
|
+
import { type Protocol } from "../protocol/protocol.model";
|
5
5
|
import { type DailyRewardsRecord } from "../reward/reward.model";
|
6
6
|
import { type Token } from "../token/token.model";
|
7
7
|
import { type TvlRecord } from "../tvl/tvl.model";
|
@@ -32,7 +32,7 @@ export type OpportunityMetadata = {
|
|
32
32
|
chainId: number;
|
33
33
|
address: string;
|
34
34
|
}[];
|
35
|
-
mainProtocol?:
|
35
|
+
mainProtocol?: string;
|
36
36
|
tags?: string[];
|
37
37
|
};
|
38
38
|
export type OpportunityUnique = {
|