@merkl/api 0.10.316 → 0.10.317

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.
@@ -9,6 +9,41 @@ export declare const CampaignPayloadInputDto: import("@sinclair/typebox").TObjec
9
9
  endTimestamp: import("@sinclair/typebox").TNumber;
10
10
  amount: import("@sinclair/typebox").TString;
11
11
  }>;
12
+ export declare const SinglePayloadInputDto: import("@sinclair/typebox").TObject<{
13
+ distributionChainId: import("@sinclair/typebox").TNumber;
14
+ rewardToken: import("@sinclair/typebox").TString;
15
+ amount: import("@sinclair/typebox").TString;
16
+ startTimestamp: import("@sinclair/typebox").TNumber;
17
+ computeChainId: import("@sinclair/typebox").TNumber;
18
+ creator: import("@sinclair/typebox").TString;
19
+ hooks: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{}>>;
20
+ whitelist: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
21
+ blacklist: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
22
+ campaignType: import("@sinclair/typebox").TNumber;
23
+ endTimestamp: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
24
+ targetToken: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
25
+ url: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
26
+ forwarders: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{}>>>;
27
+ poolAddress: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
28
+ isOutOfRangeIncentivized: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
29
+ weightFees: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
30
+ weightToken0: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
31
+ weightToken1: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
32
+ usesBlockNumber: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
33
+ snapshotTimestamp: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
34
+ snapshotBlockNumber: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
35
+ jsonUrl: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
36
+ subCampaignType: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
37
+ repository: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
38
+ capInUSD: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
39
+ marketId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
40
+ compFork: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
41
+ poolId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
42
+ evkAddress: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
43
+ collateralAddress: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
44
+ strategy: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
45
+ contract: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
46
+ }>;
12
47
  export declare const ProgramPayloadInputDto: import("@sinclair/typebox").TObject<{
13
48
  program: import("@sinclair/typebox").TString;
14
49
  creator: import("@sinclair/typebox").TString;
@@ -22,6 +57,79 @@ export declare const CampaignAmountsInputDto: import("@sinclair/typebox").TRecor
22
57
  export type CampaignPayloadInputModel = typeof CampaignPayloadInputDto.static;
23
58
  export type ProgramPayloadInputModel = typeof ProgramPayloadInputDto.static;
24
59
  export type CampaignAmountsInputModel = typeof CampaignAmountsInputDto.static;
60
+ export type SinglePayloadInputDtoModel = typeof SinglePayloadInputDto.static;
61
+ export type approvalTransaction = {
62
+ to: string;
63
+ value: string;
64
+ data: null;
65
+ contractMethod: {
66
+ inputs: {
67
+ name: string;
68
+ type: string;
69
+ internalType: string;
70
+ }[];
71
+ name: string;
72
+ payable: boolean;
73
+ };
74
+ contractInputsValues: {
75
+ spender: string;
76
+ amount: string;
77
+ };
78
+ };
79
+ export type acceptConditionsTransaction = {
80
+ to: string;
81
+ value: string;
82
+ data: null;
83
+ contractMethod: {
84
+ inputs: any[];
85
+ name: string;
86
+ payable: boolean;
87
+ };
88
+ contractInputsValues: null;
89
+ };
90
+ export type createCampaignTransaction = {
91
+ to: string;
92
+ value: string;
93
+ data: null;
94
+ contractMethod: {
95
+ inputs: {
96
+ components: {
97
+ internalType: string;
98
+ name: string;
99
+ type: string;
100
+ }[];
101
+ internalType: string;
102
+ name: string;
103
+ type: string;
104
+ }[];
105
+ name: string;
106
+ payable: boolean;
107
+ };
108
+ contractInputsValues: {
109
+ newCampaign: string;
110
+ };
111
+ };
112
+ export type transaction = approvalTransaction | acceptConditionsTransaction | createCampaignTransaction;
113
+ export type safeCompletePayload = {
114
+ version: string;
115
+ chainId: string;
116
+ createdAt: number;
117
+ meta: {
118
+ name: string;
119
+ txBuilderVersion: string;
120
+ };
121
+ transactions: [approvalTransaction, acceptConditionsTransaction, createCampaignTransaction];
122
+ };
123
+ export type safePayload = {
124
+ version: string;
125
+ chainId: string;
126
+ createdAt: number;
127
+ meta: {
128
+ name: string;
129
+ txBuilderVersion: string;
130
+ };
131
+ transactions: transaction[];
132
+ };
25
133
  export type partialConfigERC20 = {
26
134
  computeChainId?: MerklChainId;
27
135
  hooks?: (HookParameters<HOOK> | string)[];
@@ -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;
@@ -2685,8 +2685,16 @@ export declare const v4: Elysia<"/v4", false, {
2685
2685
  };
2686
2686
  headers: unknown;
2687
2687
  response: {
2688
- [x: string]: any;
2689
- 200: any;
2688
+ 200: {
2689
+ version: string;
2690
+ chainId: string;
2691
+ createdAt: number;
2692
+ meta: {
2693
+ name: string;
2694
+ txBuilderVersion: string;
2695
+ };
2696
+ transactions: import("./programPayload").transaction[];
2697
+ };
2690
2698
  };
2691
2699
  };
2692
2700
  };
