@namehash/ens-referrals 1.9.0 → 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/README.md +20 -22
- package/dist/index.cjs +2360 -828
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1525 -426
- package/dist/index.d.ts +1525 -426
- package/dist/index.js +2347 -825
- package/dist/index.js.map +1 -1
- package/package.json +4 -13
- package/dist/v1/index.cjs +0 -20902
- package/dist/v1/index.cjs.map +0 -1
- package/dist/v1/index.d.cts +0 -2098
- package/dist/v1/index.d.ts +0 -2098
- package/dist/v1/index.js +0 -20879
- package/dist/v1/index.js.map +0 -1
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
|
-
|
|
26
|
-
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
-
|
|
37
|
-
|
|
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
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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
|
-
|
|
77
|
+
deserializeReferralProgramEditionConfigSetArray: () => deserializeReferralProgramEditionConfigSetArray,
|
|
78
|
+
deserializeReferralProgramEditionSummariesResponse: () => deserializeReferralProgramEditionSummariesResponse,
|
|
55
79
|
deserializeReferrerLeaderboardPageResponse: () => deserializeReferrerLeaderboardPageResponse,
|
|
56
|
-
|
|
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
|
-
|
|
87
|
+
isReferrerQualifiedRevShareCap: () => isReferrerQualifiedRevShareCap,
|
|
63
88
|
isValidDuration: () => isValidDuration,
|
|
64
89
|
isValidReferrerScore: () => isValidReferrerScore,
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
-
|
|
72
|
-
|
|
97
|
+
validateAggregatedReferrerMetricsPieSplit: () => validateAggregatedReferrerMetricsPieSplit,
|
|
98
|
+
validateAggregatedReferrerMetricsRevShareCap: () => validateAggregatedReferrerMetricsRevShareCap,
|
|
99
|
+
validateAwardedReferrerMetricsPieSplit: () => validateAwardedReferrerMetricsPieSplit,
|
|
100
|
+
validateAwardedReferrerMetricsRevShareCap: () => validateAwardedReferrerMetricsRevShareCap,
|
|
101
|
+
validateBaseReferralProgramEditionSummary: () => validateBaseReferralProgramEditionSummary,
|
|
102
|
+
validateBaseReferralProgramRules: () => validateBaseReferralProgramRules,
|
|
73
103
|
validateDuration: () => validateDuration,
|
|
74
|
-
|
|
104
|
+
validateEditionSummaryPieSplit: () => validateEditionSummaryPieSplit,
|
|
105
|
+
validateEditionSummaryRevShareCap: () => validateEditionSummaryRevShareCap,
|
|
75
106
|
validateNonNegativeInteger: () => validateNonNegativeInteger,
|
|
76
|
-
|
|
77
|
-
|
|
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
|
-
|
|
83
|
-
validateScoredReferrerMetrics: () => validateScoredReferrerMetrics,
|
|
84
|
-
validateUSDQuantity: () => validateUSDQuantity,
|
|
118
|
+
validateScoredReferrerMetricsPieSplit: () => validateScoredReferrerMetricsPieSplit,
|
|
85
119
|
validateUnixTimestamp: () => validateUnixTimestamp,
|
|
86
|
-
|
|
120
|
+
validateUnrankedReferrerMetricsPieSplit: () => validateUnrankedReferrerMetricsPieSplit,
|
|
121
|
+
validateUnrankedReferrerMetricsRevShareCap: () => validateUnrankedReferrerMetricsRevShareCap
|
|
87
122
|
});
|
|
88
123
|
module.exports = __toCommonJS(index_exports);
|
|
89
124
|
|
|
90
125
|
// src/address.ts
|
|
91
|
-
var
|
|
92
|
-
var
|
|
93
|
-
if (!(0,
|
|
94
|
-
throw new Error(`Invalid address: ${address}. Address must be a
|
|
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
|
|
134
|
+
var import_v46 = require("zod/v4");
|
|
216
135
|
|
|
217
136
|
// src/api/zod-schemas.ts
|
|
218
|
-
var
|
|
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/
|
|
524
|
-
|
|
525
|
-
|
|
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
|
|
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) =>
|
|
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:
|
|
569
|
+
address: makeNormalizedAddressSchema(`${valueLabel} address`)
|
|
562
570
|
});
|
|
563
571
|
|
|
564
|
-
// src/
|
|
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:
|
|
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
|
|
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
|
|
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
|
-
|
|
658
|
-
|
|
659
|
-
|
|
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
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
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/
|
|
679
|
-
var
|
|
680
|
-
|
|
681
|
-
|
|
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
|
-
|
|
685
|
-
|
|
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
|
-
|
|
698
|
-
if (
|
|
699
|
-
|
|
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
|
-
|
|
702
|
-
if (b.referrer < a.referrer) return -1;
|
|
703
|
-
return 0;
|
|
704
|
-
};
|
|
863
|
+
}
|
|
705
864
|
|
|
706
|
-
// src/
|
|
707
|
-
var
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
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
|
-
|
|
2123
|
+
validateNormalizedAddress(metrics.referrer);
|
|
719
2124
|
validateNonNegativeInteger(metrics.totalReferrals);
|
|
720
2125
|
validateDuration(metrics.totalIncrementalDuration);
|
|
721
|
-
|
|
2126
|
+
makePriceEthSchema("ReferrerMetrics.totalRevenueContribution").parse(
|
|
2127
|
+
metrics.totalRevenueContribution
|
|
2128
|
+
);
|
|
722
2129
|
};
|
|
723
|
-
|
|
724
|
-
|
|
2130
|
+
|
|
2131
|
+
// src/award-models/pie-split/score.ts
|
|
2132
|
+
var calcReferrerScorePieSplit = (totalIncrementalDuration) => {
|
|
2133
|
+
return totalIncrementalDuration / SECONDS_PER_YEAR;
|
|
725
2134
|
};
|
|
726
|
-
|
|
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:
|
|
2156
|
+
score: calcReferrerScorePieSplit(referrer.totalIncrementalDuration)
|
|
730
2157
|
};
|
|
731
|
-
|
|
2158
|
+
validateScoredReferrerMetricsPieSplit(result);
|
|
732
2159
|
return result;
|
|
733
2160
|
};
|
|
734
|
-
var
|
|
2161
|
+
var validateScoredReferrerMetricsPieSplit = (metrics) => {
|
|
735
2162
|
validateReferrerMetrics(metrics);
|
|
736
2163
|
validateReferrerScore(metrics.score);
|
|
737
|
-
const expectedScore =
|
|
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
|
|
743
|
-
|
|
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
|
|
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 =
|
|
2178
|
+
const expectedIsQualified = isReferrerQualifiedPieSplit(metrics.rank, rules);
|
|
752
2179
|
if (metrics.isQualified !== expectedIsQualified) {
|
|
753
2180
|
throw new Error(
|
|
754
|
-
`
|
|
2181
|
+
`RankedReferrerMetricsPieSplit: Invalid isQualified: ${metrics.isQualified}, expected: ${expectedIsQualified}.`
|
|
755
2182
|
);
|
|
756
2183
|
}
|
|
757
|
-
const expectedFinalScoreBoost =
|
|
2184
|
+
const expectedFinalScoreBoost = calcReferrerFinalScoreBoostPieSplit(metrics.rank, rules);
|
|
758
2185
|
if (metrics.finalScoreBoost !== expectedFinalScoreBoost) {
|
|
759
2186
|
throw new Error(
|
|
760
|
-
`
|
|
2187
|
+
`RankedReferrerMetricsPieSplit: Invalid finalScoreBoost: ${metrics.finalScoreBoost}, expected: ${expectedFinalScoreBoost}.`
|
|
761
2188
|
);
|
|
762
2189
|
}
|
|
763
|
-
const expectedFinalScore =
|
|
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
|
-
`
|
|
2197
|
+
`RankedReferrerMetricsPieSplit: Invalid finalScore: ${metrics.finalScore}, expected: ${expectedFinalScore}.`
|
|
771
2198
|
);
|
|
772
2199
|
}
|
|
773
2200
|
};
|
|
774
|
-
var
|
|
2201
|
+
var buildRankedReferrerMetricsPieSplit = (referrer, rank, rules) => {
|
|
775
2202
|
const result = {
|
|
776
2203
|
...referrer,
|
|
777
2204
|
rank,
|
|
778
|
-
isQualified:
|
|
779
|
-
finalScoreBoost:
|
|
780
|
-
finalScore:
|
|
2205
|
+
isQualified: isReferrerQualifiedPieSplit(rank, rules),
|
|
2206
|
+
finalScoreBoost: calcReferrerFinalScoreBoostPieSplit(rank, rules),
|
|
2207
|
+
finalScore: calcReferrerFinalScorePieSplit(rank, referrer.totalIncrementalDuration, rules)
|
|
781
2208
|
};
|
|
782
|
-
|
|
2209
|
+
validateRankedReferrerMetricsPieSplit(result, rules);
|
|
783
2210
|
return result;
|
|
784
2211
|
};
|
|
785
|
-
var
|
|
786
|
-
if (!
|
|
2212
|
+
var calcReferrerAwardPoolSharePieSplit = (referrer, aggregatedMetrics) => {
|
|
2213
|
+
if (!referrer.isQualified) return 0;
|
|
787
2214
|
if (aggregatedMetrics.grandTotalQualifiedReferrersFinalScore === 0) return 0;
|
|
788
|
-
return
|
|
2215
|
+
return referrer.finalScore / aggregatedMetrics.grandTotalQualifiedReferrersFinalScore;
|
|
789
2216
|
};
|
|
790
|
-
var
|
|
791
|
-
|
|
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
|
|
2221
|
+
`Invalid AwardedReferrerMetricsPieSplit: ${referrer.awardPoolShare}. awardPoolShare must be between 0 and 1 (inclusive).`
|
|
795
2222
|
);
|
|
796
2223
|
}
|
|
797
|
-
|
|
2224
|
+
makePriceUsdcSchema("AwardedReferrerMetricsPieSplit.awardPoolApproxValue").parse(
|
|
2225
|
+
referrer.awardPoolApproxValue
|
|
2226
|
+
);
|
|
2227
|
+
if (referrer.awardPoolApproxValue.amount > rules.awardPool.amount) {
|
|
798
2228
|
throw new Error(
|
|
799
|
-
`
|
|
2229
|
+
`AwardedReferrerMetricsPieSplit: awardPoolApproxValue.amount ${referrer.awardPoolApproxValue.amount.toString()} exceeds awardPool.amount ${rules.awardPool.amount.toString()}.`
|
|
800
2230
|
);
|
|
801
2231
|
}
|
|
802
2232
|
};
|
|
803
|
-
var
|
|
804
|
-
const awardPoolShare =
|
|
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
|
|
2239
|
+
awardPoolApproxValue
|
|
809
2240
|
};
|
|
810
|
-
|
|
2241
|
+
validateAwardedReferrerMetricsPieSplit(result, rules);
|
|
811
2242
|
return result;
|
|
812
2243
|
};
|
|
813
|
-
var
|
|
814
|
-
|
|
2244
|
+
var validateUnrankedReferrerMetricsPieSplit = (metrics) => {
|
|
2245
|
+
validateScoredReferrerMetricsPieSplit(metrics);
|
|
815
2246
|
if (metrics.rank !== null) {
|
|
816
|
-
throw new Error(
|
|
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
|
|
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
|
|
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
|
|
2263
|
+
`Invalid UnrankedReferrerMetricsPieSplit: totalIncrementalDuration must be 0, got: ${metrics.totalIncrementalDuration}.`
|
|
831
2264
|
);
|
|
832
2265
|
}
|
|
833
|
-
|
|
2266
|
+
makePriceEthSchema("UnrankedReferrerMetricsPieSplit.totalRevenueContribution").parse(
|
|
2267
|
+
metrics.totalRevenueContribution
|
|
2268
|
+
);
|
|
2269
|
+
if (metrics.totalRevenueContribution.amount !== 0n) {
|
|
834
2270
|
throw new Error(
|
|
835
|
-
`Invalid
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
2291
|
+
`Invalid UnrankedReferrerMetricsPieSplit: awardPoolShare must be 0, got: ${metrics.awardPoolShare}.`
|
|
854
2292
|
);
|
|
855
2293
|
}
|
|
856
|
-
|
|
2294
|
+
makePriceUsdcSchema("UnrankedReferrerMetricsPieSplit.awardPoolApproxValue").parse(
|
|
2295
|
+
metrics.awardPoolApproxValue
|
|
2296
|
+
);
|
|
2297
|
+
if (metrics.awardPoolApproxValue.amount !== 0n) {
|
|
857
2298
|
throw new Error(
|
|
858
|
-
`Invalid
|
|
2299
|
+
`Invalid UnrankedReferrerMetricsPieSplit: awardPoolApproxValue must be 0n, got: ${metrics.awardPoolApproxValue.amount.toString()}.`
|
|
859
2300
|
);
|
|
860
2301
|
}
|
|
861
2302
|
};
|
|
862
|
-
var
|
|
863
|
-
const
|
|
864
|
-
const scoredMetrics =
|
|
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:
|
|
2313
|
+
awardPoolApproxValue: priceUsdc(0n)
|
|
873
2314
|
};
|
|
874
|
-
|
|
2315
|
+
validateUnrankedReferrerMetricsPieSplit(result);
|
|
875
2316
|
return result;
|
|
876
2317
|
};
|
|
877
2318
|
|
|
878
|
-
// src/
|
|
879
|
-
var
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
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
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
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
|
-
|
|
2342
|
+
awardModel: leaderboard.awardModel,
|
|
902
2343
|
rules: leaderboard.rules,
|
|
903
|
-
|
|
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/
|
|
910
|
-
var
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
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
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
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/
|
|
932
|
-
var
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
}
|
|
937
|
-
|
|
938
|
-
|
|
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/
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
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
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
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
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
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
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
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
|
-
|
|
1155
|
-
const parsed = schema.safeParse(deserialized);
|
|
1156
|
-
if (parsed.error) {
|
|
2534
|
+
if (metrics.isQualified !== false) {
|
|
1157
2535
|
throw new Error(
|
|
1158
|
-
`
|
|
1159
|
-
${(0, import_v43.prettifyError)(parsed.error)}
|
|
1160
|
-
`
|
|
2536
|
+
`Invalid UnrankedReferrerMetricsRevShareCap: isQualified must be false, got: ${metrics.isQualified}.`
|
|
1161
2537
|
);
|
|
1162
2538
|
}
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
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
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
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
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
}
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
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
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
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
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
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
|
|
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 -
|
|
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
|
|
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
|
-
*
|
|
1348
|
-
*
|
|
1349
|
-
*
|
|
1350
|
-
*
|
|
1351
|
-
*
|
|
1352
|
-
*
|
|
1353
|
-
*
|
|
1354
|
-
*
|
|
1355
|
-
*
|
|
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({
|
|
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
|
|
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/
|
|
1380
|
-
|
|
1381
|
-
if (request
|
|
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
|
|
2853
|
+
* Fetch Referrer Metrics for Specific Editions
|
|
1396
2854
|
*
|
|
1397
|
-
* Retrieves detailed information about a specific referrer
|
|
1398
|
-
*
|
|
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
|
|
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
|
-
*
|
|
1403
|
-
*
|
|
1404
|
-
* -
|
|
1405
|
-
* - `
|
|
1406
|
-
*
|
|
1407
|
-
* - `
|
|
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
|
-
* **
|
|
1410
|
-
*
|
|
1411
|
-
*
|
|
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 {
|
|
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
|
|
1427
|
-
* const response = await client.
|
|
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 ===
|
|
1431
|
-
*
|
|
1432
|
-
*
|
|
1433
|
-
*
|
|
1434
|
-
*
|
|
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
|
-
* //
|
|
1441
|
-
* const response = await client.
|
|
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 ===
|
|
1445
|
-
*
|
|
1446
|
-
*
|
|
1447
|
-
* console.log(`
|
|
1448
|
-
*
|
|
1449
|
-
* console.log(`
|
|
1450
|
-
* } else {
|
|
1451
|
-
*
|
|
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
|
|
1460
|
-
* const response = await client.
|
|
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 ===
|
|
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
|
|
2945
|
+
async getReferrerMetricsEditions(request) {
|
|
1471
2946
|
const url = new URL(
|
|
1472
|
-
`/ensanalytics/
|
|
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
|
|
3005
|
+
return deserializeReferralProgramEditionSummariesResponse(
|
|
3006
|
+
responseData
|
|
3007
|
+
);
|
|
1483
3008
|
}
|
|
1484
3009
|
};
|
|
1485
3010
|
|
|
1486
|
-
// src/
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
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/
|
|
1497
|
-
|
|
1498
|
-
const
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
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
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
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
|