@merkl/api 0.10.249 → 0.10.250
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/src/eden/index.d.ts +9 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/modules/v4/claims/claims.service.js +1 -1
- package/dist/src/modules/v4/opportunity/opportunity.controller.d.ts +3 -0
- package/dist/src/modules/v4/opportunity/opportunity.model.d.ts +1 -0
- package/dist/src/modules/v4/opportunity/opportunity.model.js +1 -0
- package/dist/src/modules/v4/opportunity/opportunity.repository.js +15 -2
- package/dist/src/modules/v4/router.d.ts +3 -0
- package/dist/src/modules/v4/user/user.controller.js +4 -1
- package/dist/src/modules/v4/user/user.service.d.ts +1 -0
- package/dist/src/modules/v4/user/user.service.js +16 -0
- package/dist/src/routes/v3/rewards.js +1 -1
- package/dist/src/routes/v3/userRewards.js +1 -1
- package/dist/tsconfig.package.tsbuildinfo +1 -1
- package/package.json +1 -1
package/dist/src/eden/index.d.ts
CHANGED
@@ -406,6 +406,7 @@ declare const eden: {
|
|
406
406
|
page?: number | undefined;
|
407
407
|
chainId?: string | undefined;
|
408
408
|
action?: string | undefined;
|
409
|
+
creatorAddress?: string | undefined;
|
409
410
|
mainProtocolId?: string | undefined;
|
410
411
|
order?: string | undefined;
|
411
412
|
test?: boolean | undefined;
|
@@ -516,6 +517,7 @@ declare const eden: {
|
|
516
517
|
page?: number | undefined;
|
517
518
|
chainId?: string | undefined;
|
518
519
|
action?: string | undefined;
|
520
|
+
creatorAddress?: string | undefined;
|
519
521
|
mainProtocolId?: string | undefined;
|
520
522
|
order?: string | undefined;
|
521
523
|
test?: boolean | undefined;
|
@@ -541,6 +543,7 @@ declare const eden: {
|
|
541
543
|
page?: number | undefined;
|
542
544
|
chainId?: string | undefined;
|
543
545
|
action?: string | undefined;
|
546
|
+
creatorAddress?: string | undefined;
|
544
547
|
mainProtocolId?: string | undefined;
|
545
548
|
order?: string | undefined;
|
546
549
|
test?: boolean | undefined;
|
@@ -2929,6 +2932,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
|
|
2929
2932
|
page?: number | undefined;
|
2930
2933
|
chainId?: string | undefined;
|
2931
2934
|
action?: string | undefined;
|
2935
|
+
creatorAddress?: string | undefined;
|
2932
2936
|
mainProtocolId?: string | undefined;
|
2933
2937
|
order?: string | undefined;
|
2934
2938
|
test?: boolean | undefined;
|
@@ -3044,6 +3048,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
|
|
3044
3048
|
page?: number | undefined;
|
3045
3049
|
chainId?: string | undefined;
|
3046
3050
|
action?: string | undefined;
|
3051
|
+
creatorAddress?: string | undefined;
|
3047
3052
|
mainProtocolId?: string | undefined;
|
3048
3053
|
order?: string | undefined;
|
3049
3054
|
test?: boolean | undefined;
|
@@ -3340,6 +3345,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
|
|
3340
3345
|
page?: number | undefined;
|
3341
3346
|
chainId?: string | undefined;
|
3342
3347
|
action?: string | undefined;
|
3348
|
+
creatorAddress?: string | undefined;
|
3343
3349
|
mainProtocolId?: string | undefined;
|
3344
3350
|
order?: string | undefined;
|
3345
3351
|
test?: boolean | undefined;
|
@@ -6598,6 +6604,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
|
|
6598
6604
|
page?: number | undefined;
|
6599
6605
|
chainId?: string | undefined;
|
6600
6606
|
action?: string | undefined;
|
6607
|
+
creatorAddress?: string | undefined;
|
6601
6608
|
mainProtocolId?: string | undefined;
|
6602
6609
|
order?: string | undefined;
|
6603
6610
|
test?: boolean | undefined;
|
@@ -6708,6 +6715,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
|
|
6708
6715
|
page?: number | undefined;
|
6709
6716
|
chainId?: string | undefined;
|
6710
6717
|
action?: string | undefined;
|
6718
|
+
creatorAddress?: string | undefined;
|
6711
6719
|
mainProtocolId?: string | undefined;
|
6712
6720
|
order?: string | undefined;
|
6713
6721
|
test?: boolean | undefined;
|
@@ -6733,6 +6741,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
|
|
6733
6741
|
page?: number | undefined;
|
6734
6742
|
chainId?: string | undefined;
|
6735
6743
|
action?: string | undefined;
|
6744
|
+
creatorAddress?: string | undefined;
|
6736
6745
|
mainProtocolId?: string | undefined;
|
6737
6746
|
order?: string | undefined;
|
6738
6747
|
test?: boolean | undefined;
|
package/dist/src/index.d.ts
CHANGED
@@ -187,6 +187,7 @@ declare const app: Elysia<"", false, {
|
|
187
187
|
page?: number | undefined;
|
188
188
|
chainId?: string | undefined;
|
189
189
|
action?: string | undefined;
|
190
|
+
creatorAddress?: string | undefined;
|
190
191
|
mainProtocolId?: string | undefined;
|
191
192
|
order?: string | undefined;
|
192
193
|
test?: boolean | undefined;
|
@@ -302,6 +303,7 @@ declare const app: Elysia<"", false, {
|
|
302
303
|
page?: number | undefined;
|
303
304
|
chainId?: string | undefined;
|
304
305
|
action?: string | undefined;
|
306
|
+
creatorAddress?: string | undefined;
|
305
307
|
mainProtocolId?: string | undefined;
|
306
308
|
order?: string | undefined;
|
307
309
|
test?: boolean | undefined;
|
@@ -598,6 +600,7 @@ declare const app: Elysia<"", false, {
|
|
598
600
|
page?: number | undefined;
|
599
601
|
chainId?: string | undefined;
|
600
602
|
action?: string | undefined;
|
603
|
+
creatorAddress?: string | undefined;
|
601
604
|
mainProtocolId?: string | undefined;
|
602
605
|
order?: string | undefined;
|
603
606
|
test?: boolean | undefined;
|
@@ -5,7 +5,7 @@ export class ClaimService {
|
|
5
5
|
// ─── Get Historical Claims ─────────────────────────────────────────────────
|
6
6
|
static async getHistoricalClaims(params, chainFilter = []) {
|
7
7
|
const roots = (await MerklRootService.fetchAll()).map(r => r.live);
|
8
|
-
const rewards = await RewardService.getByRecipient(params.address, roots, true, chainFilter);
|
8
|
+
const rewards = await RewardService.getByRecipient(params.address, roots, true, true, chainFilter);
|
9
9
|
const filteredRewards = chainFilter.length
|
10
10
|
? rewards.filter(reward => chainFilter.includes(reward.RewardToken.chainId))
|
11
11
|
: rewards;
|
@@ -56,6 +56,7 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
|
|
56
56
|
page?: number | undefined;
|
57
57
|
chainId?: string | undefined;
|
58
58
|
action?: string | undefined;
|
59
|
+
creatorAddress?: string | undefined;
|
59
60
|
mainProtocolId?: string | undefined;
|
60
61
|
order?: string | undefined;
|
61
62
|
test?: boolean | undefined;
|
@@ -171,6 +172,7 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
|
|
171
172
|
page?: number | undefined;
|
172
173
|
chainId?: string | undefined;
|
173
174
|
action?: string | undefined;
|
175
|
+
creatorAddress?: string | undefined;
|
174
176
|
mainProtocolId?: string | undefined;
|
175
177
|
order?: string | undefined;
|
176
178
|
test?: boolean | undefined;
|
@@ -467,6 +469,7 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
|
|
467
469
|
page?: number | undefined;
|
468
470
|
chainId?: string | undefined;
|
469
471
|
action?: string | undefined;
|
472
|
+
creatorAddress?: string | undefined;
|
470
473
|
mainProtocolId?: string | undefined;
|
471
474
|
order?: string | undefined;
|
472
475
|
test?: boolean | undefined;
|
@@ -278,6 +278,7 @@ export declare const GetOpportunitiesQueryDto: import("@sinclair/typebox").TObje
|
|
278
278
|
name: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
279
279
|
chainId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRegExp>;
|
280
280
|
action: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRegExp>;
|
281
|
+
creatorAddress: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
281
282
|
tags: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
282
283
|
test: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
283
284
|
minimumTvl: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
@@ -51,6 +51,7 @@ export const GetOpportunitiesQueryDto = t.Object({
|
|
51
51
|
action: t.Optional(t.RegExp(/^(POOL|HOLD|DROP|LEND|BORROW)(,(POOL|HOLD|DROP|LEND|BORROW)){0,4}$/, {
|
52
52
|
description: "A comma seprated list actions. Legal values are: `POOL`, `HOLD`, `DROP`, `LEND`, `BORROW`",
|
53
53
|
})),
|
54
|
+
creatorAddress: t.Optional(t.String({ description: "Filter by creator address" })),
|
54
55
|
tags: t.Optional(t.String({ description: "Filter by tag" })),
|
55
56
|
test: t.Optional(t.Boolean({ description: "Include opportunities with test campaigns" })),
|
56
57
|
minimumTvl: t.Optional(t.Number({ description: "Minimum TVL threshhold in USD" })),
|
@@ -137,6 +137,7 @@ export class OpportunityRepository {
|
|
137
137
|
const sort = (query.sort === "rewards" ? "dailyRewards" : query.sort) ?? "dailyRewards";
|
138
138
|
const order = query.order ?? "desc";
|
139
139
|
const test = query.test ?? false;
|
140
|
+
const creatorAddress = query.creatorAddress ?? null;
|
140
141
|
const noFilters = Object.values(filters).every(v => v === undefined);
|
141
142
|
const tokensFilters = tokens?.map(symbol => ({
|
142
143
|
Tokens: { some: { symbol: { equals: symbol, mode: "insensitive" } } },
|
@@ -162,7 +163,16 @@ export class OpportunityRepository {
|
|
162
163
|
status: !status ? undefined : { in: status },
|
163
164
|
},
|
164
165
|
{ mainProtocolId: !protocols ? undefined : { in: protocols } },
|
165
|
-
{
|
166
|
+
{
|
167
|
+
Campaigns: test || !creatorAddress
|
168
|
+
? undefined
|
169
|
+
: {
|
170
|
+
some: {
|
171
|
+
RewardToken: !test ? { isTest: false } : undefined,
|
172
|
+
creatorAddress: creatorAddress ? creatorAddress : undefined,
|
173
|
+
},
|
174
|
+
},
|
175
|
+
},
|
166
176
|
],
|
167
177
|
},
|
168
178
|
};
|
@@ -172,6 +182,7 @@ export class OpportunityRepository {
|
|
172
182
|
const { page: _page, items: _items } = query;
|
173
183
|
const page = _page ? _page : 0;
|
174
184
|
const items = _items ? _items : 20;
|
185
|
+
const test = query.test ?? false;
|
175
186
|
const args = OpportunityRepository.#transformQueryToPrismaFilters(query);
|
176
187
|
return await apiDbClient.opportunity.findMany({
|
177
188
|
take: items,
|
@@ -181,7 +192,9 @@ export class OpportunityRepository {
|
|
181
192
|
MainProtocol: true,
|
182
193
|
Chain: true,
|
183
194
|
Protocols: true,
|
184
|
-
Tokens:
|
195
|
+
Tokens: {
|
196
|
+
where: !test ? { isTest: false } : undefined,
|
197
|
+
},
|
185
198
|
},
|
186
199
|
...args,
|
187
200
|
});
|
@@ -65,6 +65,7 @@ export declare const v4: Elysia<"/v4", false, {
|
|
65
65
|
page?: number | undefined;
|
66
66
|
chainId?: string | undefined;
|
67
67
|
action?: string | undefined;
|
68
|
+
creatorAddress?: string | undefined;
|
68
69
|
mainProtocolId?: string | undefined;
|
69
70
|
order?: string | undefined;
|
70
71
|
test?: boolean | undefined;
|
@@ -180,6 +181,7 @@ export declare const v4: Elysia<"/v4", false, {
|
|
180
181
|
page?: number | undefined;
|
181
182
|
chainId?: string | undefined;
|
182
183
|
action?: string | undefined;
|
184
|
+
creatorAddress?: string | undefined;
|
183
185
|
mainProtocolId?: string | undefined;
|
184
186
|
order?: string | undefined;
|
185
187
|
test?: boolean | undefined;
|
@@ -476,6 +478,7 @@ export declare const v4: Elysia<"/v4", false, {
|
|
476
478
|
page?: number | undefined;
|
477
479
|
chainId?: string | undefined;
|
478
480
|
action?: string | undefined;
|
481
|
+
creatorAddress?: string | undefined;
|
479
482
|
mainProtocolId?: string | undefined;
|
480
483
|
order?: string | undefined;
|
481
484
|
test?: boolean | undefined;
|
@@ -64,7 +64,10 @@ export const UserController = new Elysia({ prefix: "/users", detail: { tags: ["U
|
|
64
64
|
detail: { hide: true },
|
65
65
|
})
|
66
66
|
// ─── Sync Creator Tags with Engine DB ─────────────────────────────────
|
67
|
-
.post("/sync", async () =>
|
67
|
+
.post("/sync", async () => {
|
68
|
+
await UserService.syncTags();
|
69
|
+
await UserService.syncOpportunityTags();
|
70
|
+
}, {
|
68
71
|
headers: AuthorizationHeadersDto,
|
69
72
|
beforeHandle: BackOfficeGuard,
|
70
73
|
detail: { hide: true },
|
@@ -1,5 +1,6 @@
|
|
1
1
|
import { log } from "../../../utils/logger";
|
2
2
|
import { engineDbClient } from "../../../utils/prisma";
|
3
|
+
import { OpportunityService } from "../opportunity";
|
3
4
|
import { UserRepository } from "./user.repository";
|
4
5
|
// ─── Users Services ──────────────────────────────────────────────────────────
|
5
6
|
export class UserService {
|
@@ -19,6 +20,9 @@ export class UserService {
|
|
19
20
|
return await UserRepository.createMany(users);
|
20
21
|
}
|
21
22
|
static async updateTags(user, tags) {
|
23
|
+
if (!(await UserRepository.findUnique(user))) {
|
24
|
+
await UserRepository.create({ address: user, tags: [] });
|
25
|
+
}
|
22
26
|
return await UserRepository.updateTags(user, tags);
|
23
27
|
}
|
24
28
|
static async syncTags() {
|
@@ -47,4 +51,16 @@ export class UserService {
|
|
47
51
|
}
|
48
52
|
}
|
49
53
|
}
|
54
|
+
static async syncOpportunityTags() {
|
55
|
+
const users = await UserRepository.findManyWithTags();
|
56
|
+
for (const user of users) {
|
57
|
+
const opportunities = await OpportunityService.getMany({ creatorAddress: user.address });
|
58
|
+
for (const opportunity of opportunities) {
|
59
|
+
if (!user.tags.every(tag => opportunity.tags.includes(tag))) {
|
60
|
+
log.local(`updating tags for opportunity ${opportunity.id}: adding ${user.tags.join(",")}`);
|
61
|
+
await OpportunityService.update(opportunity.id, { tags: [...opportunity.tags, ...user.tags] });
|
62
|
+
}
|
63
|
+
}
|
64
|
+
}
|
65
|
+
}
|
50
66
|
}
|
@@ -27,7 +27,7 @@ export default (app) => app.use(checkQueryAddressValidity()).get("/rewards", asy
|
|
27
27
|
}
|
28
28
|
const user = query.user;
|
29
29
|
// @Warning: this is not taking into account the creator tag filter
|
30
|
-
const v4Res = await RewardService.getUserRewardsByChain(user, false, chainIds);
|
30
|
+
const v4Res = await RewardService.getUserRewardsByChain(user, false, chainIds, null, true);
|
31
31
|
const v3Res = RewardConvertorService.convertV4toRewardV3(v4Res);
|
32
32
|
return v3Res;
|
33
33
|
}, { query, tags: ["Rewards"] });
|
@@ -45,7 +45,7 @@ export default (app) => app
|
|
45
45
|
}
|
46
46
|
}
|
47
47
|
// @Warning: this is not taking into account the mainParameter filter
|
48
|
-
const v4Res = await RewardService.getUserRewardsByChain(user, false, [chainId], query.reloadChainId ?? null);
|
48
|
+
const v4Res = await RewardService.getUserRewardsByChain(user, false, [chainId], query.reloadChainId ?? null, true);
|
49
49
|
const v3Res = RewardConvertorService.convertV4toUserRewardV3(v4Res, proof);
|
50
50
|
return v3Res;
|
51
51
|
}, {
|