@merkl/api 0.20.61 → 0.20.63

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 (25) hide show
  1. package/dist/src/eden/index.d.ts +25 -0
  2. package/dist/src/engine/dynamicData/factory.js +3 -2
  3. package/dist/src/engine/dynamicData/implementations/Clamm.js +58 -61
  4. package/dist/src/engine/dynamicData/implementations/CompoundV3.d.ts +7 -0
  5. package/dist/src/engine/dynamicData/implementations/CompoundV3.js +69 -0
  6. package/dist/src/engine/opportunityMetadata/factory.js +3 -2
  7. package/dist/src/engine/opportunityMetadata/implementations/CompoundV3.d.ts +17 -0
  8. package/dist/src/engine/opportunityMetadata/implementations/CompoundV3.js +19 -0
  9. package/dist/src/index.d.ts +5 -0
  10. package/dist/src/jobs/update-analytics.d.ts +1 -0
  11. package/dist/src/jobs/update-analytics.js +21 -0
  12. package/dist/src/jobs/update-rpc-calls-cache.js +2 -1
  13. package/dist/src/modules/v4/campaign/campaign.controller.js +5 -3
  14. package/dist/src/modules/v4/opportunity/opportunity.controller.js +1 -0
  15. package/dist/src/modules/v4/programPayload/programPayload.controller.d.ts +5 -0
  16. package/dist/src/modules/v4/programPayload/programPayload.model.d.ts +15 -2
  17. package/dist/src/modules/v4/programPayload/programPayload.model.js +2 -0
  18. package/dist/src/modules/v4/programPayload/programPayload.repository.d.ts +64 -3
  19. package/dist/src/modules/v4/programPayload/programPayload.repository.js +81 -13
  20. package/dist/src/modules/v4/programPayload/programPayload.service.js +5 -0
  21. package/dist/src/modules/v4/reward/reward.controller.js +5 -3
  22. package/dist/src/modules/v4/router.d.ts +5 -0
  23. package/dist/src/modules/v4/token/token.service.js +1 -2
  24. package/dist/tsconfig.package.tsbuildinfo +1 -1
  25. package/package.json +2 -1
