@antseed/ants 0.1.1

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.
Files changed (77) hide show
  1. package/LICENSE +674 -0
  2. package/dist/ants-web/assets/index-BunPfgXh.css +1 -0
  3. package/dist/ants-web/assets/index-zCPoF694.js +40 -0
  4. package/dist/ants-web/index.html +13 -0
  5. package/dist/api-types.d.ts +400 -0
  6. package/dist/api-types.js +8 -0
  7. package/dist/api-types.js.map +1 -0
  8. package/dist/index.d.ts +3 -0
  9. package/dist/index.js +17 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/jobs.d.ts +23 -0
  12. package/dist/jobs.js +70 -0
  13. package/dist/jobs.js.map +1 -0
  14. package/dist/routes.d.ts +12 -0
  15. package/dist/routes.js +64 -0
  16. package/dist/routes.js.map +1 -0
  17. package/dist/server.d.ts +29 -0
  18. package/dist/server.js +90 -0
  19. package/dist/server.js.map +1 -0
  20. package/dist/service/context.d.ts +146 -0
  21. package/dist/service/context.js +321 -0
  22. package/dist/service/context.js.map +1 -0
  23. package/dist/service/emissions.d.ts +3 -0
  24. package/dist/service/emissions.js +62 -0
  25. package/dist/service/emissions.js.map +1 -0
  26. package/dist/service/explorer.d.ts +9 -0
  27. package/dist/service/explorer.js +44 -0
  28. package/dist/service/explorer.js.map +1 -0
  29. package/dist/service/format.d.ts +8 -0
  30. package/dist/service/format.js +41 -0
  31. package/dist/service/format.js.map +1 -0
  32. package/dist/service/index.d.ts +20 -0
  33. package/dist/service/index.js +15 -0
  34. package/dist/service/index.js.map +1 -0
  35. package/dist/service/indexer.d.ts +150 -0
  36. package/dist/service/indexer.js +189 -0
  37. package/dist/service/indexer.js.map +1 -0
  38. package/dist/service/json.d.ts +3 -0
  39. package/dist/service/json.js +8 -0
  40. package/dist/service/json.js.map +1 -0
  41. package/dist/service/overview.d.ts +9 -0
  42. package/dist/service/overview.js +98 -0
  43. package/dist/service/overview.js.map +1 -0
  44. package/dist/service/pool-merge.d.ts +26 -0
  45. package/dist/service/pool-merge.js +101 -0
  46. package/dist/service/pool-merge.js.map +1 -0
  47. package/dist/service/pools.d.ts +12 -0
  48. package/dist/service/pools.js +287 -0
  49. package/dist/service/pools.js.map +1 -0
  50. package/dist/service/positions.d.ts +62 -0
  51. package/dist/service/positions.js +281 -0
  52. package/dist/service/positions.js.map +1 -0
  53. package/dist/service/rate-limit.d.ts +17 -0
  54. package/dist/service/rate-limit.js +42 -0
  55. package/dist/service/rate-limit.js.map +1 -0
  56. package/dist/service/rewards.d.ts +46 -0
  57. package/dist/service/rewards.js +399 -0
  58. package/dist/service/rewards.js.map +1 -0
  59. package/dist/service/rpc-provider.d.ts +31 -0
  60. package/dist/service/rpc-provider.js +99 -0
  61. package/dist/service/rpc-provider.js.map +1 -0
  62. package/dist/service/seller.d.ts +14 -0
  63. package/dist/service/seller.js +104 -0
  64. package/dist/service/seller.js.map +1 -0
  65. package/dist/service/steps.d.ts +6 -0
  66. package/dist/service/steps.js +24 -0
  67. package/dist/service/steps.js.map +1 -0
  68. package/dist/service/usage.d.ts +10 -0
  69. package/dist/service/usage.js +77 -0
  70. package/dist/service/usage.js.map +1 -0
  71. package/dist/service/verification.d.ts +12 -0
  72. package/dist/service/verification.js +69 -0
  73. package/dist/service/verification.js.map +1 -0
  74. package/dist/view-cache.d.ts +18 -0
  75. package/dist/view-cache.js +39 -0
  76. package/dist/view-cache.js.map +1 -0
  77. package/package.json +44 -0
