@merkl/api 0.10.316 → 0.10.318

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,23 +1,58 @@
1
1
  import { t } from "elysia";
2
2
  // ─── DTOs ────────────────────────────────────────────────────────────────────
3
3
  export const CampaignPayloadInputDto = t.Object({
4
- campaign: t.String(),
5
- program: t.String(),
6
- creator: t.String(),
7
- rewardToken: t.String(),
8
- distributionChainId: t.Numeric(),
9
- startTimestamp: t.Numeric(),
10
- endTimestamp: t.Numeric(),
11
- amount: t.String(),
4
+ campaign: t.String({ description: "Campaign identifier, these are shared by the merkl team" }),
5
+ program: t.String({ description: "Program identifier, these are shared by the merkl team" }),
6
+ creator: t.String({ description: "Address of the campaign creator" }),
7
+ rewardToken: t.String({ description: "Address of the reward token to be distributed" }),
8
+ distributionChainId: t.Numeric({ description: "Chain ID where the reward tokens will be distributed" }),
9
+ startTimestamp: t.Numeric({ description: "Start timestamp for the campaign" }),
10
+ endTimestamp: t.Numeric({ description: "End timestamp for the campaign" }),
11
+ amount: t.String({ description: "Amount of the reward token to be distributed" }),
12
+ });
13
+ export const SinglePayloadInputDto = t.Object({
14
+ distributionChainId: t.Numeric({ description: "Chain ID where the reward tokens will be distributed" }),
15
+ rewardToken: t.String({ description: "Address of the reward token to be distributed" }),
16
+ amount: t.String({ description: "Amount of the reward token to be distributed" }),
17
+ startTimestamp: t.Numeric({ description: "Start timestamp for the campaign" }),
18
+ computeChainId: t.Numeric({ description: "Chain ID used for computation" }),
19
+ creator: t.String({ description: "Address of the campaign creator" }),
20
+ hooks: t.Array(t.Object({})),
21
+ whitelist: t.Array(t.String({ description: "List of addresses allowed to participate" })),
22
+ blacklist: t.Array(t.String({ description: "List of addresses not allowed to participate" })),
23
+ campaignType: t.Numeric({ description: "Type of the campaign 1 : ERC20, 2: CLAMM , ..." }),
24
+ endTimestamp: t.Optional(t.Numeric({ description: "End timestamp for the campaign" })),
25
+ targetToken: t.Optional(t.String({ description: "Address of the target token that is incentivized" })),
26
+ url: t.Optional(t.String({ description: "URL for more information" })),
27
+ forwarders: t.Optional(t.Array(t.Object({}))),
28
+ poolAddress: t.Optional(t.String({ description: "Address of the pool that is incentivized" })),
29
+ isOutOfRangeIncentivized: t.Optional(t.Boolean({ description: "Whether out-of-range is incentivized" })),
30
+ weightFees: t.Optional(t.Number({ description: "Weight of the fees" })),
31
+ weightToken0: t.Optional(t.Number({ description: "Weight of token 0" })),
32
+ weightToken1: t.Optional(t.Number({ description: "Weight of token 1" })),
33
+ usesBlockNumber: t.Optional(t.Boolean({ description: "Whether block number is used" })),
34
+ snapshotTimestamp: t.Optional(t.Numeric({ description: "Snapshot timestamp" })),
35
+ snapshotBlockNumber: t.Optional(t.Numeric({ description: "Snapshot block number" })),
36
+ jsonUrl: t.Optional(t.String({ description: "URL for JSON data for Airdrops" })),
37
+ subCampaignType: t.Optional(t.Numeric({ description: "Type of the sub-campaign" })),
38
+ repository: t.Optional(t.String({ description: "Repository URL" })),
39
+ capInUSD: t.Optional(t.String({ description: "Cap in USD" })),
40
+ marketId: t.Optional(t.String({ description: "Market ID" })),
41
+ compFork: t.Optional(t.Numeric({ description: "Compound fork ID" })),
42
+ poolId: t.Optional(t.String({ description: "Pool ID that is incentivized" })),
43
+ evkAddress: t.Optional(t.String({ description: "EVK address" })),
44
+ collateralAddress: t.Optional(t.String({ description: "Collateral address" })),
45
+ strategy: t.Optional(t.String({ description: "Strategy that is incentivized" })),
46
+ contract: t.Optional(t.String({ description: "Contract address" })),
12
47
  });
