@namehash/ens-referrals 0.0.0-next-20260117070300 → 0.0.0-next-20260119200329
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1085 -182
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +404 -110
- package/dist/index.d.ts +404 -110
- package/dist/index.js +1078 -185
- package/dist/index.js.map +1 -1
- package/package.json +6 -2
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,27 +17,34 @@ 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, {
|
|
23
|
-
|
|
24
|
-
|
|
33
|
+
DEFAULT_ENSNODE_API_URL: () => DEFAULT_ENSNODE_API_URL,
|
|
34
|
+
ENSReferralsClient: () => ENSReferralsClient,
|
|
25
35
|
ENS_HOLIDAY_AWARDS_END_DATE: () => ENS_HOLIDAY_AWARDS_END_DATE,
|
|
26
36
|
ENS_HOLIDAY_AWARDS_MAX_QUALIFIED_REFERRERS: () => ENS_HOLIDAY_AWARDS_MAX_QUALIFIED_REFERRERS,
|
|
27
37
|
ENS_HOLIDAY_AWARDS_START_DATE: () => ENS_HOLIDAY_AWARDS_START_DATE,
|
|
28
38
|
ENS_HOLIDAY_AWARDS_TOTAL_AWARD_POOL_VALUE: () => ENS_HOLIDAY_AWARDS_TOTAL_AWARD_POOL_VALUE,
|
|
29
|
-
EXPECTED_ENCODED_REFERRER_PADDING: () => EXPECTED_ENCODED_REFERRER_PADDING,
|
|
30
39
|
REFERRERS_PER_LEADERBOARD_PAGE_DEFAULT: () => REFERRERS_PER_LEADERBOARD_PAGE_DEFAULT,
|
|
31
40
|
REFERRERS_PER_LEADERBOARD_PAGE_MAX: () => REFERRERS_PER_LEADERBOARD_PAGE_MAX,
|
|
32
41
|
ReferralProgramStatuses: () => ReferralProgramStatuses,
|
|
42
|
+
ReferrerDetailResponseCodes: () => ReferrerDetailResponseCodes,
|
|
33
43
|
ReferrerDetailTypeIds: () => ReferrerDetailTypeIds,
|
|
44
|
+
ReferrerLeaderboardPageResponseCodes: () => ReferrerLeaderboardPageResponseCodes,
|
|
34
45
|
SECONDS_PER_YEAR: () => SECONDS_PER_YEAR,
|
|
35
|
-
ZERO_ENCODED_REFERRER: () => ZERO_ENCODED_REFERRER,
|
|
36
46
|
buildAggregatedReferrerMetrics: () => buildAggregatedReferrerMetrics,
|
|
37
47
|
buildAwardedReferrerMetrics: () => buildAwardedReferrerMetrics,
|
|
38
|
-
buildEncodedReferrer: () => buildEncodedReferrer,
|
|
39
48
|
buildEnsReferralUrl: () => buildEnsReferralUrl,
|
|
40
49
|
buildRankedReferrerMetrics: () => buildRankedReferrerMetrics,
|
|
41
50
|
buildReferralProgramRules: () => buildReferralProgramRules,
|
|
@@ -52,7 +61,8 @@ __export(index_exports, {
|
|
|
52
61
|
calcReferrerFinalScoreMultiplier: () => calcReferrerFinalScoreMultiplier,
|
|
53
62
|
calcReferrerScore: () => calcReferrerScore,
|
|
54
63
|
compareReferrerMetrics: () => compareReferrerMetrics,
|
|
55
|
-
|
|
64
|
+
deserializeReferrerDetailResponse: () => deserializeReferrerDetailResponse,
|
|
65
|
+
deserializeReferrerLeaderboardPageResponse: () => deserializeReferrerLeaderboardPageResponse,
|
|
56
66
|
getReferrerDetail: () => getReferrerDetail,
|
|
57
67
|
getReferrerLeaderboardPage: () => getReferrerLeaderboardPage,
|
|
58
68
|
isFiniteNonNegativeNumber: () => isFiniteNonNegativeNumber,
|
|
@@ -65,6 +75,8 @@ __export(index_exports, {
|
|
|
65
75
|
isValidRevenueContribution: () => isValidRevenueContribution,
|
|
66
76
|
isValidUSDQuantity: () => isValidUSDQuantity,
|
|
67
77
|
normalizeAddress: () => normalizeAddress,
|
|
78
|
+
serializeReferrerDetailResponse: () => serializeReferrerDetailResponse,
|
|
79
|
+
serializeReferrerLeaderboardPageResponse: () => serializeReferrerLeaderboardPageResponse,
|
|
68
80
|
sortReferrerMetrics: () => sortReferrerMetrics,
|
|
69
81
|
validateAggregatedReferrerMetrics: () => validateAggregatedReferrerMetrics,
|
|
70
82
|
validateAwardedReferrerMetrics: () => validateAwardedReferrerMetrics,
|
|
@@ -209,49 +221,467 @@ var buildAggregatedReferrerMetrics = (referrers, rules) => {
|
|
|
209
221
|
return result;
|
|
210
222
|
};
|
|
211
223
|
|
|
212
|
-
// src/
|
|
213
|
-
|
|
214
|
-
|
|
224
|
+
// src/api/deserialize.ts
|
|
225
|
+
var import_v43 = require("zod/v4");
|
|
226
|
+
|
|
227
|
+
// src/api/zod-schemas.ts
|
|
228
|
+
var import_v42 = __toESM(require("zod/v4"), 1);
|
|
229
|
+
|
|
230
|
+
// ../ensnode-sdk/src/shared/address.ts
|
|
231
|
+
function asLowerCaseAddress(address) {
|
|
232
|
+
return address.toLowerCase();
|
|
215
233
|
}
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
234
|
+
|
|
235
|
+
// ../../node_modules/.pnpm/caip@1.1.1/node_modules/caip/dist/index.mjs
|
|
236
|
+
function _extends() {
|
|
237
|
+
_extends = Object.assign || function(target) {
|
|
238
|
+
for (var i = 1; i < arguments.length; i++) {
|
|
239
|
+
var source = arguments[i];
|
|
240
|
+
for (var key in source) {
|
|
241
|
+
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
242
|
+
target[key] = source[key];
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
return target;
|
|
247
|
+
};
|
|
248
|
+
return _extends.apply(this, arguments);
|
|
249
|
+
}
|
|
250
|
+
var CAIP2 = {
|
|
251
|
+
name: "chainId",
|
|
252
|
+
regex: "[-:a-zA-Z0-9]{5,41}",
|
|
253
|
+
parameters: {
|
|
254
|
+
delimiter: ":",
|
|
255
|
+
values: {
|
|
256
|
+
0: {
|
|
257
|
+
name: "namespace",
|
|
258
|
+
regex: "[-a-z0-9]{3,8}"
|
|
259
|
+
},
|
|
260
|
+
1: {
|
|
261
|
+
name: "reference",
|
|
262
|
+
regex: "[-a-zA-Z0-9]{1,32}"
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
};
|
|
267
|
+
var CAIP10 = {
|
|
268
|
+
name: "accountId",
|
|
269
|
+
regex: "[-:a-zA-Z0-9]{7,106}",
|
|
270
|
+
parameters: {
|
|
271
|
+
delimiter: ":",
|
|
272
|
+
values: {
|
|
273
|
+
0: {
|
|
274
|
+
name: "namespace",
|
|
275
|
+
regex: "[-a-z0-9]{3,8}"
|
|
276
|
+
},
|
|
277
|
+
1: {
|
|
278
|
+
name: "reference",
|
|
279
|
+
regex: "[-a-zA-Z0-9]{1,32}"
|
|
280
|
+
},
|
|
281
|
+
2: {
|
|
282
|
+
name: "address",
|
|
283
|
+
regex: "[a-zA-Z0-9]{1,64}"
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
};
|
|
288
|
+
var AssetName$1 = {
|
|
289
|
+
name: "assetName",
|
|
290
|
+
regex: "[-:a-zA-Z0-9]{5,73}",
|
|
291
|
+
parameters: {
|
|
292
|
+
delimiter: ":",
|
|
293
|
+
values: {
|
|
294
|
+
0: {
|
|
295
|
+
name: "namespace",
|
|
296
|
+
regex: "[-a-z0-9]{3,8}"
|
|
297
|
+
},
|
|
298
|
+
1: {
|
|
299
|
+
name: "reference",
|
|
300
|
+
regex: "[-a-zA-Z0-9]{1,64}"
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
};
|
|
305
|
+
var CAIP19AssetType = {
|
|
306
|
+
name: "assetType",
|
|
307
|
+
regex: "[-:a-zA-Z0-9]{11,115}",
|
|
308
|
+
parameters: {
|
|
309
|
+
delimiter: "/",
|
|
310
|
+
values: {
|
|
311
|
+
0: CAIP2,
|
|
312
|
+
1: AssetName$1
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
};
|
|
316
|
+
var CAIP19AssetId = {
|
|
317
|
+
name: "assetId",
|
|
318
|
+
regex: "[-:a-zA-Z0-9]{13,148}",
|
|
319
|
+
parameters: {
|
|
320
|
+
delimiter: "/",
|
|
321
|
+
values: {
|
|
322
|
+
0: CAIP2,
|
|
323
|
+
1: AssetName$1,
|
|
324
|
+
2: {
|
|
325
|
+
name: "tokenId",
|
|
326
|
+
regex: "[-a-zA-Z0-9]{1,32}"
|
|
327
|
+
}
|
|
328
|
+
}
|
|
219
329
|
}
|
|
330
|
+
};
|
|
331
|
+
var CAIP = {
|
|
332
|
+
"2": CAIP2,
|
|
333
|
+
"10": CAIP10,
|
|
334
|
+
"19": {
|
|
335
|
+
assetName: AssetName$1,
|
|
336
|
+
assetType: CAIP19AssetType,
|
|
337
|
+
assetId: CAIP19AssetId
|
|
338
|
+
}
|
|
339
|
+
};
|
|
340
|
+
function splitParams(id, spec) {
|
|
341
|
+
return id.split(spec.parameters.delimiter);
|
|
342
|
+
}
|
|
343
|
+
function getParams(id, spec) {
|
|
344
|
+
var arr = splitParams(id, spec);
|
|
345
|
+
var params = {};
|
|
346
|
+
arr.forEach(function(value, index) {
|
|
347
|
+
params[spec.parameters.values[index].name] = value;
|
|
348
|
+
});
|
|
349
|
+
return params;
|
|
350
|
+
}
|
|
351
|
+
function joinParams(params, spec) {
|
|
352
|
+
return Object.values(spec.parameters.values).map(function(parameter) {
|
|
353
|
+
var param = params[parameter.name];
|
|
354
|
+
return typeof param === "string" ? param : joinParams(param, parameter);
|
|
355
|
+
}).join(spec.parameters.delimiter);
|
|
356
|
+
}
|
|
357
|
+
function isValidId(id, spec) {
|
|
358
|
+
if (!new RegExp(spec.regex).test(id)) return false;
|
|
359
|
+
var params = splitParams(id, spec);
|
|
360
|
+
if (params.length !== Object.keys(spec.parameters.values).length) return false;
|
|
361
|
+
var matches = params.map(function(param, index) {
|
|
362
|
+
return new RegExp(spec.parameters.values[index].regex).test(param);
|
|
363
|
+
}).filter(function(x) {
|
|
364
|
+
return !!x;
|
|
365
|
+
});
|
|
366
|
+
if (matches.length !== params.length) return false;
|
|
367
|
+
return true;
|
|
220
368
|
}
|
|
369
|
+
var ChainId = /* @__PURE__ */ (function() {
|
|
370
|
+
function ChainId2(params) {
|
|
371
|
+
if (typeof params === "string") {
|
|
372
|
+
params = ChainId2.parse(params);
|
|
373
|
+
}
|
|
374
|
+
this.namespace = params.namespace;
|
|
375
|
+
this.reference = params.reference;
|
|
376
|
+
}
|
|
377
|
+
ChainId2.parse = function parse(id) {
|
|
378
|
+
if (!isValidId(id, this.spec)) {
|
|
379
|
+
throw new Error("Invalid " + this.spec.name + " provided: " + id);
|
|
380
|
+
}
|
|
381
|
+
return new ChainId2(getParams(id, this.spec)).toJSON();
|
|
382
|
+
};
|
|
383
|
+
ChainId2.format = function format(params) {
|
|
384
|
+
return joinParams(params, this.spec);
|
|
385
|
+
};
|
|
386
|
+
var _proto = ChainId2.prototype;
|
|
387
|
+
_proto.toString = function toString() {
|
|
388
|
+
return ChainId2.format(this.toJSON());
|
|
389
|
+
};
|
|
390
|
+
_proto.toJSON = function toJSON() {
|
|
391
|
+
return {
|
|
392
|
+
namespace: this.namespace,
|
|
393
|
+
reference: this.reference
|
|
394
|
+
};
|
|
395
|
+
};
|
|
396
|
+
return ChainId2;
|
|
397
|
+
})();
|
|
398
|
+
ChainId.spec = CAIP["2"];
|
|
399
|
+
var AccountId = /* @__PURE__ */ (function() {
|
|
400
|
+
function AccountId2(params) {
|
|
401
|
+
if (typeof params === "string") {
|
|
402
|
+
params = AccountId2.parse(params);
|
|
403
|
+
}
|
|
404
|
+
this.chainId = new ChainId(params.chainId);
|
|
405
|
+
this.address = params.address;
|
|
406
|
+
}
|
|
407
|
+
AccountId2.parse = function parse(id) {
|
|
408
|
+
if (!isValidId(id, this.spec)) {
|
|
409
|
+
throw new Error("Invalid " + this.spec.name + " provided: " + id);
|
|
410
|
+
}
|
|
411
|
+
var _getParams = getParams(id, this.spec), namespace = _getParams.namespace, reference = _getParams.reference, address = _getParams.address;
|
|
412
|
+
var chainId = new ChainId({
|
|
413
|
+
namespace,
|
|
414
|
+
reference
|
|
415
|
+
});
|
|
416
|
+
return new AccountId2({
|
|
417
|
+
chainId,
|
|
418
|
+
address
|
|
419
|
+
}).toJSON();
|
|
420
|
+
};
|
|
421
|
+
AccountId2.format = function format(params) {
|
|
422
|
+
var chainId = new ChainId(params.chainId);
|
|
423
|
+
var splitParams2 = _extends({}, chainId.toJSON(), {
|
|
424
|
+
address: params.address
|
|
425
|
+
});
|
|
426
|
+
return joinParams(splitParams2, this.spec);
|
|
427
|
+
};
|
|
428
|
+
var _proto = AccountId2.prototype;
|
|
429
|
+
_proto.toString = function toString() {
|
|
430
|
+
return AccountId2.format(this.toJSON());
|
|
431
|
+
};
|
|
432
|
+
_proto.toJSON = function toJSON() {
|
|
433
|
+
return {
|
|
434
|
+
chainId: this.chainId.toJSON(),
|
|
435
|
+
address: this.address
|
|
436
|
+
};
|
|
437
|
+
};
|
|
438
|
+
return AccountId2;
|
|
439
|
+
})();
|
|
440
|
+
AccountId.spec = CAIP["10"];
|
|
441
|
+
var AssetName = /* @__PURE__ */ (function() {
|
|
442
|
+
function AssetName2(params) {
|
|
443
|
+
if (typeof params === "string") {
|
|
444
|
+
params = AssetName2.parse(params);
|
|
445
|
+
}
|
|
446
|
+
this.namespace = params.namespace;
|
|
447
|
+
this.reference = params.reference;
|
|
448
|
+
}
|
|
449
|
+
AssetName2.parse = function parse(id) {
|
|
450
|
+
if (!isValidId(id, this.spec)) {
|
|
451
|
+
throw new Error("Invalid " + this.spec.name + " provided: " + id);
|
|
452
|
+
}
|
|
453
|
+
return new AssetName2(getParams(id, this.spec)).toJSON();
|
|
454
|
+
};
|
|
455
|
+
AssetName2.format = function format(params) {
|
|
456
|
+
return joinParams(params, this.spec);
|
|
457
|
+
};
|
|
458
|
+
var _proto = AssetName2.prototype;
|
|
459
|
+
_proto.toString = function toString() {
|
|
460
|
+
return AssetName2.format(this.toJSON());
|
|
461
|
+
};
|
|
462
|
+
_proto.toJSON = function toJSON() {
|
|
463
|
+
return {
|
|
464
|
+
namespace: this.namespace,
|
|
465
|
+
reference: this.reference
|
|
466
|
+
};
|
|
467
|
+
};
|
|
468
|
+
return AssetName2;
|
|
469
|
+
})();
|
|
470
|
+
AssetName.spec = CAIP["19"].assetName;
|
|
471
|
+
var AssetType = /* @__PURE__ */ (function() {
|
|
472
|
+
function AssetType2(params) {
|
|
473
|
+
if (typeof params === "string") {
|
|
474
|
+
params = AssetType2.parse(params);
|
|
475
|
+
}
|
|
476
|
+
this.chainId = new ChainId(params.chainId);
|
|
477
|
+
this.assetName = new AssetName(params.assetName);
|
|
478
|
+
}
|
|
479
|
+
AssetType2.parse = function parse(id) {
|
|
480
|
+
if (!isValidId(id, this.spec)) {
|
|
481
|
+
throw new Error("Invalid " + this.spec.name + " provided: " + id);
|
|
482
|
+
}
|
|
483
|
+
return new AssetType2(getParams(id, this.spec)).toJSON();
|
|
484
|
+
};
|
|
485
|
+
AssetType2.format = function format(params) {
|
|
486
|
+
return joinParams(params, this.spec);
|
|
487
|
+
};
|
|
488
|
+
var _proto = AssetType2.prototype;
|
|
489
|
+
_proto.toString = function toString() {
|
|
490
|
+
return AssetType2.format(this.toJSON());
|
|
491
|
+
};
|
|
492
|
+
_proto.toJSON = function toJSON() {
|
|
493
|
+
return {
|
|
494
|
+
chainId: this.chainId.toJSON(),
|
|
495
|
+
assetName: this.assetName
|
|
496
|
+
};
|
|
497
|
+
};
|
|
498
|
+
return AssetType2;
|
|
499
|
+
})();
|
|
500
|
+
AssetType.spec = CAIP["19"].assetType;
|
|
501
|
+
var AssetId = /* @__PURE__ */ (function() {
|
|
502
|
+
function AssetId2(params) {
|
|
503
|
+
if (typeof params === "string") {
|
|
504
|
+
params = AssetId2.parse(params);
|
|
505
|
+
}
|
|
506
|
+
this.chainId = new ChainId(params.chainId);
|
|
507
|
+
this.assetName = new AssetName(params.assetName);
|
|
508
|
+
this.tokenId = params.tokenId;
|
|
509
|
+
}
|
|
510
|
+
AssetId2.parse = function parse(id) {
|
|
511
|
+
if (!isValidId(id, this.spec)) {
|
|
512
|
+
throw new Error("Invalid " + this.spec.name + " provided: " + id);
|
|
513
|
+
}
|
|
514
|
+
return new AssetId2(getParams(id, this.spec)).toJSON();
|
|
515
|
+
};
|
|
516
|
+
AssetId2.format = function format(params) {
|
|
517
|
+
return joinParams(params, this.spec);
|
|
518
|
+
};
|
|
519
|
+
var _proto = AssetId2.prototype;
|
|
520
|
+
_proto.toString = function toString() {
|
|
521
|
+
return AssetId2.format(this.toJSON());
|
|
522
|
+
};
|
|
523
|
+
_proto.toJSON = function toJSON() {
|
|
524
|
+
return {
|
|
525
|
+
chainId: this.chainId.toJSON(),
|
|
526
|
+
assetName: this.assetName.toJSON(),
|
|
527
|
+
tokenId: this.tokenId
|
|
528
|
+
};
|
|
529
|
+
};
|
|
530
|
+
return AssetId2;
|
|
531
|
+
})();
|
|
532
|
+
AssetId.spec = CAIP["19"].assetId;
|
|
221
533
|
|
|
222
|
-
// src/
|
|
534
|
+
// ../ensnode-sdk/src/shared/zod-schemas.ts
|
|
223
535
|
var import_viem2 = require("viem");
|
|
224
|
-
var
|
|
225
|
-
var
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
536
|
+
var import_v4 = require("zod/v4");
|
|
537
|
+
var makeFiniteNonNegativeNumberSchema = (valueLabel = "Value") => import_v4.z.number({
|
|
538
|
+
// NOTE: Zod's implementation of `number` automatically rejects NaN and Infinity values.
|
|
539
|
+
// and therefore the finite check is implicit.
|
|
540
|
+
error: `${valueLabel} must be a finite number.`
|
|
541
|
+
}).nonnegative({
|
|
542
|
+
error: `${valueLabel} must be a non-negative number (>=0).`
|
|
229
543
|
});
|
|
230
|
-
var
|
|
231
|
-
|
|
232
|
-
dir: "left"
|
|
544
|
+
var makeIntegerSchema = (valueLabel = "Value") => import_v4.z.int({
|
|
545
|
+
error: `${valueLabel} must be an integer.`
|
|
233
546
|
});
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
547
|
+
var makePositiveIntegerSchema = (valueLabel = "Value") => makeIntegerSchema(valueLabel).positive({
|
|
548
|
+
error: `${valueLabel} must be a positive integer (>0).`
|
|
549
|
+
});
|
|
550
|
+
var makeNonNegativeIntegerSchema = (valueLabel = "Value") => makeIntegerSchema(valueLabel).nonnegative({
|
|
551
|
+
error: `${valueLabel} must be a non-negative integer (>=0).`
|
|
552
|
+
});
|
|
553
|
+
var makeDurationSchema = (valueLabel = "Value") => import_v4.z.coerce.number({
|
|
554
|
+
error: `${valueLabel} must be a number.`
|
|
555
|
+
}).pipe(makeNonNegativeIntegerSchema(valueLabel));
|
|
556
|
+
var makeChainIdSchema = (valueLabel = "Chain ID") => makePositiveIntegerSchema(valueLabel).transform((val) => val);
|
|
557
|
+
var makeLowercaseAddressSchema = (valueLabel = "EVM address") => import_v4.z.string().check((ctx) => {
|
|
558
|
+
if (!(0, import_viem2.isAddress)(ctx.value)) {
|
|
559
|
+
ctx.issues.push({
|
|
560
|
+
code: "custom",
|
|
561
|
+
message: `${valueLabel} must be a valid EVM address`,
|
|
562
|
+
input: ctx.value
|
|
563
|
+
});
|
|
564
|
+
}
|
|
565
|
+
}).transform((val) => asLowerCaseAddress(val));
|
|
566
|
+
var makeUnixTimestampSchema = (valueLabel = "Timestamp") => makeIntegerSchema(valueLabel);
|
|
567
|
+
var makeAccountIdSchema = (valueLabel = "AccountId") => import_v4.z.strictObject({
|
|
568
|
+
chainId: makeChainIdSchema(`${valueLabel} chain ID`),
|
|
569
|
+
address: makeLowercaseAddressSchema(`${valueLabel} address`)
|
|
570
|
+
});
|
|
571
|
+
|
|
572
|
+
// src/leaderboard-page.ts
|
|
573
|
+
var REFERRERS_PER_LEADERBOARD_PAGE_DEFAULT = 25;
|
|
574
|
+
var REFERRERS_PER_LEADERBOARD_PAGE_MAX = 100;
|
|
575
|
+
var validateReferrerLeaderboardPageParams = (params) => {
|
|
576
|
+
if (params.page !== void 0 && !isPositiveInteger(params.page)) {
|
|
240
577
|
throw new Error(
|
|
241
|
-
`
|
|
578
|
+
`Invalid ReferrerLeaderboardPageParams: ${params.page}. page must be a positive integer.`
|
|
242
579
|
);
|
|
243
580
|
}
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
581
|
+
if (params.recordsPerPage !== void 0 && !isPositiveInteger(params.recordsPerPage)) {
|
|
582
|
+
throw new Error(
|
|
583
|
+
`Invalid ReferrerLeaderboardPageParams: ${params.recordsPerPage}. recordsPerPage must be a positive integer.`
|
|
584
|
+
);
|
|
247
585
|
}
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
throw new Error(`Decoded referrer value must be a valid EVM address.`);
|
|
586
|
+
if (params.recordsPerPage !== void 0 && params.recordsPerPage > REFERRERS_PER_LEADERBOARD_PAGE_MAX) {
|
|
587
|
+
throw new Error(
|
|
588
|
+
`Invalid ReferrerLeaderboardPageParams: ${params.recordsPerPage}. recordsPerPage must be less than or equal to ${REFERRERS_PER_LEADERBOARD_PAGE_MAX}.`
|
|
589
|
+
);
|
|
253
590
|
}
|
|
254
|
-
}
|
|
591
|
+
};
|
|
592
|
+
var buildReferrerLeaderboardPageParams = (params) => {
|
|
593
|
+
const result = {
|
|
594
|
+
page: params.page ?? 1,
|
|
595
|
+
recordsPerPage: params.recordsPerPage ?? REFERRERS_PER_LEADERBOARD_PAGE_DEFAULT
|
|
596
|
+
};
|
|
597
|
+
validateReferrerLeaderboardPageParams(result);
|
|
598
|
+
return result;
|
|
599
|
+
};
|
|
600
|
+
var validateReferrerLeaderboardPageContext = (context) => {
|
|
601
|
+
validateReferrerLeaderboardPageParams(context);
|
|
602
|
+
if (!isNonNegativeInteger(context.totalRecords)) {
|
|
603
|
+
throw new Error(
|
|
604
|
+
`Invalid ReferrerLeaderboardPageContext: total must be a non-negative integer but is ${context.totalRecords}.`
|
|
605
|
+
);
|
|
606
|
+
}
|
|
607
|
+
const startIndex = (context.page - 1) * context.recordsPerPage;
|
|
608
|
+
const endIndex = startIndex + context.recordsPerPage;
|
|
609
|
+
if (!context.hasNext && endIndex < context.totalRecords) {
|
|
610
|
+
throw new Error(
|
|
611
|
+
`Invalid ReferrerLeaderboardPageContext: if hasNext is false, endIndex (${endIndex}) must be greater than or equal to total (${context.totalRecords}).`
|
|
612
|
+
);
|
|
613
|
+
} else if (context.hasNext && context.page * context.recordsPerPage >= context.totalRecords) {
|
|
614
|
+
throw new Error(
|
|
615
|
+
`Invalid ReferrerLeaderboardPageContext: if hasNext is true, endIndex (${endIndex}) must be less than total (${context.totalRecords}).`
|
|
616
|
+
);
|
|
617
|
+
}
|
|
618
|
+
if (!context.hasPrev && context.page !== 1) {
|
|
619
|
+
throw new Error(
|
|
620
|
+
`Invalid ReferrerLeaderboardPageContext: if hasPrev is false, page must be the first page (1) but is ${context.page}.`
|
|
621
|
+
);
|
|
622
|
+
} else if (context.hasPrev && context.page === 1) {
|
|
623
|
+
throw new Error(
|
|
624
|
+
`Invalid ReferrerLeaderboardPageContext: if hasPrev is true, page must not be the first page (1) but is ${context.page}.`
|
|
625
|
+
);
|
|
626
|
+
}
|
|
627
|
+
};
|
|
628
|
+
var buildReferrerLeaderboardPageContext = (optionalParams, leaderboard) => {
|
|
629
|
+
const materializedParams = buildReferrerLeaderboardPageParams(optionalParams);
|
|
630
|
+
const totalRecords = leaderboard.referrers.size;
|
|
631
|
+
const totalPages = Math.max(1, Math.ceil(totalRecords / materializedParams.recordsPerPage));
|
|
632
|
+
if (materializedParams.page > totalPages) {
|
|
633
|
+
throw new Error(
|
|
634
|
+
`Invalid ReferrerLeaderboardPageContext: page ${materializedParams.page} exceeds total pages ${totalPages}.`
|
|
635
|
+
);
|
|
636
|
+
}
|
|
637
|
+
if (totalRecords === 0) {
|
|
638
|
+
return {
|
|
639
|
+
...materializedParams,
|
|
640
|
+
totalRecords: 0,
|
|
641
|
+
totalPages: 1,
|
|
642
|
+
hasNext: false,
|
|
643
|
+
hasPrev: false,
|
|
644
|
+
startIndex: void 0,
|
|
645
|
+
endIndex: void 0
|
|
646
|
+
};
|
|
647
|
+
}
|
|
648
|
+
const startIndex = (materializedParams.page - 1) * materializedParams.recordsPerPage;
|
|
649
|
+
const maxTheoreticalIndexOnPage = startIndex + (materializedParams.recordsPerPage - 1);
|
|
650
|
+
const endIndex = Math.min(maxTheoreticalIndexOnPage, totalRecords - 1);
|
|
651
|
+
const hasNext = maxTheoreticalIndexOnPage < totalRecords - 1;
|
|
652
|
+
const hasPrev = materializedParams.page > 1;
|
|
653
|
+
const result = {
|
|
654
|
+
...materializedParams,
|
|
655
|
+
totalRecords,
|
|
656
|
+
totalPages,
|
|
657
|
+
hasNext,
|
|
658
|
+
hasPrev,
|
|
659
|
+
startIndex,
|
|
660
|
+
endIndex
|
|
661
|
+
};
|
|
662
|
+
validateReferrerLeaderboardPageContext(result);
|
|
663
|
+
return result;
|
|
664
|
+
};
|
|
665
|
+
var getReferrerLeaderboardPage = (pageParams, leaderboard) => {
|
|
666
|
+
const pageContext = buildReferrerLeaderboardPageContext(pageParams, leaderboard);
|
|
667
|
+
let referrers;
|
|
668
|
+
if (pageContext.totalRecords > 0 && typeof pageContext.startIndex !== "undefined" && typeof pageContext.endIndex !== "undefined") {
|
|
669
|
+
referrers = Array.from(leaderboard.referrers.values()).slice(
|
|
670
|
+
pageContext.startIndex,
|
|
671
|
+
pageContext.endIndex + 1
|
|
672
|
+
// For `slice`, this is exclusive of the element at the index 'end'. We need it to be inclusive, hence plus one.
|
|
673
|
+
);
|
|
674
|
+
} else {
|
|
675
|
+
referrers = [];
|
|
676
|
+
}
|
|
677
|
+
return {
|
|
678
|
+
rules: leaderboard.rules,
|
|
679
|
+
referrers,
|
|
680
|
+
aggregatedMetrics: leaderboard.aggregatedMetrics,
|
|
681
|
+
pageContext,
|
|
682
|
+
accurateAsOf: leaderboard.accurateAsOf
|
|
683
|
+
};
|
|
684
|
+
};
|
|
255
685
|
|
|
256
686
|
// src/rank.ts
|
|
257
687
|
var validateReferrerRank = (rank) => {
|
|
@@ -453,6 +883,624 @@ var buildUnrankedReferrerMetrics = (referrer) => {
|
|
|
453
883
|
return result;
|
|
454
884
|
};
|
|
455
885
|
|
|
886
|
+
// src/referrer-detail.ts
|
|
887
|
+
var ReferrerDetailTypeIds = {
|
|
888
|
+
/**
|
|
889
|
+
* Represents a referrer who is ranked on the leaderboard.
|
|
890
|
+
*/
|
|
891
|
+
Ranked: "ranked",
|
|
892
|
+
/**
|
|
893
|
+
* Represents a referrer who is not ranked on the leaderboard.
|
|
894
|
+
*/
|
|
895
|
+
Unranked: "unranked"
|
|
896
|
+
};
|
|
897
|
+
var getReferrerDetail = (referrer, leaderboard) => {
|
|
898
|
+
const awardedReferrerMetrics = leaderboard.referrers.get(referrer);
|
|
899
|
+
if (awardedReferrerMetrics) {
|
|
900
|
+
return {
|
|
901
|
+
type: ReferrerDetailTypeIds.Ranked,
|
|
902
|
+
rules: leaderboard.rules,
|
|
903
|
+
referrer: awardedReferrerMetrics,
|
|
904
|
+
aggregatedMetrics: leaderboard.aggregatedMetrics,
|
|
905
|
+
accurateAsOf: leaderboard.accurateAsOf
|
|
906
|
+
};
|
|
907
|
+
}
|
|
908
|
+
return {
|
|
909
|
+
type: ReferrerDetailTypeIds.Unranked,
|
|
910
|
+
rules: leaderboard.rules,
|
|
911
|
+
referrer: buildUnrankedReferrerMetrics(referrer),
|
|
912
|
+
aggregatedMetrics: leaderboard.aggregatedMetrics,
|
|
913
|
+
accurateAsOf: leaderboard.accurateAsOf
|
|
914
|
+
};
|
|
915
|
+
};
|
|
916
|
+
|
|
917
|
+
// src/api/types.ts
|
|
918
|
+
var ReferrerLeaderboardPageResponseCodes = {
|
|
919
|
+
/**
|
|
920
|
+
* Represents that the requested referrer leaderboard page is available.
|
|
921
|
+
*/
|
|
922
|
+
Ok: "ok",
|
|
923
|
+
/**
|
|
924
|
+
* Represents that the referrer leaderboard data is not available.
|
|
925
|
+
*/
|
|
926
|
+
Error: "error"
|
|
927
|
+
};
|
|
928
|
+
var ReferrerDetailResponseCodes = {
|
|
929
|
+
/**
|
|
930
|
+
* Represents that the referrer detail data is available.
|
|
931
|
+
*/
|
|
932
|
+
Ok: "ok",
|
|
933
|
+
/**
|
|
934
|
+
* Represents that an error occurred while fetching the data.
|
|
935
|
+
*/
|
|
936
|
+
Error: "error"
|
|
937
|
+
};
|
|
938
|
+
|
|
939
|
+
// src/api/zod-schemas.ts
|
|
940
|
+
var makeRevenueContributionSchema = (valueLabel = "RevenueContribution") => import_v42.default.coerce.bigint({
|
|
941
|
+
error: `${valueLabel} must represent a bigint.`
|
|
942
|
+
}).nonnegative({
|
|
943
|
+
error: `${valueLabel} must not be negative.`
|
|
944
|
+
});
|
|
945
|
+
var makeReferralProgramRulesSchema = (valueLabel = "ReferralProgramRules") => import_v42.default.object({
|
|
946
|
+
totalAwardPoolValue: makeFiniteNonNegativeNumberSchema(`${valueLabel}.totalAwardPoolValue`),
|
|
947
|
+
maxQualifiedReferrers: makeNonNegativeIntegerSchema(`${valueLabel}.maxQualifiedReferrers`),
|
|
948
|
+
startTime: makeUnixTimestampSchema(`${valueLabel}.startTime`),
|
|
949
|
+
endTime: makeUnixTimestampSchema(`${valueLabel}.endTime`),
|
|
950
|
+
subregistryId: makeAccountIdSchema(`${valueLabel}.subregistryId`)
|
|
951
|
+
});
|
|
952
|
+
var makeAwardedReferrerMetricsSchema = (valueLabel = "AwardedReferrerMetrics") => import_v42.default.object({
|
|
953
|
+
referrer: makeLowercaseAddressSchema(`${valueLabel}.referrer`),
|
|
954
|
+
totalReferrals: makeNonNegativeIntegerSchema(`${valueLabel}.totalReferrals`),
|
|
955
|
+
totalIncrementalDuration: makeDurationSchema(`${valueLabel}.totalIncrementalDuration`),
|
|
956
|
+
totalRevenueContribution: makeRevenueContributionSchema(
|
|
957
|
+
`${valueLabel}.totalRevenueContribution`
|
|
958
|
+
),
|
|
959
|
+
score: makeFiniteNonNegativeNumberSchema(`${valueLabel}.score`),
|
|
960
|
+
rank: makePositiveIntegerSchema(`${valueLabel}.rank`),
|
|
961
|
+
isQualified: import_v42.default.boolean(),
|
|
962
|
+
finalScoreBoost: makeFiniteNonNegativeNumberSchema(`${valueLabel}.finalScoreBoost`).max(
|
|
963
|
+
1,
|
|
964
|
+
`${valueLabel}.finalScoreBoost must be <= 1`
|
|
965
|
+
),
|
|
966
|
+
finalScore: makeFiniteNonNegativeNumberSchema(`${valueLabel}.finalScore`),
|
|
967
|
+
awardPoolShare: makeFiniteNonNegativeNumberSchema(`${valueLabel}.awardPoolShare`).max(
|
|
968
|
+
1,
|
|
969
|
+
`${valueLabel}.awardPoolShare must be <= 1`
|
|
970
|
+
),
|
|
971
|
+
awardPoolApproxValue: makeFiniteNonNegativeNumberSchema(`${valueLabel}.awardPoolApproxValue`)
|
|
972
|
+
});
|
|
973
|
+
var makeUnrankedReferrerMetricsSchema = (valueLabel = "UnrankedReferrerMetrics") => import_v42.default.object({
|
|
974
|
+
referrer: makeLowercaseAddressSchema(`${valueLabel}.referrer`),
|
|
975
|
+
totalReferrals: makeNonNegativeIntegerSchema(`${valueLabel}.totalReferrals`),
|
|
976
|
+
totalIncrementalDuration: makeDurationSchema(`${valueLabel}.totalIncrementalDuration`),
|
|
977
|
+
totalRevenueContribution: makeRevenueContributionSchema(
|
|
978
|
+
`${valueLabel}.totalRevenueContribution`
|
|
979
|
+
),
|
|
980
|
+
score: makeFiniteNonNegativeNumberSchema(`${valueLabel}.score`),
|
|
981
|
+
rank: import_v42.default.null(),
|
|
982
|
+
isQualified: import_v42.default.literal(false),
|
|
983
|
+
finalScoreBoost: makeFiniteNonNegativeNumberSchema(`${valueLabel}.finalScoreBoost`).max(
|
|
984
|
+
1,
|
|
985
|
+
`${valueLabel}.finalScoreBoost must be <= 1`
|
|
986
|
+
),
|
|
987
|
+
finalScore: makeFiniteNonNegativeNumberSchema(`${valueLabel}.finalScore`),
|
|
988
|
+
awardPoolShare: makeFiniteNonNegativeNumberSchema(`${valueLabel}.awardPoolShare`).max(
|
|
989
|
+
1,
|
|
990
|
+
`${valueLabel}.awardPoolShare must be <= 1`
|
|
991
|
+
),
|
|
992
|
+
awardPoolApproxValue: makeFiniteNonNegativeNumberSchema(`${valueLabel}.awardPoolApproxValue`)
|
|
993
|
+
});
|
|
994
|
+
var makeAggregatedReferrerMetricsSchema = (valueLabel = "AggregatedReferrerMetrics") => import_v42.default.object({
|
|
995
|
+
grandTotalReferrals: makeNonNegativeIntegerSchema(`${valueLabel}.grandTotalReferrals`),
|
|
996
|
+
grandTotalIncrementalDuration: makeDurationSchema(
|
|
997
|
+
`${valueLabel}.grandTotalIncrementalDuration`
|
|
998
|
+
),
|
|
999
|
+
grandTotalRevenueContribution: makeRevenueContributionSchema(
|
|
1000
|
+
`${valueLabel}.grandTotalRevenueContribution`
|
|
1001
|
+
),
|
|
1002
|
+
grandTotalQualifiedReferrersFinalScore: makeFiniteNonNegativeNumberSchema(
|
|
1003
|
+
`${valueLabel}.grandTotalQualifiedReferrersFinalScore`
|
|
1004
|
+
),
|
|
1005
|
+
minFinalScoreToQualify: makeFiniteNonNegativeNumberSchema(
|
|
1006
|
+
`${valueLabel}.minFinalScoreToQualify`
|
|
1007
|
+
)
|
|
1008
|
+
});
|
|
1009
|
+
var makeReferrerLeaderboardPageContextSchema = (valueLabel = "ReferrerLeaderboardPageContext") => import_v42.default.object({
|
|
1010
|
+
page: makePositiveIntegerSchema(`${valueLabel}.page`),
|
|
1011
|
+
recordsPerPage: makePositiveIntegerSchema(`${valueLabel}.recordsPerPage`).max(
|
|
1012
|
+
REFERRERS_PER_LEADERBOARD_PAGE_MAX,
|
|
1013
|
+
`${valueLabel}.recordsPerPage must not exceed ${REFERRERS_PER_LEADERBOARD_PAGE_MAX}`
|
|
1014
|
+
),
|
|
1015
|
+
totalRecords: makeNonNegativeIntegerSchema(`${valueLabel}.totalRecords`),
|
|
1016
|
+
totalPages: makePositiveIntegerSchema(`${valueLabel}.totalPages`),
|
|
1017
|
+
hasNext: import_v42.default.boolean(),
|
|
1018
|
+
hasPrev: import_v42.default.boolean(),
|
|
1019
|
+
startIndex: import_v42.default.optional(makeNonNegativeIntegerSchema(`${valueLabel}.startIndex`)),
|
|
1020
|
+
endIndex: import_v42.default.optional(makeNonNegativeIntegerSchema(`${valueLabel}.endIndex`))
|
|
1021
|
+
});
|
|
1022
|
+
var makeReferrerLeaderboardPageSchema = (valueLabel = "ReferrerLeaderboardPage") => import_v42.default.object({
|
|
1023
|
+
rules: makeReferralProgramRulesSchema(`${valueLabel}.rules`),
|
|
1024
|
+
referrers: import_v42.default.array(makeAwardedReferrerMetricsSchema(`${valueLabel}.referrers[record]`)),
|
|
1025
|
+
aggregatedMetrics: makeAggregatedReferrerMetricsSchema(`${valueLabel}.aggregatedMetrics`),
|
|
1026
|
+
pageContext: makeReferrerLeaderboardPageContextSchema(`${valueLabel}.pageContext`),
|
|
1027
|
+
accurateAsOf: makeUnixTimestampSchema(`${valueLabel}.accurateAsOf`)
|
|
1028
|
+
});
|
|
1029
|
+
var makeReferrerLeaderboardPageResponseOkSchema = (valueLabel = "ReferrerLeaderboardPageResponseOk") => import_v42.default.object({
|
|
1030
|
+
responseCode: import_v42.default.literal(ReferrerLeaderboardPageResponseCodes.Ok),
|
|
1031
|
+
data: makeReferrerLeaderboardPageSchema(`${valueLabel}.data`)
|
|
1032
|
+
});
|
|
1033
|
+
var makeReferrerLeaderboardPageResponseErrorSchema = (_valueLabel = "ReferrerLeaderboardPageResponseError") => import_v42.default.object({
|
|
1034
|
+
responseCode: import_v42.default.literal(ReferrerLeaderboardPageResponseCodes.Error),
|
|
1035
|
+
error: import_v42.default.string(),
|
|
1036
|
+
errorMessage: import_v42.default.string()
|
|
1037
|
+
});
|
|
1038
|
+
var makeReferrerLeaderboardPageResponseSchema = (valueLabel = "ReferrerLeaderboardPageResponse") => import_v42.default.union([
|
|
1039
|
+
makeReferrerLeaderboardPageResponseOkSchema(valueLabel),
|
|
1040
|
+
makeReferrerLeaderboardPageResponseErrorSchema(valueLabel)
|
|
1041
|
+
]);
|
|
1042
|
+
var makeReferrerDetailRankedSchema = (valueLabel = "ReferrerDetailRanked") => import_v42.default.object({
|
|
1043
|
+
type: import_v42.default.literal(ReferrerDetailTypeIds.Ranked),
|
|
1044
|
+
rules: makeReferralProgramRulesSchema(`${valueLabel}.rules`),
|
|
1045
|
+
referrer: makeAwardedReferrerMetricsSchema(`${valueLabel}.referrer`),
|
|
1046
|
+
aggregatedMetrics: makeAggregatedReferrerMetricsSchema(`${valueLabel}.aggregatedMetrics`),
|
|
1047
|
+
accurateAsOf: makeUnixTimestampSchema(`${valueLabel}.accurateAsOf`)
|
|
1048
|
+
});
|
|
1049
|
+
var makeReferrerDetailUnrankedSchema = (valueLabel = "ReferrerDetailUnranked") => import_v42.default.object({
|
|
1050
|
+
type: import_v42.default.literal(ReferrerDetailTypeIds.Unranked),
|
|
1051
|
+
rules: makeReferralProgramRulesSchema(`${valueLabel}.rules`),
|
|
1052
|
+
referrer: makeUnrankedReferrerMetricsSchema(`${valueLabel}.referrer`),
|
|
1053
|
+
aggregatedMetrics: makeAggregatedReferrerMetricsSchema(`${valueLabel}.aggregatedMetrics`),
|
|
1054
|
+
accurateAsOf: makeUnixTimestampSchema(`${valueLabel}.accurateAsOf`)
|
|
1055
|
+
});
|
|
1056
|
+
var makeReferrerDetailResponseOkSchema = (valueLabel = "ReferrerDetailResponse") => import_v42.default.object({
|
|
1057
|
+
responseCode: import_v42.default.literal(ReferrerDetailResponseCodes.Ok),
|
|
1058
|
+
data: import_v42.default.union([
|
|
1059
|
+
makeReferrerDetailRankedSchema(`${valueLabel}.data`),
|
|
1060
|
+
makeReferrerDetailUnrankedSchema(`${valueLabel}.data`)
|
|
1061
|
+
])
|
|
1062
|
+
});
|
|
1063
|
+
var makeReferrerDetailResponseErrorSchema = (_valueLabel = "ReferrerDetailResponse") => import_v42.default.object({
|
|
1064
|
+
responseCode: import_v42.default.literal(ReferrerDetailResponseCodes.Error),
|
|
1065
|
+
error: import_v42.default.string(),
|
|
1066
|
+
errorMessage: import_v42.default.string()
|
|
1067
|
+
});
|
|
1068
|
+
var makeReferrerDetailResponseSchema = (valueLabel = "ReferrerDetailResponse") => import_v42.default.union([
|
|
1069
|
+
makeReferrerDetailResponseOkSchema(valueLabel),
|
|
1070
|
+
makeReferrerDetailResponseErrorSchema(valueLabel)
|
|
1071
|
+
]);
|
|
1072
|
+
|
|
1073
|
+
// src/api/deserialize.ts
|
|
1074
|
+
function deserializeRevenueContribution(value) {
|
|
1075
|
+
return BigInt(value);
|
|
1076
|
+
}
|
|
1077
|
+
function deserializeReferralProgramRules(rules) {
|
|
1078
|
+
return rules;
|
|
1079
|
+
}
|
|
1080
|
+
function deserializeAwardedReferrerMetrics(metrics) {
|
|
1081
|
+
return {
|
|
1082
|
+
referrer: metrics.referrer,
|
|
1083
|
+
totalReferrals: metrics.totalReferrals,
|
|
1084
|
+
totalIncrementalDuration: metrics.totalIncrementalDuration,
|
|
1085
|
+
totalRevenueContribution: deserializeRevenueContribution(metrics.totalRevenueContribution),
|
|
1086
|
+
score: metrics.score,
|
|
1087
|
+
rank: metrics.rank,
|
|
1088
|
+
isQualified: metrics.isQualified,
|
|
1089
|
+
finalScoreBoost: metrics.finalScoreBoost,
|
|
1090
|
+
finalScore: metrics.finalScore,
|
|
1091
|
+
awardPoolShare: metrics.awardPoolShare,
|
|
1092
|
+
awardPoolApproxValue: metrics.awardPoolApproxValue
|
|
1093
|
+
};
|
|
1094
|
+
}
|
|
1095
|
+
function deserializeUnrankedReferrerMetrics(metrics) {
|
|
1096
|
+
return {
|
|
1097
|
+
referrer: metrics.referrer,
|
|
1098
|
+
totalReferrals: metrics.totalReferrals,
|
|
1099
|
+
totalIncrementalDuration: metrics.totalIncrementalDuration,
|
|
1100
|
+
totalRevenueContribution: deserializeRevenueContribution(metrics.totalRevenueContribution),
|
|
1101
|
+
score: metrics.score,
|
|
1102
|
+
rank: metrics.rank,
|
|
1103
|
+
isQualified: metrics.isQualified,
|
|
1104
|
+
finalScoreBoost: metrics.finalScoreBoost,
|
|
1105
|
+
finalScore: metrics.finalScore,
|
|
1106
|
+
awardPoolShare: metrics.awardPoolShare,
|
|
1107
|
+
awardPoolApproxValue: metrics.awardPoolApproxValue
|
|
1108
|
+
};
|
|
1109
|
+
}
|
|
1110
|
+
function deserializeAggregatedReferrerMetrics(metrics) {
|
|
1111
|
+
return {
|
|
1112
|
+
grandTotalReferrals: metrics.grandTotalReferrals,
|
|
1113
|
+
grandTotalIncrementalDuration: metrics.grandTotalIncrementalDuration,
|
|
1114
|
+
grandTotalRevenueContribution: deserializeRevenueContribution(
|
|
1115
|
+
metrics.grandTotalRevenueContribution
|
|
1116
|
+
),
|
|
1117
|
+
grandTotalQualifiedReferrersFinalScore: metrics.grandTotalQualifiedReferrersFinalScore,
|
|
1118
|
+
minFinalScoreToQualify: metrics.minFinalScoreToQualify
|
|
1119
|
+
};
|
|
1120
|
+
}
|
|
1121
|
+
function deserializeReferrerLeaderboardPage(page) {
|
|
1122
|
+
return {
|
|
1123
|
+
rules: deserializeReferralProgramRules(page.rules),
|
|
1124
|
+
referrers: page.referrers.map(deserializeAwardedReferrerMetrics),
|
|
1125
|
+
aggregatedMetrics: deserializeAggregatedReferrerMetrics(page.aggregatedMetrics),
|
|
1126
|
+
pageContext: page.pageContext,
|
|
1127
|
+
accurateAsOf: page.accurateAsOf
|
|
1128
|
+
};
|
|
1129
|
+
}
|
|
1130
|
+
function deserializeReferrerDetailRanked(detail) {
|
|
1131
|
+
return {
|
|
1132
|
+
type: detail.type,
|
|
1133
|
+
rules: deserializeReferralProgramRules(detail.rules),
|
|
1134
|
+
referrer: deserializeAwardedReferrerMetrics(detail.referrer),
|
|
1135
|
+
aggregatedMetrics: deserializeAggregatedReferrerMetrics(detail.aggregatedMetrics),
|
|
1136
|
+
accurateAsOf: detail.accurateAsOf
|
|
1137
|
+
};
|
|
1138
|
+
}
|
|
1139
|
+
function deserializeReferrerDetailUnranked(detail) {
|
|
1140
|
+
return {
|
|
1141
|
+
type: detail.type,
|
|
1142
|
+
rules: deserializeReferralProgramRules(detail.rules),
|
|
1143
|
+
referrer: deserializeUnrankedReferrerMetrics(detail.referrer),
|
|
1144
|
+
aggregatedMetrics: deserializeAggregatedReferrerMetrics(detail.aggregatedMetrics),
|
|
1145
|
+
accurateAsOf: detail.accurateAsOf
|
|
1146
|
+
};
|
|
1147
|
+
}
|
|
1148
|
+
function deserializeReferrerLeaderboardPageResponse(maybeResponse, valueLabel) {
|
|
1149
|
+
let deserialized;
|
|
1150
|
+
switch (maybeResponse.responseCode) {
|
|
1151
|
+
case "ok": {
|
|
1152
|
+
deserialized = {
|
|
1153
|
+
responseCode: maybeResponse.responseCode,
|
|
1154
|
+
data: deserializeReferrerLeaderboardPage(maybeResponse.data)
|
|
1155
|
+
};
|
|
1156
|
+
break;
|
|
1157
|
+
}
|
|
1158
|
+
case "error":
|
|
1159
|
+
deserialized = maybeResponse;
|
|
1160
|
+
break;
|
|
1161
|
+
}
|
|
1162
|
+
const schema = makeReferrerLeaderboardPageResponseSchema(valueLabel);
|
|
1163
|
+
const parsed = schema.safeParse(deserialized);
|
|
1164
|
+
if (parsed.error) {
|
|
1165
|
+
throw new Error(
|
|
1166
|
+
`Cannot deserialize SerializedReferrerLeaderboardPageResponse:
|
|
1167
|
+
${(0, import_v43.prettifyError)(parsed.error)}
|
|
1168
|
+
`
|
|
1169
|
+
);
|
|
1170
|
+
}
|
|
1171
|
+
return parsed.data;
|
|
1172
|
+
}
|
|
1173
|
+
function deserializeReferrerDetailResponse(maybeResponse, valueLabel) {
|
|
1174
|
+
let deserialized;
|
|
1175
|
+
switch (maybeResponse.responseCode) {
|
|
1176
|
+
case "ok": {
|
|
1177
|
+
switch (maybeResponse.data.type) {
|
|
1178
|
+
case "ranked":
|
|
1179
|
+
deserialized = {
|
|
1180
|
+
responseCode: maybeResponse.responseCode,
|
|
1181
|
+
data: deserializeReferrerDetailRanked(maybeResponse.data)
|
|
1182
|
+
};
|
|
1183
|
+
break;
|
|
1184
|
+
case "unranked":
|
|
1185
|
+
deserialized = {
|
|
1186
|
+
responseCode: maybeResponse.responseCode,
|
|
1187
|
+
data: deserializeReferrerDetailUnranked(maybeResponse.data)
|
|
1188
|
+
};
|
|
1189
|
+
break;
|
|
1190
|
+
}
|
|
1191
|
+
break;
|
|
1192
|
+
}
|
|
1193
|
+
case "error":
|
|
1194
|
+
deserialized = maybeResponse;
|
|
1195
|
+
break;
|
|
1196
|
+
}
|
|
1197
|
+
const schema = makeReferrerDetailResponseSchema(valueLabel);
|
|
1198
|
+
const parsed = schema.safeParse(deserialized);
|
|
1199
|
+
if (parsed.error) {
|
|
1200
|
+
throw new Error(`Cannot deserialize ReferrerDetailResponse:
|
|
1201
|
+
${(0, import_v43.prettifyError)(parsed.error)}
|
|
1202
|
+
`);
|
|
1203
|
+
}
|
|
1204
|
+
return parsed.data;
|
|
1205
|
+
}
|
|
1206
|
+
|
|
1207
|
+
// src/api/serialize.ts
|
|
1208
|
+
function serializeRevenueContribution(revenueContribution) {
|
|
1209
|
+
return revenueContribution.toString();
|
|
1210
|
+
}
|
|
1211
|
+
function serializeReferralProgramRules(rules) {
|
|
1212
|
+
return rules;
|
|
1213
|
+
}
|
|
1214
|
+
function serializeAwardedReferrerMetrics(metrics) {
|
|
1215
|
+
return {
|
|
1216
|
+
referrer: metrics.referrer,
|
|
1217
|
+
totalReferrals: metrics.totalReferrals,
|
|
1218
|
+
totalIncrementalDuration: metrics.totalIncrementalDuration,
|
|
1219
|
+
totalRevenueContribution: serializeRevenueContribution(metrics.totalRevenueContribution),
|
|
1220
|
+
score: metrics.score,
|
|
1221
|
+
rank: metrics.rank,
|
|
1222
|
+
isQualified: metrics.isQualified,
|
|
1223
|
+
finalScoreBoost: metrics.finalScoreBoost,
|
|
1224
|
+
finalScore: metrics.finalScore,
|
|
1225
|
+
awardPoolShare: metrics.awardPoolShare,
|
|
1226
|
+
awardPoolApproxValue: metrics.awardPoolApproxValue
|
|
1227
|
+
};
|
|
1228
|
+
}
|
|
1229
|
+
function serializeUnrankedReferrerMetrics(metrics) {
|
|
1230
|
+
return {
|
|
1231
|
+
referrer: metrics.referrer,
|
|
1232
|
+
totalReferrals: metrics.totalReferrals,
|
|
1233
|
+
totalIncrementalDuration: metrics.totalIncrementalDuration,
|
|
1234
|
+
totalRevenueContribution: serializeRevenueContribution(metrics.totalRevenueContribution),
|
|
1235
|
+
score: metrics.score,
|
|
1236
|
+
rank: metrics.rank,
|
|
1237
|
+
isQualified: metrics.isQualified,
|
|
1238
|
+
finalScoreBoost: metrics.finalScoreBoost,
|
|
1239
|
+
finalScore: metrics.finalScore,
|
|
1240
|
+
awardPoolShare: metrics.awardPoolShare,
|
|
1241
|
+
awardPoolApproxValue: metrics.awardPoolApproxValue
|
|
1242
|
+
};
|
|
1243
|
+
}
|
|
1244
|
+
function serializeAggregatedReferrerMetrics(metrics) {
|
|
1245
|
+
return {
|
|
1246
|
+
grandTotalReferrals: metrics.grandTotalReferrals,
|
|
1247
|
+
grandTotalIncrementalDuration: metrics.grandTotalIncrementalDuration,
|
|
1248
|
+
grandTotalRevenueContribution: serializeRevenueContribution(
|
|
1249
|
+
metrics.grandTotalRevenueContribution
|
|
1250
|
+
),
|
|
1251
|
+
grandTotalQualifiedReferrersFinalScore: metrics.grandTotalQualifiedReferrersFinalScore,
|
|
1252
|
+
minFinalScoreToQualify: metrics.minFinalScoreToQualify
|
|
1253
|
+
};
|
|
1254
|
+
}
|
|
1255
|
+
function serializeReferrerLeaderboardPage(page) {
|
|
1256
|
+
return {
|
|
1257
|
+
rules: serializeReferralProgramRules(page.rules),
|
|
1258
|
+
referrers: page.referrers.map(serializeAwardedReferrerMetrics),
|
|
1259
|
+
aggregatedMetrics: serializeAggregatedReferrerMetrics(page.aggregatedMetrics),
|
|
1260
|
+
pageContext: page.pageContext,
|
|
1261
|
+
accurateAsOf: page.accurateAsOf
|
|
1262
|
+
};
|
|
1263
|
+
}
|
|
1264
|
+
function serializeReferrerDetailRanked(detail) {
|
|
1265
|
+
return {
|
|
1266
|
+
type: detail.type,
|
|
1267
|
+
rules: serializeReferralProgramRules(detail.rules),
|
|
1268
|
+
referrer: serializeAwardedReferrerMetrics(detail.referrer),
|
|
1269
|
+
aggregatedMetrics: serializeAggregatedReferrerMetrics(detail.aggregatedMetrics),
|
|
1270
|
+
accurateAsOf: detail.accurateAsOf
|
|
1271
|
+
};
|
|
1272
|
+
}
|
|
1273
|
+
function serializeReferrerDetailUnranked(detail) {
|
|
1274
|
+
return {
|
|
1275
|
+
type: detail.type,
|
|
1276
|
+
rules: serializeReferralProgramRules(detail.rules),
|
|
1277
|
+
referrer: serializeUnrankedReferrerMetrics(detail.referrer),
|
|
1278
|
+
aggregatedMetrics: serializeAggregatedReferrerMetrics(detail.aggregatedMetrics),
|
|
1279
|
+
accurateAsOf: detail.accurateAsOf
|
|
1280
|
+
};
|
|
1281
|
+
}
|
|
1282
|
+
function serializeReferrerLeaderboardPageResponse(response) {
|
|
1283
|
+
switch (response.responseCode) {
|
|
1284
|
+
case ReferrerLeaderboardPageResponseCodes.Ok:
|
|
1285
|
+
return {
|
|
1286
|
+
responseCode: response.responseCode,
|
|
1287
|
+
data: serializeReferrerLeaderboardPage(response.data)
|
|
1288
|
+
};
|
|
1289
|
+
case ReferrerLeaderboardPageResponseCodes.Error:
|
|
1290
|
+
return response;
|
|
1291
|
+
}
|
|
1292
|
+
}
|
|
1293
|
+
function serializeReferrerDetailResponse(response) {
|
|
1294
|
+
switch (response.responseCode) {
|
|
1295
|
+
case ReferrerDetailResponseCodes.Ok:
|
|
1296
|
+
switch (response.data.type) {
|
|
1297
|
+
case "ranked":
|
|
1298
|
+
return {
|
|
1299
|
+
responseCode: response.responseCode,
|
|
1300
|
+
data: serializeReferrerDetailRanked(response.data)
|
|
1301
|
+
};
|
|
1302
|
+
case "unranked":
|
|
1303
|
+
return {
|
|
1304
|
+
responseCode: response.responseCode,
|
|
1305
|
+
data: serializeReferrerDetailUnranked(response.data)
|
|
1306
|
+
};
|
|
1307
|
+
}
|
|
1308
|
+
break;
|
|
1309
|
+
case ReferrerDetailResponseCodes.Error:
|
|
1310
|
+
return response;
|
|
1311
|
+
}
|
|
1312
|
+
}
|
|
1313
|
+
|
|
1314
|
+
// src/client.ts
|
|
1315
|
+
var DEFAULT_ENSNODE_API_URL = "https://api.alpha.ensnode.io";
|
|
1316
|
+
var ENSReferralsClient = class _ENSReferralsClient {
|
|
1317
|
+
options;
|
|
1318
|
+
static defaultOptions() {
|
|
1319
|
+
return {
|
|
1320
|
+
url: new URL(DEFAULT_ENSNODE_API_URL)
|
|
1321
|
+
};
|
|
1322
|
+
}
|
|
1323
|
+
constructor(options = {}) {
|
|
1324
|
+
this.options = {
|
|
1325
|
+
..._ENSReferralsClient.defaultOptions(),
|
|
1326
|
+
...options
|
|
1327
|
+
};
|
|
1328
|
+
}
|
|
1329
|
+
getOptions() {
|
|
1330
|
+
return Object.freeze({
|
|
1331
|
+
url: new URL(this.options.url.href)
|
|
1332
|
+
});
|
|
1333
|
+
}
|
|
1334
|
+
/**
|
|
1335
|
+
* Fetch Referrer Leaderboard Page
|
|
1336
|
+
*
|
|
1337
|
+
* Retrieves a paginated list of referrer leaderboard metrics with contribution percentages.
|
|
1338
|
+
* Each referrer's contribution is calculated as a percentage of the grand totals across all referrers.
|
|
1339
|
+
*
|
|
1340
|
+
* @param request - Pagination parameters
|
|
1341
|
+
* @param request.page - The page number to retrieve (1-indexed, default: 1)
|
|
1342
|
+
* @param request.recordsPerPage - Number of records per page (default: 25, max: 100)
|
|
1343
|
+
* @returns {ReferrerLeaderboardPageResponse}
|
|
1344
|
+
*
|
|
1345
|
+
* @throws if the ENSNode request fails
|
|
1346
|
+
* @throws if the ENSNode API returns an error response
|
|
1347
|
+
* @throws if the ENSNode response breaks required invariants
|
|
1348
|
+
*
|
|
1349
|
+
* @example
|
|
1350
|
+
* ```typescript
|
|
1351
|
+
* // Get first page with default page size (25 records)
|
|
1352
|
+
* const response = await client.getReferrerLeaderboardPage();
|
|
1353
|
+
* if (response.responseCode === ReferrerLeaderboardPageResponseCodes.Ok) {
|
|
1354
|
+
* const {
|
|
1355
|
+
* aggregatedMetrics,
|
|
1356
|
+
* referrers,
|
|
1357
|
+
* rules,
|
|
1358
|
+
* pageContext,
|
|
1359
|
+
* updatedAt
|
|
1360
|
+
* } = response.data;
|
|
1361
|
+
* console.log(aggregatedMetrics);
|
|
1362
|
+
* console.log(referrers);
|
|
1363
|
+
* console.log(rules);
|
|
1364
|
+
* console.log(updatedAt);
|
|
1365
|
+
* console.log(`Page ${pageContext.page} of ${pageContext.totalPages}`);
|
|
1366
|
+
* }
|
|
1367
|
+
* ```
|
|
1368
|
+
*
|
|
1369
|
+
* @example
|
|
1370
|
+
* ```typescript
|
|
1371
|
+
* // Get second page with 50 records per page
|
|
1372
|
+
* const response = await client.getReferrerLeaderboardPage({ page: 2, recordsPerPage: 50 });
|
|
1373
|
+
* ```
|
|
1374
|
+
*
|
|
1375
|
+
* @example
|
|
1376
|
+
* ```typescript
|
|
1377
|
+
* // Handle error response, ie. when Referrer Leaderboard is not currently available.
|
|
1378
|
+
* const response = await client.getReferrerLeaderboardPage();
|
|
1379
|
+
*
|
|
1380
|
+
* if (response.responseCode === ReferrerLeaderboardPageResponseCodes.Error) {
|
|
1381
|
+
* console.error(response.error);
|
|
1382
|
+
* console.error(response.errorMessage);
|
|
1383
|
+
* }
|
|
1384
|
+
* ```
|
|
1385
|
+
*/
|
|
1386
|
+
async getReferrerLeaderboardPage(request) {
|
|
1387
|
+
const url = new URL(`/ensanalytics/referrers`, this.options.url);
|
|
1388
|
+
if (request?.page) url.searchParams.set("page", request.page.toString());
|
|
1389
|
+
if (request?.recordsPerPage)
|
|
1390
|
+
url.searchParams.set("recordsPerPage", request.recordsPerPage.toString());
|
|
1391
|
+
const response = await fetch(url);
|
|
1392
|
+
let responseData;
|
|
1393
|
+
try {
|
|
1394
|
+
responseData = await response.json();
|
|
1395
|
+
} catch {
|
|
1396
|
+
throw new Error("Malformed response data: invalid JSON");
|
|
1397
|
+
}
|
|
1398
|
+
return deserializeReferrerLeaderboardPageResponse(
|
|
1399
|
+
responseData
|
|
1400
|
+
);
|
|
1401
|
+
}
|
|
1402
|
+
/**
|
|
1403
|
+
* Fetch Referrer Detail
|
|
1404
|
+
*
|
|
1405
|
+
* Retrieves detailed information about a specific referrer, whether they are on the
|
|
1406
|
+
* leaderboard or not.
|
|
1407
|
+
*
|
|
1408
|
+
* The response data is a discriminated union type with a `type` field:
|
|
1409
|
+
*
|
|
1410
|
+
* **For referrers on the leaderboard** (`ReferrerDetailRanked`):
|
|
1411
|
+
* - `type`: {@link ReferrerDetailTypeIds.Ranked}
|
|
1412
|
+
* - `referrer`: The `AwardedReferrerMetrics` from @namehash/ens-referrals
|
|
1413
|
+
* - `rules`: The referral program rules
|
|
1414
|
+
* - `aggregatedMetrics`: Aggregated metrics for all referrers on the leaderboard
|
|
1415
|
+
* - `accurateAsOf`: Unix timestamp indicating when the data was last updated
|
|
1416
|
+
*
|
|
1417
|
+
* **For referrers NOT on the leaderboard** (`ReferrerDetailUnranked`):
|
|
1418
|
+
* - `type`: {@link ReferrerDetailTypeIds.Unranked}
|
|
1419
|
+
* - `referrer`: The `UnrankedReferrerMetrics` from @namehash/ens-referrals
|
|
1420
|
+
* - `rules`: The referral program rules
|
|
1421
|
+
* - `aggregatedMetrics`: Aggregated metrics for all referrers on the leaderboard
|
|
1422
|
+
* - `accurateAsOf`: Unix timestamp indicating when the data was last updated
|
|
1423
|
+
*
|
|
1424
|
+
* @see {@link https://www.npmjs.com/package/@namehash/ens-referrals|@namehash/ens-referrals} for calculation details
|
|
1425
|
+
*
|
|
1426
|
+
* @param request The referrer address to query
|
|
1427
|
+
* @returns {ReferrerDetailResponse} Returns the referrer detail response
|
|
1428
|
+
*
|
|
1429
|
+
* @throws if the ENSNode request fails
|
|
1430
|
+
* @throws if the response data is malformed
|
|
1431
|
+
*
|
|
1432
|
+
* @example
|
|
1433
|
+
* ```typescript
|
|
1434
|
+
* // Get referrer detail for a specific address
|
|
1435
|
+
* const response = await client.getReferrerDetail({
|
|
1436
|
+
* referrer: "0x1234567890123456789012345678901234567890"
|
|
1437
|
+
* });
|
|
1438
|
+
* if (response.responseCode === ReferrerDetailResponseCodes.Ok) {
|
|
1439
|
+
* const { type, referrer, rules, aggregatedMetrics, accurateAsOf } = response.data;
|
|
1440
|
+
* console.log(type); // ReferrerDetailTypeIds.Ranked or ReferrerDetailTypeIds.Unranked
|
|
1441
|
+
* console.log(referrer);
|
|
1442
|
+
* console.log(accurateAsOf);
|
|
1443
|
+
* }
|
|
1444
|
+
* ```
|
|
1445
|
+
*
|
|
1446
|
+
* @example
|
|
1447
|
+
* ```typescript
|
|
1448
|
+
* // Use discriminated union to check if referrer is ranked
|
|
1449
|
+
* const response = await client.getReferrerDetail({
|
|
1450
|
+
* referrer: "0x1234567890123456789012345678901234567890"
|
|
1451
|
+
* });
|
|
1452
|
+
* if (response.responseCode === ReferrerDetailResponseCodes.Ok) {
|
|
1453
|
+
* if (response.data.type === ReferrerDetailTypeIds.Ranked) {
|
|
1454
|
+
* // TypeScript knows this is ReferrerDetailRanked
|
|
1455
|
+
* console.log(`Rank: ${response.data.referrer.rank}`);
|
|
1456
|
+
* console.log(`Qualified: ${response.data.referrer.isQualified}`);
|
|
1457
|
+
* console.log(`Award Pool Share: ${response.data.referrer.awardPoolShare * 100}%`);
|
|
1458
|
+
* } else {
|
|
1459
|
+
* // TypeScript knows this is ReferrerDetailUnranked
|
|
1460
|
+
* console.log("Referrer is not on the leaderboard (no referrals yet)");
|
|
1461
|
+
* }
|
|
1462
|
+
* }
|
|
1463
|
+
* ```
|
|
1464
|
+
*
|
|
1465
|
+
* @example
|
|
1466
|
+
* ```typescript
|
|
1467
|
+
* // Handle error response, ie. when Referrer Detail is not currently available.
|
|
1468
|
+
* const response = await client.getReferrerDetail({
|
|
1469
|
+
* referrer: "0x1234567890123456789012345678901234567890"
|
|
1470
|
+
* });
|
|
1471
|
+
*
|
|
1472
|
+
* if (response.responseCode === ReferrerDetailResponseCodes.Error) {
|
|
1473
|
+
* console.error(response.error);
|
|
1474
|
+
* console.error(response.errorMessage);
|
|
1475
|
+
* }
|
|
1476
|
+
* ```
|
|
1477
|
+
*/
|
|
1478
|
+
async getReferrerDetail(request) {
|
|
1479
|
+
const url = new URL(
|
|
1480
|
+
`/api/ensanalytics/referrers/${encodeURIComponent(request.referrer)}`,
|
|
1481
|
+
this.options.url
|
|
1482
|
+
);
|
|
1483
|
+
const response = await fetch(url);
|
|
1484
|
+
let responseData;
|
|
1485
|
+
try {
|
|
1486
|
+
responseData = await response.json();
|
|
1487
|
+
} catch {
|
|
1488
|
+
throw new Error("Malformed response data: invalid JSON");
|
|
1489
|
+
}
|
|
1490
|
+
return deserializeReferrerDetailResponse(responseData);
|
|
1491
|
+
}
|
|
1492
|
+
};
|
|
1493
|
+
|
|
1494
|
+
// src/currency.ts
|
|
1495
|
+
function isValidUSDQuantity(value) {
|
|
1496
|
+
return isFiniteNonNegativeNumber(value);
|
|
1497
|
+
}
|
|
1498
|
+
function validateUSDQuantity(value) {
|
|
1499
|
+
if (!isValidUSDQuantity(value)) {
|
|
1500
|
+
throw new Error(`Invalid USD quantity: ${value}.`);
|
|
1501
|
+
}
|
|
1502
|
+
}
|
|
1503
|
+
|
|
456
1504
|
// src/leaderboard.ts
|
|
457
1505
|
var buildReferrerLeaderboard = (allReferrers, rules, accurateAsOf) => {
|
|
458
1506
|
const uniqueReferrers = allReferrers.map((referrer) => referrer.referrer);
|
|
@@ -488,120 +1536,6 @@ var buildReferrerLeaderboard = (allReferrers, rules, accurateAsOf) => {
|
|
|
488
1536
|
};
|
|
489
1537
|
};
|
|
490
1538
|
|
|
491
|
-
// src/leaderboard-page.ts
|
|
492
|
-
var REFERRERS_PER_LEADERBOARD_PAGE_DEFAULT = 25;
|
|
493
|
-
var REFERRERS_PER_LEADERBOARD_PAGE_MAX = 100;
|
|
494
|
-
var validateReferrerLeaderboardPageParams = (params) => {
|
|
495
|
-
if (params.page !== void 0 && !isPositiveInteger(params.page)) {
|
|
496
|
-
throw new Error(
|
|
497
|
-
`Invalid ReferrerLeaderboardPageParams: ${params.page}. page must be a positive integer.`
|
|
498
|
-
);
|
|
499
|
-
}
|
|
500
|
-
if (params.recordsPerPage !== void 0 && !isPositiveInteger(params.recordsPerPage)) {
|
|
501
|
-
throw new Error(
|
|
502
|
-
`Invalid ReferrerLeaderboardPageParams: ${params.recordsPerPage}. recordsPerPage must be a positive integer.`
|
|
503
|
-
);
|
|
504
|
-
}
|
|
505
|
-
if (params.recordsPerPage !== void 0 && params.recordsPerPage > REFERRERS_PER_LEADERBOARD_PAGE_MAX) {
|
|
506
|
-
throw new Error(
|
|
507
|
-
`Invalid ReferrerLeaderboardPageParams: ${params.recordsPerPage}. recordsPerPage must be less than or equal to ${REFERRERS_PER_LEADERBOARD_PAGE_MAX}.`
|
|
508
|
-
);
|
|
509
|
-
}
|
|
510
|
-
};
|
|
511
|
-
var buildReferrerLeaderboardPageParams = (params) => {
|
|
512
|
-
const result = {
|
|
513
|
-
page: params.page ?? 1,
|
|
514
|
-
recordsPerPage: params.recordsPerPage ?? REFERRERS_PER_LEADERBOARD_PAGE_DEFAULT
|
|
515
|
-
};
|
|
516
|
-
validateReferrerLeaderboardPageParams(result);
|
|
517
|
-
return result;
|
|
518
|
-
};
|
|
519
|
-
var validateReferrerLeaderboardPageContext = (context) => {
|
|
520
|
-
validateReferrerLeaderboardPageParams(context);
|
|
521
|
-
if (!isNonNegativeInteger(context.totalRecords)) {
|
|
522
|
-
throw new Error(
|
|
523
|
-
`Invalid ReferrerLeaderboardPageContext: total must be a non-negative integer but is ${context.totalRecords}.`
|
|
524
|
-
);
|
|
525
|
-
}
|
|
526
|
-
const startIndex = (context.page - 1) * context.recordsPerPage;
|
|
527
|
-
const endIndex = startIndex + context.recordsPerPage;
|
|
528
|
-
if (!context.hasNext && endIndex < context.totalRecords) {
|
|
529
|
-
throw new Error(
|
|
530
|
-
`Invalid ReferrerLeaderboardPageContext: if hasNext is false, endIndex (${endIndex}) must be greater than or equal to total (${context.totalRecords}).`
|
|
531
|
-
);
|
|
532
|
-
} else if (context.hasNext && context.page * context.recordsPerPage >= context.totalRecords) {
|
|
533
|
-
throw new Error(
|
|
534
|
-
`Invalid ReferrerLeaderboardPageContext: if hasNext is true, endIndex (${endIndex}) must be less than total (${context.totalRecords}).`
|
|
535
|
-
);
|
|
536
|
-
}
|
|
537
|
-
if (!context.hasPrev && context.page !== 1) {
|
|
538
|
-
throw new Error(
|
|
539
|
-
`Invalid ReferrerLeaderboardPageContext: if hasPrev is false, page must be the first page (1) but is ${context.page}.`
|
|
540
|
-
);
|
|
541
|
-
} else if (context.hasPrev && context.page === 1) {
|
|
542
|
-
throw new Error(
|
|
543
|
-
`Invalid ReferrerLeaderboardPageContext: if hasPrev is true, page must not be the first page (1) but is ${context.page}.`
|
|
544
|
-
);
|
|
545
|
-
}
|
|
546
|
-
};
|
|
547
|
-
var buildReferrerLeaderboardPageContext = (optionalParams, leaderboard) => {
|
|
548
|
-
const materializedParams = buildReferrerLeaderboardPageParams(optionalParams);
|
|
549
|
-
const totalRecords = leaderboard.referrers.size;
|
|
550
|
-
const totalPages = Math.max(1, Math.ceil(totalRecords / materializedParams.recordsPerPage));
|
|
551
|
-
if (materializedParams.page > totalPages) {
|
|
552
|
-
throw new Error(
|
|
553
|
-
`Invalid ReferrerLeaderboardPageContext: page ${materializedParams.page} exceeds total pages ${totalPages}.`
|
|
554
|
-
);
|
|
555
|
-
}
|
|
556
|
-
if (totalRecords === 0) {
|
|
557
|
-
return {
|
|
558
|
-
...materializedParams,
|
|
559
|
-
totalRecords: 0,
|
|
560
|
-
totalPages: 1,
|
|
561
|
-
hasNext: false,
|
|
562
|
-
hasPrev: false,
|
|
563
|
-
startIndex: void 0,
|
|
564
|
-
endIndex: void 0
|
|
565
|
-
};
|
|
566
|
-
}
|
|
567
|
-
const startIndex = (materializedParams.page - 1) * materializedParams.recordsPerPage;
|
|
568
|
-
const maxTheoreticalIndexOnPage = startIndex + (materializedParams.recordsPerPage - 1);
|
|
569
|
-
const endIndex = Math.min(maxTheoreticalIndexOnPage, totalRecords - 1);
|
|
570
|
-
const hasNext = maxTheoreticalIndexOnPage < totalRecords - 1;
|
|
571
|
-
const hasPrev = materializedParams.page > 1;
|
|
572
|
-
const result = {
|
|
573
|
-
...materializedParams,
|
|
574
|
-
totalRecords,
|
|
575
|
-
totalPages,
|
|
576
|
-
hasNext,
|
|
577
|
-
hasPrev,
|
|
578
|
-
startIndex,
|
|
579
|
-
endIndex
|
|
580
|
-
};
|
|
581
|
-
validateReferrerLeaderboardPageContext(result);
|
|
582
|
-
return result;
|
|
583
|
-
};
|
|
584
|
-
var getReferrerLeaderboardPage = (pageParams, leaderboard) => {
|
|
585
|
-
const pageContext = buildReferrerLeaderboardPageContext(pageParams, leaderboard);
|
|
586
|
-
let referrers;
|
|
587
|
-
if (pageContext.totalRecords > 0 && typeof pageContext.startIndex !== "undefined" && typeof pageContext.endIndex !== "undefined") {
|
|
588
|
-
referrers = Array.from(leaderboard.referrers.values()).slice(
|
|
589
|
-
pageContext.startIndex,
|
|
590
|
-
pageContext.endIndex + 1
|
|
591
|
-
// For `slice`, this is exclusive of the element at the index 'end'. We need it to be inclusive, hence plus one.
|
|
592
|
-
);
|
|
593
|
-
} else {
|
|
594
|
-
referrers = [];
|
|
595
|
-
}
|
|
596
|
-
return {
|
|
597
|
-
rules: leaderboard.rules,
|
|
598
|
-
referrers,
|
|
599
|
-
aggregatedMetrics: leaderboard.aggregatedMetrics,
|
|
600
|
-
pageContext,
|
|
601
|
-
accurateAsOf: leaderboard.accurateAsOf
|
|
602
|
-
};
|
|
603
|
-
};
|
|
604
|
-
|
|
605
1539
|
// src/link.ts
|
|
606
1540
|
var import_viem3 = require("viem");
|
|
607
1541
|
function buildEnsReferralUrl(address) {
|
|
@@ -610,37 +1544,6 @@ function buildEnsReferralUrl(address) {
|
|
|
610
1544
|
return ensAppUrl;
|
|
611
1545
|
}
|
|
612
1546
|
|
|
613
|
-
// src/referrer-detail.ts
|
|
614
|
-
var ReferrerDetailTypeIds = {
|
|
615
|
-
/**
|
|
616
|
-
* Represents a referrer who is ranked on the leaderboard.
|
|
617
|
-
*/
|
|
618
|
-
Ranked: "ranked",
|
|
619
|
-
/**
|
|
620
|
-
* Represents a referrer who is not ranked on the leaderboard.
|
|
621
|
-
*/
|
|
622
|
-
Unranked: "unranked"
|
|
623
|
-
};
|
|
624
|
-
var getReferrerDetail = (referrer, leaderboard) => {
|
|
625
|
-
const awardedReferrerMetrics = leaderboard.referrers.get(referrer);
|
|
626
|
-
if (awardedReferrerMetrics) {
|
|
627
|
-
return {
|
|
628
|
-
type: ReferrerDetailTypeIds.Ranked,
|
|
629
|
-
rules: leaderboard.rules,
|
|
630
|
-
referrer: awardedReferrerMetrics,
|
|
631
|
-
aggregatedMetrics: leaderboard.aggregatedMetrics,
|
|
632
|
-
accurateAsOf: leaderboard.accurateAsOf
|
|
633
|
-
};
|
|
634
|
-
}
|
|
635
|
-
return {
|
|
636
|
-
type: ReferrerDetailTypeIds.Unranked,
|
|
637
|
-
rules: leaderboard.rules,
|
|
638
|
-
referrer: buildUnrankedReferrerMetrics(referrer),
|
|
639
|
-
aggregatedMetrics: leaderboard.aggregatedMetrics,
|
|
640
|
-
accurateAsOf: leaderboard.accurateAsOf
|
|
641
|
-
};
|
|
642
|
-
};
|
|
643
|
-
|
|
644
1547
|
// src/rules.ts
|
|
645
1548
|
var ENS_HOLIDAY_AWARDS_START_DATE = 1764547200;
|
|
646
1549
|
var ENS_HOLIDAY_AWARDS_END_DATE = 1767225599;
|