@merkl/api 1.20.0 → 1.20.21

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 (163) hide show
  1. package/dist/src/constants.d.ts +2 -0
  2. package/dist/src/constants.js.map +1 -1
  3. package/dist/src/eden/index.d.ts +1104 -72
  4. package/dist/src/engine/deprecated/dynamicData/implementations/Erc20.d.ts +153 -63
  5. package/dist/src/engine/deprecated/erc20SubTypeProcessors/helpers/ownerFinder.js.map +1 -1
  6. package/dist/src/engine/implementations/Erc20/subTypes/implementations/pendleYT/tvl.js.map +1 -1
  7. package/dist/src/engine/implementations/EulerMultiBorrowFromCollateral/metadata.d.ts +25 -0
  8. package/dist/src/engine/implementations/EulerMultiBorrowFromCollateral/metadata.js.map +1 -0
  9. package/dist/src/engine/implementations/Exactly/metadata.d.ts +19 -0
  10. package/dist/src/engine/implementations/Exactly/metadata.js.map +1 -0
  11. package/dist/src/engine/implementations/FeeWrapper4626/metadata.d.ts +18 -0
  12. package/dist/src/engine/implementations/FeeWrapper4626/metadata.js.map +1 -0
  13. package/dist/src/engine/implementations/JsonAirdrop/metadata.d.ts +1 -1
  14. package/dist/src/engine/metadata/factory.js.map +1 -1
  15. package/dist/src/engine/tvl/factory.js.map +1 -1
  16. package/dist/src/guards/{KeyStoreAuth.guard.d.ts → KeyValueStoreAuth.guard.d.ts} +4 -4
  17. package/dist/src/guards/KeyValueStoreAuth.guard.js.map +1 -0
  18. package/dist/src/guards/PrivateAccess.guard.d.ts +25 -0
  19. package/dist/src/guards/PrivateAccess.guard.js.map +1 -0
  20. package/dist/src/index.d.ts +1143 -2
  21. package/dist/src/index.js.map +1 -1
  22. package/dist/src/jobs/claim-etl/load.d.ts +2 -2
  23. package/dist/src/jobs/claim-etl/load.js.map +1 -1
  24. package/dist/src/jobs/claim-etl/types.d.ts +5 -5
  25. package/dist/src/jobs/deposit-credit-etl/load.js.map +1 -1
  26. package/dist/src/jobs/merge-etl/load.js.map +1 -1
  27. package/dist/src/jobs/refresh-materialized-views.js.map +1 -1
  28. package/dist/src/jobs/sync-campaigns-to-hubspot.js.map +1 -1
  29. package/dist/src/modules/graphql/context.d.ts +14 -0
  30. package/dist/src/modules/graphql/context.js.map +1 -0
  31. package/dist/src/modules/graphql/errors.d.ts +7 -0
  32. package/dist/src/modules/graphql/errors.js.map +1 -0
  33. package/dist/src/modules/graphql/guards.d.ts +26 -0
  34. package/dist/src/modules/graphql/guards.js.map +1 -0
  35. package/dist/src/modules/graphql/resolvers.d.ts +593 -0
  36. package/dist/src/modules/graphql/resolvers.js.map +1 -0
  37. package/dist/src/modules/graphql/router.d.ts +87 -0
  38. package/dist/src/modules/graphql/router.js.map +1 -0
  39. package/dist/src/modules/graphql/scalars.d.ts +3 -0
  40. package/dist/src/modules/graphql/scalars.js.map +1 -0
  41. package/dist/src/modules/graphql/schema.d.ts +2 -0
  42. package/dist/src/modules/graphql/schema.js.map +1 -0
  43. package/dist/src/modules/graphql/translator.d.ts +25 -0
  44. package/dist/src/modules/graphql/translator.js.map +1 -0
  45. package/dist/src/modules/graphql/yoga.d.ts +2 -0
  46. package/dist/src/modules/graphql/yoga.js.map +1 -0
  47. package/dist/src/modules/v4/campaign/campaign.controller.d.ts +10 -2
  48. package/dist/src/modules/v4/campaign/campaign.controller.js.map +1 -1
  49. package/dist/src/modules/v4/campaign/campaign.formatter.d.ts +24 -0
  50. package/dist/src/modules/v4/campaign/campaign.formatter.js.map +1 -1
  51. package/dist/src/modules/v4/campaign/campaign.model.d.ts +5 -0
  52. package/dist/src/modules/v4/campaign/campaign.model.js.map +1 -1
  53. package/dist/src/modules/v4/campaign/campaign.query-transformer.d.ts +6 -6
  54. package/dist/src/modules/v4/campaign/campaign.repository.d.ts +11 -0
  55. package/dist/src/modules/v4/campaign/campaign.repository.js.map +1 -1
  56. package/dist/src/modules/v4/campaign/campaign.service.d.ts +1 -1
  57. package/dist/src/modules/v4/campaignToProcess/campaignToProcess.controller.d.ts +1 -1
  58. package/dist/src/modules/v4/campaignToProcess/campaignToProcess.controller.js.map +1 -1
  59. package/dist/src/modules/v4/chain/chain.model.js.map +1 -1
  60. package/dist/src/modules/v4/claims/claims.model.js.map +1 -1
  61. package/dist/src/modules/v4/computedValue/computedValue.controller.d.ts +29 -0
  62. package/dist/src/modules/v4/computedValue/computedValue.controller.js.map +1 -1
  63. package/dist/src/modules/v4/computedValue/computedValue.model.d.ts +5 -0
  64. package/dist/src/modules/v4/computedValue/computedValue.model.js.map +1 -1
  65. package/dist/src/modules/v4/computedValue/computedValue.repository.d.ts +2 -1
  66. package/dist/src/modules/v4/computedValue/computedValue.repository.js.map +1 -1
  67. package/dist/src/modules/v4/computedValue/computedValue.service.d.ts +2 -1
  68. package/dist/src/modules/v4/computedValue/computedValue.service.js.map +1 -1
  69. package/dist/src/modules/v4/credit/credit.controller.d.ts +98 -0
  70. package/dist/src/modules/v4/credit/credit.controller.js.map +1 -1
  71. package/dist/src/modules/v4/credit/credit.model.d.ts +5 -0
  72. package/dist/src/modules/v4/credit/credit.model.js.map +1 -1
  73. package/dist/src/modules/v4/credit/credit.repository.d.ts +21 -1
  74. package/dist/src/modules/v4/credit/credit.repository.js.map +1 -1
  75. package/dist/src/modules/v4/credit/credit.service.d.ts +20 -1
  76. package/dist/src/modules/v4/credit/credit.service.js.map +1 -1
  77. package/dist/src/modules/v4/enum/enum.service.d.ts +68 -0
  78. package/dist/src/modules/v4/enum/enum.service.js.map +1 -1
  79. package/dist/src/modules/v4/historical/historical.controller.js.map +1 -1
  80. package/dist/src/modules/v4/historical/historical.service.js.map +1 -1
  81. package/dist/src/modules/v4/{keyStore/keyStore.controller.d.ts → keyValueStore/keyValueStore.controller.d.ts} +1 -1
  82. package/dist/src/modules/v4/keyValueStore/keyValueStore.controller.js.map +1 -0
  83. package/dist/src/modules/v4/keyValueStore/keyValueStore.formatter.d.ts +27 -0
  84. package/dist/src/modules/v4/keyValueStore/keyValueStore.formatter.js.map +1 -0
  85. package/dist/src/modules/v4/keyValueStore/keyValueStore.model.js.map +1 -0
  86. package/dist/src/modules/v4/{keyStore/keyStore.repository.d.ts → keyValueStore/keyValueStore.repository.d.ts} +1 -1
  87. package/dist/src/modules/v4/keyValueStore/keyValueStore.repository.js.map +1 -0
  88. package/dist/src/modules/v4/{keyStore/keyStore.service.d.ts → keyValueStore/keyValueStore.service.d.ts} +1 -1
  89. package/dist/src/modules/v4/keyValueStore/keyValueStore.service.js.map +1 -0
  90. package/dist/src/modules/v4/leaf/latestCompute.repository.js.map +1 -1
  91. package/dist/src/modules/v4/leaf/leaf.model.d.ts +0 -95
  92. package/dist/src/modules/v4/leaf/leaf.repository.d.ts +98 -124
  93. package/dist/src/modules/v4/leaf/leaf.repository.js.map +1 -1
  94. package/dist/src/modules/v4/leaf/leaf.service.d.ts +84 -514
  95. package/dist/src/modules/v4/leaf/leaf.service.js.map +1 -1
  96. package/dist/src/modules/v4/leaf/leafTemp.repository.js.map +1 -1
  97. package/dist/src/modules/v4/leaf/leafView.repository.d.ts +3 -17
  98. package/dist/src/modules/v4/leaf/leafView.repository.js.map +1 -1
  99. package/dist/src/modules/v4/opportunity/opportunity.controller.d.ts +3 -0
  100. package/dist/src/modules/v4/opportunity/opportunity.controller.js.map +1 -1
  101. package/dist/src/modules/v4/opportunity/opportunity.formatter.js.map +1 -1
  102. package/dist/src/modules/v4/opportunity/opportunity.model.js.map +1 -1
  103. package/dist/src/modules/v4/opportunity/opportunity.query-transformer.d.ts +7 -7
  104. package/dist/src/modules/v4/opportunity/opportunity.repository.d.ts +573 -1
  105. package/dist/src/modules/v4/opportunity/opportunity.repository.js.map +1 -1
  106. package/dist/src/modules/v4/opportunity/opportunity.service.d.ts +4 -2
  107. package/dist/src/modules/v4/opportunity/opportunity.service.js.map +1 -1
  108. package/dist/src/modules/v4/programPayload/subPayloads/ethena.d.ts +48 -48
  109. package/dist/src/modules/v4/protocol/protocol.model.js.map +1 -1
  110. package/dist/src/modules/v4/reallocation/reallocation.controller.d.ts +67 -0
  111. package/dist/src/modules/v4/reallocation/reallocation.controller.js.map +1 -0
  112. package/dist/src/modules/v4/reallocation/reallocation.model.d.ts +38 -0
  113. package/dist/src/modules/v4/reallocation/reallocation.model.js.map +1 -0
  114. package/dist/src/modules/v4/reallocation/reallocation.repository.d.ts +25 -0
  115. package/dist/src/modules/v4/reallocation/reallocation.repository.js.map +1 -0
  116. package/dist/src/modules/v4/reallocation/reallocation.service.d.ts +21 -0
  117. package/dist/src/modules/v4/reallocation/reallocation.service.js.map +1 -0
  118. package/dist/src/modules/v4/reward/reward.controller.js.map +1 -1
  119. package/dist/src/modules/v4/reward/reward.model.js.map +1 -1
  120. package/dist/src/modules/v4/reward/reward.service.d.ts +3 -287
  121. package/dist/src/modules/v4/reward/reward.service.js.map +1 -1
  122. package/dist/src/modules/v4/router.d.ts +1100 -2
  123. package/dist/src/modules/v4/router.js.map +1 -1
  124. package/dist/src/modules/v4/schema/schema.controller.d.ts +141 -0
  125. package/dist/src/modules/v4/schema/schema.controller.js.map +1 -0
  126. package/dist/src/modules/v4/schema/schema.model.d.ts +56 -0
  127. package/dist/src/modules/v4/schema/schema.model.js.map +1 -0
  128. package/dist/src/modules/v4/schema/schema.service.d.ts +20 -0
  129. package/dist/src/modules/v4/schema/schema.service.js.map +1 -0
  130. package/dist/src/modules/v4/slack/slack.service.js.map +1 -1
  131. package/dist/src/modules/v4/token/token.model.js.map +1 -1
  132. package/dist/src/modules/v4/transaction/transaction.service.d.ts +1333 -579
  133. package/dist/src/modules/v4/uniswap/uniswap.controller.d.ts +13 -0
  134. package/dist/src/modules/v4/uniswap/uniswap.service.d.ts +14 -0
  135. package/dist/src/modules/v4/user/user.controller.d.ts +812 -0
  136. package/dist/src/modules/v4/user/user.controller.js.map +1 -1
  137. package/dist/src/modules/v4/user/user.model.d.ts +969 -0
  138. package/dist/src/modules/v4/user/user.model.js.map +1 -1
  139. package/dist/src/modules/v4/user/user.pending.test.d.ts +1 -0
  140. package/dist/src/modules/v4/user/user.pending.test.js.map +1 -0
  141. package/dist/src/modules/v4/user/user.service.d.ts +324 -5
  142. package/dist/src/modules/v4/user/user.service.js.map +1 -1
  143. package/dist/src/plugins/errorHandler.d.ts +15 -0
  144. package/dist/src/plugins/errorHandler.js.map +1 -1
  145. package/dist/src/scripts/extract-stellar-pk.d.ts +1 -0
  146. package/dist/src/scripts/extract-stellar-pk.js.map +1 -0
  147. package/dist/src/scripts/test-reallocations.d.ts +9 -0
  148. package/dist/src/scripts/test-reallocations.js.map +1 -0
  149. package/dist/src/utils/getAPR.d.ts +1102 -725
  150. package/dist/src/utils/parseDistributionType.d.ts +476 -99
  151. package/dist/src/utils/providers.d.ts +2 -0
  152. package/dist/src/utils/safeEngineQuery.d.ts +14 -0
  153. package/dist/src/utils/safeEngineQuery.js.map +1 -0
  154. package/dist/src/utils/throw.d.ts +17 -0
  155. package/dist/src/utils/throw.js.map +1 -1
  156. package/dist/tsconfig.tsbuildinfo +1 -1
  157. package/package.json +1 -1
  158. package/dist/src/guards/KeyStoreAuth.guard.js.map +0 -1
  159. package/dist/src/modules/v4/keyStore/keyStore.controller.js.map +0 -1
  160. package/dist/src/modules/v4/keyStore/keyStore.model.js.map +0 -1
  161. package/dist/src/modules/v4/keyStore/keyStore.repository.js.map +0 -1
  162. package/dist/src/modules/v4/keyStore/keyStore.service.js.map +0 -1
  163. /package/dist/src/modules/v4/{keyStore/keyStore.model.d.ts → keyValueStore/keyValueStore.model.d.ts} +0 -0