13
48
  export const ProgramPayloadInputDto = t.Object({
14
- program: t.String(),
15
- creator: t.String(),
16
- rewardToken: t.String(),
17
- distributionChainId: t.Numeric(),
18
- startTimestamp: t.Numeric(),
19
- endTimestamp: t.Numeric(),
20
- amount: t.Optional(t.String()),
49
+ program: t.String({ description: "Program identifier, these are shared by the merkl team" }),
50
+ creator: t.String({ description: "Address of the campaign creator" }),
51
+ rewardToken: t.String({ description: "Address of the reward token to be distributed" }),
52
+ distributionChainId: t.Numeric({ description: "Chain ID where the reward tokens will be distributed" }),
53
+ startTimestamp: t.Numeric({ description: "Start timestamp for the campaign" }),
54
+ endTimestamp: t.Numeric({ description: "End timestamp for the campaign" }),
55
+ amount: t.Optional(t.String({ description: "Amount of the reward token to be distributed" })),
21
56
  });
22
57
  export const CampaignAmountsInputDto = t.Record(t.String(), t.String());
23
58
  // ---- Template below ----
@@ -1,12 +1,19 @@
1
- import { type Campaign, type campaignConfig } from "@sdk";
2
- import { type CampaignAmountsInputModel, type CampaignPayloadInputModel, type ProgramPayloadInputModel } from "./programPayload.model";
1
+ import { type Campaign, ChainId, type campaignConfig } from "@sdk";
2
+ import type { CampaignParametersStruct } from "libs/sdk/src/generated/CampaignCreator";
3
+ import { type CampaignAmountsInputModel, type CampaignPayloadInputModel, type ProgramPayloadInputModel, type SinglePayloadInputDtoModel, type approvalTransaction, type createCampaignTransaction, type safePayload } from "./programPayload.model";
3
4
  export declare class ProgramPayloadService {
4
5
  static buildConfig(query: CampaignPayloadInputModel): campaignConfig<Campaign>;
5
6
  /** building payload for a single campaign */
6
7
  static buildCampaignData(query: CampaignPayloadInputModel): {
7
8
  args: any;
8
9
  };
9
- static buildPayload(query: CampaignPayloadInputModel, initialCampaignPayload?: null): any;
10
- static buildProgramPayload(query: ProgramPayloadInputModel): any;
11
- static buildProgramPayloadWithAmounts(query: ProgramPayloadInputModel, body: CampaignAmountsInputModel): any;
10
+ static buildPayloadFromConfig(config: SinglePayloadInputDtoModel): Promise<{
11
+ safePayload: safePayload;
12
+ nonEncodedConfig: any;
13
+ }>;
14
+ static createSafePayloadForCampaign(args: CampaignParametersStruct, distributionChainId: ChainId, rewardToken: string, distributionCreator: string): [approvalTransaction, createCampaignTransaction];
15
+ static initiateSafePayload(distributionChainId: ChainId, distributionCreator: string): safePayload;
16
+ static buildPayload(query: CampaignPayloadInputModel, initialCampaignPayload?: safePayload | null): safePayload;
17
+ static buildProgramPayload(query: ProgramPayloadInputModel): safePayload | null;
18
+ static buildProgramPayloadWithAmounts(query: ProgramPayloadInputModel, body: CampaignAmountsInputModel): safePayload | null;
12
19
  }
@@ -1,4 +1,4 @@
1
- import { ChainId, NULL_ADDRESS, NULL_ROOT, buildCampaignPayload, encodeForwarderData, registry, } from "@sdk";
1
+ import { CampaignTypeConfigResourceMapping, ChainId, NULL_ADDRESS, NULL_ROOT, buildCampaignPayload, encodeForwarderData, registry, } from "@sdk";
2
2
  import _ from "lodash";
3
3
  import { safeTemplate, } from "./programPayload.model";
4
4
  import { MerklInterfaceCampaigns, zkSyncCampaignAmounts } from "./programPayload.repository";
