@merkl/api 0.10.256 → 0.10.257

Sign up to get free protection for your applications and to get access to all the features.
@@ -427,7 +427,21 @@ declare const eden: {
427
427
  query?: Record<string, unknown> | undefined;
428
428
  fetch?: RequestInit | undefined;
429
429
  }) => Promise<import("@elysiajs/eden").Treaty.TreatyResponse<{
430
- 200: void;
430
+ 200: {
431
+ name: string;
432
+ type: import("../../database/api/.generated").$Enums.CampaignType;
433
+ id: string;
434
+ status: import("../../database/api/.generated").$Enums.Status;
435
+ tags: string[];
436
+ identifier: string;
437
+ chainId: number;
438
+ action: import("../../database/api/.generated").$Enums.OpportunityAction;
439
+ depositUrl: string | null;
440
+ mainProtocolId: string | null;
441
+ tvl: number;
442
+ apr: number;
443
+ dailyRewards: number;
444
+ } | null;
431
445
  }>>;
432
446
  get: (options: {
433
447
  headers?: Record<string, unknown> | undefined;
@@ -587,7 +601,7 @@ declare const eden: {
587
601
  fetch?: RequestInit | undefined;
588
602
  }) => Promise<import("@elysiajs/eden").Treaty.TreatyResponse<{
589
603
  200: {
590
- sum: File;
604
+ sum: string;
591
605
  };
592
606
  }>>;
593
607
  }) & {};
@@ -2952,7 +2966,21 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
2952
2966
  authorization: string;
2953
2967
  };
2954
2968
  response: {
2955
- 200: void;
2969
+ 200: {
2970
+ name: string;
2971
+ type: import("../../database/api/.generated").$Enums.CampaignType;
2972
+ id: string;
2973
+ status: import("../../database/api/.generated").$Enums.Status;
2974
+ tags: string[];
2975
+ identifier: string;
2976
+ chainId: number;
2977
+ action: import("../../database/api/.generated").$Enums.OpportunityAction;
2978
+ depositUrl: string | null;
2979
+ mainProtocolId: string | null;
2980
+ tvl: number;
2981
+ apr: number;
2982
+ dailyRewards: number;
2983
+ } | null;
2956
2984
  };
2957
2985
  };
2958
2986
  };
@@ -3437,7 +3465,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
3437
3465
  headers: unknown;
3438
3466
  response: {
3439
3467
  200: {
3440
- sum: File;
3468
+ sum: string;
3441
3469
  };
3442
3470
  };
3443
3471
  };
@@ -6710,7 +6738,21 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
6710
6738
  query?: Record<string, unknown> | undefined;
6711
6739
  fetch?: RequestInit | undefined;
6712
6740
  }) => Promise<import("@elysiajs/eden").Treaty.TreatyResponse<{
6713
- 200: void;
6741
+ 200: {
6742
+ name: string;
6743
+ type: import("../../database/api/.generated").$Enums.CampaignType;
6744
+ id: string;
6745
+ status: import("../../database/api/.generated").$Enums.Status;
6746
+ tags: string[];
6747
+ identifier: string;
6748
+ chainId: number;
6749
+ action: import("../../database/api/.generated").$Enums.OpportunityAction;
6750
+ depositUrl: string | null;
6751
+ mainProtocolId: string | null;
6752
+ tvl: number;
6753
+ apr: number;
6754
+ dailyRewards: number;
6755
+ } | null;
6714
6756
  }>>;
6715
6757
  get: (options: {
6716
6758
  headers?: Record<string, unknown> | undefined;
@@ -6870,7 +6912,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
6870
6912
  fetch?: RequestInit | undefined;
6871
6913
  }) => Promise<import("@elysiajs/eden").Treaty.TreatyResponse<{
6872
6914
  200: {
6873
- sum: File;
6915
+ sum: string;
6874
6916
  };
6875
6917
  }>>;
6876
6918
  }) & {};
@@ -168,7 +168,21 @@ declare const app: Elysia<"", false, {
168
168
  authorization: string;
169
169
  };