@@ -1,6 +1,8 @@
1
1
  import type { TokenType } from "@package/databases";
2
2
  import type { ChainId } from "@package/resources/enums";
3
- import type { RootsByChain } from "./leaf.model";
3
+ import type { RootsByChain, TempLeaf } from "./leaf.model";
4
+ import { LeafRepository } from "./leaf.repository";
5
+ type Token = Awaited<ReturnType<typeof LeafRepository.getTokensByKeys>>[number];
4
6
  export declare abstract class LeafService {
5
7
  /** Fetches leaves for a recipient, reconciling with pending temp leaves from the engine. */
6
8
  static getByRecipient(recipient: string, roots: RootsByChain, tags: string[], options?: {
@@ -10,6 +12,7 @@ export declare abstract class LeafService {
10
12
  withTestTokens?: boolean;
11
13
  reasonFilter?: string;
12
14
  type?: TokenType;
15
+ tokenAddresses?: string[];
13
16
  skipBreakdowns?: boolean;
14
17
  chainFilter?: ChainId[] | null;
15
18
  }): Promise<{
@@ -395,30 +398,55 @@ export declare abstract class LeafService {
395
398
  }[];
396
399
  }[]>;
397
400
  /**
398
- * Fetches per-`(chain, opportunity, token)` reward totals for a recipient, with the resolved
399
- * `Opportunity` (including standard relations) and every `Campaign` linked to those opps —
400
- * sufficient for opportunity-level privacy masking via `CampaignService.checkAccessBatch`.
401
+ * Lean per-`(chain, token)` rollup of a recipient's rewards bypasses `getByRecipient`'s heavy
402
+ * `Breakdowns Campaign Opportunity ...` include tree.
401
403
  *
402
- * Implementation:
403
- * 1. Step 1 (sums) is served by the `leaf_breakdown_amounts_per_recipient_opportunity`
404
- * materialized view via `LeafViewRepository.amountsByRecipientOpportunity` — pre-aggregated
405
- * and refreshed every 30 min, mirroring every other recipient-keyed reward MV.
406
- * 2. Step 2 (campaigns + opportunities per `(chain, opp)`) goes through `CampaignService.findMany`
407
- * and `OpportunityService.findMany` in parallel; both apply formatting and centralize
408
- * access semantics.
404
+ * Designed for `/users/:address/rewards/summary` and `/users/:address/rewards/stats` where only
405
+ * `amount` / `claimed` / `pending` / `proofs` per `(chain, token)` are needed. The protocol
406
+ * filter is pushed to SQL via `Breakdowns.some.Opportunity.mainProtocolId` — no second roundtrip.
409
407
  *
410
- * Privacy semantic: campaigns checked for access are **all campaigns linked to each opp**, not
411
- * only those the recipient earned from. This means an opp where the recipient only earned from
412
- * a private campaign but where a public sibling campaign exists will resolve as accessible.
408
+ * `pending` is computed by matching live `LeafBreakdown` rows against `TempLeaves` (engine DB)
409
+ * and unmerged `DiffBreakdowns` for the in-flight tree root, mirroring the per-breakdown logic
410
+ * in `reconcileLeaf` but aggregated to `(chain, token)`. Unmatched temp leaves (orphans) are
411
+ * filtered against `type` / `isTest` / `tokenAddresses` and either folded into pending for an
412
+ * existing leaf row or emitted as phantom rows with `amount = "0"`, `proofs = []`.
413
413
  *
414
- * Staleness: `amount` / `claimed` reflect the MV refresh cadence ( 30 min). Acceptable for the
415
- * rewards-summary surface (display-only); not safe for transactional reads.
414
+ * Mutability contract: returned rows are plain objects (no Prisma references); callers may
415
+ * mutate `claimed` in place used by `RewardService.checkLastClaim` for on-chain reconciliation.
416
+ */
417
+ static getSummaryByRecipient(recipient: string, roots: RootsByChain, options?: {
418
+ chainFilter?: ChainId[] | null;
419
+ type?: TokenType;
420
+ withTestTokens?: boolean;
421
+ tokenAddresses?: string[];
422
+ protocols?: string[];
423
+ }): Promise<Array<{
424
+ distributionChainId: number;
425
+ tokenAddress: string;
426
+ amount: string;
427
+ claimed: string;
428
+ pending: string;
429
+ proofs: string[];
430
+ RewardToken: Token;
431
+ }>>;
432
+ /**
433
+ * Per-`(chain, opportunity, token)` reward sums for a recipient, **restricted to LIVE
434
+ * opportunities**. Each row carries the opportunity (heavy includes) and every `Campaign`
435
+ * linked to that opp — the campaign list drives opportunity-level privacy masking via
436
+ * `CampaignService.checkAccessBatch`.
437
+ *
438
+ * Sums come from `leaf_breakdown_amounts_per_recipient_opportunity` (≤30 min stale). The
439
+ * LIVE-status filter is pushed into the `Opportunity` and `Campaign` SQL queries so we never
440
+ * hydrate non-LIVE rows or their campaigns. Sums whose opportunity is non-LIVE are dropped.
416
441
  *
417
- * Currency: `amount` and `claimed` are raw token-decimal integers (never USD); grouping by
418
- * `tokenAddress` keeps every output row single-currency. USD conversion remains a JS-side
419
- * concern in `getRewardsSummary`.
442
+ * Privacy semantic: an opp is accessible if ANY linked campaign is accessible — even campaigns
443
+ * the recipient didn't earn from. Currency: `amount` / `claimed` are raw token-decimal integers;
444
+ * grouping by `tokenAddress` keeps every output row single-currency.
420
445
  */
421
- static getBreakdownsByOpportunity(recipient: string, distributionChainIds: number[]): Promise<{
446
+ static getBreakdownsByOpportunity(recipient: string, distributionChainIds: number[], options?: {
447
+ withTestTokens?: boolean;
448
+ liveOnly?: boolean;
449
+ }): Promise<{
422
450
  distributionChainId: number;
423
451
  opportunityId: string;
424
452
  tokenAddress: string;
@@ -440,196 +468,6 @@ export declare abstract class LeafService {
440
468
  maxDailyRewards: number;
441
469
  tags: string[];
442
470
  liveCampaigns: number;
443
- aprRecord: {
444
- cumulated: number;
445
- timestamp: bigint;
446
- breakdowns: ({
447
- distributionType: import("@package/databases").DistributionType;
448
- identifier: string;
449
- type: "CAMPAIGN";
450
- timestamp: bigint;
451
- value: number;
452
- } | {
453
- identifier: string;
454
- type: import("@package/databases").AprType;
455
- timestamp: bigint;
456
- value: number;
457
- })[];
458
- };
459
- nativeAprRecord: {
460
- title: string;
461
- description: string | undefined;
462
- value: number;
463
- timestamp: bigint;
464
- amount: bigint | undefined;
465
- rewardToken: {
466
- id: string;
467
- name: string | null;
468
- chainId: number;
469
- address: string;
470
- decimals: number;
471
- symbol: string;
472
- icon: string;
473
- verified: boolean;
474
- isNative: boolean;
475
- isTest: boolean;
476
- type: "POINT" | "PRETGE" | "TOKEN";
477
- price?: number | null | undefined;
478
- updatedAt?: number | null | undefined;
479
- priceSource?: string | null | undefined;
480
- displaySymbol?: string | undefined;
481
- underlyingTokenId?: string | undefined;
482
- priceAlertDismissedAt?: number | undefined;
483
- priceAlertCount?: number | undefined;
484
- } | undefined;
485
- };
486
- tvlRecord: {
487
- id: string;
488
- total: number;
489
- timestamp: bigint;
490
- breakdowns: {
491
- identifier: string;
492
- type: import("@package/databases").TvlType;
493
- value: number;
494
- }[];
495
- };
496
- rewardsRecord: {
497
- id: string;
498
- total: number;
499
- timestamp: bigint;
500
- breakdowns: {
501
- id: string;
502
- timestamp: bigint;
503
- campaignId: string;
504
- dailyRewardsRecordId: string;
505
- token: {
506
- id: string;
507
- name: string | null;
508
- chainId: number;
509
- address: string;
510
- decimals: number;
511
- symbol: string;
512
- icon: string;
513
- verified: boolean;
514
- isNative: boolean;
515
- isTest: boolean;
516
- type: "POINT" | "PRETGE" | "TOKEN";
517
- price?: number | null | undefined;
518
- updatedAt?: number | null | undefined;
519
- priceSource?: string | null | undefined;
520
- displaySymbol?: string | undefined;
521
- underlyingTokenId?: string | undefined;
522
- priceAlertDismissedAt?: number | undefined;
523
- priceAlertCount?: number | undefined;
524
- };
525
- amount: bigint;
526
- maxAmount: bigint;
527
- value: number;
528
- maxValue: number;
529
- distributionType: import("@package/databases").DistributionType;
530
- onChainCampaignId: string;
531
- }[];
532
- };
533
- campaigns: (Omit<import("../campaign/campaign.model").CampaignWithParams<import("@package/resources/enums").CampaignType>, "createdAt" | "endTimestamp" | "manualOverrides" | "parentCampaignId" | "pauseCompute" | "pausePrecompute" | "rootCampaignId" | "startTimestamp" | "subType"> & {
534
- subType: number | null;
535
- startTimestamp: number;
536
- endTimestamp: number;
537
- createdAt: string;
538
- parentCampaignId?: string | undefined;
539
- rootCampaignId?: string | undefined;
540
- pauseCompute?: string | undefined;
541
- pausePrecompute?: string | undefined;
542
- } & {
543
- Opportunity: {
544
- chainId: number;
545
- type: string;
546
- identifier: string;
547
- name: string;
548
- description: string;
549
- howToSteps: string[];
550
- status: import("@package/databases").Status;
551
- action: import("@package/databases").OpportunityAction;
552
- tvl: number;
553
- apr: number;
554
- maxApr: number | null;
555
- dailyRewards: number;
556
- maxDailyRewards: number;
557
- tags: string[];
558
- liveCampaigns: number;
559
- tokens: {
560
- id: string;
561
- name: string | null;
562
- chainId: number;
563
- address: string;
564
- decimals: number;
565
- symbol: string;
566
- icon: string;
567
- verified: boolean;
568
- isNative: boolean;
569
- isTest: boolean;
570
- type: "POINT" | "PRETGE" | "TOKEN";
571
- price?: number | null | undefined;
572
- updatedAt?: number | null | undefined;
573
- priceSource?: string | null | undefined;
574
- displaySymbol?: string | undefined;
575
- underlyingTokenId?: string | undefined;
576
- priceAlertDismissedAt?: number | undefined;
577
- priceAlertCount?: number | undefined;
578
- }[];
579
- chain: {
580
- id: number;
581
- name: string;
582
- icon: string;
583
- liveCampaigns: number;
584
- endOfDisputePeriod: number;
585
- explorers?: {
586
- type: "BLOCKSCOUT" | "ETHERSCAN" | "SOLSCAN";
587
- url: string;
588
- chainId: number;
589
- }[] | undefined;
590
- lastClaimsOnchainFetchTimestamp: string | null;
591
- };
592
- protocol: {
593
- id: string;
594
- tags: string[];
595
- name: string;
596
- description: string;
597
- url: string;
598
- icon: string;
599
- banner: string | null;
600
- opportunityBannerLight: string | null;
601
- opportunityBannerDark: string | null;
602
- } | undefined;
603
- activePrograms: {
604
- icon: string;
605
- id: string;
606
- name: string;
607
- slug: string | null;
608
- }[];
609
- depositUrls: {
610
- id: string;
611
- title: string;
612
- url: string;
613
- subtitle?: string | undefined;
614
- icon?: string | undefined;
615
- priority: number;
616
- }[] | undefined;
617
- id: string;
618
- hidden: true | undefined;
619
- nativeApr: number | undefined;
620
- depositUrl: string | undefined;
621
- explorerAddress: string | undefined;
622
- lastCampaignCreatedAt: number;
623
- earliestCampaignStart: bigint | undefined;
624
- latestCampaignStart: bigint | undefined;
625
- earliestCampaignEnd: bigint | undefined;
626
- latestCampaignEnd: bigint | undefined;
627
- };
628
- })[] | undefined;
629
- liveCampaignsForCreator?: any;
630
- soonCampaignsForCreator?: any;
631
- pastCampaignsForCreator?: any;
632
- distributedBycreator?: any;
633
471
  tokens: {
634
472
  id: string;
635
473
  name: string | null;
@@ -698,311 +536,42 @@ export declare abstract class LeafService {
698
536
  latestCampaignStart: bigint | undefined;
699
537
  earliestCampaignEnd: bigint | undefined;
700
538
  latestCampaignEnd: bigint | undefined;
701
- } | ({
702
- id: string;
703
- type: string;
704
- identifier: string;
705
- chainId: number;
706
- name: string;
707
- description: string;
708
- howToSteps: string[];
709
- status: "LIVE" | "NONE" | "PAST" | "SOON";
710
- action: "BORROW" | "DROP" | "HOLD" | "INVALID" | "LEND" | "LONG" | "POOL" | "SHORT" | "STAKE" | "SWAP";
711
- tags: string[];
712
- mainProtocol?: string | undefined;
713
- depositUrl?: string | undefined;
714
- depositUrls?: {
715
- id: string;
716
- title: string;
717
- url: string;
718
- subtitle?: string | undefined;
719
- icon?: string | undefined;
720
- priority: number;
721
- }[] | undefined;
722
- explorerAddress?: string | undefined;
723
- hidden?: boolean | undefined;
724
- tvl: number;
725
- apr: number;
726
- dailyRewards: number;
727
- maxDailyRewards?: number | null | undefined;
728
- liveCampaigns: number;
729
- lastCampaignCreatedAt: number;
730
- earliestCampaignStart?: string | bigint | undefined;
731
- latestCampaignStart?: string | bigint | undefined;
732
- earliestCampaignEnd?: string | bigint | undefined;
733
- latestCampaignEnd?: string | bigint | undefined;
734
- nativeApr?: number | undefined;
735
- maxApr?: number | null | undefined;
736
- liveCampaignsForCreator?: number | undefined;
737
- soonCampaignsForCreator?: number | undefined;
738
- pastCampaignsForCreator?: number | undefined;
739
- distributionType?: string | undefined;
740
- tokens: {
741
- id: string;
742
- name: string | null;
743
- chainId: number;
744
- address: string;
745
- decimals: number;
746
- symbol: string;
747
- icon: string;
748
- verified: boolean;
749
- isNative: boolean;
750
- isTest: boolean;
751
- type: "POINT" | "PRETGE" | "TOKEN";
752
- price?: number | null | undefined;
753
- updatedAt?: number | null | undefined;
754
- priceSource?: string | null | undefined;
755
- displaySymbol?: string | undefined;
756
- underlyingTokenId?: string | undefined;
757
- priceAlertDismissedAt?: number | undefined;
758
- priceAlertCount?: number | undefined;
759
- }[];
760
- chain: {
761
- id: number;
762
- name: string;
763
- icon: string;
764
- liveCampaigns: number;
765
- endOfDisputePeriod: number;
766
- explorers?: {
767
- type: "BLOCKSCOUT" | "ETHERSCAN" | "SOLSCAN";
768
- url: string;
769
- chainId: number;
770
- }[] | undefined;
771
- lastClaimsOnchainFetchTimestamp: string | null;
772
- };
773
- activePrograms: {
774
- id: string;
775
- name: string;
776
- slug?: string | null | undefined;
777
- description?: string | undefined;
778
- icon?: string | undefined;
779
- }[];
780
- protocol?: {
781
- id: string;
782
- name: string;
783
- icon: string;
784
- tags: string[];
785
- description: string;
786
- url: string;
787
- dailyRewards?: number | undefined;
788
- numberOfLiveCampaigns?: number | undefined;
789
- opportunityLiveTags?: string[] | undefined;
790
- banner: string | null;
791
- opportunityBannerLight: string | null;
792
- opportunityBannerDark: string | null;
793
- } | null | undefined;
794
- aprRecord?: {
795
- cumulated: number;
796
- timestamp: string | bigint;
797
- breakdowns: {
798
- identifier: string;
799
- type: "CAMPAIGN" | "PROTOCOL" | "TOKEN";
800
- value: number;
801
- timestamp: string | bigint;
802
- distributionType?: "AAVE_NET_APR" | "AAVE_V4_NET_APR" | "DUTCH_AUCTION" | "ERC4626_APR" | "FIX_REWARD_AMOUNT_PER_LIQUIDITY_AMOUNT" | "FIX_REWARD_AMOUNT_PER_LIQUIDITY_VALUE" | "FIX_REWARD_VALUE_PER_LIQUIDITY_AMOUNT" | "FIX_REWARD_VALUE_PER_LIQUIDITY_VALUE" | "MAX_REWARD_AMOUNT_PER_LIQUIDITY_AMOUNT" | "MAX_REWARD_AMOUNT_PER_LIQUIDITY_VALUE" | "MAX_REWARD_VALUE_PER_LIQUIDITY_AMOUNT" | "MAX_REWARD_VALUE_PER_LIQUIDITY_VALUE" | undefined;
803
- }[];
804
- } | undefined;
805
- nativeAprRecord?: {
806
- title: string;
807
- description?: string | undefined;
808
- value: number;
809
- timestamp: string | bigint;
810
- amount?: bigint | undefined;
811
- rewardToken?: {
812
- id: string;
813
- name: string | null;
814
- chainId: number;
815
- address: string;
816
- decimals: number;
817
- symbol: string;
818
- icon: string;
819
- verified: boolean;
820
- isNative: boolean;
821
- isTest: boolean;
822
- type: "POINT" | "PRETGE" | "TOKEN";
823
- price?: number | null | undefined;
824
- updatedAt?: number | null | undefined;
825
- priceSource?: string | null | undefined;
826
- displaySymbol?: string | undefined;
827
- underlyingTokenId?: string | undefined;
828
- priceAlertDismissedAt?: number | undefined;
829
- priceAlertCount?: number | undefined;
830
- } | undefined;
831
- } | undefined;
832
- tvlRecord?: {
833
- total: number;
834
- timestamp: string | bigint;
835
- breakdowns: {
836
- identifier: string;
837
- type: "PROTOCOL" | "TOKEN";
838
- value: number;
839
- }[];
840
- } | undefined;
841
- rewardsRecord?: {
842
- total: number;
843
- timestamp: string | bigint;
844
- breakdowns: {
845
- campaignId: string;
846
- value: number;
847
- maxValue?: number | undefined;
848
- timestamp: string | bigint;
849
- token: {
850
- id: string;
851
- name: string | null;
852
- chainId: number;
853
- address: string;
854
- decimals: number;
855
- symbol: string;
856
- icon: string;
857
- verified: boolean;
858
- isNative: boolean;
859
- isTest: boolean;
860
- type: "POINT" | "PRETGE" | "TOKEN";
861
- price?: number | null | undefined;
862
- updatedAt?: number | null | undefined;
863
- priceSource?: string | null | undefined;
864
- displaySymbol?: string | undefined;
865
- underlyingTokenId?: string | undefined;
866
- priceAlertDismissedAt?: number | undefined;
867
- priceAlertCount?: number | undefined;
868
- };
869
- amount: string | bigint;
870
- distributionType?: "AAVE_NET_APR" | "AAVE_V4_NET_APR" | "DUTCH_AUCTION" | "ERC4626_APR" | "FIX_REWARD_AMOUNT_PER_LIQUIDITY_AMOUNT" | "FIX_REWARD_AMOUNT_PER_LIQUIDITY_VALUE" | "FIX_REWARD_VALUE_PER_LIQUIDITY_AMOUNT" | "FIX_REWARD_VALUE_PER_LIQUIDITY_VALUE" | "MAX_REWARD_AMOUNT_PER_LIQUIDITY_AMOUNT" | "MAX_REWARD_AMOUNT_PER_LIQUIDITY_VALUE" | "MAX_REWARD_VALUE_PER_LIQUIDITY_AMOUNT" | "MAX_REWARD_VALUE_PER_LIQUIDITY_VALUE" | undefined;
871
- onChainCampaignId?: string | undefined;
872
- }[];
873
- } | undefined;
874
- } & {
875
- campaigns?: {
876
- id: string;
877
- computeChainId: number;
878
- distributionChainId: number;
879
- campaignId: string;
880
- type: string;
881
- subType?: number | null | undefined;
882
- amount: string;
883
- startTimestamp: string | number | bigint;
884
- endTimestamp: string | number | bigint;
885
- creatorAddress: string;
886
- apr?: number | undefined;
887
- dailyRewards?: number | undefined;
888
- creator?: {
889
- address: string;
890
- tags?: string[] | undefined;
891
- creatorId?: string | null | undefined;
892
- } | undefined;
893
- params: unknown;
894
- description?: string | undefined;
895
- chain: {
896
- id: number;
897
- name: string;
898
- icon: string;
899
- liveCampaigns: number;
900
- endOfDisputePeriod: number;
901
- explorers?: {
902
- type: "BLOCKSCOUT" | "ETHERSCAN" | "SOLSCAN";
903
- url: string;
904
- chainId: number;
905
- }[] | undefined;
906
- lastClaimsOnchainFetchTimestamp: string | null;
907
- };
908
- rewardTokenId?: string | undefined;
909
- rewardToken: {
910
- id: string;
911
- name: string | null;
912
- chainId: number;
913
- address: string;
914
- decimals: number;
915
- symbol: string;
916
- icon: string;
917
- verified: boolean;
918
- isNative: boolean;
919
- isTest: boolean;
920
- type: "POINT" | "PRETGE" | "TOKEN";
921
- price?: number | null | undefined;
922
- updatedAt?: number | null | undefined;
923
- priceSource?: string | null | undefined;
924
- displaySymbol?: string | undefined;
925
- underlyingTokenId?: string | undefined;
926
- priceAlertDismissedAt?: number | undefined;
927
- priceAlertCount?: number | undefined;
928
- };
929
- opportunityId?: string | undefined;
930
- distributionChain?: {
931
- id: number;
932
- name: string;
933
- icon: string;
934
- liveCampaigns: number;
935
- endOfDisputePeriod: number;
936
- explorers?: {
937
- type: "BLOCKSCOUT" | "ETHERSCAN" | "SOLSCAN";
938
- url: string;
939
- chainId: number;
940
- }[] | undefined;
941
- lastClaimsOnchainFetchTimestamp: string | null;
942
- } | undefined;
943
- distributionType?: "AAVE_NET_APR" | "AAVE_V4_NET_APR" | "DUTCH_AUCTION" | "ERC4626_APR" | "FIX_REWARD_AMOUNT_PER_LIQUIDITY_AMOUNT" | "FIX_REWARD_AMOUNT_PER_LIQUIDITY_VALUE" | "FIX_REWARD_VALUE_PER_LIQUIDITY_AMOUNT" | "FIX_REWARD_VALUE_PER_LIQUIDITY_VALUE" | "MAX_REWARD_AMOUNT_PER_LIQUIDITY_AMOUNT" | "MAX_REWARD_AMOUNT_PER_LIQUIDITY_VALUE" | "MAX_REWARD_VALUE_PER_LIQUIDITY_AMOUNT" | "MAX_REWARD_VALUE_PER_LIQUIDITY_VALUE" | undefined;
944
- campaignStatus: {
945
- campaignId: string;
946
- computedUntil: string | number;
947
- processingStarted: string | number;
948
- status: string;
949
- preComputeProcessingStarted: string | number;
950
- preComputeStatus: string;
951
- delay?: number | undefined;
952
- error?: string | undefined;
953
- details?: unknown;
954
- };
955
- createdAt: string;
956
- rootCampaignId?: string | null | undefined;
957
- parentCampaignId?: string | null | undefined;
958
- childCampaignIds?: string[] | undefined;
959
- dailyRewardsBreakdown?: {
960
- campaignId: string;
961
- value: number;
962
- maxValue?: number | undefined;
963
- timestamp: string | bigint;
964
- token: {
965
- id: string;
966
- name: string | null;
967
- chainId: number;
968
- address: string;
969
- decimals: number;
970
- symbol: string;
971
- icon: string;
972
- verified: boolean;
973
- isNative: boolean;
974
- isTest: boolean;
975
- type: "POINT" | "PRETGE" | "TOKEN";
976
- price?: number | null | undefined;
977
- updatedAt?: number | null | undefined;
978
- priceSource?: string | null | undefined;
979
- displaySymbol?: string | undefined;
980
- underlyingTokenId?: string | undefined;
981
- priceAlertDismissedAt?: number | undefined;
982
- priceAlertCount?: number | undefined;
983
- };
984
- amount: string | bigint;
985
- distributionType?: "AAVE_NET_APR" | "AAVE_V4_NET_APR" | "DUTCH_AUCTION" | "ERC4626_APR" | "FIX_REWARD_AMOUNT_PER_LIQUIDITY_AMOUNT" | "FIX_REWARD_AMOUNT_PER_LIQUIDITY_VALUE" | "FIX_REWARD_VALUE_PER_LIQUIDITY_AMOUNT" | "FIX_REWARD_VALUE_PER_LIQUIDITY_VALUE" | "MAX_REWARD_AMOUNT_PER_LIQUIDITY_AMOUNT" | "MAX_REWARD_AMOUNT_PER_LIQUIDITY_VALUE" | "MAX_REWARD_VALUE_PER_LIQUIDITY_AMOUNT" | "MAX_REWARD_VALUE_PER_LIQUIDITY_VALUE" | undefined;
986
- onChainCampaignId?: string | undefined;
987
- }[] | undefined;
988
- pauseCompute?: string | null | undefined;
989
- pausePrecompute?: string | null | undefined;
990
- hasOverrides?: boolean | undefined;
991
- isPrivate: boolean;
992
- campaignEncodingHash?: string | undefined;
993
- }[] | undefined;
994
- }) | null;
995
- Campaigns: (Omit<import("../campaign/campaign.model").CampaignWithParams<import("@package/resources/enums").CampaignType>, "createdAt" | "endTimestamp" | "manualOverrides" | "parentCampaignId" | "pauseCompute" | "pausePrecompute" | "rootCampaignId" | "startTimestamp" | "subType"> & {
996
- subType: number | null;
997
- startTimestamp: number;
998
- endTimestamp: number;
999
- createdAt: string;
1000
- parentCampaignId?: string | undefined;
1001
- rootCampaignId?: string | undefined;
1002
- pauseCompute?: string | undefined;
1003
- pausePrecompute?: string | undefined;
1004
- })[];
539
+ };
540
+ Campaigns: import("../campaign/campaign.formatter").LeanCampaign[];
1005
541
  }[]>;
542
+ /**
543
+ * Reconciles pending amounts not yet reflected in the MV and aggregates them per
544
+ * `(opportunity, token)` for a recipient.
545
+ *
546
+ * Formula (per (chain, token, campaignId, reason)):
547
+ * pending = max(0, tempLeaf.amount − (breakdown.amount + Σ liveDiff.amount))
548
+ *
549
+ * - `tempLeaf.amount` = cumulative engine-computed total, not yet merged into any on-chain root
550
+ * - `breakdown.amount` = cumulative settled amount in the MV for that composite key
551
+ * - `liveDiff.amount` = sum of unmerged `DiffBreakdown` rows tied to the live root (already
552
+ * visible in the live tree but not yet folded into the breakdown row);
553
+ * subtracted so amounts already counted as claimable in the MV are not
554
+ * double-counted as pending
555
+ *
556
+ * Attribution is parent-only — each temp leaf is credited to the opportunity its parent
557
+ * `Campaign` maps to via `oppByCampaignKey`. Temp leaves whose campaign is not in the map are
558
+ * dropped (no surfaced opportunity to attribute them to).
559
+ *
560
+ * Shared by `UserService.getActiveOpportunities` (cross-chain) and `UserService.getChainBreakdown`
561
+ * (single-chain) — both rely on the same MV-aligned attribution rule.
562
+ *
563
+ * @param recipient
564
+ * @param chainIds chains the live-roots map is filtered to
565
+ * @param roots full roots map; only chains with a `live` root contribute liveDiff offsets
566
+ * @param tempLeaves pre-fetched temp leaves (caller usually needs them for token seed too)
567
+ * @param oppByCampaignKey `${chainId}-${campaignId}` → opportunityId; defines attribution
568
+ * @returns Map<opportunityId, Map<`${chainId}-${tokenAddress}`, { chainId, tokenAddress, amount }>>
569
+ */
570
+ static computePendingByOpportunity(recipient: string, chainIds: number[], roots: RootsByChain, tempLeaves: TempLeaf[], oppByCampaignKey: Map<string, string>): Promise<Map<string, Map<string, {
571
+ chainId: number;
572
+ tokenAddress: string;
573
+ amount: bigint;
574
+ }>>>;
1006
575
  private static fetchData;
1007
576
  /** Extracts unique campaign and token keys from temp leaves for batch prefetch. */
1008
577
  private static extractTempLeafKeys;
@@ -1030,3 +599,4 @@ export declare abstract class LeafService {
1030
599
  amount: string;
1031
600
  }, roots: string[]): Promise<void>;
1032
601
  }
602
+ export {};