@merkl/api 0.10.352 → 0.10.353

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.
@@ -1,6 +1,53 @@
1
+ import { CampaignType } from "../../../../database/api/.generated";
1
2
  import { t } from "elysia";
2
3
  // ─── DTOs ────────────────────────────────────────────────────────────────────
3
4
  export const DynamicDataSourceIdentifier = t.Object({
4
5
  chainId: t.Numeric(),
5
6
  tokenAddress: t.String(),
6
7
  });
8
+ export const DynamicDataExtendedDto = t.Object({
9
+ targetTokenSymbol: t.Optional(t.String()),
10
+ });
11
+ export const SimplifiedCampaignDto = t.Object({
12
+ id: t.Optional(t.String()),
13
+ distributionChainId: t.Optional(t.Number()),
14
+ rewardTokenId: t.Optional(t.String()),
15
+ opportunityId: t.Optional(t.String()),
16
+ computeChainId: t.Number(),
17
+ chainId: t.Optional(t.Number()),
18
+ campaignId: t.Optional(t.String()),
19
+ identifier: t.Optional(t.String()),
20
+ creatorAddress: t.Optional(t.String()),
21
+ type: t.Enum(CampaignType),
22
+ subType: t.Optional(t.Number()),
23
+ rewardTokenAddress: t.Optional(t.String()),
24
+ amount: t.Optional(t.String()),
25
+ opportunityIdentifier: t.Optional(t.String()),
26
+ startTimestamp: t.Optional(t.String()),
27
+ endTimestamp: t.Optional(t.String()),
28
+ params: t.Object({}),
29
+ tags: t.Optional(t.Array(t.String())),
30
+ chain: t.Optional(t.Object({})),
31
+ rewardToken: t.Optional(t.Object({})),
32
+ distributionChain: t.Optional(t.Object({})),
33
+ campaignStatus: t.Optional(t.Object({})),
34
+ });
35
+ export const FilledCampaignDto = t.Object({
36
+ id: t.String(),
37
+ distributionChainId: t.Number(),
38
+ rewardTokenId: t.String(),
39
+ opportunityId: t.String(),
40
+ computeChainId: t.Number(),
41
+ chainId: t.Number(),
42
+ campaignId: t.String(),
43
+ identifier: t.String(),
44
+ creatorAddress: t.String(),
45
+ type: t.Enum(CampaignType),
46
+ subType: t.Optional(t.Number()),
47
+ rewardTokenAddress: t.String(),
48
+ amount: t.String(),
49
+ opportunityIdentifier: t.String(),
50
+ startTimestamp: t.String(),
51
+ endTimestamp: t.String(),
52
+ campaignParameters: t.Object({}),
53
+ });
@@ -1,4 +1,7 @@
1
- import { type ChainId } from "@sdk";
1
+ import { CampaignType } from "../../../../database/api/.generated";
2
+ import { Campaign, type ChainId } from "@sdk";
3
+ import { type GetCampaignQueryModel } from "../campaign";
4
+ import type { SimplifiedCampaignDtoModel } from "./dynamicData.model";
2
5
  type output = {
3
6
  tvl: number;
4
7
  totalSupply: number;
@@ -8,7 +11,16 @@ type output = {
8
11
  type: string;
9
12
  };
10
13
  export declare class DynamicDataService {
14
+ #private;
11
15
  /** Fetches a single price */
12
16
  static queryERC20DynamicData(chainId: ChainId, tokenAddress: string): Promise<output>;
17
+ static queryDynamicData(campaign: SimplifiedCampaignDtoModel): Promise<any>;
18
+ static queryDynamicDataFromCampaignId(query: GetCampaignQueryModel): Promise<any>;
19
+ /**
20
+ * Returns the campaign type index from the CampaignType enum
21
+ * @param type CampaignType as db-related enum for v4
22
+ * @returns index of Campaign enum from sdk
23
+ */
24
+ static getV3FromType(type: CampaignType): Campaign;
13
25
  }
14
26
  export {};
@@ -1,7 +1,10 @@
1
1
  import { campaignsDynamicData } from "../../../libs/campaigns/campaignsDynamicData";
2
2
  import { executeSimple } from "../../../utils/execute";
3
3
  import { log } from "../../../utils/logger";
4
+ import { CampaignType } from "../../../../database/api/.generated";
4
5
  import { Campaign, NETWORK_LABELS } from "@sdk";
6
+ import { CampaignService, campaignTypeToEnumMap } from "../campaign";
7
+ import { CampaignRepository } from "../campaign/campaign.repository";
5
8
  export class DynamicDataService {
6
9
  // ─── DynamicDatas ──────────────────────────────────────────────────────────
7
10
  /** Fetches a single price */
@@ -25,13 +28,13 @@ export class DynamicDataService {
25
28
  decimalsRewardToken: 18,
26
29
  decimalsTargetToken: 18,
27
30
  duration: 30,
31
+ whitelist: [],
28
32
  forwarders: [],
29
33
  hooks: [],
30
34
  shouldIgnore: false,
31
35
  symbolRewardToken: "EXR",
32
36
  symbolTargetToken: "EXT",
33
37
  targetToken: tokenAddress,
34
- whitelist: [],
35
38
  },
36
39
  campaignType: Campaign.ERC20,
37
40
  },
@@ -47,4 +50,52 @@ export class DynamicDataService {
47
50
  type: result[0]?.type ?? "defaultType",
48
51
  };
49
52
  }
