@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,29 @@
1
+ import { type FastifyInstance } from 'fastify';
2
+ import type { AbstractSigner } from 'ethers';
3
+ import { AntsContext, type AntsChainConfig } from './service/context.js';
4
+ export interface AntsServerOptions {
5
+ port: number;
6
+ host?: string;
7
+ /** Node data directory holding the identity wallet (default ~/.antseed). */
8
+ dataDir?: string;
9
+ /** Config file with `payments.crypto` overrides (default <dataDir>/config.json). */
10
+ configPath?: string;
11
+ /** Pre-resolved chain config; skips reading config.json. */
12
+ chain?: AntsChainConfig;
13
+ /** Explicit signer/address; skips loading the identity from disk. */
14
+ signer?: AbstractSigner;
15
+ address?: string;
16
+ /** Serve a read-only dashboard for `address` without a signer. */
17
+ readOnly?: boolean;
18
+ }
19
+ export interface AntsServer {
20
+ app: FastifyInstance;
21
+ token: string;
22
+ url: string;
23
+ context: AntsContext;
24
+ listen(): Promise<string>;
25
+ close(): Promise<void>;
26
+ }
27
+ /** Resolve the chain config the same way the CLI does: protocol defaults + `payments.crypto` overrides + ANTSEED_BASE_RPC_URL. */
28
+ export declare function resolveAntsChain(configPath: string, env?: NodeJS.ProcessEnv): Promise<AntsChainConfig>;
29
+ export declare function createAntsServer(options: AntsServerOptions): Promise<AntsServer>;
package/dist/server.js ADDED
@@ -0,0 +1,90 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import path from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { readFile } from 'node:fs/promises';
5
+ import { homedir } from 'node:os';
6
+ import Fastify from 'fastify';
7
+ import fastifyCors from '@fastify/cors';
8
+ import fastifyStatic from '@fastify/static';
9
+ import { loadOrCreateIdentity, resolveChainConfig } from '@antseed/node';
10
+ import { AntsContext } from './service/context.js';
11
+ import { JobRunner } from './jobs.js';
12
+ import { registerRoutes } from './routes.js';
13
+ import { ViewCache } from './view-cache.js';
14
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
15
+ async function readCryptoOverrides(configPath) {
16
+ try {
17
+ const parsed = JSON.parse(await readFile(configPath, 'utf-8'));
18
+ return parsed.payments?.crypto ?? {};
19
+ }
20
+ catch {
21
+ return {};
22
+ }
23
+ }
24
+ /** Resolve the chain config the same way the CLI does: protocol defaults + `payments.crypto` overrides + ANTSEED_BASE_RPC_URL. */
25
+ export async function resolveAntsChain(configPath, env = process.env) {
26
+ const overrides = await readCryptoOverrides(configPath);
27
+ const rpcOverride = env['ANTSEED_BASE_RPC_URL']?.trim();
28
+ const resolved = resolveChainConfig({ ...overrides, ...(rpcOverride ? { rpcUrl: rpcOverride } : {}) });
29
+ return { ...resolved, ...overrides, rpcUrl: rpcOverride || overrides['rpcUrl'] || resolved.rpcUrl };
30
+ }
31
+ export async function createAntsServer(options) {
32
+ const host = options.host ?? '127.0.0.1';
33
+ const dataDir = options.dataDir ?? path.join(homedir(), '.antseed');
34
+ const configPath = options.configPath ?? path.join(dataDir, 'config.json');
35
+ const chain = options.chain ?? await resolveAntsChain(configPath);
36
+ let signer = options.signer;
37
+ let address = options.address;
38
+ if (!signer && !options.readOnly) {
39
+ const identity = await loadOrCreateIdentity(dataDir);
40
+ signer = identity.wallet;
41
+ address = identity.wallet.address;
42
+ }
43
+ if (!address)
44
+ throw new Error('An address is required for a read-only dashboard.');
45
+ const readOnly = !signer;
46
+ const context = new AntsContext({ chain, address, ...(signer ? { signer } : {}) });
47
+ await context.selectRpc();
48
+ const app = Fastify({ logger: false, bodyLimit: 32 * 1024 * 1024 });
49
+ const token = randomBytes(24).toString('hex');
50
+ const origin = `http://${host}:${options.port}`;
51
+ await app.register(fastifyCors, { origin });
52
+ // Every API call carries the per-session token the CLI put in the URL fragment;
53
+ // a page on another origin cannot read it, and a stray tab cannot sign.
54
+ app.addHook('onRequest', async (request, reply) => {
55
+ if (!request.url.startsWith('/api/'))
56
+ return;
57
+ const header = request.headers.authorization;
58
+ if (header !== `Bearer ${token}`)
59
+ return reply.status(401).send({ ok: false, error: 'Unauthorized' });
60
+ });
61
+ const webDir = path.resolve(__dirname, 'ants-web');
62
+ try {
63
+ await app.register(fastifyStatic, { root: webDir, prefix: '/' });
64
+ app.setNotFoundHandler((request, reply) => {
65
+ if (request.url.startsWith('/api/'))
66
+ return reply.status(404).send({ ok: false, error: 'Not found' });
67
+ return reply.sendFile('index.html');
68
+ });
69
+ }
70
+ catch {
71
+ // No web bundle (dev mode); the API is still available for the Vite dev server.
72
+ }
73
+ const views = new ViewCache();
74
+ registerRoutes(app, { ctx: context, jobs: new JobRunner({ onFinish: () => views.invalidate() }), views, readOnly, dataDir });
75
+ const url = `${origin}/#token=${token}`;
76
+ return {
77
+ app,
78
+ token,
79
+ url,
80
+ context,
81
+ async listen() {
82
+ await app.listen({ port: options.port, host });
83
+ return url;
84
+ },
85
+ async close() {
86
+ await app.close();
87
+ },
88
+ };
89
+ }
90
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,146 @@
1
+ import { type AbstractSigner } from 'ethers';
2
+ import { RotatingJsonRpcProvider } from './rpc-provider.js';
3
+ import { type Indexer } from './indexer.js';
4
+ import { ANTSTokenClient, DepositsClient, EmissionsClient, EmissionsGateClient, IdentityClient, PointsPolicyRegistryClient, PositionInitClient, RegistryClient, SellerPoolsClient, SellerPoolsRewardsClient, SellerRegistryClient, SellerRewardsPoolClient, StakingClient, UsageAccountingClient, UsageRewardsClient, WashTradingRegistryClient } from '@antseed/node/payments';
5
+ import type { ProtocolPhase } from '../api-types.js';
6
+ /** Resolved chain configuration (the CLI's `requireCryptoConfig` output or a `resolveChainConfig` result). */
7
+ export interface AntsChainConfig {
8
+ chainId: string;
9
+ evmChainId: number;
10
+ rpcUrl: string;
11
+ fallbackRpcUrls?: string[];
12
+ registryContractAddress?: string;
13
+ depositsContractAddress?: string;
14
+ channelsContractAddress?: string;
15
+ usdcContractAddress?: string;
16
+ identityRegistryAddress?: string;
17
+ stakingContractAddress?: string;
18
+ emissionsContractAddress?: string;
19
+ legacyEmissionsContractAddress?: string;
20
+ legacyStakingContractAddress?: string;
21
+ legacyEmissionsV1ContractAddress?: string;
22
+ antsTokenAddress?: string;
23
+ emissionsGateAddress?: string;
24
+ sellerPoolsAddress?: string;
25
+ sellerRegistryAddress?: string;
26
+ positionInitAddress?: string;
27
+ usageAccountingAddress?: string;
28
+ usageRewardsAddress?: string;
29
+ sellerPoolsRewardsAddress?: string;
30
+ legacyEmissionsEscrowAddress?: string;
31
+ washTradingRegistryAddress?: string;
32
+ pointsPolicyRegistryAddress?: string;
33
+ recognizedUsage?: {
34
+ status: 'deployed' | 'active';
35
+ effectiveEpoch: number;
36
+ deploymentBlock?: number;
37
+ };
38
+ /** Explorer REST base (Antscan) for seller profiles; optional. */
39
+ explorerApiUrl?: string;
40
+ }
41
+ export interface ResolvedStack {
42
+ phase: ProtocolPhase;
43
+ currentEpoch: number;
44
+ /** First recognized-usage epoch; null when the new stack is not deployed. */
45
+ effectiveEpoch: number | null;
46
+ genesis: number;
47
+ epochDuration: number;
48
+ registryPointers: {
49
+ emissions: string;
50
+ staking: string;
51
+ };
52
+ /** Legacy V2 emissions (claims for pre-cutover epochs). */
53
+ legacyEmissions: string | null;
54
+ legacyStaking: string | null;
55
+ legacyEmissionsV1: string | null;
56
+ /** Legacy locked seller rewards pool discovered from V2. */
57
+ lockedRewardsPool: string | null;
58
+ resolvedAt: number;
59
+ }
60
+ export interface AntsContextOptions {
61
+ chain: AntsChainConfig;
62
+ address: string;
63
+ signer?: AbstractSigner;
64
+ /** How long a resolved stack stays fresh (ms). */
65
+ stackTtlMs?: number;
66
+ /** Endpoint scorer used by `selectRpc` (lower is better, null = unusable); defaults to a short burst of `eth_call`s. */
67
+ probeRpc?: (url: string) => Promise<number | null>;
68
+ }
69
+ export declare class MissingContractError extends Error {
70
+ constructor(name: string, chainId: string);
71
+ }
72
+ /**
73
+ * One wallet's view of the ANTS contracts. Lazily builds SDK clients from the
74
+ * resolved chain configuration and caches the stack resolution so a burst of
75
+ * dashboard reads does not re-query the registry pointers each time.
76
+ */
77
+ export declare class AntsContext {
78
+ chain: AntsChainConfig;
79
+ readonly address: string;
80
+ readonly signer: AbstractSigner | undefined;
81
+ private readonly stackTtlMs;
82
+ private stackCache;
83
+ private readonly clients;
84
+ private readonly probeRpc;
85
+ private rpcSelection;
86
+ private sharedProvider;
87
+ private indexerClient;
88
+ private rpcOrder;
89
+ constructor(options: AntsContextOptions);
90
+ /**
91
+ * Rank the configured endpoints once by a short `eth_call` burst and route
92
+ * reads through one rotating provider in that order (see
93
+ * `RotatingJsonRpcProvider`). The public Base gateways differ a lot in how
94
+ * hard they throttle a burst (Tenderly rejects about a third, nodies none)
95
+ * and any of them can stall, so the order is a hint and the provider still
96
+ * moves off an endpoint that throttles at run time.
97
+ */
98
+ selectRpc(): Promise<void>;
99
+ /** Explorer-backed indexer for lists and history; null when `explorerApiUrl` is empty. */
100
+ indexer(): Indexer | null;
101
+ requireSigner(): AbstractSigner;
102
+ private base;
103
+ private cached;
104
+ /**
105
+ * One rotating provider shared by every client, in the order `selectRpc`
106
+ * chose (configured order before that), replacing the ethers failover
107
+ * provider each client would otherwise build.
108
+ */
109
+ provider(): RotatingJsonRpcProvider;
110
+ private optional;
111
+ private required;
112
+ registry(): RegistryClient;
113
+ antsToken(): ANTSTokenClient;
114
+ identity(): IdentityClient | null;
115
+ deposits(): DepositsClient | null;
116
+ gate(): EmissionsGateClient | null;
117
+ pools(): SellerPoolsClient | null;
118
+ requirePools(): SellerPoolsClient;
119
+ poolRewards(): SellerPoolsRewardsClient | null;
120
+ requirePoolRewards(): SellerPoolsRewardsClient;
121
+ sellerRegistry(): SellerRegistryClient | null;
122
+ usageAccounting(): UsageAccountingClient | null;
123
+ usageRewards(): UsageRewardsClient | null;
124
+ positionInit(): PositionInitClient | null;
125
+ washRegistry(): WashTradingRegistryClient | null;
126
+ pointsPolicyRegistry(): PointsPolicyRegistryClient | null;
127
+ legacyEmissionsAt(address: string | null): EmissionsClient | null;
128
+ legacyStakingAt(address: string | null): StakingClient | null;
129
+ lockedPoolAt(address: string | null): SellerRewardsPoolClient | null;
130
+ /** Address book for display. */
131
+ addresses(): Record<string, string>;
132
+ invalidate(): void;
133
+ /** Determine which protocol phase the chain is in and where legacy claims live. */
134
+ stack(): Promise<ResolvedStack>;
135
+ /** Epoch ranges that can be claimed: legacy epochs end at the effective epoch; recognized epochs start there. */
136
+ claimableEpochs(): Promise<{
137
+ legacy: number[];
138
+ recognized: number[];
139
+ }>;
140
+ }
141
+ /**
142
+ * Score `url` with a burst of parallel `eth_call`s: null when
143
+ * none answer, otherwise the failure count weighted heavily plus the median
144
+ * latency in seconds, so a throttling gateway ranks below a slower clean one.
145
+ */
146
+ export declare function probeRpcEndpoint(url: string): Promise<number | null>;
@@ -0,0 +1,321 @@
1
+ import { FetchRequest, JsonRpcProvider, ZeroAddress } from 'ethers';
2
+ import { RotatingJsonRpcProvider } from './rpc-provider.js';
3
+ import { createIndexer } from './indexer.js';
4
+ import { ANTSTokenClient, DepositsClient, EmissionsClient, EmissionsGateClient, IdentityClient, PointsPolicyRegistryClient, PositionInitClient, RegistryClient, SellerPoolsClient, SellerPoolsRewardsClient, SellerRegistryClient, SellerRewardsPoolClient, StakingClient, UsageAccountingClient, UsageRewardsClient, WashTradingRegistryClient, resolveLegacyContractAddresses, } from '@antseed/node/payments';
5
+ function sameAddress(a, b) {
6
+ return !!a && !!b && a.toLowerCase() === b.toLowerCase();
7
+ }
8
+ export class MissingContractError extends Error {
9
+ constructor(name, chainId) {
10
+ super(`${name} address is not configured for chain '${chainId}'. Set payments.crypto.${name}Address or upgrade @antseed/cli.`);
11
+ this.name = 'MissingContractError';
12
+ }
13
+ }
14
+ /**
15
+ * One wallet's view of the ANTS contracts. Lazily builds SDK clients from the
16
+ * resolved chain configuration and caches the stack resolution so a burst of
17
+ * dashboard reads does not re-query the registry pointers each time.
18
+ */
19
+ export class AntsContext {
20
+ chain;
21
+ address;
22
+ signer;
23
+ stackTtlMs;
24
+ stackCache = null;
25
+ clients = new Map();
26
+ probeRpc;
27
+ rpcSelection = null;
28
+ sharedProvider = null;
29
+ indexerClient;
30
+ rpcOrder = null;
31
+ constructor(options) {
32
+ this.chain = options.chain;
33
+ this.address = options.address;
34
+ this.signer = options.signer;
35
+ this.stackTtlMs = options.stackTtlMs ?? 15_000;
36
+ this.probeRpc = options.probeRpc ?? probeRpcEndpoint;
37
+ }
38
+ /**
39
+ * Rank the configured endpoints once by a short `eth_call` burst and route
40
+ * reads through one rotating provider in that order (see
41
+ * `RotatingJsonRpcProvider`). The public Base gateways differ a lot in how
42
+ * hard they throttle a burst (Tenderly rejects about a third, nodies none)
43
+ * and any of them can stall, so the order is a hint and the provider still
44
+ * moves off an endpoint that throttles at run time.
45
+ */
46
+ selectRpc() {
47
+ if (!this.rpcSelection) {
48
+ this.rpcSelection = (async () => {
49
+ const fallbacks = this.chain.fallbackRpcUrls ?? [];
50
+ if (fallbacks.length === 0)
51
+ return;
52
+ const candidates = [this.chain.rpcUrl, ...fallbacks];
53
+ const scores = await Promise.all(candidates.map(async (url, index) => ({ url, index, score: await this.probeRpc(url).catch(() => null) })));
54
+ const usable = scores
55
+ .filter((entry) => entry.score !== null)
56
+ .sort((a, b) => a.score - b.score || a.index - b.index);
57
+ if (usable.length === 0)
58
+ return;
59
+ const unusable = scores.filter((entry) => entry.score === null);
60
+ const ordered = [...usable, ...unusable].map((entry) => entry.url);
61
+ this.rpcOrder = ordered;
62
+ this.chain = { ...this.chain, rpcUrl: ordered[0], fallbackRpcUrls: ordered.slice(1) };
63
+ this.clients.clear();
64
+ this.sharedProvider = null;
65
+ })();
66
+ }
67
+ return this.rpcSelection;
68
+ }
69
+ /** Explorer-backed indexer for lists and history; null when `explorerApiUrl` is empty. */
70
+ indexer() {
71
+ if (this.indexerClient === undefined)
72
+ this.indexerClient = createIndexer(this.chain.explorerApiUrl);
73
+ return this.indexerClient;
74
+ }
75
+ requireSigner() {
76
+ if (!this.signer)
77
+ throw new Error('This action needs the node wallet; no signer is available in read-only mode.');
78
+ return this.signer;
79
+ }
80
+ base(contractAddress) {
81
+ return {
82
+ rpcUrl: this.chain.rpcUrl,
83
+ ...(this.chain.fallbackRpcUrls && this.chain.fallbackRpcUrls.length > 0 ? { fallbackRpcUrls: this.chain.fallbackRpcUrls } : {}),
84
+ contractAddress,
85
+ evmChainId: this.chain.evmChainId,
86
+ };
87
+ }
88
+ cached(key, build) {
89
+ let client = this.clients.get(key);
90
+ if (!client) {
91
+ client = build();
92
+ const shared = this.provider();
93
+ if (typeof client.withProvider === 'function') {
94
+ client.withProvider(shared);
95
+ }
96
+ this.clients.set(key, client);
97
+ }
98
+ return client;
99
+ }
100
+ /**
101
+ * One rotating provider shared by every client, in the order `selectRpc`
102
+ * chose (configured order before that), replacing the ethers failover
103
+ * provider each client would otherwise build.
104
+ */
105
+ provider() {
106
+ if (!this.sharedProvider) {
107
+ this.sharedProvider = new RotatingJsonRpcProvider(this.rpcOrder ?? [this.chain.rpcUrl, ...(this.chain.fallbackRpcUrls ?? [])], this.chain.evmChainId);
108
+ }
109
+ return this.sharedProvider;
110
+ }
111
+ optional(key, address, build) {
112
+ if (!address || sameAddress(address, ZeroAddress))
113
+ return null;
114
+ return this.cached(`${key}:${address.toLowerCase()}`, () => build(address));
115
+ }
116
+ required(name, key, address, build) {
117
+ const client = this.optional(key, address, build);
118
+ if (!client)
119
+ throw new MissingContractError(name, this.chain.chainId);
120
+ return client;
121
+ }
122
+ registry() {
123
+ return this.required('registryContract', 'registry', this.chain.registryContractAddress, (address) => new RegistryClient(this.base(address)));
124
+ }
125
+ antsToken() {
126
+ return this.required('antsToken', 'ants', this.chain.antsTokenAddress, (address) => new ANTSTokenClient(this.base(address)));
127
+ }
128
+ identity() {
129
+ return this.optional('identity', this.chain.identityRegistryAddress, (address) => new IdentityClient(this.base(address)));
130
+ }
131
+ deposits() {
132
+ return this.optional('deposits', this.chain.depositsContractAddress, (address) => new DepositsClient({
133
+ ...this.base(address), usdcAddress: this.chain.usdcContractAddress ?? ZeroAddress,
134
+ }));
135
+ }
136
+ gate() {
137
+ return this.optional('gate', this.chain.emissionsGateAddress, (address) => new EmissionsGateClient(this.base(address)));
138
+ }
139
+ pools() {
140
+ return this.optional('pools', this.chain.sellerPoolsAddress, (address) => new SellerPoolsClient({
141
+ ...this.base(address), antsTokenAddress: this.chain.antsTokenAddress ?? ZeroAddress,
142
+ }));
143
+ }
144
+ requirePools() {
145
+ const pools = this.pools();
146
+ if (!pools)
147
+ throw new MissingContractError('sellerPools', this.chain.chainId);
148
+ return pools;
149
+ }
150
+ poolRewards() {
151
+ return this.optional('poolRewards', this.chain.sellerPoolsRewardsAddress, (address) => new SellerPoolsRewardsClient(this.base(address)));
152
+ }
153
+ requirePoolRewards() {
154
+ const rewards = this.poolRewards();
155
+ if (!rewards)
156
+ throw new MissingContractError('sellerPoolsRewards', this.chain.chainId);
157
+ return rewards;
158
+ }
159
+ sellerRegistry() {
160
+ return this.optional('sellerRegistry', this.chain.sellerRegistryAddress, (address) => new SellerRegistryClient(this.base(address)));
161
+ }
162
+ usageAccounting() {
163
+ return this.optional('usageAccounting', this.chain.usageAccountingAddress, (address) => new UsageAccountingClient(this.base(address)));
164
+ }
165
+ usageRewards() {
166
+ return this.optional('usageRewards', this.chain.usageRewardsAddress, (address) => new UsageRewardsClient(this.base(address)));
167
+ }
168
+ positionInit() {
169
+ return this.optional('positionInit', this.chain.positionInitAddress, (address) => new PositionInitClient(this.base(address)));
170
+ }
171
+ washRegistry() {
172
+ return this.optional('wash', this.chain.washTradingRegistryAddress, (address) => new WashTradingRegistryClient(this.base(address)));
173
+ }
174
+ pointsPolicyRegistry() {
175
+ return this.optional('policies', this.chain.pointsPolicyRegistryAddress, (address) => new PointsPolicyRegistryClient(this.base(address)));
176
+ }
177
+ legacyEmissionsAt(address) {
178
+ return this.optional('legacyEmissions', address ?? undefined, (target) => new EmissionsClient(this.base(target)));
179
+ }
180
+ legacyStakingAt(address) {
181
+ return this.optional('legacyStaking', address ?? undefined, (target) => new StakingClient({
182
+ ...this.base(target), usdcAddress: this.chain.usdcContractAddress ?? ZeroAddress,
183
+ }));
184
+ }
185
+ lockedPoolAt(address) {
186
+ return this.optional('lockedPool', address ?? undefined, (target) => new SellerRewardsPoolClient(this.base(target)));
187
+ }
188
+ /** Address book for display. */
189
+ addresses() {
190
+ const entries = [
191
+ ['registry', this.chain.registryContractAddress],
192
+ ['antsToken', this.chain.antsTokenAddress],
193
+ ['emissionsGate', this.chain.emissionsGateAddress],
194
+ ['sellerPools', this.chain.sellerPoolsAddress],
195
+ ['sellerPoolsRewards', this.chain.sellerPoolsRewardsAddress],
196
+ ['sellerRegistry', this.chain.sellerRegistryAddress],
197
+ ['usageAccounting', this.chain.usageAccountingAddress],
198
+ ['usageRewards', this.chain.usageRewardsAddress],
199
+ ['positionInit', this.chain.positionInitAddress],
200
+ ['pointsPolicyRegistry', this.chain.pointsPolicyRegistryAddress],
201
+ ['washTradingRegistry', this.chain.washTradingRegistryAddress],
202
+ ['legacyEmissionsEscrow', this.chain.legacyEmissionsEscrowAddress],
203
+ ['emissions', this.chain.emissionsContractAddress],
204
+ ['staking', this.chain.stakingContractAddress],
205
+ ['legacyEmissions', this.chain.legacyEmissionsContractAddress],
206
+ ['legacyStaking', this.chain.legacyStakingContractAddress],
207
+ ['legacyEmissionsV1', this.chain.legacyEmissionsV1ContractAddress],
208
+ ['deposits', this.chain.depositsContractAddress],
209
+ ['channels', this.chain.channelsContractAddress],
210
+ ['identityRegistry', this.chain.identityRegistryAddress],
211
+ ['usdc', this.chain.usdcContractAddress],
212
+ ];
213
+ return Object.fromEntries(entries.filter((entry) => !!entry[1]));
214
+ }
215
+ invalidate() { this.stackCache = null; }
216
+ /** Determine which protocol phase the chain is in and where legacy claims live. */
217
+ async stack() {
218
+ if (this.stackCache && Date.now() - this.stackCache.resolvedAt < this.stackTtlMs)
219
+ return this.stackCache;
220
+ await this.selectRpc();
221
+ const registry = this.registry();
222
+ const [emissions, staking] = await Promise.all([registry.emissions(), registry.staking()]);
223
+ const registryPointers = { emissions, staking };
224
+ const deployed = !!this.chain.usageAccountingAddress && !!this.chain.sellerRegistryAddress;
225
+ const active = deployed && sameAddress(emissions, this.chain.usageAccountingAddress) && sameAddress(staking, this.chain.sellerRegistryAddress);
226
+ const phase = active ? 'active' : deployed ? 'deployed' : 'legacy';
227
+ let legacyEmissions;
228
+ let legacyStaking;
229
+ let legacyEmissionsV1;
230
+ if (phase === 'active') {
231
+ const legacy = resolveLegacyContractAddresses(this.chain);
232
+ legacyEmissions = legacy.legacyEmissionsContractAddress ?? null;
233
+ legacyStaking = legacy.legacyStakingContractAddress ?? null;
234
+ legacyEmissionsV1 = legacy.legacyEmissionsV1ContractAddress ?? null;
235
+ }
236
+ else {
237
+ legacyEmissions = this.chain.emissionsContractAddress ?? emissions;
238
+ legacyStaking = this.chain.stakingContractAddress ?? staking;
239
+ legacyEmissionsV1 = this.chain.legacyEmissionsContractAddress ?? null;
240
+ }
241
+ const gate = this.gate();
242
+ let currentEpoch;
243
+ let effectiveEpoch = null;
244
+ let genesis;
245
+ let epochDuration;
246
+ if (gate) {
247
+ [currentEpoch, effectiveEpoch, genesis, epochDuration] = await Promise.all([gate.currentEpoch(), gate.effectiveEpoch(), gate.genesis(), gate.epochDuration()]);
248
+ }
249
+ else {
250
+ const legacy = this.legacyEmissionsAt(legacyEmissions);
251
+ if (!legacy)
252
+ throw new MissingContractError('emissionsContract', this.chain.chainId);
253
+ const [info, legacyGenesis] = await Promise.all([legacy.getEpochInfo(), legacy.getGenesis()]);
254
+ currentEpoch = info.epoch;
255
+ epochDuration = info.epochDuration;
256
+ genesis = legacyGenesis;
257
+ }
258
+ let lockedRewardsPool = null;
259
+ const legacy = this.legacyEmissionsAt(legacyEmissions);
260
+ if (legacy) {
261
+ try {
262
+ const pool = await legacy.sellerRewardsPool();
263
+ lockedRewardsPool = sameAddress(pool, ZeroAddress) ? null : pool;
264
+ }
265
+ catch {
266
+ lockedRewardsPool = null;
267
+ }
268
+ }
269
+ this.stackCache = {
270
+ phase, currentEpoch, effectiveEpoch, genesis, epochDuration, registryPointers,
271
+ legacyEmissions, legacyStaking, legacyEmissionsV1, lockedRewardsPool, resolvedAt: Date.now(),
272
+ };
273
+ return this.stackCache;
274
+ }
275
+ /** Epoch ranges that can be claimed: legacy epochs end at the effective epoch; recognized epochs start there. */
276
+ async claimableEpochs() {
277
+ const stack = await this.stack();
278
+ const boundary = stack.phase === 'active' && stack.effectiveEpoch !== null ? Math.min(stack.currentEpoch, stack.effectiveEpoch) : stack.currentEpoch;
279
+ const legacy = Array.from({ length: Math.max(0, boundary) }, (_, epoch) => epoch);
280
+ const recognized = stack.phase === 'active' && stack.effectiveEpoch !== null
281
+ ? Array.from({ length: Math.max(0, stack.currentEpoch - stack.effectiveEpoch) }, (_, index) => stack.effectiveEpoch + index)
282
+ : [];
283
+ return { legacy, recognized };
284
+ }
285
+ }
286
+ const RPC_PROBE_TIMEOUT_MS = 4_000;
287
+ const RPC_PROBE_CALLS = 8;
288
+ /** Multicall3 `getBlockNumber()`: a cheap `eth_call`, which is what gateways actually meter (Tenderly lets `eth_blockNumber` through and throttles `eth_call`). */
289
+ const RPC_PROBE_CALL = { to: '0xcA11bde05977b3631167028862bE2a173976CA11', data: '0x42cbb15c' };
290
+ /**
291
+ * Score `url` with a burst of parallel `eth_call`s: null when
292
+ * none answer, otherwise the failure count weighted heavily plus the median
293
+ * latency in seconds, so a throttling gateway ranks below a slower clean one.
294
+ */
295
+ export async function probeRpcEndpoint(url) {
296
+ const request = new FetchRequest(url);
297
+ request.timeout = RPC_PROBE_TIMEOUT_MS;
298
+ request.setThrottleParams({ maxAttempts: 1 });
299
+ const provider = new JsonRpcProvider(request, undefined, { staticNetwork: true, batchMaxCount: 1 });
300
+ try {
301
+ const latencies = await Promise.all(Array.from({ length: RPC_PROBE_CALLS }, async () => {
302
+ const started = Date.now();
303
+ try {
304
+ await provider.send('eth_call', [RPC_PROBE_CALL, 'latest']);
305
+ return Date.now() - started;
306
+ }
307
+ catch {
308
+ return null;
309
+ }
310
+ }));
311
+ const answered = latencies.filter((value) => value !== null).sort((a, b) => a - b);
312
+ if (answered.length === 0)
313
+ return null;
314
+ const failures = RPC_PROBE_CALLS - answered.length;
315
+ return failures * 10 + answered[Math.floor(answered.length / 2)] / 1000;
316
+ }
317
+ finally {
318
+ provider.destroy();
319
+ }
320
+ }
321
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/service/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { AntsContext } from './context.js';
2
+ import type { EmissionsView } from '../api-types.js';
3
+ export declare function emissions(ctx: AntsContext): Promise<EmissionsView>;