@@ -36,52 +36,77 @@ export class ProgramPayloadService {
36
36
  const args = buildCampaignPayload(ProgramPayloadService.buildConfig(query), distributionChainId).args;
37
37
  return { args };
38
38
  }
39
+ static async buildPayloadFromConfig(config) {
40
+ const campaignType = config.campaignType;
41
+ const rewardToken = config.rewardToken;
42
+ class CampaignConfig extends CampaignTypeConfigResourceMapping[campaignType] {
43
+ }
44
+ const parsedConfig = CampaignConfig.hydrate(config, {
45
+ strategy: "exposeAll",
46
+ excludeExtraneousValues: true,
47
+ });
48
+ parsedConfig.hooks = config.hooks.map(hook => hook);
49
+ const nonEncodedConfig = { ...parsedConfig };
50
+ if ("forwarders" in parsedConfig) {
51
+ parsedConfig.forwarders = config?.forwarders
52
+ ? config.forwarders.map(forwarder => encodeForwarderData(forwarder))
53
+ : [];
54
+ }
55
+ const distributionChainId = config.distributionChainId ? config.distributionChainId : ChainId.MAINNET;
56
+ const registryInitialized = registry(distributionChainId);
57
+ const distributionCreator = registryInitialized?.Merkl?.DistributionCreator ?? NULL_ADDRESS;
58
+ // Small hack to avoid the need to parse the config again
59
+ const args = buildCampaignPayload(parsedConfig, distributionChainId).args;
60
+ const safePayload = ProgramPayloadService.initiateSafePayload(distributionChainId, distributionCreator);
61
+ const transactions = ProgramPayloadService.createSafePayloadForCampaign(args, distributionChainId, rewardToken, distributionCreator ?? NULL_ADDRESS);
62
+ safePayload.transactions.push(...transactions);
63
+ return { safePayload, nonEncodedConfig };
64
+ }
65
+ static createSafePayloadForCampaign(args, distributionChainId, rewardToken, distributionCreator) {
66
+ const safePayload = _.cloneDeep(safeTemplate);
67
+ safePayload.chainId = distributionChainId.toString();
68
+ safePayload.createdAt = Math.floor(Date.now() / 1000);
69
+ safePayload.transactions[0].to = rewardToken;
70
+ safePayload.transactions[0].contractInputsValues = {
71
+ amount: args?.amount.toString(),
72
+ spender: distributionCreator ? distributionCreator : NULL_ADDRESS,
73
+ };
74
+ safePayload.transactions[2].to = distributionCreator ? distributionCreator : NULL_ADDRESS;
75
+ safePayload.transactions[2].contractInputsValues = {
76
+ newCampaign: JSON.stringify([
77
+ NULL_ROOT,
78
+ NULL_ADDRESS,
79
+ args?.rewardToken,
80
+ args?.amount,
81
+ args?.campaignType,
82
+ args?.startTimestamp,
83
+ args?.duration,
84
+ args?.campaignData,
85
+ ]),
86
+ };
87
+ return [safePayload.transactions[0], safePayload.transactions[2]];
88
+ }
89
+ static initiateSafePayload(distributionChainId, distributionCreator) {
90
+ const safePayload = _.cloneDeep(safeTemplate);
91
+ safePayload.chainId = distributionChainId.toString();
92
+ safePayload.createdAt = Math.floor(Date.now() / 1000);
93
+ safePayload.transactions[1].to = distributionCreator;
94
+ safePayload.transactions = [safePayload.transactions[1]];
95
+ return safePayload;
96
+ }
39
97
  static buildPayload(query, initialCampaignPayload = null) {
40
98
  const rewardToken = query.rewardToken;
41
99
  const distributionChainId = query.distributionChainId ? query.distributionChainId : ChainId.MAINNET;
42
100
  const registryInitialized = registry(distributionChainId);
43
- const distributionCreator = registryInitialized?.Merkl?.DistributionCreator;
44
- function aggregateConfig(query) {
45
- return ProgramPayloadService.buildConfig(query);
46
- }
47
- function createSafePayloadForCampaign(args) {
48
- const safePayload = _.cloneDeep(safeTemplate);
49
- safePayload.chainId = distributionChainId.toString();
50
- safePayload.createdAt = Math.floor(Date.now() / 1000);
51
- safePayload.transactions[0].to = rewardToken;
52
- safePayload.transactions[0].contractInputsValues = {
53
- amount: args?.amount.toString(),
54
- spender: distributionCreator ? distributionCreator : NULL_ADDRESS,
55
- };
56
- safePayload.transactions[2].to = distributionCreator ? distributionCreator : NULL_ADDRESS;
57
- safePayload.transactions[2].contractInputsValues = {
58
- newCampaign: JSON.stringify([
59
- NULL_ROOT,
60
- NULL_ADDRESS,
61
- args?.rewardToken,
62
- args?.amount,
63
- args?.campaignType,
64
- args?.startTimestamp,
65
- args?.duration,
66
- args?.campaignData,
67
- ]),
68
- };
69
- return [safePayload.transactions[0], safePayload.transactions[2]];
70
- }
71
- function initiateSafePayload() {
72
- const safePayload = JSON.parse(JSON.stringify(safeTemplate));
73
- safePayload.chainId = distributionChainId.toString();
74
- safePayload.createdAt = Math.floor(Date.now() / 1000);
75
- safePayload.transactions[1].to = distributionCreator;
76
- safePayload.transactions = [safePayload.transactions[1]];
77
- return safePayload;
78
- }
101
+ const distributionCreator = registryInitialized?.Merkl?.DistributionCreator ?? NULL_ADDRESS;
79
102
  function generatePayloadFile(query) {
80
- const args = buildCampaignPayload(aggregateConfig(query), distributionChainId).args;
81
- const safePayload = createSafePayloadForCampaign(args);
103
+ const args = buildCampaignPayload(ProgramPayloadService.buildConfig(query), distributionChainId).args;
104
+ const safePayload = ProgramPayloadService.createSafePayloadForCampaign(args, distributionChainId, rewardToken, distributionCreator);
82
105
  return safePayload;
83
106
  }
84
- const campaignPayloads = initialCampaignPayload === null ? initiateSafePayload() : initialCampaignPayload;
107
+ const campaignPayloads = initialCampaignPayload === null
108
+ ? ProgramPayloadService.initiateSafePayload(distributionChainId, distributionCreator)
109
+ : initialCampaignPayload;
85
110
  const transactions = generatePayloadFile(query);
86
111
  campaignPayloads.transactions.push(...transactions);
87
112
  return campaignPayloads;
@@ -556,6 +556,80 @@ export declare const v4: Elysia<"/v4", false, {
556
556
  };
557
557
  };