@@ -3551,6 +3551,7 @@ declare const eden: {
3551
3551
  get: (options: {
3552
3552
  headers?: Record<string, unknown> | undefined;
3553
3553
  query: {
3554
+ apr?: number | undefined;
3554
3555
  creator: string;
3555
3556
  campaign: string;
3556
3557
  distributionChainId: number;
@@ -3578,6 +3579,7 @@ declare const eden: {
3578
3579
  get: (options: {
3579
3580
  headers?: Record<string, unknown> | undefined;
3580
3581
  query: {
3582
+ apr?: number | undefined;
3581
3583
  creator: string;
3582
3584
  campaign: string;
3583
3585
  distributionChainId: number;
@@ -3610,6 +3612,7 @@ declare const eden: {
3610
3612
  get: (options: {
3611
3613
  headers?: Record<string, unknown> | undefined;
3612
3614
  query: {
3615
+ apr?: number | undefined;
3613
3616
  creator: string;
3614
3617
  campaign: string;
3615
3618
  distributionChainId: number;
@@ -3631,6 +3634,7 @@ declare const eden: {
3631
3634
  headers?: Record<string, unknown> | undefined;
3632
3635
  query: {
3633
3636
  amount?: string | undefined;
3637
+ apr?: number | undefined;
3634
3638
  creator: string;
3635
3639
  distributionChainId: number;
3636
3640
  startTimestamp: number;
@@ -3658,6 +3662,7 @@ declare const eden: {
3658
3662
  headers?: Record<string, unknown> | undefined;
3659
3663
  query: {
3660
3664
  amount?: string | undefined;
3665
+ apr?: number | undefined;
3661
3666
  creator: string;
3662
3667
  distributionChainId: number;
3663
3668
  startTimestamp: number;
@@ -7579,6 +7584,7 @@ declare const eden: {
7579
7584
  get: (options: {
7580
7585
  headers?: Record<string, unknown> | undefined;
7581
7586
  query: {
7587
+ apr?: number | undefined;
7582
7588
  creator: string;
7583
7589
  campaign: string;
7584
7590
  distributionChainId: number;
@@ -7606,6 +7612,7 @@ declare const eden: {
7606
7612
  get: (options: {
7607
7613
  headers?: Record<string, unknown> | undefined;
7608
7614
  query: {
7615
+ apr?: number | undefined;
7609
7616
  creator: string;
7610
7617
  campaign: string;
7611
7618
  distributionChainId: number;
@@ -7638,6 +7645,7 @@ declare const eden: {
7638
7645
  get: (options: {
7639
7646
  headers?: Record<string, unknown> | undefined;
7640
7647
  query: {
7648
+ apr?: number | undefined;
7641
7649
  creator: string;
7642
7650
  campaign: string;
7643
7651
  distributionChainId: number;
@@ -7659,6 +7667,7 @@ declare const eden: {
7659
7667
  headers?: Record<string, unknown> | undefined;
7660
7668
  query: {
7661
7669
  amount?: string | undefined;
7670
+ apr?: number | undefined;
7662
7671
  creator: string;
7663
7672
  distributionChainId: number;
7664
7673
  startTimestamp: number;
@@ -7686,6 +7695,7 @@ declare const eden: {
7686
7695
  headers?: Record<string, unknown> | undefined;
7687
7696
  query: {
7688
7697
  amount?: string | undefined;
7698
+ apr?: number | undefined;
7689
7699
  creator: string;
7690
7700
  distributionChainId: number;
7691
7701
  startTimestamp: number;
@@ -13200,6 +13210,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
13200
13210
  body: unknown;
13201
13211
  params: {};
13202
13212
  query: {
13213
+ apr?: number | undefined;
13203
13214
  creator: string;
13204
13215
  campaign: string;
13205
13216
  distributionChainId: number;
@@ -13232,6 +13243,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
13232
13243
  body: unknown;
13233
13244
  params: {};
13234
13245
  query: {
13246
+ apr?: number | undefined;
13235
13247
  creator: string;
13236
13248
  campaign: string;
13237
13249
  distributionChainId: number;
@@ -13276,6 +13288,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
13276
13288
  body: unknown;
13277
13289
  params: {};
13278
13290
  query: {
13291
+ apr?: number | undefined;
13279
13292
  creator: string;
13280
13293
  campaign: string;
13281
13294
  distributionChainId: number;
@@ -13302,6 +13315,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
13302
13315
  params: {};
13303
13316
  query: {
13304
13317
  amount?: string | undefined;
13318
+ apr?: number | undefined;
13305
13319
  creator: string;
13306
13320
  distributionChainId: number;
13307
13321
  startTimestamp: number;
@@ -13336,6 +13350,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
13336
13350
  params: {};
13337
13351
  query: {
13338
13352
  amount?: string | undefined;
13353
+ apr?: number | undefined;
13339
13354
  creator: string;
13340
13355
  distributionChainId: number;
13341
13356
  startTimestamp: number;
@@ -18296,6 +18311,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
18296
18311
  get: (options: {
18297
18312
  headers?: Record<string, unknown> | undefined;
18298
18313
  query: {
18314
+ apr?: number | undefined;
18299
18315
  creator: string;
18300
18316
  campaign: string;
18301
18317
  distributionChainId: number;
@@ -18323,6 +18339,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
18323
18339
  get: (options: {
18324
18340
  headers?: Record<string, unknown> | undefined;
18325
18341
  query: {
18342
+ apr?: number | undefined;
18326
18343
  creator: string;
18327
18344
  campaign: string;
18328
18345
  distributionChainId: number;
@@ -18355,6 +18372,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
18355
18372
  get: (options: {
18356
18373
  headers?: Record<string, unknown> | undefined;
18357
18374
  query: {
18375
+ apr?: number | undefined;
18358
18376
  creator: string;
18359
18377
  campaign: string;
18360
18378
  distributionChainId: number;
@@ -18376,6 +18394,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
18376
18394
  headers?: Record<string, unknown> | undefined;
18377
18395
  query: {
18378
18396
  amount?: string | undefined;
18397
+ apr?: number | undefined;
18379
18398
  creator: string;
18380
18399
  distributionChainId: number;
18381
18400
  startTimestamp: number;
@@ -18403,6 +18422,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
18403
18422
  headers?: Record<string, unknown> | undefined;
18404
18423
  query: {
18405
18424
  amount?: string | undefined;
18425
+ apr?: number | undefined;
18406
18426
  creator: string;
18407
18427
  distributionChainId: number;
18408
18428
  startTimestamp: number;
@@ -22324,6 +22344,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
22324
22344
  get: (options: {
22325
22345
  headers?: Record<string, unknown> | undefined;
22326
22346
  query: {
22347
+ apr?: number | undefined;
22327
22348
  creator: string;
22328
22349
  campaign: string;
22329
22350
  distributionChainId: number;
@@ -22351,6 +22372,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
22351
22372
  get: (options: {
22352
22373
  headers?: Record<string, unknown> | undefined;
22353
22374
  query: {
22375
+ apr?: number | undefined;
22354
22376
  creator: string;
22355
22377
  campaign: string;
22356
22378
  distributionChainId: number;
@@ -22383,6 +22405,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
22383
22405
  get: (options: {
22384
22406
  headers?: Record<string, unknown> | undefined;
22385
22407
  query: {
22408
+ apr?: number | undefined;
22386
22409
  creator: string;
22387
22410
  campaign: string;
22388
22411
  distributionChainId: number;
@@ -22404,6 +22427,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
22404
22427
  headers?: Record<string, unknown> | undefined;
22405
22428
  query: {
22406
22429
  amount?: string | undefined;
22430
+ apr?: number | undefined;
22407
22431
  creator: string;
22408
22432
  distributionChainId: number;
22409
22433
  startTimestamp: number;
@@ -22431,6 +22455,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
22431
22455
  headers?: Record<string, unknown> | undefined;
22432
22456
  query: {
22433
22457
  amount?: string | undefined;
22458
+ apr?: number | undefined;
22434
22459
  creator: string;
22435
22460
  distributionChainId: number;
22436
22461
  startTimestamp: number;
@@ -4,6 +4,7 @@ import { AmbiantDynamicData } from "./implementations/Ambiant";
4
4
  import { BadgerDynamicData } from "./implementations/Badger";
5
5
  import { ClammDynamicData } from "./implementations/Clamm";
6
6
  import { CompoundDynamicData } from "./implementations/Compound";
7
+ import { CompoundV3DynamicData } from "./implementations/CompoundV3";
7
8
  import { DolomiteDynamicData } from "./implementations/Dolomite";
8
9
  import { EigenLayerDynamicData } from "./implementations/EigenLayer";
9
10
  import { EncompassingDynamicData } from "./implementations/Encompassing";
@@ -27,6 +28,8 @@ const map = {
27
28
  [Campaign.BADGER]: new BadgerDynamicData(),
28
29
  [Campaign.CLAMM]: new ClammDynamicData(),
29
30
  [Campaign.COMPOUND]: new CompoundDynamicData(),
31
+ [Campaign.COMPOUND_V3]: new CompoundV3DynamicData(),
32
+ [Campaign.COMPOUND_V3_FIXAPR]: new CompoundV3DynamicData(),
30
33
  [Campaign.DOLOMITE]: new DolomiteDynamicData(),
31
34
  [Campaign.EIGENLAYER]: new EigenLayerDynamicData(),
32
35
  [Campaign.ENCOMPASSING]: new EncompassingDynamicData(),
@@ -53,8 +56,6 @@ const map = {
53
56
  [Campaign.MAVERICK_BP]: new DefaultDynamicData(), // TODO
54
57
  [Campaign.ERC6909]: new DefaultDynamicData(), // TODO
55
58
  [Campaign.ERC6909FIXAPR]: new DefaultDynamicData(), // TODO
56
- [Campaign.COMPOUND_V3]: new DefaultDynamicData(), // TODO,
57
- [Campaign.COMPOUND_V3_FIXAPR]: new DefaultDynamicData(), // TODO
58
59
  [Campaign.ERC1155]: new DefaultDynamicData(), // TODO
59
60
  [Campaign.ERC1155FIXAPR]: new DefaultDynamicData(), // TODO
60
61
  };
@@ -295,11 +295,11 @@ export class ClammDynamicData {
295
295
  const symbolToken1 = d.campaignParameters.symbolToken1;
296
296
  const prevI = i;
297
297
  try {
298
- poolTotalLiquidity = BigNumber.from(poolInterface.decodeFunctionResult(Liquidity[AMMAlgorithmMapping[pool.amm]], result[i++].returnData)[DecodeLiquidity[AMMAlgorithmMapping[pool.amm]]]);
298
+ poolTotalLiquidity = BN2Number(poolInterface.decodeFunctionResult(Liquidity[AMMAlgorithmMapping[pool.amm]], result[i++].returnData)[DecodeLiquidity[AMMAlgorithmMapping[pool.amm]]]);
299
299
  sqrtPrice = poolInterface
300
300
  .decodeFunctionResult(PoolState[AMMAlgorithmMapping[pool.amm]], result[i++].returnData)[SqrtPrice[AMMAlgorithmMapping[pool.amm]]].toString();
301
- poolBalanceToken0 = BigNumber.from(ERC20Interface.decodeFunctionResult("balanceOf", result[i++].returnData)[0]);
302
- poolBalanceToken1 = BigNumber.from(ERC20Interface.decodeFunctionResult("balanceOf", result[i++].returnData)[0]);
301
+ poolBalanceToken0 = BN2Number(ERC20Interface.decodeFunctionResult("balanceOf", result[i++].returnData)[0], decimalsToken0);
302
+ poolBalanceToken1 = BN2Number(ERC20Interface.decodeFunctionResult("balanceOf", result[i++].returnData)[0], decimalsToken1);
303
303
  }
304
304
  catch (e) {
305
305
  log.warn(`merklDynamic data - failed to decode state of pool ${pool.address} on ${NETWORK_LABELS[chainId]}`);
@@ -321,13 +321,13 @@ export class ClammDynamicData {
321
321
  for (const w of pool.alms.filter(a => a.target.toLowerCase() === pool.address.toLowerCase() && a.type !== ALM.A51)) {
322
322
  const prevI = i;
323
323
  try {
324
- const totalSupply = BigNumber.from(ERC20Interface.decodeFunctionResult("totalSupply", result[i++].returnData)[0]);
325
- const almIdleBalance0 = BigNumber.from(ERC20Interface.decodeFunctionResult("balanceOf", result[i++].returnData)[0]);
324
+ const totalSupply = BN2Number(ERC20Interface.decodeFunctionResult("totalSupply", result[i++].returnData)[0]);
325
+ const almIdleBalance0 = BN2Number(ERC20Interface.decodeFunctionResult("balanceOf", result[i++].returnData)[0], d.campaignParameters.decimalsToken0);
326
326
  let almBalance0 = almIdleBalance0;
327
- const almIdleBalance1 = BigNumber.from(ERC20Interface.decodeFunctionResult("balanceOf", result[i++].returnData)[0]);
327
+ const almIdleBalance1 = BN2Number(ERC20Interface.decodeFunctionResult("balanceOf", result[i++].returnData)[0], d.campaignParameters.decimalsToken1);
328
328
  let almBalance1 = almIdleBalance1;
329
- let almTotalLiquidity = BigNumber.from(0);
330
- let almInRangeLiquidity = BigNumber.from(0);
329
+ let almTotalLiquidity = 0;
330
+ let almInRangeLiquidity = 0;
331
331
  const almPositions = positions?.[pool.amm]?.filter(pos => pos.pool.id === pool.address.toLowerCase() &&
332
332
  [w.address.toLowerCase(), ...[!!w?.owner && w.owner.toLowerCase()]].includes(pos.owner.toLowerCase()));
333
333
  const almPositionsWithAPIType = [];
@@ -336,23 +336,22 @@ export class ClammDynamicData {
336
336
  const upperTick = Number.parseInt(position.tickUpper);
337
337
  const lowerTick = Number.parseInt(position.tickLower);
338
338
  const [amount0, amount1] = getAmountsForLiquidity(sqrtPrice, lowerTick, upperTick, BigNumber.from(position.liquidity));
339
- const balance0 = BigNumber.from(amount0);
340
- const balance1 = BigNumber.from(amount1);
341
- const totalLiquidity = BigNumber.from(position.liquidity);
342
- const inRangeLiquidity = balance0 > BigNumber.from(0) && BigNumber.from(0) ? (BigNumber.from(position.liquidity) ?? 0) : 0;
343
- almTotalLiquidity = almTotalLiquidity.add(totalLiquidity);
344
- almInRangeLiquidity = almInRangeLiquidity.add(inRangeLiquidity);
345
- almBalance0 = almBalance0.add(balance0);
346
- almBalance1 = almBalance1.add(balance1);
339
+ const balance0 = BN2Number(amount0, decimalsToken0);
340
+ const balance1 = BN2Number(amount1, decimalsToken1);
341
+ const totalLiquidity = BN2Number(position.liquidity);
342
+ const inRangeLiquidity = balance0 > 0 && balance1 > 0 ? (BN2Number(position.liquidity) ?? 0) : 0;
343
+ almTotalLiquidity += totalLiquidity;
344
+ almInRangeLiquidity += inRangeLiquidity;
345
+ almBalance0 += balance0;
346
+ almBalance1 += balance1;
347
347
  almPositionsWithAPIType.push({
348
- balance0: BN2Number(balance0, d.campaignParameters.decimalsToken0),
349
- balance1: BN2Number(balance1, d.campaignParameters.decimalsToken0),
348
+ balance0,
349
+ balance1,
350
350
  id: position.id,
351
- inRangeLiquidity: BN2Number(inRangeLiquidity),
351
+ inRangeLiquidity,
352
352
  lowerTick,
353
- totalLiquidity: BN2Number(totalLiquidity),
354
- tvl: priceToken0 * BN2Number(balance0, d.campaignParameters.decimalsToken0) +
355
- priceToken1 * BN2Number(balance1, d.campaignParameters.decimalsToken0),
353
+ totalLiquidity,
354
+ tvl: priceToken0 * balance0 + priceToken1 * balance1,
356
355
  upperTick,
357
356
  });
358
357
  }
@@ -361,14 +360,13 @@ export class ClammDynamicData {
361
360
  almDetails.push({
362
361
  almAPR: 0, // filled later on
363
362
  almAddress: utils.getAddress(w.address),
364
- almBalance0: BN2Number(almBalance0, d.campaignParameters.decimalsToken0),
365
- almIdleBalance0: BN2Number(almIdleBalance0, d.campaignParameters.decimalsToken0),
366
- almIdleBalance1: BN2Number(almIdleBalance1, d.campaignParameters.decimalsToken1),
367
- almBalance1: BN2Number(almBalance1, d.campaignParameters.decimalsToken1),
368
- almInRangeLiquidity: BN2Number(almInRangeLiquidity),
369
- almTVL: BN2Number(almBalance0, d.campaignParameters.decimalsToken0) * priceToken0 +
370
- BN2Number(almBalance1, d.campaignParameters.decimalsToken1) * priceToken1,
371
- almTotalLiquidity: BN2Number(almTotalLiquidity),
363
+ almBalance0,
364
+ almIdleBalance0,
365
+ almIdleBalance1,
366
+ almBalance1,
367
+ almInRangeLiquidity,
368
+ almTVL: almBalance0 * priceToken0 + almBalance1 * priceToken1,
369
+ almTotalLiquidity,
372
370
  forwarderType: Forwarder.CLAMM,
373
371
  label: `${ALMMapping[pool.amm]?.[w.type]} ${w.address}`,
374
372
  origin: w.type,
@@ -377,7 +375,7 @@ export class ClammDynamicData {
377
375
  sender: utils.getAddress(w.address),
378
376
  target: w.target,
379
377
  owner: utils.getAddress(w.owner ?? w.address),
380
- totalSupply: BN2Number(totalSupply),
378
+ totalSupply,
381
379
  type: w.type,
382
380
  });
383
381
  }
@@ -567,9 +565,9 @@ export class ClammDynamicData {
567
565
  const propToken0 = (BN2Number(c.campaignParameters.weightToken0, 4) / totalWeight) * 100;
568
566
  const propToken1 = (BN2Number(c.campaignParameters.weightToken1, 4) / totalWeight) * 100;
569
567
  let distributionMeanAPR = 0;
570
- let blacklistedBalance0 = BigNumber.from(0);
571
- let blacklistedBalance1 = BigNumber.from(0);
572
- let blacklistedLiquidity = BigNumber.from(0);
568
+ let blacklistedBalance0 = 0;
569
+ let blacklistedBalance1 = 0;
570
+ let blacklistedLiquidity = 0;
573
571
  /**
574
572
  * @dev In case there is a super amm handling some other amm lp positions,
575
573
  * we only need to check the positions associated to this super amm subgraph
@@ -622,12 +620,12 @@ export class ClammDynamicData {
622
620
  catch {
623
621
  log.warn(`merklDynamic data - failed to handle whitelisted positions of pool ${pool.address} on ${NETWORK_LABELS[chainId]} - ${pos.owner} ${pos.tickLower} ${pos.tickUpper} ${pos.liquidity}`);
624
622
  }
625
- blacklistedBalance0 = blacklistedBalance0.sub(amount0);
626
- blacklistedBalance1 = blacklistedBalance0.sub(amount1);
623
+ blacklistedBalance0 -= BN2Number(amount0, decimalsToken0);
624
+ blacklistedBalance1 -= BN2Number(amount1, decimalsToken1);
627
625
  if (c.campaignParameters.isOutOfRangeIncentivized
628
626
  ? BN2Number(amount0, decimalsToken0) > 0 || BN2Number(amount1, decimalsToken1) > 0
629
627
  : BN2Number(amount0, decimalsToken0) > 0 && BN2Number(amount1, decimalsToken1) > 0)
630
- blacklistedLiquidity = blacklistedLiquidity.sub(pos.liquidity);
628
+ blacklistedLiquidity -= BN2Number(pos.liquidity);
631
629
  }
632
630
  // Handling the case of a ALM of priority 2 being whitelisted
633
631
  else if (pos.pool.id === pool.address.toLowerCase() &&
@@ -649,32 +647,33 @@ export class ClammDynamicData {
649
647
  catch {
650
648
  log.warn(`merklDynamic data - failed to handle whitelisted positions of pool ${pool.address} on ${NETWORK_LABELS[chainId]} - ${pos.owner} ${pos.tickLower} ${pos.tickUpper} ${pos.liquidity}`);
651
649
  }
652
- blacklistedBalance0 = blacklistedBalance0.sub(BigInt(Math.floor((BN2Number(amount0, 0) * childALM.almBalance0) / almHolding.almBalance0)));
653
- blacklistedBalance1 = blacklistedBalance1.sub(BigInt(Math.floor((BN2Number(amount1, 0) * childALM.almBalance1) / almHolding.almBalance1)));
650
+ blacklistedBalance0 -=
651
+ (BN2Number(amount0, decimalsToken0) * childALM.almBalance0) / almHolding.almBalance0;
652
+ blacklistedBalance1 -=
653
+ (BN2Number(amount1, decimalsToken1) * childALM.almBalance1) / almHolding.almBalance1;
654
654
  if (c.campaignParameters.isOutOfRangeIncentivized
655
655
  ? BN2Number(amount0, decimalsToken0) > 0 || BN2Number(amount1, decimalsToken1) > 0
656
- : BN2Number(amount0, decimalsToken0) > 0 && BN2Number(amount1, decimalsToken1) > 0) {
657
- blacklistedLiquidity = blacklistedLiquidity.sub(BigInt(Math.floor((BN2Number(pos.liquidity, 0) * childALM.almTotalLiquidity) /
658
- almHolding.almTotalLiquidity)));
659
- }
656
+ : BN2Number(amount0, decimalsToken0) > 0 && BN2Number(amount1, decimalsToken1) > 0)
657
+ blacklistedLiquidity -=
658
+ (BN2Number(pos.liquidity) * childALM.almTotalLiquidity) / almHolding.almTotalLiquidity;
660
659
  }
661
660
  }
662
661
  }
663
662
  });
664
663
  }
665
664
  else if (c.campaignParameters.blacklist.length > 0) {
666
- blacklistedBalance0 = BigNumber.from(0);
667
- blacklistedBalance1 = BigNumber.from(0);
668
- blacklistedLiquidity = BigNumber.from(0);
665
+ blacklistedBalance0 = 0;
666
+ blacklistedBalance1 = 0;
667
+ blacklistedLiquidity = 0;
669
668
  for (const blacklistedAddress of c.campaignParameters.blacklist) {
670
669
  const blackAddressPositions = positions?.[amm]?.filter(pos => pos.pool.id === pool.address.toLowerCase() && pos.owner === blacklistedAddress.toLowerCase());
671
670
  if (!!blackAddressPositions) {
672
671
  for (const position of blackAddressPositions) {
673
672
  const [amount0, amount1] = getAmountsForLiquidity(sqrtPrice, Number.parseInt(position.tickLower), Number.parseInt(position.tickUpper), BigNumber.from(position.liquidity));
674
- blacklistedBalance0 = blacklistedBalance0.add(amount0);
675
- blacklistedBalance1 = blacklistedBalance1.add(amount1);
673
+ blacklistedBalance0 += BN2Number(amount0, decimalsToken0);
674
+ blacklistedBalance1 += BN2Number(amount1, decimalsToken1);
676
675
  if (BN2Number(amount0, decimalsToken0) > 0 && BN2Number(amount1, decimalsToken1) > 0)
677
- blacklistedLiquidity = blacklistedLiquidity.add(position.liquidity);
676
+ blacklistedLiquidity += BN2Number(position.liquidity);
678
677
  }
679
678
  }
680
679
  }
@@ -714,9 +713,9 @@ export class ClammDynamicData {
714
713
  /**
715
714
  * General APR (@notice potentially with a boost)
716
715
  */
717
- const poolBalanceToken0WithoutBlacklist = Math.max(BN2Number(poolBalanceToken0.sub(blacklistedBalance0), decimalsToken0), 0.00001);
718
- const poolBalanceToken1WithoutBlacklist = Math.max(BN2Number(poolBalanceToken1.sub(blacklistedBalance1), decimalsToken1), 0.00001);
719
- const poolLiquidityWithoutBlacklist = Math.max(BN2Number(poolTotalLiquidity.sub(blacklistedLiquidity)), 0);
716
+ const poolBalanceToken0WithoutBlacklist = Math.max(poolBalanceToken0 - (blacklistedBalance0 ?? 0), 0.00001);
717
+ const poolBalanceToken1WithoutBlacklist = Math.max(poolBalanceToken1 - (blacklistedBalance1 ?? 0), 0.00001);
718
+ const poolLiquidityWithoutBlacklist = Math.max(poolTotalLiquidity - (blacklistedLiquidity ?? 0), 0);
720
719
  const tvl = isStrykeCampaign(amm)
721
720
  ? (await axios.get(`https://api.stryke.xyz/clamm/stats/tvl/${pool.address}?chainId=${chainId}`))
722
721
  .data
@@ -876,8 +875,6 @@ export class ClammDynamicData {
876
875
  ]);
877
876
  const rewardToken = rewardTokens[0];
878
877
  distributionMeanAPR = rewardToken.isPoint ? distributionMeanAPR / 365 / 100 : distributionMeanAPR;
879
- const poolBalanceToken0Number = BN2Number(poolBalanceToken0, decimalsToken0);
880
- const poolBalanceToken1Number = BN2Number(poolBalanceToken1, decimalsToken1);
881
878
  dynamicData.push({
882
879
  ...campaign,
883
880
  amm: pool.amm,
@@ -887,15 +884,15 @@ export class ClammDynamicData {
887
884
  apr: distributionMeanAPR,
888
885
  aprs,
889
886
  aprBreakdowns,
890
- blacklistedBalance0: BN2Number(blacklistedBalance0, decimalsToken0),
891
- blacklistedBalance1: BN2Number(blacklistedBalance1, decimalsToken1),
892
- blacklistedLiquidity: BN2Number(blacklistedLiquidity),
887
+ blacklistedBalance0,
888
+ blacklistedBalance1,
889
+ blacklistedLiquidity,
893
890
  forwarders: distributionForwarders,
894
891
  isLive,
895
892
  isMock: c.campaignParameters.symbolRewardToken === "aglaMerkl",
896
- poolBalanceToken0: poolBalanceToken0Number,
897
- poolBalanceToken1: poolBalanceToken1Number,
898
- poolTotalLiquidity: BN2Number(poolTotalLiquidity),
893
+ poolBalanceToken0,
894
+ poolBalanceToken1,
895
+ poolTotalLiquidity,
899
896
  symbolToken0,
900
897
  symbolToken1,
901
898
  tick: getTickAtSqrtRatio(JSBI.BigInt(sqrtPrice)),
@@ -903,7 +900,7 @@ export class ClammDynamicData {
903
900
  tvl: isStrykeCampaign(pool.amm)
904
901
  ? (await axios.get(`https://api.stryke.xyz/clamm/stats/tvl/${pool.address}?chainId=${chainId}`))
905
902
  .data
906
- : poolBalanceToken0Number * priceToken0 + poolBalanceToken1Number * priceToken1,
903
+ : poolBalanceToken0 * priceToken0 + poolBalanceToken1 * priceToken1,
907
904
  });
908
905
  }
909
906
  }
@@ -0,0 +1,7 @@
1
+ import { type Campaign, type CampaignParameters, type MerklChainId } from "@sdk";
2
+ import type { DynamicDataBuilder } from "../interface";
3
+ type campaignType = Campaign.COMPOUND_V3;
4
+ export declare class CompoundV3DynamicData implements DynamicDataBuilder<campaignType> {
5
+ build(chainId: MerklChainId, campaigns: CampaignParameters<campaignType>[]): Promise<CompoundV3CampaignDynamicData[]>;
6
+ }
7
+ export {};
@@ -0,0 +1,69 @@
1
+ import { TokenService } from "@/modules/v4/token/token.service";
2
+ import { BN2Number, ChainInteractionService, CompoundV3Interface, CompoundV3SubCampaignType, NULL_ADDRESS, YEAR, } from "@sdk";
3
+ import { log } from "../../../utils/logger";
4
+ import { Pricer } from "../../../utils/pricer";
5
+ export class CompoundV3DynamicData {
6
+ async build(chainId, campaigns) {
7
+ const pricer = await Pricer.load();
8
+ const calls = [];
9
+ for (const campaign of campaigns) {
10
+ if (campaign.campaignSubType === CompoundV3SubCampaignType.SUPPLY) {
11
+ calls.push({
12
+ allowFailure: true,
13
+ callData: CompoundV3Interface.encodeFunctionData("totalSupply"),
14
+ target: campaign.campaignParameters.targetToken,
15
+ });
16
+ calls.push({
17
+ allowFailure: true,
18
+ callData: CompoundV3Interface.encodeFunctionData("baseToken"),
19
+ target: campaign.campaignParameters.targetToken,
20
+ });
21
+ }
22
+ }
23
+ const result = await ChainInteractionService(chainId).fetchState(calls);
24
+ let i = 0;
25
+ const dynamicData = [];
26
+ for (const campaign of campaigns) {
27
+ let totalSupply;
28
+ let underlyingToken;
29
+ if (campaign.campaignSubType === CompoundV3SubCampaignType.SUPPLY) {
30
+ try {
31
+ totalSupply = BN2Number(CompoundV3Interface.decodeFunctionResult("totalSupply", result[i++].returnData)[0], campaign.campaignParameters.decimalsTargetToken);
32
+ underlyingToken = CompoundV3Interface.decodeFunctionResult("baseToken", result[i++].returnData)[0];
33
+ }
34
+ catch {
35
+ log.warn(`Error getting totalSupply for campaign ${campaign.campaignId} and token ${campaign.campaignParameters.targetToken}`);
36
+ totalSupply = 0.0000001;
37
+ underlyingToken = NULL_ADDRESS;
38
+ }
39
+ }
40
+ else {
41
+ totalSupply = 0.0000001;
42
+ underlyingToken = NULL_ADDRESS;
43
+ }
44
+ const priceRewardToken = await TokenService.getRewardTokenPrice(campaign);
45
+ const priceTargetToken = (await pricer.get({
46
+ address: underlyingToken,
47
+ chainId: campaign.computeChainId,
48
+ // Remove the `c` at the beginning of the symbol and the `v3` at the end
49
+ symbol: campaign.campaignParameters.symbolTargetToken.slice(1, -2),
50
+ })) ?? 0;
51
+ let apr = (priceRewardToken * BN2Number(campaign.amount, campaign.campaignParameters.decimalsRewardToken) * YEAR * 100) /
52
+ campaign.campaignParameters.duration /
53
+ (totalSupply * priceTargetToken);
54
+ const rewardTokens = await TokenService.findManyOrCreate([
55
+ { chainId: campaign.chainId, address: campaign.rewardToken },
56
+ ]);
57
+ const rewardToken = rewardTokens[0];
58
+ apr = rewardToken.isPoint ? apr / 365 / 100 : apr;
59
+ dynamicData.push({
60
+ ...campaign,
61
+ apr,
62
+ totalSupplyTargetToken: totalSupply,
63
+ tvl: totalSupply * priceTargetToken,
64
+ priceRewardToken: priceRewardToken,
65
+ });
66
+ }
67
+ return dynamicData;
68
+ }
69
+ }
@@ -4,6 +4,7 @@ import { AmbientMetadata } from "./implementations/Ambient";
4
4
  import { BadgerMetadata } from "./implementations/Badger";
5
5
  import { ClammMetadata } from "./implementations/Clamm";
6
6
  import { CompoundMetadata } from "./implementations/Compound";
7
+ import { CompoundV3Metadata } from "./implementations/CompoundV3";
7
8
  import { DefaultMetadata } from "./implementations/Default";
8
9
  import { DolomiteMetadata } from "./implementations/Dolomite";
9
10
  import { EigenLayerMetadata } from "./implementations/EigenLayer";
@@ -35,6 +36,8 @@ const map = {
35
36
  [Campaign.AJNA]: new AjnaMetadata(),
36
37
  [Campaign.EULER]: new EulerMetadata(),
37
38
  [Campaign.COMPOUND]: new CompoundMetadata(),
39
+ [Campaign.COMPOUND_V3]: new CompoundV3Metadata(),
40
+ [Campaign.COMPOUND_V3_FIXAPR]: new CompoundV3Metadata(),
38
41
  [Campaign.ION]: new IonMetadata(),
39
42
  [Campaign.MORPHO]: new MorphoMetadata(),
40
43
  [Campaign.HYPERDRIVELOGFIXPROCESSOR]: new HyperdriveMetadata(),
@@ -56,8 +59,6 @@ const map = {
56
59
  [Campaign.MAVERICK_BP]: new DefaultMetadata(), // TODO
57
60
  [Campaign.ERC6909]: new DefaultMetadata(), // TODO
58
61
  [Campaign.ERC6909FIXAPR]: new DefaultMetadata(), // TODO
59
- [Campaign.COMPOUND_V3]: new DefaultMetadata(), // TODO,
60
- [Campaign.COMPOUND_V3_FIXAPR]: new DefaultMetadata(), // TODO
61
62
  [Campaign.ERC1155]: new DefaultMetadata(), // TODO
62
63
  [Campaign.ERC1155FIXAPR]: new DefaultMetadata(), // TODO
63
64
  };
@@ -0,0 +1,17 @@
1
+ import { type Campaign as CampaignEnum, type CampaignParameters, type ChainId } from "@sdk";
2
+ import type { ProtocolId } from "../../../modules/v4/protocol/protocol.model";
3
+ import type { MetadataBuilder } from "../interface";
4
+ type campaignType = CampaignEnum.COMPOUND_V3;
5
+ export declare class CompoundV3Metadata implements MetadataBuilder<campaignType> {
6
+ build(computeChainId: ChainId, params: CampaignParameters<campaignType>["campaignParameters"], subType: CampaignParameters<campaignType>["campaignSubType"]): Promise<{
7
+ action: "LEND" | "BORROW";
8
+ name: string;
9
+ tokens: {
10
+ chainId: ChainId;
11
+ address: any;
12
+ }[];
13
+ mainProtocol: ProtocolId;
14
+ depositUrl: undefined;
15
+ }>;
16
+ }
17
+ export {};
@@ -0,0 +1,19 @@
1
+ import { OpportunityAction } from "@db/api";
2
+ import { CompoundV3SubCampaignType } from "@sdk";
3
+ export class CompoundV3Metadata {
4
+ async build(computeChainId, params, subType) {
5
+ const symbolUnderlyingToken = params.symbolTargetToken.slice(1, -2);
6
+ return {
7
+ action: subType === CompoundV3SubCampaignType.SUPPLY ? OpportunityAction.LEND : OpportunityAction.BORROW,
8
+ name: [
9
+ subType === CompoundV3SubCampaignType.SUPPLY
10
+ ? `Supply ${symbolUnderlyingToken} on`
11
+ : `Borrow ${symbolUnderlyingToken} on`,
12
+ "Compound V3",
13
+ ].join(" "),
14
+ tokens: [{ chainId: computeChainId, address: params.targetToken }],
15
+ mainProtocol: "compound",
16
+ depositUrl: undefined, // TODO, shall depend on compFork
17
+ };
18
+ }
19
+ }
@@ -4429,6 +4429,7 @@ declare const app: Elysia<"", false, {
4429
4429
  body: unknown;
4430
4430
  params: {};
4431
4431
  query: {
4432
+ apr?: number | undefined;
4432
4433
  creator: string;
4433
4434
  campaign: string;
4434
4435
  distributionChainId: number;
@@ -4461,6 +4462,7 @@ declare const app: Elysia<"", false, {
4461
4462
  body: unknown;
4462
4463
  params: {};
4463
4464
  query: {
4465
+ apr?: number | undefined;
4464
4466
  creator: string;
4465
4467
  campaign: string;
4466
4468
  distributionChainId: number;
@@ -4505,6 +4507,7 @@ declare const app: Elysia<"", false, {
4505
4507
  body: unknown;
4506
4508
  params: {};
4507
4509
  query: {
4510
+ apr?: number | undefined;
4508
4511
  creator: string;
4509
4512
  campaign: string;
4510
4513
  distributionChainId: number;
@@ -4531,6 +4534,7 @@ declare const app: Elysia<"", false, {
4531
4534
  params: {};
4532
4535
  query: {
4533
4536
  amount?: string | undefined;
4537
+ apr?: number | undefined;
4534
4538
  creator: string;
4535
4539
  distributionChainId: number;
4536
4540
  startTimestamp: number;
@@ -4565,6 +4569,7 @@ declare const app: Elysia<"", false, {
4565
4569
  params: {};
4566
4570
  query: {
4567
4571
  amount?: string | undefined;
4572
+ apr?: number | undefined;
4568
4573
  creator: string;
4569
4574
  distributionChainId: number;
4570
4575
  startTimestamp: number;
@@ -0,0 +1 @@
1
+ export {};