@namehash/ens-referrals 1.1.0 → 1.2.0

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.
package/dist/index.d.cts CHANGED
@@ -279,6 +279,31 @@ interface AwardedReferrerMetrics extends RankedReferrerMetrics {
279
279
  }
280
280
  declare const validateAwardedReferrerMetrics: (referrer: AwardedReferrerMetrics, rules: ReferralProgramRules) => void;
281
281
  declare const buildAwardedReferrerMetrics: (referrer: RankedReferrerMetrics, aggregatedMetrics: AggregatedReferrerMetrics, rules: ReferralProgramRules) => AwardedReferrerMetrics;
282
+ /**
283
+ * Extends {@link AwardedReferrerMetrics} but with rank set to null to represent
284
+ * a referrer who is not on the leaderboard (has zero referrals within the rules associated with the leaderboard).
285
+ */
286
+ interface UnrankedReferrerMetrics extends Omit<AwardedReferrerMetrics, "rank" | "isQualified"> {
287
+ /**
288
+ * The referrer is not on the leaderboard and therefore has no rank.
289
+ */
290
+ rank: null;
291
+ /**
292
+ * Always false for unranked referrers.
293
+ */
294
+ isQualified: false;
295
+ }
296
+ declare const validateUnrankedReferrerMetrics: (metrics: UnrankedReferrerMetrics) => void;
297
+ /**
298
+ * Build an unranked zero-score referrer record for a referrer address that is not in the leaderboard.
299
+ *
300
+ * This is useful when you want to return a referrer record for an address that has no referrals
301
+ * and is not qualified for the leaderboard.
302
+ *
303
+ * @param referrer - The referrer address
304
+ * @returns An {@link UnrankedReferrerMetrics} with zero values for all metrics and null rank
305
+ */
306
+ declare const buildUnrankedReferrerMetrics: (referrer: Address) => UnrankedReferrerMetrics;
282
307
 
283
308
  /**
284
309
  * Represents aggregated metrics for a list of `RankedReferrerMetrics`.
@@ -404,7 +429,7 @@ declare const REFERRERS_PER_LEADERBOARD_PAGE_MAX = 100;
404
429
  /**
405
430
  * Pagination params for leaderboard queries.
406
431
  */
