@merkl/api 0.10.353 → 0.10.355
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/database/api/.generated/edge.js +10 -4
- package/dist/database/api/.generated/index-browser.js +7 -1
- package/dist/database/api/.generated/index.d.ts +7 -1
- package/dist/database/api/.generated/index.js +10 -4
- package/dist/database/api/.generated/package.json +1 -1
- package/dist/database/api/.generated/schema.prisma +6 -0
- package/dist/database/api/.generated/wasm.js +7 -1
- package/dist/src/eden/index.d.ts +21 -21
- package/dist/src/index.d.ts +7 -7
- package/dist/src/jobs/breakdowns.d.ts +1 -0
- package/dist/src/jobs/breakdowns.js +55 -0
- package/dist/src/jobs/etl/pendings.d.ts +1 -0
- package/dist/src/jobs/etl/pendings.js +74 -0
- package/dist/src/jobs/etl/reward-breakdowns.d.ts +1 -0
- package/dist/src/jobs/etl/reward-breakdowns.js +82 -0
- package/dist/src/jobs/etl/rewards.d.ts +1 -0
- package/dist/src/jobs/etl/rewards.js +102 -0
- package/dist/src/jobs/rewards.d.ts +1 -0
- package/dist/src/jobs/rewards.js +74 -0
- package/dist/src/modules/v4/bucket/bucket.service.d.ts +4 -1
- package/dist/src/modules/v4/bucket/bucket.service.js +83 -2
- package/dist/src/modules/v4/campaign/campaign.controller.d.ts +2 -2
- package/dist/src/modules/v4/campaign/campaign.model.d.ts +3 -0
- package/dist/src/modules/v4/dynamicData/dynamicData.controller.d.ts +2 -2
- package/dist/src/modules/v4/dynamicData/dynamicData.model.d.ts +6 -0
- package/dist/src/modules/v4/opportunity/opportunity.controller.d.ts +3 -3
- package/dist/src/modules/v4/opportunity/opportunity.model.d.ts +6 -0
- package/dist/src/modules/v4/opportunity/opportunity.service.d.ts +2 -2
- package/dist/src/modules/v4/opportunity/opportunity.service.js +4 -0
- package/dist/src/modules/v4/opportunity/subservices/getHyperdriveMetadata.service.d.ts +3 -0
- package/dist/src/modules/v4/opportunity/subservices/getHyperdriveMetadata.service.js +15 -0
- package/dist/src/modules/v4/programPayload/programPayload.repository.d.ts +4 -1
- package/dist/src/modules/v4/programPayload/programPayload.repository.js +101 -16
- package/dist/src/modules/v4/programPayload/programPayload.service.d.ts +3 -3
- package/dist/src/modules/v4/programPayload/programPayload.service.js +25 -11
- package/dist/src/modules/v4/protocol/protocol.model.d.ts +1 -1
- package/dist/src/modules/v4/protocol/protocol.model.js +1 -0
- package/dist/src/modules/v4/router.d.ts +7 -7
- package/dist/tsconfig.package.tsbuildinfo +1 -1
- package/package.json +4 -2
@@ -0,0 +1 @@
|
|
1
|
+
export declare const writeRewardsToAPI: (chainId: number, root: string) => Promise<void>;
|
@@ -0,0 +1,74 @@
|
|
1
|
+
import { TokenService } from "../modules/v4";
|
2
|
+
import { BucketService } from "../modules/v4/bucket/bucket.service";
|
3
|
+
import { RewardService } from "../modules/v4/reward";
|
4
|
+
import { log } from "../utils/logger";
|
5
|
+
import { apiDbClient } from "../utils/prisma";
|
6
|
+
import { HOUR } from "@sdk";
|
7
|
+
import moment from "moment";
|
8
|
+
import { writeBreakdownsToAPI } from "./breakdowns";
|
9
|
+
export const writeRewardsToAPI = async (chainId, root) => {
|
10
|
+
const start = moment().unix();
|
11
|
+
const environmentName = process.env.ENV === "staging" ? "staging" : "production";
|
12
|
+
const now = moment().unix();
|
13
|
+
// Upsert root
|
14
|
+
await apiDbClient.merklRoot.upsert({
|
15
|
+
create: {
|
16
|
+
root,
|
17
|
+
chainId,
|
18
|
+
epoch: Math.floor(now / HOUR),
|
19
|
+
timestamp: now,
|
20
|
+
},
|
21
|
+
update: {},
|
22
|
+
where: {
|
23
|
+
root,
|
24
|
+
},
|
25
|
+
});
|
26
|
+
// Read reward stream and populate the table
|
27
|
+
const rewardBatches = [[]];
|
28
|
+
const rewardBatchPromises = [];
|
29
|
+
let currentRewardBatchIndex = 0;
|
30
|
+
const pushRewards = async (index) => {
|
31
|
+
log.local(`pushing rewards batch ${index} (${rewardBatches[index].length} points) to API DB`);
|
32
|
+
// Upsert users in case they don't exist yet
|
33
|
+
await apiDbClient.user.createMany({
|
34
|
+
data: rewardBatches[index].map(r => {
|
35
|
+
return {
|
36
|
+
address: r.recipient,
|
37
|
+
};
|
38
|
+
}),
|
39
|
+
skipDuplicates: true,
|
40
|
+
});
|
41
|
+
const rewardsToCreate = rewardBatches[index].map(reward => {
|
42
|
+
const rewardTokenId = TokenService.hashId({ chainId, address: reward.rewardToken });
|
43
|
+
const id = RewardService.hashId(root, reward.recipient, rewardTokenId);
|
44
|
+
return {
|
45
|
+
id,
|
46
|
+
root: reward.root,
|
47
|
+
amount: reward.amount,
|
48
|
+
pending: reward.pending,
|
49
|
+
claimed: reward.claimed,
|
50
|
+
recipient: reward.recipient,
|
51
|
+
rewardTokenId,
|
52
|
+
proofs: reward.proofs,
|
53
|
+
};
|
54
|
+
});
|
55
|
+
return (await apiDbClient.reward.createMany({
|
56
|
+
data: rewardsToCreate,
|
57
|
+
skipDuplicates: true, // To avoid revert if data already exists
|
58
|
+
})).count;
|
59
|
+
};
|
60
|
+
await BucketService.readStreamFromBucket(`rewards/${chainId}-${root}.gz`, `merkl-rewards-lake-${environmentName}`, `merkl-data-${environmentName}`, async (x) => {
|
61
|
+
rewardBatches[currentRewardBatchIndex].push(JSON.parse(x));
|
62
|
+
if (rewardBatches[currentRewardBatchIndex].length >= 20_000) {
|
63
|
+
rewardBatchPromises.push(pushRewards(currentRewardBatchIndex));
|
64
|
+
currentRewardBatchIndex++;
|
65
|
+
rewardBatches.push([]);
|
66
|
+
}
|
67
|
+
return;
|
68
|
+
});
|
69
|
+
// Final batch
|
70
|
+
rewardBatchPromises.push(pushRewards(currentRewardBatchIndex));
|
71
|
+
const rewardsCreated = (await Promise.all(rewardBatchPromises)).reduce((acc, x) => acc + x, 0);
|
72
|
+
log.info(`✅ Successfully created ${rewardsCreated} rewards in ${moment().unix() - start}sec`);
|
73
|
+
await writeBreakdownsToAPI(chainId, root);
|
74
|
+
};
|
@@ -1,5 +1,8 @@
|
|
1
1
|
import type { SaveData } from "node_modules/@google-cloud/storage/build/esm/src/file";
|
2
2
|
export declare abstract class BucketService {
|
3
|
-
private static storage;
|
4
3
|
static upload(bucketName: string, filename: string, data: SaveData, isPublic: boolean): Promise<string>;
|
4
|
+
static writeStreamToBucket<T>(data: T[], fileName: string, bucketName: string, projectID?: string, hook?: (data: T) => string, isPublic?: boolean, withLog?: boolean): Promise<void>;
|
5
|
+
static readStreamFromBucket<T>(fileName: string, bucketName: string, projectID?: string, hook?: (line: string) => T, withLog?: boolean): Promise<T[]>;
|
6
|
+
static deleteFile(fileName: string, bucketName: string, projectID: string): Promise<void>;
|
7
|
+
static exists(fileName: string, bucketName: string, projectID: string): Promise<boolean>;
|
5
8
|
}
|
@@ -1,11 +1,92 @@
|
|
1
|
+
import { log } from "../../../utils/logger";
|
1
2
|
import { Storage } from "@google-cloud/storage";
|
2
3
|
export class BucketService {
|
3
|
-
static storage = new Storage({ projectId: "angle-production-1" });
|
4
4
|
static async upload(bucketName, filename, data, isPublic) {
|
5
|
-
const
|
5
|
+
const storage = new Storage({ projectId: "angle-production-1" });
|
6
|
+
const file = await storage.bucket(bucketName).file(filename);
|
6
7
|
await file.save(data);
|
7
8
|
if (isPublic)
|
8
9
|
await file.makePublic();
|
9
10
|
return `https://storage.googleapis.com/${bucketName}/${filename}`;
|
10
11
|
}
|
12
|
+
static async writeStreamToBucket(data, fileName, bucketName, projectID, hook = JSON.stringify, isPublic = false, withLog = true) {
|
13
|
+
const storage = new Storage({ projectId: projectID });
|
14
|
+
const bucket = storage.bucket(bucketName);
|
15
|
+
const file = bucket.file(fileName);
|
16
|
+
const [exist] = await file.exists();
|
17
|
+
if (exist) {
|
18
|
+
await file.delete();
|
19
|
+
}
|
20
|
+
await file.save("", { resumable: false });
|
21
|
+
await file.setMetadata({
|
22
|
+
cacheControl: "public, max-age=300",
|
23
|
+
});
|
24
|
+
if (isPublic) {
|
25
|
+
await file.makePublic();
|
26
|
+
}
|
27
|
+
const writeStream = file.createWriteStream({
|
28
|
+
resumable: false,
|
29
|
+
gzip: true, // Enable gzip compression
|
30
|
+
});
|
31
|
+
const streamPromise = new Promise((resolve, reject) => {
|
32
|
+
writeStream.on("error", reject);
|
33
|
+
writeStream.on("finish", resolve);
|
34
|
+
});
|
35
|
+
for (const d of data) {
|
36
|
+
await writeStream.write(`${hook(d)}\n`);
|
37
|
+
}
|
38
|
+
await writeStream.end();
|
39
|
+
await streamPromise;
|
40
|
+
withLog && log.local(`✅ successfully updated https://storage.cloud.google.com/${bucketName}/${fileName}`);
|
41
|
+
}
|
42
|
+
static async readStreamFromBucket(fileName, bucketName, projectID, hook = line => JSON.parse(line), withLog = true) {
|
43
|
+
const storage = new Storage({ projectId: projectID });
|
44
|
+
const bucket = storage.bucket(bucketName);
|
45
|
+
const file = bucket.file(fileName);
|
46
|
+
const [exists] = await file.exists();
|
47
|
+
if (!exists) {
|
48
|
+
throw new Error(`File ${fileName} does not exist in bucket ${bucketName}`);
|
49
|
+
}
|
50
|
+
return new Promise((resolve, reject) => {
|
51
|
+
const data = [];
|
52
|
+
let buffer = "";
|
53
|
+
file
|
54
|
+
.createReadStream({
|
55
|
+
decompress: true,
|
56
|
+
})
|
57
|
+
.on("data", async (chunk) => {
|
58
|
+
// instead of using callback functions here, we could use pipe streams
|
59
|
+
buffer += chunk.toString();
|
60
|
+
const lines = buffer.split("\n");
|
61
|
+
buffer = lines.pop() || "";
|
62
|
+
for (const line of lines) {
|
63
|
+
if (line.trim()) {
|
64
|
+
const res = hook(line);
|
65
|
+
data.push(res);
|
66
|
+
}
|
67
|
+
}
|
68
|
+
})
|
69
|
+
.on("error", reject)
|
70
|
+
.on("end", async () => {
|
71
|
+
if (buffer.trim()) {
|
72
|
+
const res = hook(buffer);
|
73
|
+
data.push(res);
|
74
|
+
}
|
75
|
+
withLog &&
|
76
|
+
log.local(`✅ Successfully read ${data.length} items from https://storage.cloud.google.com/${bucketName}/${fileName}`);
|
77
|
+
resolve(data);
|
78
|
+
});
|
79
|
+
});
|
80
|
+
}
|
81
|
+
static async deleteFile(fileName, bucketName, projectID) {
|
82
|
+
const storage = new Storage({ projectId: projectID });
|
83
|
+
const bucket = storage.bucket(bucketName);
|
84
|
+
const file = bucket.file(fileName);
|
85
|
+
await file.delete();
|
86
|
+
}
|
87
|
+
static async exists(fileName, bucketName, projectID) {
|
88
|
+
const storage = new Storage({ projectId: projectID });
|
89
|
+
const [exists] = await storage.bucket(bucketName).file(fileName).exists();
|
90
|
+
return exists;
|
91
|
+
}
|
11
92
|
}
|
@@ -112,7 +112,7 @@ export declare const CampaignController: Elysia<"/campaigns", false, {
|
|
112
112
|
body: unknown;
|
113
113
|
params: {};
|
114
114
|
query: {
|
115
|
-
type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | undefined;
|
115
|
+
type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR" | undefined;
|
116
116
|
items?: number | undefined;
|
117
117
|
subType?: number | undefined;
|
118
118
|
page?: number | undefined;
|
@@ -184,7 +184,7 @@ export declare const CampaignController: Elysia<"/campaigns", false, {
|
|
184
184
|
body: unknown;
|
185
185
|
params: {};
|
186
186
|
query: {
|
187
|
-
type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | undefined;
|
187
|
+
type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR" | undefined;
|
188
188
|
items?: number | undefined;
|
189
189
|
subType?: number | undefined;
|
190
190
|
page?: number | undefined;
|
@@ -141,6 +141,9 @@ export declare const GetCampaignQueryDto: import("@sinclair/typebox").TObject<{
|
|
141
141
|
ERC20LOGPROCESSOR: "ERC20LOGPROCESSOR";
|
142
142
|
ERC20REBASELOGPROCESSOR: "ERC20REBASELOGPROCESSOR";
|
143
143
|
VEST: "VEST";
|
144
|
+
ERC20_FIX_APR: "ERC20_FIX_APR";
|
145
|
+
HYPERDRIVELOGPROCESSOR: "HYPERDRIVELOGPROCESSOR";
|
146
|
+
HYPERDRIVELOGFIXPROCESSOR: "HYPERDRIVELOGFIXPROCESSOR";
|
144
147
|
}>>;
|
145
148
|
subType: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
146
149
|
campaignId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
@@ -61,7 +61,7 @@ export declare const DynamicDataController: Elysia<"/dynamic-data", false, {
|
|
61
61
|
rewardTokenAddress?: string | undefined;
|
62
62
|
distributionChain?: {} | undefined;
|
63
63
|
opportunityIdentifier?: string | undefined;
|
64
|
-
type: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST";
|
64
|
+
type: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR";
|
65
65
|
params: {};
|
66
66
|
computeChainId: number;
|
67
67
|
};
|
@@ -84,7 +84,7 @@ export declare const DynamicDataController: Elysia<"/dynamic-data", false, {
|
|
84
84
|
body: unknown;
|
85
85
|
params: {};
|
86
86
|
query: {
|
87
|
-
type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | undefined;
|
87
|
+
type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR" | undefined;
|
88
88
|
items?: number | undefined;
|
89
89
|
subType?: number | undefined;
|
90
90
|
page?: number | undefined;
|
@@ -37,6 +37,9 @@ export declare const SimplifiedCampaignDto: import("@sinclair/typebox").TObject<
|
|
37
37
|
ERC20LOGPROCESSOR: "ERC20LOGPROCESSOR";
|
38
38
|
ERC20REBASELOGPROCESSOR: "ERC20REBASELOGPROCESSOR";
|
39
39
|
VEST: "VEST";
|
40
|
+
ERC20_FIX_APR: "ERC20_FIX_APR";
|
41
|
+
HYPERDRIVELOGPROCESSOR: "HYPERDRIVELOGPROCESSOR";
|
42
|
+
HYPERDRIVELOGFIXPROCESSOR: "HYPERDRIVELOGFIXPROCESSOR";
|
40
43
|
}>;
|
41
44
|
subType: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
42
45
|
rewardTokenAddress: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
@@ -82,6 +85,9 @@ export declare const FilledCampaignDto: import("@sinclair/typebox").TObject<{
|
|
82
85
|
ERC20LOGPROCESSOR: "ERC20LOGPROCESSOR";
|
83
86
|
ERC20REBASELOGPROCESSOR: "ERC20REBASELOGPROCESSOR";
|
84
87
|
VEST: "VEST";
|
88
|
+
ERC20_FIX_APR: "ERC20_FIX_APR";
|
89
|
+
HYPERDRIVELOGPROCESSOR: "HYPERDRIVELOGPROCESSOR";
|
90
|
+
HYPERDRIVELOGFIXPROCESSOR: "HYPERDRIVELOGFIXPROCESSOR";
|
85
91
|
}>;
|
86
92
|
subType: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
87
93
|
rewardTokenAddress: import("@sinclair/typebox").TString;
|
@@ -21,7 +21,7 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
|
|
21
21
|
depositUrl?: string | undefined;
|
22
22
|
protocols?: string[] | undefined;
|
23
23
|
mainProtocol?: string | undefined;
|
24
|
-
type: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST";
|
24
|
+
type: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR";
|
25
25
|
tokens: {
|
26
26
|
chainId: number;
|
27
27
|
address: string;
|
@@ -29,7 +29,7 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
|
|
29
29
|
status: "NONE" | "PAST" | "LIVE" | "SOON";
|
30
30
|
identifier: string;
|
31
31
|
chainId: number;
|
32
|
-
action: "INVALID" | "POOL" | "HOLD" | "DROP" | "LEND" | "BORROW";
|
32
|
+
action: "INVALID" | "POOL" | "HOLD" | "DROP" | "LEND" | "BORROW" | "LP" | "LONG" | "SHORT";
|
33
33
|
};
|
34
34
|
params: {};
|
35
35
|
query: unknown;
|
@@ -90,7 +90,7 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
|
|
90
90
|
} & {
|
91
91
|
price?: number | null | undefined;
|
92
92
|
})[];
|
93
|
-
mainProtocol: "morpho" | "arthswap" | "baseswap" | "camelot" | "crust" | "fenix" | "horiza" | "izumi" | "kim" | "pancakeswap-v3" | "quickswap-algebra" | "quickswap-uni" | "ramses" | "retro" | "stryke" | "stryke-pcs" | "stryke-sushi" | "sushiswap-v3" | "swapr" | "thruster" | "uniswap-v3" | "voltage" | "zero" | "koi" | "supswap-v3" | "zkswap" | "thirdtrade" | "uniswap-v2" | "velodrome" | "aerodrome" | "balancer" | "curve" | "cross_curve" | "curveNPool" | "aura" | "akron" | "beefy" | "dragonswap" | "poolside" | "syncswap-v3" | "neptune" | "zkSwapThreePool" | "syncswap" | "rfx" | "radiant" | "aave" | "euler" | "gearbox" | "compound" | "sturdy" | "frax" | "ionic" | "moonwell" | "fluid" | "silo" | "coumpound" | "dolomite" | "badger" | "ajna" | "layerbank" | "ion" | "venus" | "woofi" | "reactor_fusion" | "eigenlayer" | "vest" | "zerolend" | undefined;
|
93
|
+
mainProtocol: "morpho" | "arthswap" | "baseswap" | "camelot" | "crust" | "fenix" | "horiza" | "izumi" | "kim" | "pancakeswap-v3" | "quickswap-algebra" | "quickswap-uni" | "ramses" | "retro" | "stryke" | "stryke-pcs" | "stryke-sushi" | "sushiswap-v3" | "swapr" | "thruster" | "uniswap-v3" | "voltage" | "zero" | "koi" | "supswap-v3" | "zkswap" | "thirdtrade" | "uniswap-v2" | "velodrome" | "aerodrome" | "balancer" | "curve" | "cross_curve" | "curveNPool" | "aura" | "akron" | "beefy" | "dragonswap" | "poolside" | "syncswap-v3" | "neptune" | "zkSwapThreePool" | "syncswap" | "rfx" | "radiant" | "aave" | "euler" | "gearbox" | "compound" | "sturdy" | "frax" | "ionic" | "moonwell" | "fluid" | "silo" | "coumpound" | "dolomite" | "badger" | "ajna" | "layerbank" | "ion" | "venus" | "woofi" | "reactor_fusion" | "eigenlayer" | "vest" | "zerolend" | "hyperdrive" | undefined;
|
94
94
|
depositUrl: any;
|
95
95
|
tags: string[];
|
96
96
|
};
|
@@ -317,6 +317,9 @@ export declare const CreateOpportunityDto: import("@sinclair/typebox").TObject<{
|
|
317
317
|
ERC20LOGPROCESSOR: "ERC20LOGPROCESSOR";
|
318
318
|
ERC20REBASELOGPROCESSOR: "ERC20REBASELOGPROCESSOR";
|
319
319
|
VEST: "VEST";
|
320
|
+
ERC20_FIX_APR: "ERC20_FIX_APR";
|
321
|
+
HYPERDRIVELOGPROCESSOR: "HYPERDRIVELOGPROCESSOR";
|
322
|
+
HYPERDRIVELOGFIXPROCESSOR: "HYPERDRIVELOGFIXPROCESSOR";
|
320
323
|
}>;
|
321
324
|
identifier: import("@sinclair/typebox").TString;
|
322
325
|
name: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
@@ -332,6 +335,9 @@ export declare const CreateOpportunityDto: import("@sinclair/typebox").TObject<{
|
|
332
335
|
DROP: "DROP";
|
333
336
|
LEND: "LEND";
|
334
337
|
BORROW: "BORROW";
|
338
|
+
LP: "LP";
|
339
|
+
LONG: "LONG";
|
340
|
+
SHORT: "SHORT";
|
335
341
|
INVALID: "INVALID";
|
336
342
|
}>;
|
337
343
|
tokens: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
|
@@ -47,7 +47,7 @@ export declare abstract class OpportunityService {
|
|
47
47
|
} & {
|
48
48
|
price?: number | null | undefined;
|
49
49
|
})[];
|
50
|
-
mainProtocol: "morpho" | "arthswap" | "baseswap" | "camelot" | "crust" | "fenix" | "horiza" | "izumi" | "kim" | "pancakeswap-v3" | "quickswap-algebra" | "quickswap-uni" | "ramses" | "retro" | "stryke" | "stryke-pcs" | "stryke-sushi" | "sushiswap-v3" | "swapr" | "thruster" | "uniswap-v3" | "voltage" | "zero" | "koi" | "supswap-v3" | "zkswap" | "thirdtrade" | "uniswap-v2" | "velodrome" | "aerodrome" | "balancer" | "curve" | "cross_curve" | "curveNPool" | "aura" | "akron" | "beefy" | "dragonswap" | "poolside" | "syncswap-v3" | "neptune" | "zkSwapThreePool" | "syncswap" | "rfx" | "radiant" | "aave" | "euler" | "gearbox" | "compound" | "sturdy" | "frax" | "ionic" | "moonwell" | "fluid" | "silo" | "coumpound" | "dolomite" | "badger" | "ajna" | "layerbank" | "ion" | "venus" | "woofi" | "reactor_fusion" | "eigenlayer" | "vest" | "zerolend" | undefined;
|
50
|
+
mainProtocol: "morpho" | "arthswap" | "baseswap" | "camelot" | "crust" | "fenix" | "horiza" | "izumi" | "kim" | "pancakeswap-v3" | "quickswap-algebra" | "quickswap-uni" | "ramses" | "retro" | "stryke" | "stryke-pcs" | "stryke-sushi" | "sushiswap-v3" | "swapr" | "thruster" | "uniswap-v3" | "voltage" | "zero" | "koi" | "supswap-v3" | "zkswap" | "thirdtrade" | "uniswap-v2" | "velodrome" | "aerodrome" | "balancer" | "curve" | "cross_curve" | "curveNPool" | "aura" | "akron" | "beefy" | "dragonswap" | "poolside" | "syncswap-v3" | "neptune" | "zkSwapThreePool" | "syncswap" | "rfx" | "radiant" | "aave" | "euler" | "gearbox" | "compound" | "sturdy" | "frax" | "ionic" | "moonwell" | "fluid" | "silo" | "coumpound" | "dolomite" | "badger" | "ajna" | "layerbank" | "ion" | "venus" | "woofi" | "reactor_fusion" | "eigenlayer" | "vest" | "zerolend" | "hyperdrive" | undefined;
|
51
51
|
depositUrl: any;
|
52
52
|
tags: string[];
|
53
53
|
}>;
|
@@ -75,7 +75,7 @@ export declare abstract class OpportunityService {
|
|
75
75
|
} & {
|
76
76
|
price?: number | null | undefined;
|
77
77
|
})[];
|
78
|
-
mainProtocol: "morpho" | "arthswap" | "baseswap" | "camelot" | "crust" | "fenix" | "horiza" | "izumi" | "kim" | "pancakeswap-v3" | "quickswap-algebra" | "quickswap-uni" | "ramses" | "retro" | "stryke" | "stryke-pcs" | "stryke-sushi" | "sushiswap-v3" | "swapr" | "thruster" | "uniswap-v3" | "voltage" | "zero" | "koi" | "supswap-v3" | "zkswap" | "thirdtrade" | "uniswap-v2" | "velodrome" | "aerodrome" | "balancer" | "curve" | "cross_curve" | "curveNPool" | "aura" | "akron" | "beefy" | "dragonswap" | "poolside" | "syncswap-v3" | "neptune" | "zkSwapThreePool" | "syncswap" | "rfx" | "radiant" | "aave" | "euler" | "gearbox" | "compound" | "sturdy" | "frax" | "ionic" | "moonwell" | "fluid" | "silo" | "coumpound" | "dolomite" | "badger" | "ajna" | "layerbank" | "ion" | "venus" | "woofi" | "reactor_fusion" | "eigenlayer" | "vest" | "zerolend" | undefined;
|
78
|
+
mainProtocol: "morpho" | "arthswap" | "baseswap" | "camelot" | "crust" | "fenix" | "horiza" | "izumi" | "kim" | "pancakeswap-v3" | "quickswap-algebra" | "quickswap-uni" | "ramses" | "retro" | "stryke" | "stryke-pcs" | "stryke-sushi" | "sushiswap-v3" | "swapr" | "thruster" | "uniswap-v3" | "voltage" | "zero" | "koi" | "supswap-v3" | "zkswap" | "thirdtrade" | "uniswap-v2" | "velodrome" | "aerodrome" | "balancer" | "curve" | "cross_curve" | "curveNPool" | "aura" | "akron" | "beefy" | "dragonswap" | "poolside" | "syncswap-v3" | "neptune" | "zkSwapThreePool" | "syncswap" | "rfx" | "radiant" | "aave" | "euler" | "gearbox" | "compound" | "sturdy" | "frax" | "ionic" | "moonwell" | "fluid" | "silo" | "coumpound" | "dolomite" | "badger" | "ajna" | "layerbank" | "ion" | "venus" | "woofi" | "reactor_fusion" | "eigenlayer" | "vest" | "zerolend" | "hyperdrive" | undefined;
|
79
79
|
depositUrl: any;
|
80
80
|
tags: string[];
|
81
81
|
}>;
|
@@ -18,6 +18,7 @@ import { getEigenLayerMetadata } from "./subservices/getEigenLayerMetadata.servi
|
|
18
18
|
import { getErc20Metadata } from "./subservices/getErc20Metadata.service";
|
19
19
|
import { getErc20SnapshotMetadata } from "./subservices/getErc20SnapshotMetadata.service";
|
20
20
|
import { getEulerMetadata } from "./subservices/getEulerMetadata.service";
|
21
|
+
import { getHyperdriveMetadata } from "./subservices/getHyperdriveMetadata.service";
|
21
22
|
import { getJsonAirdropMetadata } from "./subservices/getJsonAirDropMetadata.service";
|
22
23
|
import { getMorphoMetadata } from "./subservices/getMorphoMetadata.service";
|
23
24
|
import { getRadiantMetadata } from "./subservices/getRadiantMetadata.service";
|
@@ -81,6 +82,9 @@ export class OpportunityService {
|
|
81
82
|
return getVestMetaData(chainId, campaignParams);
|
82
83
|
case "EULER":
|
83
84
|
return getEulerMetadata(chainId, campaign.campaignId, campaign.subType, campaign.rewardTokenAddress, campaign.amount, campaignParams);
|
85
|
+
case "HYPERDRIVELOGPROCESSOR":
|
86
|
+
case "HYPERDRIVELOGFIXPROCESSOR":
|
87
|
+
return getHyperdriveMetadata(chainId, campaign.subType, campaignParams);
|
84
88
|
case "INVALID":
|
85
89
|
return {
|
86
90
|
name: "Invalid Campaigns",
|
@@ -0,0 +1,3 @@
|
|
1
|
+
import type { ChainId, HyperDriveLogCampaign } from "@sdk";
|
2
|
+
import type { OpportunityMetadata } from "../opportunity.model";
|
3
|
+
export declare const getHyperdriveMetadata: (chainId: ChainId, campaignSubType: HyperDriveLogCampaign["campaignSubType"], params: HyperDriveLogCampaign["campaignParameters"]) => Promise<OpportunityMetadata>;
|
@@ -0,0 +1,15 @@
|
|
1
|
+
import { OpportunityAction } from "../../../../../database/api/.generated";
|
2
|
+
export const getHyperdriveMetadata = async (chainId, campaignSubType, params) => {
|
3
|
+
const subtypes = [
|
4
|
+
{ name: "Add Liquidity on", action: OpportunityAction.LP },
|
5
|
+
{ name: "Open Long on", action: OpportunityAction.LONG },
|
6
|
+
{ name: "Open Short on", action: OpportunityAction.SHORT },
|
7
|
+
];
|
8
|
+
const subtype = subtypes[campaignSubType];
|
9
|
+
return {
|
10
|
+
action: subtype.action,
|
11
|
+
name: [subtype.name, params.symbolTargetToken].join(" "),
|
12
|
+
tokens: [{ chainId, address: params.targetToken }],
|
13
|
+
mainProtocol: "hyperdrive",
|
14
|
+
};
|
15
|
+
};
|
@@ -182,7 +182,10 @@ export declare enum modeCampaigns {
|
|
182
182
|
Kim_Ichi_SSD_WETH_MODE_Mode = "Kim Ichi SSD WETH/Mode 0x8cfE2A02dfBAbC56aE7e573170E35f88A38BeA55",
|
183
183
|
Kim_Steer_CRS_V2_WETH_MODE_Mode = "Kim Steer CRS V2 WETH/Mode 0x8cfE2A02dfBAbC56aE7e573170E35f88A38BeA55",
|
184
184
|
Kim_Gamma_WETH_MODE_Mode = "Kim Gamma Narrow WETH/Mode 0x8cfE2A02dfBAbC56aE7e573170E35f88A38BeA55",
|
185
|
-
Kim_V4_WETH_MODE_Mode = "Kim V4 WETH/Mode 0x8cfE2A02dfBAbC56aE7e573170E35f88A38BeA55"
|
185
|
+
Kim_V4_WETH_MODE_Mode = "Kim V4 WETH/Mode 0x8cfE2A02dfBAbC56aE7e573170E35f88A38BeA55",
|
186
|
+
Ironclad_Borrow_uniBTC_Mode = "Ironclad Borrow uniBTC 0x80215c38DCb6ae91520F8251A077c124e7259688",
|
187
|
+
Bedrock_Ionic_Supply_ionuniBTC_Mode = "Bedrock Ionic Supply uniBTC 0xa48750877a83f7dec11f722178c317b54a44d142",
|
188
|
+
Bedrock_Ironclad_Supply_uniBTC_Mode = "Bedrock Ironclad Supply uniBTC 0x0F041cf2ae959f39215EFfB50d681Df55D4d90B1"
|
186
189
|
}
|
187
190
|
declare const ModeInterfaceCampaigns: {
|
188
191
|
[key in modeCampaigns]: partialConfig;
|