@@ -0,0 +1,62 @@
1
+ import { GATE_MINTERS, gateMinterId } from '@antseed/node/payments';
2
+ import { toJson } from './json.js';
3
+ async function safe(read, fallback) {
4
+ try {
5
+ return await read();
6
+ }
7
+ catch {
8
+ return fallback;
9
+ }
10
+ }
11
+ export async function emissions(ctx) {
12
+ const stack = await ctx.stack();
13
+ const gate = ctx.gate();
14
+ const legacy = ctx.legacyEmissionsAt(stack.legacyEmissions);
15
+ const poolRewards = ctx.poolRewards();
16
+ const usageRewards = ctx.usageRewards();
17
+ let view;
18
+ if (gate) {
19
+ const epoch = stack.currentEpoch;
20
+ const [halvingInterval, initialEmission, currentRate, cumulative, shareDenominator, emissionsReserve, legacyEscrow] = await Promise.all([
21
+ gate.halvingInterval(), gate.initialEmission(), gate.currentEmissionRate(), safe(() => gate.cumulativeEmissionThrough(epoch + 1), 0n),
22
+ safe(() => gate.shareDenominator(), 100_000), safe(() => gate.emissionsReserve(), null), safe(() => gate.legacyEscrow(), null),
23
+ ]);
24
+ const minters = await Promise.all(GATE_MINTERS.map(async (minter) => {
25
+ const id = gateMinterId(minter.id);
26
+ const [info, budget] = await Promise.all([
27
+ safe(() => gate.minter(id), { controller: '0x0000000000000000000000000000000000000000', shareBps: 0, editable: false }),
28
+ safe(() => gate.minterEpochBudget(id, Math.max(epoch, stack.effectiveEpoch ?? epoch)), 0n),
29
+ ]);
30
+ return { name: minter.name, id, controller: info.controller, shareBps: info.shareBps, editable: info.editable, epochBudget: budget.toString() };
31
+ }));
32
+ view = {
33
+ currentEpoch: epoch, effectiveEpoch: stack.effectiveEpoch, genesis: stack.genesis, epochDuration: stack.epochDuration, halvingInterval,
34
+ initialEmission: initialEmission.toString(), currentRate: currentRate.toString(), cumulativeThroughCurrent: cumulative.toString(),
35
+ shareDenominator, minters, emissionsReserve, legacyEscrow,
36
+ };
37
+ }
38
+ else {
39
+ if (!legacy)
40
+ throw new Error('No emissions contract configured.');
41
+ const [halvingInterval, initialEmission, info] = await Promise.all([legacy.getHalvingInterval(), safe(() => legacy.getEpochEmission(0), 0n), legacy.getEpochInfo()]);
42
+ view = {
43
+ currentEpoch: stack.currentEpoch, effectiveEpoch: null, genesis: stack.genesis, epochDuration: stack.epochDuration, halvingInterval,
44
+ initialEmission: initialEmission.toString(), currentRate: info.emission.toString(), cumulativeThroughCurrent: '0', shareDenominator: 100, minters: [],
45
+ emissionsReserve: null, legacyEscrow: null,
46
+ };
47
+ }
48
+ const dynamicStaker = poolRewards ? await safe(async () => {
49
+ const config = await poolRewards.dynamicStakerConfigAt(stack.currentEpoch);
50
+ return { minShareBps: config.minShareBps, maxShareBps: config.maxShareBps, stakeShareTarget: config.stakeShareTarget.toString() };
51
+ }, null) : null;
52
+ const dynamicUsage = usageRewards ? await safe(async () => {
53
+ const config = await usageRewards.dynamicUsageConfigAt(stack.currentEpoch);
54
+ return { ...config, volumeShareTarget: config.volumeShareTarget.toString() };
55
+ }, null) : null;
56
+ const legacyView = legacy && stack.legacyEmissions ? await safe(async () => {
57
+ const [shares, info] = await Promise.all([legacy.getShares(), legacy.getEpochInfo()]);
58
+ return { contract: stack.legacyEmissions, sellerPct: shares.sellerSharePct, buyerPct: shares.buyerSharePct, reservePct: shares.reserveSharePct, teamPct: shares.teamSharePct, currentEpoch: info.epoch };
59
+ }, null) : null;
60
+ return toJson({ ...view, dynamicStaker, dynamicUsage, legacy: legacyView });
61
+ }
62
+ //# sourceMappingURL=emissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emissions.js","sourceRoot":"","sources":["../../src/service/emissions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { SellerProfile } from '../api-types.js';
2
+ export interface ExplorerSellers {
3
+ /** Profiles keyed by lowercase seller address. */
4
+ byAddress: Map<string, SellerProfile>;
5
+ /** Seller address per agent id (covers legacy sellers with no registry binding). */
6
+ byAgent: Map<number, string>;
7
+ }
8
+ /** Fetch the explorer's seller directory (names, lifetime stats). Failure-tolerant: returns empty maps when unreachable. */
9
+ export declare function explorerSellers(baseUrl: string | undefined, fetchImpl?: typeof fetch): Promise<ExplorerSellers>;
@@ -0,0 +1,44 @@
1
+ const PROFILE_TTL_MS = 5 * 60_000;
2
+ const FETCH_TIMEOUT_MS = 8_000;
3
+ const cache = new Map();
4
+ /** Fetch the explorer's seller directory (names, lifetime stats). Failure-tolerant: returns empty maps when unreachable. */
5
+ export async function explorerSellers(baseUrl, fetchImpl = fetch) {
6
+ if (!baseUrl)
7
+ return { byAddress: new Map(), byAgent: new Map() };
8
+ const cached = cache.get(baseUrl);
9
+ if (cached && Date.now() - cached.at < PROFILE_TTL_MS)
10
+ return cached;
11
+ try {
12
+ const response = await fetchImpl(`${baseUrl.replace(/\/$/, '')}/api/sellers`, { signal: AbortSignal.timeout(FETCH_TIMEOUT_MS) });
13
+ if (!response.ok)
14
+ throw new Error(`explorer ${response.status}`);
15
+ const sellers = await response.json();
16
+ const byAddress = new Map();
17
+ const byAgent = new Map();
18
+ for (const seller of sellers) {
19
+ if (typeof seller.address !== 'string')
20
+ continue;
21
+ const address = seller.address.toLowerCase();
22
+ byAddress.set(address, {
23
+ name: seller.sellerName ?? null,
24
+ providers: Array.isArray(seller.sellerProviders) ? seller.sellerProviders : [],
25
+ modelsServed: seller.modelsServed ?? null,
26
+ uniqueBuyers: seller.uniqueBuyers ?? null,
27
+ requestCount: seller.requestCount ?? null,
28
+ lifetimeVolumeUsdc: seller.earnedUsdc ?? null,
29
+ ghostRate: seller.ghostRate ?? null,
30
+ lastSettledAt: seller.lastSettledAt ?? null,
31
+ });
32
+ const agentId = Number(seller.agentId);
33
+ if (Number.isSafeInteger(agentId) && agentId > 0 && !byAgent.has(agentId))
34
+ byAgent.set(agentId, address);
35
+ }
36
+ const entry = { at: Date.now(), byAddress, byAgent };
37
+ cache.set(baseUrl, entry);
38
+ return entry;
39
+ }
40
+ catch {
41
+ return cached ?? { byAddress: new Map(), byAgent: new Map() };
42
+ }
43
+ }
44
+ //# sourceMappingURL=explorer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explorer.js","sourceRoot":"","sources":["../../src/service/explorer.ts"],"names":[],"mappings":"AAEA,MAAM,cAAc,GAAG,CAAC,GAAG,MAAM,CAAC;AAClC,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAC/B,MAAM,KAAK,GAAG,IAAI,GAAG,EAA+F,CAAC;AAerH,4HAA4H;AAC5H,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAA2B,EAAE,YAA0B,KAAK;IAChG,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,SAAS,EAAE,IAAI,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;IAClE,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,EAAE,GAAG,cAAc;QAAE,OAAO,MAAM,CAAC;IACrE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QACjI,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,YAAY,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACjE,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAsB,CAAC;QAC1D,MAAM,SAAS,GAAG,IAAI,GAAG,EAAyB,CAAC;QACnD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC1C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ;gBAAE,SAAS;YACjD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAC7C,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE;gBACrB,IAAI,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI;gBAC/B,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE;gBAC9E,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,IAAI;gBACzC,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,IAAI;gBACzC,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,IAAI;gBACzC,kBAAkB,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI;gBAC7C,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI;gBACnC,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,IAAI;aAC5C,CAAC,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACvC,IAAI,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;gBAAE,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC3G,CAAC;QACD,MAAM,KAAK,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;QACrD,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC1B,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,IAAI,EAAE,SAAS,EAAE,IAAI,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;IAChE,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ /** Format 18-decimal base units with up to `fractionDigits` fraction digits (trailing zeros trimmed). */
2
+ export declare function formatAnts(baseUnits: bigint | string, fractionDigits?: number): string;
3
+ export declare function formatAntsExact(baseUnits: bigint | string): string;
4
+ /** Parse a human ANTS amount ("12.5") into base units; rejects zero, negatives, and more than 18 decimals. */
5
+ export declare function parseAnts(amount: string): bigint;
6
+ export declare function formatUsdc(baseUnits: bigint | string): string;
7
+ export declare function formatBps(bps: number): string;
8
+ export declare function shortAddress(address: string): string;
@@ -0,0 +1,41 @@
1
+ const ANTS_DECIMALS = 18n;
2
+ const ONE_ANTS = 10n ** ANTS_DECIMALS;
3
+ /** Format 18-decimal base units with up to `fractionDigits` fraction digits (trailing zeros trimmed). */
4
+ export function formatAnts(baseUnits, fractionDigits = 4) {
5
+ const value = typeof baseUnits === 'string' ? BigInt(baseUnits) : baseUnits;
6
+ const negative = value < 0n;
7
+ const abs = negative ? -value : value;
8
+ const whole = abs / ONE_ANTS;
9
+ const fraction = (abs % ONE_ANTS).toString().padStart(18, '0').slice(0, fractionDigits).replace(/0+$/, '');
10
+ const wholeText = whole.toLocaleString('en-US');
11
+ return `${negative ? '-' : ''}${wholeText}${fraction ? `.${fraction}` : ''}`;
12
+ }
13
+ export function formatAntsExact(baseUnits) {
14
+ const value = typeof baseUnits === 'string' ? BigInt(baseUnits) : baseUnits;
15
+ const whole = value / ONE_ANTS;
16
+ const fraction = (value % ONE_ANTS).toString().padStart(18, '0').replace(/0+$/, '');
17
+ return fraction ? `${whole}.${fraction}` : `${whole}`;
18
+ }
19
+ /** Parse a human ANTS amount ("12.5") into base units; rejects zero, negatives, and more than 18 decimals. */
20
+ export function parseAnts(amount) {
21
+ const match = amount.trim().replace(/,/g, '').match(/^(\d+)(?:\.(\d{1,18}))?$/);
22
+ if (!match)
23
+ throw new Error('Amount must be a positive number with at most 18 decimals.');
24
+ const baseUnits = BigInt(match[1]) * ONE_ANTS + BigInt((match[2] ?? '').padEnd(18, '0') || '0');
25
+ if (baseUnits <= 0n)
26
+ throw new Error('Amount must be greater than zero.');
27
+ return baseUnits;
28
+ }
29
+ export function formatUsdc(baseUnits) {
30
+ const value = typeof baseUnits === 'string' ? BigInt(baseUnits) : baseUnits;
31
+ const whole = value / 1000000n;
32
+ const fraction = (value % 1000000n).toString().padStart(6, '0').replace(/0+$/, '');
33
+ return fraction ? `${whole}.${fraction}` : `${whole}`;
34
+ }
35
+ export function formatBps(bps) {
36
+ return `${(bps / 100).toFixed(2).replace(/\.?0+$/, '')}%`;
37
+ }
38
+ export function shortAddress(address) {
39
+ return address.length > 12 ? `${address.slice(0, 6)}…${address.slice(-4)}` : address;
40
+ }
41
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/service/format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export { AntsContext, MissingContractError } from './context.js';
2
+ export type { AntsChainConfig, AntsContextOptions, ResolvedStack } from './context.js';
3
+ export { overview, epochInfo } from './overview.js';
4
+ export { positions, closedPositionIds, stake, move, split, merge, extend, maxLock, previewWithdraw, withdraw } from './positions.js';
5
+ export type { WithdrawPreview } from './positions.js';
6
+ export { rewards, claim, restake, stakeUsageRewards, compound } from './rewards.js';
7
+ export type { ClaimResult, RestakeResult, StakeUsageResult, CompoundRequest, CompoundResult } from './rewards.js';
8
+ export { poolsView, singlePool } from './pools.js';
9
+ export { usage } from './usage.js';
10
+ export { emissions } from './emissions.js';
11
+ export { verification, proofStatus, submitProof } from './verification.js';
12
+ export type { SubmitProofResult } from './verification.js';
13
+ export { seller, registerBinding, claimStarter } from './seller.js';
14
+ export { formatAnts, formatAntsExact, parseAnts, formatUsdc, formatBps, shortAddress } from './format.js';
15
+ export { toJson, jsonReplacer } from './json.js';
16
+ export { silentReporter } from './steps.js';
17
+ export type { StepReporter } from './steps.js';
18
+ export { validateSellerProofArtifact, sellerProofId } from '@antseed/node/payments';
19
+ export type { SellerProofArtifact } from '@antseed/node/payments';
20
+ export * from '../api-types.js';
@@ -0,0 +1,15 @@
1
+ export { AntsContext, MissingContractError } from './context.js';
2
+ export { overview, epochInfo } from './overview.js';
3
+ export { positions, closedPositionIds, stake, move, split, merge, extend, maxLock, previewWithdraw, withdraw } from './positions.js';
4
+ export { rewards, claim, restake, stakeUsageRewards, compound } from './rewards.js';
5
+ export { poolsView, singlePool } from './pools.js';
6
+ export { usage } from './usage.js';
7
+ export { emissions } from './emissions.js';
8
+ export { verification, proofStatus, submitProof } from './verification.js';
9
+ export { seller, registerBinding, claimStarter } from './seller.js';
10
+ export { formatAnts, formatAntsExact, parseAnts, formatUsdc, formatBps, shortAddress } from './format.js';
11
+ export { toJson, jsonReplacer } from './json.js';
12
+ export { silentReporter } from './steps.js';
13
+ export { validateSellerProofArtifact, sellerProofId } from '@antseed/node/payments';
14
+ export * from '../api-types.js';
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/service/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEjE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAErI,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAEpF,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE3E,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC1G,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EAAE,2BAA2B,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEpF,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Read side for everything that is a list or a history: pools and their
3
+ * per-epoch figures, a wallet's position history, per-epoch usage. It is
4
+ * served by the Antscan indexer (`payments.crypto.explorerApiUrl`), never
5
+ * reconstructed from RPC log scans. Every method returns plain JSON-shaped
6
+ * data; amounts stay as decimal strings.
7
+ */
8
+ export interface IndexedStakingEpoch {
9
+ epoch: number;
10
+ totalPowerWeight: string;
11
+ totalActiveStake: string;
12
+ totalSellerPoints: string;
13
+ totalWeightedPoolPoints: string;
14
+ totalBuyerPoints: string;
15
+ volumeUsdc: string;
16
+ requests: string;
17
+ stakerBudget: string;
18
+ }
19
+ export interface IndexedPool {
20
+ agentId: number;
21
+ seller: string | null;
22
+ sellerName: string | null;
23
+ registered: boolean;
24
+ openPositions: number;
25
+ totalPositions: number;
26
+ securityShareBps: string;
27
+ activeStake: string;
28
+ pendingStake: string;
29
+ weight: string;
30
+ powerShareBps: number;
31
+ lastWeight: string;
32
+ usagePoints: string;
33
+ weightedUsagePoints: string;
34
+ lastUsagePoints: string;
35
+ volumeUsdc: string;
36
+ lastVolumeUsdc: string;
37
+ lastEmission: string;
38
+ lastEmissionSettled: boolean;
39
+ lastRewardPer1kPower: string | null;
40
+ projectedEmission: string;
41
+ projectedRewardPer1kPower: string | null;
42
+ }
43
+ export interface IndexedPools {
44
+ currentEpoch: number;
45
+ network: {
46
+ current: IndexedStakingEpoch | null;
47
+ last: IndexedStakingEpoch | null;
48
+ };
49
+ pools: IndexedPool[];
50
+ }
51
+ export interface IndexedPoolEpoch {
52
+ epoch: number;
53
+ weight: string;
54
+ activeStake: string;
55
+ usagePoints: string;
56
+ weightedUsagePoints: string;
57
+ volumeUsdc: string;
58
+ requests: string;
59
+ settledEmission: string;
60
+ settled: boolean;
61
+ }
62
+ export interface IndexedPoolDetail {
63
+ pool: (IndexedPool & {
64
+ firstStakeAt: number | null;
65
+ }) | null;
66
+ epochs: IndexedPoolEpoch[];
67
+ openPositions: number;
68
+ stakers: number;
69
+ }
70
+ export interface IndexedPosition {
71
+ id: number;
72
+ owner: string;
73
+ agentId: number;
74
+ amount: string;
75
+ weightAmount: string;
76
+ stakeStartEpoch: number;
77
+ stakeEndEpoch: number;
78
+ closedAtEpoch: number;
79
+ closedBy: 'split' | 'merge' | 'move' | 'withdraw' | null;
80
+ replacementIds: number[];
81
+ sourceId: number | null;
82
+ restaked: boolean;
83
+ maxLocked: boolean;
84
+ withdrawn: boolean;
85
+ returnedAmount: string;
86
+ slashedAmount: string;
87
+ createdAt: number;
88
+ closedAt: number | null;
89
+ }
90
+ export interface IndexedSellerEpoch {
91
+ seller: string;
92
+ epoch: number;
93
+ agentId: number | null;
94
+ volumeUsdc: string;
95
+ points: string;
96
+ weightedPoints: string;
97
+ requests: string;
98
+ }
99
+ export interface IndexedBuyerEpoch {
100
+ buyer: string;
101
+ epoch: number;
102
+ volumeUsdc: string;
103
+ points: string;
104
+ weightedPoints: string;
105
+ requests: string;
106
+ }
107
+ export interface IndexedParticipant {
108
+ address: string;
109
+ currentEpoch: number;
110
+ seller: IndexedSellerEpoch[];
111
+ buyer: IndexedBuyerEpoch[];
112
+ }
113
+ /** Network settlement volume per epoch from the explorer's epoch metrics (covers legacy epochs too). */
114
+ export interface IndexedEpochMetric {
115
+ epoch: number;
116
+ volumeUsdc: string;
117
+ requests: string;
118
+ }
119
+ export interface Indexer {
120
+ readonly baseUrl: string;
121
+ pools(): Promise<IndexedPools>;
122
+ pool(agentId: number, epochs?: number): Promise<IndexedPoolDetail>;
123
+ positions(owner: string, includeClosed?: boolean): Promise<IndexedPosition[]>;
124
+ stakingEpochs(limit?: number): Promise<IndexedStakingEpoch[]>;
125
+ /** Settled volume per seller (lowercase address) for the last `epochs` epochs, newest first. */
126
+ sellerEpochs(epochs?: number): Promise<Map<string, IndexedSellerEpoch[]>>;
127
+ participant(address: string, epochs?: number): Promise<IndexedParticipant>;
128
+ epochMetrics(): Promise<IndexedEpochMetric[]>;
129
+ }
130
+ export declare class IndexerError extends Error {
131
+ readonly url: string;
132
+ constructor(message: string, url: string);
133
+ }
134
+ export declare class AntscanIndexer implements Indexer {
135
+ private readonly fetchImpl;
136
+ private readonly ttlMs;
137
+ readonly baseUrl: string;
138
+ private readonly cache;
139
+ constructor(baseUrl: string, fetchImpl?: typeof fetch, ttlMs?: number);
140
+ private get;
141
+ pools(): Promise<IndexedPools>;
142
+ pool(agentId: number, epochs?: number): Promise<IndexedPoolDetail>;
143
+ positions(owner: string, includeClosed?: boolean): Promise<IndexedPosition[]>;
144
+ stakingEpochs(limit?: number): Promise<IndexedStakingEpoch[]>;
145
+ sellerEpochs(epochs?: number): Promise<Map<string, IndexedSellerEpoch[]>>;
146
+ participant(address: string, epochs?: number): Promise<IndexedParticipant>;
147
+ epochMetrics(): Promise<IndexedEpochMetric[]>;
148
+ }
149
+ /** The indexer for a chain config; null when no explorer is configured (`explorerApiUrl: ''`). */
150
+ export declare function createIndexer(baseUrl: string | undefined, fetchImpl?: typeof fetch): Indexer | null;
@@ -0,0 +1,189 @@
1
+ /**
2
+ * Read side for everything that is a list or a history: pools and their
3
+ * per-epoch figures, a wallet's position history, per-epoch usage. It is
4
+ * served by the Antscan indexer (`payments.crypto.explorerApiUrl`), never
5
+ * reconstructed from RPC log scans. Every method returns plain JSON-shaped
6
+ * data; amounts stay as decimal strings.
7
+ */
8
+ const FETCH_TIMEOUT_MS = 8_000;
9
+ const CACHE_TTL_MS = 15_000;
10
+ export class IndexerError extends Error {
11
+ url;
12
+ constructor(message, url) {
13
+ super(message);
14
+ this.url = url;
15
+ this.name = 'IndexerError';
16
+ }
17
+ }
18
+ const num = (value) => {
19
+ const parsed = typeof value === 'number' ? value : Number(value ?? 0);
20
+ return Number.isFinite(parsed) ? parsed : 0;
21
+ };
22
+ const str = (value) => (value === null || value === undefined ? '0' : String(value));
23
+ const lower = (value) => (typeof value === 'string' && value ? value.toLowerCase() : null);
24
+ /** `convert(value)`, or null when the field is absent. */
25
+ const optional = (value, convert) => (value === null || value === undefined ? null : convert(value));
26
+ const CLOSE_REASONS = ['split', 'merge', 'move', 'withdraw'];
27
+ function toStakingEpoch(row) {
28
+ if (!row)
29
+ return null;
30
+ return {
31
+ epoch: num(row['epoch']),
32
+ totalPowerWeight: str(row['totalPowerWeight']),
33
+ totalActiveStake: str(row['totalActiveStake']),
34
+ totalSellerPoints: str(row['totalSellerPoints']),
35
+ totalWeightedPoolPoints: str(row['totalWeightedPoolPoints']),
36
+ totalBuyerPoints: str(row['totalBuyerPoints']),
37
+ volumeUsdc: str(row['volumeUsdc']),
38
+ requests: str(row['requests']),
39
+ stakerBudget: str(row['stakerBudget']),
40
+ };
41
+ }
42
+ function toPool(row) {
43
+ return {
44
+ agentId: num(row['agentId']),
45
+ seller: lower(row['seller']),
46
+ sellerName: typeof row['sellerName'] === 'string' ? row['sellerName'] : null,
47
+ registered: row['registered'] === true,
48
+ openPositions: num(row['openPositions']),
49
+ totalPositions: num(row['totalPositions']),
50
+ securityShareBps: str(row['securityShareBps']),
51
+ activeStake: str(row['activeStake']),
52
+ pendingStake: str(row['pendingStake']),
53
+ weight: str(row['weight']),
54
+ powerShareBps: num(row['powerShareBps']),
55
+ lastWeight: str(row['lastWeight']),
56
+ usagePoints: str(row['usagePoints']),
57
+ weightedUsagePoints: str(row['weightedUsagePoints']),
58
+ lastUsagePoints: str(row['lastUsagePoints']),
59
+ volumeUsdc: str(row['volumeUsdc']),
60
+ lastVolumeUsdc: str(row['lastVolumeUsdc']),
61
+ lastEmission: str(row['lastEmission']),
62
+ lastEmissionSettled: row['lastEmissionSettled'] === true,
63
+ lastRewardPer1kPower: optional(row['lastRewardPer1kPower'], str),
64
+ projectedEmission: str(row['projectedEmission']),
65
+ projectedRewardPer1kPower: optional(row['projectedRewardPer1kPower'], str),
66
+ firstStakeAt: optional(row['firstStakeAt'], num),
67
+ };
68
+ }
69
+ function toPosition(row) {
70
+ const closedBy = CLOSE_REASONS.find((reason) => reason === row['closedBy']) ?? null;
71
+ return {
72
+ id: num(row['id']),
73
+ owner: lower(row['owner']) ?? '',
74
+ agentId: num(row['agentId']),
75
+ amount: str(row['amount']),
76
+ weightAmount: str(row['weightAmount']),
77
+ stakeStartEpoch: num(row['stakeStartEpoch']),
78
+ stakeEndEpoch: num(row['stakeEndEpoch']),
79
+ closedAtEpoch: num(row['closedAtEpoch']),
80
+ closedBy,
81
+ replacementIds: Array.isArray(row['replacementIds']) ? row['replacementIds'].map(num) : [],
82
+ sourceId: optional(row['sourceId'], num),
83
+ restaked: row['restaked'] === true,
84
+ maxLocked: row['maxLocked'] === true,
85
+ withdrawn: row['withdrawn'] === true,
86
+ returnedAmount: str(row['returnedAmount']),
87
+ slashedAmount: str(row['slashedAmount']),
88
+ createdAt: num(row['createdAt']),
89
+ closedAt: optional(row['closedAt'], num),
90
+ };
91
+ }
92
+ const toSellerEpoch = (row) => ({
93
+ seller: lower(row['seller']) ?? '',
94
+ epoch: num(row['epoch']),
95
+ agentId: optional(row['agentId'], num),
96
+ volumeUsdc: str(row['volumeUsdc']),
97
+ points: str(row['points']),
98
+ weightedPoints: str(row['weightedPoints']),
99
+ requests: str(row['requests']),
100
+ });
101
+ const toBuyerEpoch = (row) => ({
102
+ buyer: lower(row['buyer']) ?? '',
103
+ epoch: num(row['epoch']),
104
+ volumeUsdc: str(row['volumeUsdc']),
105
+ points: str(row['points']),
106
+ weightedPoints: str(row['weightedPoints']),
107
+ requests: str(row['requests']),
108
+ });
109
+ export class AntscanIndexer {
110
+ fetchImpl;
111
+ ttlMs;
112
+ baseUrl;
113
+ cache = new Map();
114
+ constructor(baseUrl, fetchImpl = fetch, ttlMs = CACHE_TTL_MS) {
115
+ this.fetchImpl = fetchImpl;
116
+ this.ttlMs = ttlMs;
117
+ this.baseUrl = baseUrl.replace(/\/$/, '');
118
+ }
119
+ get(path) {
120
+ const hit = this.cache.get(path);
121
+ if (hit && Date.now() - hit.at < this.ttlMs)
122
+ return hit.value;
123
+ const url = `${this.baseUrl}${path}`;
124
+ const value = (async () => {
125
+ let response;
126
+ try {
127
+ response = await this.fetchImpl(url, { signal: AbortSignal.timeout(FETCH_TIMEOUT_MS), headers: { accept: 'application/json' } });
128
+ }
129
+ catch (error) {
130
+ throw new IndexerError(`Explorer unreachable: ${error.message}`, url);
131
+ }
132
+ if (!response.ok)
133
+ throw new IndexerError(`Explorer responded with HTTP ${response.status}`, url);
134
+ return await response.json();
135
+ })();
136
+ this.cache.set(path, { at: Date.now(), value });
137
+ value.catch(() => { if (this.cache.get(path)?.value === value)
138
+ this.cache.delete(path); });
139
+ return value;
140
+ }
141
+ async pools() {
142
+ const raw = await this.get('/api/staking/pools');
143
+ return {
144
+ currentEpoch: num(raw.currentEpoch),
145
+ network: { current: toStakingEpoch(raw.network?.current ?? null), last: toStakingEpoch(raw.network?.last ?? null) },
146
+ pools: (raw.pools ?? []).map(toPool),
147
+ };
148
+ }
149
+ async pool(agentId, epochs = 8) {
150
+ const raw = await this.get(`/api/staking/pools/${agentId}?epochs=${epochs}`);
151
+ return {
152
+ pool: raw.pool ? toPool(raw.pool) : null,
153
+ epochs: (raw.epochs ?? []).map((row) => ({
154
+ epoch: num(row['epoch']), weight: str(row['weight']), activeStake: str(row['activeStake']), usagePoints: str(row['usagePoints']), weightedUsagePoints: str(row['weightedUsagePoints']),
155
+ volumeUsdc: str(row['volumeUsdc']), requests: str(row['requests']), settledEmission: str(row['settledEmission']), settled: row['settled'] === true,
156
+ })),
157
+ openPositions: num(raw.openPositions),
158
+ stakers: num(raw.stakers),
159
+ };
160
+ }
161
+ async positions(owner, includeClosed = true) {
162
+ const raw = await this.get(`/api/staking/positions?owner=${owner.toLowerCase()}${includeClosed ? '&includeClosed=1' : ''}`);
163
+ return (raw.positions ?? []).map(toPosition);
164
+ }
165
+ async stakingEpochs(limit = 8) {
166
+ const raw = await this.get(`/api/staking/epochs?limit=${limit}`);
167
+ return (raw ?? []).map((row) => toStakingEpoch(row));
168
+ }
169
+ async sellerEpochs(epochs = 3) {
170
+ const raw = await this.get(`/api/staking/seller-epochs?epochs=${epochs}`);
171
+ const bySeller = new Map();
172
+ for (const row of (raw.rows ?? []).map(toSellerEpoch))
173
+ bySeller.set(row.seller, [...(bySeller.get(row.seller) ?? []), row]);
174
+ return bySeller;
175
+ }
176
+ async participant(address, epochs = 8) {
177
+ const raw = await this.get(`/api/staking/participants/${address.toLowerCase()}?epochs=${epochs}`);
178
+ return { address: address.toLowerCase(), currentEpoch: num(raw.currentEpoch), seller: (raw.seller ?? []).map(toSellerEpoch), buyer: (raw.buyer ?? []).map(toBuyerEpoch) };
179
+ }
180
+ async epochMetrics() {
181
+ const raw = await this.get('/api/epochs');
182
+ return (raw ?? []).map((row) => ({ epoch: num(row['epoch']), volumeUsdc: str(row['volumeUsdc']), requests: str(row['requests']) }));
183
+ }
184
+ }
185
+ /** The indexer for a chain config; null when no explorer is configured (`explorerApiUrl: ''`). */
186
+ export function createIndexer(baseUrl, fetchImpl = fetch) {
187
+ return baseUrl ? new AntscanIndexer(baseUrl, fetchImpl) : null;
188
+ }
189
+ //# sourceMappingURL=indexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexer.js","sourceRoot":"","sources":["../../src/service/indexer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAC/B,MAAM,YAAY,GAAG,MAAM,CAAC;AAuG5B,MAAM,OAAO,YAAa,SAAQ,KAAK;IACC;IAAtC,YAAY,OAAe,EAAW,GAAW;QAC/C,KAAK,CAAC,OAAO,CAAC,CAAC;QADqB,QAAG,GAAH,GAAG,CAAQ;QAE/C,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,GAAG,GAAG,CAAC,KAAc,EAAU,EAAE;IACrC,MAAM,MAAM,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;IACtE,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAC,CAAC;AACF,MAAM,GAAG,GAAG,CAAC,KAAc,EAAU,EAAE,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACtG,MAAM,KAAK,GAAG,CAAC,KAAc,EAAiB,EAAE,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACnH,0DAA0D;AAC1D,MAAM,QAAQ,GAAG,CAAI,KAAc,EAAE,OAA8B,EAAY,EAAE,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AAClJ,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAU,CAAC;AAEtE,SAAS,cAAc,CAAC,GAAmC;IACzD,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,OAAO;QACL,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxB,gBAAgB,EAAE,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAC9C,gBAAgB,EAAE,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAC9C,iBAAiB,EAAE,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAChD,uBAAuB,EAAE,GAAG,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QAC5D,gBAAgB,EAAE,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAC9C,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAClC,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC9B,YAAY,EAAE,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;KACvC,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CAAC,GAA4B;IAC1C,OAAO;QACL,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC5B,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5B,UAAU,EAAE,OAAO,GAAG,CAAC,YAAY,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI;QAC5E,UAAU,EAAE,GAAG,CAAC,YAAY,CAAC,KAAK,IAAI;QACtC,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACxC,cAAc,EAAE,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC1C,gBAAgB,EAAE,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAC9C,WAAW,EAAE,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACpC,YAAY,EAAE,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACtC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1B,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACxC,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAClC,WAAW,EAAE,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACpC,mBAAmB,EAAE,GAAG,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACpD,eAAe,EAAE,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC5C,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAClC,cAAc,EAAE,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC1C,YAAY,EAAE,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACtC,mBAAmB,EAAE,GAAG,CAAC,qBAAqB,CAAC,KAAK,IAAI;QACxD,oBAAoB,EAAE,QAAQ,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAAE,GAAG,CAAC;QAChE,iBAAiB,EAAE,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAChD,yBAAyB,EAAE,QAAQ,CAAC,GAAG,CAAC,2BAA2B,CAAC,EAAE,GAAG,CAAC;QAC1E,YAAY,EAAE,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,GAAG,CAAC;KACjD,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,GAA4B;IAC9C,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,IAAI,CAAC;IACpF,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE;QAChC,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC5B,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1B,YAAY,EAAE,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACtC,eAAe,EAAE,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC5C,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACxC,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACxC,QAAQ;QACR,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,gBAAgB,CAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE;QACzG,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC;QACxC,QAAQ,EAAE,GAAG,CAAC,UAAU,CAAC,KAAK,IAAI;QAClC,SAAS,EAAE,GAAG,CAAC,WAAW,CAAC,KAAK,IAAI;QACpC,SAAS,EAAE,GAAG,CAAC,WAAW,CAAC,KAAK,IAAI;QACpC,cAAc,EAAE,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC1C,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACxC,SAAS,EAAE,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAChC,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC;KACzC,CAAC;AACJ,CAAC;AAED,MAAM,aAAa,GAAG,CAAC,GAA4B,EAAsB,EAAE,CAAC,CAAC;IAC3E,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE;IAClC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACxB,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC;IACtC,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAClC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC1B,cAAc,EAAE,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC1C,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;CAC/B,CAAC,CAAC;AACH,MAAM,YAAY,GAAG,CAAC,GAA4B,EAAqB,EAAE,CAAC,CAAC;IACzE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE;IAChC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACxB,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAClC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC1B,cAAc,EAAE,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC1C,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;CAC/B,CAAC,CAAC;AAEH,MAAM,OAAO,cAAc;IAIqB;IAAkD;IAHvF,OAAO,CAAS;IACR,KAAK,GAAG,IAAI,GAAG,EAAmD,CAAC;IAEpF,YAAY,OAAe,EAAmB,YAA0B,KAAK,EAAmB,QAAQ,YAAY;QAAtE,cAAS,GAAT,SAAS,CAAsB;QAAmB,UAAK,GAAL,KAAK,CAAe;QAClH,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC5C,CAAC;IAEO,GAAG,CAAI,IAAY;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK;YAAE,OAAO,GAAG,CAAC,KAAmB,CAAC;QAC5E,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,CAAC,KAAK,IAAI,EAAE;YACxB,IAAI,QAAkB,CAAC;YACvB,IAAI,CAAC;gBACH,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC;YACnI,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,YAAY,CAAC,yBAA0B,KAAe,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;YACnF,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,MAAM,IAAI,YAAY,CAAC,gCAAgC,QAAQ,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC;YACjG,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAO,CAAC;QACpC,CAAC,CAAC,EAAE,CAAC;QACL,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAChD,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,KAAK,KAAK;YAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3F,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAA0J,oBAAoB,CAAC,CAAC;QAC1M,OAAO;YACL,YAAY,EAAE,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC;YACnC,OAAO,EAAE,EAAE,OAAO,EAAE,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,IAAI,IAAI,CAAC,EAAE;YACnH,KAAK,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;SACrC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAe,EAAE,MAAM,GAAG,CAAC;QACpC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAwH,sBAAsB,OAAO,WAAW,MAAM,EAAE,CAAC,CAAC;QACpM,OAAO;YACL,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;YACxC,MAAM,EAAE,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACvC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,EAAE,mBAAmB,EAAE,GAAG,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;gBACtL,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,eAAe,EAAE,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,SAAS,CAAC,KAAK,IAAI;aACnJ,CAAC,CAAC;YACH,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC;YACrC,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC;SAC1B,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAa,EAAE,aAAa,GAAG,IAAI;QACjD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAA2C,gCAAgC,KAAK,CAAC,WAAW,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtK,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAAK,GAAG,CAAC;QAC3B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAA4B,6BAA6B,KAAK,EAAE,CAAC,CAAC;QAC5F,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAE,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;QAC3B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAsC,qCAAqC,MAAM,EAAE,CAAC,CAAC;QAC/G,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAgC,CAAC;QACzD,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC;YAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAC5H,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAe,EAAE,MAAM,GAAG,CAAC;QAC3C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAmH,6BAA6B,OAAO,CAAC,WAAW,EAAE,WAAW,MAAM,EAAE,CAAC,CAAC;QACpN,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,WAAW,EAAE,EAAE,YAAY,EAAE,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;IAC5K,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAA4B,aAAa,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtI,CAAC;CACF;AAED,kGAAkG;AAClG,MAAM,UAAU,aAAa,CAAC,OAA2B,EAAE,YAA0B,KAAK;IACxF,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACjE,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Replace bigints with decimal strings so a view can be serialized or printed. */
2
+ export declare function toJson<T>(value: T): T;
3
+ export declare function jsonReplacer(_key: string, value: unknown): unknown;
@@ -0,0 +1,8 @@
1
+ /** Replace bigints with decimal strings so a view can be serialized or printed. */
2
+ export function toJson(value) {
3
+ return JSON.parse(JSON.stringify(value, (_key, item) => typeof item === 'bigint' ? item.toString() : item));
4
+ }
5
+ export function jsonReplacer(_key, value) {
6
+ return typeof value === 'bigint' ? value.toString() : value;
7
+ }
8
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/service/json.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,MAAM,UAAU,MAAM,CAAI,KAAQ;IAChC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAM,CAAC;AACnH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,KAAc;IACvD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { AntsContext } from './context.js';
2
+ import type { OverviewView, EpochInfo } from '../api-types.js';
3
+ export declare function epochInfo(stack: {
4
+ currentEpoch: number;
5
+ effectiveEpoch: number | null;
6
+ genesis: number;
7
+ epochDuration: number;
8
+ }, now?: number): EpochInfo;
9
+ export declare function overview(ctx: AntsContext): Promise<OverviewView>;