407
- interface ReferrerLeaderboardPaginationParams {
432
+ interface ReferrerLeaderboardPageParams {
408
433
  /**
409
434
  * Requested referrer leaderboard page number (1-indexed)
410
435
  * @invariant Must be a positive integer (>= 1)
@@ -418,8 +443,8 @@ interface ReferrerLeaderboardPaginationParams {
418
443
  */
419
444
  itemsPerPage?: number;
420
445
  }
421
- declare const buildReferrerLeaderboardPaginationParams: (params: ReferrerLeaderboardPaginationParams) => Required<ReferrerLeaderboardPaginationParams>;
422
- interface ReferrerLeaderboardPaginationContext extends Required<ReferrerLeaderboardPaginationParams> {
446
+ declare const buildReferrerLeaderboardPageParams: (params: ReferrerLeaderboardPageParams) => Required<ReferrerLeaderboardPageParams>;
447
+ interface ReferrerLeaderboardPageContext extends Required<ReferrerLeaderboardPageParams> {
423
448
  /**
424
449
  * Total number of referrers across all leaderboard pages
425
450
  * @invariant Guaranteed to be a non-negative integer (>= 0)
@@ -460,8 +485,8 @@ interface ReferrerLeaderboardPaginationContext extends Required<ReferrerLeaderbo
460
485
  */
461
486
  endIndex?: number;
462
487
  }
463
- declare const validateReferrerLeaderboardPaginationContext: (context: ReferrerLeaderboardPaginationContext) => void;
464
- declare const buildReferrerLeaderboardPaginationContext: (optionalParams: ReferrerLeaderboardPaginationParams, leaderboard: ReferrerLeaderboard) => ReferrerLeaderboardPaginationContext;
488
+ declare const validateReferrerLeaderboardPageContext: (context: ReferrerLeaderboardPageContext) => void;
489
+ declare const buildReferrerLeaderboardPageContext: (optionalParams: ReferrerLeaderboardPageParams, leaderboard: ReferrerLeaderboard) => ReferrerLeaderboardPageContext;
465
490
  /**
466
491
  * A page of referrers from the referrer leaderboard.
467
492
  */
@@ -484,16 +509,16 @@ interface ReferrerLeaderboardPage {
484
509
  */
485
510
  aggregatedMetrics: AggregatedReferrerMetrics;
486
511
  /**
487
- * The {@link ReferrerLeaderboardPaginationContext} of this {@link ReferrerLeaderboardPage} relative to the overall
512
+ * The {@link ReferrerLeaderboardPageContext} of this {@link ReferrerLeaderboardPage} relative to the overall
488
513
  * {@link ReferrerLeaderboard}.
489
514
  */
490
- paginationContext: ReferrerLeaderboardPaginationContext;
515
+ paginationContext: ReferrerLeaderboardPageContext;
491
516
  /**
492
517
  * The {@link UnixTimestamp} of when the data used to build the {@link ReferrerLeaderboardPage} was accurate as of.
493
518
  */
494
519
  accurateAsOf: UnixTimestamp;
495
520
  }
496
- declare const getReferrerLeaderboardPage: (paginationParams: ReferrerLeaderboardPaginationParams, leaderboard: ReferrerLeaderboard) => ReferrerLeaderboardPage;
521
+ declare const getReferrerLeaderboardPage: (paginationParams: ReferrerLeaderboardPageParams, leaderboard: ReferrerLeaderboard) => ReferrerLeaderboardPage;
497
522
 
498
523
  /**
499
524
  * Build a URL to the official ENS manager app
@@ -507,4 +532,109 @@ declare const isPositiveInteger: (value: number) => boolean;
507
532
  declare const validateNonNegativeInteger: (value: number) => void;
508
533
  declare const isFiniteNonNegativeNumber: (value: number) => boolean;
509
534
 
510
- export { type AccountId, type AggregatedReferrerMetrics, type AwardedReferrerMetrics, type ChainId, type Duration, ENCODED_REFERRER_BYTE_LENGTH, ENCODED_REFERRER_BYTE_OFFSET, ENS_HOLIDAY_AWARDS_END_DATE, ENS_HOLIDAY_AWARDS_MAX_QUALIFIED_REFERRERS, ENS_HOLIDAY_AWARDS_START_DATE, ENS_HOLIDAY_AWARDS_TOTAL_AWARD_POOL_VALUE, EXPECTED_ENCODED_REFERRER_PADDING, type EncodedReferrer, REFERRERS_PER_LEADERBOARD_PAGE_DEFAULT, REFERRERS_PER_LEADERBOARD_PAGE_MAX, type RankedReferrerMetrics, type ReferralProgramRules, type ReferrerLeaderboard, type ReferrerLeaderboardPage, type ReferrerLeaderboardPaginationContext, type ReferrerLeaderboardPaginationParams, type ReferrerMetrics, type ReferrerMetricsForComparison, type ReferrerRank, type ReferrerScore, SECONDS_PER_YEAR, type ScoredReferrerMetrics, type USDQuantity, type UnixTimestamp, ZERO_ENCODED_REFERRER, buildAggregatedReferrerMetrics, buildAwardedReferrerMetrics, buildEncodedReferrer, buildEnsReferralUrl, buildRankedReferrerMetrics, buildReferralProgramRules, buildReferrerLeaderboard, buildReferrerLeaderboardPaginationContext, buildReferrerLeaderboardPaginationParams, buildReferrerMetrics, buildScoredReferrerMetrics, calcReferrerAwardPoolShare, calcReferrerFinalScore, calcReferrerFinalScoreBoost, calcReferrerFinalScoreMultiplier, calcReferrerScore, compareReferrerMetrics, decodeEncodedReferrer, getReferrerLeaderboardPage, isFiniteNonNegativeNumber, isInteger, isNonNegativeInteger, isPositiveInteger, isReferrerQualified, isValidDuration, isValidReferrerScore, isValidUSDQuantity, normalizeAddress, sortReferrerMetrics, validateAggregatedReferrerMetrics, validateAwardedReferrerMetrics, validateDuration, validateLowercaseAddress, validateNonNegativeInteger, validateRankedReferrerMetrics, validateReferralProgramRules, validateReferrerLeaderboardPaginationContext, validateReferrerMetrics, validateReferrerRank, validateReferrerScore, validateScoredReferrerMetrics, validateUSDQuantity, validateUnixTimestamp };
535
+ /**
536
+ * The type of referrer detail data.
537
+ */
538
+ declare const ReferrerDetailTypeIds: {
539
+ /**
540
+ * Represents a referrer who is ranked on the leaderboard.
541
+ */
542
+ readonly Ranked: "ranked";
543
+ /**
544
+ * Represents a referrer who is not ranked on the leaderboard.
545
+ */
546
+ readonly Unranked: "unranked";
547
+ };
548
+ /**
549
+ * The derived string union of possible {@link ReferrerDetailTypeIds}.
550
+ */
551
+ type ReferrerDetailTypeId = (typeof ReferrerDetailTypeIds)[keyof typeof ReferrerDetailTypeIds];
552
+ /**
553
+ * Referrer detail data for a specific referrer address on the leaderboard.
554
+ *
555
+ * Includes the referrer's awarded metrics from the leaderboard plus timestamp.
556
+ *
557
+ * Invariants:
558
+ * - `type` is always {@link ReferrerDetailTypeIds.Ranked}.
559
+ *
560
+ * @see {@link AwardedReferrerMetrics}
561
+ */
562
+ interface ReferrerDetailRanked {
563
+ /**
564
+ * The type of referrer detail data.
565
+ */
566
+ type: typeof ReferrerDetailTypeIds.Ranked;
567
+ /**
568
+ * The {@link ReferralProgramRules} used to calculate the {@link AwardedReferrerMetrics}.
569
+ */
570
+ rules: ReferralProgramRules;
571
+ /**
572
+ * The awarded referrer metrics from the leaderboard.
573
+ *
574
+ * Contains all calculated metrics including score, rank, qualification status,
575
+ * and award pool share information.
576
+ */
577
+ referrer: AwardedReferrerMetrics;
578
+ /**
579
+ * Aggregated metrics for all referrers on the leaderboard.
580
+ */
581
+ aggregatedMetrics: AggregatedReferrerMetrics;
582
+ /**
583
+ * The {@link UnixTimestamp} of when the data used to build the {@link ReferrerDetailData} was accurate as of.
584
+ */
585
+ accurateAsOf: UnixTimestamp;
586
+ }
587
+ /**
588
+ * Referrer detail data for a specific referrer address NOT on the leaderboard.
589
+ *
590
+ * Includes the referrer's unranked metrics (with null rank and isQualified: false) plus timestamp.
591
+ *
592
+ * Invariants:
593
+ * - `type` is always {@link ReferrerDetailTypeIds.Unranked}.
594
+ *
595
+ * @see {@link UnrankedReferrerMetrics}
596
+ */
597
+ interface ReferrerDetailUnranked {
598
+ /**
599
+ * The type of referrer detail data.
600
+ */
601
+ type: typeof ReferrerDetailTypeIds.Unranked;
602
+ /**
603
+ * The {@link ReferralProgramRules} used to calculate the {@link UnrankedReferrerMetrics}.
604
+ */
605
+ rules: ReferralProgramRules;
606
+ /**
607
+ * The unranked referrer metrics (not on the leaderboard).
608
+ *
609
+ * Contains all calculated metrics with rank set to null and isQualified set to false.
610
+ */
611
+ referrer: UnrankedReferrerMetrics;
612
+ /**
613
+ * Aggregated metrics for all referrers on the leaderboard.
614
+ */
615
+ aggregatedMetrics: AggregatedReferrerMetrics;
616
+ /**
617
+ * The {@link UnixTimestamp} of when the data used to build the {@link UnrankedReferrerDetailData} was accurate as of.
618
+ */
619
+ accurateAsOf: UnixTimestamp;
620
+ }
621
+ /**
622
+ * Referrer detail data for a specific referrer address.
623
+ *
624
+ * Use the `type` field to determine the specific type interpretation
625
+ * at runtime.
626
+ */
627
+ type ReferrerDetail = ReferrerDetailRanked | ReferrerDetailUnranked;
628
+ /**
629
+ * Get the detail for a specific referrer from the leaderboard.
630
+ *
631
+ * Returns a {@link ReferrerDetailRanked} if the referrer is on the leaderboard,
632
+ * or a {@link ReferrerDetailUnranked} if the referrer has no referrals.
633
+ *
634
+ * @param referrer - The referrer address to look up
635
+ * @param leaderboard - The referrer leaderboard to query
636
+ * @returns The appropriate {@link ReferrerDetail} (ranked or unranked)
637
+ */
638
+ declare const getReferrerDetail: (referrer: Address, leaderboard: ReferrerLeaderboard) => ReferrerDetail;
639
+
640
+ export { type AccountId, type AggregatedReferrerMetrics, type AwardedReferrerMetrics, type ChainId, type Duration, ENCODED_REFERRER_BYTE_LENGTH, ENCODED_REFERRER_BYTE_OFFSET, ENS_HOLIDAY_AWARDS_END_DATE, ENS_HOLIDAY_AWARDS_MAX_QUALIFIED_REFERRERS, ENS_HOLIDAY_AWARDS_START_DATE, ENS_HOLIDAY_AWARDS_TOTAL_AWARD_POOL_VALUE, EXPECTED_ENCODED_REFERRER_PADDING, type EncodedReferrer, REFERRERS_PER_LEADERBOARD_PAGE_DEFAULT, REFERRERS_PER_LEADERBOARD_PAGE_MAX, type RankedReferrerMetrics, type ReferralProgramRules, type ReferrerDetail, type ReferrerDetailRanked, type ReferrerDetailTypeId, ReferrerDetailTypeIds, type ReferrerDetailUnranked, type ReferrerLeaderboard, type ReferrerLeaderboardPage, type ReferrerLeaderboardPageContext, type ReferrerLeaderboardPageParams, type ReferrerMetrics, type ReferrerMetricsForComparison, type ReferrerRank, type ReferrerScore, SECONDS_PER_YEAR, type ScoredReferrerMetrics, type USDQuantity, type UnixTimestamp, type UnrankedReferrerMetrics, ZERO_ENCODED_REFERRER, buildAggregatedReferrerMetrics, buildAwardedReferrerMetrics, buildEncodedReferrer, buildEnsReferralUrl, buildRankedReferrerMetrics, buildReferralProgramRules, buildReferrerLeaderboard, buildReferrerLeaderboardPageContext, buildReferrerLeaderboardPageParams, buildReferrerMetrics, buildScoredReferrerMetrics, buildUnrankedReferrerMetrics, calcReferrerAwardPoolShare, calcReferrerFinalScore, calcReferrerFinalScoreBoost, calcReferrerFinalScoreMultiplier, calcReferrerScore, compareReferrerMetrics, decodeEncodedReferrer, getReferrerDetail, getReferrerLeaderboardPage, isFiniteNonNegativeNumber, isInteger, isNonNegativeInteger, isPositiveInteger, isReferrerQualified, isValidDuration, isValidReferrerScore, isValidUSDQuantity, normalizeAddress, sortReferrerMetrics, validateAggregatedReferrerMetrics, validateAwardedReferrerMetrics, validateDuration, validateLowercaseAddress, validateNonNegativeInteger, validateRankedReferrerMetrics, validateReferralProgramRules, validateReferrerLeaderboardPageContext, validateReferrerMetrics, validateReferrerRank, validateReferrerScore, validateScoredReferrerMetrics, validateUSDQuantity, validateUnixTimestamp, validateUnrankedReferrerMetrics };
package/dist/index.d.ts CHANGED
@@ -279,6 +279,31 @@ interface AwardedReferrerMetrics extends RankedReferrerMetrics {
279
279
  }
280
280
  declare const validateAwardedReferrerMetrics: (referrer: AwardedReferrerMetrics, rules: ReferralProgramRules) => void;
281
281
  declare const buildAwardedReferrerMetrics: (referrer: RankedReferrerMetrics, aggregatedMetrics: AggregatedReferrerMetrics, rules: ReferralProgramRules) => AwardedReferrerMetrics;
282
+ /**
283
+ * Extends {@link AwardedReferrerMetrics} but with rank set to null to represent
284
+ * a referrer who is not on the leaderboard (has zero referrals within the rules associated with the leaderboard).
285
+ */
286
+ interface UnrankedReferrerMetrics extends Omit<AwardedReferrerMetrics, "rank" | "isQualified"> {
287
+ /**
288
+ * The referrer is not on the leaderboard and therefore has no rank.
289
+ */
290
+ rank: null;
291
+ /**
292
+ * Always false for unranked referrers.
293
+ */
294
+ isQualified: false;
295
+ }
296
+ declare const validateUnrankedReferrerMetrics: (metrics: UnrankedReferrerMetrics) => void;
297
+ /**
298
+ * Build an unranked zero-score referrer record for a referrer address that is not in the leaderboard.
299
+ *
300
+ * This is useful when you want to return a referrer record for an address that has no referrals
301
+ * and is not qualified for the leaderboard.
302
+ *
303
+ * @param referrer - The referrer address
304
+ * @returns An {@link UnrankedReferrerMetrics} with zero values for all metrics and null rank
305
+ */
306
+ declare const buildUnrankedReferrerMetrics: (referrer: Address) => UnrankedReferrerMetrics;
282
307
 
283
308
  /**
284
309
  * Represents aggregated metrics for a list of `RankedReferrerMetrics`.
@@ -404,7 +429,7 @@ declare const REFERRERS_PER_LEADERBOARD_PAGE_MAX = 100;
404
429
  /**
405
430
  * Pagination params for leaderboard queries.
406
431
  */
407
- interface ReferrerLeaderboardPaginationParams {
432
+ interface ReferrerLeaderboardPageParams {
408
433
  /**
409
434
  * Requested referrer leaderboard page number (1-indexed)
410
435
  * @invariant Must be a positive integer (>= 1)
@@ -418,8 +443,8 @@ interface ReferrerLeaderboardPaginationParams {
418
443
  */
419
444
  itemsPerPage?: number;
420
445
  }
421
- declare const buildReferrerLeaderboardPaginationParams: (params: ReferrerLeaderboardPaginationParams) => Required<ReferrerLeaderboardPaginationParams>;
422
- interface ReferrerLeaderboardPaginationContext extends Required<ReferrerLeaderboardPaginationParams> {
446
+ declare const buildReferrerLeaderboardPageParams: (params: ReferrerLeaderboardPageParams) => Required<ReferrerLeaderboardPageParams>;
447
+ interface ReferrerLeaderboardPageContext extends Required<ReferrerLeaderboardPageParams> {
423
448
  /**
424
449
  * Total number of referrers across all leaderboard pages
425
450
  * @invariant Guaranteed to be a non-negative integer (>= 0)
@@ -460,8 +485,8 @@ interface ReferrerLeaderboardPaginationContext extends Required<ReferrerLeaderbo
460
485
  */
461
486
  endIndex?: number;
462
487
  }
463
- declare const validateReferrerLeaderboardPaginationContext: (context: ReferrerLeaderboardPaginationContext) => void;
464
- declare const buildReferrerLeaderboardPaginationContext: (optionalParams: ReferrerLeaderboardPaginationParams, leaderboard: ReferrerLeaderboard) => ReferrerLeaderboardPaginationContext;
488
+ declare const validateReferrerLeaderboardPageContext: (context: ReferrerLeaderboardPageContext) => void;
489
+ declare const buildReferrerLeaderboardPageContext: (optionalParams: ReferrerLeaderboardPageParams, leaderboard: ReferrerLeaderboard) => ReferrerLeaderboardPageContext;
465
490
  /**
466
491
  * A page of referrers from the referrer leaderboard.
467
492
  */
@@ -484,16 +509,16 @@ interface ReferrerLeaderboardPage {
484
509
  */
485
510
  aggregatedMetrics: AggregatedReferrerMetrics;
486
511
  /**
487
- * The {@link ReferrerLeaderboardPaginationContext} of this {@link ReferrerLeaderboardPage} relative to the overall
512
+ * The {@link ReferrerLeaderboardPageContext} of this {@link ReferrerLeaderboardPage} relative to the overall
488
513
  * {@link ReferrerLeaderboard}.
489
514
  */
490
- paginationContext: ReferrerLeaderboardPaginationContext;
515
+ paginationContext: ReferrerLeaderboardPageContext;
491
516
  /**
492
517
  * The {@link UnixTimestamp} of when the data used to build the {@link ReferrerLeaderboardPage} was accurate as of.
493
518
  */
494
519
  accurateAsOf: UnixTimestamp;
495
520
  }
496
- declare const getReferrerLeaderboardPage: (paginationParams: ReferrerLeaderboardPaginationParams, leaderboard: ReferrerLeaderboard) => ReferrerLeaderboardPage;
521
+ declare const getReferrerLeaderboardPage: (paginationParams: ReferrerLeaderboardPageParams, leaderboard: ReferrerLeaderboard) => ReferrerLeaderboardPage;
497
522
 
498
523
  /**
499
524
  * Build a URL to the official ENS manager app
@@ -507,4 +532,109 @@ declare const isPositiveInteger: (value: number) => boolean;
507
532
  declare const validateNonNegativeInteger: (value: number) => void;
508
533
  declare const isFiniteNonNegativeNumber: (value: number) => boolean;
509
534
 
510
- export { type AccountId, type AggregatedReferrerMetrics, type AwardedReferrerMetrics, type ChainId, type Duration, ENCODED_REFERRER_BYTE_LENGTH, ENCODED_REFERRER_BYTE_OFFSET, ENS_HOLIDAY_AWARDS_END_DATE, ENS_HOLIDAY_AWARDS_MAX_QUALIFIED_REFERRERS, ENS_HOLIDAY_AWARDS_START_DATE, ENS_HOLIDAY_AWARDS_TOTAL_AWARD_POOL_VALUE, EXPECTED_ENCODED_REFERRER_PADDING, type EncodedReferrer, REFERRERS_PER_LEADERBOARD_PAGE_DEFAULT, REFERRERS_PER_LEADERBOARD_PAGE_MAX, type RankedReferrerMetrics, type ReferralProgramRules, type ReferrerLeaderboard, type ReferrerLeaderboardPage, type ReferrerLeaderboardPaginationContext, type ReferrerLeaderboardPaginationParams, type ReferrerMetrics, type ReferrerMetricsForComparison, type ReferrerRank, type ReferrerScore, SECONDS_PER_YEAR, type ScoredReferrerMetrics, type USDQuantity, type UnixTimestamp, ZERO_ENCODED_REFERRER, buildAggregatedReferrerMetrics, buildAwardedReferrerMetrics, buildEncodedReferrer, buildEnsReferralUrl, buildRankedReferrerMetrics, buildReferralProgramRules, buildReferrerLeaderboard, buildReferrerLeaderboardPaginationContext, buildReferrerLeaderboardPaginationParams, buildReferrerMetrics, buildScoredReferrerMetrics, calcReferrerAwardPoolShare, calcReferrerFinalScore, calcReferrerFinalScoreBoost, calcReferrerFinalScoreMultiplier, calcReferrerScore, compareReferrerMetrics, decodeEncodedReferrer, getReferrerLeaderboardPage, isFiniteNonNegativeNumber, isInteger, isNonNegativeInteger, isPositiveInteger, isReferrerQualified, isValidDuration, isValidReferrerScore, isValidUSDQuantity, normalizeAddress, sortReferrerMetrics, validateAggregatedReferrerMetrics, validateAwardedReferrerMetrics, validateDuration, validateLowercaseAddress, validateNonNegativeInteger, validateRankedReferrerMetrics, validateReferralProgramRules, validateReferrerLeaderboardPaginationContext, validateReferrerMetrics, validateReferrerRank, validateReferrerScore, validateScoredReferrerMetrics, validateUSDQuantity, validateUnixTimestamp };
535
+ /**
536
+ * The type of referrer detail data.
537
+ */
538
+ declare const ReferrerDetailTypeIds: {
539
+ /**
540
+ * Represents a referrer who is ranked on the leaderboard.
541
+ */
542
+ readonly Ranked: "ranked";
543
+ /**
544
+ * Represents a referrer who is not ranked on the leaderboard.
545
+ */
546
+ readonly Unranked: "unranked";
547
+ };
548
+ /**
549
+ * The derived string union of possible {@link ReferrerDetailTypeIds}.
550
+ */
551
+ type ReferrerDetailTypeId = (typeof ReferrerDetailTypeIds)[keyof typeof ReferrerDetailTypeIds];
552
+ /**
553
+ * Referrer detail data for a specific referrer address on the leaderboard.
554
+ *
555
+ * Includes the referrer's awarded metrics from the leaderboard plus timestamp.
556
+ *
557
+ * Invariants:
558
+ * - `type` is always {@link ReferrerDetailTypeIds.Ranked}.
559
+ *
560
+ * @see {@link AwardedReferrerMetrics}
561
+ */
562
+ interface ReferrerDetailRanked {
563
+ /**
564
+ * The type of referrer detail data.
565
+ */
566
+ type: typeof ReferrerDetailTypeIds.Ranked;
567
+ /**
568
+ * The {@link ReferralProgramRules} used to calculate the {@link AwardedReferrerMetrics}.
569
+ */
570
+ rules: ReferralProgramRules;
571
+ /**
572
+ * The awarded referrer metrics from the leaderboard.
573
+ *
574
+ * Contains all calculated metrics including score, rank, qualification status,
575
+ * and award pool share information.
576
+ */
577
+ referrer: AwardedReferrerMetrics;
578
+ /**
579
+ * Aggregated metrics for all referrers on the leaderboard.
580
+ */
581
+ aggregatedMetrics: AggregatedReferrerMetrics;
582
+ /**
583
+ * The {@link UnixTimestamp} of when the data used to build the {@link ReferrerDetailData} was accurate as of.
584
+ */
585
+ accurateAsOf: UnixTimestamp;
586
+ }
587
+ /**
588
+ * Referrer detail data for a specific referrer address NOT on the leaderboard.
589
+ *
590
+ * Includes the referrer's unranked metrics (with null rank and isQualified: false) plus timestamp.
591
+ *
592
+ * Invariants:
593
+ * - `type` is always {@link ReferrerDetailTypeIds.Unranked}.
594
+ *
595
+ * @see {@link UnrankedReferrerMetrics}
596
+ */
597
+ interface ReferrerDetailUnranked {
598
+ /**
599
+ * The type of referrer detail data.
600
+ */
601
+ type: typeof ReferrerDetailTypeIds.Unranked;
602
+ /**
603
+ * The {@link ReferralProgramRules} used to calculate the {@link UnrankedReferrerMetrics}.
604
+ */
605
+ rules: ReferralProgramRules;
606
+ /**
607
+ * The unranked referrer metrics (not on the leaderboard).
608
+ *
609
+ * Contains all calculated metrics with rank set to null and isQualified set to false.
610
+ */
611
+ referrer: UnrankedReferrerMetrics;
612
+ /**
613
+ * Aggregated metrics for all referrers on the leaderboard.
614
+ */
615
+ aggregatedMetrics: AggregatedReferrerMetrics;
616
+ /**
617
+ * The {@link UnixTimestamp} of when the data used to build the {@link UnrankedReferrerDetailData} was accurate as of.
618
+ */
619
+ accurateAsOf: UnixTimestamp;
620
+ }
621
+ /**
622
+ * Referrer detail data for a specific referrer address.
623
+ *
624
+ * Use the `type` field to determine the specific type interpretation
625
+ * at runtime.
626
+ */
627
+ type ReferrerDetail = ReferrerDetailRanked | ReferrerDetailUnranked;
628
+ /**
629
+ * Get the detail for a specific referrer from the leaderboard.
630
+ *
631
+ * Returns a {@link ReferrerDetailRanked} if the referrer is on the leaderboard,
632
+ * or a {@link ReferrerDetailUnranked} if the referrer has no referrals.
633
+ *
634
+ * @param referrer - The referrer address to look up
635
+ * @param leaderboard - The referrer leaderboard to query
636
+ * @returns The appropriate {@link ReferrerDetail} (ranked or unranked)
637
+ */
638
+ declare const getReferrerDetail: (referrer: Address, leaderboard: ReferrerLeaderboard) => ReferrerDetail;
639
+
640
+ export { type AccountId, type AggregatedReferrerMetrics, type AwardedReferrerMetrics, type ChainId, type Duration, ENCODED_REFERRER_BYTE_LENGTH, ENCODED_REFERRER_BYTE_OFFSET, ENS_HOLIDAY_AWARDS_END_DATE, ENS_HOLIDAY_AWARDS_MAX_QUALIFIED_REFERRERS, ENS_HOLIDAY_AWARDS_START_DATE, ENS_HOLIDAY_AWARDS_TOTAL_AWARD_POOL_VALUE, EXPECTED_ENCODED_REFERRER_PADDING, type EncodedReferrer, REFERRERS_PER_LEADERBOARD_PAGE_DEFAULT, REFERRERS_PER_LEADERBOARD_PAGE_MAX, type RankedReferrerMetrics, type ReferralProgramRules, type ReferrerDetail, type ReferrerDetailRanked, type ReferrerDetailTypeId, ReferrerDetailTypeIds, type ReferrerDetailUnranked, type ReferrerLeaderboard, type ReferrerLeaderboardPage, type ReferrerLeaderboardPageContext, type ReferrerLeaderboardPageParams, type ReferrerMetrics, type ReferrerMetricsForComparison, type ReferrerRank, type ReferrerScore, SECONDS_PER_YEAR, type ScoredReferrerMetrics, type USDQuantity, type UnixTimestamp, type UnrankedReferrerMetrics, ZERO_ENCODED_REFERRER, buildAggregatedReferrerMetrics, buildAwardedReferrerMetrics, buildEncodedReferrer, buildEnsReferralUrl, buildRankedReferrerMetrics, buildReferralProgramRules, buildReferrerLeaderboard, buildReferrerLeaderboardPageContext, buildReferrerLeaderboardPageParams, buildReferrerMetrics, buildScoredReferrerMetrics, buildUnrankedReferrerMetrics, calcReferrerAwardPoolShare, calcReferrerFinalScore, calcReferrerFinalScoreBoost, calcReferrerFinalScoreMultiplier, calcReferrerScore, compareReferrerMetrics, decodeEncodedReferrer, getReferrerDetail, getReferrerLeaderboardPage, isFiniteNonNegativeNumber, isInteger, isNonNegativeInteger, isPositiveInteger, isReferrerQualified, isValidDuration, isValidReferrerScore, isValidUSDQuantity, normalizeAddress, sortReferrerMetrics, validateAggregatedReferrerMetrics, validateAwardedReferrerMetrics, validateDuration, validateLowercaseAddress, validateNonNegativeInteger, validateRankedReferrerMetrics, validateReferralProgramRules, validateReferrerLeaderboardPageContext, validateReferrerMetrics, validateReferrerRank, validateReferrerScore, validateScoredReferrerMetrics, validateUSDQuantity, validateUnixTimestamp, validateUnrankedReferrerMetrics };
package/dist/index.js CHANGED
@@ -282,6 +282,65 @@ var buildAwardedReferrerMetrics = (referrer, aggregatedMetrics, rules) => {
282
282
  validateAwardedReferrerMetrics(result, rules);
283
283
  return result;
284
284
  };
285
+ var validateUnrankedReferrerMetrics = (metrics) => {
286
+ validateScoredReferrerMetrics(metrics);
287
+ if (metrics.rank !== null) {
288
+ throw new Error(`Invalid UnrankedReferrerMetrics: rank must be null, got: ${metrics.rank}.`);
289
+ }
290
+ if (metrics.isQualified !== false) {
291
+ throw new Error(
292
+ `Invalid UnrankedReferrerMetrics: isQualified must be false, got: ${metrics.isQualified}.`
293
+ );
294
+ }
295
+ if (metrics.totalReferrals !== 0) {
296
+ throw new Error(
297
+ `Invalid UnrankedReferrerMetrics: totalReferrals must be 0, got: ${metrics.totalReferrals}.`
298
+ );
299
+ }
300
+ if (metrics.totalIncrementalDuration !== 0) {
301
+ throw new Error(
302
+ `Invalid UnrankedReferrerMetrics: totalIncrementalDuration must be 0, got: ${metrics.totalIncrementalDuration}.`
303
+ );
304
+ }
305
+ if (metrics.score !== 0) {
306
+ throw new Error(`Invalid UnrankedReferrerMetrics: score must be 0, got: ${metrics.score}.`);
307
+ }
308
+ if (metrics.finalScoreBoost !== 0) {
309
+ throw new Error(
310
+ `Invalid UnrankedReferrerMetrics: finalScoreBoost must be 0, got: ${metrics.finalScoreBoost}.`
311
+ );
312
+ }
313
+ if (metrics.finalScore !== 0) {
314
+ throw new Error(
315
+ `Invalid UnrankedReferrerMetrics: finalScore must be 0, got: ${metrics.finalScore}.`
316
+ );
317
+ }
318
+ if (metrics.awardPoolShare !== 0) {
319
+ throw new Error(
320
+ `Invalid UnrankedReferrerMetrics: awardPoolShare must be 0, got: ${metrics.awardPoolShare}.`
321
+ );
322
+ }
323
+ if (metrics.awardPoolApproxValue !== 0) {
324
+ throw new Error(
325
+ `Invalid UnrankedReferrerMetrics: awardPoolApproxValue must be 0, got: ${metrics.awardPoolApproxValue}.`
326
+ );
327
+ }
328
+ };
329
+ var buildUnrankedReferrerMetrics = (referrer) => {
330
+ const baseMetrics = buildReferrerMetrics(referrer, 0, 0);
331
+ const scoredMetrics = buildScoredReferrerMetrics(baseMetrics);
332
+ const result = {
333
+ ...scoredMetrics,
334
+ rank: null,
335
+ isQualified: false,
336
+ finalScoreBoost: 0,
337
+ finalScore: 0,
338
+ awardPoolShare: 0,
339
+ awardPoolApproxValue: 0
340
+ };
341
+ validateUnrankedReferrerMetrics(result);
342
+ return result;
343
+ };
285
344
 
286
345
  // src/leaderboard.ts
287
346
  var buildReferrerLeaderboard = (allReferrers, rules, accurateAsOf) => {
@@ -321,66 +380,66 @@ var buildReferrerLeaderboard = (allReferrers, rules, accurateAsOf) => {
321
380
  // src/leaderboard-page.ts
322
381
  var REFERRERS_PER_LEADERBOARD_PAGE_DEFAULT = 25;
323
382
  var REFERRERS_PER_LEADERBOARD_PAGE_MAX = 100;
324
- var validateReferrerLeaderboardPaginationParams = (params) => {
383
+ var validateReferrerLeaderboardPageParams = (params) => {
325
384
  if (params.page !== void 0 && !isPositiveInteger(params.page)) {
326
385
  throw new Error(
327
- `Invalid ReferrerLeaderboardPaginationParams: ${params.page}. page must be a positive integer.`
386
+ `Invalid ReferrerLeaderboardPageParams: ${params.page}. page must be a positive integer.`
328
387
  );
329
388
  }
330
389
  if (params.itemsPerPage !== void 0 && !isPositiveInteger(params.itemsPerPage)) {
331
390
  throw new Error(
332
- `Invalid ReferrerLeaderboardPaginationParams: ${params.itemsPerPage}. itemsPerPage must be a positive integer.`
391
+ `Invalid ReferrerLeaderboardPageParams: ${params.itemsPerPage}. itemsPerPage must be a positive integer.`
333
392
  );
334
393
  }
335
394
  if (params.itemsPerPage !== void 0 && params.itemsPerPage > REFERRERS_PER_LEADERBOARD_PAGE_MAX) {
336
395
  throw new Error(
337
- `Invalid ReferrerLeaderboardPaginationParams: ${params.itemsPerPage}. itemsPerPage must be less than or equal to ${REFERRERS_PER_LEADERBOARD_PAGE_MAX}.`
396
+ `Invalid ReferrerLeaderboardPageParams: ${params.itemsPerPage}. itemsPerPage must be less than or equal to ${REFERRERS_PER_LEADERBOARD_PAGE_MAX}.`
338
397
  );
339
398
  }
340
399
  };
341
- var buildReferrerLeaderboardPaginationParams = (params) => {
400
+ var buildReferrerLeaderboardPageParams = (params) => {
342
401
  const result = {
343
402
  page: params.page ?? 1,
344
403
  itemsPerPage: params.itemsPerPage ?? REFERRERS_PER_LEADERBOARD_PAGE_DEFAULT
345
404
  };
346
- validateReferrerLeaderboardPaginationParams(result);
405
+ validateReferrerLeaderboardPageParams(result);
347
406
  return result;
348
407
  };
349
- var validateReferrerLeaderboardPaginationContext = (context) => {
350
- validateReferrerLeaderboardPaginationParams(context);
408
+ var validateReferrerLeaderboardPageContext = (context) => {
409
+ validateReferrerLeaderboardPageParams(context);
351
410
  if (!isNonNegativeInteger(context.totalRecords)) {
352
411
  throw new Error(
353
- `Invalid ReferrerLeaderboardPaginationContext: total must be a non-negative integer but is ${context.totalRecords}.`
412
+ `Invalid ReferrerLeaderboardPageContext: total must be a non-negative integer but is ${context.totalRecords}.`
354
413
  );
355
414
  }
356
415
  const startIndex = (context.page - 1) * context.itemsPerPage;
357
416
  const endIndex = startIndex + context.itemsPerPage;
358
417
  if (!context.hasNext && endIndex < context.totalRecords) {
359
418
  throw new Error(
360
- `Invalid ReferrerLeaderboardPaginationContext: if hasNext is false, endIndex (${endIndex}) must be greater than or equal to total (${context.totalRecords}).`
419
+ `Invalid ReferrerLeaderboardPageContext: if hasNext is false, endIndex (${endIndex}) must be greater than or equal to total (${context.totalRecords}).`
361
420
  );
362
421
  } else if (context.hasNext && context.page * context.itemsPerPage >= context.totalRecords) {
363
422
  throw new Error(
364
- `Invalid ReferrerLeaderboardPaginationContext: if hasNext is true, endIndex (${endIndex}) must be less than total (${context.totalRecords}).`
423
+ `Invalid ReferrerLeaderboardPageContext: if hasNext is true, endIndex (${endIndex}) must be less than total (${context.totalRecords}).`
365
424
  );
366
425
  }
367
426
  if (!context.hasPrev && context.page !== 1) {
368
427
  throw new Error(
369
- `Invalid ReferrerLeaderboardPaginationContext: if hasPrev is false, page must be the first page (1) but is ${context.page}.`
428
+ `Invalid ReferrerLeaderboardPageContext: if hasPrev is false, page must be the first page (1) but is ${context.page}.`
370
429
  );
371
430
  } else if (context.hasPrev && context.page === 1) {
372
431
  throw new Error(
373
- `Invalid ReferrerLeaderboardPaginationContext: if hasPrev is true, page must not be the first page (1) but is ${context.page}.`
432
+ `Invalid ReferrerLeaderboardPageContext: if hasPrev is true, page must not be the first page (1) but is ${context.page}.`
374
433
  );
375
434
  }
376
435
  };
377
- var buildReferrerLeaderboardPaginationContext = (optionalParams, leaderboard) => {
378
- const materializedParams = buildReferrerLeaderboardPaginationParams(optionalParams);
436
+ var buildReferrerLeaderboardPageContext = (optionalParams, leaderboard) => {
437
+ const materializedParams = buildReferrerLeaderboardPageParams(optionalParams);
379
438
  const totalRecords = leaderboard.referrers.size;
380
439
  const totalPages = Math.max(1, Math.ceil(totalRecords / materializedParams.itemsPerPage));
381
440
  if (materializedParams.page > totalPages) {
382
441
  throw new Error(
383
- `Invalid ReferrerLeaderboardPaginationContext: page ${materializedParams.page} exceeds total pages ${totalPages}.`
442
+ `Invalid ReferrerLeaderboardPageContext: page ${materializedParams.page} exceeds total pages ${totalPages}.`
384
443
  );
385
444
  }
386
445
  if (totalRecords === 0) {
@@ -397,7 +456,7 @@ var buildReferrerLeaderboardPaginationContext = (optionalParams, leaderboard) =>
397
456
  const startIndex = (materializedParams.page - 1) * materializedParams.itemsPerPage;
398
457
  const maxTheoreticalIndexOnPage = startIndex + (materializedParams.itemsPerPage - 1);
399
458
  const endIndex = Math.min(maxTheoreticalIndexOnPage, totalRecords - 1);
400
- const hasNext = maxTheoreticalIndexOnPage < totalRecords;
459
+ const hasNext = maxTheoreticalIndexOnPage < totalRecords - 1;
401
460
  const hasPrev = materializedParams.page > 1;
402
461
  const result = {
403
462
  ...materializedParams,
@@ -408,14 +467,11 @@ var buildReferrerLeaderboardPaginationContext = (optionalParams, leaderboard) =>
408
467
  startIndex,
409
468
  endIndex
410
469
  };
411
- validateReferrerLeaderboardPaginationContext(result);
470
+ validateReferrerLeaderboardPageContext(result);
412
471
  return result;
413
472
  };
414
473
  var getReferrerLeaderboardPage = (paginationParams, leaderboard) => {
415
- const paginationContext = buildReferrerLeaderboardPaginationContext(
416
- paginationParams,
417
- leaderboard
418
- );
474
+ const paginationContext = buildReferrerLeaderboardPageContext(paginationParams, leaderboard);
419
475
  let referrers;
420
476
  if (paginationContext.totalRecords > 0 && typeof paginationContext.startIndex !== "undefined" && typeof paginationContext.endIndex !== "undefined") {
421
477
  referrers = Array.from(leaderboard.referrers.values()).slice(
@@ -443,6 +499,37 @@ function buildEnsReferralUrl(address) {
443
499
  return ensAppUrl;
444
500
  }
445
501
 
502
+ // src/referrer-detail.ts
503
+ var ReferrerDetailTypeIds = {
504
+ /**
505
+ * Represents a referrer who is ranked on the leaderboard.
506
+ */
507
+ Ranked: "ranked",
508
+ /**
509
+ * Represents a referrer who is not ranked on the leaderboard.
510
+ */
511
+ Unranked: "unranked"
512
+ };
513
+ var getReferrerDetail = (referrer, leaderboard) => {
514
+ const awardedReferrerMetrics = leaderboard.referrers.get(referrer);
515
+ if (awardedReferrerMetrics) {
516
+ return {
517
+ type: ReferrerDetailTypeIds.Ranked,
518
+ rules: leaderboard.rules,
519
+ referrer: awardedReferrerMetrics,
520
+ aggregatedMetrics: leaderboard.aggregatedMetrics,
521
+ accurateAsOf: leaderboard.accurateAsOf
522
+ };
523
+ }
524
+ return {
525
+ type: ReferrerDetailTypeIds.Unranked,
526
+ rules: leaderboard.rules,
527
+ referrer: buildUnrankedReferrerMetrics(referrer),
528
+ aggregatedMetrics: leaderboard.aggregatedMetrics,
529
+ accurateAsOf: leaderboard.accurateAsOf
530
+ };
531
+ };
532
+
446
533
  // src/rules.ts
447
534
  var ENS_HOLIDAY_AWARDS_START_DATE = 1764547200;
448
535
  var ENS_HOLIDAY_AWARDS_END_DATE = 1767225599;
@@ -480,6 +567,7 @@ export {
480
567
  EXPECTED_ENCODED_REFERRER_PADDING,
481
568
  REFERRERS_PER_LEADERBOARD_PAGE_DEFAULT,
482
569
  REFERRERS_PER_LEADERBOARD_PAGE_MAX,
570
+ ReferrerDetailTypeIds,
483
571
  SECONDS_PER_YEAR,
484
572
  ZERO_ENCODED_REFERRER,
485
573
  buildAggregatedReferrerMetrics,
@@ -489,10 +577,11 @@ export {
489
577
  buildRankedReferrerMetrics,
490
578
  buildReferralProgramRules,
491
579
  buildReferrerLeaderboard,
492
- buildReferrerLeaderboardPaginationContext,
493
- buildReferrerLeaderboardPaginationParams,
580
+ buildReferrerLeaderboardPageContext,
581
+ buildReferrerLeaderboardPageParams,
494
582
  buildReferrerMetrics,
495
583
  buildScoredReferrerMetrics,
584
+ buildUnrankedReferrerMetrics,
496
585
  calcReferrerAwardPoolShare,
497
586
  calcReferrerFinalScore,
498
587
  calcReferrerFinalScoreBoost,
@@ -500,6 +589,7 @@ export {
500
589
  calcReferrerScore,
501
590
  compareReferrerMetrics,
502
591
  decodeEncodedReferrer,
592
+ getReferrerDetail,
503
593
  getReferrerLeaderboardPage,
504
594
  isFiniteNonNegativeNumber,
505
595
  isInteger,
@@ -518,12 +608,13 @@ export {
518
608
  validateNonNegativeInteger,
519
609
  validateRankedReferrerMetrics,
520
610
  validateReferralProgramRules,
521
- validateReferrerLeaderboardPaginationContext,
611
+ validateReferrerLeaderboardPageContext,
522
612
  validateReferrerMetrics,
523
613
  validateReferrerRank,
524
614
  validateReferrerScore,
525
615
  validateScoredReferrerMetrics,
526
616
  validateUSDQuantity,
527
- validateUnixTimestamp
617
+ validateUnixTimestamp,
618
+ validateUnrankedReferrerMetrics
528
619
  };
529
620
  //# sourceMappingURL=index.js.map