558
558
  };
559
+ } & {
560
+ opportunities: {
561
+ aggregate: {
562
+ max: {
563
+ ":field": {
564
+ get: {
565
+ body: unknown;
566
+ params: {
567
+ field: never;
568
+ };
569
+ query: {
570
+ sort?: string | undefined;
571
+ name?: string | undefined;
572
+ tokens?: string | undefined;
573
+ status?: string | undefined;
574
+ items?: number | undefined;
575
+ tags?: string | undefined;
576
+ page?: number | undefined;
577
+ chainId?: string | undefined;
578
+ action?: string | undefined;
579
+ creatorAddress?: string | undefined;
580
+ mainProtocolId?: string | undefined;
581
+ order?: string | undefined;
582
+ test?: boolean | undefined;
583
+ minimumTvl?: number | undefined;
584
+ };
585
+ headers: unknown;
586
+ response: {
587
+ 200: {
588
+ max: string;
589
+ };
590
+ };
591
+ };
592
+ };
593
+ };
594
+ };
595
+ };
596
+ } & {
597
+ opportunities: {
598
+ aggregate: {
599
+ min: {
600
+ ":field": {
601
+ get: {
602
+ body: unknown;
603
+ params: {
604
+ field: never;
605
+ };
606
+ query: {
607
+ sort?: string | undefined;
608
+ name?: string | undefined;
609
+ tokens?: string | undefined;
610
+ status?: string | undefined;
611
+ items?: number | undefined;
612
+ tags?: string | undefined;
613
+ page?: number | undefined;
614
+ chainId?: string | undefined;
615
+ action?: string | undefined;
616
+ creatorAddress?: string | undefined;
617
+ mainProtocolId?: string | undefined;
618
+ order?: string | undefined;
619
+ test?: boolean | undefined;
620
+ minimumTvl?: number | undefined;
621
+ };
622
+ headers: unknown;
623
+ response: {
624
+ 200: {
625
+ min: string;
626
+ };
627
+ };
628
+ };
629
+ };
630
+ };
631
+ };
632
+ };
559
633
  } & {
560
634
  opportunities: {
561
635
  ":id": {
@@ -2685,8 +2759,16 @@ export declare const v4: Elysia<"/v4", false, {
2685
2759
  };
2686
2760
  headers: unknown;
2687
2761
  response: {
2688
- [x: string]: any;
2689
- 200: any;
2762
+ 200: {
2763
+ version: string;
2764
+ chainId: string;
2765
+ createdAt: number;
2766
+ meta: {
2767
+ name: string;
2768
+ txBuilderVersion: string;
2769
+ };
2770
+ transactions: import("./programPayload").transaction[];
2771
+ };
2690
2772
  };
2691
2773
  };
2692
2774
  };
@@ -2757,8 +2839,16 @@ export declare const v4: Elysia<"/v4", false, {
2757
2839
  };
2758
2840
  headers: unknown;
2759
2841
  response: {
2760
- [x: string]: any;
2761
- 200: any;
2842
+ 200: {
2843
+ version: string;
2844
+ chainId: string;
2845
+ createdAt: number;
2846
+ meta: {
2847
+ name: string;
2848
+ txBuilderVersion: string;
2849
+ };
2850
+ transactions: import("./programPayload").transaction[];
2851
+ } | null;
2762
2852
  };
2763
2853
  };