53
+ static async queryDynamicData(campaign) {
54
+ const campaignParameters = {
55
+ type: campaign.type,
56
+ computeChainId: campaign.computeChainId,
57
+ chainId: campaign.chainId ? campaign.chainId : campaign.computeChainId,
58
+ subType: campaign.subType,
59
+ rewardTokenAddress: campaign.rewardTokenAddress ? campaign.rewardTokenAddress : "0xdefault",
60
+ amount: campaign.amount ? campaign.amount : "1000000000000000000", // 1 EXR in wei
61
+ startTimestamp: campaign.startTimestamp ? campaign.startTimestamp : Math.floor(Date.now() / 1000).toString(), // current timestamp
62
+ endTimestamp: campaign.endTimestamp
63
+ ? campaign.endTimestamp
64
+ : (Math.floor(Date.now() / 1000) + 30 * 24 * 60 * 60).toString(), // 30 days from now
65
+ creatorAddress: campaign.creatorAddress ? campaign.creatorAddress : "0xdefaultcreatoraddress",
66
+ campaignParameters: campaign.params,
67
+ campaignId: "0xdefaultid",
68
+ opportunityIdentifier: "0xdefaultopportunityid",
69
+ id: "0xdefaultid",
70
+ distributionChainId: campaign.distributionChainId ? campaign.distributionChainId : 1,
71
+ rewardTokenId: campaign.rewardTokenId ? campaign.rewardTokenId : "0xdefaultrewardtokenid",
72
+ opportunityId: campaign.opportunityId ? campaign.opportunityId : "0xdefaultopportunityid",
73
+ identifier: campaign.identifier ? campaign.identifier : "defaultidentifier",
74
+ };
75
+ return await DynamicDataService.#getDynamicData(campaignParameters);
76
+ }
77
+ static async queryDynamicDataFromCampaignId(query) {
78
+ const campaigns = await CampaignRepository.findMany(query);
79
+ const campaign = campaigns[0];
80
+ return DynamicDataService.queryDynamicData(CampaignService.format(campaign));
81
+ }
82
+ /**
83
+ * Returns the campaign type index from the CampaignType enum
84
+ * @param type CampaignType as db-related enum for v4
85
+ * @returns index of Campaign enum from sdk
86
+ */
87
+ static getV3FromType(type) {
88
+ return Object.entries(campaignTypeToEnumMap).find(([v4]) => v4 === type)?.[1];
89
+ }
90
+ /**
91
+ * build/fetch metadata of a campaign's opportunity
92
+ * @param campaign
93
+ * @returns {OpportunityMetadata}
94
+ */
95
+ static async #getDynamicData(campaign) {
96
+ // const campaignType = DynamicDataService.getV3FromType(campaign.type);
97
+ if (campaign.type !== CampaignType.INVALID) {
98
+ return await CampaignService.fetchDynamicData(campaign.computeChainId, campaign.type, [campaign]);
99
+ }
100
+ }
50
101
  }
@@ -219,10 +219,21 @@ export declare const ProgramPayloadController: Elysia<"/program-payload", false,
219
219
  campaignType: number;
220
220
  };
221
221
  params: {};
222
- query: unknown;
222
+ query: {
223
+ debug?: boolean | undefined;
224
+ };
223
225
  headers: unknown;
224
226
  response: {
225
227
  200: {
228
+ version: string;
229
+ chainId: string;
230
+ createdAt: number;
231
+ meta: {
232
+ name: string;
233
+ txBuilderVersion: string;
234
+ };
235
+ transactions: import("./programPayload.model").transaction[];
236
+ } | {
226
237
  safePayload: import("./programPayload.model").safePayload;
227
238
  nonEncodedConfig: any;
228
239
  };
@@ -65,9 +65,10 @@ export const ProgramPayloadController = new Elysia({ prefix: "/program-payload",
65
65
  },
66
66
  detail: { description: "Generate the payload with the campaigns and amounts provided" },
67
67
  })
