@namehash/ens-referrals 1.2.0 → 1.4.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.cjs +69 -20
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +87 -8
- package/dist/index.d.ts +87 -8
- package/dist/index.js +69 -20
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.d.cts
CHANGED
|
@@ -180,6 +180,33 @@ interface ReferrerMetricsForComparison {
|
|
|
180
180
|
}
|
|
181
181
|
declare const compareReferrerMetrics: (a: ReferrerMetricsForComparison, b: ReferrerMetricsForComparison) => number;
|
|
182
182
|
|
|
183
|
+
/**
|
|
184
|
+
* Revenue Contribution
|
|
185
|
+
*
|
|
186
|
+
* Represents the total revenue contribution (in Wei) made to the ENS DAO.
|
|
187
|
+
*
|
|
188
|
+
* This is the sum of the total cost paid by registrants for registrar actions.
|
|
189
|
+
* From the perspective of the ENS DAO, this represents revenue received.
|
|
190
|
+
*
|
|
191
|
+
* @invariant Guaranteed to be a non-negative bigint value (>= 0n)
|
|
192
|
+
* @invariant Never null (records with null `total` in the database are treated as 0 when summing)
|
|
193
|
+
*/
|
|
194
|
+
type RevenueContribution = bigint;
|
|
195
|
+
/**
|
|
196
|
+
* Check if a value is a valid revenue contribution.
|
|
197
|
+
*
|
|
198
|
+
* @param value - The value to check
|
|
199
|
+
* @returns true if the value is a non-negative bigint, false otherwise
|
|
200
|
+
*/
|
|
201
|
+
declare function isValidRevenueContribution(value: unknown): value is RevenueContribution;
|
|
202
|
+
/**
|
|
203
|
+
* Validate that a value is a valid revenue contribution.
|
|
204
|
+
*
|
|
205
|
+
* @param value - The value to validate
|
|
206
|
+
* @throws {Error} If the value is not a valid revenue contribution
|
|
207
|
+
*/
|
|
208
|
+
declare function validateRevenueContribution(value: unknown): void;
|
|
209
|
+
|
|
183
210
|
/**
|
|
184
211
|
* Represents metrics for a single referrer independent of other referrers.
|
|
185
212
|
*/
|
|
@@ -200,8 +227,19 @@ interface ReferrerMetrics {
|
|
|
200
227
|
* the {@link ReferralProgramRules}.
|
|
201
228
|
*/
|
|
202
229
|
totalIncrementalDuration: Duration;
|
|
230
|
+
/**
|
|
231
|
+
* The total revenue contribution (in Wei) made to the ENS DAO by all referrals
|
|
232
|
+
* from this referrer.
|
|
233
|
+
*
|
|
234
|
+
* This is the sum of the total cost paid by registrants for all registrar actions
|
|
235
|
+
* where this address was the referrer.
|
|
236
|
+
*
|
|
237
|
+
* @invariant Guaranteed to be a non-negative bigint value (>= 0n)
|
|
238
|
+
* @invariant Never null (records with null `total` in the database are treated as 0 when summing)
|
|
239
|
+
*/
|
|
240
|
+
totalRevenueContribution: RevenueContribution;
|
|
203
241
|
}
|
|
204
|
-
declare const buildReferrerMetrics: (referrer: Address, totalReferrals: number, totalIncrementalDuration: Duration) => ReferrerMetrics;
|
|
242
|
+
declare const buildReferrerMetrics: (referrer: Address, totalReferrals: number, totalIncrementalDuration: Duration, totalRevenueContribution: RevenueContribution) => ReferrerMetrics;
|
|
205
243
|
declare const validateReferrerMetrics: (metrics: ReferrerMetrics) => void;
|
|
206
244
|
declare const sortReferrerMetrics: (referrers: ReferrerMetrics[]) => ReferrerMetrics[];
|
|
207
245
|
/**
|
|
@@ -318,6 +356,15 @@ interface AggregatedReferrerMetrics {
|
|
|
318
356
|
* @invariant The sum of `totalIncrementalDuration` across all `RankedReferrerMetrics` in the list.
|
|
319
357
|
*/
|
|
320
358
|
grandTotalIncrementalDuration: Duration;
|
|
359
|
+
/**
|
|
360
|
+
* The total revenue contribution (in Wei) to the ENS DAO from all referrals
|
|
361
|
+
* across all referrers on the leaderboard.
|
|
362
|
+
*
|
|
363
|
+
* This is the sum of `totalRevenueContribution` across all `RankedReferrerMetrics` in the list.
|
|
364
|
+
*
|
|
365
|
+
* @invariant Guaranteed to be a non-negative bigint value (>= 0n)
|
|
366
|
+
*/
|
|
367
|
+
grandTotalRevenueContribution: RevenueContribution;
|
|
321
368
|
/**
|
|
322
369
|
* @invariant The sum of `finalScore` across all `RankedReferrerMetrics` where `isQualified` is `true`.
|
|
323
370
|
*/
|
|
@@ -441,7 +488,7 @@ interface ReferrerLeaderboardPageParams {
|
|
|
441
488
|
* @invariant Must be a positive integer (>= 1) and less than or equal to {@link REFERRERS_PER_LEADERBOARD_PAGE_MAX}
|
|
442
489
|
* @default {@link REFERRERS_PER_LEADERBOARD_PAGE_DEFAULT}
|
|
443
490
|
*/
|
|
444
|
-
|
|
491
|
+
recordsPerPage?: number;
|
|
445
492
|
}
|
|
446
493
|
declare const buildReferrerLeaderboardPageParams: (params: ReferrerLeaderboardPageParams) => Required<ReferrerLeaderboardPageParams>;
|
|
447
494
|
interface ReferrerLeaderboardPageContext extends Required<ReferrerLeaderboardPageParams> {
|
|
@@ -457,7 +504,7 @@ interface ReferrerLeaderboardPageContext extends Required<ReferrerLeaderboardPag
|
|
|
457
504
|
totalPages: number;
|
|
458
505
|
/**
|
|
459
506
|
* Indicates if there is a next page available
|
|
460
|
-
* @invariant true if and only if (`page` * `
|
|
507
|
+
* @invariant true if and only if (`page` * `recordsPerPage` < `total`)
|
|
461
508
|
*/
|
|
462
509
|
hasNext: boolean;
|
|
463
510
|
/**
|
|
@@ -498,9 +545,9 @@ interface ReferrerLeaderboardPage {
|
|
|
498
545
|
rules: ReferralProgramRules;
|
|
499
546
|
/**
|
|
500
547
|
* Ordered list of {@link AwardedReferrerMetrics} for the {@link ReferrerLeaderboardPage}
|
|
501
|
-
* described by `
|
|
548
|
+
* described by `pageContext` within the related {@link ReferrerLeaderboard}.
|
|
502
549
|
*
|
|
503
|
-
* @invariant Array will be empty if `
|
|
550
|
+
* @invariant Array will be empty if `pageContext.totalRecords` is 0.
|
|
504
551
|
* @invariant Array entries are ordered by `rank` (descending).
|
|
505
552
|
*/
|
|
506
553
|
referrers: AwardedReferrerMetrics[];
|
|
@@ -512,13 +559,13 @@ interface ReferrerLeaderboardPage {
|
|
|
512
559
|
* The {@link ReferrerLeaderboardPageContext} of this {@link ReferrerLeaderboardPage} relative to the overall
|
|
513
560
|
* {@link ReferrerLeaderboard}.
|
|
514
561
|
*/
|
|
515
|
-
|
|
562
|
+
pageContext: ReferrerLeaderboardPageContext;
|
|
516
563
|
/**
|
|
517
564
|
* The {@link UnixTimestamp} of when the data used to build the {@link ReferrerLeaderboardPage} was accurate as of.
|
|
518
565
|
*/
|
|
519
566
|
accurateAsOf: UnixTimestamp;
|
|
520
567
|
}
|
|
521
|
-
declare const getReferrerLeaderboardPage: (
|
|
568
|
+
declare const getReferrerLeaderboardPage: (pageParams: ReferrerLeaderboardPageParams, leaderboard: ReferrerLeaderboard) => ReferrerLeaderboardPage;
|
|
522
569
|
|
|
523
570
|
/**
|
|
524
571
|
* Build a URL to the official ENS manager app
|
|
@@ -637,4 +684,36 @@ type ReferrerDetail = ReferrerDetailRanked | ReferrerDetailUnranked;
|
|
|
637
684
|
*/
|
|
638
685
|
declare const getReferrerDetail: (referrer: Address, leaderboard: ReferrerLeaderboard) => ReferrerDetail;
|
|
639
686
|
|
|
640
|
-
|
|
687
|
+
/**
|
|
688
|
+
* The type of referral program's status.
|
|
689
|
+
*/
|
|
690
|
+
declare const ReferralProgramStatuses: {
|
|
691
|
+
/**
|
|
692
|
+
* Represents a referral program that has been announced, but hasn't started yet.
|
|
693
|
+
*/
|
|
694
|
+
readonly Scheduled: "Scheduled";
|
|
695
|
+
/**
|
|
696
|
+
* Represents a currently ongoing referral program.
|
|
697
|
+
*/
|
|
698
|
+
readonly Active: "Active";
|
|
699
|
+
/**
|
|
700
|
+
* Represents a referral program that has already ended.
|
|
701
|
+
*/
|
|
702
|
+
readonly Closed: "Closed";
|
|
703
|
+
};
|
|
704
|
+
/**
|
|
705
|
+
* The derived string union of possible {@link ReferralProgramStatuses}.
|
|
706
|
+
*/
|
|
707
|
+
type ReferralProgramStatusId = (typeof ReferralProgramStatuses)[keyof typeof ReferralProgramStatuses];
|
|
708
|
+
/**
|
|
709
|
+
* Calculate the status of the referral program based on the current date
|
|
710
|
+
* and program's timeframe available in its rules.
|
|
711
|
+
*
|
|
712
|
+
* @param referralProgramRules - Related referral program's rules containing
|
|
713
|
+
* program's start date and end date.
|
|
714
|
+
*
|
|
715
|
+
* @param now - Current date in {@link UnixTimestamp} format.
|
|
716
|
+
*/
|
|
717
|
+
declare const calcReferralProgramStatus: (referralProgramRules: ReferralProgramRules, now: UnixTimestamp) => ReferralProgramStatusId;
|
|
718
|
+
|
|
719
|
+
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 ReferralProgramStatusId, ReferralProgramStatuses, 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, type RevenueContribution, 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, calcReferralProgramStatus, calcReferrerAwardPoolShare, calcReferrerFinalScore, calcReferrerFinalScoreBoost, calcReferrerFinalScoreMultiplier, calcReferrerScore, compareReferrerMetrics, decodeEncodedReferrer, getReferrerDetail, getReferrerLeaderboardPage, isFiniteNonNegativeNumber, isInteger, isNonNegativeInteger, isPositiveInteger, isReferrerQualified, isValidDuration, isValidReferrerScore, isValidRevenueContribution, isValidUSDQuantity, normalizeAddress, sortReferrerMetrics, validateAggregatedReferrerMetrics, validateAwardedReferrerMetrics, validateDuration, validateLowercaseAddress, validateNonNegativeInteger, validateRankedReferrerMetrics, validateReferralProgramRules, validateReferrerLeaderboardPageContext, validateReferrerMetrics, validateReferrerRank, validateReferrerScore, validateRevenueContribution, validateScoredReferrerMetrics, validateUSDQuantity, validateUnixTimestamp, validateUnrankedReferrerMetrics };
|
package/dist/index.d.ts
CHANGED
|
@@ -180,6 +180,33 @@ interface ReferrerMetricsForComparison {
|
|
|
180
180
|
}
|
|
181
181
|
declare const compareReferrerMetrics: (a: ReferrerMetricsForComparison, b: ReferrerMetricsForComparison) => number;
|
|
182
182
|
|
|
183
|
+
/**
|
|
184
|
+
* Revenue Contribution
|
|
185
|
+
*
|
|
186
|
+
* Represents the total revenue contribution (in Wei) made to the ENS DAO.
|
|
187
|
+
*
|
|
188
|
+
* This is the sum of the total cost paid by registrants for registrar actions.
|
|
189
|
+
* From the perspective of the ENS DAO, this represents revenue received.
|
|
190
|
+
*
|
|
191
|
+
* @invariant Guaranteed to be a non-negative bigint value (>= 0n)
|
|
192
|
+
* @invariant Never null (records with null `total` in the database are treated as 0 when summing)
|
|
193
|
+
*/
|
|
194
|
+
type RevenueContribution = bigint;
|
|
195
|
+
/**
|
|
196
|
+
* Check if a value is a valid revenue contribution.
|
|
197
|
+
*
|
|
198
|
+
* @param value - The value to check
|
|
199
|
+
* @returns true if the value is a non-negative bigint, false otherwise
|
|
200
|
+
*/
|
|
201
|
+
declare function isValidRevenueContribution(value: unknown): value is RevenueContribution;
|
|
202
|
+
/**
|
|
203
|
+
* Validate that a value is a valid revenue contribution.
|
|
204
|
+
*
|
|
205
|
+
* @param value - The value to validate
|
|
206
|
+
* @throws {Error} If the value is not a valid revenue contribution
|
|
207
|
+
*/
|
|
208
|
+
declare function validateRevenueContribution(value: unknown): void;
|
|
209
|
+
|
|
183
210
|
/**
|
|
184
211
|
* Represents metrics for a single referrer independent of other referrers.
|
|
185
212
|
*/
|
|
@@ -200,8 +227,19 @@ interface ReferrerMetrics {
|
|
|
200
227
|
* the {@link ReferralProgramRules}.
|
|
201
228
|
*/
|
|
202
229
|
totalIncrementalDuration: Duration;
|
|
230
|
+
/**
|
|
231
|
+
* The total revenue contribution (in Wei) made to the ENS DAO by all referrals
|
|
232
|
+
* from this referrer.
|
|
233
|
+
*
|
|
234
|
+
* This is the sum of the total cost paid by registrants for all registrar actions
|
|
235
|
+
* where this address was the referrer.
|
|
236
|
+
*
|
|
237
|
+
* @invariant Guaranteed to be a non-negative bigint value (>= 0n)
|
|
238
|
+
* @invariant Never null (records with null `total` in the database are treated as 0 when summing)
|
|
239
|
+
*/
|
|
240
|
+
totalRevenueContribution: RevenueContribution;
|
|
203
241
|
}
|
|
204
|
-
declare const buildReferrerMetrics: (referrer: Address, totalReferrals: number, totalIncrementalDuration: Duration) => ReferrerMetrics;
|
|
242
|
+
declare const buildReferrerMetrics: (referrer: Address, totalReferrals: number, totalIncrementalDuration: Duration, totalRevenueContribution: RevenueContribution) => ReferrerMetrics;
|
|
205
243
|
declare const validateReferrerMetrics: (metrics: ReferrerMetrics) => void;
|
|
206
244
|
declare const sortReferrerMetrics: (referrers: ReferrerMetrics[]) => ReferrerMetrics[];
|
|
207
245
|
/**
|
|
@@ -318,6 +356,15 @@ interface AggregatedReferrerMetrics {
|
|
|
318
356
|
* @invariant The sum of `totalIncrementalDuration` across all `RankedReferrerMetrics` in the list.
|
|
319
357
|
*/
|
|
320
358
|
grandTotalIncrementalDuration: Duration;
|
|
359
|
+
/**
|
|
360
|
+
* The total revenue contribution (in Wei) to the ENS DAO from all referrals
|
|
361
|
+
* across all referrers on the leaderboard.
|
|
362
|
+
*
|
|
363
|
+
* This is the sum of `totalRevenueContribution` across all `RankedReferrerMetrics` in the list.
|
|
364
|
+
*
|
|
365
|
+
* @invariant Guaranteed to be a non-negative bigint value (>= 0n)
|
|
366
|
+
*/
|
|
367
|
+
grandTotalRevenueContribution: RevenueContribution;
|
|
321
368
|
/**
|
|
322
369
|
* @invariant The sum of `finalScore` across all `RankedReferrerMetrics` where `isQualified` is `true`.
|
|
323
370
|
*/
|
|
@@ -441,7 +488,7 @@ interface ReferrerLeaderboardPageParams {
|
|
|
441
488
|
* @invariant Must be a positive integer (>= 1) and less than or equal to {@link REFERRERS_PER_LEADERBOARD_PAGE_MAX}
|
|
442
489
|
* @default {@link REFERRERS_PER_LEADERBOARD_PAGE_DEFAULT}
|
|
443
490
|
*/
|
|
444
|
-
|
|
491
|
+
recordsPerPage?: number;
|
|
445
492
|
}
|
|
446
493
|
declare const buildReferrerLeaderboardPageParams: (params: ReferrerLeaderboardPageParams) => Required<ReferrerLeaderboardPageParams>;
|
|
447
494
|
interface ReferrerLeaderboardPageContext extends Required<ReferrerLeaderboardPageParams> {
|
|
@@ -457,7 +504,7 @@ interface ReferrerLeaderboardPageContext extends Required<ReferrerLeaderboardPag
|
|
|
457
504
|
totalPages: number;
|
|
458
505
|
/**
|
|
459
506
|
* Indicates if there is a next page available
|
|
460
|
-
* @invariant true if and only if (`page` * `
|
|
507
|
+
* @invariant true if and only if (`page` * `recordsPerPage` < `total`)
|
|
461
508
|
*/
|
|
462
509
|
hasNext: boolean;
|
|
463
510
|
/**
|
|
@@ -498,9 +545,9 @@ interface ReferrerLeaderboardPage {
|
|
|
498
545
|
rules: ReferralProgramRules;
|
|
499
546
|
/**
|
|
500
547
|
* Ordered list of {@link AwardedReferrerMetrics} for the {@link ReferrerLeaderboardPage}
|
|
501
|
-
* described by `
|
|
548
|
+
* described by `pageContext` within the related {@link ReferrerLeaderboard}.
|
|
502
549
|
*
|
|
503
|
-
* @invariant Array will be empty if `
|
|
550
|
+
* @invariant Array will be empty if `pageContext.totalRecords` is 0.
|
|
504
551
|
* @invariant Array entries are ordered by `rank` (descending).
|
|
505
552
|
*/
|
|
506
553
|
referrers: AwardedReferrerMetrics[];
|
|
@@ -512,13 +559,13 @@ interface ReferrerLeaderboardPage {
|
|
|
512
559
|
* The {@link ReferrerLeaderboardPageContext} of this {@link ReferrerLeaderboardPage} relative to the overall
|
|
513
560
|
* {@link ReferrerLeaderboard}.
|
|
514
561
|
*/
|
|
515
|
-
|
|
562
|
+
pageContext: ReferrerLeaderboardPageContext;
|
|
516
563
|
/**
|
|
517
564
|
* The {@link UnixTimestamp} of when the data used to build the {@link ReferrerLeaderboardPage} was accurate as of.
|
|
518
565
|
*/
|
|
519
566
|
accurateAsOf: UnixTimestamp;
|
|
520
567
|
}
|
|
521
|
-
declare const getReferrerLeaderboardPage: (
|
|
568
|
+
declare const getReferrerLeaderboardPage: (pageParams: ReferrerLeaderboardPageParams, leaderboard: ReferrerLeaderboard) => ReferrerLeaderboardPage;
|
|
522
569
|
|
|
523
570
|
/**
|
|
524
571
|
* Build a URL to the official ENS manager app
|
|
@@ -637,4 +684,36 @@ type ReferrerDetail = ReferrerDetailRanked | ReferrerDetailUnranked;
|
|
|
637
684
|
*/
|
|
638
685
|
declare const getReferrerDetail: (referrer: Address, leaderboard: ReferrerLeaderboard) => ReferrerDetail;
|
|
639
686
|
|
|
640
|
-
|
|
687
|
+
/**
|
|
688
|
+
* The type of referral program's status.
|
|
689
|
+
*/
|
|
690
|
+
declare const ReferralProgramStatuses: {
|
|
691
|
+
/**
|
|
692
|
+
* Represents a referral program that has been announced, but hasn't started yet.
|
|
693
|
+
*/
|
|
694
|
+
readonly Scheduled: "Scheduled";
|
|
695
|
+
/**
|
|
696
|
+
* Represents a currently ongoing referral program.
|
|
697
|
+
*/
|
|
698
|
+
readonly Active: "Active";
|
|
699
|
+
/**
|
|
700
|
+
* Represents a referral program that has already ended.
|
|
701
|
+
*/
|
|
702
|
+
readonly Closed: "Closed";
|
|
703
|
+
};
|
|
704
|
+
/**
|
|
705
|
+
* The derived string union of possible {@link ReferralProgramStatuses}.
|
|
706
|
+
*/
|
|
707
|
+
type ReferralProgramStatusId = (typeof ReferralProgramStatuses)[keyof typeof ReferralProgramStatuses];
|
|
708
|
+
/**
|
|
709
|
+
* Calculate the status of the referral program based on the current date
|
|
710
|
+
* and program's timeframe available in its rules.
|
|
711
|
+
*
|
|
712
|
+
* @param referralProgramRules - Related referral program's rules containing
|
|
713
|
+
* program's start date and end date.
|
|
714
|
+
*
|
|
715
|
+
* @param now - Current date in {@link UnixTimestamp} format.
|
|
716
|
+
*/
|
|
717
|
+
declare const calcReferralProgramStatus: (referralProgramRules: ReferralProgramRules, now: UnixTimestamp) => ReferralProgramStatusId;
|
|
718
|
+
|
|
719
|
+
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 ReferralProgramStatusId, ReferralProgramStatuses, 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, type RevenueContribution, 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, calcReferralProgramStatus, calcReferrerAwardPoolShare, calcReferrerFinalScore, calcReferrerFinalScoreBoost, calcReferrerFinalScoreMultiplier, calcReferrerScore, compareReferrerMetrics, decodeEncodedReferrer, getReferrerDetail, getReferrerLeaderboardPage, isFiniteNonNegativeNumber, isInteger, isNonNegativeInteger, isPositiveInteger, isReferrerQualified, isValidDuration, isValidReferrerScore, isValidRevenueContribution, isValidUSDQuantity, normalizeAddress, sortReferrerMetrics, validateAggregatedReferrerMetrics, validateAwardedReferrerMetrics, validateDuration, validateLowercaseAddress, validateNonNegativeInteger, validateRankedReferrerMetrics, validateReferralProgramRules, validateReferrerLeaderboardPageContext, validateReferrerMetrics, validateReferrerRank, validateReferrerScore, validateRevenueContribution, validateScoredReferrerMetrics, validateUSDQuantity, validateUnixTimestamp, validateUnrankedReferrerMetrics };
|
package/dist/index.js
CHANGED
|
@@ -31,6 +31,19 @@ var isFiniteNonNegativeNumber = (value) => {
|
|
|
31
31
|
return value >= 0 && Number.isFinite(value);
|
|
32
32
|
};
|
|
33
33
|
|
|
34
|
+
// src/revenue-contribution.ts
|
|
35
|
+
function isValidRevenueContribution(value) {
|
|
36
|
+
return typeof value === "bigint" && value >= 0n;
|
|
37
|
+
}
|
|
38
|
+
function validateRevenueContribution(value) {
|
|
39
|
+
if (typeof value !== "bigint") {
|
|
40
|
+
throw new Error(`Invalid revenue contribution: must be a bigint, got: ${typeof value}`);
|
|
41
|
+
}
|
|
42
|
+
if (value < 0n) {
|
|
43
|
+
throw new Error(`Invalid revenue contribution: must be non-negative, got: ${value.toString()}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
34
47
|
// src/time.ts
|
|
35
48
|
var validateUnixTimestamp = (timestamp) => {
|
|
36
49
|
if (!isInteger(timestamp)) {
|
|
@@ -66,17 +79,20 @@ var calcReferrerScore = (totalIncrementalDuration) => {
|
|
|
66
79
|
var validateAggregatedReferrerMetrics = (metrics) => {
|
|
67
80
|
validateNonNegativeInteger(metrics.grandTotalReferrals);
|
|
68
81
|
validateDuration(metrics.grandTotalIncrementalDuration);
|
|
82
|
+
validateRevenueContribution(metrics.grandTotalRevenueContribution);
|
|
69
83
|
validateReferrerScore(metrics.grandTotalQualifiedReferrersFinalScore);
|
|
70
84
|
validateReferrerScore(metrics.minFinalScoreToQualify);
|
|
71
85
|
};
|
|
72
86
|
var buildAggregatedReferrerMetrics = (referrers, rules) => {
|
|
73
87
|
let grandTotalReferrals = 0;
|
|
74
88
|
let grandTotalIncrementalDuration = 0;
|
|
89
|
+
let grandTotalRevenueContribution = 0n;
|
|
75
90
|
let grandTotalQualifiedReferrersFinalScore = 0;
|
|
76
91
|
let minFinalScoreToQualify = Number.MAX_SAFE_INTEGER;
|
|
77
92
|
for (const referrer of referrers) {
|
|
78
93
|
grandTotalReferrals += referrer.totalReferrals;
|
|
79
94
|
grandTotalIncrementalDuration += referrer.totalIncrementalDuration;
|
|
95
|
+
grandTotalRevenueContribution += referrer.totalRevenueContribution;
|
|
80
96
|
if (referrer.isQualified) {
|
|
81
97
|
grandTotalQualifiedReferrersFinalScore += referrer.finalScore;
|
|
82
98
|
if (referrer.finalScore < minFinalScoreToQualify) {
|
|
@@ -98,6 +114,7 @@ var buildAggregatedReferrerMetrics = (referrers, rules) => {
|
|
|
98
114
|
const result = {
|
|
99
115
|
grandTotalReferrals,
|
|
100
116
|
grandTotalIncrementalDuration,
|
|
117
|
+
grandTotalRevenueContribution,
|
|
101
118
|
grandTotalQualifiedReferrersFinalScore,
|
|
102
119
|
minFinalScoreToQualify
|
|
103
120
|
};
|
|
@@ -178,11 +195,12 @@ var compareReferrerMetrics = (a, b) => {
|
|
|
178
195
|
};
|
|
179
196
|
|
|
180
197
|
// src/referrer-metrics.ts
|
|
181
|
-
var buildReferrerMetrics = (referrer, totalReferrals, totalIncrementalDuration) => {
|
|
198
|
+
var buildReferrerMetrics = (referrer, totalReferrals, totalIncrementalDuration, totalRevenueContribution) => {
|
|
182
199
|
const result = {
|
|
183
200
|
referrer: normalizeAddress(referrer),
|
|
184
201
|
totalReferrals,
|
|
185
|
-
totalIncrementalDuration
|
|
202
|
+
totalIncrementalDuration,
|
|
203
|
+
totalRevenueContribution
|
|
186
204
|
};
|
|
187
205
|
validateReferrerMetrics(result);
|
|
188
206
|
return result;
|
|
@@ -191,6 +209,7 @@ var validateReferrerMetrics = (metrics) => {
|
|
|
191
209
|
validateLowercaseAddress(metrics.referrer);
|
|
192
210
|
validateNonNegativeInteger(metrics.totalReferrals);
|
|
193
211
|
validateDuration(metrics.totalIncrementalDuration);
|
|
212
|
+
validateRevenueContribution(metrics.totalRevenueContribution);
|
|
194
213
|
};
|
|
195
214
|
var sortReferrerMetrics = (referrers) => {
|
|
196
215
|
return [...referrers].sort(compareReferrerMetrics);
|
|
@@ -302,6 +321,11 @@ var validateUnrankedReferrerMetrics = (metrics) => {
|
|
|
302
321
|
`Invalid UnrankedReferrerMetrics: totalIncrementalDuration must be 0, got: ${metrics.totalIncrementalDuration}.`
|
|
303
322
|
);
|
|
304
323
|
}
|
|
324
|
+
if (metrics.totalRevenueContribution !== 0n) {
|
|
325
|
+
throw new Error(
|
|
326
|
+
`Invalid UnrankedReferrerMetrics: totalRevenueContribution must be 0n, got: ${metrics.totalRevenueContribution.toString()}.`
|
|
327
|
+
);
|
|
328
|
+
}
|
|
305
329
|
if (metrics.score !== 0) {
|
|
306
330
|
throw new Error(`Invalid UnrankedReferrerMetrics: score must be 0, got: ${metrics.score}.`);
|
|
307
331
|
}
|
|
@@ -327,7 +351,7 @@ var validateUnrankedReferrerMetrics = (metrics) => {
|
|
|
327
351
|
}
|
|
328
352
|
};
|
|
329
353
|
var buildUnrankedReferrerMetrics = (referrer) => {
|
|
330
|
-
const baseMetrics = buildReferrerMetrics(referrer, 0, 0);
|
|
354
|
+
const baseMetrics = buildReferrerMetrics(referrer, 0, 0, 0n);
|
|
331
355
|
const scoredMetrics = buildScoredReferrerMetrics(baseMetrics);
|
|
332
356
|
const result = {
|
|
333
357
|
...scoredMetrics,
|
|
@@ -386,21 +410,21 @@ var validateReferrerLeaderboardPageParams = (params) => {
|
|
|
386
410
|
`Invalid ReferrerLeaderboardPageParams: ${params.page}. page must be a positive integer.`
|
|
387
411
|
);
|
|
388
412
|
}
|
|
389
|
-
if (params.
|
|
413
|
+
if (params.recordsPerPage !== void 0 && !isPositiveInteger(params.recordsPerPage)) {
|
|
390
414
|
throw new Error(
|
|
391
|
-
`Invalid ReferrerLeaderboardPageParams: ${params.
|
|
415
|
+
`Invalid ReferrerLeaderboardPageParams: ${params.recordsPerPage}. recordsPerPage must be a positive integer.`
|
|
392
416
|
);
|
|
393
417
|
}
|
|
394
|
-
if (params.
|
|
418
|
+
if (params.recordsPerPage !== void 0 && params.recordsPerPage > REFERRERS_PER_LEADERBOARD_PAGE_MAX) {
|
|
395
419
|
throw new Error(
|
|
396
|
-
`Invalid ReferrerLeaderboardPageParams: ${params.
|
|
420
|
+
`Invalid ReferrerLeaderboardPageParams: ${params.recordsPerPage}. recordsPerPage must be less than or equal to ${REFERRERS_PER_LEADERBOARD_PAGE_MAX}.`
|
|
397
421
|
);
|
|
398
422
|
}
|
|
399
423
|
};
|
|
400
424
|
var buildReferrerLeaderboardPageParams = (params) => {
|
|
401
425
|
const result = {
|
|
402
426
|
page: params.page ?? 1,
|
|
403
|
-
|
|
427
|
+
recordsPerPage: params.recordsPerPage ?? REFERRERS_PER_LEADERBOARD_PAGE_DEFAULT
|
|
404
428
|
};
|
|
405
429
|
validateReferrerLeaderboardPageParams(result);
|
|
406
430
|
return result;
|
|
@@ -412,13 +436,13 @@ var validateReferrerLeaderboardPageContext = (context) => {
|
|
|
412
436
|
`Invalid ReferrerLeaderboardPageContext: total must be a non-negative integer but is ${context.totalRecords}.`
|
|
413
437
|
);
|
|
414
438
|
}
|
|
415
|
-
const startIndex = (context.page - 1) * context.
|
|
416
|
-
const endIndex = startIndex + context.
|
|
439
|
+
const startIndex = (context.page - 1) * context.recordsPerPage;
|
|
440
|
+
const endIndex = startIndex + context.recordsPerPage;
|
|
417
441
|
if (!context.hasNext && endIndex < context.totalRecords) {
|
|
418
442
|
throw new Error(
|
|
419
443
|
`Invalid ReferrerLeaderboardPageContext: if hasNext is false, endIndex (${endIndex}) must be greater than or equal to total (${context.totalRecords}).`
|
|
420
444
|
);
|
|
421
|
-
} else if (context.hasNext && context.page * context.
|
|
445
|
+
} else if (context.hasNext && context.page * context.recordsPerPage >= context.totalRecords) {
|
|
422
446
|
throw new Error(
|
|
423
447
|
`Invalid ReferrerLeaderboardPageContext: if hasNext is true, endIndex (${endIndex}) must be less than total (${context.totalRecords}).`
|
|
424
448
|
);
|
|
@@ -436,7 +460,7 @@ var validateReferrerLeaderboardPageContext = (context) => {
|
|
|
436
460
|
var buildReferrerLeaderboardPageContext = (optionalParams, leaderboard) => {
|
|
437
461
|
const materializedParams = buildReferrerLeaderboardPageParams(optionalParams);
|
|
438
462
|
const totalRecords = leaderboard.referrers.size;
|
|
439
|
-
const totalPages = Math.max(1, Math.ceil(totalRecords / materializedParams.
|
|
463
|
+
const totalPages = Math.max(1, Math.ceil(totalRecords / materializedParams.recordsPerPage));
|
|
440
464
|
if (materializedParams.page > totalPages) {
|
|
441
465
|
throw new Error(
|
|
442
466
|
`Invalid ReferrerLeaderboardPageContext: page ${materializedParams.page} exceeds total pages ${totalPages}.`
|
|
@@ -453,8 +477,8 @@ var buildReferrerLeaderboardPageContext = (optionalParams, leaderboard) => {
|
|
|
453
477
|
endIndex: void 0
|
|
454
478
|
};
|
|
455
479
|
}
|
|
456
|
-
const startIndex = (materializedParams.page - 1) * materializedParams.
|
|
457
|
-
const maxTheoreticalIndexOnPage = startIndex + (materializedParams.
|
|
480
|
+
const startIndex = (materializedParams.page - 1) * materializedParams.recordsPerPage;
|
|
481
|
+
const maxTheoreticalIndexOnPage = startIndex + (materializedParams.recordsPerPage - 1);
|
|
458
482
|
const endIndex = Math.min(maxTheoreticalIndexOnPage, totalRecords - 1);
|
|
459
483
|
const hasNext = maxTheoreticalIndexOnPage < totalRecords - 1;
|
|
460
484
|
const hasPrev = materializedParams.page > 1;
|
|
@@ -470,13 +494,13 @@ var buildReferrerLeaderboardPageContext = (optionalParams, leaderboard) => {
|
|
|
470
494
|
validateReferrerLeaderboardPageContext(result);
|
|
471
495
|
return result;
|
|
472
496
|
};
|
|
473
|
-
var getReferrerLeaderboardPage = (
|
|
474
|
-
const
|
|
497
|
+
var getReferrerLeaderboardPage = (pageParams, leaderboard) => {
|
|
498
|
+
const pageContext = buildReferrerLeaderboardPageContext(pageParams, leaderboard);
|
|
475
499
|
let referrers;
|
|
476
|
-
if (
|
|
500
|
+
if (pageContext.totalRecords > 0 && typeof pageContext.startIndex !== "undefined" && typeof pageContext.endIndex !== "undefined") {
|
|
477
501
|
referrers = Array.from(leaderboard.referrers.values()).slice(
|
|
478
|
-
|
|
479
|
-
|
|
502
|
+
pageContext.startIndex,
|
|
503
|
+
pageContext.endIndex + 1
|
|
480
504
|
// For `slice`, this is exclusive of the element at the index 'end'. We need it to be inclusive, hence plus one.
|
|
481
505
|
);
|
|
482
506
|
} else {
|
|
@@ -486,7 +510,7 @@ var getReferrerLeaderboardPage = (paginationParams, leaderboard) => {
|
|
|
486
510
|
rules: leaderboard.rules,
|
|
487
511
|
referrers,
|
|
488
512
|
aggregatedMetrics: leaderboard.aggregatedMetrics,
|
|
489
|
-
|
|
513
|
+
pageContext,
|
|
490
514
|
accurateAsOf: leaderboard.accurateAsOf
|
|
491
515
|
};
|
|
492
516
|
};
|
|
@@ -557,6 +581,27 @@ var buildReferralProgramRules = (totalAwardPoolValue, maxQualifiedReferrers, sta
|
|
|
557
581
|
validateReferralProgramRules(result);
|
|
558
582
|
return result;
|
|
559
583
|
};
|
|
584
|
+
|
|
585
|
+
// src/status.ts
|
|
586
|
+
var ReferralProgramStatuses = {
|
|
587
|
+
/**
|
|
588
|
+
* Represents a referral program that has been announced, but hasn't started yet.
|
|
589
|
+
*/
|
|
590
|
+
Scheduled: "Scheduled",
|
|
591
|
+
/**
|
|
592
|
+
* Represents a currently ongoing referral program.
|
|
593
|
+
*/
|
|
594
|
+
Active: "Active",
|
|
595
|
+
/**
|
|
596
|
+
* Represents a referral program that has already ended.
|
|
597
|
+
*/
|
|
598
|
+
Closed: "Closed"
|
|
599
|
+
};
|
|
600
|
+
var calcReferralProgramStatus = (referralProgramRules, now) => {
|
|
601
|
+
if (now < referralProgramRules.startTime) return ReferralProgramStatuses.Scheduled;
|
|
602
|
+
if (now > referralProgramRules.endTime) return ReferralProgramStatuses.Closed;
|
|
603
|
+
return ReferralProgramStatuses.Active;
|
|
604
|
+
};
|
|
560
605
|
export {
|
|
561
606
|
ENCODED_REFERRER_BYTE_LENGTH,
|
|
562
607
|
ENCODED_REFERRER_BYTE_OFFSET,
|
|
@@ -567,6 +612,7 @@ export {
|
|
|
567
612
|
EXPECTED_ENCODED_REFERRER_PADDING,
|
|
568
613
|
REFERRERS_PER_LEADERBOARD_PAGE_DEFAULT,
|
|
569
614
|
REFERRERS_PER_LEADERBOARD_PAGE_MAX,
|
|
615
|
+
ReferralProgramStatuses,
|
|
570
616
|
ReferrerDetailTypeIds,
|
|
571
617
|
SECONDS_PER_YEAR,
|
|
572
618
|
ZERO_ENCODED_REFERRER,
|
|
@@ -582,6 +628,7 @@ export {
|
|
|
582
628
|
buildReferrerMetrics,
|
|
583
629
|
buildScoredReferrerMetrics,
|
|
584
630
|
buildUnrankedReferrerMetrics,
|
|
631
|
+
calcReferralProgramStatus,
|
|
585
632
|
calcReferrerAwardPoolShare,
|
|
586
633
|
calcReferrerFinalScore,
|
|
587
634
|
calcReferrerFinalScoreBoost,
|
|
@@ -598,6 +645,7 @@ export {
|
|
|
598
645
|
isReferrerQualified,
|
|
599
646
|
isValidDuration,
|
|
600
647
|
isValidReferrerScore,
|
|
648
|
+
isValidRevenueContribution,
|
|
601
649
|
isValidUSDQuantity,
|
|
602
650
|
normalizeAddress,
|
|
603
651
|
sortReferrerMetrics,
|
|
@@ -612,6 +660,7 @@ export {
|
|
|
612
660
|
validateReferrerMetrics,
|
|
613
661
|
validateReferrerRank,
|
|
614
662
|
validateReferrerScore,
|
|
663
|
+
validateRevenueContribution,
|
|
615
664
|
validateScoredReferrerMetrics,
|
|
616
665
|
validateUSDQuantity,
|
|
617
666
|
validateUnixTimestamp,
|