170
170
  response: {
171
- 200: void;
171
+ 200: {
172
+ name: string;
173
+ type: import("../database/api/.generated").$Enums.CampaignType;
174
+ id: string;
175
+ status: import("../database/api/.generated").$Enums.Status;
176
+ tags: string[];
177
+ identifier: string;
178
+ chainId: number;
179
+ action: import("../database/api/.generated").$Enums.OpportunityAction;
180
+ depositUrl: string | null;
181
+ mainProtocolId: string | null;
182
+ tvl: number;
183
+ apr: number;
184
+ dailyRewards: number;
185
+ } | null;
172
186
  };
173
187
  };
174
188
  };
@@ -653,7 +667,7 @@ declare const app: Elysia<"", false, {
653
667
  headers: unknown;
654
668
  response: {
655
669
  200: {
656
- sum: File;
670
+ sum: string;
657
671
  };
658
672
  };
659
673
  };
@@ -1,6 +1,10 @@
1
1
  import { generateCardName } from "../../../../../utils/generateCardName";
2
2
  import { BN2Number } from "@sdk";
3
3
  import { GenericProcessor } from "./GenericProcessor";
4
+ const matchSingleNumber = (input) => {
5
+ const regex = /^\d+$/;
6
+ return regex.test(input);
7
+ };
4
8
  export class CurveNPoolProcessor extends GenericProcessor {
5
9
  rounds = {
6
10
  round1: [{ key: "numberTokens", call: "N_COINS", target: "tokenAddress" }],
@@ -73,6 +77,12 @@ export class CurveNPoolProcessor extends GenericProcessor {
73
77
  tvl += amount * price;
74
78
  }
75
79
  const priceTargetToken = tvl / totalSupply;
80
+ // Remove all keys that start with a number or balanceToken
81
+ for (const key in typeInfo) {
82
+ if (key.startsWith("balanceToken") || key.startsWith("decimalsToken") || matchSingleNumber(key)) {
83
+ delete typeInfo[key];
84
+ }
85
+ }
76
86
  return {
77
87
  ...typeInfo,
78
88
  totalSupply,
@@ -1,4 +1,4 @@
1
- import type { Campaign, CampaignParameters } from "@sdk";
1
+ import { type Campaign, type CampaignParameters } from "@sdk";
2
2
  import type { Multicall3 } from "libs/sdk/src/generated/Multicall";
3
3
  import { type tokenTypeStruct } from "./helpers/tokenType";
4
4
  export declare function getTokenTypeRound1(calls: Multicall3.ResultStructOutput[], targetToken: string, index: number, campaign: CampaignParameters<Campaign.ERC20> | CampaignParameters<Campaign.EULER>): tokenTypeStruct;
@@ -1,4 +1,5 @@
1
1
  import { decodeCall } from "../../../../utils/decodeCalls";
2
+ import { ChainId } from "@sdk";
2
3
  import { enzymeFundValueCalculatorRouterMapping, getTypeFromFactoryAddress } from "./helpers/factoryFinder";
3
4
  import { tokenType } from "./helpers/tokenType";
4
5
  import { processorMapping } from "./processor/processorMapping";
@@ -190,7 +191,7 @@ function parseForBalancer(calls, index, targetToken, name) {
190
191
  function parseForStaking(campaign, calls, index, targetToken) {
191
192
  try {
192
193
  const whitelist = campaign.campaignParameters.whitelist;
193
- if (whitelist.length === 1 && campaign.chainId !== 42161) {
194
+ if (whitelist.length === 1 && campaign.chainId !== ChainId.ARBITRUM) {
194
195
  const forwarders = campaign.campaignParameters.forwarders;
195
196
  if (forwarders.length === 1) {
196
197
  if (forwarders[0].sender === whitelist[0]) {
@@ -101,6 +101,8 @@ export class CampaignRepository {
101
101
  }
102
102
  }
103
103
  static async upsertMany(campaigns) {
104
+ if (!campaigns.length)
105
+ return { success: 0, fail: 0 };
104
106
  const campaignType = CampaignService.getTypeFromV3(campaigns[0].type);
105
107
  const data = [];
106
108
  for (const campaign of campaigns) {
@@ -37,7 +37,21 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
37
37
  authorization: string;
38
38
  };
39
39
  response: {
40
- 200: void;
40
+ 200: {
41
+ name: string;
42
+ type: import("../../../../database/api/.generated").$Enums.CampaignType;
43
+ id: string;
44
+ status: import("../../../../database/api/.generated").$Enums.Status;
45
+ tags: string[];
46
+ identifier: string;
47
+ chainId: number;
48
+ action: import("../../../../database/api/.generated").$Enums.OpportunityAction;
49
+ depositUrl: string | null;
50
+ mainProtocolId: string | null;
51
+ tvl: number;
52
+ apr: number;
53
+ dailyRewards: number;
54
+ } | null;
41
55
  };
42
56
  };
43
57
  };
@@ -522,7 +536,7 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
522
536
  headers: unknown;
523
537
  response: {
524
538
  200: {
525
- sum: File;
539
+ sum: string;
526
540
  };
527
541
  };
528
542
  };
@@ -6,7 +6,21 @@ import { type TvlRecord } from "../tvl";
6
6
  import type { CreateOpportunityModel, GetOpportunitiesQueryModel, UpdateOpportunityModel } from "./opportunity.model";
7
7
  export declare abstract class OpportunityRepository {
8
8
  #private;
9
- static upsert(newOpp: CreateOpportunityModel): Promise<void>;
9
+ static create(newOpp: CreateOpportunityModel, upsert?: boolean): Promise<{
10
+ name: string;
11
+ type: import("../../../../database/api/.generated").$Enums.CampaignType;
12
+ id: string;
13
+ status: import("../../../../database/api/.generated").$Enums.Status;
14
+ tags: string[];
15
+ identifier: string;
16
+ chainId: number;
17
+ action: import("../../../../database/api/.generated").$Enums.OpportunityAction;
18
+ depositUrl: string | null;
19
+ mainProtocolId: string | null;
20
+ tvl: number;
21
+ apr: number;
22
+ dailyRewards: number;
23
+ } | null>;
10
24
  static findUnique(id: string): Promise<({
11
25
  Chain: {
12
26
  name: string;
@@ -886,7 +900,7 @@ export declare abstract class OpportunityRepository {
886
900
  dailyRewards: number;
887
901
  }>;
888
902
  static aggregateSum(field: keyof Prisma.OpportunitySumAggregateInputType, query: GetOpportunitiesQueryModel): Promise<{
889
- sum: never;
903
+ sum: string;
890
904
  }>;
891
905
  static update(id: string, data: UpdateOpportunityModel): Promise<{
892
906
  name: string;
@@ -2,6 +2,7 @@ import { apiDbClient } from "../../../utils/prisma";
2
2
  import { Status } from "../../../../database/api/.generated";
3
3
  import moment from "moment";
4
4
  import { AprService } from "../apr";
5
+ import { ProtocolService } from "../protocol";
5
6
  import { RewardService } from "../reward";
6
7
  import { TvlService } from "../tvl";
7
8
  export class OpportunityRepository {
@@ -38,7 +39,29 @@ export class OpportunityRepository {
38
39
  },
39
40
  };
40
41
  }
41
- static async upsert(newOpp) {
42
+ static async create(newOpp, upsert = false) {
43
+ if (!!newOpp.mainProtocol) {
44
+ let mainProtocol = await apiDbClient.protocol.findUnique({ where: { id: newOpp.mainProtocol } });
45
+ if (!mainProtocol) {
46
+ mainProtocol = await ProtocolService.create({
47
+ id: newOpp.mainProtocol,
48
+ name: newOpp.mainProtocol,
49
+ tags: [newOpp.action],
50
+ url: "",
51
+ icon: "",
52
+ description: "",
53
+ });
54
+ }
55
+ // Override action with the protocol's action if it differs
56
+ if (mainProtocol.tags.includes("AMM"))
57
+ newOpp.action = "POOL";
58
+ if (mainProtocol.tags.includes("DEX"))
59
+ newOpp.action = "POOL";
60
+ if (mainProtocol.tags.includes("LENDING"))
61
+ newOpp.action = "BORROW";
62
+ if (mainProtocol.tags.includes("LENDING") && !!newOpp.name && newOpp.name.includes("Supply"))
63
+ newOpp.action = "LEND";
64
+ }
42
65
  const data = {
43
66
  id: newOpp.id,
44
67
  action: newOpp.action,
@@ -47,7 +70,7 @@ export class OpportunityRepository {
47
70
  status: newOpp.status,
48
71
  type: newOpp.type,
49
72
  Chain: { connect: { id: newOpp.chainId } },
50
- MainProtocol: { connect: { id: newOpp.mainProtocol } },
73
+ MainProtocol: !!newOpp.mainProtocol ? { connect: { id: newOpp.mainProtocol } } : undefined,
51
74
  Protocols: {
52
75
  connect: (newOpp.protocols ?? []).map((protocol) => {
53
76
  return { id: protocol };
@@ -64,11 +87,21 @@ export class OpportunityRepository {
64
87
  }),
65
88
  },
66
89
  };
67
- await apiDbClient.opportunity.upsert({
68
- where: { id: newOpp.id },
69
- create: data,
70
- update: data,
71
- });
90
+ if (upsert) {
91
+ await apiDbClient.opportunity.upsert({
92
+ where: { id: newOpp.id },
93
+ create: data,
94
+ update: data,
95
+ });
96
+ }
97
+ else {
98
+ const opportunity = await apiDbClient.opportunity.findUnique({ where: { id: newOpp.id } });
99
+ if (!!opportunity) {
100
+ return opportunity;
101
+ }
102
+ await apiDbClient.opportunity.create({ data });
103
+ }
104
+ return await apiDbClient.opportunity.findUnique({ where: { id: newOpp.id } });
72
105
  }
73
106
  static async findUnique(id) {
74
107
  return await apiDbClient.opportunity.findUnique({
@@ -10,8 +10,22 @@ export declare abstract class OpportunityService {
10
10
  * @param newOpp the new opportunity to create
11
11
  * @returns {Promise<Opportunity|undefined>}
12
12
  */
13
- static create(newOpp: Omit<CreateOpportunityModel, "id">): Promise<void>;
14
- static createFromCampaign(campaign: Omit<CreateCampaignModel, "id">): Promise<{
13
+ static create(newOpp: Omit<CreateOpportunityModel, "id">): Promise<{
14
+ name: string;
15
+ type: import("../../../../database/api/.generated").$Enums.CampaignType;
16
+ id: string;
17
+ status: import("../../../../database/api/.generated").$Enums.Status;
18
+ tags: string[];
19
+ identifier: string;
20
+ chainId: number;
21
+ action: import("../../../../database/api/.generated").$Enums.OpportunityAction;
22
+ depositUrl: string | null;
23
+ mainProtocolId: string | null;
24
+ tvl: number;
25
+ apr: number;
26
+ dailyRewards: number;
27
+ } | null>;
28
+ static createFromCampaign(campaign: Omit<CreateCampaignModel, "id">, upsert?: boolean): Promise<{
15
29
  id: string;
16
30
  chainId: number;
17
31
  type: import("../../../../database/api/.generated").$Enums.CampaignType;
@@ -440,7 +454,7 @@ export declare abstract class OpportunityService {
440
454
  dailyRewards: number;
441
455
  };
442
456
  static aggregate(query: GetOpportunitiesQueryModel, field: keyof Prisma.OpportunitySumAggregateInputType): Promise<{
443
- sum: never;
457
+ sum: string;
444
458
  }>;
445
459
  static update(id: string, data: UpdateOpportunityModel): Promise<{
446
460
  name: string;
@@ -32,9 +32,9 @@ export class OpportunityService {
32
32
  */
33
33
  static async create(newOpp) {
34
34
  const id = OpportunityService.hashId(newOpp);
35
- return await OpportunityRepository.upsert({ ...newOpp, id });
35
+ return await OpportunityRepository.create({ ...newOpp, id });
36
36
  }
37
- static async createFromCampaign(campaign) {
37
+ static async createFromCampaign(campaign, upsert = false) {
38
38
  const campaignType = CampaignService.getTypeFromV3(campaign.type);
39
39
  const metadata = await OpportunityService.getMetadata(campaign);
40
40
  metadata.tags = [...((await UserService.findUnique(campaign.creator))?.tags ?? []), ...(campaign?.tags ?? [])];
@@ -62,7 +62,7 @@ export class OpportunityService {
62
62
  depositUrl: !!params.url ? params.url : undefined,
63
63
  tags: metadata.tags,
64
64
  };
65
- await OpportunityRepository.upsert(opportunity);
65
+ await OpportunityRepository.create(opportunity, upsert);
66
66
  return opportunity;
67
67
  }
68
68
  /**
@@ -78,6 +78,7 @@ export class OpportunityService {
78
78
  ...firstCampaign,
79
79
  type: campaignTypeToEnumMap[firstCampaign.type],
80
80
  chainId: firstCampaign.distributionChainId,
81
+ computeChainId: firstCampaign.computeChainId,
81
82
  creator: firstCampaign.creatorAddress,
82
83
  rewardTokenAddress: firstCampaign.RewardToken.address,
83
84
  opportunityIdentifier: opportunity.identifier,
@@ -85,7 +86,8 @@ export class OpportunityService {
85
86
  params: JSON.stringify(firstCampaign.params),
86
87
  startTimestamp: firstCampaign.startTimestamp.toString(),
87
88
  endTimestamp: firstCampaign.endTimestamp.toString(),
88
- });
89
+ }, true // Upserting
90
+ );
89
91
  }
90
92
  /**
91
93
  * build/fetch metadata of a campaign's opportunity
@@ -100,7 +102,8 @@ export class OpportunityService {
100
102
  case "CLAMM":
101
103
  return getClammMetadata(chainId, campaignParams);
102
104
  case "ERC20":
103
- return getErc20Metadata(chainId, campaign.campaignId, campaign.rewardTokenAddress, campaign.amount, campaignParams);
105
+ return getErc20Metadata(chainId, campaign.chainId, // distributionChainId
106
+ campaign.campaignId, campaign.rewardTokenAddress, campaign.amount, campaignParams);
104
107
  case "ERC20_SNAPSHOT":
105
108
  return getErc20SnapshotMetadata(chainId, campaignParams);
106
109
  case "JSON_AIRDROP":
@@ -1,3 +1,3 @@
1
1
  import type { OpportunityMetadata } from "..";
2
2
  import type { ChainId, ERC20Campaign } from "@sdk";
3
- export declare const getErc20Metadata: (chainId: ChainId, campaignId: string, rewardToken: string, amount: string, params: ERC20Campaign["campaignParameters"]) => Promise<OpportunityMetadata>;
3
+ export declare const getErc20Metadata: (computeChainId: ChainId, distributionChainId: ChainId, campaignId: string, rewardToken: string, amount: string, params: ERC20Campaign["campaignParameters"]) => Promise<OpportunityMetadata>;
@@ -2,17 +2,19 @@ import { log } from "../../../../utils/logger";
2
2
  import { CampaignType } from "../../../../../database/api/.generated";
3
3
  import { CampaignService } from "../../campaign";
4
4
  import { ProtocolService } from "../../protocol";
5
- export const getErc20Metadata = async (chainId, campaignId, rewardToken, amount, params) => {
5
+ export const getErc20Metadata = async (computeChainId, distributionChainId, campaignId, rewardToken, amount, params) => {
6
6
  let action = "HOLD";
7
7
  let name = `Hold ${params.symbolTargetToken}`;
8
8
  let mainProtocolId = undefined;
9
- const tokens = [{ chainId, address: params.targetToken }];
9
+ const tokens = [{ chainId: computeChainId, address: params.targetToken }];
10
10
  try {
11
- const [dynamicData] = await CampaignService.fetchDynamicData(chainId, CampaignType.ERC20, [
11
+ const [dynamicData] = await CampaignService.fetchDynamicData(computeChainId, CampaignType.ERC20, [
12
12
  {
13
13
  campaignId,
14
14
  rewardToken,
15
15
  amount,
16
+ chainId: distributionChainId,
17
+ computeChainId,
16
18
  campaignParameters: params,
17
19
  },
18
20
  ]);
@@ -20,37 +22,36 @@ export const getErc20Metadata = async (chainId, campaignId, rewardToken, amount,
20
22
  name = dynamicData?.typeInfo?.cardName;
21
23
  mainProtocolId = dynamicData?.typeInfo?.protocol?.toLowerCase().replace(" ", "");
22
24
  const protocol = (await ProtocolService.findMany({ id: mainProtocolId }))?.[0];
23
- if (!protocol) {
24
- mainProtocolId = undefined;
25
+ if (!!protocol) {
26
+ mainProtocolId = protocol?.id;
25
27
  }
26
- mainProtocolId = protocol?.id;
27
28
  // Case of lending protocols and receipt tokens
28
29
  if (!!dynamicData && !!dynamicData.typeInfo?.underlying) {
29
- tokens.push({ chainId, address: dynamicData.typeInfo.underlying });
30
+ tokens.push({ chainId: computeChainId, address: dynamicData.typeInfo.underlying });
30
31
  }
31
32
  // Case of perps protocols
32
33
  if (!!dynamicData && !!dynamicData.typeInfo?.shortToken && !!dynamicData.typeInfo?.longToken) {
33
- tokens.push({ chainId, address: dynamicData.typeInfo.shortToken });
34
- tokens.push({ chainId, address: dynamicData.typeInfo.longToken });
34
+ tokens.push({ chainId: computeChainId, address: dynamicData.typeInfo.shortToken });
35
+ tokens.push({ chainId: computeChainId, address: dynamicData.typeInfo.longToken });
35
36
  }
36
37
  // Case of weird AMMs
37
38
  if (!!dynamicData && !!dynamicData.typeInfo?.tokenA && !!dynamicData.typeInfo?.tokenB) {
38
- tokens.push({ chainId, address: dynamicData.typeInfo.tokenA });
39
- tokens.push({ chainId, address: dynamicData.typeInfo.tokenB });
39
+ tokens.push({ chainId: computeChainId, address: dynamicData.typeInfo.tokenA });
40
+ tokens.push({ chainId: computeChainId, address: dynamicData.typeInfo.tokenB });
40
41
  }
41
42
  // Case of AMMs
42
43
  if (!!dynamicData && !!dynamicData.typeInfo?.token0 && !!dynamicData.typeInfo?.token1) {
43
- tokens.push({ chainId, address: dynamicData.typeInfo.token0 });
44
- tokens.push({ chainId, address: dynamicData.typeInfo.token1 });
44
+ tokens.push({ chainId: computeChainId, address: dynamicData.typeInfo.token0 });
45
+ tokens.push({ chainId: computeChainId, address: dynamicData.typeInfo.token1 });
45
46
  }
46
47
  // Case of tripools
47
48
  if (!!dynamicData &&
48
49
  !!dynamicData.typeInfo?.token0Address &&
49
50
  !!dynamicData.typeInfo?.token1Address &&
50
51
  !!dynamicData.typeInfo?.token2Address) {
51
- tokens.push({ chainId, address: dynamicData.typeInfo.token0Address });
52
- tokens.push({ chainId, address: dynamicData.typeInfo.token1Address });
53
- tokens.push({ chainId, address: dynamicData.typeInfo.token2Address });
52
+ tokens.push({ chainId: computeChainId, address: dynamicData.typeInfo.token0Address });
53
+ tokens.push({ chainId: computeChainId, address: dynamicData.typeInfo.token1Address });
54
+ tokens.push({ chainId: computeChainId, address: dynamicData.typeInfo.token2Address });
54
55
  }
55
56
  }
56
57
  catch {
@@ -46,7 +46,21 @@ export declare const v4: Elysia<"/v4", false, {
46
46
  authorization: string;
47
47
  };
48
48
  response: {
49
- 200: void;
49
+ 200: {
50
+ name: string;
51
+ type: import("../../../database/api/.generated").$Enums.CampaignType;
52
+ id: string;
53
+ status: import("../../../database/api/.generated").$Enums.Status;
54
+ tags: string[];
55
+ identifier: string;
56
+ chainId: number;
57
+ action: import("../../../database/api/.generated").$Enums.OpportunityAction;
58
+ depositUrl: string | null;
59
+ mainProtocolId: string | null;
60
+ tvl: number;
61
+ apr: number;
62
+ dailyRewards: number;
63
+ } | null;
50
64
  };
51
65
  };
52
66
  };
@@ -531,7 +545,7 @@ export declare const v4: Elysia<"/v4", false, {
531
545
  headers: unknown;
532
546
  response: {
533
547
  200: {
534
- sum: File;
548
+ sum: string;
535
549
  };
536
550
  };
537
551
  };
@@ -14,7 +14,7 @@ export function generateCardName(type, typeInfo, campaign, symbols = [""]) {
14
14
  case tokenType.ra:
15
15
  case tokenType.syncswap:
16
16
  case tokenType.pancakeswap:
17
- return `${typeInfo.protocol} ${typeInfo.symbolToken0}/${typeInfo.symbolToken1}`;
17
+ return `Provide liquidity to ${typeInfo.protocol} ${typeInfo.symbolToken0}/${typeInfo.symbolToken1}`;
18
18
  case tokenType.pendleYT:
19
19
  return `Hold ${typeInfo.protocol} ${typeInfo.name}`;
20
20
  case tokenType.pendle:
@@ -22,14 +22,14 @@ export function generateCardName(type, typeInfo, campaign, symbols = [""]) {
22
22
  case tokenType.balancerGauge:
23
23
  return `${typeInfo.protocol} ${symbols.join("/")}`;
24
24
  case tokenType.balancerPool: {
25
- let cardName = `${typeInfo.protocol} ${symbols.join("/")}`;
25
+ let cardName = `Provide liquidity to ${typeInfo.protocol} ${symbols.join("/")}`;
26
26
  if (typeInfo.vault === "0xFB43069f6d0473B85686a85F4Ce4Fc1FD8F00875") {
27
- cardName = `Jellyverse Pool ${symbols.join("/")}`;
27
+ cardName = `Provide liquidity to Jellyverse Pool ${symbols.join("/")}`;
28
28
  }
29
29
  return cardName;
30
30
  }
31
31
  case tokenType.aura:
32
- return `${typeInfo.protocol} ${symbols.join("/")}`;
32
+ return `Provide liquidity to ${typeInfo.protocol} ${symbols.join("/")}`;
33
33
  case tokenType.gearbox:
34
34
  return `${typeInfo.protocol} ${typeInfo.symbolUnderlyingToken} Deposit`;
35
35
  case tokenType.compound:
@@ -71,7 +71,7 @@ export function generateCardName(type, typeInfo, campaign, symbols = [""]) {
71
71
  return `Supply ${typeInfo.symbolUnderlyingToken} on ${typeInfo.protocol} ${typeInfo.symbolCollateral} Silo`;
72
72
  case tokenType.curve:
73
73
  case tokenType.curve_2:
74
- return `${typeInfo.protocol} ${Object.values(typeInfo.poolTokens).join("/")}`;
74
+ return `Provide liquidity to ${typeInfo.protocol} ${Object.values(typeInfo.poolTokens).join("/")}`;
75
75
  case tokenType.fluid:
76
76
  return `Lend ${typeInfo.symbolUnderlyingToken} on ${typeInfo.protocol}`;
77
77
  case tokenType.enzyme:
@@ -81,7 +81,7 @@ export function generateCardName(type, typeInfo, campaign, symbols = [""]) {
81
81
  case tokenType.silostaking:
82
82
  return `Stake ${typeInfo.symbolUnderlyingToken} on ${typeInfo.protocol}`;
83
83
  case tokenType.beefy:
84
- return `${typeInfo.protocol} ${typeInfo.symbolToken0}/${typeInfo.symbolToken1}`;
84
+ return `Provide liquidity to ${typeInfo.protocol} ${typeInfo.symbolToken0}/${typeInfo.symbolToken1}`;
85
85
  case tokenType.toros:
86
86
  return `${typeInfo.name} (${campaign.campaignParameters.symbolTargetToken}) on ${typeInfo.protocol}`;
87
87
  case tokenType.ironcladStaking:
@@ -91,7 +91,7 @@ export function generateCardName(type, typeInfo, campaign, symbols = [""]) {
91
91
  case tokenType.maverickBoostedPosition:
92
92
  return `Maverick Boosted Position ${campaign.campaignParameters.symbolTargetToken}`;
93
93
  case tokenType.zkSwapThreePool:
94
- return `${typeInfo.protocol} ${typeInfo.symbolToken0}/${typeInfo.symbolToken1}/${typeInfo.symbolToken2}`;
94
+ return `Provide liquidity to ${typeInfo.protocol} ${typeInfo.symbolToken0}/${typeInfo.symbolToken1}/${typeInfo.symbolToken2}`;
95
95
  case tokenType.maha:
96
96
  return `Stake ${typeInfo.symbolToken0}/${typeInfo.symbolToken1} LP on ${typeInfo.protocol}`;
97
97
  case tokenType.tempest: