@namehash/ens-referrals 1.8.1 → 1.10.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 CHANGED
@@ -1,7 +1,9 @@
1
1
  "use strict";
2
+ var __create = Object.create;
2
3
  var __defProp = Object.defineProperty;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
5
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
8
  var __export = (target, all) => {
7
9
  for (var name in all)
@@ -15,207 +17,124 @@ var __copyProps = (to, from, except, desc) => {
15
17
  }
16
18
  return to;
17
19
  };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
18
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
29
 
20
30
  // src/index.ts
21
31
  var index_exports = {};
22
32
  __export(index_exports, {
33
+ AdminActionTypes: () => AdminActionTypes,
23
34
  DEFAULT_ENSNODE_API_URL: () => DEFAULT_ENSNODE_API_URL,
24
35
  ENSReferralsClient: () => ENSReferralsClient,
25
- ENS_HOLIDAY_AWARDS_END_DATE: () => ENS_HOLIDAY_AWARDS_END_DATE,
26
- ENS_HOLIDAY_AWARDS_MAX_QUALIFIED_REFERRERS: () => ENS_HOLIDAY_AWARDS_MAX_QUALIFIED_REFERRERS,
27
- ENS_HOLIDAY_AWARDS_START_DATE: () => ENS_HOLIDAY_AWARDS_START_DATE,
28
- ENS_HOLIDAY_AWARDS_TOTAL_AWARD_POOL_VALUE: () => ENS_HOLIDAY_AWARDS_TOTAL_AWARD_POOL_VALUE,
36
+ MAX_EDITIONS_PER_REQUEST: () => MAX_EDITIONS_PER_REQUEST,
37
+ REFERRAL_PROGRAM_EDITION_SLUG_PATTERN: () => REFERRAL_PROGRAM_EDITION_SLUG_PATTERN,
29
38
  REFERRERS_PER_LEADERBOARD_PAGE_DEFAULT: () => REFERRERS_PER_LEADERBOARD_PAGE_DEFAULT,
30
39
  REFERRERS_PER_LEADERBOARD_PAGE_MAX: () => REFERRERS_PER_LEADERBOARD_PAGE_MAX,
31
- ReferralProgramStatuses: () => ReferralProgramStatuses,
32
- ReferrerDetailResponseCodes: () => ReferrerDetailResponseCodes,
33
- ReferrerDetailTypeIds: () => ReferrerDetailTypeIds,
40
+ ReferralProgramAwardModels: () => ReferralProgramAwardModels,
41
+ ReferralProgramEditionStatuses: () => ReferralProgramEditionStatuses,
42
+ ReferralProgramEditionSummariesResponseCodes: () => ReferralProgramEditionSummariesResponseCodes,
43
+ ReferrerEditionMetricsTypeIds: () => ReferrerEditionMetricsTypeIds,
34
44
  ReferrerLeaderboardPageResponseCodes: () => ReferrerLeaderboardPageResponseCodes,
45
+ ReferrerMetricsEditionsResponseCodes: () => ReferrerMetricsEditionsResponseCodes,
35
46
  SECONDS_PER_YEAR: () => SECONDS_PER_YEAR,
36
- buildAggregatedReferrerMetrics: () => buildAggregatedReferrerMetrics,
37
- buildAwardedReferrerMetrics: () => buildAwardedReferrerMetrics,
47
+ buildAggregatedReferrerMetricsPieSplit: () => buildAggregatedReferrerMetricsPieSplit,
48
+ buildAggregatedReferrerMetricsRevShareCap: () => buildAggregatedReferrerMetricsRevShareCap,
49
+ buildAwardedReferrerMetricsPieSplit: () => buildAwardedReferrerMetricsPieSplit,
50
+ buildAwardedReferrerMetricsRevShareCap: () => buildAwardedReferrerMetricsRevShareCap,
51
+ buildEditionSummary: () => buildEditionSummary,
52
+ buildEditionSummaryPieSplit: () => buildEditionSummaryPieSplit,
53
+ buildEditionSummaryRevShareCap: () => buildEditionSummaryRevShareCap,
38
54
  buildEnsReferralUrl: () => buildEnsReferralUrl,
39
- buildRankedReferrerMetrics: () => buildRankedReferrerMetrics,
40
- buildReferralProgramRules: () => buildReferralProgramRules,
41
- buildReferrerLeaderboard: () => buildReferrerLeaderboard,
55
+ buildLeaderboardPagePieSplit: () => buildLeaderboardPagePieSplit,
56
+ buildLeaderboardPageRevShareCap: () => buildLeaderboardPageRevShareCap,
57
+ buildRankedReferrerMetricsPieSplit: () => buildRankedReferrerMetricsPieSplit,
58
+ buildRankedReferrerMetricsRevShareCap: () => buildRankedReferrerMetricsRevShareCap,
59
+ buildReferralProgramEditionConfigSet: () => buildReferralProgramEditionConfigSet,
60
+ buildReferralProgramRulesPieSplit: () => buildReferralProgramRulesPieSplit,
61
+ buildReferralProgramRulesRevShareCap: () => buildReferralProgramRulesRevShareCap,
42
62
  buildReferrerLeaderboardPageContext: () => buildReferrerLeaderboardPageContext,
43
63
  buildReferrerLeaderboardPageParams: () => buildReferrerLeaderboardPageParams,
64
+ buildReferrerLeaderboardPieSplit: () => buildReferrerLeaderboardPieSplit,
65
+ buildReferrerLeaderboardRevShareCap: () => buildReferrerLeaderboardRevShareCap,
44
66
  buildReferrerMetrics: () => buildReferrerMetrics,
45
- buildScoredReferrerMetrics: () => buildScoredReferrerMetrics,
46
- buildUnrankedReferrerMetrics: () => buildUnrankedReferrerMetrics,
47
- calcReferralProgramStatus: () => calcReferralProgramStatus,
48
- calcReferrerAwardPoolShare: () => calcReferrerAwardPoolShare,
49
- calcReferrerFinalScore: () => calcReferrerFinalScore,
50
- calcReferrerFinalScoreBoost: () => calcReferrerFinalScoreBoost,
51
- calcReferrerFinalScoreMultiplier: () => calcReferrerFinalScoreMultiplier,
52
- calcReferrerScore: () => calcReferrerScore,
67
+ buildReferrerMetricsRevShareCap: () => buildReferrerMetricsRevShareCap,
68
+ buildScoredReferrerMetricsPieSplit: () => buildScoredReferrerMetricsPieSplit,
69
+ buildUnrankedReferrerMetricsPieSplit: () => buildUnrankedReferrerMetricsPieSplit,
70
+ buildUnrankedReferrerMetricsRevShareCap: () => buildUnrankedReferrerMetricsRevShareCap,
71
+ calcBaseReferralProgramEditionStatus: () => calcBaseReferralProgramEditionStatus,
72
+ calcReferralProgramEditionStatusPieSplit: () => calcReferralProgramEditionStatusPieSplit,
73
+ calcReferralProgramEditionStatusRevShareCap: () => calcReferralProgramEditionStatusRevShareCap,
74
+ calcReferrerAwardPoolSharePieSplit: () => calcReferrerAwardPoolSharePieSplit,
75
+ calcReferrerScorePieSplit: () => calcReferrerScorePieSplit,
53
76
  compareReferrerMetrics: () => compareReferrerMetrics,
54
- deserializeReferrerDetailResponse: () => deserializeReferrerDetailResponse,
77
+ deserializeReferralProgramEditionConfigSetArray: () => deserializeReferralProgramEditionConfigSetArray,
78
+ deserializeReferralProgramEditionSummariesResponse: () => deserializeReferralProgramEditionSummariesResponse,
55
79
  deserializeReferrerLeaderboardPageResponse: () => deserializeReferrerLeaderboardPageResponse,
56
- getReferrerDetail: () => getReferrerDetail,
80
+ deserializeReferrerMetricsEditionsResponse: () => deserializeReferrerMetricsEditionsResponse,
81
+ getReferrerEditionMetrics: () => getReferrerEditionMetrics,
57
82
  getReferrerLeaderboardPage: () => getReferrerLeaderboardPage,
58
83
  isFiniteNonNegativeNumber: () => isFiniteNonNegativeNumber,
59
84
  isInteger: () => isInteger,
60
85
  isNonNegativeInteger: () => isNonNegativeInteger,
61
86
  isPositiveInteger: () => isPositiveInteger,
62
- isReferrerQualified: () => isReferrerQualified,
87
+ isReferrerQualifiedRevShareCap: () => isReferrerQualifiedRevShareCap,
63
88
  isValidDuration: () => isValidDuration,
64
89
  isValidReferrerScore: () => isValidReferrerScore,
65
- isValidRevenueContribution: () => isValidRevenueContribution,
66
- isValidUSDQuantity: () => isValidUSDQuantity,
67
- normalizeAddress: () => normalizeAddress,
68
- serializeReferrerDetailResponse: () => serializeReferrerDetailResponse,
90
+ serializeReferralProgramEditionSummariesResponse: () => serializeReferralProgramEditionSummariesResponse,
91
+ serializeReferralProgramEditionSummary: () => serializeReferralProgramEditionSummary,
92
+ serializeReferralProgramRules: () => serializeReferralProgramRules,
69
93
  serializeReferrerLeaderboardPageResponse: () => serializeReferrerLeaderboardPageResponse,
94
+ serializeReferrerMetricsEditionsResponse: () => serializeReferrerMetricsEditionsResponse,
95
+ sliceReferrers: () => sliceReferrers,
70
96
  sortReferrerMetrics: () => sortReferrerMetrics,
71
- validateAggregatedReferrerMetrics: () => validateAggregatedReferrerMetrics,
72
- validateAwardedReferrerMetrics: () => validateAwardedReferrerMetrics,
97
+ validateAggregatedReferrerMetricsPieSplit: () => validateAggregatedReferrerMetricsPieSplit,
98
+ validateAggregatedReferrerMetricsRevShareCap: () => validateAggregatedReferrerMetricsRevShareCap,
99
+ validateAwardedReferrerMetricsPieSplit: () => validateAwardedReferrerMetricsPieSplit,
100
+ validateAwardedReferrerMetricsRevShareCap: () => validateAwardedReferrerMetricsRevShareCap,
101
+ validateBaseReferralProgramEditionSummary: () => validateBaseReferralProgramEditionSummary,
102
+ validateBaseReferralProgramRules: () => validateBaseReferralProgramRules,
73
103
  validateDuration: () => validateDuration,
74
- validateLowercaseAddress: () => validateLowercaseAddress,
104
+ validateEditionSummaryPieSplit: () => validateEditionSummaryPieSplit,
105
+ validateEditionSummaryRevShareCap: () => validateEditionSummaryRevShareCap,
75
106
  validateNonNegativeInteger: () => validateNonNegativeInteger,
76
- validateRankedReferrerMetrics: () => validateRankedReferrerMetrics,
77
- validateReferralProgramRules: () => validateReferralProgramRules,
107
+ validateNormalizedAddress: () => validateNormalizedAddress,
108
+ validateRankedReferrerMetricsPieSplit: () => validateRankedReferrerMetricsPieSplit,
109
+ validateRankedReferrerMetricsRevShareCap: () => validateRankedReferrerMetricsRevShareCap,
110
+ validateReferralProgramEditionConfigSet: () => validateReferralProgramEditionConfigSet,
111
+ validateReferralProgramRulesPieSplit: () => validateReferralProgramRulesPieSplit,
112
+ validateReferralProgramRulesRevShareCap: () => validateReferralProgramRulesRevShareCap,
78
113
  validateReferrerLeaderboardPageContext: () => validateReferrerLeaderboardPageContext,
79
114
  validateReferrerMetrics: () => validateReferrerMetrics,
115
+ validateReferrerMetricsRevShareCap: () => validateReferrerMetricsRevShareCap,
80
116
  validateReferrerRank: () => validateReferrerRank,
81
117
  validateReferrerScore: () => validateReferrerScore,
82
- validateRevenueContribution: () => validateRevenueContribution,
83
- validateScoredReferrerMetrics: () => validateScoredReferrerMetrics,
84
- validateUSDQuantity: () => validateUSDQuantity,
118
+ validateScoredReferrerMetricsPieSplit: () => validateScoredReferrerMetricsPieSplit,
85
119
  validateUnixTimestamp: () => validateUnixTimestamp,
86
- validateUnrankedReferrerMetrics: () => validateUnrankedReferrerMetrics
120
+ validateUnrankedReferrerMetricsPieSplit: () => validateUnrankedReferrerMetricsPieSplit,
121
+ validateUnrankedReferrerMetricsRevShareCap: () => validateUnrankedReferrerMetricsRevShareCap
87
122
  });
88
123
  module.exports = __toCommonJS(index_exports);
89
124
 
90
125
  // src/address.ts
