@merkl/api 0.20.157 → 0.20.159

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 (79) hide show
  1. package/dist/src/eden/index.d.ts +747 -747
  2. package/dist/src/engine/deprecated/dynamicData/factory.js +1 -0
  3. package/dist/src/engine/deprecated/dynamicData/implementations/EventBased.js +29 -5
  4. package/dist/src/engine/deprecated/erc20SubTypeProcessors/helpers/ownerFinder.js +1 -0
  5. package/dist/src/engine/deprecated/erc20SubTypeProcessors/implementations/processorMapping.d.ts +1 -3
  6. package/dist/src/engine/implementations/Erc20/subTypes/factories.js +4 -0
  7. package/dist/src/engine/implementations/Erc20/subTypes/implementations/lendleVaults/metadata.d.ts +16 -0
  8. package/dist/src/engine/implementations/Erc20/subTypes/implementations/lendleVaults/metadata.js +20 -0
  9. package/dist/src/engine/implementations/Erc20/subTypes/implementations/lendleVaults/tvl.d.ts +6 -0
  10. package/dist/src/engine/implementations/Erc20/subTypes/implementations/lendleVaults/tvl.js +53 -0
  11. package/dist/src/engine/implementations/Erc20/subTypes/index.d.ts +2 -1
  12. package/dist/src/engine/implementations/Erc20/subTypes/index.js +1 -0
  13. package/dist/src/engine/implementations/JsonAirdrop/metadata.d.ts +2 -2
  14. package/dist/src/engine/implementations/Locker/metadata.d.ts +24 -0
  15. package/dist/src/engine/implementations/Locker/metadata.js +36 -0
  16. package/dist/src/engine/implementations/Locker/tvl.d.ts +7 -0
  17. package/dist/src/engine/implementations/Locker/tvl.js +21 -0
  18. package/dist/src/engine/implementations/MultiLog/tvl.d.ts +1 -12
  19. package/dist/src/engine/implementations/MultiLog/tvl.js +1 -61
  20. package/dist/src/engine/metadata/factory.js +1 -0
  21. package/dist/src/engine/tvl/logStates.d.ts +17 -0
  22. package/dist/src/engine/tvl/logStates.js +106 -0
  23. package/dist/src/index.d.ts +255 -255
  24. package/dist/src/index.js +2 -2
  25. package/dist/src/modules/v4/boost/boost.controller.d.ts +1 -1
  26. package/dist/src/modules/v4/bucket/bucket.service.d.ts +2 -0
  27. package/dist/src/modules/v4/bucket/bucket.service.js +3 -0
  28. package/dist/src/modules/v4/campaign/campaign.controller.d.ts +41 -41
  29. package/dist/src/modules/v4/campaign/campaign.controller.js +0 -1
  30. package/dist/src/modules/v4/campaign/campaign.repository.d.ts +36 -36
  31. package/dist/src/modules/v4/campaign/campaign.service.d.ts +76 -76
  32. package/dist/src/modules/v4/campaign/campaign.test.controller.d.ts +18 -18
  33. package/dist/src/modules/v4/campaign/campaign.test.controller.js +0 -1
  34. package/dist/src/modules/v4/chain/chain.controller.d.ts +11 -11
  35. package/dist/src/modules/v4/chain/chain.repository.d.ts +13 -13
  36. package/dist/src/modules/v4/chain/chain.service.d.ts +14 -14
  37. package/dist/src/modules/v4/computedValue/computedValue.controller.d.ts +1 -1
  38. package/dist/src/modules/v4/computedValue/computedValue.repository.d.ts +1 -1
  39. package/dist/src/modules/v4/computedValue/computedValue.service.d.ts +1 -1
  40. package/dist/src/modules/v4/creator/creator.controller.d.ts +5 -5
  41. package/dist/src/modules/v4/creator/creator.repository.d.ts +5 -5
  42. package/dist/src/modules/v4/creator/creator.service.d.ts +4 -4
  43. package/dist/src/modules/v4/enso/enso.service.d.ts +2 -2
  44. package/dist/src/modules/v4/explorer/explorer.controller.d.ts +3 -3
  45. package/dist/src/modules/v4/explorer/explorer.repository.d.ts +4 -4
  46. package/dist/src/modules/v4/explorer/explorer.service.d.ts +5 -5
  47. package/dist/src/modules/v4/interaction/interaction.controller.d.ts +2 -2
  48. package/dist/src/modules/v4/opportunity/opportunity.controller.d.ts +105 -105
  49. package/dist/src/modules/v4/opportunity/opportunity.model.d.ts +3 -3
  50. package/dist/src/modules/v4/opportunity/opportunity.repository.d.ts +117 -117
  51. package/dist/src/modules/v4/opportunity/opportunity.service.d.ts +122 -122
  52. package/dist/src/modules/v4/price/price.controller.d.ts +4 -4
  53. package/dist/src/modules/v4/price/price.repository.d.ts +5 -5
  54. package/dist/src/modules/v4/price/price.service.d.ts +4 -4
  55. package/dist/src/modules/v4/price/price.service.js +7 -0
  56. package/dist/src/modules/v4/programPayload/programPayload.model.d.ts +18 -1
  57. package/dist/src/modules/v4/programPayload/programPayload.repository.d.ts +14 -7
  58. package/dist/src/modules/v4/programPayload/programPayload.repository.js +128 -8
  59. package/dist/src/modules/v4/protocol/protocol.controller.d.ts +24 -24
  60. package/dist/src/modules/v4/protocol/protocol.model.d.ts +1 -1
  61. package/dist/src/modules/v4/protocol/protocol.model.js +1 -0
  62. package/dist/src/modules/v4/protocol/protocol.repository.d.ts +14 -14
  63. package/dist/src/modules/v4/protocol/protocol.service.d.ts +6 -6
  64. package/dist/src/modules/v4/reward/reward.controller.d.ts +1 -1
  65. package/dist/src/modules/v4/reward/reward.controller.js +0 -1
  66. package/dist/src/modules/v4/reward/reward.repository.d.ts +12 -12
  67. package/dist/src/modules/v4/reward/reward.service.d.ts +82 -82
  68. package/dist/src/modules/v4/router.d.ts +255 -255
  69. package/dist/src/modules/v4/status/status.controller.d.ts +5 -5
  70. package/dist/src/modules/v4/status/status.repository.d.ts +11 -11
  71. package/dist/src/modules/v4/status/status.service.d.ts +7 -7
  72. package/dist/src/modules/v4/token/token.controller.d.ts +11 -11
  73. package/dist/src/modules/v4/token/token.repository.d.ts +4 -4
  74. package/dist/src/modules/v4/token/token.service.d.ts +14 -14
  75. package/dist/src/modules/v4/token/token.service.js +3 -3
  76. package/dist/src/modules/v4/uniswap/uniswap.repository.d.ts +1 -1
  77. package/dist/src/modules/v4/user/user.controller.d.ts +24 -24
  78. package/dist/tsconfig.package.tsbuildinfo +1 -1
  79. package/package.json +3 -3