@@ -2757,8 +2765,16 @@ export declare const v4: Elysia<"/v4", false, {
2757
2765
  };
2758
2766
  headers: unknown;
2759
2767
  response: {
2760
- [x: string]: any;
2761
- 200: any;
2768
+ 200: {
2769
+ version: string;
2770
+ chainId: string;
2771
+ createdAt: number;
2772
+ meta: {
2773
+ name: string;
2774
+ txBuilderVersion: string;
2775
+ };
2776
+ transactions: import("./programPayload").transaction[];
2777
+ } | null;
2762
2778
  };
2763
2779
  };
2764
2780
  };
@@ -2783,8 +2799,69 @@ export declare const v4: Elysia<"/v4", false, {
2783
2799
  };
2784
2800
  headers: unknown;
2785
2801
  response: {
2786
- [x: string]: any;
2787
- 200: any;
2802
+ 200: {
2803
+ version: string;
2804
+ chainId: string;
2805
+ createdAt: number;
2806
+ meta: {
2807
+ name: string;
2808
+ txBuilderVersion: string;
2809
+ };
2810
+ transactions: import("./programPayload").transaction[];
2811
+ } | null;
2812
+ };
2813
+ };
2814
+ };
2815
+ };
2816
+ };
2817
+ } & {
2818
+ "program-payload": {
2819
+ payload: {
2820
+ "from-config": {
2821
+ post: {
2822
+ body: {
2823
+ url?: string | undefined;
2824
+ endTimestamp?: number | undefined;
2825
+ poolAddress?: string | undefined;
2826
+ marketId?: string | undefined;
2827
+ strategy?: string | undefined;
2828
+ poolId?: string | undefined;
2829
+ contract?: string | undefined;
2830
+ forwarders?: {}[] | undefined;
2831
+ targetToken?: string | undefined;
2832
+ isOutOfRangeIncentivized?: boolean | undefined;
2833
+ weightFees?: number | undefined;
2834
+ weightToken0?: number | undefined;
2835
+ weightToken1?: number | undefined;
2836
+ usesBlockNumber?: boolean | undefined;
2837
+ snapshotTimestamp?: number | undefined;
2838
+ snapshotBlockNumber?: number | undefined;
2839
+ jsonUrl?: string | undefined;
2840
+ subCampaignType?: number | undefined;
2841
+ repository?: string | undefined;
2842
+ capInUSD?: string | undefined;
2843
+ compFork?: number | undefined;
2844
+ evkAddress?: string | undefined;
2845
+ collateralAddress?: string | undefined;
2846
+ hooks: {}[];
2847
+ creator: string;
2848
+ startTimestamp: number;
2849
+ computeChainId: number;
2850
+ distributionChainId: number;
2851
+ amount: string;
2852
+ blacklist: string[];
2853
+ rewardToken: string;
2854
+ campaignType: number;
2855
+ whitelist: string[];
2856
+ };
2857
+ params: {};
2858
+ query: unknown;
2859
+ headers: unknown;
2860
+ response: {
2861
+ 200: {
2862
+ safePayload: import("./programPayload").safePayload;
2863
+ nonEncodedConfig: any;
2864
+ };
2788
2865
  };
2789
2866
  };
2790
2867
  };