91
- var import_viem = require("viem");
92
- var validateLowercaseAddress = (address) => {
93
- if (!(0, import_viem.isAddress)(address, { strict: false })) {
94
- throw new Error(`Invalid address: ${address}. Address must be a valid EVM address.`);
95
- }
96
- if (address !== address.toLowerCase()) {
97
- throw new Error(`Invalid address: ${address}. Address must be in lowercase format.`);
98
- }
99
- };
100
- var normalizeAddress = (address) => {
101
- return address.toLowerCase();
102
- };
103
-
104
- // src/number.ts
105
- var isInteger = (value) => {
106
- return Number.isInteger(value);
107
- };
108
- var isNonNegativeInteger = (value) => {
109
- return value >= 0 && Number.isInteger(value);
110
- };
111
- var isPositiveInteger = (value) => {
112
- return value >= 1 && Number.isInteger(value);
113
- };
114
- var validateNonNegativeInteger = (value) => {
115
- if (!isNonNegativeInteger(value)) {
116
- throw new Error(`Invalid non-negative integer: ${value}.`);
117
- }
118
- };
119
- var isFiniteNonNegativeNumber = (value) => {
120
- return value >= 0 && Number.isFinite(value);
121
- };
122
-
123
- // src/revenue-contribution.ts
124
- function isValidRevenueContribution(value) {
125
- return typeof value === "bigint" && value >= 0n;
126
- }
127
- function validateRevenueContribution(value) {
128
- if (typeof value !== "bigint") {
129
- throw new Error(`Invalid revenue contribution: must be a bigint, got: ${typeof value}`);
130
- }
131
- if (value < 0n) {
132
- throw new Error(`Invalid revenue contribution: must be non-negative, got: ${value.toString()}`);
133
- }
134
- }
135
-
136
- // src/time.ts
137
- var validateUnixTimestamp = (timestamp) => {
138
- if (!isInteger(timestamp)) {
139
- throw new Error(`Invalid Unix timestamp: ${timestamp}. Unix timestamp must be an integer.`);
140
- }
141
- };
142
- var SECONDS_PER_YEAR = 31556952;
143
- function isValidDuration(duration) {
144
- return isNonNegativeInteger(duration);
145
- }
146
- function validateDuration(duration) {
147
- if (!isValidDuration(duration)) {
148
- throw new Error(`Invalid duration: ${duration}. Duration must be a non-negative integer.`);
149
- }
150
- }
151
-
152
- // src/score.ts
153
- var isValidReferrerScore = (score) => {
154
- return score >= 0 && Number.isFinite(score);
155
- };
156
- var validateReferrerScore = (score) => {
157
- if (!isValidReferrerScore(score)) {
158
- throw new Error(
159
- `Invalid referrer score: ${score}. Referrer score must be a finite non-negative number.`
160
- );
161
- }
162
- };
163
- var calcReferrerScore = (totalIncrementalDuration) => {
164
- return totalIncrementalDuration / SECONDS_PER_YEAR;
165
- };
166
-
167
- // src/aggregations.ts
168
- var validateAggregatedReferrerMetrics = (metrics) => {
169
- validateNonNegativeInteger(metrics.grandTotalReferrals);
170
- validateDuration(metrics.grandTotalIncrementalDuration);
171
- validateRevenueContribution(metrics.grandTotalRevenueContribution);
172
- validateReferrerScore(metrics.grandTotalQualifiedReferrersFinalScore);
173
- validateReferrerScore(metrics.minFinalScoreToQualify);
174
- };
175
- var buildAggregatedReferrerMetrics = (referrers, rules) => {
176
- let grandTotalReferrals = 0;
177
- let grandTotalIncrementalDuration = 0;
178
- let grandTotalRevenueContribution = 0n;
179
- let grandTotalQualifiedReferrersFinalScore = 0;
180
- let minFinalScoreToQualify = Number.MAX_SAFE_INTEGER;
181
- for (const referrer of referrers) {
182
- grandTotalReferrals += referrer.totalReferrals;
183
- grandTotalIncrementalDuration += referrer.totalIncrementalDuration;
184
- grandTotalRevenueContribution += referrer.totalRevenueContribution;
185
- if (referrer.isQualified) {
186
- grandTotalQualifiedReferrersFinalScore += referrer.finalScore;
187
- if (referrer.finalScore < minFinalScoreToQualify) {
188
- minFinalScoreToQualify = referrer.finalScore;
189
- }
190
- }
191
- }
192
- if (minFinalScoreToQualify === Number.MAX_SAFE_INTEGER) {
193
- if (rules.maxQualifiedReferrers === 0) {
194
- } else {
195
- if (referrers.length !== 0) {
196
- throw new Error(
197
- "AggregatedReferrerMetrics: There are referrers on the leaderboard, and the rules allow for qualified referrers, but no qualified referrers."
198
- );
199
- }
200
- minFinalScoreToQualify = 0;
201
- }
126
+ var import_enssdk = require("enssdk");
127
+ var validateNormalizedAddress = (address) => {
128
+ if (!(0, import_enssdk.isNormalizedAddress)(address)) {
129
+ throw new Error(`Invalid address: '${address}'. Address must be a lowercase EVM Address.`);
202
130
  }
203
- const result = {
204
- grandTotalReferrals,
205
- grandTotalIncrementalDuration,
206
- grandTotalRevenueContribution,
207
- grandTotalQualifiedReferrersFinalScore,
208
- minFinalScoreToQualify
209
- };
210
- validateAggregatedReferrerMetrics(result);
211
- return result;
212
131
  };
213
132
 
214
133
  // src/api/deserialize.ts
215
- var import_v43 = require("zod/v4");
134
+ var import_v46 = require("zod/v4");
216
135
 
217
136
  // src/api/zod-schemas.ts
218
- var import_v42 = require("zod/v4");
137
+ var import_v45 = __toESM(require("zod/v4"), 1);
219
138
 
220
139
  // ../../node_modules/.pnpm/caip@1.1.1/node_modules/caip/dist/index.mjs
221
140
  function _extends() {
@@ -517,12 +436,84 @@ var AssetId = /* @__PURE__ */ (function() {
517
436
  AssetId.spec = CAIP["19"].assetId;
518
437
 
519
438
  // ../ensnode-sdk/src/shared/zod-schemas.ts
439
+ var import_enssdk2 = require("enssdk");
520
440
  var import_viem2 = require("viem");
521
441
  var import_v4 = require("zod/v4");
522
442
 
523
- // ../ensnode-sdk/src/shared/address.ts
524
- function asLowerCaseAddress(address) {
525
- return address.toLowerCase();
443
+ // ../ensnode-sdk/src/shared/currencies.ts
444
+ var import_viem = require("viem");
445
+
446
+ // ../ensnode-sdk/src/shared/numbers.ts
447
+ function scaleBigintByNumber(value, scaleFactor) {
448
+ if (value < 0n) {
449
+ throw new Error(`scaleBigintByNumber: value must be non-negative, got: ${value.toString()}`);
450
+ }
451
+ if (!Number.isFinite(scaleFactor)) {
452
+ throw new Error(
453
+ `scaleBigintByNumber: scaleFactor must be a finite number, got: ${scaleFactor}`
454
+ );
455
+ }
456
+ if (scaleFactor < 0) {
457
+ throw new Error(`scaleBigintByNumber: scaleFactor must be non-negative, got: ${scaleFactor}`);
458
+ }
459
+ if (scaleFactor >= 1e21) {
460
+ throw new Error(`scaleBigintByNumber: scaleFactor must be less than 1e21, got: ${scaleFactor}`);
461
+ }
462
+ if (value === 0n || scaleFactor === 0) {
463
+ return 0n;
464
+ }
465
+ if (scaleFactor === 1) {
466
+ return value;
467
+ }
468
+ const fixedStr = scaleFactor.toFixed(20);
469
+ const [integerPart, decimalPart = ""] = fixedStr.split(".");
470
+ const trimmedDecimal = decimalPart.replace(/0+$/, "") || "0";
471
+ const numerator = BigInt(integerPart + trimmedDecimal);
472
+ const denominator = 10n ** BigInt(trimmedDecimal.length);
473
+ return value * numerator / denominator;
474
+ }
475
+
476
+ // ../ensnode-sdk/src/shared/currencies.ts
477
+ var CurrencyIds = {
478
+ ETH: "ETH",
479
+ USDC: "USDC",
480
+ DAI: "DAI"
481
+ };
482
+ var currencyInfo = {
483
+ [CurrencyIds.ETH]: {
484
+ id: CurrencyIds.ETH,
485
+ name: "ETH",
486
+ decimals: 18
487
+ },
488
+ [CurrencyIds.USDC]: {
489
+ id: CurrencyIds.USDC,
490
+ name: "USDC",
491
+ decimals: 6
492
+ },
493
+ [CurrencyIds.DAI]: {
494
+ id: CurrencyIds.DAI,
495
+ name: "Dai Stablecoin",
496
+ decimals: 18
497
+ }
498
+ };
499
+ function priceEth(amount) {
500
+ return {
501
+ amount,
502
+ currency: CurrencyIds.ETH
503
+ };
504
+ }
505
+ function priceUsdc(amount) {
506
+ return {
507
+ amount,
508
+ currency: CurrencyIds.USDC
509
+ };
510
+ }
511
+ function scalePrice(price, scaleFactor) {
512
+ const scaledAmount = scaleBigintByNumber(price.amount, scaleFactor);
513
+ return {
514
+ ...price,
515
+ amount: scaledAmount
516
+ };
526
517
  }
527
518
 
528
519
  // ../ensnode-sdk/src/shared/zod-schemas.ts
@@ -546,22 +537,78 @@ var makeDurationSchema = (valueLabel = "Value") => import_v4.z.number({
546
537
  error: `${valueLabel} must be a number.`
547
538
  }).pipe(makeNonNegativeIntegerSchema(valueLabel));
548
539
  var makeChainIdSchema = (valueLabel = "Chain ID") => makePositiveIntegerSchema(valueLabel).transform((val) => val);
549
- var makeLowercaseAddressSchema = (valueLabel = "EVM address") => import_v4.z.string().check((ctx) => {
550
- if (!(0, import_viem2.isAddress)(ctx.value)) {
540
+ var makeNormalizedAddressSchema = (valueLabel = "EVM address") => import_v4.z.string().check((ctx) => {
541
+ if (!(0, import_viem2.isAddress)(ctx.value, { strict: false })) {
551
542
  ctx.issues.push({
552
543
  code: "custom",
553
544
  message: `${valueLabel} must be a valid EVM address`,
554
545
  input: ctx.value
555
546
  });
556
547
  }
557
- }).transform((val) => asLowerCaseAddress(val));
548
+ }).transform((val) => (0, import_enssdk2.toNormalizedAddress)(val));
558
549
  var makeUnixTimestampSchema = (valueLabel = "Timestamp") => makeIntegerSchema(valueLabel);
550
+ var makeUrlSchema = (valueLabel = "Value") => import_v4.z.url({
551
+ error: `${valueLabel} must be a valid URL string (e.g., http://localhost:8080 or https://example.com).`,
552
+ abort: true
553
+ }).transform((v) => new URL(v));
554
+ var makePriceAmountSchema = (valueLabel = "Amount") => import_v4.z.coerce.bigint({
555
+ error: `${valueLabel} must represent a bigint.`
556
+ }).nonnegative({
557
+ error: `${valueLabel} must not be negative.`
558
+ });
559
+ var makePriceCurrencySchema = (currency, valueLabel = "Price Currency") => import_v4.z.strictObject({
560
+ amount: makePriceAmountSchema(`${valueLabel} amount`),
561
+ currency: import_v4.z.literal(currency, {
562
+ error: `${valueLabel} currency must be set to '${currency}'.`
563
+ })
564
+ });
565
+ var makePriceEthSchema = (valueLabel = "Price ETH") => makePriceCurrencySchema(CurrencyIds.ETH, valueLabel).transform((v) => v);
566
+ var makePriceUsdcSchema = (valueLabel = "Price USDC") => makePriceCurrencySchema(CurrencyIds.USDC, valueLabel).transform((v) => v);
559
567
  var makeAccountIdSchema = (valueLabel = "AccountId") => import_v4.z.strictObject({
560
568
  chainId: makeChainIdSchema(`${valueLabel} chain ID`),
561
- address: makeLowercaseAddressSchema(`${valueLabel} address`)
569
+ address: makeNormalizedAddressSchema(`${valueLabel} address`)
562
570
  });
563
571
 
564
- // src/leaderboard-page.ts
572
+ // ../ensnode-sdk/src/shared/serialize.ts
573
+ function serializePrice(price) {
574
+ return {
575
+ currency: price.currency,
576
+ amount: price.amount.toString()
577
+ };
578
+ }
579
+ function serializePriceEth(price) {
580
+ return serializePrice(price);
581
+ }
582
+ function serializePriceUsdc(price) {
583
+ return serializePrice(price);
584
+ }
585
+
586
+ // src/award-models/pie-split/api/zod-schemas.ts
587
+ var import_v43 = __toESM(require("zod/v4"), 1);
588
+
589
+ // src/award-models/shared/api/zod-schemas.ts
590
+ var import_v42 = __toESM(require("zod/v4"), 1);
591
+
592
+ // src/number.ts
593
+ var isInteger = (value) => {
594
+ return Number.isInteger(value);
595
+ };
596
+ var isNonNegativeInteger = (value) => {
597
+ return value >= 0 && Number.isInteger(value);
598
+ };
599
+ var isPositiveInteger = (value) => {
600
+ return value >= 1 && Number.isInteger(value);
601
+ };
602
+ var validateNonNegativeInteger = (value) => {
603
+ if (!isNonNegativeInteger(value)) {
604
+ throw new Error(`Invalid non-negative integer: ${value}.`);
605
+ }
606
+ };
607
+ var isFiniteNonNegativeNumber = (value) => {
608
+ return value >= 0 && Number.isFinite(value);
609
+ };
610
+
611
+ // src/award-models/shared/leaderboard-page.ts
565
612
  var REFERRERS_PER_LEADERBOARD_PAGE_DEFAULT = 25;
566
613
  var REFERRERS_PER_LEADERBOARD_PAGE_MAX = 100;
567
614
  var validateReferrerLeaderboardPageParams = (params) => {
@@ -593,18 +640,67 @@ var validateReferrerLeaderboardPageContext = (context) => {
593
640
  validateReferrerLeaderboardPageParams(context);
594
641
  if (!isNonNegativeInteger(context.totalRecords)) {
595
642
  throw new Error(
596
- `Invalid ReferrerLeaderboardPageContext: total must be a non-negative integer but is ${context.totalRecords}.`
643
+ `Invalid ReferrerLeaderboardPageContext: totalRecords must be a non-negative integer but is ${context.totalRecords}.`
644
+ );
645
+ }
646
+ if (!isPositiveInteger(context.totalPages)) {
647
+ throw new Error(
648
+ `Invalid ReferrerLeaderboardPageContext: totalPages must be a positive integer (>= 1) but is ${context.totalPages}.`
649
+ );
650
+ }
651
+ const expectedTotalPages = context.totalRecords === 0 ? 1 : Math.ceil(context.totalRecords / context.recordsPerPage);
652
+ if (context.totalPages !== expectedTotalPages) {
653
+ throw new Error(
654
+ `Invalid ReferrerLeaderboardPageContext: totalPages is ${context.totalPages} but expected ${expectedTotalPages} based on totalRecords (${context.totalRecords}) and recordsPerPage (${context.recordsPerPage}).`
655
+ );
656
+ }
657
+ if (context.page > context.totalPages) {
658
+ throw new Error(
659
+ `Invalid ReferrerLeaderboardPageContext: page ${context.page} exceeds totalPages ${context.totalPages}.`
597
660
  );
598
661
  }
662
+ const expectedStartIndex = (context.page - 1) * context.recordsPerPage;
663
+ const expectedEndIndex = Math.min(
664
+ expectedStartIndex + context.recordsPerPage - 1,
665
+ context.totalRecords - 1
666
+ );
667
+ if (context.totalRecords === 0) {
668
+ if (context.startIndex !== void 0) {
669
+ throw new Error(
670
+ `Invalid ReferrerLeaderboardPageContext: startIndex must be undefined when totalRecords is 0 but is ${context.startIndex}.`
671
+ );
672
+ }
673
+ if (context.endIndex !== void 0) {
674
+ throw new Error(
675
+ `Invalid ReferrerLeaderboardPageContext: endIndex must be undefined when totalRecords is 0 but is ${context.endIndex}.`
676
+ );
677
+ }
678
+ } else {
679
+ if (context.startIndex !== expectedStartIndex) {
680
+ throw new Error(
681
+ `Invalid ReferrerLeaderboardPageContext: startIndex is ${context.startIndex} but expected ${expectedStartIndex} based on page (${context.page}) and recordsPerPage (${context.recordsPerPage}).`
682
+ );
683
+ }
684
+ if (context.endIndex !== expectedEndIndex) {
685
+ throw new Error(
686
+ `Invalid ReferrerLeaderboardPageContext: endIndex is ${context.endIndex} but expected ${expectedEndIndex} based on startIndex (${expectedStartIndex}), recordsPerPage (${context.recordsPerPage}), and totalRecords (${context.totalRecords}).`
687
+ );
688
+ }
689
+ if (typeof context.endIndex !== "undefined" && typeof context.startIndex !== "undefined" && context.endIndex < context.startIndex) {
690
+ throw new Error(
691
+ `Invalid ReferrerLeaderboardPageContext: endIndex (${context.endIndex}) must be greater than or equal to startIndex (${context.startIndex}).`
692
+ );
693
+ }
694
+ }
599
695
  const startIndex = (context.page - 1) * context.recordsPerPage;
600
696
  const endIndex = startIndex + context.recordsPerPage;
601
697
  if (!context.hasNext && endIndex < context.totalRecords) {
602
698
  throw new Error(
603
- `Invalid ReferrerLeaderboardPageContext: if hasNext is false, endIndex (${endIndex}) must be greater than or equal to total (${context.totalRecords}).`
699
+ `Invalid ReferrerLeaderboardPageContext: if hasNext is false, endIndex (${endIndex}) must be greater than or equal to totalRecords (${context.totalRecords}).`
604
700
  );
605
701
  } else if (context.hasNext && context.page * context.recordsPerPage >= context.totalRecords) {
606
702
  throw new Error(
607
- `Invalid ReferrerLeaderboardPageContext: if hasNext is true, endIndex (${endIndex}) must be less than total (${context.totalRecords}).`
703
+ `Invalid ReferrerLeaderboardPageContext: if hasNext is true, endIndex (${endIndex}) must be less than totalRecords (${context.totalRecords}).`
608
704
  );
609
705
  }
610
706
  if (!context.hasPrev && context.page !== 1) {
@@ -654,214 +750,1559 @@ var buildReferrerLeaderboardPageContext = (optionalParams, leaderboard) => {
654
750
  validateReferrerLeaderboardPageContext(result);
655
751
  return result;
656
752
  };
657
- var getReferrerLeaderboardPage = (pageParams, leaderboard) => {
658
- const pageContext = buildReferrerLeaderboardPageContext(pageParams, leaderboard);
659
- let referrers;
660
- if (pageContext.totalRecords > 0 && typeof pageContext.startIndex !== "undefined" && typeof pageContext.endIndex !== "undefined") {
661
- referrers = Array.from(leaderboard.referrers.values()).slice(
662
- pageContext.startIndex,
663
- pageContext.endIndex + 1
664
- // For `slice`, this is exclusive of the element at the index 'end'. We need it to be inclusive, hence plus one.
665
- );
666
- } else {
667
- referrers = [];
753
+ function sliceReferrers(referrers, pageContext) {
754
+ if (pageContext.totalRecords === 0 || pageContext.startIndex === void 0 || pageContext.endIndex === void 0) {
755
+ return [];
668
756
  }
669
- return {
670
- rules: leaderboard.rules,
671
- referrers,
672
- aggregatedMetrics: leaderboard.aggregatedMetrics,
673
- pageContext,
674
- accurateAsOf: leaderboard.accurateAsOf
675
- };
757
+ const all = [...referrers.values()];
758
+ return all.slice(pageContext.startIndex, pageContext.endIndex + 1);
759
+ }
760
+
761
+ // src/award-models/shared/status.ts
762
+ var ReferralProgramEditionStatuses = {
763
+ /**
764
+ * Represents a referral program edition that has been announced, but hasn't started yet.
765
+ */
766
+ Scheduled: "Scheduled",
767
+ /**
768
+ * Represents a currently ongoing referral program edition.
769
+ */
770
+ Active: "Active",
771
+ /**
772
+ * Represents a referral program edition that is still within its active window
773
+ * but whose award pool has been fully consumed.
774
+ *
775
+ * @note Not all award models may support this status.
776
+ */
777
+ Exhausted: "Exhausted",
778
+ /**
779
+ * Represents a referral program edition that has passed its end time but whose awards have not yet
780
+ * been distributed. The edition is in a review window before full closure.
781
+ *
782
+ * Transitions to {@link ReferralProgramEditionStatuses.Closed} once `areAwardsDistributed` is set to `true`.
783
+ */
784
+ AwardsReview: "AwardsReview",
785
+ /**
786
+ * Represents a referral program edition that has already ended and whose awards have been distributed.
787
+ */
788
+ Closed: "Closed"
789
+ };
790
+ var calcBaseReferralProgramEditionStatus = (rules, now) => {
791
+ if (now < rules.startTime) return ReferralProgramEditionStatuses.Scheduled;
792
+ if (now > rules.endTime)
793
+ return rules.areAwardsDistributed ? ReferralProgramEditionStatuses.Closed : ReferralProgramEditionStatuses.AwardsReview;
794
+ return ReferralProgramEditionStatuses.Active;
676
795
  };
677
796
 
678
- // src/rank.ts
679
- var validateReferrerRank = (rank) => {
680
- if (!isPositiveInteger(rank)) {
681
- throw new Error(`Invalid ReferrerRank: ${rank}. ReferrerRank must be a positive integer.`);
797
+ // src/award-models/shared/api/zod-schemas.ts
798
+ var makeBaseReferralProgramRulesSchema = (valueLabel) => import_v42.default.object({
799
+ awardModel: import_v42.default.string(),
800
+ startTime: makeUnixTimestampSchema(`${valueLabel}.startTime`),
801
+ endTime: makeUnixTimestampSchema(`${valueLabel}.endTime`),
802
+ subregistryId: makeAccountIdSchema(`${valueLabel}.subregistryId`),
803
+ rulesUrl: makeUrlSchema(`${valueLabel}.rulesUrl`),
804
+ areAwardsDistributed: import_v42.default.boolean()
805
+ }).refine((data) => data.endTime >= data.startTime, {
806
+ message: `${valueLabel}.endTime must be >= ${valueLabel}.startTime`,
807
+ path: ["endTime"]
808
+ });
809
+ var makeReferrerLeaderboardPageContextSchema = (valueLabel = "ReferrerLeaderboardPageContext") => import_v42.default.object({
810
+ page: makePositiveIntegerSchema(`${valueLabel}.page`),
811
+ recordsPerPage: makePositiveIntegerSchema(`${valueLabel}.recordsPerPage`).max(
812
+ REFERRERS_PER_LEADERBOARD_PAGE_MAX,
813
+ `${valueLabel}.recordsPerPage must not exceed ${REFERRERS_PER_LEADERBOARD_PAGE_MAX}`
814
+ ),
815
+ totalRecords: makeNonNegativeIntegerSchema(`${valueLabel}.totalRecords`),
816
+ totalPages: makePositiveIntegerSchema(`${valueLabel}.totalPages`),
817
+ hasNext: import_v42.default.boolean(),
818
+ hasPrev: import_v42.default.boolean(),
819
+ startIndex: import_v42.default.optional(makeNonNegativeIntegerSchema(`${valueLabel}.startIndex`)),
820
+ endIndex: import_v42.default.optional(makeNonNegativeIntegerSchema(`${valueLabel}.endIndex`))
821
+ });
822
+ var makeReferralProgramStatusSchema = (_valueLabel = "status") => import_v42.default.enum(ReferralProgramEditionStatuses);
823
+ var makeBaseReferralProgramEditionSummarySchema = (valueLabel) => import_v42.default.object({
824
+ awardModel: import_v42.default.string(),
825
+ slug: import_v42.default.string().min(1, `${valueLabel}.slug must not be empty`),
826
+ displayName: import_v42.default.string().min(1, `${valueLabel}.displayName must not be empty`),
827
+ status: makeReferralProgramStatusSchema(`${valueLabel}.status`),
828
+ rules: makeBaseReferralProgramRulesSchema(`${valueLabel}.rules`)
829
+ });
830
+ var makeBaseReferrerLeaderboardPageSchema = (valueLabel) => import_v42.default.object({
831
+ awardModel: import_v42.default.string(),
832
+ pageContext: makeReferrerLeaderboardPageContextSchema(`${valueLabel}.pageContext`),
833
+ status: makeReferralProgramStatusSchema(`${valueLabel}.status`),
834
+ accurateAsOf: makeUnixTimestampSchema(`${valueLabel}.accurateAsOf`)
835
+ });
836
+
837
+ // src/award-models/shared/edition-metrics.ts
838
+ var ReferrerEditionMetricsTypeIds = {
839
+ /**
840
+ * Represents a referrer who is ranked on the leaderboard.
841
+ */
842
+ Ranked: "ranked",
843
+ /**
844
+ * Represents a referrer who is not ranked on the leaderboard.
845
+ */
846
+ Unranked: "unranked"
847
+ };
848
+
849
+ // src/time.ts
850
+ var validateUnixTimestamp = (timestamp) => {
851
+ if (!isInteger(timestamp)) {
852
+ throw new Error(`Invalid Unix timestamp: ${timestamp}. Unix timestamp must be an integer.`);
682
853
  }
683
854
  };
684
- function isReferrerQualified(rank, rules) {
685
- return rank <= rules.maxQualifiedReferrers;
686
- }
687
- function calcReferrerFinalScoreBoost(rank, rules) {
688
- if (!isReferrerQualified(rank, rules)) return 0;
689
- return 1 - (rank - 1) / (rules.maxQualifiedReferrers - 1);
690
- }
691
- function calcReferrerFinalScoreMultiplier(rank, rules) {
692
- return 1 + calcReferrerFinalScoreBoost(rank, rules);
693
- }
694
- function calcReferrerFinalScore(rank, totalIncrementalDuration, rules) {
695
- return calcReferrerScore(totalIncrementalDuration) * calcReferrerFinalScoreMultiplier(rank, rules);
855
+ var SECONDS_PER_YEAR = 31556952;
856
+ function isValidDuration(duration) {
857
+ return isNonNegativeInteger(duration);
696
858
  }
697
- var compareReferrerMetrics = (a, b) => {
698
- if (a.totalIncrementalDuration !== b.totalIncrementalDuration) {
699
- return b.totalIncrementalDuration - a.totalIncrementalDuration;
859
+ function validateDuration(duration) {
860
+ if (!isValidDuration(duration)) {
861
+ throw new Error(`Invalid duration: ${duration}. Duration must be a non-negative integer.`);
700
862
  }
701
- if (b.referrer > a.referrer) return 1;
702
- if (b.referrer < a.referrer) return -1;
703
- return 0;
704
- };
863
+ }
705
864
 
706
- // src/referrer-metrics.ts
707
- var buildReferrerMetrics = (referrer, totalReferrals, totalIncrementalDuration, totalRevenueContribution) => {
708
- const result = {
709
- referrer: normalizeAddress(referrer),
710
- totalReferrals,
711
- totalIncrementalDuration,
712
- totalRevenueContribution
713
- };
865
+ // src/award-models/shared/rules.ts
866
+ var ReferralProgramAwardModels = {
867
+ PieSplit: "pie-split",
868
+ RevShareCap: "rev-share-cap",
869
+ Unrecognized: "unrecognized"
870
+ };
871
+ var validateBaseReferralProgramRules = (rules) => {
872
+ makeAccountIdSchema("BaseReferralProgramRules.subregistryId").parse(rules.subregistryId);
873
+ validateUnixTimestamp(rules.startTime);
874
+ validateUnixTimestamp(rules.endTime);
875
+ if (!(rules.rulesUrl instanceof URL)) {
876
+ throw new Error(
877
+ `BaseReferralProgramRules: rulesUrl must be a URL instance, got ${typeof rules.rulesUrl}.`
878
+ );
879
+ }
880
+ if (rules.endTime < rules.startTime) {
881
+ throw new Error(
882
+ `BaseReferralProgramRules: startTime: ${rules.startTime} is after endTime: ${rules.endTime}.`
883
+ );
884
+ }
885
+ };
886
+
887
+ // src/award-models/pie-split/api/zod-schemas.ts
888
+ var makeReferralProgramRulesPieSplitSchema = (valueLabel = "ReferralProgramRulesPieSplit") => makeBaseReferralProgramRulesSchema(valueLabel).safeExtend({
889
+ awardModel: import_v43.default.literal(ReferralProgramAwardModels.PieSplit),
890
+ awardPool: makePriceUsdcSchema(`${valueLabel}.awardPool`),
891
+ maxQualifiedReferrers: makeNonNegativeIntegerSchema(`${valueLabel}.maxQualifiedReferrers`)
892
+ });
893
+ var makeAwardedReferrerMetricsPieSplitSchema = (valueLabel = "AwardedReferrerMetricsPieSplit") => import_v43.default.object({
894
+ referrer: makeNormalizedAddressSchema(`${valueLabel}.referrer`),
895
+ totalReferrals: makeNonNegativeIntegerSchema(`${valueLabel}.totalReferrals`),
896
+ totalIncrementalDuration: makeDurationSchema(`${valueLabel}.totalIncrementalDuration`),
897
+ totalRevenueContribution: makePriceEthSchema(`${valueLabel}.totalRevenueContribution`),
898
+ score: makeFiniteNonNegativeNumberSchema(`${valueLabel}.score`),
899
+ rank: makePositiveIntegerSchema(`${valueLabel}.rank`),
900
+ isQualified: import_v43.default.boolean(),
901
+ finalScoreBoost: makeFiniteNonNegativeNumberSchema(`${valueLabel}.finalScoreBoost`).max(
902
+ 1,
903
+ `${valueLabel}.finalScoreBoost must be <= 1`
904
+ ),
905
+ finalScore: makeFiniteNonNegativeNumberSchema(`${valueLabel}.finalScore`),
906
+ awardPoolShare: makeFiniteNonNegativeNumberSchema(`${valueLabel}.awardPoolShare`).max(
907
+ 1,
908
+ `${valueLabel}.awardPoolShare must be <= 1`
909
+ ),
910
+ awardPoolApproxValue: makePriceUsdcSchema(`${valueLabel}.awardPoolApproxValue`)
911
+ });
912
+ var makeUnrankedReferrerMetricsPieSplitSchema = (valueLabel = "UnrankedReferrerMetricsPieSplit") => import_v43.default.object({
913
+ referrer: makeNormalizedAddressSchema(`${valueLabel}.referrer`),
914
+ totalReferrals: makeNonNegativeIntegerSchema(`${valueLabel}.totalReferrals`),
915
+ totalIncrementalDuration: makeDurationSchema(`${valueLabel}.totalIncrementalDuration`),
916
+ totalRevenueContribution: makePriceEthSchema(`${valueLabel}.totalRevenueContribution`),
917
+ score: makeFiniteNonNegativeNumberSchema(`${valueLabel}.score`),
918
+ rank: import_v43.default.null(),
919
+ isQualified: import_v43.default.literal(false),
920
+ finalScoreBoost: makeFiniteNonNegativeNumberSchema(`${valueLabel}.finalScoreBoost`).max(
921
+ 1,
922
+ `${valueLabel}.finalScoreBoost must be <= 1`
923
+ ),
924
+ finalScore: makeFiniteNonNegativeNumberSchema(`${valueLabel}.finalScore`),
925
+ awardPoolShare: makeFiniteNonNegativeNumberSchema(`${valueLabel}.awardPoolShare`).max(
926
+ 1,
927
+ `${valueLabel}.awardPoolShare must be <= 1`
928
+ ),
929
+ awardPoolApproxValue: makePriceUsdcSchema(`${valueLabel}.awardPoolApproxValue`)
930
+ });
931
+ var makeAggregatedReferrerMetricsPieSplitSchema = (valueLabel = "AggregatedReferrerMetricsPieSplit") => import_v43.default.object({
932
+ grandTotalReferrals: makeNonNegativeIntegerSchema(`${valueLabel}.grandTotalReferrals`),
933
+ grandTotalIncrementalDuration: makeDurationSchema(
934
+ `${valueLabel}.grandTotalIncrementalDuration`
935
+ ),
936
+ grandTotalRevenueContribution: makePriceEthSchema(
937
+ `${valueLabel}.grandTotalRevenueContribution`
938
+ ),
939
+ grandTotalQualifiedReferrersFinalScore: makeFiniteNonNegativeNumberSchema(
940
+ `${valueLabel}.grandTotalQualifiedReferrersFinalScore`
941
+ ),
942
+ minFinalScoreToQualify: makeFiniteNonNegativeNumberSchema(
943
+ `${valueLabel}.minFinalScoreToQualify`
944
+ )
945
+ });
946
+ var makeReferrerEditionMetricsRankedPieSplitSchema = (valueLabel = "ReferrerEditionMetricsRankedPieSplit") => import_v43.default.object({
947
+ awardModel: import_v43.default.literal(ReferralProgramAwardModels.PieSplit),
948
+ type: import_v43.default.literal(ReferrerEditionMetricsTypeIds.Ranked),
949
+ rules: makeReferralProgramRulesPieSplitSchema(`${valueLabel}.rules`),
950
+ referrer: makeAwardedReferrerMetricsPieSplitSchema(`${valueLabel}.referrer`),
951
+ aggregatedMetrics: makeAggregatedReferrerMetricsPieSplitSchema(
952
+ `${valueLabel}.aggregatedMetrics`
953
+ ),
954
+ status: makeReferralProgramStatusSchema(`${valueLabel}.status`),
955
+ accurateAsOf: makeUnixTimestampSchema(`${valueLabel}.accurateAsOf`)
956
+ }).refine((data) => data.awardModel === data.rules.awardModel, {
957
+ message: `${valueLabel}.awardModel must equal ${valueLabel}.rules.awardModel`,
958
+ path: ["awardModel"]
959
+ });
960
+ var makeReferrerEditionMetricsUnrankedPieSplitSchema = (valueLabel = "ReferrerEditionMetricsUnrankedPieSplit") => import_v43.default.object({
961
+ awardModel: import_v43.default.literal(ReferralProgramAwardModels.PieSplit),
962
+ type: import_v43.default.literal(ReferrerEditionMetricsTypeIds.Unranked),
963
+ rules: makeReferralProgramRulesPieSplitSchema(`${valueLabel}.rules`),
964
+ referrer: makeUnrankedReferrerMetricsPieSplitSchema(`${valueLabel}.referrer`),
965
+ aggregatedMetrics: makeAggregatedReferrerMetricsPieSplitSchema(
966
+ `${valueLabel}.aggregatedMetrics`
967
+ ),
968
+ status: makeReferralProgramStatusSchema(`${valueLabel}.status`),
969
+ accurateAsOf: makeUnixTimestampSchema(`${valueLabel}.accurateAsOf`)
970
+ }).refine((data) => data.awardModel === data.rules.awardModel, {
971
+ message: `${valueLabel}.awardModel must equal ${valueLabel}.rules.awardModel`,
972
+ path: ["awardModel"]
973
+ });
974
+ var makeReferrerEditionMetricsPieSplitSchema = (valueLabel = "ReferrerEditionMetricsPieSplit") => import_v43.default.discriminatedUnion("type", [
975
+ makeReferrerEditionMetricsRankedPieSplitSchema(valueLabel),
976
+ makeReferrerEditionMetricsUnrankedPieSplitSchema(valueLabel)
977
+ ]);
978
+ var makeReferralProgramEditionSummaryPieSplitSchema = (valueLabel = "ReferralProgramEditionSummaryPieSplit") => makeBaseReferralProgramEditionSummarySchema(valueLabel).safeExtend({
979
+ awardModel: import_v43.default.literal(ReferralProgramAwardModels.PieSplit),
980
+ rules: makeReferralProgramRulesPieSplitSchema(`${valueLabel}.rules`)
981
+ }).refine((data) => data.awardModel === data.rules.awardModel, {
982
+ message: `${valueLabel}.awardModel must equal ${valueLabel}.rules.awardModel`,
983
+ path: ["awardModel"]
984
+ });
985
+ var makeReferrerLeaderboardPagePieSplitSchema = (valueLabel = "ReferrerLeaderboardPagePieSplit") => makeBaseReferrerLeaderboardPageSchema(valueLabel).safeExtend({
986
+ awardModel: import_v43.default.literal(ReferralProgramAwardModels.PieSplit),
987
+ rules: makeReferralProgramRulesPieSplitSchema(`${valueLabel}.rules`),
988
+ referrers: import_v43.default.array(
989
+ makeAwardedReferrerMetricsPieSplitSchema(`${valueLabel}.referrers[record]`)
990
+ ),
991
+ aggregatedMetrics: makeAggregatedReferrerMetricsPieSplitSchema(
992
+ `${valueLabel}.aggregatedMetrics`
993
+ )
994
+ }).refine((data) => data.awardModel === data.rules.awardModel, {
995
+ message: `${valueLabel}.awardModel must equal ${valueLabel}.rules.awardModel`,
996
+ path: ["awardModel"]
997
+ });
998
+
999
+ // src/award-models/rev-share-cap/api/zod-schemas.ts
1000
+ var import_v44 = __toESM(require("zod/v4"), 1);
1001
+
1002
+ // src/award-models/rev-share-cap/rules.ts
1003
+ var AdminActionTypes = {
1004
+ /**
1005
+ * The referrer is disqualified for awards.
1006
+ */
1007
+ Disqualification: "Disqualification",
1008
+ /**
1009
+ * The referrer is warned about a potential disqualification but may still be qualified for awards.
1010
+ */
1011
+ Warning: "Warning"
1012
+ };
1013
+ var validateReferralProgramRulesRevShareCap = (rules) => {
1014
+ if (rules.awardModel !== ReferralProgramAwardModels.RevShareCap) {
1015
+ throw new Error(
1016
+ `ReferralProgramRulesRevShareCap: awardModel must be "${ReferralProgramAwardModels.RevShareCap}", got "${rules.awardModel}".`
1017
+ );
1018
+ }
1019
+ makePriceUsdcSchema("ReferralProgramRulesRevShareCap.awardPool").parse(rules.awardPool);
1020
+ makePriceUsdcSchema("ReferralProgramRulesRevShareCap.minBaseRevenueContribution").parse(
1021
+ rules.minBaseRevenueContribution
1022
+ );
1023
+ makePriceUsdcSchema("ReferralProgramRulesRevShareCap.baseAnnualRevenueContribution").parse(
1024
+ rules.baseAnnualRevenueContribution
1025
+ );
1026
+ if (!Number.isFinite(rules.maxBaseRevenueShare) || rules.maxBaseRevenueShare < 0 || rules.maxBaseRevenueShare > 1) {
1027
+ throw new Error(
1028
+ `ReferralProgramRulesRevShareCap: maxBaseRevenueShare must be between 0 and 1 (inclusive), got ${rules.maxBaseRevenueShare}.`
1029
+ );
1030
+ }
1031
+ for (const action of rules.adminActions) {
1032
+ validateNormalizedAddress(action.referrer);
1033
+ if (action.reason.trim().length === 0 || action.reason !== action.reason.trim()) {
1034
+ throw new Error(
1035
+ "ReferralProgramRulesRevShareCap: admin action reason must be a trimmed, non-empty string."
1036
+ );
1037
+ }
1038
+ }
1039
+ const adminActionAddresses = rules.adminActions.map((a) => a.referrer);
1040
+ const uniqueAdminActionAddresses = new Set(adminActionAddresses);
1041
+ if (uniqueAdminActionAddresses.size !== adminActionAddresses.length) {
1042
+ throw new Error(
1043
+ "ReferralProgramRulesRevShareCap: adminActions must not contain duplicate referrer addresses."
1044
+ );
1045
+ }
1046
+ validateBaseReferralProgramRules(rules);
1047
+ };
1048
+ var buildReferralProgramRulesRevShareCap = (awardPool, minBaseRevenueContribution, baseAnnualRevenueContribution, maxBaseRevenueShare, startTime, endTime, subregistryId, rulesUrl, areAwardsDistributed, adminActions = []) => {
1049
+ const result = {
1050
+ awardModel: ReferralProgramAwardModels.RevShareCap,
1051
+ awardPool,
1052
+ minBaseRevenueContribution,
1053
+ baseAnnualRevenueContribution,
1054
+ maxBaseRevenueShare,
1055
+ startTime,
1056
+ endTime,
1057
+ subregistryId,
1058
+ rulesUrl,
1059
+ areAwardsDistributed,
1060
+ adminActions
1061
+ };
1062
+ validateReferralProgramRulesRevShareCap(result);
1063
+ return result;
1064
+ };
1065
+ function isReferrerQualifiedRevShareCap(referrer, totalBaseRevenueContribution, rules) {
1066
+ const isAdminDisqualified = rules.adminActions.some(
1067
+ (a) => a.referrer === referrer && a.actionType === AdminActionTypes.Disqualification
1068
+ );
1069
+ return totalBaseRevenueContribution.amount >= rules.minBaseRevenueContribution.amount && !isAdminDisqualified;
1070
+ }
1071
+
1072
+ // src/award-models/rev-share-cap/api/zod-schemas.ts
1073
+ var makeAdminActionDisqualificationSchema = (valueLabel = "AdminActionDisqualification") => import_v44.default.object({
1074
+ actionType: import_v44.default.literal(AdminActionTypes.Disqualification),
1075
+ referrer: makeNormalizedAddressSchema(`${valueLabel}.referrer`),
1076
+ reason: import_v44.default.string().trim().min(1, `${valueLabel}.reason must not be empty`)
1077
+ });
1078
+ var makeAdminActionWarningSchema = (valueLabel = "AdminActionWarning") => import_v44.default.object({
1079
+ actionType: import_v44.default.literal(AdminActionTypes.Warning),
1080
+ referrer: makeNormalizedAddressSchema(`${valueLabel}.referrer`),
1081
+ reason: import_v44.default.string().trim().min(1, `${valueLabel}.reason must not be empty`)
1082
+ });
1083
+ var makeAdminActionSchema = (valueLabel = "AdminAction") => import_v44.default.discriminatedUnion("actionType", [
1084
+ makeAdminActionDisqualificationSchema(valueLabel),
1085
+ makeAdminActionWarningSchema(valueLabel)
1086
+ ]);
1087
+ var makeReferralProgramRulesRevShareCapSchema = (valueLabel = "ReferralProgramRulesRevShareCap") => makeBaseReferralProgramRulesSchema(valueLabel).safeExtend({
1088
+ awardModel: import_v44.default.literal(ReferralProgramAwardModels.RevShareCap),
1089
+ awardPool: makePriceUsdcSchema(`${valueLabel}.awardPool`),
1090
+ minBaseRevenueContribution: makePriceUsdcSchema(`${valueLabel}.minBaseRevenueContribution`),
1091
+ baseAnnualRevenueContribution: makePriceUsdcSchema(
1092
+ `${valueLabel}.baseAnnualRevenueContribution`
1093
+ ),
1094
+ maxBaseRevenueShare: makeFiniteNonNegativeNumberSchema(`${valueLabel}.maxBaseRevenueShare`).max(
1095
+ 1,
1096
+ `${valueLabel}.maxBaseRevenueShare must be <= 1`
1097
+ ),
1098
+ adminActions: import_v44.default.array(makeAdminActionSchema(`${valueLabel}.adminActions[item]`)).refine(
1099
+ (items) => {
1100
+ const referrers = items.map((a) => a.referrer);
1101
+ return new Set(referrers).size === referrers.length;
1102
+ },
1103
+ {
1104
+ message: `${valueLabel}.adminActions must not contain duplicate referrer addresses`
1105
+ }
1106
+ ).default([])
1107
+ });
1108
+ var makeAwardedReferrerMetricsRevShareCapSchema = (valueLabel = "AwardedReferrerMetricsRevShareCap") => import_v44.default.object({
1109
+ referrer: makeNormalizedAddressSchema(`${valueLabel}.referrer`),
1110
+ totalReferrals: makeNonNegativeIntegerSchema(`${valueLabel}.totalReferrals`),
1111
+ totalIncrementalDuration: makeDurationSchema(`${valueLabel}.totalIncrementalDuration`),
1112
+ totalRevenueContribution: makePriceEthSchema(`${valueLabel}.totalRevenueContribution`),
1113
+ totalBaseRevenueContribution: makePriceUsdcSchema(
1114
+ `${valueLabel}.totalBaseRevenueContribution`
1115
+ ),
1116
+ rank: makePositiveIntegerSchema(`${valueLabel}.rank`),
1117
+ isQualified: import_v44.default.boolean(),
1118
+ uncappedAward: makePriceUsdcSchema(`${valueLabel}.uncappedAward`),
1119
+ cappedAward: makePriceUsdcSchema(`${valueLabel}.cappedAward`),
1120
+ adminAction: makeAdminActionSchema(`${valueLabel}.adminAction`).nullable()
1121
+ }).refine((data) => data.cappedAward.amount <= data.uncappedAward.amount, {
1122
+ message: `${valueLabel}.cappedAward must be <= ${valueLabel}.uncappedAward`,
1123
+ path: ["cappedAward"]
1124
+ }).refine(
1125
+ (data) => data.adminAction?.actionType !== AdminActionTypes.Disqualification || data.isQualified === false && data.cappedAward.amount === 0n,
1126
+ {
1127
+ message: `When ${valueLabel}.adminAction.actionType is Disqualification, isQualified must be false and cappedAward.amount must be 0`,
1128
+ path: ["adminAction"]
1129
+ }
1130
+ ).refine((data) => data.isQualified || data.cappedAward.amount === 0n, {
1131
+ message: `${valueLabel}.cappedAward must be 0 when isQualified is false`,
1132
+ path: ["cappedAward"]
1133
+ }).refine((data) => data.adminAction === null || data.adminAction.referrer === data.referrer, {
1134
+ message: `${valueLabel}.adminAction.referrer must match ${valueLabel}.referrer`,
1135
+ path: ["adminAction", "referrer"]
1136
+ });
1137
+ var makeUnrankedReferrerMetricsRevShareCapSchema = (valueLabel = "UnrankedReferrerMetricsRevShareCap") => import_v44.default.object({
1138
+ referrer: makeNormalizedAddressSchema(`${valueLabel}.referrer`),
1139
+ totalReferrals: makeNonNegativeIntegerSchema(`${valueLabel}.totalReferrals`),
1140
+ totalIncrementalDuration: makeDurationSchema(`${valueLabel}.totalIncrementalDuration`),
1141
+ totalRevenueContribution: makePriceEthSchema(`${valueLabel}.totalRevenueContribution`),
1142
+ totalBaseRevenueContribution: makePriceUsdcSchema(
1143
+ `${valueLabel}.totalBaseRevenueContribution`
1144
+ ),
1145
+ rank: import_v44.default.null(),
1146
+ isQualified: import_v44.default.literal(false),
1147
+ uncappedAward: makePriceUsdcSchema(`${valueLabel}.uncappedAward`),
1148
+ cappedAward: makePriceUsdcSchema(`${valueLabel}.cappedAward`),
1149
+ adminAction: makeAdminActionSchema(`${valueLabel}.adminAction`).nullable()
1150
+ }).refine((data) => data.totalReferrals === 0, {
1151
+ message: `${valueLabel}.totalReferrals must be 0 for unranked referrers`,
1152
+ path: ["totalReferrals"]
1153
+ }).refine((data) => data.totalIncrementalDuration === 0, {
1154
+ message: `${valueLabel}.totalIncrementalDuration must be 0 for unranked referrers`,
1155
+ path: ["totalIncrementalDuration"]
1156
+ }).refine((data) => data.totalRevenueContribution.amount === 0n, {
1157
+ message: `${valueLabel}.totalRevenueContribution must be 0 for unranked referrers`,
1158
+ path: ["totalRevenueContribution"]
1159
+ }).refine((data) => data.totalBaseRevenueContribution.amount === 0n, {
1160
+ message: `${valueLabel}.totalBaseRevenueContribution must be 0 for unranked referrers`,
1161
+ path: ["totalBaseRevenueContribution"]
1162
+ }).refine((data) => data.uncappedAward.amount === 0n, {
1163
+ message: `${valueLabel}.uncappedAward must be 0 for unranked referrers`,
1164
+ path: ["uncappedAward"]
1165
+ }).refine((data) => data.cappedAward.amount === 0n, {
1166
+ message: `${valueLabel}.cappedAward must be 0 for unranked referrers`,
1167
+ path: ["cappedAward"]
1168
+ }).refine((data) => data.adminAction === null || data.adminAction.referrer === data.referrer, {
1169
+ message: `${valueLabel}.adminAction.referrer must match ${valueLabel}.referrer`,
1170
+ path: ["adminAction", "referrer"]
1171
+ });
1172
+ var makeAggregatedReferrerMetricsRevShareCapSchema = (valueLabel = "AggregatedReferrerMetricsRevShareCap") => import_v44.default.object({
1173
+ grandTotalReferrals: makeNonNegativeIntegerSchema(`${valueLabel}.grandTotalReferrals`),
1174
+ grandTotalIncrementalDuration: makeDurationSchema(
1175
+ `${valueLabel}.grandTotalIncrementalDuration`
1176
+ ),
1177
+ grandTotalRevenueContribution: makePriceEthSchema(
1178
+ `${valueLabel}.grandTotalRevenueContribution`
1179
+ ),
1180
+ awardPoolRemaining: makePriceUsdcSchema(`${valueLabel}.awardPoolRemaining`)
1181
+ });
1182
+ var addAdminActionConsistencyIssues = (ctx, metricsAdminAction, referrer, rulesAdminActions, path) => {
1183
+ const expected = rulesAdminActions.find((a) => a.referrer === referrer) ?? null;
1184
+ if (expected === null && metricsAdminAction !== null) {
1185
+ ctx.addIssue({
1186
+ code: import_v44.default.ZodIssueCode.custom,
1187
+ message: `adminAction expected null, got actionType="${metricsAdminAction.actionType}"`,
1188
+ path
1189
+ });
1190
+ return;
1191
+ }
1192
+ if (expected !== null && (metricsAdminAction === null || metricsAdminAction.actionType !== expected.actionType || metricsAdminAction.referrer !== expected.referrer || metricsAdminAction.reason !== expected.reason)) {
1193
+ ctx.addIssue({
1194
+ code: import_v44.default.ZodIssueCode.custom,
1195
+ message: `adminAction does not match the corresponding entry in rules.adminActions`,
1196
+ path
1197
+ });
1198
+ }
1199
+ };
1200
+ var makeReferrerEditionMetricsRankedRevShareCapSchema = (valueLabel = "ReferrerEditionMetricsRankedRevShareCap") => import_v44.default.object({
1201
+ awardModel: import_v44.default.literal(ReferralProgramAwardModels.RevShareCap),
1202
+ type: import_v44.default.literal(ReferrerEditionMetricsTypeIds.Ranked),
1203
+ rules: makeReferralProgramRulesRevShareCapSchema(`${valueLabel}.rules`),
1204
+ referrer: makeAwardedReferrerMetricsRevShareCapSchema(`${valueLabel}.referrer`),
1205
+ aggregatedMetrics: makeAggregatedReferrerMetricsRevShareCapSchema(
1206
+ `${valueLabel}.aggregatedMetrics`
1207
+ ),
1208
+ status: makeReferralProgramStatusSchema(`${valueLabel}.status`),
1209
+ accurateAsOf: makeUnixTimestampSchema(`${valueLabel}.accurateAsOf`)
1210
+ }).refine((data) => data.awardModel === data.rules.awardModel, {
1211
+ message: `${valueLabel}.awardModel must equal ${valueLabel}.rules.awardModel`,
1212
+ path: ["awardModel"]
1213
+ }).refine((data) => data.referrer.cappedAward.amount <= data.rules.awardPool.amount, {
1214
+ message: `${valueLabel}.referrer.cappedAward must be <= ${valueLabel}.rules.awardPool`,
1215
+ path: ["referrer", "cappedAward", "amount"]
1216
+ }).superRefine((data, ctx) => {
1217
+ addAdminActionConsistencyIssues(
1218
+ ctx,
1219
+ data.referrer.adminAction,
1220
+ data.referrer.referrer,
1221
+ data.rules.adminActions,
1222
+ ["referrer", "adminAction"]
1223
+ );
1224
+ });
1225
+ var makeReferrerEditionMetricsUnrankedRevShareCapSchema = (valueLabel = "ReferrerEditionMetricsUnrankedRevShareCap") => import_v44.default.object({
1226
+ awardModel: import_v44.default.literal(ReferralProgramAwardModels.RevShareCap),
1227
+ type: import_v44.default.literal(ReferrerEditionMetricsTypeIds.Unranked),
1228
+ rules: makeReferralProgramRulesRevShareCapSchema(`${valueLabel}.rules`),
1229
+ referrer: makeUnrankedReferrerMetricsRevShareCapSchema(`${valueLabel}.referrer`),
1230
+ aggregatedMetrics: makeAggregatedReferrerMetricsRevShareCapSchema(
1231
+ `${valueLabel}.aggregatedMetrics`
1232
+ ),
1233
+ status: makeReferralProgramStatusSchema(`${valueLabel}.status`),
1234
+ accurateAsOf: makeUnixTimestampSchema(`${valueLabel}.accurateAsOf`)
1235
+ }).refine((data) => data.awardModel === data.rules.awardModel, {
1236
+ message: `${valueLabel}.awardModel must equal ${valueLabel}.rules.awardModel`,
1237
+ path: ["awardModel"]
1238
+ }).superRefine((data, ctx) => {
1239
+ addAdminActionConsistencyIssues(
1240
+ ctx,
1241
+ data.referrer.adminAction,
1242
+ data.referrer.referrer,
1243
+ data.rules.adminActions,
1244
+ ["referrer", "adminAction"]
1245
+ );
1246
+ });
1247
+ var makeReferrerEditionMetricsRevShareCapSchema = (valueLabel = "ReferrerEditionMetricsRevShareCap") => import_v44.default.discriminatedUnion("type", [
1248
+ makeReferrerEditionMetricsRankedRevShareCapSchema(valueLabel),
1249
+ makeReferrerEditionMetricsUnrankedRevShareCapSchema(valueLabel)
1250
+ ]);
1251
+ var makeReferralProgramEditionSummaryRevShareCapSchema = (valueLabel = "ReferralProgramEditionSummaryRevShareCap") => makeBaseReferralProgramEditionSummarySchema(valueLabel).safeExtend({
1252
+ awardModel: import_v44.default.literal(ReferralProgramAwardModels.RevShareCap),
1253
+ rules: makeReferralProgramRulesRevShareCapSchema(`${valueLabel}.rules`),
1254
+ awardPoolRemaining: makePriceUsdcSchema(`${valueLabel}.awardPoolRemaining`)
1255
+ }).refine((data) => data.awardModel === data.rules.awardModel, {
1256
+ message: `${valueLabel}.awardModel must equal ${valueLabel}.rules.awardModel`,
1257
+ path: ["awardModel"]
1258
+ });
1259
+ var makeReferrerLeaderboardPageRevShareCapSchema = (valueLabel = "ReferrerLeaderboardPageRevShareCap") => makeBaseReferrerLeaderboardPageSchema(valueLabel).safeExtend({
1260
+ awardModel: import_v44.default.literal(ReferralProgramAwardModels.RevShareCap),
1261
+ rules: makeReferralProgramRulesRevShareCapSchema(`${valueLabel}.rules`),
1262
+ referrers: import_v44.default.array(
1263
+ makeAwardedReferrerMetricsRevShareCapSchema(`${valueLabel}.referrers[record]`)
1264
+ ),
1265
+ aggregatedMetrics: makeAggregatedReferrerMetricsRevShareCapSchema(
1266
+ `${valueLabel}.aggregatedMetrics`
1267
+ )
1268
+ }).refine((data) => data.awardModel === data.rules.awardModel, {
1269
+ message: `${valueLabel}.awardModel must equal ${valueLabel}.rules.awardModel`,
1270
+ path: ["awardModel"]
1271
+ }).superRefine((data, ctx) => {
1272
+ data.referrers.forEach((referrer, index) => {
1273
+ if (referrer.cappedAward.amount > data.rules.awardPool.amount) {
1274
+ ctx.addIssue({
1275
+ code: import_v44.default.ZodIssueCode.custom,
1276
+ message: `${valueLabel}.referrers[${index}].cappedAward must be <= ${valueLabel}.rules.awardPool`,
1277
+ path: ["referrers", index, "cappedAward", "amount"]
1278
+ });
1279
+ }
1280
+ addAdminActionConsistencyIssues(
1281
+ ctx,
1282
+ referrer.adminAction,
1283
+ referrer.referrer,
1284
+ data.rules.adminActions,
1285
+ ["referrers", index, "adminAction"]
1286
+ );
1287
+ });
1288
+ });
1289
+
1290
+ // src/api/types.ts
1291
+ var ReferrerLeaderboardPageResponseCodes = {
1292
+ /**
1293
+ * Represents that the requested referrer leaderboard page is available.
1294
+ */
1295
+ Ok: "ok",
1296
+ /**
1297
+ * Represents that the referrer leaderboard data is not available.
1298
+ */
1299
+ Error: "error"
1300
+ };
1301
+ var MAX_EDITIONS_PER_REQUEST = 20;
1302
+ var ReferrerMetricsEditionsResponseCodes = {
1303
+ /**
1304
+ * Represents that the referrer metrics data for the requested editions is available.
1305
+ */
1306
+ Ok: "ok",
1307
+ /**
1308
+ * Represents that an error occurred while fetching the data.
1309
+ */
1310
+ Error: "error"
1311
+ };
1312
+ var ReferralProgramEditionSummariesResponseCodes = {
1313
+ /**
1314
+ * Represents that the edition summaries are available.
1315
+ */
1316
+ Ok: "ok",
1317
+ /**
1318
+ * Represents that the edition summaries are not available.
1319
+ */
1320
+ Error: "error"
1321
+ };
1322
+
1323
+ // src/api/zod-schemas.ts
1324
+ var reemitIssues = (ctx, issues, pathPrefix = []) => {
1325
+ for (const issue of issues) {
1326
+ ctx.addIssue({
1327
+ ...issue,
1328
+ path: [...pathPrefix, ...issue.path]
1329
+ });
1330
+ }
1331
+ };
1332
+ var makeReferralProgramRulesSchema = (valueLabel = "ReferralProgramRules") => import_v45.default.discriminatedUnion("awardModel", [
1333
+ makeReferralProgramRulesPieSplitSchema(valueLabel),
1334
+ makeReferralProgramRulesRevShareCapSchema(valueLabel)
1335
+ ]);
1336
+ var makeReferrerLeaderboardPageSchema = (valueLabel = "ReferrerLeaderboardPage") => {
1337
+ const knownAwardModels = Object.values(ReferralProgramAwardModels).filter(
1338
+ (m) => m !== ReferralProgramAwardModels.Unrecognized
1339
+ );
1340
+ const looseSchema = import_v45.default.looseObject({ awardModel: import_v45.default.string() });
1341
+ const knownSchema = import_v45.default.discriminatedUnion("awardModel", [
1342
+ makeReferrerLeaderboardPagePieSplitSchema(valueLabel),
1343
+ makeReferrerLeaderboardPageRevShareCapSchema(valueLabel)
1344
+ ]);
1345
+ const baseSchema = makeBaseReferrerLeaderboardPageSchema(valueLabel);
1346
+ return looseSchema.transform((data, ctx) => {
1347
+ if (knownAwardModels.includes(data.awardModel)) {
1348
+ const parsed2 = knownSchema.safeParse(data);
1349
+ if (!parsed2.success) {
1350
+ reemitIssues(ctx, parsed2.error.issues);
1351
+ return import_v45.default.NEVER;
1352
+ }
1353
+ return parsed2.data;
1354
+ }
1355
+ const parsed = baseSchema.safeParse(data);
1356
+ if (!parsed.success) {
1357
+ reemitIssues(ctx, parsed.error.issues);
1358
+ return import_v45.default.NEVER;
1359
+ }
1360
+ return {
1361
+ ...parsed.data,
1362
+ awardModel: ReferralProgramAwardModels.Unrecognized,
1363
+ originalAwardModel: data.awardModel
1364
+ };
1365
+ });
1366
+ };
1367
+ var makeReferrerLeaderboardPageResponseOkSchema = (valueLabel = "ReferrerLeaderboardPageResponseOk") => import_v45.default.object({
1368
+ responseCode: import_v45.default.literal(ReferrerLeaderboardPageResponseCodes.Ok),
1369
+ data: makeReferrerLeaderboardPageSchema(`${valueLabel}.data`)
1370
+ });
1371
+ var makeReferrerLeaderboardPageResponseErrorSchema = (_valueLabel = "ReferrerLeaderboardPageResponseError") => import_v45.default.object({
1372
+ responseCode: import_v45.default.literal(ReferrerLeaderboardPageResponseCodes.Error),
1373
+ error: import_v45.default.string(),
1374
+ errorMessage: import_v45.default.string()
1375
+ });
1376
+ var makeReferrerLeaderboardPageResponseSchema = (valueLabel = "ReferrerLeaderboardPageResponse") => import_v45.default.discriminatedUnion("responseCode", [
1377
+ makeReferrerLeaderboardPageResponseOkSchema(valueLabel),
1378
+ makeReferrerLeaderboardPageResponseErrorSchema(valueLabel)
1379
+ ]);
1380
+ var makeReferrerEditionMetricsSchema = (valueLabel = "ReferrerEditionMetrics") => {
1381
+ const knownAwardModels = Object.values(ReferralProgramAwardModels).filter(
1382
+ (m) => m !== ReferralProgramAwardModels.Unrecognized
1383
+ );
1384
+ const looseSchema = import_v45.default.looseObject({ awardModel: import_v45.default.string() });
1385
+ const knownSchema = import_v45.default.discriminatedUnion("awardModel", [
1386
+ makeReferrerEditionMetricsPieSplitSchema(valueLabel),
1387
+ makeReferrerEditionMetricsRevShareCapSchema(valueLabel)
1388
+ ]);
1389
+ return looseSchema.transform((data, ctx) => {
1390
+ if (knownAwardModels.includes(data.awardModel)) {
1391
+ const parsed = knownSchema.safeParse(data);
1392
+ if (!parsed.success) {
1393
+ reemitIssues(ctx, parsed.error.issues);
1394
+ return import_v45.default.NEVER;
1395
+ }
1396
+ return parsed.data;
1397
+ }
1398
+ return {
1399
+ awardModel: ReferralProgramAwardModels.Unrecognized,
1400
+ originalAwardModel: data.awardModel
1401
+ };
1402
+ });
1403
+ };
1404
+ var makeReferralProgramEditionSlugSchema = (valueLabel = "ReferralProgramEditionSlug") => import_v45.default.string().min(1, `${valueLabel} must not be empty`).regex(
1405
+ /^[a-z0-9]+(-[a-z0-9]+)*$/,
1406
+ `${valueLabel} must contain only lowercase letters, digits, and hyphens. Must not start or end with a hyphen.`
1407
+ );
1408
+ var makeReferrerMetricsEditionsResponseOkSchema = (valueLabel = "ReferrerMetricsEditionsResponseOk") => import_v45.default.object({
1409
+ responseCode: import_v45.default.literal(ReferrerMetricsEditionsResponseCodes.Ok),
1410
+ data: import_v45.default.record(
1411
+ makeReferralProgramEditionSlugSchema(`${valueLabel}.data[edition]`),
1412
+ makeReferrerEditionMetricsSchema(`${valueLabel}.data[edition]`)
1413
+ )
1414
+ });
1415
+ var makeReferrerMetricsEditionsResponseErrorSchema = (_valueLabel = "ReferrerMetricsEditionsResponseError") => import_v45.default.object({
1416
+ responseCode: import_v45.default.literal(ReferrerMetricsEditionsResponseCodes.Error),
1417
+ error: import_v45.default.string(),
1418
+ errorMessage: import_v45.default.string()
1419
+ });
1420
+ var makeReferrerMetricsEditionsResponseSchema = (valueLabel = "ReferrerMetricsEditionsResponse") => import_v45.default.discriminatedUnion("responseCode", [
1421
+ makeReferrerMetricsEditionsResponseOkSchema(valueLabel),
1422
+ makeReferrerMetricsEditionsResponseErrorSchema(valueLabel)
1423
+ ]);
1424
+ var makeReferralProgramEditionConfigBaseSchema = (valueLabel) => import_v45.default.object({
1425
+ slug: makeReferralProgramEditionSlugSchema(`${valueLabel}.slug`),
1426
+ displayName: import_v45.default.string().min(1, `${valueLabel}.displayName must not be empty`),
1427
+ rules: makeBaseReferralProgramRulesSchema(`${valueLabel}.rules`)
1428
+ });
1429
+ var makeReferralProgramEditionConfigSchema = (valueLabel = "ReferralProgramEditionConfig") => makeReferralProgramEditionConfigBaseSchema(valueLabel).safeExtend({
1430
+ rules: makeReferralProgramRulesSchema(`${valueLabel}.rules`)
1431
+ });
1432
+ var makeReferralProgramEditionConfigSetArraySchema = (valueLabel = "ReferralProgramEditionConfigSetArray") => {
1433
+ const knownAwardModels = Object.values(ReferralProgramAwardModels).filter(
1434
+ (m) => m !== ReferralProgramAwardModels.Unrecognized
1435
+ );
1436
+ const configSchema = makeReferralProgramEditionConfigSchema(`${valueLabel}[edition]`);
1437
+ const looseItemSchema = import_v45.default.looseObject({
1438
+ rules: import_v45.default.looseObject({ awardModel: import_v45.default.string() })
1439
+ });
1440
+ const unrecognizedBaseSchema = makeReferralProgramEditionConfigBaseSchema(
1441
+ `${valueLabel}[edition]`
1442
+ );
1443
+ return import_v45.default.array(looseItemSchema).transform((items, ctx) => {
1444
+ const result = [];
1445
+ for (let i = 0; i < items.length; i++) {
1446
+ const item = items[i];
1447
+ if (knownAwardModels.includes(item.rules.awardModel)) {
1448
+ const parsed = configSchema.safeParse(item);
1449
+ if (!parsed.success) {
1450
+ reemitIssues(ctx, parsed.error.issues, [i]);
1451
+ } else {
1452
+ result.push(parsed.data);
1453
+ }
1454
+ } else {
1455
+ const parsed = unrecognizedBaseSchema.safeParse(item);
1456
+ if (!parsed.success) {
1457
+ reemitIssues(ctx, parsed.error.issues, [i]);
1458
+ continue;
1459
+ }
1460
+ result.push({
1461
+ ...parsed.data,
1462
+ rules: {
1463
+ ...parsed.data.rules,
1464
+ awardModel: ReferralProgramAwardModels.Unrecognized,
1465
+ originalAwardModel: item.rules.awardModel
1466
+ }
1467
+ });
1468
+ }
1469
+ }
1470
+ const slugs = /* @__PURE__ */ new Set();
1471
+ for (const edition of result) {
1472
+ if (slugs.has(edition.slug)) {
1473
+ ctx.addIssue({
1474
+ code: "custom",
1475
+ message: `${valueLabel} must not contain duplicate edition slugs`
1476
+ });
1477
+ return [];
1478
+ }
1479
+ slugs.add(edition.slug);
1480
+ }
1481
+ return result;
1482
+ });
1483
+ };
1484
+ var makeReferralProgramEditionSummarySchema = (valueLabel = "ReferralProgramEditionSummary") => {
1485
+ const knownAwardModels = Object.values(ReferralProgramAwardModels).filter(
1486
+ (m) => m !== ReferralProgramAwardModels.Unrecognized
1487
+ );
1488
+ const looseSchema = import_v45.default.looseObject({ awardModel: import_v45.default.string() });
1489
+ const knownSchema = import_v45.default.discriminatedUnion("awardModel", [
1490
+ makeReferralProgramEditionSummaryPieSplitSchema(valueLabel),
1491
+ makeReferralProgramEditionSummaryRevShareCapSchema(valueLabel)
1492
+ ]);
1493
+ const baseSchema = makeBaseReferralProgramEditionSummarySchema(valueLabel);
1494
+ return looseSchema.transform((data, ctx) => {
1495
+ if (knownAwardModels.includes(data.awardModel)) {
1496
+ const parsed2 = knownSchema.safeParse(data);
1497
+ if (!parsed2.success) {
1498
+ reemitIssues(ctx, parsed2.error.issues);
1499
+ return import_v45.default.NEVER;
1500
+ }
1501
+ return parsed2.data;
1502
+ }
1503
+ const parsed = baseSchema.safeParse(data);
1504
+ if (!parsed.success) {
1505
+ reemitIssues(ctx, parsed.error.issues);
1506
+ return import_v45.default.NEVER;
1507
+ }
1508
+ return {
1509
+ ...parsed.data,
1510
+ awardModel: ReferralProgramAwardModels.Unrecognized,
1511
+ rules: {
1512
+ ...parsed.data.rules,
1513
+ awardModel: ReferralProgramAwardModels.Unrecognized,
1514
+ originalAwardModel: data.awardModel
1515
+ }
1516
+ };
1517
+ });
1518
+ };
1519
+ var makeReferralProgramEditionSummariesDataSchema = (valueLabel = "ReferralProgramEditionSummariesData") => import_v45.default.object({
1520
+ editions: import_v45.default.array(makeReferralProgramEditionSummarySchema(`${valueLabel}.editions[edition]`))
1521
+ });
1522
+ var makeReferralProgramEditionSummariesResponseOkSchema = (valueLabel = "ReferralProgramEditionSummariesResponseOk") => import_v45.default.object({
1523
+ responseCode: import_v45.default.literal(ReferralProgramEditionSummariesResponseCodes.Ok),
1524
+ data: makeReferralProgramEditionSummariesDataSchema(`${valueLabel}.data`)
1525
+ });
1526
+ var makeReferralProgramEditionSummariesResponseErrorSchema = (_valueLabel = "ReferralProgramEditionSummariesResponseError") => import_v45.default.object({
1527
+ responseCode: import_v45.default.literal(ReferralProgramEditionSummariesResponseCodes.Error),
1528
+ error: import_v45.default.string(),
1529
+ errorMessage: import_v45.default.string()
1530
+ });
1531
+ var makeReferralProgramEditionSummariesResponseSchema = (valueLabel = "ReferralProgramEditionSummariesResponse") => import_v45.default.discriminatedUnion("responseCode", [
1532
+ makeReferralProgramEditionSummariesResponseOkSchema(valueLabel),
1533
+ makeReferralProgramEditionSummariesResponseErrorSchema(valueLabel)
1534
+ ]);
1535
+
1536
+ // src/api/deserialize.ts
1537
+ function deserializeReferrerLeaderboardPageResponse(maybeResponse, valueLabel) {
1538
+ const schema = makeReferrerLeaderboardPageResponseSchema(valueLabel);
1539
+ const parsed = schema.safeParse(maybeResponse);
1540
+ if (parsed.error) {
1541
+ throw new Error(
1542
+ `Cannot deserialize SerializedReferrerLeaderboardPageResponse:
1543
+ ${(0, import_v46.prettifyError)(parsed.error)}
1544
+ `
1545
+ );
1546
+ }
1547
+ return parsed.data;
1548
+ }
1549
+ function deserializeReferrerMetricsEditionsResponse(maybeResponse, valueLabel) {
1550
+ const schema = makeReferrerMetricsEditionsResponseSchema(valueLabel);
1551
+ const parsed = schema.safeParse(maybeResponse);
1552
+ if (parsed.error) {
1553
+ throw new Error(
1554
+ `Cannot deserialize ReferrerMetricsEditionsResponse:
1555
+ ${(0, import_v46.prettifyError)(parsed.error)}
1556
+ `
1557
+ );
1558
+ }
1559
+ return parsed.data;
1560
+ }
1561
+ function deserializeReferralProgramEditionConfigSetArray(maybeArray, valueLabel) {
1562
+ const schema = makeReferralProgramEditionConfigSetArraySchema(valueLabel);
1563
+ const parsed = schema.safeParse(maybeArray);
1564
+ if (parsed.error) {
1565
+ throw new Error(
1566
+ `Cannot deserialize ReferralProgramEditionConfigSetArray:
1567
+ ${(0, import_v46.prettifyError)(parsed.error)}
1568
+ `
1569
+ );
1570
+ }
1571
+ return parsed.data;
1572
+ }
1573
+ function deserializeReferralProgramEditionSummariesResponse(maybeResponse, valueLabel) {
1574
+ const schema = makeReferralProgramEditionSummariesResponseSchema(valueLabel);
1575
+ const parsed = schema.safeParse(maybeResponse);
1576
+ if (parsed.error) {
1577
+ throw new Error(
1578
+ `Cannot deserialize ReferralProgramEditionSummariesResponse:
1579
+ ${(0, import_v46.prettifyError)(parsed.error)}
1580
+ `
1581
+ );
1582
+ }
1583
+ return parsed.data;
1584
+ }
1585
+
1586
+ // src/award-models/pie-split/api/serialize.ts
1587
+ function serializeReferralProgramRulesPieSplit(rules) {
1588
+ return {
1589
+ awardModel: rules.awardModel,
1590
+ awardPool: serializePriceUsdc(rules.awardPool),
1591
+ maxQualifiedReferrers: rules.maxQualifiedReferrers,
1592
+ startTime: rules.startTime,
1593
+ endTime: rules.endTime,
1594
+ subregistryId: rules.subregistryId,
1595
+ rulesUrl: rules.rulesUrl.toString(),
1596
+ areAwardsDistributed: rules.areAwardsDistributed
1597
+ };
1598
+ }
1599
+ function serializeAggregatedReferrerMetricsPieSplit(metrics) {
1600
+ return {
1601
+ grandTotalReferrals: metrics.grandTotalReferrals,
1602
+ grandTotalIncrementalDuration: metrics.grandTotalIncrementalDuration,
1603
+ grandTotalRevenueContribution: serializePriceEth(metrics.grandTotalRevenueContribution),
1604
+ grandTotalQualifiedReferrersFinalScore: metrics.grandTotalQualifiedReferrersFinalScore,
1605
+ minFinalScoreToQualify: metrics.minFinalScoreToQualify
1606
+ };
1607
+ }
1608
+ function serializeAwardedReferrerMetricsPieSplit(metrics) {
1609
+ return {
1610
+ referrer: metrics.referrer,
1611
+ totalReferrals: metrics.totalReferrals,
1612
+ totalIncrementalDuration: metrics.totalIncrementalDuration,
1613
+ totalRevenueContribution: serializePriceEth(metrics.totalRevenueContribution),
1614
+ score: metrics.score,
1615
+ rank: metrics.rank,
1616
+ isQualified: metrics.isQualified,
1617
+ finalScoreBoost: metrics.finalScoreBoost,
1618
+ finalScore: metrics.finalScore,
1619
+ awardPoolShare: metrics.awardPoolShare,
1620
+ awardPoolApproxValue: serializePriceUsdc(metrics.awardPoolApproxValue)
1621
+ };
1622
+ }
1623
+ function serializeUnrankedReferrerMetricsPieSplit(metrics) {
1624
+ return {
1625
+ referrer: metrics.referrer,
1626
+ totalReferrals: metrics.totalReferrals,
1627
+ totalIncrementalDuration: metrics.totalIncrementalDuration,
1628
+ totalRevenueContribution: serializePriceEth(metrics.totalRevenueContribution),
1629
+ score: metrics.score,
1630
+ rank: metrics.rank,
1631
+ isQualified: metrics.isQualified,
1632
+ finalScoreBoost: metrics.finalScoreBoost,
1633
+ finalScore: metrics.finalScore,
1634
+ awardPoolShare: metrics.awardPoolShare,
1635
+ awardPoolApproxValue: serializePriceUsdc(metrics.awardPoolApproxValue)
1636
+ };
1637
+ }
1638
+ function serializeReferrerEditionMetricsRankedPieSplit(detail) {
1639
+ return {
1640
+ awardModel: detail.awardModel,
1641
+ type: detail.type,
1642
+ rules: serializeReferralProgramRulesPieSplit(detail.rules),
1643
+ referrer: serializeAwardedReferrerMetricsPieSplit(detail.referrer),
1644
+ aggregatedMetrics: serializeAggregatedReferrerMetricsPieSplit(detail.aggregatedMetrics),
1645
+ status: detail.status,
1646
+ accurateAsOf: detail.accurateAsOf
1647
+ };
1648
+ }
1649
+ function serializeReferrerEditionMetricsUnrankedPieSplit(detail) {
1650
+ return {
1651
+ awardModel: detail.awardModel,
1652
+ type: detail.type,
1653
+ rules: serializeReferralProgramRulesPieSplit(detail.rules),
1654
+ referrer: serializeUnrankedReferrerMetricsPieSplit(detail.referrer),
1655
+ aggregatedMetrics: serializeAggregatedReferrerMetricsPieSplit(detail.aggregatedMetrics),
1656
+ status: detail.status,
1657
+ accurateAsOf: detail.accurateAsOf
1658
+ };
1659
+ }
1660
+ function serializeReferrerEditionMetricsPieSplit(detail) {
1661
+ switch (detail.type) {
1662
+ case ReferrerEditionMetricsTypeIds.Ranked:
1663
+ return serializeReferrerEditionMetricsRankedPieSplit(detail);
1664
+ case ReferrerEditionMetricsTypeIds.Unranked:
1665
+ return serializeReferrerEditionMetricsUnrankedPieSplit(detail);
1666
+ default: {
1667
+ const _exhaustiveCheck = detail;
1668
+ throw new Error(`Unknown type: ${_exhaustiveCheck.type}`);
1669
+ }
1670
+ }
1671
+ }
1672
+ function serializeReferrerLeaderboardPagePieSplit(page) {
1673
+ return {
1674
+ awardModel: page.awardModel,
1675
+ rules: serializeReferralProgramRulesPieSplit(page.rules),
1676
+ referrers: page.referrers.map(serializeAwardedReferrerMetricsPieSplit),
1677
+ aggregatedMetrics: serializeAggregatedReferrerMetricsPieSplit(page.aggregatedMetrics),
1678
+ pageContext: page.pageContext,
1679
+ status: page.status,
1680
+ accurateAsOf: page.accurateAsOf
1681
+ };
1682
+ }
1683
+ function serializeReferralProgramEditionSummaryPieSplit(summary) {
1684
+ return {
1685
+ awardModel: summary.awardModel,
1686
+ slug: summary.slug,
1687
+ displayName: summary.displayName,
1688
+ status: summary.status,
1689
+ rules: serializeReferralProgramRulesPieSplit(summary.rules)
1690
+ };
1691
+ }
1692
+
1693
+ // src/award-models/rev-share-cap/api/serialize.ts
1694
+ function serializeReferralProgramRulesRevShareCap(rules) {
1695
+ return {
1696
+ awardModel: rules.awardModel,
1697
+ awardPool: serializePriceUsdc(rules.awardPool),
1698
+ minBaseRevenueContribution: serializePriceUsdc(rules.minBaseRevenueContribution),
1699
+ baseAnnualRevenueContribution: serializePriceUsdc(rules.baseAnnualRevenueContribution),
1700
+ maxBaseRevenueShare: rules.maxBaseRevenueShare,
1701
+ startTime: rules.startTime,
1702
+ endTime: rules.endTime,
1703
+ subregistryId: rules.subregistryId,
1704
+ rulesUrl: rules.rulesUrl.toString(),
1705
+ areAwardsDistributed: rules.areAwardsDistributed,
1706
+ adminActions: rules.adminActions
1707
+ };
1708
+ }
1709
+ function serializeAggregatedReferrerMetricsRevShareCap(metrics) {
1710
+ return {
1711
+ grandTotalReferrals: metrics.grandTotalReferrals,
1712
+ grandTotalIncrementalDuration: metrics.grandTotalIncrementalDuration,
1713
+ grandTotalRevenueContribution: serializePriceEth(metrics.grandTotalRevenueContribution),
1714
+ awardPoolRemaining: serializePriceUsdc(metrics.awardPoolRemaining)
1715
+ };
1716
+ }
1717
+ function serializeAwardedReferrerMetricsRevShareCap(metrics) {
1718
+ return {
1719
+ referrer: metrics.referrer,
1720
+ totalReferrals: metrics.totalReferrals,
1721
+ totalIncrementalDuration: metrics.totalIncrementalDuration,
1722
+ totalRevenueContribution: serializePriceEth(metrics.totalRevenueContribution),
1723
+ totalBaseRevenueContribution: serializePriceUsdc(metrics.totalBaseRevenueContribution),
1724
+ rank: metrics.rank,
1725
+ isQualified: metrics.isQualified,
1726
+ uncappedAward: serializePriceUsdc(metrics.uncappedAward),
1727
+ cappedAward: serializePriceUsdc(metrics.cappedAward),
1728
+ adminAction: metrics.adminAction
1729
+ };
1730
+ }
1731
+ function serializeUnrankedReferrerMetricsRevShareCap(metrics) {
1732
+ return {
1733
+ referrer: metrics.referrer,
1734
+ totalReferrals: metrics.totalReferrals,
1735
+ totalIncrementalDuration: metrics.totalIncrementalDuration,
1736
+ totalRevenueContribution: serializePriceEth(metrics.totalRevenueContribution),
1737
+ totalBaseRevenueContribution: serializePriceUsdc(metrics.totalBaseRevenueContribution),
1738
+ rank: metrics.rank,
1739
+ isQualified: metrics.isQualified,
1740
+ uncappedAward: serializePriceUsdc(metrics.uncappedAward),
1741
+ cappedAward: serializePriceUsdc(metrics.cappedAward),
1742
+ adminAction: metrics.adminAction
1743
+ };
1744
+ }
1745
+ function serializeReferrerEditionMetricsRankedRevShareCap(detail) {
1746
+ return {
1747
+ awardModel: detail.awardModel,
1748
+ type: detail.type,
1749
+ rules: serializeReferralProgramRulesRevShareCap(detail.rules),
1750
+ referrer: serializeAwardedReferrerMetricsRevShareCap(detail.referrer),
1751
+ aggregatedMetrics: serializeAggregatedReferrerMetricsRevShareCap(detail.aggregatedMetrics),
1752
+ status: detail.status,
1753
+ accurateAsOf: detail.accurateAsOf
1754
+ };
1755
+ }
1756
+ function serializeReferrerEditionMetricsUnrankedRevShareCap(detail) {
1757
+ return {
1758
+ awardModel: detail.awardModel,
1759
+ type: detail.type,
1760
+ rules: serializeReferralProgramRulesRevShareCap(detail.rules),
1761
+ referrer: serializeUnrankedReferrerMetricsRevShareCap(detail.referrer),
1762
+ aggregatedMetrics: serializeAggregatedReferrerMetricsRevShareCap(detail.aggregatedMetrics),
1763
+ status: detail.status,
1764
+ accurateAsOf: detail.accurateAsOf
1765
+ };
1766
+ }
1767
+ function serializeReferrerEditionMetricsRevShareCap(detail) {
1768
+ switch (detail.type) {
1769
+ case ReferrerEditionMetricsTypeIds.Ranked:
1770
+ return serializeReferrerEditionMetricsRankedRevShareCap(detail);
1771
+ case ReferrerEditionMetricsTypeIds.Unranked:
1772
+ return serializeReferrerEditionMetricsUnrankedRevShareCap(detail);
1773
+ default: {
1774
+ const _exhaustiveCheck = detail;
1775
+ throw new Error(
1776
+ `Unknown type: ${_exhaustiveCheck.type}`
1777
+ );
1778
+ }
1779
+ }
1780
+ }
1781
+ function serializeReferrerLeaderboardPageRevShareCap(page) {
1782
+ return {
1783
+ awardModel: page.awardModel,
1784
+ rules: serializeReferralProgramRulesRevShareCap(page.rules),
1785
+ referrers: page.referrers.map(serializeAwardedReferrerMetricsRevShareCap),
1786
+ aggregatedMetrics: serializeAggregatedReferrerMetricsRevShareCap(page.aggregatedMetrics),
1787
+ pageContext: page.pageContext,
1788
+ status: page.status,
1789
+ accurateAsOf: page.accurateAsOf
1790
+ };
1791
+ }
1792
+ function serializeReferralProgramEditionSummaryRevShareCap(summary) {
1793
+ return {
1794
+ awardModel: summary.awardModel,
1795
+ slug: summary.slug,
1796
+ displayName: summary.displayName,
1797
+ status: summary.status,
1798
+ rules: serializeReferralProgramRulesRevShareCap(summary.rules),
1799
+ awardPoolRemaining: serializePriceUsdc(summary.awardPoolRemaining)
1800
+ };
1801
+ }
1802
+
1803
+ // src/api/serialize.ts
1804
+ function serializeReferralProgramRules(rules) {
1805
+ switch (rules.awardModel) {
1806
+ case ReferralProgramAwardModels.PieSplit:
1807
+ return serializeReferralProgramRulesPieSplit(rules);
1808
+ case ReferralProgramAwardModels.RevShareCap:
1809
+ return serializeReferralProgramRulesRevShareCap(rules);
1810
+ case ReferralProgramAwardModels.Unrecognized: {
1811
+ const unrecognized = rules;
1812
+ throw new Error(
1813
+ `ReferralProgramRulesUnrecognized (originalAwardModel: '${unrecognized.originalAwardModel}') must not be serialized \u2014 it is a client-side forward-compatibility placeholder only.`
1814
+ );
1815
+ }
1816
+ default: {
1817
+ const _exhaustiveCheck = rules;
1818
+ throw new Error(
1819
+ `Unknown award model: ${_exhaustiveCheck.awardModel}`
1820
+ );
1821
+ }
1822
+ }
1823
+ }
1824
+ function serializeReferrerLeaderboardPage(page) {
1825
+ switch (page.awardModel) {
1826
+ case ReferralProgramAwardModels.PieSplit:
1827
+ return serializeReferrerLeaderboardPagePieSplit(page);
1828
+ case ReferralProgramAwardModels.RevShareCap:
1829
+ return serializeReferrerLeaderboardPageRevShareCap(page);
1830
+ case ReferralProgramAwardModels.Unrecognized: {
1831
+ const unrecognized = page;
1832
+ throw new Error(
1833
+ `ReferrerLeaderboardPageUnrecognized (originalAwardModel: '${unrecognized.originalAwardModel}') must not be serialized \u2014 it is a client-side forward-compatibility placeholder only.`
1834
+ );
1835
+ }
1836
+ default: {
1837
+ const _exhaustiveCheck = page;
1838
+ throw new Error(
1839
+ `Unknown award model: ${_exhaustiveCheck.awardModel}`
1840
+ );
1841
+ }
1842
+ }
1843
+ }
1844
+ function serializeReferrerEditionMetrics(detail) {
1845
+ switch (detail.awardModel) {
1846
+ case ReferralProgramAwardModels.PieSplit:
1847
+ return serializeReferrerEditionMetricsPieSplit(detail);
1848
+ case ReferralProgramAwardModels.RevShareCap:
1849
+ return serializeReferrerEditionMetricsRevShareCap(detail);
1850
+ case ReferralProgramAwardModels.Unrecognized: {
1851
+ const unrecognized = detail;
1852
+ throw new Error(
1853
+ `ReferrerEditionMetricsUnrecognized (originalAwardModel: '${unrecognized.originalAwardModel}') must not be serialized \u2014 it is a client-side forward-compatibility placeholder only.`
1854
+ );
1855
+ }
1856
+ default: {
1857
+ const _exhaustiveCheck = detail;
1858
+ throw new Error(
1859
+ `Unknown award model: ${_exhaustiveCheck.awardModel}`
1860
+ );
1861
+ }
1862
+ }
1863
+ }
1864
+ function serializeReferralProgramEditionSummary(summary) {
1865
+ switch (summary.awardModel) {
1866
+ case ReferralProgramAwardModels.PieSplit:
1867
+ return serializeReferralProgramEditionSummaryPieSplit(summary);
1868
+ case ReferralProgramAwardModels.RevShareCap:
1869
+ return serializeReferralProgramEditionSummaryRevShareCap(summary);
1870
+ case ReferralProgramAwardModels.Unrecognized: {
1871
+ const unrecognized = summary;
1872
+ throw new Error(
1873
+ `ReferralProgramEditionSummaryUnrecognized (originalAwardModel: '${unrecognized.rules.originalAwardModel}') must not be serialized \u2014 it is a client-side forward-compatibility placeholder only.`
1874
+ );
1875
+ }
1876
+ default: {
1877
+ const _exhaustiveCheck = summary;
1878
+ throw new Error(
1879
+ `Unknown award model: ${_exhaustiveCheck.awardModel}`
1880
+ );
1881
+ }
1882
+ }
1883
+ }
1884
+ function serializeReferrerLeaderboardPageResponse(response) {
1885
+ switch (response.responseCode) {
1886
+ case ReferrerLeaderboardPageResponseCodes.Ok:
1887
+ return {
1888
+ responseCode: response.responseCode,
1889
+ data: serializeReferrerLeaderboardPage(response.data)
1890
+ };
1891
+ case ReferrerLeaderboardPageResponseCodes.Error:
1892
+ return response;
1893
+ }
1894
+ }
1895
+ function serializeReferrerMetricsEditionsResponse(response) {
1896
+ switch (response.responseCode) {
1897
+ case ReferrerMetricsEditionsResponseCodes.Ok: {
1898
+ const serializedData = Object.fromEntries(
1899
+ Object.entries(response.data).map(([editionSlug, detail]) => [
1900
+ editionSlug,
1901
+ serializeReferrerEditionMetrics(detail)
1902
+ ])
1903
+ );
1904
+ return {
1905
+ responseCode: response.responseCode,
1906
+ data: serializedData
1907
+ };
1908
+ }
1909
+ case ReferrerMetricsEditionsResponseCodes.Error:
1910
+ return response;
1911
+ default: {
1912
+ const _exhaustiveCheck = response;
1913
+ throw new Error(
1914
+ `Unknown response code: ${_exhaustiveCheck.responseCode}`
1915
+ );
1916
+ }
1917
+ }
1918
+ }
1919
+ function serializeReferralProgramEditionSummariesResponse(response) {
1920
+ switch (response.responseCode) {
1921
+ case ReferralProgramEditionSummariesResponseCodes.Ok:
1922
+ return {
1923
+ responseCode: response.responseCode,
1924
+ data: {
1925
+ editions: response.data.editions.map(serializeReferralProgramEditionSummary)
1926
+ }
1927
+ };
1928
+ case ReferralProgramEditionSummariesResponseCodes.Error:
1929
+ return response;
1930
+ default: {
1931
+ const _exhaustiveCheck = response;
1932
+ throw new Error(
1933
+ `Unknown response code: ${_exhaustiveCheck.responseCode}`
1934
+ );
1935
+ }
1936
+ }
1937
+ }
1938
+
1939
+ // src/award-models/shared/score.ts
1940
+ var isValidReferrerScore = (score) => {
1941
+ return score >= 0 && Number.isFinite(score);
1942
+ };
1943
+ var validateReferrerScore = (score) => {
1944
+ if (!isValidReferrerScore(score)) {
1945
+ throw new Error(
1946
+ `Invalid referrer score: ${score}. Referrer score must be a finite non-negative number.`
1947
+ );
1948
+ }
1949
+ };
1950
+
1951
+ // src/award-models/pie-split/aggregations.ts
1952
+ var validateAggregatedReferrerMetricsPieSplit = (metrics) => {
1953
+ validateNonNegativeInteger(metrics.grandTotalReferrals);
1954
+ validateDuration(metrics.grandTotalIncrementalDuration);
1955
+ makePriceEthSchema("AggregatedReferrerMetricsPieSplit.grandTotalRevenueContribution").parse(
1956
+ metrics.grandTotalRevenueContribution
1957
+ );
1958
+ validateReferrerScore(metrics.grandTotalQualifiedReferrersFinalScore);
1959
+ validateReferrerScore(metrics.minFinalScoreToQualify);
1960
+ };
1961
+ var buildAggregatedReferrerMetricsPieSplit = (referrers, rules) => {
1962
+ let grandTotalReferrals = 0;
1963
+ let grandTotalIncrementalDuration = 0;
1964
+ let grandTotalRevenueContributionAmount = 0n;
1965
+ let grandTotalQualifiedReferrersFinalScore = 0;
1966
+ let minFinalScoreToQualify = Number.MAX_SAFE_INTEGER;
1967
+ for (const referrer of referrers) {
1968
+ grandTotalReferrals += referrer.totalReferrals;
1969
+ grandTotalIncrementalDuration += referrer.totalIncrementalDuration;
1970
+ grandTotalRevenueContributionAmount += referrer.totalRevenueContribution.amount;
1971
+ if (referrer.isQualified) {
1972
+ grandTotalQualifiedReferrersFinalScore += referrer.finalScore;
1973
+ if (referrer.finalScore < minFinalScoreToQualify) {
1974
+ minFinalScoreToQualify = referrer.finalScore;
1975
+ }
1976
+ }
1977
+ }
1978
+ if (minFinalScoreToQualify === Number.MAX_SAFE_INTEGER) {
1979
+ if (rules.maxQualifiedReferrers === 0) {
1980
+ } else {
1981
+ if (referrers.length !== 0) {
1982
+ throw new Error(
1983
+ "AggregatedReferrerMetricsPieSplit: There are referrers on the leaderboard, and the rules allow for qualified referrers, but no qualified referrers."
1984
+ );
1985
+ }
1986
+ minFinalScoreToQualify = 0;
1987
+ }
1988
+ }
1989
+ const result = {
1990
+ grandTotalReferrals,
1991
+ grandTotalIncrementalDuration,
1992
+ grandTotalRevenueContribution: priceEth(grandTotalRevenueContributionAmount),
1993
+ grandTotalQualifiedReferrersFinalScore,
1994
+ minFinalScoreToQualify
1995
+ };
1996
+ validateAggregatedReferrerMetricsPieSplit(result);
1997
+ return result;
1998
+ };
1999
+
2000
+ // src/edition.ts
2001
+ var REFERRAL_PROGRAM_EDITION_SLUG_PATTERN = /^[a-z0-9]+(-[a-z0-9]+)*$/;
2002
+ function validateReferralProgramEditionConfigSet(configSet) {
2003
+ const violation = Array.from(configSet.entries()).find(([key, config]) => key !== config.slug);
2004
+ if (violation) {
2005
+ const [key, config] = violation;
2006
+ throw new Error(
2007
+ `Edition config set invariant violation: map key "${key}" does not match config.slug "${config.slug}"`
2008
+ );
2009
+ }
2010
+ }
2011
+ function buildReferralProgramEditionConfigSet(configs) {
2012
+ const slugCounts = configs.reduce((counts, config) => {
2013
+ counts.set(config.slug, (counts.get(config.slug) || 0) + 1);
2014
+ return counts;
2015
+ }, /* @__PURE__ */ new Map());
2016
+ const duplicates = Array.from(slugCounts.entries()).filter(([_, count]) => count > 1).map(([slug, count]) => `"${slug}" (${count} occurrences)`);
2017
+ if (duplicates.length > 0) {
2018
+ throw new Error(`Duplicate edition config slugs detected: ${duplicates.join(", ")}`);
2019
+ }
2020
+ const configSet = new Map(configs.map((config) => [config.slug, config]));
2021
+ validateReferralProgramEditionConfigSet(configSet);
2022
+ return configSet;
2023
+ }
2024
+
2025
+ // src/award-models/shared/edition-summary.ts
2026
+ var validateBaseReferralProgramEditionSummary = (summary) => {
2027
+ if (!REFERRAL_PROGRAM_EDITION_SLUG_PATTERN.test(summary.slug)) {
2028
+ throw new Error(
2029
+ `BaseReferralProgramEditionSummary: slug "${summary.slug}" does not match required pattern ${REFERRAL_PROGRAM_EDITION_SLUG_PATTERN}.`
2030
+ );
2031
+ }
2032
+ if (summary.displayName.length === 0) {
2033
+ throw new Error("BaseReferralProgramEditionSummary: displayName must not be empty.");
2034
+ }
2035
+ if (summary.awardModel !== summary.rules.awardModel) {
2036
+ throw new Error(
2037
+ `BaseReferralProgramEditionSummary: awardModel (${summary.awardModel}) must equal rules.awardModel (${summary.rules.awardModel}).`
2038
+ );
2039
+ }
2040
+ };
2041
+
2042
+ // src/award-models/pie-split/rules.ts
2043
+ var validateReferralProgramRulesPieSplit = (rules) => {
2044
+ makePriceUsdcSchema("ReferralProgramRulesPieSplit.awardPool").parse(rules.awardPool);
2045
+ validateNonNegativeInteger(rules.maxQualifiedReferrers);
2046
+ validateBaseReferralProgramRules(rules);
2047
+ };
2048
+ var buildReferralProgramRulesPieSplit = (awardPool, maxQualifiedReferrers, startTime, endTime, subregistryId, rulesUrl, areAwardsDistributed) => {
2049
+ const result = {
2050
+ awardModel: ReferralProgramAwardModels.PieSplit,
2051
+ awardPool,
2052
+ maxQualifiedReferrers,
2053
+ startTime,
2054
+ endTime,
2055
+ subregistryId,
2056
+ rulesUrl,
2057
+ areAwardsDistributed
2058
+ };
2059
+ validateReferralProgramRulesPieSplit(result);
2060
+ return result;
2061
+ };
2062
+
2063
+ // src/award-models/pie-split/status.ts
2064
+ var calcReferralProgramEditionStatusPieSplit = (rules, now) => calcBaseReferralProgramEditionStatus(rules, now);
2065
+
2066
+ // src/award-models/pie-split/edition-summary.ts
2067
+ var validateEditionSummaryPieSplit = (summary) => {
2068
+ validateReferralProgramRulesPieSplit(summary.rules);
2069
+ validateBaseReferralProgramEditionSummary(summary);
2070
+ };
2071
+ function buildEditionSummaryPieSplit(slug, displayName, rules, leaderboard) {
2072
+ const status = calcReferralProgramEditionStatusPieSplit(rules, leaderboard.accurateAsOf);
2073
+ const result = { awardModel: rules.awardModel, slug, displayName, status, rules };
2074
+ validateEditionSummaryPieSplit(result);
2075
+ return result;
2076
+ }
2077
+
2078
+ // src/award-models/shared/leaderboard-guards.ts
2079
+ var assertLeaderboardInputs = (allReferrers, rules, accurateAsOf) => {
2080
+ const uniqueReferrers = new Set(allReferrers.map((r) => r.referrer));
2081
+ if (uniqueReferrers.size !== allReferrers.length) {
2082
+ throw new Error(
2083
+ "ReferrerLeaderboard: Cannot build a leaderboard containing duplicate referrers"
2084
+ );
2085
+ }
2086
+ if (accurateAsOf < rules.startTime && allReferrers.length > 0) {
2087
+ throw new Error(
2088
+ `ReferrerLeaderboard: accurateAsOf (${accurateAsOf}) is before startTime (${rules.startTime}) which indicates allReferrers should be empty, but allReferrers is not empty.`
2089
+ );
2090
+ }
2091
+ };
2092
+
2093
+ // src/award-models/shared/rank.ts
2094
+ var validateReferrerRank = (rank) => {
2095
+ if (!isPositiveInteger(rank)) {
2096
+ throw new Error(`Invalid ReferrerRank: ${rank}. ReferrerRank must be a positive integer.`);
2097
+ }
2098
+ };
2099
+ var compareReferrerMetrics = (a, b) => {
2100
+ if (a.totalIncrementalDuration !== b.totalIncrementalDuration) {
2101
+ return b.totalIncrementalDuration - a.totalIncrementalDuration;
2102
+ }
2103
+ if (b.referrer > a.referrer) return 1;
2104
+ if (b.referrer < a.referrer) return -1;
2105
+ return 0;
2106
+ };
2107
+ var sortReferrerMetrics = (referrers) => {
2108
+ return [...referrers].sort(compareReferrerMetrics);
2109
+ };
2110
+
2111
+ // src/referrer-metrics.ts
2112
+ var buildReferrerMetrics = (referrer, totalReferrals, totalIncrementalDuration, totalRevenueContribution) => {
2113
+ const result = {
2114
+ referrer,
2115
+ totalReferrals,
2116
+ totalIncrementalDuration,
2117
+ totalRevenueContribution
2118
+ };
714
2119
  validateReferrerMetrics(result);
715
2120
  return result;
716
2121
  };
717
2122
  var validateReferrerMetrics = (metrics) => {
718
- validateLowercaseAddress(metrics.referrer);
2123
+ validateNormalizedAddress(metrics.referrer);
719
2124
  validateNonNegativeInteger(metrics.totalReferrals);
720
2125
  validateDuration(metrics.totalIncrementalDuration);
721
- validateRevenueContribution(metrics.totalRevenueContribution);
2126
+ makePriceEthSchema("ReferrerMetrics.totalRevenueContribution").parse(
2127
+ metrics.totalRevenueContribution
2128
+ );
722
2129
  };
723
- var sortReferrerMetrics = (referrers) => {
724
- return [...referrers].sort(compareReferrerMetrics);
2130
+
2131
+ // src/award-models/pie-split/score.ts
2132
+ var calcReferrerScorePieSplit = (totalIncrementalDuration) => {
2133
+ return totalIncrementalDuration / SECONDS_PER_YEAR;
725
2134
  };
726
- var buildScoredReferrerMetrics = (referrer) => {
2135
+
2136
+ // src/award-models/pie-split/rank.ts
2137
+ function isReferrerQualifiedPieSplit(rank, rules) {
2138
+ return rank <= rules.maxQualifiedReferrers;
2139
+ }
2140
+ function calcReferrerFinalScoreBoostPieSplit(rank, rules) {
2141
+ if (!isReferrerQualifiedPieSplit(rank, rules)) return 0;
2142
+ if (rules.maxQualifiedReferrers === 1) return 1;
2143
+ return 1 - (rank - 1) / (rules.maxQualifiedReferrers - 1);
2144
+ }
2145
+ function calcReferrerFinalScoreMultiplierPieSplit(rank, rules) {
2146
+ return 1 + calcReferrerFinalScoreBoostPieSplit(rank, rules);
2147
+ }
2148
+ function calcReferrerFinalScorePieSplit(rank, totalIncrementalDuration, rules) {
2149
+ return calcReferrerScorePieSplit(totalIncrementalDuration) * calcReferrerFinalScoreMultiplierPieSplit(rank, rules);
2150
+ }
2151
+
2152
+ // src/award-models/pie-split/metrics.ts
2153
+ var buildScoredReferrerMetricsPieSplit = (referrer) => {
727
2154
  const result = {
728
2155
  ...referrer,
729
- score: calcReferrerScore(referrer.totalIncrementalDuration)
2156
+ score: calcReferrerScorePieSplit(referrer.totalIncrementalDuration)
730
2157
  };
731
- validateScoredReferrerMetrics(result);
2158
+ validateScoredReferrerMetricsPieSplit(result);
732
2159
  return result;
733
2160
  };
734
- var validateScoredReferrerMetrics = (metrics) => {
2161
+ var validateScoredReferrerMetricsPieSplit = (metrics) => {
735
2162
  validateReferrerMetrics(metrics);
736
2163
  validateReferrerScore(metrics.score);
737
- const expectedScore = calcReferrerScore(metrics.totalIncrementalDuration);
2164
+ const expectedScore = calcReferrerScorePieSplit(metrics.totalIncrementalDuration);
738
2165
  if (metrics.score !== expectedScore) {
739
2166
  throw new Error(`Referrer: Invalid score: ${metrics.score}, expected: ${expectedScore}.`);
740
2167
  }
741
2168
  };
742
- var validateRankedReferrerMetrics = (metrics, rules) => {
743
- validateScoredReferrerMetrics(metrics);
2169
+ var validateRankedReferrerMetricsPieSplit = (metrics, rules) => {
2170
+ validateScoredReferrerMetricsPieSplit(metrics);
744
2171
  validateReferrerRank(metrics.rank);
745
2172
  if (metrics.finalScoreBoost < 0 || metrics.finalScoreBoost > 1) {
746
2173
  throw new Error(
747
- `Invalid RankedReferrerMetrics: Invalid finalScoreBoost: ${metrics.finalScoreBoost}. finalScoreBoost must be between 0 and 1 (inclusive).`
2174
+ `Invalid RankedReferrerMetricsPieSplit: Invalid finalScoreBoost: ${metrics.finalScoreBoost}. finalScoreBoost must be between 0 and 1 (inclusive).`
748
2175
  );
749
2176
  }
750
2177
  validateReferrerScore(metrics.finalScore);
751
- const expectedIsQualified = isReferrerQualified(metrics.rank, rules);
2178
+ const expectedIsQualified = isReferrerQualifiedPieSplit(metrics.rank, rules);
752
2179
  if (metrics.isQualified !== expectedIsQualified) {
753
2180
  throw new Error(
754
- `RankedReferrerMetrics: Invalid isQualified: ${metrics.isQualified}, expected: ${expectedIsQualified}.`
2181
+ `RankedReferrerMetricsPieSplit: Invalid isQualified: ${metrics.isQualified}, expected: ${expectedIsQualified}.`
755
2182
  );
756
2183
  }
757
- const expectedFinalScoreBoost = calcReferrerFinalScoreBoost(metrics.rank, rules);
2184
+ const expectedFinalScoreBoost = calcReferrerFinalScoreBoostPieSplit(metrics.rank, rules);
758
2185
  if (metrics.finalScoreBoost !== expectedFinalScoreBoost) {
759
2186
  throw new Error(
760
- `RankedReferrerMetrics: Invalid finalScoreBoost: ${metrics.finalScoreBoost}, expected: ${expectedFinalScoreBoost}.`
2187
+ `RankedReferrerMetricsPieSplit: Invalid finalScoreBoost: ${metrics.finalScoreBoost}, expected: ${expectedFinalScoreBoost}.`
761
2188
  );
762
2189
  }
763
- const expectedFinalScore = calcReferrerFinalScore(
2190
+ const expectedFinalScore = calcReferrerFinalScorePieSplit(
764
2191
  metrics.rank,
765
2192
  metrics.totalIncrementalDuration,
766
2193
  rules
767
2194
  );
768
2195
  if (metrics.finalScore !== expectedFinalScore) {
769
2196
  throw new Error(
770
- `RankedReferrerMetrics: Invalid finalScore: ${metrics.finalScore}, expected: ${expectedFinalScore}.`
2197
+ `RankedReferrerMetricsPieSplit: Invalid finalScore: ${metrics.finalScore}, expected: ${expectedFinalScore}.`
771
2198
  );
772
2199
  }
773
2200
  };
774
- var buildRankedReferrerMetrics = (referrer, rank, rules) => {
2201
+ var buildRankedReferrerMetricsPieSplit = (referrer, rank, rules) => {
775
2202
  const result = {
776
2203
  ...referrer,
777
2204
  rank,
778
- isQualified: isReferrerQualified(rank, rules),
779
- finalScoreBoost: calcReferrerFinalScoreBoost(rank, rules),
780
- finalScore: calcReferrerFinalScore(rank, referrer.totalIncrementalDuration, rules)
2205
+ isQualified: isReferrerQualifiedPieSplit(rank, rules),
2206
+ finalScoreBoost: calcReferrerFinalScoreBoostPieSplit(rank, rules),
2207
+ finalScore: calcReferrerFinalScorePieSplit(rank, referrer.totalIncrementalDuration, rules)
781
2208
  };
782
- validateRankedReferrerMetrics(result, rules);
2209
+ validateRankedReferrerMetricsPieSplit(result, rules);
783
2210
  return result;
784
2211
  };
785
- var calcReferrerAwardPoolShare = (referrer, aggregatedMetrics, rules) => {
786
- if (!isReferrerQualified(referrer.rank, rules)) return 0;
2212
+ var calcReferrerAwardPoolSharePieSplit = (referrer, aggregatedMetrics) => {
2213
+ if (!referrer.isQualified) return 0;
787
2214
  if (aggregatedMetrics.grandTotalQualifiedReferrersFinalScore === 0) return 0;
788
- return calcReferrerFinalScore(referrer.rank, referrer.totalIncrementalDuration, rules) / aggregatedMetrics.grandTotalQualifiedReferrersFinalScore;
2215
+ return referrer.finalScore / aggregatedMetrics.grandTotalQualifiedReferrersFinalScore;
789
2216
  };
790
- var validateAwardedReferrerMetrics = (referrer, rules) => {
791
- validateRankedReferrerMetrics(referrer, rules);
2217
+ var validateAwardedReferrerMetricsPieSplit = (referrer, rules) => {
2218
+ validateRankedReferrerMetricsPieSplit(referrer, rules);
792
2219
  if (referrer.awardPoolShare < 0 || referrer.awardPoolShare > 1) {
793
2220
  throw new Error(
794
- `Invalid AwardedReferrerMetrics: ${referrer.awardPoolShare}. awardPoolShare must be between 0 and 1 (inclusive).`
2221
+ `Invalid AwardedReferrerMetricsPieSplit: ${referrer.awardPoolShare}. awardPoolShare must be between 0 and 1 (inclusive).`
795
2222
  );
796
2223
  }
797
- if (referrer.awardPoolApproxValue < 0 || referrer.awardPoolApproxValue > rules.totalAwardPoolValue) {
2224
+ makePriceUsdcSchema("AwardedReferrerMetricsPieSplit.awardPoolApproxValue").parse(
2225
+ referrer.awardPoolApproxValue
2226
+ );
2227
+ if (referrer.awardPoolApproxValue.amount > rules.awardPool.amount) {
798
2228
  throw new Error(
799
- `Invalid AwardedReferrerMetrics: ${referrer.awardPoolApproxValue}. awardPoolApproxValue must be between 0 and ${rules.totalAwardPoolValue} (inclusive).`
2229
+ `AwardedReferrerMetricsPieSplit: awardPoolApproxValue.amount ${referrer.awardPoolApproxValue.amount.toString()} exceeds awardPool.amount ${rules.awardPool.amount.toString()}.`
800
2230
  );
801
2231
  }
802
2232
  };
803
- var buildAwardedReferrerMetrics = (referrer, aggregatedMetrics, rules) => {
804
- const awardPoolShare = calcReferrerAwardPoolShare(referrer, aggregatedMetrics, rules);
2233
+ var buildAwardedReferrerMetricsPieSplit = (referrer, aggregatedMetrics, rules) => {
2234
+ const awardPoolShare = calcReferrerAwardPoolSharePieSplit(referrer, aggregatedMetrics);
2235
+ const awardPoolApproxValue = scalePrice(rules.awardPool, awardPoolShare);
805
2236
  const result = {
806
2237
  ...referrer,
807
2238
  awardPoolShare,
808
- awardPoolApproxValue: awardPoolShare * rules.totalAwardPoolValue
2239
+ awardPoolApproxValue
809
2240
  };
810
- validateAwardedReferrerMetrics(result, rules);
2241
+ validateAwardedReferrerMetricsPieSplit(result, rules);
811
2242
  return result;
812
2243
  };
813
- var validateUnrankedReferrerMetrics = (metrics) => {
814
- validateScoredReferrerMetrics(metrics);
2244
+ var validateUnrankedReferrerMetricsPieSplit = (metrics) => {
2245
+ validateScoredReferrerMetricsPieSplit(metrics);
815
2246
  if (metrics.rank !== null) {
816
- throw new Error(`Invalid UnrankedReferrerMetrics: rank must be null, got: ${metrics.rank}.`);
2247
+ throw new Error(
2248
+ `Invalid UnrankedReferrerMetricsPieSplit: rank must be null, got: ${metrics.rank}.`
2249
+ );
817
2250
  }
818
2251
  if (metrics.isQualified !== false) {
819
2252
  throw new Error(
820
- `Invalid UnrankedReferrerMetrics: isQualified must be false, got: ${metrics.isQualified}.`
2253
+ `Invalid UnrankedReferrerMetricsPieSplit: isQualified must be false, got: ${metrics.isQualified}.`
821
2254
  );
822
2255
  }
823
2256
  if (metrics.totalReferrals !== 0) {
824
2257
  throw new Error(
825
- `Invalid UnrankedReferrerMetrics: totalReferrals must be 0, got: ${metrics.totalReferrals}.`
2258
+ `Invalid UnrankedReferrerMetricsPieSplit: totalReferrals must be 0, got: ${metrics.totalReferrals}.`
826
2259
  );
827
2260
  }
828
2261
  if (metrics.totalIncrementalDuration !== 0) {
829
2262
  throw new Error(
830
- `Invalid UnrankedReferrerMetrics: totalIncrementalDuration must be 0, got: ${metrics.totalIncrementalDuration}.`
2263
+ `Invalid UnrankedReferrerMetricsPieSplit: totalIncrementalDuration must be 0, got: ${metrics.totalIncrementalDuration}.`
831
2264
  );
832
2265
  }
833
- if (metrics.totalRevenueContribution !== 0n) {
2266
+ makePriceEthSchema("UnrankedReferrerMetricsPieSplit.totalRevenueContribution").parse(
2267
+ metrics.totalRevenueContribution
2268
+ );
2269
+ if (metrics.totalRevenueContribution.amount !== 0n) {
834
2270
  throw new Error(
835
- `Invalid UnrankedReferrerMetrics: totalRevenueContribution must be 0n, got: ${metrics.totalRevenueContribution.toString()}.`
2271
+ `Invalid UnrankedReferrerMetricsPieSplit: totalRevenueContribution.amount must be 0n, got: ${metrics.totalRevenueContribution.amount.toString()}.`
836
2272
  );
837
2273
  }
838
2274
  if (metrics.score !== 0) {
839
- throw new Error(`Invalid UnrankedReferrerMetrics: score must be 0, got: ${metrics.score}.`);
2275
+ throw new Error(
2276
+ `Invalid UnrankedReferrerMetricsPieSplit: score must be 0, got: ${metrics.score}.`
2277
+ );
840
2278
  }
841
2279
  if (metrics.finalScoreBoost !== 0) {
842
2280
  throw new Error(
843
- `Invalid UnrankedReferrerMetrics: finalScoreBoost must be 0, got: ${metrics.finalScoreBoost}.`
2281
+ `Invalid UnrankedReferrerMetricsPieSplit: finalScoreBoost must be 0, got: ${metrics.finalScoreBoost}.`
844
2282
  );
845
2283
  }
846
2284
  if (metrics.finalScore !== 0) {
847
2285
  throw new Error(
848
- `Invalid UnrankedReferrerMetrics: finalScore must be 0, got: ${metrics.finalScore}.`
2286
+ `Invalid UnrankedReferrerMetricsPieSplit: finalScore must be 0, got: ${metrics.finalScore}.`
849
2287
  );
850
2288
  }
851
2289
  if (metrics.awardPoolShare !== 0) {
852
2290
  throw new Error(
853
- `Invalid UnrankedReferrerMetrics: awardPoolShare must be 0, got: ${metrics.awardPoolShare}.`
2291
+ `Invalid UnrankedReferrerMetricsPieSplit: awardPoolShare must be 0, got: ${metrics.awardPoolShare}.`
854
2292
  );
855
2293
  }
856
- if (metrics.awardPoolApproxValue !== 0) {
2294
+ makePriceUsdcSchema("UnrankedReferrerMetricsPieSplit.awardPoolApproxValue").parse(
2295
+ metrics.awardPoolApproxValue
2296
+ );
2297
+ if (metrics.awardPoolApproxValue.amount !== 0n) {
857
2298
  throw new Error(
858
- `Invalid UnrankedReferrerMetrics: awardPoolApproxValue must be 0, got: ${metrics.awardPoolApproxValue}.`
2299
+ `Invalid UnrankedReferrerMetricsPieSplit: awardPoolApproxValue must be 0n, got: ${metrics.awardPoolApproxValue.amount.toString()}.`
859
2300
  );
860
2301
  }
861
2302
  };
862
- var buildUnrankedReferrerMetrics = (referrer) => {
863
- const baseMetrics = buildReferrerMetrics(referrer, 0, 0, 0n);
864
- const scoredMetrics = buildScoredReferrerMetrics(baseMetrics);
2303
+ var buildUnrankedReferrerMetricsPieSplit = (referrer) => {
2304
+ const metrics = buildReferrerMetrics(referrer, 0, 0, priceEth(0n));
2305
+ const scoredMetrics = buildScoredReferrerMetricsPieSplit(metrics);
865
2306
  const result = {
866
2307
  ...scoredMetrics,
867
2308
  rank: null,
@@ -869,438 +2310,409 @@ var buildUnrankedReferrerMetrics = (referrer) => {
869
2310
  finalScoreBoost: 0,
870
2311
  finalScore: 0,
871
2312
  awardPoolShare: 0,
872
- awardPoolApproxValue: 0
2313
+ awardPoolApproxValue: priceUsdc(0n)
873
2314
  };
874
- validateUnrankedReferrerMetrics(result);
2315
+ validateUnrankedReferrerMetricsPieSplit(result);
875
2316
  return result;
876
2317
  };
877
2318
 
878
- // src/referrer-detail.ts
879
- var ReferrerDetailTypeIds = {
880
- /**
881
- * Represents a referrer who is ranked on the leaderboard.
882
- */
883
- Ranked: "ranked",
884
- /**
885
- * Represents a referrer who is not ranked on the leaderboard.
886
- */
887
- Unranked: "unranked"
2319
+ // src/award-models/pie-split/leaderboard.ts
2320
+ var buildReferrerLeaderboardPieSplit = (allReferrers, rules, accurateAsOf) => {
2321
+ assertLeaderboardInputs(allReferrers, rules, accurateAsOf);
2322
+ const sortedReferrers = sortReferrerMetrics(allReferrers);
2323
+ const scoredReferrers = sortedReferrers.map((r) => buildScoredReferrerMetricsPieSplit(r));
2324
+ const rankedReferrers = scoredReferrers.map(
2325
+ (r, index) => buildRankedReferrerMetricsPieSplit(r, index + 1, rules)
2326
+ );
2327
+ const aggregatedMetrics = buildAggregatedReferrerMetricsPieSplit(rankedReferrers, rules);
2328
+ const awardedReferrers = rankedReferrers.map(
2329
+ (r) => buildAwardedReferrerMetricsPieSplit(r, aggregatedMetrics, rules)
2330
+ );
2331
+ const referrers = new Map(awardedReferrers.map((r) => [r.referrer, r]));
2332
+ return { awardModel: rules.awardModel, rules, aggregatedMetrics, referrers, accurateAsOf };
888
2333
  };
889
- var getReferrerDetail = (referrer, leaderboard) => {
890
- const awardedReferrerMetrics = leaderboard.referrers.get(referrer);
891
- if (awardedReferrerMetrics) {
892
- return {
893
- type: ReferrerDetailTypeIds.Ranked,
894
- rules: leaderboard.rules,
895
- referrer: awardedReferrerMetrics,
896
- aggregatedMetrics: leaderboard.aggregatedMetrics,
897
- accurateAsOf: leaderboard.accurateAsOf
898
- };
899
- }
2334
+
2335
+ // src/award-models/pie-split/leaderboard-page.ts
2336
+ function buildLeaderboardPagePieSplit(pageContext, leaderboard) {
2337
+ const status = calcReferralProgramEditionStatusPieSplit(
2338
+ leaderboard.rules,
2339
+ leaderboard.accurateAsOf
2340
+ );
900
2341
  return {
901
- type: ReferrerDetailTypeIds.Unranked,
2342
+ awardModel: leaderboard.awardModel,
902
2343
  rules: leaderboard.rules,
903
- referrer: buildUnrankedReferrerMetrics(referrer),
2344
+ referrers: sliceReferrers(leaderboard.referrers, pageContext),
904
2345
  aggregatedMetrics: leaderboard.aggregatedMetrics,
2346
+ pageContext,
2347
+ status,
905
2348
  accurateAsOf: leaderboard.accurateAsOf
906
2349
  };
907
- };
2350
+ }
908
2351
 
909
- // src/api/types.ts
910
- var ReferrerLeaderboardPageResponseCodes = {
911
- /**
912
- * Represents that the requested referrer leaderboard page is available.
913
- */
914
- Ok: "ok",
915
- /**
916
- * Represents that the referrer leaderboard data is not available.
917
- */
918
- Error: "error"
2352
+ // src/award-models/rev-share-cap/aggregations.ts
2353
+ var validateAggregatedReferrerMetricsRevShareCap = (metrics) => {
2354
+ validateNonNegativeInteger(metrics.grandTotalReferrals);
2355
+ validateDuration(metrics.grandTotalIncrementalDuration);
2356
+ makePriceEthSchema("AggregatedReferrerMetricsRevShareCap.grandTotalRevenueContribution").parse(
2357
+ metrics.grandTotalRevenueContribution
2358
+ );
2359
+ makePriceUsdcSchema("AggregatedReferrerMetricsRevShareCap.awardPoolRemaining").parse(
2360
+ metrics.awardPoolRemaining
2361
+ );
919
2362
  };
920
- var ReferrerDetailResponseCodes = {
921
- /**
922
- * Represents that the referrer detail data is available.
923
- */
924
- Ok: "ok",
925
- /**
926
- * Represents that an error occurred while fetching the data.
927
- */
928
- Error: "error"
2363
+ var buildAggregatedReferrerMetricsRevShareCap = (referrers, awardPoolRemaining) => {
2364
+ let grandTotalReferrals = 0;
2365
+ let grandTotalIncrementalDuration = 0;
2366
+ let grandTotalRevenueContributionAmount = 0n;
2367
+ for (const referrer of referrers) {
2368
+ grandTotalReferrals += referrer.totalReferrals;
2369
+ grandTotalIncrementalDuration += referrer.totalIncrementalDuration;
2370
+ grandTotalRevenueContributionAmount += referrer.totalRevenueContribution.amount;
2371
+ }
2372
+ const aggregatedMetrics = {
2373
+ grandTotalReferrals,
2374
+ grandTotalIncrementalDuration,
2375
+ grandTotalRevenueContribution: priceEth(grandTotalRevenueContributionAmount),
2376
+ awardPoolRemaining
2377
+ };
2378
+ validateAggregatedReferrerMetricsRevShareCap(aggregatedMetrics);
2379
+ return aggregatedMetrics;
929
2380
  };
930
2381
 
931
- // src/api/zod-schemas.ts
932
- var makeRevenueContributionSchema = (valueLabel = "RevenueContribution") => import_v42.z.coerce.bigint({
933
- error: `${valueLabel} must represent a bigint.`
934
- }).nonnegative({
935
- error: `${valueLabel} must not be negative.`
936
- });
937
- var makeReferralProgramRulesSchema = (valueLabel = "ReferralProgramRules") => import_v42.z.object({
938
- totalAwardPoolValue: makeFiniteNonNegativeNumberSchema(`${valueLabel}.totalAwardPoolValue`),
939
- maxQualifiedReferrers: makeNonNegativeIntegerSchema(`${valueLabel}.maxQualifiedReferrers`),
940
- startTime: makeUnixTimestampSchema(`${valueLabel}.startTime`),
941
- endTime: makeUnixTimestampSchema(`${valueLabel}.endTime`),
942
- subregistryId: makeAccountIdSchema(`${valueLabel}.subregistryId`)
943
- });
944
- var makeAwardedReferrerMetricsSchema = (valueLabel = "AwardedReferrerMetrics") => import_v42.z.object({
945
- referrer: makeLowercaseAddressSchema(`${valueLabel}.referrer`),
946
- totalReferrals: makeNonNegativeIntegerSchema(`${valueLabel}.totalReferrals`),
947
- totalIncrementalDuration: makeDurationSchema(`${valueLabel}.totalIncrementalDuration`),
948
- totalRevenueContribution: makeRevenueContributionSchema(
949
- `${valueLabel}.totalRevenueContribution`
950
- ),
951
- score: makeFiniteNonNegativeNumberSchema(`${valueLabel}.score`),
952
- rank: makePositiveIntegerSchema(`${valueLabel}.rank`),
953
- isQualified: import_v42.z.boolean(),
954
- finalScoreBoost: makeFiniteNonNegativeNumberSchema(`${valueLabel}.finalScoreBoost`).max(
955
- 1,
956
- `${valueLabel}.finalScoreBoost must be <= 1`
957
- ),
958
- finalScore: makeFiniteNonNegativeNumberSchema(`${valueLabel}.finalScore`),
959
- awardPoolShare: makeFiniteNonNegativeNumberSchema(`${valueLabel}.awardPoolShare`).max(
960
- 1,
961
- `${valueLabel}.awardPoolShare must be <= 1`
962
- ),
963
- awardPoolApproxValue: makeFiniteNonNegativeNumberSchema(`${valueLabel}.awardPoolApproxValue`)
964
- });
965
- var makeUnrankedReferrerMetricsSchema = (valueLabel = "UnrankedReferrerMetrics") => import_v42.z.object({
966
- referrer: makeLowercaseAddressSchema(`${valueLabel}.referrer`),
967
- totalReferrals: makeNonNegativeIntegerSchema(`${valueLabel}.totalReferrals`),
968
- totalIncrementalDuration: makeDurationSchema(`${valueLabel}.totalIncrementalDuration`),
969
- totalRevenueContribution: makeRevenueContributionSchema(
970
- `${valueLabel}.totalRevenueContribution`
971
- ),
972
- score: makeFiniteNonNegativeNumberSchema(`${valueLabel}.score`),
973
- rank: import_v42.z.null(),
974
- isQualified: import_v42.z.literal(false),
975
- finalScoreBoost: makeFiniteNonNegativeNumberSchema(`${valueLabel}.finalScoreBoost`).max(
976
- 1,
977
- `${valueLabel}.finalScoreBoost must be <= 1`
978
- ),
979
- finalScore: makeFiniteNonNegativeNumberSchema(`${valueLabel}.finalScore`),
980
- awardPoolShare: makeFiniteNonNegativeNumberSchema(`${valueLabel}.awardPoolShare`).max(
981
- 1,
982
- `${valueLabel}.awardPoolShare must be <= 1`
983
- ),
984
- awardPoolApproxValue: makeFiniteNonNegativeNumberSchema(`${valueLabel}.awardPoolApproxValue`)
985
- });
986
- var makeAggregatedReferrerMetricsSchema = (valueLabel = "AggregatedReferrerMetrics") => import_v42.z.object({
987
- grandTotalReferrals: makeNonNegativeIntegerSchema(`${valueLabel}.grandTotalReferrals`),
988
- grandTotalIncrementalDuration: makeDurationSchema(
989
- `${valueLabel}.grandTotalIncrementalDuration`
990
- ),
991
- grandTotalRevenueContribution: makeRevenueContributionSchema(
992
- `${valueLabel}.grandTotalRevenueContribution`
993
- ),
994
- grandTotalQualifiedReferrersFinalScore: makeFiniteNonNegativeNumberSchema(
995
- `${valueLabel}.grandTotalQualifiedReferrersFinalScore`
996
- ),
997
- minFinalScoreToQualify: makeFiniteNonNegativeNumberSchema(
998
- `${valueLabel}.minFinalScoreToQualify`
999
- )
1000
- });
1001
- var makeReferrerLeaderboardPageContextSchema = (valueLabel = "ReferrerLeaderboardPageContext") => import_v42.z.object({
1002
- page: makePositiveIntegerSchema(`${valueLabel}.page`),
1003
- recordsPerPage: makePositiveIntegerSchema(`${valueLabel}.recordsPerPage`).max(
1004
- REFERRERS_PER_LEADERBOARD_PAGE_MAX,
1005
- `${valueLabel}.recordsPerPage must not exceed ${REFERRERS_PER_LEADERBOARD_PAGE_MAX}`
1006
- ),
1007
- totalRecords: makeNonNegativeIntegerSchema(`${valueLabel}.totalRecords`),
1008
- totalPages: makePositiveIntegerSchema(`${valueLabel}.totalPages`),
1009
- hasNext: import_v42.z.boolean(),
1010
- hasPrev: import_v42.z.boolean(),
1011
- startIndex: import_v42.z.optional(makeNonNegativeIntegerSchema(`${valueLabel}.startIndex`)),
1012
- endIndex: import_v42.z.optional(makeNonNegativeIntegerSchema(`${valueLabel}.endIndex`))
1013
- });
1014
- var makeReferrerLeaderboardPageSchema = (valueLabel = "ReferrerLeaderboardPage") => import_v42.z.object({
1015
- rules: makeReferralProgramRulesSchema(`${valueLabel}.rules`),
1016
- referrers: import_v42.z.array(makeAwardedReferrerMetricsSchema(`${valueLabel}.referrers[record]`)),
1017
- aggregatedMetrics: makeAggregatedReferrerMetricsSchema(`${valueLabel}.aggregatedMetrics`),
1018
- pageContext: makeReferrerLeaderboardPageContextSchema(`${valueLabel}.pageContext`),
1019
- accurateAsOf: makeUnixTimestampSchema(`${valueLabel}.accurateAsOf`)
1020
- });
1021
- var makeReferrerLeaderboardPageResponseOkSchema = (valueLabel = "ReferrerLeaderboardPageResponseOk") => import_v42.z.object({
1022
- responseCode: import_v42.z.literal(ReferrerLeaderboardPageResponseCodes.Ok),
1023
- data: makeReferrerLeaderboardPageSchema(`${valueLabel}.data`)
1024
- });
1025
- var makeReferrerLeaderboardPageResponseErrorSchema = (_valueLabel = "ReferrerLeaderboardPageResponseError") => import_v42.z.object({
1026
- responseCode: import_v42.z.literal(ReferrerLeaderboardPageResponseCodes.Error),
1027
- error: import_v42.z.string(),
1028
- errorMessage: import_v42.z.string()
1029
- });
1030
- var makeReferrerLeaderboardPageResponseSchema = (valueLabel = "ReferrerLeaderboardPageResponse") => import_v42.z.union([
1031
- makeReferrerLeaderboardPageResponseOkSchema(valueLabel),
1032
- makeReferrerLeaderboardPageResponseErrorSchema(valueLabel)
1033
- ]);
1034
- var makeReferrerDetailRankedSchema = (valueLabel = "ReferrerDetailRanked") => import_v42.z.object({
1035
- type: import_v42.z.literal(ReferrerDetailTypeIds.Ranked),
1036
- rules: makeReferralProgramRulesSchema(`${valueLabel}.rules`),
1037
- referrer: makeAwardedReferrerMetricsSchema(`${valueLabel}.referrer`),
1038
- aggregatedMetrics: makeAggregatedReferrerMetricsSchema(`${valueLabel}.aggregatedMetrics`),
1039
- accurateAsOf: makeUnixTimestampSchema(`${valueLabel}.accurateAsOf`)
1040
- });
1041
- var makeReferrerDetailUnrankedSchema = (valueLabel = "ReferrerDetailUnranked") => import_v42.z.object({
1042
- type: import_v42.z.literal(ReferrerDetailTypeIds.Unranked),
1043
- rules: makeReferralProgramRulesSchema(`${valueLabel}.rules`),
1044
- referrer: makeUnrankedReferrerMetricsSchema(`${valueLabel}.referrer`),
1045
- aggregatedMetrics: makeAggregatedReferrerMetricsSchema(`${valueLabel}.aggregatedMetrics`),
1046
- accurateAsOf: makeUnixTimestampSchema(`${valueLabel}.accurateAsOf`)
1047
- });
1048
- var makeReferrerDetailResponseOkSchema = (valueLabel = "ReferrerDetailResponse") => import_v42.z.object({
1049
- responseCode: import_v42.z.literal(ReferrerDetailResponseCodes.Ok),
1050
- data: import_v42.z.union([
1051
- makeReferrerDetailRankedSchema(`${valueLabel}.data`),
1052
- makeReferrerDetailUnrankedSchema(`${valueLabel}.data`)
1053
- ])
1054
- });
1055
- var makeReferrerDetailResponseErrorSchema = (_valueLabel = "ReferrerDetailResponse") => import_v42.z.object({
1056
- responseCode: import_v42.z.literal(ReferrerDetailResponseCodes.Error),
1057
- error: import_v42.z.string(),
1058
- errorMessage: import_v42.z.string()
1059
- });
1060
- var makeReferrerDetailResponseSchema = (valueLabel = "ReferrerDetailResponse") => import_v42.z.union([
1061
- makeReferrerDetailResponseOkSchema(valueLabel),
1062
- makeReferrerDetailResponseErrorSchema(valueLabel)
1063
- ]);
2382
+ // src/award-models/rev-share-cap/status.ts
2383
+ var calcReferralProgramEditionStatusRevShareCap = (rules, now, aggregatedMetrics) => {
2384
+ const base = calcBaseReferralProgramEditionStatus(rules, now);
2385
+ if (base === ReferralProgramEditionStatuses.Active && aggregatedMetrics.awardPoolRemaining.amount === 0n) {
2386
+ return ReferralProgramEditionStatuses.Exhausted;
2387
+ }
2388
+ return base;
2389
+ };
1064
2390
 
1065
- // src/api/deserialize.ts
1066
- function deserializeRevenueContribution(value) {
1067
- return BigInt(value);
1068
- }
1069
- function deserializeReferralProgramRules(rules) {
1070
- return rules;
1071
- }
1072
- function deserializeAwardedReferrerMetrics(metrics) {
1073
- return {
1074
- referrer: metrics.referrer,
1075
- totalReferrals: metrics.totalReferrals,
1076
- totalIncrementalDuration: metrics.totalIncrementalDuration,
1077
- totalRevenueContribution: deserializeRevenueContribution(metrics.totalRevenueContribution),
1078
- score: metrics.score,
1079
- rank: metrics.rank,
1080
- isQualified: metrics.isQualified,
1081
- finalScoreBoost: metrics.finalScoreBoost,
1082
- finalScore: metrics.finalScore,
1083
- awardPoolShare: metrics.awardPoolShare,
1084
- awardPoolApproxValue: metrics.awardPoolApproxValue
2391
+ // src/award-models/rev-share-cap/edition-summary.ts
2392
+ var validateEditionSummaryRevShareCap = (summary) => {
2393
+ validateReferralProgramRulesRevShareCap(summary.rules);
2394
+ makePriceUsdcSchema("ReferralProgramEditionSummaryRevShareCap.awardPoolRemaining").parse(
2395
+ summary.awardPoolRemaining
2396
+ );
2397
+ validateBaseReferralProgramEditionSummary(summary);
2398
+ };
2399
+ function buildEditionSummaryRevShareCap(slug, displayName, rules, leaderboard) {
2400
+ const status = calcReferralProgramEditionStatusRevShareCap(
2401
+ rules,
2402
+ leaderboard.accurateAsOf,
2403
+ leaderboard.aggregatedMetrics
2404
+ );
2405
+ const result = {
2406
+ awardModel: rules.awardModel,
2407
+ slug,
2408
+ displayName,
2409
+ status,
2410
+ rules,
2411
+ awardPoolRemaining: leaderboard.aggregatedMetrics.awardPoolRemaining
1085
2412
  };
2413
+ validateEditionSummaryRevShareCap(result);
2414
+ return result;
1086
2415
  }
1087
- function deserializeUnrankedReferrerMetrics(metrics) {
1088
- return {
1089
- referrer: metrics.referrer,
1090
- totalReferrals: metrics.totalReferrals,
1091
- totalIncrementalDuration: metrics.totalIncrementalDuration,
1092
- totalRevenueContribution: deserializeRevenueContribution(metrics.totalRevenueContribution),
1093
- score: metrics.score,
1094
- rank: metrics.rank,
1095
- isQualified: metrics.isQualified,
1096
- finalScoreBoost: metrics.finalScoreBoost,
1097
- finalScore: metrics.finalScore,
1098
- awardPoolShare: metrics.awardPoolShare,
1099
- awardPoolApproxValue: metrics.awardPoolApproxValue
2416
+
2417
+ // src/award-models/rev-share-cap/metrics.ts
2418
+ var validateReferrerMetricsRevShareCap = (metrics, rules) => {
2419
+ validateReferrerMetrics(metrics);
2420
+ makePriceUsdcSchema("ReferrerMetricsRevShareCap.totalBaseRevenueContribution").parse(
2421
+ metrics.totalBaseRevenueContribution
2422
+ );
2423
+ const expectedTotalBaseRevenueContribution = priceUsdc(
2424
+ rules.baseAnnualRevenueContribution.amount * BigInt(metrics.totalIncrementalDuration) / BigInt(SECONDS_PER_YEAR)
2425
+ );
2426
+ if (metrics.totalBaseRevenueContribution.amount !== expectedTotalBaseRevenueContribution.amount) {
2427
+ throw new Error(
2428
+ `ReferrerMetricsRevShareCap: Invalid totalBaseRevenueContribution: ${metrics.totalBaseRevenueContribution.amount.toString()}, expected: ${expectedTotalBaseRevenueContribution.amount.toString()}.`
2429
+ );
2430
+ }
2431
+ };
2432
+ var buildReferrerMetricsRevShareCap = (metrics, rules) => {
2433
+ const totalBaseRevenueContribution = priceUsdc(
2434
+ rules.baseAnnualRevenueContribution.amount * BigInt(metrics.totalIncrementalDuration) / BigInt(SECONDS_PER_YEAR)
2435
+ );
2436
+ const result = {
2437
+ ...metrics,
2438
+ totalBaseRevenueContribution
1100
2439
  };
1101
- }
1102
- function deserializeAggregatedReferrerMetrics(metrics) {
1103
- return {
1104
- grandTotalReferrals: metrics.grandTotalReferrals,
1105
- grandTotalIncrementalDuration: metrics.grandTotalIncrementalDuration,
1106
- grandTotalRevenueContribution: deserializeRevenueContribution(
1107
- metrics.grandTotalRevenueContribution
2440
+ validateReferrerMetricsRevShareCap(result, rules);
2441
+ return result;
2442
+ };
2443
+ var validateAdminActionConsistency = (metricsAdminAction, referrer, rules, context) => {
2444
+ const expected = rules.adminActions.find((a) => a.referrer === referrer) ?? null;
2445
+ if (expected === null && metricsAdminAction !== null) {
2446
+ throw new Error(
2447
+ `${context}: expected null, got actionType="${metricsAdminAction.actionType}".`
2448
+ );
2449
+ }
2450
+ if (expected !== null) {
2451
+ if (metricsAdminAction === null || metricsAdminAction.actionType !== expected.actionType || metricsAdminAction.referrer !== expected.referrer || metricsAdminAction.reason !== expected.reason) {
2452
+ throw new Error(`${context}: does not match expected action from rules.`);
2453
+ }
2454
+ }
2455
+ };
2456
+ var validateRankedReferrerMetricsRevShareCap = (metrics, rules) => {
2457
+ validateReferrerMetricsRevShareCap(metrics, rules);
2458
+ validateReferrerRank(metrics.rank);
2459
+ const expectedIsQualified = isReferrerQualifiedRevShareCap(
2460
+ metrics.referrer,
2461
+ metrics.totalBaseRevenueContribution,
2462
+ rules
2463
+ );
2464
+ if (metrics.isQualified !== expectedIsQualified) {
2465
+ throw new Error(
2466
+ `RankedReferrerMetricsRevShareCap: Invalid isQualified: ${metrics.isQualified}, expected: ${expectedIsQualified}.`
2467
+ );
2468
+ }
2469
+ validateAdminActionConsistency(
2470
+ metrics.adminAction,
2471
+ metrics.referrer,
2472
+ rules,
2473
+ "RankedReferrerMetricsRevShareCap: Invalid adminAction"
2474
+ );
2475
+ };
2476
+ var buildRankedReferrerMetricsRevShareCap = (referrer, rank, rules) => {
2477
+ const adminAction = rules.adminActions.find((a) => a.referrer === referrer.referrer) ?? null;
2478
+ const result = {
2479
+ ...referrer,
2480
+ rank,
2481
+ isQualified: isReferrerQualifiedRevShareCap(
2482
+ referrer.referrer,
2483
+ referrer.totalBaseRevenueContribution,
2484
+ rules
1108
2485
  ),
1109
- grandTotalQualifiedReferrersFinalScore: metrics.grandTotalQualifiedReferrersFinalScore,
1110
- minFinalScoreToQualify: metrics.minFinalScoreToQualify
1111
- };
1112
- }
1113
- function deserializeReferrerLeaderboardPage(page) {
1114
- return {
1115
- rules: deserializeReferralProgramRules(page.rules),
1116
- referrers: page.referrers.map(deserializeAwardedReferrerMetrics),
1117
- aggregatedMetrics: deserializeAggregatedReferrerMetrics(page.aggregatedMetrics),
1118
- pageContext: page.pageContext,
1119
- accurateAsOf: page.accurateAsOf
1120
- };
1121
- }
1122
- function deserializeReferrerDetailRanked(detail) {
1123
- return {
1124
- type: detail.type,
1125
- rules: deserializeReferralProgramRules(detail.rules),
1126
- referrer: deserializeAwardedReferrerMetrics(detail.referrer),
1127
- aggregatedMetrics: deserializeAggregatedReferrerMetrics(detail.aggregatedMetrics),
1128
- accurateAsOf: detail.accurateAsOf
2486
+ adminAction
1129
2487
  };
1130
- }
1131
- function deserializeReferrerDetailUnranked(detail) {
1132
- return {
1133
- type: detail.type,
1134
- rules: deserializeReferralProgramRules(detail.rules),
1135
- referrer: deserializeUnrankedReferrerMetrics(detail.referrer),
1136
- aggregatedMetrics: deserializeAggregatedReferrerMetrics(detail.aggregatedMetrics),
1137
- accurateAsOf: detail.accurateAsOf
2488
+ validateRankedReferrerMetricsRevShareCap(result, rules);
2489
+ return result;
2490
+ };
2491
+ var validateAwardedReferrerMetricsRevShareCap = (metrics, rules) => {
2492
+ validateRankedReferrerMetricsRevShareCap(metrics, rules);
2493
+ makePriceUsdcSchema("AwardedReferrerMetricsRevShareCap.uncappedAward").parse(
2494
+ metrics.uncappedAward
2495
+ );
2496
+ makePriceUsdcSchema("AwardedReferrerMetricsRevShareCap.cappedAward").parse(metrics.cappedAward);
2497
+ if (metrics.adminAction?.actionType === AdminActionTypes.Disqualification && metrics.cappedAward.amount !== 0n) {
2498
+ throw new Error(
2499
+ `AwardedReferrerMetricsRevShareCap: cappedAward.amount must be 0n for admin-disqualified referrers, got ${metrics.cappedAward.amount.toString()}.`
2500
+ );
2501
+ }
2502
+ if (!metrics.isQualified && metrics.cappedAward.amount !== 0n) {
2503
+ throw new Error(
2504
+ `AwardedReferrerMetricsRevShareCap: cappedAward.amount must be 0n for unqualified referrers, got ${metrics.cappedAward.amount.toString()}.`
2505
+ );
2506
+ }
2507
+ if (metrics.cappedAward.amount > rules.awardPool.amount) {
2508
+ throw new Error(
2509
+ `AwardedReferrerMetricsRevShareCap: cappedAward.amount ${metrics.cappedAward.amount.toString()} exceeds awardPool.amount ${rules.awardPool.amount.toString()}.`
2510
+ );
2511
+ }
2512
+ if (metrics.cappedAward.amount > metrics.uncappedAward.amount) {
2513
+ throw new Error(
2514
+ `AwardedReferrerMetricsRevShareCap: cappedAward.amount ${metrics.cappedAward.amount.toString()} exceeds uncappedAward.amount ${metrics.uncappedAward.amount.toString()}.`
2515
+ );
2516
+ }
2517
+ };
2518
+ var buildAwardedReferrerMetricsRevShareCap = (referrer, uncappedAward, cappedAward, rules) => {
2519
+ const result = {
2520
+ ...referrer,
2521
+ uncappedAward,
2522
+ cappedAward
1138
2523
  };
1139
- }
1140
- function deserializeReferrerLeaderboardPageResponse(maybeResponse, valueLabel) {
1141
- let deserialized;
1142
- switch (maybeResponse.responseCode) {
1143
- case "ok": {
1144
- deserialized = {
1145
- responseCode: maybeResponse.responseCode,
1146
- data: deserializeReferrerLeaderboardPage(maybeResponse.data)
1147
- };
1148
- break;
1149
- }
1150
- case "error":
1151
- deserialized = maybeResponse;
1152
- break;
2524
+ validateAwardedReferrerMetricsRevShareCap(result, rules);
2525
+ return result;
2526
+ };
2527
+ var validateUnrankedReferrerMetricsRevShareCap = (metrics, rules) => {
2528
+ validateReferrerMetrics(metrics);
2529
+ if (metrics.rank !== null) {
2530
+ throw new Error(
2531
+ `Invalid UnrankedReferrerMetricsRevShareCap: rank must be null, got: ${metrics.rank}.`
2532
+ );
1153
2533
  }
1154
- const schema = makeReferrerLeaderboardPageResponseSchema(valueLabel);
1155
- const parsed = schema.safeParse(deserialized);
1156
- if (parsed.error) {
2534
+ if (metrics.isQualified !== false) {
1157
2535
  throw new Error(
1158
- `Cannot deserialize SerializedReferrerLeaderboardPageResponse:
1159
- ${(0, import_v43.prettifyError)(parsed.error)}
1160
- `
2536
+ `Invalid UnrankedReferrerMetricsRevShareCap: isQualified must be false, got: ${metrics.isQualified}.`
1161
2537
  );
1162
2538
  }
1163
- return parsed.data;
1164
- }
1165
- function deserializeReferrerDetailResponse(maybeResponse, valueLabel) {
1166
- let deserialized;
1167
- switch (maybeResponse.responseCode) {
1168
- case "ok": {
1169
- switch (maybeResponse.data.type) {
1170
- case "ranked":
1171
- deserialized = {
1172
- responseCode: maybeResponse.responseCode,
1173
- data: deserializeReferrerDetailRanked(maybeResponse.data)
1174
- };
1175
- break;
1176
- case "unranked":
1177
- deserialized = {
1178
- responseCode: maybeResponse.responseCode,
1179
- data: deserializeReferrerDetailUnranked(maybeResponse.data)
1180
- };
1181
- break;
1182
- }
1183
- break;
1184
- }
1185
- case "error":
1186
- deserialized = maybeResponse;
1187
- break;
2539
+ validateAdminActionConsistency(
2540
+ metrics.adminAction,
2541
+ metrics.referrer,
2542
+ rules,
2543
+ "Invalid UnrankedReferrerMetricsRevShareCap: adminAction"
2544
+ );
2545
+ if (metrics.totalReferrals !== 0) {
2546
+ throw new Error(
2547
+ `Invalid UnrankedReferrerMetricsRevShareCap: totalReferrals must be 0, got: ${metrics.totalReferrals}.`
2548
+ );
1188
2549
  }
1189
- const schema = makeReferrerDetailResponseSchema(valueLabel);
1190
- const parsed = schema.safeParse(deserialized);
1191
- if (parsed.error) {
1192
- throw new Error(`Cannot deserialize ReferrerDetailResponse:
1193
- ${(0, import_v43.prettifyError)(parsed.error)}
1194
- `);
2550
+ if (metrics.totalIncrementalDuration !== 0) {
2551
+ throw new Error(
2552
+ `Invalid UnrankedReferrerMetricsRevShareCap: totalIncrementalDuration must be 0, got: ${metrics.totalIncrementalDuration}.`
2553
+ );
1195
2554
  }
1196
- return parsed.data;
1197
- }
1198
-
1199
- // src/api/serialize.ts
1200
- function serializeRevenueContribution(revenueContribution) {
1201
- return revenueContribution.toString();
1202
- }
1203
- function serializeReferralProgramRules(rules) {
1204
- return rules;
1205
- }
1206
- function serializeAwardedReferrerMetrics(metrics) {
1207
- return {
1208
- referrer: metrics.referrer,
1209
- totalReferrals: metrics.totalReferrals,
1210
- totalIncrementalDuration: metrics.totalIncrementalDuration,
1211
- totalRevenueContribution: serializeRevenueContribution(metrics.totalRevenueContribution),
1212
- score: metrics.score,
1213
- rank: metrics.rank,
1214
- isQualified: metrics.isQualified,
1215
- finalScoreBoost: metrics.finalScoreBoost,
1216
- finalScore: metrics.finalScore,
1217
- awardPoolShare: metrics.awardPoolShare,
1218
- awardPoolApproxValue: metrics.awardPoolApproxValue
1219
- };
1220
- }
1221
- function serializeUnrankedReferrerMetrics(metrics) {
1222
- return {
1223
- referrer: metrics.referrer,
1224
- totalReferrals: metrics.totalReferrals,
1225
- totalIncrementalDuration: metrics.totalIncrementalDuration,
1226
- totalRevenueContribution: serializeRevenueContribution(metrics.totalRevenueContribution),
1227
- score: metrics.score,
1228
- rank: metrics.rank,
1229
- isQualified: metrics.isQualified,
1230
- finalScoreBoost: metrics.finalScoreBoost,
1231
- finalScore: metrics.finalScore,
1232
- awardPoolShare: metrics.awardPoolShare,
1233
- awardPoolApproxValue: metrics.awardPoolApproxValue
1234
- };
1235
- }
1236
- function serializeAggregatedReferrerMetrics(metrics) {
1237
- return {
1238
- grandTotalReferrals: metrics.grandTotalReferrals,
1239
- grandTotalIncrementalDuration: metrics.grandTotalIncrementalDuration,
1240
- grandTotalRevenueContribution: serializeRevenueContribution(
1241
- metrics.grandTotalRevenueContribution
1242
- ),
1243
- grandTotalQualifiedReferrersFinalScore: metrics.grandTotalQualifiedReferrersFinalScore,
1244
- minFinalScoreToQualify: metrics.minFinalScoreToQualify
1245
- };
1246
- }
1247
- function serializeReferrerLeaderboardPage(page) {
1248
- return {
1249
- rules: serializeReferralProgramRules(page.rules),
1250
- referrers: page.referrers.map(serializeAwardedReferrerMetrics),
1251
- aggregatedMetrics: serializeAggregatedReferrerMetrics(page.aggregatedMetrics),
1252
- pageContext: page.pageContext,
1253
- accurateAsOf: page.accurateAsOf
1254
- };
1255
- }
1256
- function serializeReferrerDetailRanked(detail) {
1257
- return {
1258
- type: detail.type,
1259
- rules: serializeReferralProgramRules(detail.rules),
1260
- referrer: serializeAwardedReferrerMetrics(detail.referrer),
1261
- aggregatedMetrics: serializeAggregatedReferrerMetrics(detail.aggregatedMetrics),
1262
- accurateAsOf: detail.accurateAsOf
1263
- };
1264
- }
1265
- function serializeReferrerDetailUnranked(detail) {
1266
- return {
1267
- type: detail.type,
1268
- rules: serializeReferralProgramRules(detail.rules),
1269
- referrer: serializeUnrankedReferrerMetrics(detail.referrer),
1270
- aggregatedMetrics: serializeAggregatedReferrerMetrics(detail.aggregatedMetrics),
1271
- accurateAsOf: detail.accurateAsOf
2555
+ makePriceEthSchema("UnrankedReferrerMetricsRevShareCap.totalRevenueContribution").parse(
2556
+ metrics.totalRevenueContribution
2557
+ );
2558
+ if (metrics.totalRevenueContribution.amount !== 0n) {
2559
+ throw new Error(
2560
+ `Invalid UnrankedReferrerMetricsRevShareCap: totalRevenueContribution.amount must be 0n, got: ${metrics.totalRevenueContribution.amount.toString()}.`
2561
+ );
2562
+ }
2563
+ makePriceUsdcSchema("UnrankedReferrerMetricsRevShareCap.totalBaseRevenueContribution").parse(
2564
+ metrics.totalBaseRevenueContribution
2565
+ );
2566
+ if (metrics.totalBaseRevenueContribution.amount !== 0n) {
2567
+ throw new Error(
2568
+ `Invalid UnrankedReferrerMetricsRevShareCap: totalBaseRevenueContribution.amount must be 0n, got: ${metrics.totalBaseRevenueContribution.amount.toString()}.`
2569
+ );
2570
+ }
2571
+ makePriceUsdcSchema("UnrankedReferrerMetricsRevShareCap.uncappedAward").parse(
2572
+ metrics.uncappedAward
2573
+ );
2574
+ if (metrics.uncappedAward.amount !== 0n) {
2575
+ throw new Error(
2576
+ `Invalid UnrankedReferrerMetricsRevShareCap: uncappedAward.amount must be 0n, got: ${metrics.uncappedAward.amount.toString()}.`
2577
+ );
2578
+ }
2579
+ makePriceUsdcSchema("UnrankedReferrerMetricsRevShareCap.cappedAward").parse(metrics.cappedAward);
2580
+ if (metrics.cappedAward.amount !== 0n) {
2581
+ throw new Error(
2582
+ `Invalid UnrankedReferrerMetricsRevShareCap: cappedAward.amount must be 0n, got: ${metrics.cappedAward.amount.toString()}.`
2583
+ );
2584
+ }
2585
+ };
2586
+ var buildUnrankedReferrerMetricsRevShareCap = (referrer, rules) => {
2587
+ const metrics = buildReferrerMetrics(referrer, 0, 0, priceEth(0n));
2588
+ const adminAction = rules.adminActions.find((a) => a.referrer === metrics.referrer) ?? null;
2589
+ const result = {
2590
+ ...metrics,
2591
+ totalBaseRevenueContribution: priceUsdc(0n),
2592
+ rank: null,
2593
+ isQualified: false,
2594
+ uncappedAward: priceUsdc(0n),
2595
+ cappedAward: priceUsdc(0n),
2596
+ adminAction
1272
2597
  };
2598
+ validateUnrankedReferrerMetricsRevShareCap(result, rules);
2599
+ return result;
2600
+ };
2601
+
2602
+ // src/award-models/rev-share-cap/sort-referral-events.ts
2603
+ function sortReferralEvents(events) {
2604
+ return [...events].sort((a, b) => a.id < b.id ? -1 : a.id > b.id ? 1 : 0);
1273
2605
  }
1274
- function serializeReferrerLeaderboardPageResponse(response) {
1275
- switch (response.responseCode) {
1276
- case ReferrerLeaderboardPageResponseCodes.Ok:
1277
- return {
1278
- responseCode: response.responseCode,
1279
- data: serializeReferrerLeaderboardPage(response.data)
2606
+
2607
+ // src/award-models/rev-share-cap/leaderboard.ts
2608
+ var bigintMin = (a, b) => a < b ? a : b;
2609
+ var buildReferrerLeaderboardRevShareCap = (events, rules, accurateAsOf) => {
2610
+ const sortedEvents = sortReferralEvents(events);
2611
+ const referrerStates = /* @__PURE__ */ new Map();
2612
+ let awardPoolRemaining = rules.awardPool.amount;
2613
+ for (const event of sortedEvents) {
2614
+ const referrer = event.referrer;
2615
+ let state = referrerStates.get(referrer);
2616
+ if (!state) {
2617
+ state = {
2618
+ totalReferrals: 0,
2619
+ totalIncrementalDuration: 0,
2620
+ totalRevenueContributionAmount: 0n,
2621
+ wasQualified: false,
2622
+ cappedAwardAmount: 0n
1280
2623
  };
1281
- case ReferrerLeaderboardPageResponseCodes.Error:
1282
- return response;
1283
- }
1284
- }
1285
- function serializeReferrerDetailResponse(response) {
1286
- switch (response.responseCode) {
1287
- case ReferrerDetailResponseCodes.Ok:
1288
- switch (response.data.type) {
1289
- case "ranked":
1290
- return {
1291
- responseCode: response.responseCode,
1292
- data: serializeReferrerDetailRanked(response.data)
1293
- };
1294
- case "unranked":
1295
- return {
1296
- responseCode: response.responseCode,
1297
- data: serializeReferrerDetailUnranked(response.data)
1298
- };
1299
- }
1300
- break;
1301
- case ReferrerDetailResponseCodes.Error:
1302
- return response;
2624
+ referrerStates.set(referrer, state);
2625
+ }
2626
+ state.totalReferrals += 1;
2627
+ state.totalIncrementalDuration += event.incrementalDuration;
2628
+ state.totalRevenueContributionAmount += event.incrementalRevenueContribution.amount;
2629
+ const totalBaseRevenueAmount = rules.baseAnnualRevenueContribution.amount * BigInt(state.totalIncrementalDuration) / BigInt(SECONDS_PER_YEAR);
2630
+ const isNowQualified = isReferrerQualifiedRevShareCap(
2631
+ referrer,
2632
+ priceUsdc(totalBaseRevenueAmount),
2633
+ rules
2634
+ );
2635
+ if (isNowQualified && !state.wasQualified) {
2636
+ const accumulatedUncappedAward = scalePrice(
2637
+ priceUsdc(totalBaseRevenueAmount),
2638
+ rules.maxBaseRevenueShare
2639
+ ).amount;
2640
+ const incrementalCappedAward = bigintMin(accumulatedUncappedAward, awardPoolRemaining);
2641
+ state.cappedAwardAmount += incrementalCappedAward;
2642
+ awardPoolRemaining -= incrementalCappedAward;
2643
+ state.wasQualified = true;
2644
+ } else if (state.wasQualified) {
2645
+ const incrementalBaseRevenueAmount = rules.baseAnnualRevenueContribution.amount * BigInt(event.incrementalDuration) / BigInt(SECONDS_PER_YEAR);
2646
+ const incrementalUncappedAward = scalePrice(
2647
+ priceUsdc(incrementalBaseRevenueAmount),
2648
+ rules.maxBaseRevenueShare
2649
+ ).amount;
2650
+ const incrementalCappedAward = bigintMin(incrementalUncappedAward, awardPoolRemaining);
2651
+ state.cappedAwardAmount += incrementalCappedAward;
2652
+ awardPoolRemaining -= incrementalCappedAward;
2653
+ }
1303
2654
  }
2655
+ const sortedEntries = [...referrerStates.entries()].sort(([a, stateA], [b, stateB]) => {
2656
+ if (stateB.cappedAwardAmount !== stateA.cappedAwardAmount) {
2657
+ return stateB.cappedAwardAmount > stateA.cappedAwardAmount ? 1 : -1;
2658
+ }
2659
+ if (stateB.totalIncrementalDuration !== stateA.totalIncrementalDuration) {
2660
+ return stateB.totalIncrementalDuration - stateA.totalIncrementalDuration;
2661
+ }
2662
+ if (b > a) return 1;
2663
+ if (b < a) return -1;
2664
+ return 0;
2665
+ });
2666
+ const awardedReferrers = sortedEntries.map(
2667
+ ([referrerAddr, state], index) => {
2668
+ const baseMetrics = buildReferrerMetrics(
2669
+ referrerAddr,
2670
+ state.totalReferrals,
2671
+ state.totalIncrementalDuration,
2672
+ priceEth(state.totalRevenueContributionAmount)
2673
+ );
2674
+ const revShareMetrics = buildReferrerMetricsRevShareCap(baseMetrics, rules);
2675
+ const rankedMetrics = buildRankedReferrerMetricsRevShareCap(
2676
+ revShareMetrics,
2677
+ index + 1,
2678
+ rules
2679
+ );
2680
+ const uncappedAward = scalePrice(
2681
+ revShareMetrics.totalBaseRevenueContribution,
2682
+ rules.maxBaseRevenueShare
2683
+ );
2684
+ return buildAwardedReferrerMetricsRevShareCap(
2685
+ rankedMetrics,
2686
+ uncappedAward,
2687
+ priceUsdc(state.cappedAwardAmount),
2688
+ rules
2689
+ );
2690
+ }
2691
+ );
2692
+ const aggregatedMetrics = buildAggregatedReferrerMetricsRevShareCap(
2693
+ awardedReferrers,
2694
+ priceUsdc(awardPoolRemaining)
2695
+ );
2696
+ const referrers = new Map(awardedReferrers.map((r) => [r.referrer, r]));
2697
+ return { awardModel: rules.awardModel, rules, aggregatedMetrics, referrers, accurateAsOf };
2698
+ };
2699
+
2700
+ // src/award-models/rev-share-cap/leaderboard-page.ts
2701
+ function buildLeaderboardPageRevShareCap(pageContext, leaderboard) {
2702
+ const status = calcReferralProgramEditionStatusRevShareCap(
2703
+ leaderboard.rules,
2704
+ leaderboard.accurateAsOf,
2705
+ leaderboard.aggregatedMetrics
2706
+ );
2707
+ return {
2708
+ awardModel: leaderboard.awardModel,
2709
+ rules: leaderboard.rules,
2710
+ referrers: sliceReferrers(leaderboard.referrers, pageContext),
2711
+ aggregatedMetrics: leaderboard.aggregatedMetrics,
2712
+ pageContext,
2713
+ status,
2714
+ accurateAsOf: leaderboard.accurateAsOf
2715
+ };
1304
2716
  }
1305
2717
 
1306
2718
  // src/client.ts
@@ -1323,51 +2735,96 @@ var ENSReferralsClient = class _ENSReferralsClient {
1323
2735
  url: new URL(this.options.url.href)
1324
2736
  });
1325
2737
  }
2738
+ /**
2739
+ * Get Referral Program Edition Config Set
2740
+ *
2741
+ * Fetches and deserializes a referral program edition config set from a remote URL.
2742
+ *
2743
+ * @param url - The URL to fetch the edition config set from
2744
+ * @returns A ReferralProgramEditionConfigSet (Map of edition slugs to edition configurations)
2745
+ *
2746
+ * @remarks Editions whose `rules.awardModel` is not recognized by this client version are
2747
+ * preserved as {@link ReferralProgramRulesUnrecognized}. The returned map includes all
2748
+ * editions — recognized and unrecognized alike. Callers should check `editionConfig.rules.awardModel`
2749
+ * and skip editions with `"unrecognized"` as appropriate. The returned map may be empty.
2750
+ *
2751
+ * @throws if the fetch fails
2752
+ * @throws if the response is not valid JSON
2753
+ * @throws if the data doesn't match the expected schema
2754
+ *
2755
+ * @example
2756
+ * ```typescript
2757
+ * const url = new URL("https://example.com/editions.json");
2758
+ * const editionConfigSet = await ENSReferralsClient.getReferralProgramEditionConfigSet(url);
2759
+ * console.log(`Loaded ${editionConfigSet.size} editions`);
2760
+ * ```
2761
+ */
2762
+ static async getReferralProgramEditionConfigSet(url) {
2763
+ const response = await fetch(url);
2764
+ if (!response.ok) {
2765
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
2766
+ }
2767
+ let json;
2768
+ try {
2769
+ json = await response.json();
2770
+ } catch {
2771
+ throw new Error("Malformed response data: invalid JSON");
2772
+ }
2773
+ const editionConfigs = deserializeReferralProgramEditionConfigSetArray(json);
2774
+ return buildReferralProgramEditionConfigSet(editionConfigs);
2775
+ }
1326
2776
  /**
1327
2777
  * Fetch Referrer Leaderboard Page
1328
2778
  *
1329
- * Retrieves a paginated list of referrer leaderboard metrics with contribution percentages.
1330
- * Each referrer's contribution is calculated as a percentage of the grand totals across all referrers.
2779
+ * Retrieves a paginated list of referrer leaderboard metrics for a specific referral program edition.
1331
2780
  *
1332
- * @param request - Pagination parameters
2781
+ * @param request - Request parameters including edition and pagination
2782
+ * @param request.edition - The referral program edition slug (e.g., "2025-12", "2026-03", or any other configured edition slug)
1333
2783
  * @param request.page - The page number to retrieve (1-indexed, default: 1)
1334
2784
  * @param request.recordsPerPage - Number of records per page (default: 25, max: 100)
1335
2785
  * @returns {ReferrerLeaderboardPageResponse}
1336
2786
  *
2787
+ * @remarks If the server returns a leaderboard page whose `awardModel` is not recognized by
2788
+ * this client version, it is preserved as {@link ReferrerLeaderboardPageUnrecognized}. Callers
2789
+ * should check `response.data.awardModel` and handle the `"unrecognized"` case accordingly.
2790
+ *
1337
2791
  * @throws if the ENSNode request fails
1338
2792
  * @throws if the ENSNode API returns an error response
1339
2793
  * @throws if the ENSNode response breaks required invariants
1340
2794
  *
1341
2795
  * @example
1342
2796
  * ```typescript
1343
- * // Get first page with default page size (25 records)
1344
- * const response = await client.getReferrerLeaderboardPage();
2797
+ * // Get first page of 2025-12 leaderboard with default page size (25 records)
2798
+ * const editionSlug = "2025-12";
2799
+ * const response = await client.getReferrerLeaderboardPage({ edition: editionSlug });
1345
2800
  * if (response.responseCode === ReferrerLeaderboardPageResponseCodes.Ok) {
1346
- * const {
1347
- * aggregatedMetrics,
1348
- * referrers,
1349
- * rules,
1350
- * pageContext,
1351
- * updatedAt
1352
- * } = response.data;
1353
- * console.log(aggregatedMetrics);
1354
- * console.log(referrers);
1355
- * console.log(rules);
1356
- * console.log(updatedAt);
1357
- * console.log(`Page ${pageContext.page} of ${pageContext.totalPages}`);
2801
+ * const { awardModel, pageContext, accurateAsOf } = response.data;
2802
+ * if (awardModel === ReferralProgramAwardModels.Unrecognized) {
2803
+ * console.log(`Unrecognized award model: ${response.data.originalAwardModel} — skipping`);
2804
+ * } else {
2805
+ * const { aggregatedMetrics, referrers, rules } = response.data;
2806
+ * console.log(`Edition: ${editionSlug}`);
2807
+ * console.log(`Subregistry: ${rules.subregistryId}`);
2808
+ * console.log(`Total Referrers: ${pageContext.totalRecords}`);
2809
+ * console.log(`Page ${pageContext.page} of ${pageContext.totalPages}`);
2810
+ * }
1358
2811
  * }
1359
2812
  * ```
1360
2813
  *
1361
2814
  * @example
1362
2815
  * ```typescript
1363
- * // Get second page with 50 records per page
1364
- * const response = await client.getReferrerLeaderboardPage({ page: 2, recordsPerPage: 50 });
2816
+ * // Get second page of 2026-03 with 50 records per page
2817
+ * const response = await client.getReferrerLeaderboardPage({
2818
+ * edition: "2026-03",
2819
+ * page: 2,
2820
+ * recordsPerPage: 50
2821
+ * });
1365
2822
  * ```
1366
2823
  *
1367
2824
  * @example
1368
2825
  * ```typescript
1369
- * // Handle error response, ie. when Referrer Leaderboard is not currently available.
1370
- * const response = await client.getReferrerLeaderboardPage();
2826
+ * // Handle error response (e.g., unknown edition or data not available)
2827
+ * const response = await client.getReferrerLeaderboardPage({ edition: "2025-12" });
1371
2828
  *
1372
2829
  * if (response.responseCode === ReferrerLeaderboardPageResponseCodes.Error) {
1373
2830
  * console.error(response.error);
@@ -1376,9 +2833,10 @@ var ENSReferralsClient = class _ENSReferralsClient {
1376
2833
  * ```
1377
2834
  */
1378
2835
  async getReferrerLeaderboardPage(request) {
1379
- const url = new URL(`/ensanalytics/referrers`, this.options.url);
1380
- if (request?.page) url.searchParams.set("page", request.page.toString());
1381
- if (request?.recordsPerPage)
2836
+ const url = new URL(`/v1/ensanalytics/referral-leaderboard`, this.options.url);
2837
+ url.searchParams.set("edition", request.edition);
2838
+ if (request.page !== void 0) url.searchParams.set("page", request.page.toString());
2839
+ if (request.recordsPerPage !== void 0)
1382
2840
  url.searchParams.set("recordsPerPage", request.recordsPerPage.toString());
1383
2841
  const response = await fetch(url);
1384
2842
  let responseData;
@@ -1392,86 +2850,151 @@ var ENSReferralsClient = class _ENSReferralsClient {
1392
2850
  );
1393
2851
  }
1394
2852
  /**
1395
- * Fetch Referrer Detail
2853
+ * Fetch Referrer Metrics for Specific Editions
1396
2854
  *
1397
- * Retrieves detailed information about a specific referrer, whether they are on the
1398
- * leaderboard or not.
2855
+ * Retrieves detailed information about a specific referrer for the requested
2856
+ * referral program editions. Returns a record mapping each requested edition slug
2857
+ * to the referrer's metrics for that edition.
1399
2858
  *
1400
- * The response data is a discriminated union type with a `type` field:
2859
+ * The response data maps edition slugs to referrer metrics. Each edition's entry is a
2860
+ * {@link ReferrerEditionMetrics} discriminated union. Narrow on `awardModel` first to
2861
+ * exclude unrecognized models, then on `type` to distinguish ranked from unranked:
1401
2862
  *
1402
- * **For referrers on the leaderboard** (`ReferrerDetailRanked`):
1403
- * - `type`: {@link ReferrerDetailTypeIds.Ranked}
1404
- * - `referrer`: The `AwardedReferrerMetrics` from @namehash/ens-referrals
1405
- * - `rules`: The referral program rules
1406
- * - `aggregatedMetrics`: Aggregated metrics for all referrers on the leaderboard
1407
- * - `accurateAsOf`: Unix timestamp indicating when the data was last updated
2863
+ * - `awardModel: "unrecognized"` ({@link ReferrerEditionMetricsUnrecognized}): the server
2864
+ * returned an award model this client does not recognize. Only `originalAwardModel` is
2865
+ * available; no model-specific fields are present.
2866
+ * - `type: "ranked"` ({@link ReferrerEditionMetricsTypeIds.Ranked}): the referrer appears on
2867
+ * the leaderboard. `referrer` contains rank, qualification status, and award share.
2868
+ * - `type: "unranked"` ({@link ReferrerEditionMetricsTypeIds.Unranked}): the referrer has no
2869
+ * activity in this edition. `referrer` contains zero-value placeholders.
1408
2870
  *
1409
- * **For referrers NOT on the leaderboard** (`ReferrerDetailUnranked`):
1410
- * - `type`: {@link ReferrerDetailTypeIds.Unranked}
1411
- * - `referrer`: The `UnrankedReferrerMetrics` from @namehash/ens-referrals
1412
- * - `rules`: The referral program rules
1413
- * - `aggregatedMetrics`: Aggregated metrics for all referrers on the leaderboard
1414
- * - `accurateAsOf`: Unix timestamp indicating when the data was last updated
2871
+ * **Note:** This endpoint does not allow partial success. When `responseCode === Ok`,
2872
+ * all requested editions are guaranteed to be present in the response data. If any
2873
+ * requested edition cannot be returned, the entire request fails with an error.
1415
2874
  *
1416
2875
  * @see {@link https://www.npmjs.com/package/@namehash/ens-referrals|@namehash/ens-referrals} for calculation details
1417
2876
  *
1418
- * @param request The referrer address to query
1419
- * @returns {ReferrerDetailResponse} Returns the referrer detail response
2877
+ * @param request The referrer address and edition slugs to query
2878
+ * @returns {ReferrerMetricsEditionsResponse} Returns the referrer metrics for requested editions
2879
+ *
2880
+ * @remarks If the server returns metrics for an edition whose `awardModel` is not recognized by
2881
+ * this client version, that edition's entry in `response.data` is preserved as
2882
+ * {@link ReferrerEditionMetricsUnrecognized}. Callers should check each edition's `awardModel`
2883
+ * and handle the `"unrecognized"` case accordingly.
1420
2884
  *
1421
2885
  * @throws if the ENSNode request fails
1422
2886
  * @throws if the response data is malformed
1423
2887
  *
1424
2888
  * @example
1425
2889
  * ```typescript
1426
- * // Get referrer detail for a specific address
1427
- * const response = await client.getReferrerDetail({
1428
- * referrer: "0x1234567890123456789012345678901234567890"
2890
+ * // Get referrer metrics for specific editions
2891
+ * const response = await client.getReferrerMetricsEditions({
2892
+ * referrer: "0x1234567890123456789012345678901234567890",
2893
+ * editions: ["2025-12", "2026-01"]
1429
2894
  * });
1430
- * if (response.responseCode === ReferrerDetailResponseCodes.Ok) {
1431
- * const { type, referrer, rules, aggregatedMetrics, accurateAsOf } = response.data;
1432
- * console.log(type); // ReferrerDetailTypeIds.Ranked or ReferrerDetailTypeIds.Unranked
1433
- * console.log(referrer);
1434
- * console.log(accurateAsOf);
2895
+ * if (response.responseCode === ReferrerMetricsEditionsResponseCodes.Ok) {
2896
+ * // All requested editions are present in response.data
2897
+ * for (const [editionSlug, detail] of Object.entries(response.data)) {
2898
+ * console.log(`Edition: ${editionSlug}`);
2899
+ * if (detail.awardModel === ReferralProgramAwardModels.Unrecognized) {
2900
+ * console.log(`Unrecognized award model: ${detail.originalAwardModel} — skipping`);
2901
+ * continue;
2902
+ * }
2903
+ * console.log(`Type: ${detail.type}`);
2904
+ * if (detail.type === ReferrerEditionMetricsTypeIds.Ranked) {
2905
+ * console.log(`Rank: ${detail.referrer.rank}`);
2906
+ * console.log(`Award Share: ${detail.referrer.awardPoolShare * 100}%`);
2907
+ * }
2908
+ * }
1435
2909
  * }
1436
2910
  * ```
1437
2911
  *
1438
2912
  * @example
1439
2913
  * ```typescript
1440
- * // Use discriminated union to check if referrer is ranked
1441
- * const response = await client.getReferrerDetail({
1442
- * referrer: "0x1234567890123456789012345678901234567890"
2914
+ * // Access specific edition data directly (edition is guaranteed to exist when OK)
2915
+ * const response = await client.getReferrerMetricsEditions({
2916
+ * referrer: "0x1234567890123456789012345678901234567890",
2917
+ * editions: ["2025-12"]
1443
2918
  * });
1444
- * if (response.responseCode === ReferrerDetailResponseCodes.Ok) {
1445
- * if (response.data.type === ReferrerDetailTypeIds.Ranked) {
1446
- * // TypeScript knows this is ReferrerDetailRanked
1447
- * console.log(`Rank: ${response.data.referrer.rank}`);
1448
- * console.log(`Qualified: ${response.data.referrer.isQualified}`);
1449
- * console.log(`Award Pool Share: ${response.data.referrer.awardPoolShare * 100}%`);
1450
- * } else {
1451
- * // TypeScript knows this is ReferrerDetailUnranked
1452
- * console.log("Referrer is not on the leaderboard (no referrals yet)");
2919
+ * if (response.responseCode === ReferrerMetricsEditionsResponseCodes.Ok) {
2920
+ * const detail = response.data["2025-12"];
2921
+ * if (detail && detail.awardModel === ReferralProgramAwardModels.Unrecognized) {
2922
+ * console.log(`Unrecognized award model: ${detail.originalAwardModel} — skipping`);
2923
+ * } else if (detail && detail.type === ReferrerEditionMetricsTypeIds.Ranked) {
2924
+ * console.log(`Edition 2025-12 Rank: ${detail.referrer.rank}`);
2925
+ * } else if (detail) {
2926
+ * console.log("Referrer is not on the leaderboard for 2025-12");
1453
2927
  * }
1454
2928
  * }
1455
2929
  * ```
1456
2930
  *
1457
2931
  * @example
1458
2932
  * ```typescript
1459
- * // Handle error response, ie. when Referrer Detail is not currently available.
1460
- * const response = await client.getReferrerDetail({
1461
- * referrer: "0x1234567890123456789012345678901234567890"
2933
+ * // Handle error response (e.g., unknown edition or data not available)
2934
+ * const response = await client.getReferrerMetricsEditions({
2935
+ * referrer: "0x1234567890123456789012345678901234567890",
2936
+ * editions: ["2025-12", "invalid-edition"]
1462
2937
  * });
1463
2938
  *
1464
- * if (response.responseCode === ReferrerDetailResponseCodes.Error) {
2939
+ * if (response.responseCode === ReferrerMetricsEditionsResponseCodes.Error) {
1465
2940
  * console.error(response.error);
1466
2941
  * console.error(response.errorMessage);
1467
2942
  * }
1468
2943
  * ```
1469
2944
  */
1470
- async getReferrerDetail(request) {
2945
+ async getReferrerMetricsEditions(request) {
1471
2946
  const url = new URL(
1472
- `/ensanalytics/referrers/${encodeURIComponent(request.referrer)}`,
2947
+ `/v1/ensanalytics/referrer/${encodeURIComponent(request.referrer)}`,
1473
2948
  this.options.url
1474
2949
  );
2950
+ url.searchParams.set("editions", request.editions.join(","));
2951
+ const response = await fetch(url);
2952
+ let responseData;
2953
+ try {
2954
+ responseData = await response.json();
2955
+ } catch {
2956
+ throw new Error("Malformed response data: invalid JSON");
2957
+ }
2958
+ return deserializeReferrerMetricsEditionsResponse(
2959
+ responseData
2960
+ );
2961
+ }
2962
+ /**
2963
+ * Get the currently configured referral program edition summaries.
2964
+ * Editions are sorted in descending order by start timestamp (most recent first).
2965
+ *
2966
+ * @returns A response containing edition summaries, or an error response if unavailable.
2967
+ *
2968
+ * @remarks Editions whose `rules.awardModel` is not recognized by this client version are
2969
+ * preserved as {@link ReferralProgramEditionSummaryUnrecognized}. The returned response includes all
2970
+ * editions — recognized and unrecognized alike. Callers should check `edition.awardModel`
2971
+ * and skip editions with `"unrecognized"` as appropriate. The returned editions list may be empty.
2972
+ *
2973
+ * @example
2974
+ * ```typescript
2975
+ * const response = await client.getEditionSummaries();
2976
+ *
2977
+ * if (response.responseCode === ReferralProgramEditionSummariesResponseCodes.Ok) {
2978
+ * console.log(`Found ${response.data.editions.length} editions`);
2979
+ * for (const edition of response.data.editions) {
2980
+ * console.log(`${edition.slug}: ${edition.displayName}`);
2981
+ * }
2982
+ * }
2983
+ * ```
2984
+ *
2985
+ * @example
2986
+ * ```typescript
2987
+ * // Handle error response
2988
+ * const response = await client.getEditionSummaries();
2989
+ *
2990
+ * if (response.responseCode === ReferralProgramEditionSummariesResponseCodes.Error) {
2991
+ * console.error(response.error);
2992
+ * console.error(response.errorMessage);
2993
+ * }
2994
+ * ```
2995
+ */
2996
+ async getEditionSummaries() {
2997
+ const url = new URL(`/v1/ensanalytics/editions`, this.options.url);
1475
2998
  const response = await fetch(url);
1476
2999
  let responseData;
1477
3000
  try {
@@ -1479,53 +3002,111 @@ var ENSReferralsClient = class _ENSReferralsClient {
1479
3002
  } catch {
1480
3003
  throw new Error("Malformed response data: invalid JSON");
1481
3004
  }
1482
- return deserializeReferrerDetailResponse(responseData);
3005
+ return deserializeReferralProgramEditionSummariesResponse(
3006
+ responseData
3007
+ );
1483
3008
  }
1484
3009
  };
1485
3010
 
1486
- // src/currency.ts
1487
- function isValidUSDQuantity(value) {
1488
- return isFiniteNonNegativeNumber(value);
1489
- }
1490
- function validateUSDQuantity(value) {
1491
- if (!isValidUSDQuantity(value)) {
1492
- throw new Error(`Invalid USD quantity: ${value}.`);
3011
+ // src/edition-metrics.ts
3012
+ var getReferrerEditionMetrics = (referrer, leaderboard) => {
3013
+ switch (leaderboard.awardModel) {
3014
+ case ReferralProgramAwardModels.PieSplit: {
3015
+ const status = calcReferralProgramEditionStatusPieSplit(
3016
+ leaderboard.rules,
3017
+ leaderboard.accurateAsOf
3018
+ );
3019
+ const awardedReferrerMetrics = leaderboard.referrers.get(referrer);
3020
+ if (awardedReferrerMetrics) {
3021
+ return {
3022
+ awardModel: leaderboard.awardModel,
3023
+ type: ReferrerEditionMetricsTypeIds.Ranked,
3024
+ rules: leaderboard.rules,
3025
+ referrer: awardedReferrerMetrics,
3026
+ aggregatedMetrics: leaderboard.aggregatedMetrics,
3027
+ status,
3028
+ accurateAsOf: leaderboard.accurateAsOf
3029
+ };
3030
+ }
3031
+ return {
3032
+ awardModel: leaderboard.awardModel,
3033
+ type: ReferrerEditionMetricsTypeIds.Unranked,
3034
+ rules: leaderboard.rules,
3035
+ referrer: buildUnrankedReferrerMetricsPieSplit(referrer),
3036
+ aggregatedMetrics: leaderboard.aggregatedMetrics,
3037
+ status,
3038
+ accurateAsOf: leaderboard.accurateAsOf
3039
+ };
3040
+ }
3041
+ case ReferralProgramAwardModels.RevShareCap: {
3042
+ const status = calcReferralProgramEditionStatusRevShareCap(
3043
+ leaderboard.rules,
3044
+ leaderboard.accurateAsOf,
3045
+ leaderboard.aggregatedMetrics
3046
+ );
3047
+ const awardedReferrerMetrics = leaderboard.referrers.get(referrer);
3048
+ if (awardedReferrerMetrics) {
3049
+ return {
3050
+ awardModel: leaderboard.awardModel,
3051
+ type: ReferrerEditionMetricsTypeIds.Ranked,
3052
+ rules: leaderboard.rules,
3053
+ referrer: awardedReferrerMetrics,
3054
+ aggregatedMetrics: leaderboard.aggregatedMetrics,
3055
+ status,
3056
+ accurateAsOf: leaderboard.accurateAsOf
3057
+ };
3058
+ }
3059
+ return {
3060
+ awardModel: leaderboard.awardModel,
3061
+ type: ReferrerEditionMetricsTypeIds.Unranked,
3062
+ rules: leaderboard.rules,
3063
+ referrer: buildUnrankedReferrerMetricsRevShareCap(referrer, leaderboard.rules),
3064
+ aggregatedMetrics: leaderboard.aggregatedMetrics,
3065
+ status,
3066
+ accurateAsOf: leaderboard.accurateAsOf
3067
+ };
3068
+ }
3069
+ default: {
3070
+ const _exhaustiveCheck = leaderboard;
3071
+ throw new Error(
3072
+ `Unknown award model: ${_exhaustiveCheck.awardModel}`
3073
+ );
3074
+ }
1493
3075
  }
1494
- }
3076
+ };
1495
3077
 
1496
- // src/leaderboard.ts
1497
- var buildReferrerLeaderboard = (allReferrers, rules, accurateAsOf) => {
1498
- const uniqueReferrers = allReferrers.map((referrer) => referrer.referrer);
1499
- if (uniqueReferrers.length !== allReferrers.length) {
1500
- throw new Error(
1501
- "ReferrerLeaderboard: Cannot buildReferrerLeaderboard containing duplicate referrers"
1502
- );
3078
+ // src/edition-summary.ts
3079
+ function buildEditionSummary(config, leaderboard) {
3080
+ const { slug, displayName } = config;
3081
+ switch (leaderboard.awardModel) {
3082
+ case ReferralProgramAwardModels.PieSplit:
3083
+ return buildEditionSummaryPieSplit(slug, displayName, leaderboard.rules, leaderboard);
3084
+ case ReferralProgramAwardModels.RevShareCap:
3085
+ return buildEditionSummaryRevShareCap(slug, displayName, leaderboard.rules, leaderboard);
3086
+ default: {
3087
+ const _exhaustiveCheck = leaderboard;
3088
+ throw new Error(
3089
+ `Unknown award model: ${_exhaustiveCheck.awardModel}`
3090
+ );
3091
+ }
1503
3092
  }
1504
- if (accurateAsOf < rules.startTime && allReferrers.length > 0) {
1505
- throw new Error(
1506
- `ReferrerLeaderboard: accurateAsOf (${accurateAsOf}) is before startTime (${rules.startTime}) which indicates allReferrers should be empty, but allReferrers is not empty.`
1507
- );
3093
+ }
3094
+
3095
+ // src/leaderboard-page.ts
3096
+ var getReferrerLeaderboardPage = (pageParams, leaderboard) => {
3097
+ const pageContext = buildReferrerLeaderboardPageContext(pageParams, leaderboard);
3098
+ switch (leaderboard.awardModel) {
3099
+ case ReferralProgramAwardModels.PieSplit:
3100
+ return buildLeaderboardPagePieSplit(pageContext, leaderboard);
3101
+ case ReferralProgramAwardModels.RevShareCap:
3102
+ return buildLeaderboardPageRevShareCap(pageContext, leaderboard);
3103
+ default: {
3104
+ const _exhaustiveCheck = leaderboard;
3105
+ throw new Error(
3106
+ `Unknown award model: ${_exhaustiveCheck.awardModel}`
3107
+ );
3108
+ }
1508
3109
  }
1509
- const sortedReferrers = sortReferrerMetrics(allReferrers);
1510
- const scoredReferrers = sortedReferrers.map((referrer) => buildScoredReferrerMetrics(referrer));
1511
- const rankedReferrers = scoredReferrers.map((referrer, index) => {
1512
- return buildRankedReferrerMetrics(referrer, index + 1, rules);
1513
- });
1514
- const aggregatedMetrics = buildAggregatedReferrerMetrics(rankedReferrers, rules);
1515
- const awardedReferrers = rankedReferrers.map((referrer) => {
1516
- return buildAwardedReferrerMetrics(referrer, aggregatedMetrics, rules);
1517
- });
1518
- const referrers = new Map(
1519
- awardedReferrers.map((referrer) => {
1520
- return [referrer.referrer, referrer];
1521
- })
1522
- );
1523
- return {
1524
- rules,
1525
- aggregatedMetrics,
1526
- referrers,
1527
- accurateAsOf
1528
- };
1529
3110
  };
1530
3111
 
1531
3112
  // src/link.ts
@@ -1535,53 +3116,4 @@ function buildEnsReferralUrl(address) {
1535
3116
  ensAppUrl.searchParams.set("referrer", (0, import_viem3.getAddress)(address));
1536
3117
  return ensAppUrl;
1537
3118
  }
1538
-
1539
- // src/rules.ts
1540
- var ENS_HOLIDAY_AWARDS_START_DATE = 1764547200;
1541
- var ENS_HOLIDAY_AWARDS_END_DATE = 1767225599;
1542
- var ENS_HOLIDAY_AWARDS_MAX_QUALIFIED_REFERRERS = 10;
1543
- var ENS_HOLIDAY_AWARDS_TOTAL_AWARD_POOL_VALUE = 1e4;
1544
- var validateReferralProgramRules = (rules) => {
1545
- validateUSDQuantity(rules.totalAwardPoolValue);
1546
- validateNonNegativeInteger(rules.maxQualifiedReferrers);
1547
- validateUnixTimestamp(rules.startTime);
1548
- validateUnixTimestamp(rules.endTime);
1549
- if (rules.endTime < rules.startTime) {
1550
- throw new Error(
1551
- `ReferralProgramRules: startTime: ${rules.startTime} is after endTime: ${rules.endTime}.`
1552
- );
1553
- }
1554
- };
1555
- var buildReferralProgramRules = (totalAwardPoolValue, maxQualifiedReferrers, startTime, endTime, subregistryId) => {
1556
- const result = {
1557
- totalAwardPoolValue,
1558
- maxQualifiedReferrers,
1559
- startTime,
1560
- endTime,
1561
- subregistryId
1562
- };
1563
- validateReferralProgramRules(result);
1564
- return result;
1565
- };
1566
-
1567
- // src/status.ts
1568
- var ReferralProgramStatuses = {
1569
- /**
1570
- * Represents a referral program that has been announced, but hasn't started yet.
1571
- */
1572
- Scheduled: "Scheduled",
1573
- /**
1574
- * Represents a currently ongoing referral program.
1575
- */
1576
- Active: "Active",
1577
- /**
1578
- * Represents a referral program that has already ended.
1579
- */
1580
- Closed: "Closed"
1581
- };
1582
- var calcReferralProgramStatus = (referralProgramRules, now) => {
1583
- if (now < referralProgramRules.startTime) return ReferralProgramStatuses.Scheduled;
1584
- if (now > referralProgramRules.endTime) return ReferralProgramStatuses.Closed;
1585
- return ReferralProgramStatuses.Active;
1586
- };
1587
3119
  //# sourceMappingURL=index.cjs.map