68
- .post("/payload/from-config", async ({ body }) => {
69
- return ProgramPayloadService.buildPayloadFromConfig(body);
68
+ .post("/payload/from-config", async ({ query, body }) => {
69
+ return ProgramPayloadService.buildPayloadFromConfig(body, query.debug);
70
70
  }, {
71
+ query: t.Object({ debug: t.Optional(t.Boolean({ description: "Debug mode" })) }),
71
72
  body: SinglePayloadInputDto,
72
73
  detail: { description: "BETA FEATURE : Generate the payload from a config file." },
73
74
  });
@@ -12,7 +12,7 @@ export declare class ProgramPayloadService {
12
12
  static buildCampaignData(query: CampaignPayloadInputModel): {
13
13
  args: any;
14
14
  };
15
- static buildPayloadFromConfig(config: SinglePayloadInputDtoModel): Promise<{
15
+ static buildPayloadFromConfig(config: SinglePayloadInputDtoModel, debug?: boolean): Promise<safePayload | {
16
16
  safePayload: safePayload;
17
17
  nonEncodedConfig: any;
18
18
  }>;
@@ -46,7 +46,7 @@ export class ProgramPayloadService {
46
46
  const args = buildCampaignPayload(ProgramPayloadService.buildConfig(query), distributionChainId).args;
47
47
  return { args };
48
48
  }
49
- static async buildPayloadFromConfig(config) {
49
+ static async buildPayloadFromConfig(config, debug = false) {
50
50
  const campaignType = config.campaignType;
51
51
  const rewardToken = config.rewardToken;
52
52
  class CampaignConfig extends CampaignTypeConfigResourceMapping[campaignType] {
@@ -70,7 +70,10 @@ export class ProgramPayloadService {
70
70
  const safePayload = ProgramPayloadService.initiateSafePayload(distributionChainId, distributionCreator);
71
71
  const transactions = ProgramPayloadService.createSafePayloadForCampaign(args, distributionChainId, rewardToken, distributionCreator ?? NULL_ADDRESS);
72
72
  safePayload.transactions.push(...transactions);
73
- return { safePayload, nonEncodedConfig };
73
+ if (debug) {
74
+ return { safePayload, nonEncodedConfig };
75
+ }
76
+ return safePayload;
74
77
  }
75
78
  static createSafePayloadForCampaign(args, distributionChainId, rewardToken, distributionCreator) {
76
79
  const safePayload = _.cloneDeep(safeTemplate);
@@ -2675,6 +2675,78 @@ export declare const v4: Elysia<"/v4", false, {
2675
2675
  };
2676
2676
  };
2677
2677
  };
2678
+ } & {
2679
+ "dynamic-data": {
2680
+ "from-config": {
2681
+ post: {
2682
+ body: {
2683
+ id?: string | undefined;
2684
+ tags?: string[] | undefined;
2685
+ identifier?: string | undefined;
2686
+ subType?: number | undefined;
2687
+ chain?: {} | undefined;
2688
+ chainId?: number | undefined;
2689
+ startTimestamp?: string | undefined;
2690
+ endTimestamp?: string | undefined;
2691
+ distributionChainId?: number | undefined;
2692
+ campaignId?: string | undefined;
2693
+ rewardTokenId?: string | undefined;
2694
+ amount?: string | undefined;
2695
+ opportunityId?: string | undefined;
2696
+ creatorAddress?: string | undefined;
2697
+ campaignStatus?: {} | undefined;
2698
+ rewardToken?: {} | undefined;
2699
+ rewardTokenAddress?: string | undefined;
2700
+ distributionChain?: {} | undefined;
2701
+ opportunityIdentifier?: string | undefined;
2702
+ type: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST";
2703
+ params: {};
2704
+ computeChainId: number;
2705
+ };
2706
+ params: {};
2707
+ query: unknown;
2708
+ headers: {
2709
+ authorization: string;
2710
+ };
2711
+ response: {
2712
+ [x: string]: any;
2713
+ 200: any;
2714
+ };
2715
+ };
2716
+ };
2717
+ };
2718
+ } & {
2719
+ "dynamic-data": {
2720
+ "from-existing": {
2721
+ get: {
2722
+ body: unknown;
2723
+ params: {};
2724
+ query: {
2725
+ 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;
2726
+ items?: number | undefined;
2727
+ subType?: number | undefined;
2728
+ page?: number | undefined;
2729
+ chainId?: number | undefined;
2730
+ startTimestamp?: string | undefined;
2731
+ endTimestamp?: string | undefined;
2732
+ tokenAddress?: string | undefined;
2733
+ mainParameter?: string | undefined;
2734
+ campaignId?: string | undefined;
2735
+ opportunityId?: string | undefined;
2736
+ test?: boolean | undefined;
2737
+ creatorTag?: string | undefined;
2738
+ tokenSymbol?: string | undefined;
2739
+ };
2740
+ headers: {
2741
+ authorization: string;
2742
+ };
2743
+ response: {
2744
+ [x: string]: any;
2745
+ 200: any;
2746
+ };
2747
+ };
2748
+ };
2749
+ };
2678
2750
  };
2679
2751
  } & {
2680
2752
  v4: {
@@ -3067,10 +3139,21 @@ export declare const v4: Elysia<"/v4", false, {
3067
3139
  campaignType: number;
3068
3140
  };
3069
3141
  params: {};
3070
- query: unknown;
3142
+ query: {
3143
+ debug?: boolean | undefined;
3144
+ };
3071
3145
  headers: unknown;
3072
3146
  response: {
3073
3147
  200: {
3148
+ version: string;
3149
+ chainId: string;
3150
+ createdAt: number;
3151
+ meta: {
3152
+ name: string;
3153
+ txBuilderVersion: string;
3154
+ };
3155
+ transactions: import("./programPayload").transaction[];
3156
+ } | {
3074
3157
  safePayload: import("./programPayload").safePayload;
3075
3158
  nonEncodedConfig: any;
3076
3159
  };