@@ -62,5 +62,6 @@ const map = {
62
62
  [Campaign.ERC721]: new ERC721DynamicData(),
63
63
  [Campaign.ERC721FIXAPR]: new ERC721DynamicData(),
64
64
  [Campaign.MULTILOG]: new DefaultDynamicData(),
65
+ [Campaign.LOCKER]: new DefaultDynamicData(),
65
66
  };
66
67
  export const dynamicDataBuilderFactory = (campaignType) => map[campaignType];
@@ -10,15 +10,16 @@ import moment from "moment";
10
10
  * @dev important: using the most recent state save with current prices
11
11
  * it's only an estimate
12
12
  */
13
- async function computeEventBasedPoolRewardsFromMostRecentStateSave(chainId, campaignID, priceCurrency, decimalsCurrency) {
13
+ async function computeEventBasedPoolRewardsFromMostRecentStateSave(chainId, campaignID, priceCurrency, decimalsCurrency, computeMethod) {
14
14
  let stateSave;
15
15
  let blockNumber;
16
16
  let states = {};
17
17
  try {
18
18
  const currentBlock = await ChainInteractionService(chainId).getBlockNumber();
19
- const mostRecentStateSave = await engineDbClient.stateSave.findFirst({
19
+ const id = `EventBasedProcessor_${computeMethod}_${chainId}_${campaignID}`;
20
+ let mostRecentStateSave = await engineDbClient.stateSave.findFirst({
20
21
  where: {
21
- id: `EventBasedProcessor_${chainId}_${campaignID}`,
22
+ id: id,
22
23
  blockNumber: {
23
24
  lte: currentBlock,
24
25
  },
@@ -27,6 +28,20 @@ async function computeEventBasedPoolRewardsFromMostRecentStateSave(chainId, camp
27
28
  blockNumber: "desc",
28
29
  },
29
30
  });
31
+ if (!mostRecentStateSave) {
32
+ const historicalId = `EventBasedProcessor_${chainId}_${campaignID}`;
33
+ mostRecentStateSave = await engineDbClient.stateSave.findFirst({
34
+ where: {
35
+ id: historicalId,
36
+ blockNumber: {
37
+ lte: currentBlock,
38
+ },
39
+ },
40
+ orderBy: {
41
+ blockNumber: "desc",
42
+ },
43
+ });
44
+ }
30
45
  stateSave = mostRecentStateSave.state;
31
46
  blockNumber = mostRecentStateSave?.blockNumber;
32
47
  states = stateSave.states;
@@ -66,10 +81,19 @@ export class EventBasedDynamicData {
66
81
  chainId: chainId,
67
82
  symbol: symbolCurrency0,
68
83
  }));
69
- const { distributedRewards } = await computeEventBasedPoolRewardsFromMostRecentStateSave(chainId, campaign.campaignId, priceToken, decimalsCurrency0);
84
+ const { distributedRewards } = await computeEventBasedPoolRewardsFromMostRecentStateSave(chainId, campaign.campaignId, priceToken, decimalsCurrency0, campaign.campaignParameters.computeScoreParameters.computeMethod);
70
85
  const c = campaign;
71
86
  const amount = BN2Number(c.amount, c.campaignParameters.decimalsRewardToken);
72
- const multiplier = BN2Number(c.campaignParameters.topicToData[0].multipliers[0], 12 + 9);
87
+ let multiplier = 1;
88
+ try {
89
+ const topicData = c.campaignParameters.topicToData[0];
90
+ multiplier = BN2Number(topicData.multipliers[0], 12 + 9);
91
+ }
92
+ catch {
93
+ // Current legacy fix for now, can be removed on the 01/05/25
94
+ const topicData = c.campaignParameters.topicToData[0];
95
+ multiplier = BN2Number(topicData.multiplier, 12 + 9);
96
+ }
73
97
  const startTimestamp = BN2Number(c.startTimestamp, 0);
74
98
  const endTimestamp = BN2Number(c.endTimestamp, 0);
75
99
  const isLive = moment().unix() > startTimestamp && moment().unix() < endTimestamp;
@@ -4,6 +4,7 @@ const ownerAddresses = {
4
4
  "0x42a856dbEBB97AbC1269EAB32f3bb40C15102819": Erc20SubType.satlayer,
5
5
  "0x4C911bf7A008C497719CBEb1a376f1cEc9e2c1d6": Erc20SubType.hanji_liquidity_vault_token,
6
6
  "0x6e9d701fB6478Ed5972a37886C2BA6C82a4cBb4C": Erc20SubType.gamma, // Gamma Bob owner
7
+ "0x14fB20565a11b15cA2065A06740A0C46F5986eD0": Erc20SubType.lendle_vaults, // Gamma Alice owner
7
8
  };
8
9
  export function getTypeFromOwnerAddress(address) {
9
10
  if (ownerAddresses[address]) {
@@ -1,6 +1,4 @@
1
1
  import { Erc20SubType } from "@/engine/implementations/Erc20/subTypes";
2
2
  import { GenericProcessor } from "../GenericProcessor";
3
3
  import type { callKeys, dataRaw, dataType } from "../GenericProcessor";
4
- export declare const processorMapping: {
5
- [key in Erc20SubType]: typeof GenericProcessor<callKeys, dataRaw, dataType>;
6
- };
4
+ export declare const processorMapping: Record<Erc20SubType, typeof GenericProcessor<callKeys, dataRaw, dataType>>;
@@ -3,6 +3,8 @@ import { EulerMetadata } from "./implementations/euler/metadata";
3
3
  import { EulerTVLBuilder } from "./implementations/euler/tvl";
4
4
  import { GearboxMetadata } from "./implementations/gearbox/metadata";
5
5
  import { GearboxTVLBuilder } from "./implementations/gearbox/tvl";
6
+ import { LendleMetadata } from "./implementations/lendleVaults/metadata";
7
+ import { LendleTVLBuilder } from "./implementations/lendleVaults/tvl";
6
8
  import { SuperlendMetadata } from "./implementations/superlend/metadata";
7
9
  import { SuperlendTVLBuilder } from "./implementations/superlend/tvl";
8
10
  /**
@@ -17,6 +19,7 @@ const tvlMap = {
17
19
  [Erc20SubType.superlend_lending]: new SuperlendTVLBuilder(),
18
20
  [Erc20SubType.euler_borrow]: new EulerTVLBuilder(),
19
21
  [Erc20SubType.euler_lend]: new EulerTVLBuilder(),
22
+ [Erc20SubType.lendle_vaults]: new LendleTVLBuilder(),
20
23
  };
21
24
  export const erc20SubTypeTVLBuilderFactory = (erc20Subtype) => {
22
25
  if (!tvlMap[erc20Subtype]) {
@@ -36,6 +39,7 @@ const metadataMap = {
36
39
  [Erc20SubType.superlend_lending]: new SuperlendMetadata(),
37
40
  [Erc20SubType.euler_borrow]: new EulerMetadata(),
38
41
  [Erc20SubType.euler_lend]: new EulerMetadata(),
42
+ [Erc20SubType.lendle_vaults]: new LendleMetadata(),
39
43
  };
40
44
  export const erc20SubTypeMetadataBuilderFactory = (erc20Subtype) => {
41
45
  if (!metadataMap[erc20Subtype]) {
@@ -0,0 +1,16 @@
1
+ import type { MetadataBuilder } from "@/engine/metadata/interface";
2
+ import type { CampaignWithParams } from "@/modules/v4/campaign/campaign.model";
3
+ import type { ProtocolId } from "@/modules/v4/protocol/protocol.model";
4
+ import type { Erc20LikeCampaignEnum } from "../..";
5
+ export declare class LendleMetadata implements MetadataBuilder<Erc20LikeCampaignEnum> {
6
+ build(campaign: Omit<CampaignWithParams<Erc20LikeCampaignEnum>, "manualOverrides">): Promise<{
7
+ action: "LEND";
8
+ mainProtocol: ProtocolId;
9
+ name: string;
10
+ tokens: {
11
+ chainId: number;
12
+ address: any;
13
+ }[];
14
+ explorerAddress: any;
15
+ }>;
16
+ }
@@ -0,0 +1,20 @@
1
+ import { OpportunityAction } from "@db/api";
2
+ import { ChainInteractionService, LendleVault__factory, TokenInteractionService } from "@sdk";
3
+ export class LendleMetadata {
4
+ async build(campaign) {
5
+ const { params, computeChainId } = campaign;
6
+ const { targetToken } = params;
7
+ const underlyingToken = await LendleVault__factory.connect(targetToken, ChainInteractionService(computeChainId).provider()).want();
8
+ const underlyingTokenSymbol = await TokenInteractionService(computeChainId).symbol(underlyingToken);
9
+ return {
10
+ action: OpportunityAction.LEND,
11
+ mainProtocol: "lendle",
12
+ name: `Deposit ${underlyingTokenSymbol} on Lendle vaults`,
13
+ tokens: [
14
+ { chainId: computeChainId, address: targetToken },
15
+ { chainId: computeChainId, address: underlyingToken },
16
+ ],
17
+ explorerAddress: params.targetToken,
18
+ };
19
+ }
20
+ }
@@ -0,0 +1,6 @@
1
+ import type { Erc20LikeCampaignEnum } from "@/engine/implementations/Erc20/subTypes";
2
+ import type { TVLBuilder, TVLData } from "@/engine/tvl/interface";
3
+ import { type CampaignParameters, type MerklChainId } from "@sdk";
4
+ export declare class LendleTVLBuilder implements TVLBuilder<Erc20LikeCampaignEnum> {
5
+ build(computeChainId: MerklChainId, campaigns: CampaignParameters<Erc20LikeCampaignEnum>[]): Promise<TVLData<any>>;
6
+ }
@@ -0,0 +1,53 @@
1
+ import { TokenService } from "@/modules/v4/token/token.service";
2
+ import { TvlType } from "@db/api";
3
+ import { ChainInteractionService, LendleVaultInterface, bigIntToNumber, } from "@sdk";
4
+ export class LendleTVLBuilder {
5
+ async build(computeChainId, campaigns) {
6
+ const tvls = [];
7
+ const calls = [];
8
+ for (const campaign of campaigns) {
9
+ const { targetToken } = campaign.campaignParameters;
10
+ calls.push({
11
+ allowFailure: true,
12
+ callData: LendleVaultInterface.encodeFunctionData("want"),
13
+ target: targetToken,
14
+ }, {
15
+ allowFailure: true,
16
+ callData: LendleVaultInterface.encodeFunctionData("getPricePerFullShare"),
17
+ target: targetToken,
18
+ }, {
19
+ allowFailure: true,
20
+ callData: LendleVaultInterface.encodeFunctionData("totalSupply"),
21
+ target: targetToken,
22
+ });
23
+ }
24
+ const result = await ChainInteractionService(computeChainId).fetchState(calls);
25
+ for (const [index, campaign] of campaigns.entries()) {
26
+ const underlyingTokenAddress = LendleVaultInterface.decodeFunctionResult("want", result[3 * index].returnData)[0];
27
+ const underlyingPerShare = LendleVaultInterface.decodeFunctionResult("getPricePerFullShare", result[3 * index + 1].returnData)[0];
28
+ const totalSupply = LendleVaultInterface.decodeFunctionResult("totalSupply", result[3 * index + 2].returnData)[0];
29
+ const underlyingToken = await TokenService.findUniqueFillOrThrow({
30
+ chainId: computeChainId,
31
+ address: underlyingTokenAddress,
32
+ });
33
+ if (!underlyingToken.decimals || !underlyingToken.price) {
34
+ throw new Error(`Missing decimals or price for token ${underlyingToken.address}`);
35
+ }
36
+ const totalAssets = bigIntToNumber(underlyingPerShare, 18) *
37
+ bigIntToNumber(totalSupply, campaign.campaignParameters.decimalsTargetToken);
38
+ const tvl = totalAssets * underlyingToken.price;
39
+ tvls.push({
40
+ campaign,
41
+ tvl,
42
+ tvlBreakdown: [
43
+ {
44
+ identifier: underlyingToken.id,
45
+ type: TvlType.TOKEN,
46
+ value: totalAssets,
47
+ },
48
+ ],
49
+ });
50
+ }
51
+ return tvls;
52
+ }
53
+ }
@@ -106,5 +106,6 @@ export declare enum Erc20SubType {
106
106
  sake_borrowing = "sake_borrowing",
107
107
  sake_lending = "sake_lending",
108
108
  gamma = "gamma",
109
- stability = "stability"
109
+ stability = "stability",
110
+ lendle_vaults = "lendle_vaults"
110
111
  }
@@ -106,4 +106,5 @@ export var Erc20SubType;
106
106
  Erc20SubType["sake_lending"] = "sake_lending";
107
107
  Erc20SubType["gamma"] = "gamma";
108
108
  Erc20SubType["stability"] = "stability";
109
+ Erc20SubType["lendle_vaults"] = "lendle_vaults";
109
110
  })(Erc20SubType || (Erc20SubType = {}));
@@ -10,13 +10,13 @@ export declare class JsonAirdropMetadata implements MetadataBuilder<campaignType
10
10
  chainId: number;
11
11
  address: string;
12
12
  }[];
13
- mainProtocol: "splice" | "reserve" | "morpho" | "quickswap" | "euler" | "aura" | "poolside" | "gearbox" | "filament" | "fluid" | "compound" | "ionic" | "layerbank" | "moonwell" | "fraxlend" | "fenix" | "ra" | "syncswap" | "beefy" | "aerodrome" | "velodrome" | "curve" | "toros" | "akron" | "enzyme" | "dragonswap" | "koi" | "rfx" | "woofi" | "pendle" | "zkSwapThreePool" | "maha" | "tempest" | "holdstation" | "venus" | "reactor_fusion" | "vicuna" | "curveNPool" | "satlayer" | "veda" | "cian" | "concrete" | "hourglass" | "katana" | "gamma" | "stability" | "uniswap" | "ambient" | "arthswap" | "base-swap" | "camelot" | "crust" | "horiza" | "izumi" | "kim" | "pancake-swap" | "ramses" | "retro" | "stryke" | "sushi-swap" | "swapr" | "thruster" | "voltage" | "zero" | "supswap" | "zk-swap" | "thirdtrade" | "swap-x" | "balancer" | "cross_curve" | "neptune" | "maverick" | "trader-joe" | "hanji" | "radiant" | "aave" | "ironclad" | "sturdy" | "frax" | "silo" | "dolomite" | "badger" | "ajna" | "ion" | "eigenlayer" | "vest" | "zerolend" | "lnd" | "hyperdrive" | "oku" | "kyo" | "sonex" | "lendle" | "tako-tako" | "equalizer" | "spectra" | "beraborrow" | "superlend" | "avalon" | "iguana" | "xlend" | "sake" | "sonicmarket" | "angles" | "bunni" | "beratrax" | "yei" | "gammaswap" | "uranium" | undefined;
13
+ mainProtocol: "splice" | "reserve" | "morpho" | "quickswap" | "euler" | "aura" | "poolside" | "gearbox" | "filament" | "fluid" | "compound" | "ionic" | "layerbank" | "moonwell" | "fraxlend" | "fenix" | "ra" | "syncswap" | "beefy" | "aerodrome" | "velodrome" | "curve" | "toros" | "akron" | "enzyme" | "dragonswap" | "koi" | "rfx" | "woofi" | "pendle" | "zkSwapThreePool" | "maha" | "tempest" | "holdstation" | "venus" | "reactor_fusion" | "vicuna" | "curveNPool" | "satlayer" | "veda" | "cian" | "concrete" | "hourglass" | "katana" | "gamma" | "stability" | "uniswap" | "ambient" | "arthswap" | "base-swap" | "camelot" | "crust" | "horiza" | "izumi" | "kim" | "pancake-swap" | "ramses" | "retro" | "stryke" | "sushi-swap" | "swapr" | "thruster" | "voltage" | "zero" | "supswap" | "zk-swap" | "thirdtrade" | "swap-x" | "balancer" | "cross_curve" | "neptune" | "maverick" | "trader-joe" | "hanji" | "radiant" | "aave" | "ironclad" | "sturdy" | "frax" | "silo" | "dolomite" | "badger" | "ajna" | "ion" | "eigenlayer" | "vest" | "zerolend" | "lnd" | "hyperdrive" | "oku" | "kyo" | "sonex" | "lendle" | "tako-tako" | "equalizer" | "spectra" | "beraborrow" | "superlend" | "avalon" | "iguana" | "xlend" | "sake" | "sonicmarket" | "angles" | "bunni" | "beratrax" | "yei" | "gammaswap" | "uranium" | "puffer" | undefined;
14
14
  depositUrl?: undefined;
15
15
  } | {
16
16
  action: "DROP";
17
17
  name: string;
18
18
  tokens: never[];
19
- mainProtocol: "splice" | "reserve" | "morpho" | "quickswap" | "euler" | "aura" | "poolside" | "gearbox" | "filament" | "fluid" | "compound" | "ionic" | "layerbank" | "moonwell" | "fraxlend" | "fenix" | "ra" | "syncswap" | "beefy" | "aerodrome" | "velodrome" | "curve" | "toros" | "akron" | "enzyme" | "dragonswap" | "koi" | "rfx" | "woofi" | "pendle" | "zkSwapThreePool" | "maha" | "tempest" | "holdstation" | "venus" | "reactor_fusion" | "vicuna" | "curveNPool" | "satlayer" | "veda" | "cian" | "concrete" | "hourglass" | "katana" | "gamma" | "stability" | "uniswap" | "ambient" | "arthswap" | "base-swap" | "camelot" | "crust" | "horiza" | "izumi" | "kim" | "pancake-swap" | "ramses" | "retro" | "stryke" | "sushi-swap" | "swapr" | "thruster" | "voltage" | "zero" | "supswap" | "zk-swap" | "thirdtrade" | "swap-x" | "balancer" | "cross_curve" | "neptune" | "maverick" | "trader-joe" | "hanji" | "radiant" | "aave" | "ironclad" | "sturdy" | "frax" | "silo" | "dolomite" | "badger" | "ajna" | "ion" | "eigenlayer" | "vest" | "zerolend" | "lnd" | "hyperdrive" | "oku" | "kyo" | "sonex" | "lendle" | "tako-tako" | "equalizer" | "spectra" | "beraborrow" | "superlend" | "avalon" | "iguana" | "xlend" | "sake" | "sonicmarket" | "angles" | "bunni" | "beratrax" | "yei" | "gammaswap" | "uranium" | undefined;
19
+ mainProtocol: "splice" | "reserve" | "morpho" | "quickswap" | "euler" | "aura" | "poolside" | "gearbox" | "filament" | "fluid" | "compound" | "ionic" | "layerbank" | "moonwell" | "fraxlend" | "fenix" | "ra" | "syncswap" | "beefy" | "aerodrome" | "velodrome" | "curve" | "toros" | "akron" | "enzyme" | "dragonswap" | "koi" | "rfx" | "woofi" | "pendle" | "zkSwapThreePool" | "maha" | "tempest" | "holdstation" | "venus" | "reactor_fusion" | "vicuna" | "curveNPool" | "satlayer" | "veda" | "cian" | "concrete" | "hourglass" | "katana" | "gamma" | "stability" | "uniswap" | "ambient" | "arthswap" | "base-swap" | "camelot" | "crust" | "horiza" | "izumi" | "kim" | "pancake-swap" | "ramses" | "retro" | "stryke" | "sushi-swap" | "swapr" | "thruster" | "voltage" | "zero" | "supswap" | "zk-swap" | "thirdtrade" | "swap-x" | "balancer" | "cross_curve" | "neptune" | "maverick" | "trader-joe" | "hanji" | "radiant" | "aave" | "ironclad" | "sturdy" | "frax" | "silo" | "dolomite" | "badger" | "ajna" | "ion" | "eigenlayer" | "vest" | "zerolend" | "lnd" | "hyperdrive" | "oku" | "kyo" | "sonex" | "lendle" | "tako-tako" | "equalizer" | "spectra" | "beraborrow" | "superlend" | "avalon" | "iguana" | "xlend" | "sake" | "sonicmarket" | "angles" | "bunni" | "beratrax" | "yei" | "gammaswap" | "uranium" | "puffer" | undefined;
20
20
  depositUrl: any;
21
21
  }>;
22
22
  static generateUrl(_computeChainId: ChainId, params: CampaignParameters<campaignType>["campaignParameters"]): any;
@@ -0,0 +1,24 @@
1
+ import type { MetadataBuilder } from "@/engine/metadata/interface";
2
+ import type { CampaignWithParams } from "@/modules/v4/campaign/campaign.model";
3
+ import type { CampaignParameters, Campaign as CampaignType, ChainId } from "@sdk";
4
+ type campaignType = CampaignType.LOCKER;
5
+ export declare class LockerMetadata implements MetadataBuilder<campaignType> {
6
+ build(campaign: Omit<CampaignWithParams<campaignType>, "manualOverrides">): Promise<{
7
+ action: "SWAP";
8
+ name: string;
9
+ tokens: {
10
+ chainId: number;
11
+ address: string;
12
+ }[];
13
+ mainProtocol: "puffer";
14
+ depositUrl: any;
15
+ } | {
16
+ action: string;
17
+ name: string;
18
+ tokens: never[];
19
+ mainProtocol: undefined;
20
+ depositUrl?: undefined;
21
+ }>;
22
+ static generateUrl(_computeChainId: ChainId, params: CampaignParameters<campaignType>["campaignParameters"]): any;
23
+ }
24
+ export {};
@@ -0,0 +1,36 @@
1
+ import { capitalize } from "@/utils/caseChanges";
2
+ export class LockerMetadata {
3
+ async build(campaign) {
4
+ const { params, computeChainId } = campaign;
5
+ try {
6
+ const action = "SWAP";
7
+ const mainProtocolId = "puffer";
8
+ let name = `Lock on ${capitalize(mainProtocolId)}`;
9
+ let tokens = [];
10
+ let hardcodeUrl;
11
+ if (params.lockerContract === "0x48e8dE138C246c14248C94d2D616a2F9eb4590D2") {
12
+ hardcodeUrl = "https://app.puffer.fi/stake";
13
+ name = `Lock CARROT on ${capitalize(mainProtocolId)}`;
14
+ tokens = [{ chainId: computeChainId, address: "0x8A5A5DE9db5770123Ff2145F59e9F20047f0A8EC" }];
15
+ }
16
+ return {
17
+ action,
18
+ name,
19
+ tokens,
20
+ mainProtocol: mainProtocolId,
21
+ depositUrl: hardcodeUrl ?? LockerMetadata.generateUrl(computeChainId, params),
22
+ };
23
+ }
24
+ catch {
25
+ return {
26
+ action: "INVALID",
27
+ name: "Locker Campaign",
28
+ tokens: [],
29
+ mainProtocol: undefined,
30
+ };
31
+ }
32
+ }
33
+ static generateUrl(_computeChainId, params) {
34
+ return params.url;
35
+ }
36
+ }
@@ -0,0 +1,7 @@
1
+ import type { TVLBuilder, TVLData } from "@/engine/tvl/interface";
2
+ import { type CampaignParameters, Campaign as CampaignType, type MerklChainId } from "@sdk";
3
+ type campaignType = CampaignType.LOCKER;
4
+ export declare class LockerTVLBuilder implements TVLBuilder<campaignType> {
5
+ build(computeChainId: MerklChainId, campaigns: CampaignParameters<campaignType>[]): Promise<TVLData<CampaignType.LOCKER>>;
6
+ }
7
+ export {};
@@ -0,0 +1,21 @@
1
+ import { computeLockerAmountFromMostRecentStateSave } from "@/engine/tvl/logStates";
2
+ import { TokenService } from "@/modules/v4/token/token.service";
3
+ import { Campaign as CampaignType } from "@sdk";
4
+ export class LockerTVLBuilder {
5
+ async build(computeChainId, campaigns) {
6
+ const tvls = [];
7
+ for (const campaign of campaigns) {
8
+ const lockedAmount = (await computeLockerAmountFromMostRecentStateSave(computeChainId, CampaignType.LOCKER, campaign)).lockedAmount;
9
+ let tvl = 1;
10
+ if (campaign.campaignParameters.lockerContract === "0x48e8dE138C246c14248C94d2D616a2F9eb4590D2") {
11
+ tvl = lockedAmount * (await TokenService.getPrice({ address: "0x8A5A5DE9db5770123Ff2145F59e9F20047f0A8EC" }));
12
+ tvls.push({
13
+ campaign: campaign,
14
+ tvl,
15
+ tvlBreakdown: [],
16
+ });
17
+ }
18
+ }
19
+ return tvls;
20
+ }
21
+ }
@@ -1,18 +1,7 @@
1
1
  import type { TVLBuilder, TVLData } from "@/engine/tvl/interface";
2
- import { type CampaignParameters, Campaign as CampaignType, type MerklChainId } from "@sdk";
2
+ import { type CampaignParameters, type Campaign as CampaignType, type MerklChainId } from "@sdk";
3
3
  type campaignType = CampaignType.MULTILOG;
4
- type composedType = CampaignType.ERC20LOGPROCESSOR | CampaignType.EVENT_BASED | CampaignType.ERC20REBASELOGPROCESSOR;
5
4
  export declare class MultiLogTVLBuilder implements TVLBuilder<campaignType> {
6
5
  build(_computeChainId: MerklChainId, campaigns: CampaignParameters<campaignType>[]): Promise<TVLData<CampaignType.MULTILOG>>;
7
- getIdPerCampaignType(campaignType: CampaignType, campaign: CampaignParameters<composedType>): string | undefined;
8
- /**
9
- * Compute TVL
10
- * @dev important: using the most recent state save with current prices
11
- * it's only an estimate
12
- */
13
- computeEventBasedPoolRewardsFromMostRecentStateSave(chainId: MerklChainId, campaignType: CampaignType, campaign: CampaignParameters<composedType>): Promise<{
14
- distributedRewards: number;
15
- blockNumber: number;
16
- }>;
17
6
  }
18
7
  export {};
@@ -1,7 +1,5 @@
1
- import { BucketService } from "@/modules/v4/bucket/bucket.service";
2
1
  import { DynamicDataService } from "@/modules/v4/dynamicData/dynamicData.service";
3
- import { engineDbClient } from "@db";
4
- import { BN2Number, Campaign as CampaignType, ChainInteractionService, ComposedType, } from "@sdk";
2
+ import { ComposedType } from "@sdk";
5
3
  export class MultiLogTVLBuilder {
6
4
  async build(_computeChainId, campaigns) {
7
5
  const tvls = [];
@@ -25,62 +23,4 @@ export class MultiLogTVLBuilder {
25
23
  }
26
24
  return tvls;
27
25
  }
28
- // TODO: handle multiple main composed campaigns
29
- getIdPerCampaignType(campaignType, campaign) {
30
- switch (campaignType) {
31
- case CampaignType.ERC20LOGPROCESSOR:
32
- case CampaignType.ERC20REBASELOGPROCESSOR:
33
- campaign = campaign;
34
- return `ERC20LogProcessor_${campaign.computeChainId}_${campaign.campaignParameters.targetToken}`;
35
- case CampaignType.EVENT_BASED:
36
- campaign = campaign;
37
- return `EventBasedProcessor_${campaign.computeChainId}_${campaign.campaignId}`;
38
- }
39
- }
40
- /**
41
- * Compute TVL
42
- * @dev important: using the most recent state save with current prices
43
- * it's only an estimate
44
- */
45
- // TODO: handle multiple main composed campaigns
46
- async computeEventBasedPoolRewardsFromMostRecentStateSave(chainId, campaignType, campaign) {
47
- let stateSave;
48
- let blockNumber;
49
- let states = {};
50
- try {
51
- const currentBlock = await ChainInteractionService(chainId).getBlockNumber();
52
- const mostRecentStateSave = await engineDbClient.stateSave.findFirst({
53
- where: {
54
- id: this.getIdPerCampaignType(campaignType, campaign),
55
- blockNumber: {
56
- lte: currentBlock,
57
- },
58
- },
59
- orderBy: {
60
- blockNumber: "desc",
61
- },
62
- });
63
- stateSave = mostRecentStateSave.state;
64
- blockNumber = mostRecentStateSave?.blockNumber;
65
- states = stateSave.states;
66
- // const globalState = stateSave.globalState as { tick: number; liquidity: string };
67
- }
68
- catch { }
69
- const { fileName, bucketName } = states;
70
- // Bucket service
71
- let distributedRewards = 0;
72
- if (!fileName || !bucketName) {
73
- return { distributedRewards, blockNumber: blockNumber };
74
- }
75
- try {
76
- const bucket = new BucketService("merkl-production-states", "merkl-production");
77
- const storedStates = JSON.parse(await bucket.pull(fileName));
78
- for (const [_, { value, params: _params }] of Object.entries(storedStates)) {
79
- distributedRewards += BN2Number(value.allTimeValue, 18);
80
- }
81
- distributedRewards = Math.max(distributedRewards, 1);
82
- }
83
- catch { }
84
- return { distributedRewards, blockNumber: blockNumber };
85
- }
86
26
  }
@@ -68,5 +68,6 @@ const map = {
68
68
  [Campaign.ERC721]: new Erc721Metadata(),
69
69
  [Campaign.ERC721FIXAPR]: new Erc721Metadata(),
70
70
  [Campaign.MULTILOG]: new MultiLogMetaData(),
71
+ [Campaign.LOCKER]: new DefaultMetadata(), // TODO
71
72
  };
72
73
  export const metadataBuilderFactory = (campaignType) => map[campaignType];
@@ -0,0 +1,17 @@
1
+ import { type CampaignParameters, Campaign as CampaignType, type MerklChainId } from "@sdk";
2
+ type logProcessorType = CampaignType.ERC20LOGPROCESSOR | CampaignType.EVENT_BASED | CampaignType.LOCKER | CampaignType.ERC20REBASELOGPROCESSOR;
3
+ export declare function getIdPerCampaignType(campaignType: CampaignType, campaign: CampaignParameters<logProcessorType>): string | undefined;
4
+ /**
5
+ * Compute TVL
6
+ * @dev important: using the most recent state save with current prices
7
+ * it's only an estimate
8
+ */
9
+ export declare function computeEventBasedPoolRewardsFromMostRecentStateSave(chainId: MerklChainId, campaignType: CampaignType, campaign: CampaignParameters<logProcessorType>): Promise<{
10
+ distributedRewards: number;
11
+ blockNumber: number;
12
+ }>;
13
+ export declare function computeLockerAmountFromMostRecentStateSave(chainId: MerklChainId, campaignType: CampaignType, campaign: CampaignParameters<CampaignType.LOCKER>): Promise<{
14
+ lockedAmount: number;
15
+ blockNumber: number;
16
+ }>;
17
+ export {};
@@ -0,0 +1,106 @@
1
+ import { BucketService } from "@/modules/v4/bucket/bucket.service";
2
+ import { engineDbClient } from "@db";
3
+ import { BN2Number, Campaign as CampaignType, ChainInteractionService, } from "@sdk";
4
+ // TODO: handle multiple main composed campaigns
5
+ export function getIdPerCampaignType(campaignType, campaign) {
6
+ switch (campaignType) {
7
+ case CampaignType.ERC20LOGPROCESSOR:
8
+ case CampaignType.ERC20REBASELOGPROCESSOR:
9
+ campaign = campaign;
10
+ return `ERC20LogProcessor_${campaign.computeChainId}_${campaign.campaignParameters.targetToken}`;
11
+ case CampaignType.EVENT_BASED:
12
+ campaign = campaign;
13
+ return `EventBasedProcessor_${campaign.computeChainId}_${campaign.campaignId}`;
14
+ case CampaignType.LOCKER:
15
+ campaign = campaign;
16
+ return `LOCKER_${campaign.campaignParameters.lockerContract}`;
17
+ }
18
+ }
19
+ /**
20
+ * Compute TVL
21
+ * @dev important: using the most recent state save with current prices
22
+ * it's only an estimate
23
+ */
24
+ // TODO: handle multiple main composed campaigns
25
+ export async function computeEventBasedPoolRewardsFromMostRecentStateSave(chainId, campaignType, campaign) {
26
+ let stateSave;
27
+ let blockNumber;
28
+ let states = {};
29
+ try {
30
+ const currentBlock = await ChainInteractionService(chainId).getBlockNumber();
31
+ const mostRecentStateSave = await engineDbClient.stateSave.findFirst({
32
+ where: {
33
+ id: getIdPerCampaignType(campaignType, campaign),
34
+ blockNumber: {
35
+ lte: currentBlock,
36
+ },
37
+ },
38
+ orderBy: {
39
+ blockNumber: "desc",
40
+ },
41
+ });
42
+ stateSave = mostRecentStateSave.state;
43
+ blockNumber = mostRecentStateSave?.blockNumber;
44
+ states = stateSave.states;
45
+ // const globalState = stateSave.globalState as { tick: number; liquidity: string };
46
+ }
47
+ catch { }
48
+ const { fileName, bucketName } = states;
49
+ // Bucket service
50
+ let distributedRewards = 0;
51
+ if (!fileName || !bucketName) {
52
+ return { distributedRewards, blockNumber: blockNumber };
53
+ }
54
+ try {
55
+ const bucket = new BucketService("merkl-production-states", "merkl-production");
56
+ const storedStates = JSON.parse(await bucket.pull(fileName));
57
+ for (const [_, { value, params: _params }] of Object.entries(storedStates)) {
58
+ distributedRewards += BN2Number(value.allTimeValue, 18);
59
+ }
60
+ distributedRewards = Math.max(distributedRewards, 1);
61
+ }
62
+ catch { }
63
+ return { distributedRewards, blockNumber: blockNumber };
64
+ }
65
+ export async function computeLockerAmountFromMostRecentStateSave(chainId, campaignType, campaign) {
66
+ let stateSave;
67
+ let blockNumber;
68
+ let states = {};
69
+ try {
70
+ const currentBlock = await ChainInteractionService(chainId).getBlockNumber();
71
+ const mostRecentStateSave = await engineDbClient.stateSave.findFirst({
72
+ where: {
73
+ id: getIdPerCampaignType(campaignType, campaign),
74
+ blockNumber: {
75
+ lte: currentBlock,
76
+ },
77
+ },
78
+ orderBy: {
79
+ blockNumber: "desc",
80
+ },
81
+ });
82
+ stateSave = mostRecentStateSave.state;
83
+ blockNumber = mostRecentStateSave?.blockNumber;
84
+ states = stateSave.states;
85
+ // const globalState = stateSave.globalState as { tick: number; liquidity: string };
86
+ }
87
+ catch { }
88
+ const { fileName, bucketName } = states;
89
+ // Bucket service
90
+ let lockedAmount = 0;
91
+ if (!fileName || !bucketName) {
92
+ return { lockedAmount, blockNumber: blockNumber };
93
+ }
94
+ try {
95
+ const bucket = new BucketService("merkl-production-states", "merkl-production");
96
+ const storedStates = JSON.parse(await bucket.pull(fileName));
97
+ for (const [_, { value, params: _params }] of Object.entries(storedStates)) {
98
+ for (const slot of Object.values(value.slots)) {
99
+ lockedAmount += BN2Number(slot.lockedAmount, 18);
100
+ }
101
+ }
102
+ lockedAmount = Math.max(lockedAmount, 1);
103
+ }
104
+ catch { }
105
+ return { lockedAmount, blockNumber: blockNumber };
106
+ }