@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.
Files changed (40) hide show
  1. package/dist/database/api/.generated/edge.js +10 -4
  2. package/dist/database/api/.generated/index-browser.js +7 -1
  3. package/dist/database/api/.generated/index.d.ts +7 -1
  4. package/dist/database/api/.generated/index.js +10 -4
  5. package/dist/database/api/.generated/package.json +1 -1
  6. package/dist/database/api/.generated/schema.prisma +6 -0
  7. package/dist/database/api/.generated/wasm.js +7 -1
  8. package/dist/src/eden/index.d.ts +21 -21
  9. package/dist/src/index.d.ts +7 -7
  10. package/dist/src/jobs/breakdowns.d.ts +1 -0
  11. package/dist/src/jobs/breakdowns.js +55 -0
  12. package/dist/src/jobs/etl/pendings.d.ts +1 -0
  13. package/dist/src/jobs/etl/pendings.js +74 -0
  14. package/dist/src/jobs/etl/reward-breakdowns.d.ts +1 -0
  15. package/dist/src/jobs/etl/reward-breakdowns.js +82 -0
  16. package/dist/src/jobs/etl/rewards.d.ts +1 -0
  17. package/dist/src/jobs/etl/rewards.js +102 -0
  18. package/dist/src/jobs/rewards.d.ts +1 -0
  19. package/dist/src/jobs/rewards.js +74 -0
  20. package/dist/src/modules/v4/bucket/bucket.service.d.ts +4 -1
  21. package/dist/src/modules/v4/bucket/bucket.service.js +83 -2
  22. package/dist/src/modules/v4/campaign/campaign.controller.d.ts +2 -2
  23. package/dist/src/modules/v4/campaign/campaign.model.d.ts +3 -0
  24. package/dist/src/modules/v4/dynamicData/dynamicData.controller.d.ts +2 -2
  25. package/dist/src/modules/v4/dynamicData/dynamicData.model.d.ts +6 -0
  26. package/dist/src/modules/v4/opportunity/opportunity.controller.d.ts +3 -3
  27. package/dist/src/modules/v4/opportunity/opportunity.model.d.ts +6 -0
  28. package/dist/src/modules/v4/opportunity/opportunity.service.d.ts +2 -2
  29. package/dist/src/modules/v4/opportunity/opportunity.service.js +4 -0
  30. package/dist/src/modules/v4/opportunity/subservices/getHyperdriveMetadata.service.d.ts +3 -0
  31. package/dist/src/modules/v4/opportunity/subservices/getHyperdriveMetadata.service.js +15 -0
  32. package/dist/src/modules/v4/programPayload/programPayload.repository.d.ts +4 -1
  33. package/dist/src/modules/v4/programPayload/programPayload.repository.js +101 -16
  34. package/dist/src/modules/v4/programPayload/programPayload.service.d.ts +3 -3
  35. package/dist/src/modules/v4/programPayload/programPayload.service.js +25 -11
  36. package/dist/src/modules/v4/protocol/protocol.model.d.ts +1 -1
  37. package/dist/src/modules/v4/protocol/protocol.model.js +1 -0
  38. package/dist/src/modules/v4/router.d.ts +7 -7
  39. package/dist/tsconfig.package.tsbuildinfo +1 -1
  40. 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 file = await BucketService.storage.bucket(bucketName).file(filename);
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;