2764
2854
  };
@@ -2783,8 +2873,69 @@ export declare const v4: Elysia<"/v4", false, {
2783
2873
  };
2784
2874
  headers: unknown;
2785
2875
  response: {
2786
- [x: string]: any;
2787
- 200: any;
2876
+ 200: {
2877
+ version: string;
2878
+ chainId: string;
2879
+ createdAt: number;
2880
+ meta: {
2881
+ name: string;
2882
+ txBuilderVersion: string;
2883
+ };
2884
+ transactions: import("./programPayload").transaction[];
2885
+ } | null;
2886
+ };
2887
+ };
2888
+ };
2889
+ };
2890
+ };
2891
+ } & {
2892
+ "program-payload": {
2893
+ payload: {
2894
+ "from-config": {
2895
+ post: {
2896
+ body: {
2897
+ url?: string | undefined;
2898
+ endTimestamp?: number | undefined;
2899
+ poolAddress?: string | undefined;
2900
+ marketId?: string | undefined;
2901
+ strategy?: string | undefined;
2902
+ poolId?: string | undefined;
2903
+ contract?: string | undefined;
2904
+ forwarders?: {}[] | undefined;
2905
+ targetToken?: string | undefined;
2906
+ isOutOfRangeIncentivized?: boolean | undefined;
2907
+ weightFees?: number | undefined;
2908
+ weightToken0?: number | undefined;
2909
+ weightToken1?: number | undefined;
2910
+ usesBlockNumber?: boolean | undefined;
2911
+ snapshotTimestamp?: number | undefined;
2912
+ snapshotBlockNumber?: number | undefined;
2913
+ jsonUrl?: string | undefined;
2914
+ subCampaignType?: number | undefined;
2915
+ repository?: string | undefined;
2916
+ capInUSD?: string | undefined;
2917
+ compFork?: number | undefined;
2918
+ evkAddress?: string | undefined;
2919
+ collateralAddress?: string | undefined;
2920
+ hooks: {}[];
2921
+ creator: string;
2922
+ startTimestamp: number;
2923
+ computeChainId: number;
2924
+ distributionChainId: number;
2925
+ amount: string;
2926
+ blacklist: string[];
2927
+ rewardToken: string;
2928
+ campaignType: number;
2929
+ whitelist: string[];
2930
+ };
2931
+ params: {};
2932
+ query: unknown;
2933
+ headers: unknown;
2934
+ response: {
2935
+ 200: {
2936
+ safePayload: import("./programPayload").safePayload;
2937
+ nonEncodedConfig: any;
2938
+ };
2788
2939
  };
2789
2940
  };
2790
2941
  };