@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,98 @@
1
+ import { toJson } from './json.js';
2
+ async function safe(read, fallback) {
3
+ try {
4
+ return await read();
5
+ }
6
+ catch {
7
+ return fallback;
8
+ }
9
+ }
10
+ export function epochInfo(stack, now = Math.floor(Date.now() / 1000)) {
11
+ const nextBoundaryAt = stack.genesis + (stack.currentEpoch + 1) * stack.epochDuration;
12
+ return {
13
+ current: stack.currentEpoch,
14
+ effective: stack.effectiveEpoch,
15
+ genesis: stack.genesis,
16
+ epochDuration: stack.epochDuration,
17
+ nextBoundaryAt,
18
+ secondsToBoundary: Math.max(0, nextBoundaryAt - now),
19
+ };
20
+ }
21
+ export async function overview(ctx) {
22
+ const stack = await ctx.stack();
23
+ const token = ctx.antsToken();
24
+ const pools = ctx.pools();
25
+ const sellerRegistry = ctx.sellerRegistry();
26
+ const legacyStaking = ctx.legacyStakingAt(stack.legacyStaking);
27
+ const [ants, eth, transfersEnabled, whitelisted, totalActiveStake, positionCount, registryAgentId, legacyAgentId, totalSupply, maxSupply] = await Promise.all([
28
+ token.balanceOf(ctx.address),
29
+ token.provider.getBalance(ctx.address),
30
+ safe(() => token.transfersEnabled(), false),
31
+ safe(() => token.transferWhitelist(ctx.address), false),
32
+ pools ? safe(() => pools.stakerTotalActiveStake(ctx.address), 0n) : Promise.resolve(0n),
33
+ pools ? safe(() => pools.stakerPositionCount(ctx.address), 0) : Promise.resolve(0),
34
+ sellerRegistry ? safe(() => sellerRegistry.getAgentId(ctx.address), 0) : Promise.resolve(0),
35
+ legacyStaking ? safe(() => legacyStaking.getAgentId(ctx.address), 0) : Promise.resolve(0),
36
+ safe(() => token.totalSupply(), 0n),
37
+ safe(() => token.maxSupply(), 0n),
38
+ ]);
39
+ let network = null;
40
+ if (pools) {
41
+ const gate = ctx.gate();
42
+ const poolRewards = ctx.poolRewards();
43
+ const usageRewards = ctx.usageRewards();
44
+ const epoch = stack.currentEpoch;
45
+ const [networkStake, networkWeight, epochEmission, stakerBudget, usageBudgets] = await Promise.all([
46
+ safe(() => pools.totalActiveStakeAtEpoch(epoch), 0n),
47
+ safe(() => pools.totalPowerWeightAtEpoch(epoch), 0n),
48
+ gate ? safe(() => gate.getEpochEmission(epoch), 0n) : Promise.resolve(0n),
49
+ poolRewards ? safe(() => poolRewards.stakerEpochBudget(epoch), 0n) : Promise.resolve(0n),
50
+ usageRewards ? safe(() => usageRewards.usageEpochBudgets(epoch), { buyer: 0n, seller: 0n }) : Promise.resolve({ buyer: 0n, seller: 0n }),
51
+ ]);
52
+ network = {
53
+ totalActiveStake: networkStake.toString(),
54
+ totalPowerWeight: networkWeight.toString(),
55
+ epochEmission: epochEmission.toString(),
56
+ stakerBudget: stakerBudget.toString(),
57
+ usageBuyerBudget: usageBudgets.buyer.toString(),
58
+ usageSellerBudget: usageBudgets.seller.toString(),
59
+ antsTotalSupply: totalSupply.toString(),
60
+ antsMaxSupply: maxSupply.toString(),
61
+ };
62
+ }
63
+ const notices = [];
64
+ const epoch = epochInfo(stack);
65
+ if (stack.phase === 'legacy') {
66
+ notices.push('The recognized-usage contracts are not configured for this chain. Only legacy emissions are available.');
67
+ }
68
+ else if (stack.phase === 'deployed') {
69
+ const startsAt = stack.effectiveEpoch !== null ? new Date((stack.genesis + stack.effectiveEpoch * stack.epochDuration) * 1000).toUTCString() : 'the cutover';
70
+ notices.push(`Recognized usage is deployed but not active yet: the registry still points at the legacy stack. Rewards from epoch ${stack.effectiveEpoch ?? '?'} start at ${startsAt}. Positions staked now have power from the first rewarded epoch.`);
71
+ }
72
+ if (!transfersEnabled && !whitelisted) {
73
+ notices.push('ANTS transfers are not enabled and this wallet is not whitelisted, so staking new ANTS is not possible yet. Rewards can still be claimed and restaked.');
74
+ }
75
+ return toJson({
76
+ phase: stack.phase,
77
+ chainId: ctx.chain.chainId,
78
+ evmChainId: ctx.chain.evmChainId,
79
+ rpcUrl: ctx.chain.rpcUrl,
80
+ addresses: ctx.addresses(),
81
+ epoch,
82
+ wallet: {
83
+ address: ctx.address,
84
+ ants: ants.toString(),
85
+ eth: eth.toString(),
86
+ transfersEnabled,
87
+ whitelisted,
88
+ canTransfer: transfersEnabled || whitelisted,
89
+ totalActiveStake: totalActiveStake.toString(),
90
+ positionCount,
91
+ agentId: registryAgentId || legacyAgentId,
92
+ sellerBound: registryAgentId !== 0,
93
+ },
94
+ network,
95
+ notices,
96
+ });
97
+ }
98
+ //# sourceMappingURL=overview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overview.js","sourceRoot":"","sources":["../../src/service/overview.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC,KAAK,UAAU,IAAI,CAAI,IAAsB,EAAE,QAAW;IACxD,IAAI,CAAC;QACH,OAAO,MAAM,IAAI,EAAE,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAsG,EAAE,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;IACnK,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,GAAG,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC;IACtF,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,YAAY;QAC3B,SAAS,EAAE,KAAK,CAAC,cAAc;QAC/B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,cAAc;QACd,iBAAiB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,GAAG,GAAG,CAAC;KACrD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAgB;IAC7C,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC;IAC1B,MAAM,cAAc,GAAG,GAAG,CAAC,cAAc,EAAE,CAAC;IAC5C,MAAM,aAAa,GAAG,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAE/D,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,gBAAgB,EAAE,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC5J,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC;QAC5B,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC;QACtC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,gBAAgB,EAAE,EAAE,KAAK,CAAC;QAC3C,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC;QACvD,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,sBAAsB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACvF,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QAClF,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3F,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QACzF,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC;QACnC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,EAAE,CAAC;KAClC,CAAC,CAAC;IAEH,IAAI,OAAO,GAA4B,IAAI,CAAC;IAC5C,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACxB,MAAM,WAAW,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,YAAY,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC;QACjC,MAAM,CAAC,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACjG,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,uBAAuB,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;YACpD,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,uBAAuB,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;YACpD,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACzE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACxF,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;SACzI,CAAC,CAAC;QACH,OAAO,GAAG;YACR,gBAAgB,EAAE,YAAY,CAAC,QAAQ,EAAE;YACzC,gBAAgB,EAAE,aAAa,CAAC,QAAQ,EAAE;YAC1C,aAAa,EAAE,aAAa,CAAC,QAAQ,EAAE;YACvC,YAAY,EAAE,YAAY,CAAC,QAAQ,EAAE;YACrC,gBAAgB,EAAE,YAAY,CAAC,KAAK,CAAC,QAAQ,EAAE;YAC/C,iBAAiB,EAAE,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE;YACjD,eAAe,EAAE,WAAW,CAAC,QAAQ,EAAE;YACvC,aAAa,EAAE,SAAS,CAAC,QAAQ,EAAE;SACpC,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,wGAAwG,CAAC,CAAC;IACzH,CAAC;SAAM,IAAI,KAAK,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,cAAc,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;QAC7J,OAAO,CAAC,IAAI,CAAC,sHAAsH,KAAK,CAAC,cAAc,IAAI,GAAG,aAAa,QAAQ,kEAAkE,CAAC,CAAC;IACzP,CAAC;IACD,IAAI,CAAC,gBAAgB,IAAI,CAAC,WAAW,EAAE,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,wJAAwJ,CAAC,CAAC;IACzK,CAAC;IAED,OAAO,MAAM,CAAC;QACZ,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO;QAC1B,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,UAAU;QAChC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM;QACxB,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE;QAC1B,KAAK;QACL,MAAM,EAAE;YACN,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE;YACrB,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE;YACnB,gBAAgB;YAChB,WAAW;YACX,WAAW,EAAE,gBAAgB,IAAI,WAAW;YAC5C,gBAAgB,EAAE,gBAAgB,CAAC,QAAQ,EAAE;YAC7C,aAAa;YACb,OAAO,EAAE,eAAe,IAAI,aAAa;YACzC,WAAW,EAAE,eAAe,KAAK,CAAC;SACnC;QACD,OAAO;QACP,OAAO;KACR,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { PoolView } from '../api-types.js';
2
+ import type { ExplorerSellers } from './explorer.js';
3
+ import type { IndexedPools, IndexedSellerEpoch } from './indexer.js';
4
+ export interface MergeInput {
5
+ indexed: IndexedPools;
6
+ explorer: ExplorerSellers;
7
+ /** Settled volume per seller (lowercase) per epoch, newest first. */
8
+ sellerEpochs: Map<string, IndexedSellerEpoch[]>;
9
+ /** Epochs to show volume for, current first. */
10
+ epochs: number[];
11
+ /** Your open positions per agent and their live power this epoch. */
12
+ own: Map<number, {
13
+ positionIds: number[];
14
+ power: bigint;
15
+ stake: bigint;
16
+ }>;
17
+ }
18
+ /**
19
+ * Build the dashboard's pool rows from indexer data: every indexed pool, plus
20
+ * explorer sellers without a pool (so their volume is visible before anyone
21
+ * stakes), plus pools this wallet stakes in even if the indexer lags. No
22
+ * chain reads happen here; the caller supplies this wallet's live power.
23
+ */
24
+ export declare function mergePools(input: MergeInput): PoolView[];
25
+ /** Stakeable pools first, then by power, then by recent volume, then by agent id. */
26
+ export declare function sortPools(views: PoolView[]): PoolView[];
@@ -0,0 +1,101 @@
1
+ function bps(part, whole) {
2
+ return whole === 0n ? 0 : Number(part * 10000n / whole);
3
+ }
4
+ /** The pool summary carries volume for the current (index 0) and previous (index 1) epoch only. */
5
+ function poolVolumeAt(pool, index) {
6
+ if (!pool)
7
+ return null;
8
+ if (index === 0)
9
+ return pool.volumeUsdc;
10
+ if (index === 1)
11
+ return pool.lastVolumeUsdc;
12
+ return null;
13
+ }
14
+ function volumesFor(seller, epochs, sellerEpochs, pool) {
15
+ const rows = seller ? sellerEpochs.get(seller.toLowerCase()) ?? [] : [];
16
+ return epochs.map((epoch, index) => {
17
+ const sellerVolume = rows.find((entry) => entry.epoch === epoch)?.volumeUsdc;
18
+ if (sellerVolume)
19
+ return { epoch, usdc: sellerVolume };
20
+ const poolVolume = poolVolumeAt(pool, index);
21
+ return { epoch, usdc: poolVolume && poolVolume !== '0' ? poolVolume : '0' };
22
+ });
23
+ }
24
+ /**
25
+ * Build the dashboard's pool rows from indexer data: every indexed pool, plus
26
+ * explorer sellers without a pool (so their volume is visible before anyone
27
+ * stakes), plus pools this wallet stakes in even if the indexer lags. No
28
+ * chain reads happen here; the caller supplies this wallet's live power.
29
+ */
30
+ export function mergePools(input) {
31
+ const { indexed, explorer, sellerEpochs, epochs, own } = input;
32
+ const totalPower = BigInt(indexed.network.current?.totalPowerWeight ?? '0');
33
+ const rows = new Map();
34
+ const profileFor = (seller) => (seller ? explorer.byAddress.get(seller.toLowerCase()) ?? null : null);
35
+ for (const pool of indexed.pools) {
36
+ const seller = pool.seller ?? explorer.byAgent.get(pool.agentId) ?? null;
37
+ const mine = own.get(pool.agentId);
38
+ const weight = BigInt(pool.weight);
39
+ rows.set(pool.agentId, {
40
+ agentId: pool.agentId,
41
+ seller,
42
+ profile: profileFor(seller),
43
+ hasPool: weight !== 0n || pool.openPositions > 0,
44
+ stakeable: pool.registered,
45
+ activeStake: pool.activeStake,
46
+ weight: pool.weight,
47
+ powerShareBps: pool.powerShareBps || bps(weight, totalPower),
48
+ securityShareBps: Number(pool.securityShareBps),
49
+ volumes: volumesFor(seller, epochs, sellerEpochs, pool),
50
+ usagePoints: pool.usagePoints,
51
+ weightedUsagePoints: pool.weightedUsagePoints,
52
+ lastEpochUsagePoints: pool.lastUsagePoints,
53
+ lastEpochEmission: pool.lastEmission !== '0' ? pool.lastEmission : null,
54
+ lastEpochEmissionSettled: pool.lastEmissionSettled,
55
+ lastEpochRewardPer1kPower: pool.lastRewardPer1kPower,
56
+ projectedRewardPer1kPower: pool.projectedRewardPer1kPower,
57
+ yourStake: (mine?.stake ?? 0n).toString(),
58
+ yourPower: (mine?.power ?? 0n).toString(),
59
+ yourPoolShareBps: bps(mine?.power ?? 0n, weight),
60
+ yourPositionIds: mine?.positionIds ?? [],
61
+ });
62
+ }
63
+ const candidates = new Set([...explorer.byAgent.keys(), ...own.keys()]);
64
+ for (const agentId of candidates) {
65
+ if (rows.has(agentId))
66
+ continue;
67
+ const seller = explorer.byAgent.get(agentId) ?? null;
68
+ const mine = own.get(agentId);
69
+ rows.set(agentId, {
70
+ agentId,
71
+ seller,
72
+ profile: profileFor(seller),
73
+ hasPool: false,
74
+ stakeable: false,
75
+ activeStake: (mine?.stake ?? 0n).toString(),
76
+ weight: '0',
77
+ powerShareBps: 0,
78
+ securityShareBps: 0,
79
+ volumes: volumesFor(seller, epochs, sellerEpochs),
80
+ usagePoints: '0',
81
+ weightedUsagePoints: '0',
82
+ lastEpochUsagePoints: '0',
83
+ lastEpochEmission: null,
84
+ lastEpochEmissionSettled: false,
85
+ lastEpochRewardPer1kPower: null,
86
+ projectedRewardPer1kPower: null,
87
+ yourStake: (mine?.stake ?? 0n).toString(),
88
+ yourPower: (mine?.power ?? 0n).toString(),
89
+ yourPoolShareBps: 0,
90
+ yourPositionIds: mine?.positionIds ?? [],
91
+ });
92
+ }
93
+ return sortPools([...rows.values()]);
94
+ }
95
+ /** Stakeable pools first, then by power, then by recent volume, then by agent id. */
96
+ export function sortPools(views) {
97
+ const volume = (pool) => BigInt(pool.volumes[1]?.usdc ?? '0') + BigInt(pool.volumes[0]?.usdc ?? '0');
98
+ const compare = (a, b) => (a > b ? -1 : a < b ? 1 : 0);
99
+ return views.sort((a, b) => Number(b.stakeable) - Number(a.stakeable) || compare(BigInt(a.weight), BigInt(b.weight)) || compare(volume(a), volume(b)) || a.agentId - b.agentId);
100
+ }
101
+ //# sourceMappingURL=pool-merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool-merge.js","sourceRoot":"","sources":["../../src/service/pool-merge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { AntsContext } from './context.js';
2
+ import type { PoolsView, PoolView } from '../api-types.js';
3
+ /**
4
+ * Pool comparison. Statistics for every pool come from the indexer; the
5
+ * chain is read only for this wallet's own positions. Without an indexer
6
+ * (or while it is down) only the pools this wallet stakes in are listed,
7
+ * described live, and `source` says so.
8
+ */
9
+ export declare function poolsView(ctx: AntsContext): Promise<PoolsView>;
10
+ export declare function singlePool(ctx: AntsContext, agentId: number): Promise<PoolView & {
11
+ currentEpoch: number;
12
+ }>;
@@ -0,0 +1,287 @@
1
+ import { Interface, ZeroAddress } from 'ethers';
2
+ import { multicallRead } from '@antseed/node/payments';
3
+ import { toJson } from './json.js';
4
+ import { explorerSellers } from './explorer.js';
5
+ import { mergePools, sortPools } from './pool-merge.js';
6
+ import { IndexerError } from './indexer.js';
7
+ const VOLUME_EPOCHS = 3;
8
+ async function safe(read, fallback) {
9
+ try {
10
+ return await read();
11
+ }
12
+ catch {
13
+ return fallback;
14
+ }
15
+ }
16
+ function bps(part, whole) {
17
+ return whole === 0n ? 0 : Number(part * 10000n / whole);
18
+ }
19
+ function per1k(reward, power) {
20
+ return power === 0n ? null : (reward * 1000n * 10n ** 18n / power).toString();
21
+ }
22
+ const POOLS_IFACE = new Interface([
23
+ 'function poolActiveStakeAtEpoch(uint256 agentId, uint256 epoch) view returns (uint256)',
24
+ 'function poolWeightAtEpoch(uint256 agentId, uint256 epoch) view returns (uint256)',
25
+ 'function currentPoolSecurityShareBps(uint256 agentId) returns (uint256)',
26
+ 'function stakerAgentActiveStake(address staker, uint256 agentId) view returns (uint256)',
27
+ 'function positionWeightAtEpoch(uint256 positionId, uint256 epoch) view returns (uint256)',
28
+ ]);
29
+ const REGISTRY_IFACE = new Interface(['function agentSeller(uint256 agentId) view returns (address)']);
30
+ const ACCOUNTING_IFACE = new Interface([
31
+ 'function agentEpochUsage(uint256 epoch, uint256 agentId) view returns (tuple(uint256 points, uint256 weightedPoints))',
32
+ 'function totalWeightedPoolPointsByEpoch(uint256 epoch) view returns (uint256)',
33
+ 'function sellerPointsByEpoch(uint256 epoch, address seller) view returns (uint256)',
34
+ 'function totalSellerPointsByEpoch(uint256 epoch) view returns (uint256)',
35
+ ]);
36
+ const REWARDS_IFACE = new Interface([
37
+ 'function poolEpochEmissions(uint256 epoch, uint256 agentId) view returns (bool, uint256)',
38
+ 'function stakerEpochBudget(uint256 epoch) view returns (uint256)',
39
+ ]);
40
+ const LEGACY_IFACE = new Interface([
41
+ 'function userSellerPoints(address account, uint256 epoch) view returns (uint256)',
42
+ 'function epochTotalSellerPoints(uint256 epoch) view returns (uint256)',
43
+ ]);
44
+ /** Collects multicall requests and hands back typed readers once the batch has run. */
45
+ class Batch {
46
+ requests = [];
47
+ results = [];
48
+ add(target, iface, method, args) {
49
+ if (!target || target === ZeroAddress)
50
+ return () => null;
51
+ const index = this.requests.length;
52
+ this.requests.push({ target, iface, method, args });
53
+ return () => this.results[index] ?? null;
54
+ }
55
+ async run(ctx) {
56
+ this.results = await multicallRead(ctx.requirePools().provider, this.requests);
57
+ }
58
+ }
59
+ const big = (read, index = 0) => {
60
+ const value = read()?.[index];
61
+ return typeof value === 'bigint' ? value : 0n;
62
+ };
63
+ function volumeCall(ctx, stack, batch, epoch, seller) {
64
+ const effective = stack.effectiveEpoch ?? Number.MAX_SAFE_INTEGER;
65
+ const recognized = stack.phase === 'active' && epoch >= effective;
66
+ if (recognized) {
67
+ return seller
68
+ ? batch.add(ctx.chain.usageAccountingAddress, ACCOUNTING_IFACE, 'sellerPointsByEpoch', [epoch, seller])
69
+ : batch.add(ctx.chain.usageAccountingAddress, ACCOUNTING_IFACE, 'totalSellerPointsByEpoch', [epoch]);
70
+ }
71
+ return seller
72
+ ? batch.add(stack.legacyEmissions, LEGACY_IFACE, 'userSellerPoints', [seller, epoch])
73
+ : batch.add(stack.legacyEmissions, LEGACY_IFACE, 'epochTotalSellerPoints', [epoch]);
74
+ }
75
+ async function poolContext(ctx) {
76
+ const stack = await ctx.stack();
77
+ const pools = ctx.requirePools();
78
+ const poolRewards = ctx.poolRewards();
79
+ const accounting = ctx.usageAccounting();
80
+ const epoch = stack.currentEpoch;
81
+ const epochs = Array.from({ length: VOLUME_EPOCHS }, (_, index) => epoch - index).filter((value) => value >= 0);
82
+ const [totalPowerWeight, stakerBudget, totalWeightedPoolPoints, lastStakerBudget, lastTotalWeightedPoolPoints, explorer, own] = await Promise.all([
83
+ safe(() => pools.totalPowerWeightAtEpoch(epoch), 0n),
84
+ poolRewards ? safe(() => poolRewards.stakerEpochBudget(epoch), 0n) : Promise.resolve(0n),
85
+ accounting ? safe(() => accounting.totalWeightedPoolPointsByEpoch(epoch), 0n) : Promise.resolve(0n),
86
+ poolRewards && epoch > 0 ? safe(() => poolRewards.stakerEpochBudget(epoch - 1), 0n) : Promise.resolve(0n),
87
+ accounting && epoch > 0 ? safe(() => accounting.totalWeightedPoolPointsByEpoch(epoch - 1), 0n) : Promise.resolve(0n),
88
+ explorerSellers(ctx.chain.explorerApiUrl),
89
+ pools.positionsBatch(await pools.allStakerPositionIds(ctx.address)),
90
+ ]);
91
+ const ownPositions = new Map();
92
+ for (const position of own) {
93
+ if (position.withdrawn || position.closedAtEpoch !== 0)
94
+ continue;
95
+ ownPositions.set(position.agentId, [...(ownPositions.get(position.agentId) ?? []), position.id]);
96
+ }
97
+ return { stack, epochs, totalPowerWeight, stakerBudget, totalWeightedPoolPoints, lastStakerBudget, lastTotalWeightedPoolPoints, explorer, ownPositions };
98
+ }
99
+ /**
100
+ * Describe many pools in two multicall rounds. Round one is cheap for every
101
+ * candidate (seller binding + current power); round two reads the full
102
+ * analytics only for agents with a pool, a binding, or your stake, and just
103
+ * the settled volume for the rest (explorer sellers without a pool yet).
104
+ */
105
+ async function describePools(ctx, agents, context) {
106
+ const poolsAddress = ctx.requirePools().contractAddress;
107
+ const epoch = context.stack.currentEpoch;
108
+ const first = new Batch();
109
+ const firstReads = agents.map(([agentId, bound]) => ({
110
+ seller: bound ? null : first.add(ctx.chain.sellerRegistryAddress, REGISTRY_IFACE, 'agentSeller', [agentId]),
111
+ weight: first.add(poolsAddress, POOLS_IFACE, 'poolWeightAtEpoch', [agentId, epoch]),
112
+ }));
113
+ await first.run(ctx);
114
+ const resolved = agents.map(([agentId, bound], index) => {
115
+ const read = firstReads[index];
116
+ const registrySeller = bound ?? (read.seller ? read.seller()?.[0] ?? ZeroAddress : ZeroAddress);
117
+ const stakeable = !!registrySeller && registrySeller !== ZeroAddress;
118
+ const seller = stakeable ? registrySeller : context.explorer.byAgent.get(agentId) ?? null;
119
+ const weight = big(read.weight);
120
+ const yourIds = context.ownPositions.get(agentId) ?? [];
121
+ return { agentId, stakeable, seller, weight, yourIds, full: weight !== 0n || stakeable || yourIds.length > 0 };
122
+ });
123
+ const none = () => null;
124
+ const batch = new Batch();
125
+ const reads = resolved.map(({ agentId, seller, yourIds, full }) => ({
126
+ activeStake: full ? batch.add(poolsAddress, POOLS_IFACE, 'poolActiveStakeAtEpoch', [agentId, epoch]) : none,
127
+ lastWeight: full && epoch > 0 ? batch.add(poolsAddress, POOLS_IFACE, 'poolWeightAtEpoch', [agentId, epoch - 1]) : none,
128
+ security: full ? batch.add(poolsAddress, POOLS_IFACE, 'currentPoolSecurityShareBps', [agentId]) : none,
129
+ usage: full ? batch.add(ctx.chain.usageAccountingAddress, ACCOUNTING_IFACE, 'agentEpochUsage', [epoch, agentId]) : none,
130
+ lastUsage: full && epoch > 0 ? batch.add(ctx.chain.usageAccountingAddress, ACCOUNTING_IFACE, 'agentEpochUsage', [epoch - 1, agentId]) : none,
131
+ lastEmission: full && epoch > 0 ? batch.add(ctx.chain.sellerPoolsRewardsAddress, REWARDS_IFACE, 'poolEpochEmissions', [epoch - 1, agentId]) : none,
132
+ yourStake: yourIds.length > 0 ? batch.add(poolsAddress, POOLS_IFACE, 'stakerAgentActiveStake', [ctx.address, agentId]) : none,
133
+ yourWeights: yourIds.map((id) => batch.add(poolsAddress, POOLS_IFACE, 'positionWeightAtEpoch', [id, epoch])),
134
+ volumes: context.epochs.map((value) => volumeCall(ctx, context.stack, batch, value, seller)),
135
+ }));
136
+ await batch.run(ctx);
137
+ return resolved.map(({ agentId, stakeable, seller, weight, yourIds }, index) => {
138
+ const read = reads[index];
139
+ const lastWeight = big(read.lastWeight);
140
+ const usage = read.usage()?.[0];
141
+ const points = usage?.[0] ?? 0n;
142
+ const weightedPoints = usage?.[1] ?? 0n;
143
+ const lastUsage = read.lastUsage()?.[0];
144
+ const lastPoints = lastUsage?.[0] ?? 0n;
145
+ const lastWeightedPoints = lastUsage?.[1] ?? 0n;
146
+ const emission = read.lastEmission();
147
+ const settled = emission?.[0] === true;
148
+ // Until a claim settles the pool's epoch, estimate its emission from last
149
+ // epoch's weighted usage share of the staker budget (same math the contract applies).
150
+ const emissionAmount = settled
151
+ ? emission?.[1]
152
+ : context.lastTotalWeightedPoolPoints > 0n ? context.lastStakerBudget * lastWeightedPoints / context.lastTotalWeightedPoolPoints : 0n;
153
+ const yourPower = read.yourWeights.reduce((sum, weightRead) => sum + big(weightRead), 0n);
154
+ const projected = context.totalWeightedPoolPoints > 0n && weightedPoints > 0n
155
+ ? context.stakerBudget * weightedPoints / context.totalWeightedPoolPoints
156
+ : 0n;
157
+ const profile = seller ? context.explorer.byAddress.get(seller.toLowerCase()) ?? null : null;
158
+ return {
159
+ agentId,
160
+ seller,
161
+ profile,
162
+ hasPool: weight !== 0n,
163
+ stakeable,
164
+ activeStake: big(read.activeStake).toString(),
165
+ weight: weight.toString(),
166
+ powerShareBps: bps(weight, context.totalPowerWeight),
167
+ securityShareBps: Number(big(read.security)),
168
+ volumes: context.epochs.map((value, position) => ({ epoch: value, usdc: big(read.volumes[position]).toString() })),
169
+ usagePoints: points.toString(),
170
+ weightedUsagePoints: weightedPoints.toString(),
171
+ lastEpochUsagePoints: lastPoints.toString(),
172
+ lastEpochEmission: emissionAmount > 0n ? emissionAmount.toString() : null,
173
+ lastEpochEmissionSettled: settled,
174
+ lastEpochRewardPer1kPower: emissionAmount > 0n ? per1k(emissionAmount, lastWeight) : null,
175
+ projectedRewardPer1kPower: projected > 0n ? per1k(projected, weight) : null,
176
+ yourStake: big(read.yourStake).toString(),
177
+ yourPower: yourPower.toString(),
178
+ yourPoolShareBps: bps(yourPower, weight),
179
+ yourPositionIds: yourIds,
180
+ };
181
+ });
182
+ }
183
+ async function networkVolumes(ctx, stack, epochs) {
184
+ const batch = new Batch();
185
+ const reads = epochs.map((epoch) => volumeCall(ctx, stack, batch, epoch, null));
186
+ await batch.run(ctx);
187
+ return epochs.map((epoch, index) => ({ epoch, usdc: big(reads[index]).toString() }));
188
+ }
189
+ /** Your open positions grouped by agent, with each position's live power this epoch (a bounded read: only your ids). */
190
+ async function ownPools(ctx, context) {
191
+ const poolsAddress = ctx.requirePools().contractAddress;
192
+ const epoch = context.stack.currentEpoch;
193
+ const batch = new Batch();
194
+ const reads = [...context.ownPositions.entries()].map(([agentId, ids]) => ({
195
+ agentId,
196
+ ids,
197
+ stake: batch.add(poolsAddress, POOLS_IFACE, 'stakerAgentActiveStake', [ctx.address, agentId]),
198
+ weights: ids.map((id) => batch.add(poolsAddress, POOLS_IFACE, 'positionWeightAtEpoch', [id, epoch])),
199
+ }));
200
+ await batch.run(ctx);
201
+ return new Map(reads.map((read) => [read.agentId, { positionIds: read.ids, stake: big(read.stake), power: read.weights.reduce((sum, weight) => sum + big(weight), 0n) }]));
202
+ }
203
+ /**
204
+ * Pool comparison. Statistics for every pool come from the indexer; the
205
+ * chain is read only for this wallet's own positions. Without an indexer
206
+ * (or while it is down) only the pools this wallet stakes in are listed,
207
+ * described live, and `source` says so.
208
+ */
209
+ export async function poolsView(ctx) {
210
+ const context = await poolContext(ctx);
211
+ const indexer = ctx.indexer();
212
+ const epochs = context.epochs;
213
+ const base = {
214
+ currentEpoch: context.stack.currentEpoch,
215
+ firstRewardedEpoch: context.stack.effectiveEpoch,
216
+ stakerBudget: context.stakerBudget.toString(),
217
+ explorer: ctx.chain.explorerApiUrl ?? null,
218
+ };
219
+ if (indexer) {
220
+ try {
221
+ const [indexed, sellerEpochs, metrics, own] = await Promise.all([indexer.pools(), indexer.sellerEpochs(VOLUME_EPOCHS), indexer.epochMetrics(), ownPools(ctx, context)]);
222
+ const views = mergePools({ indexed, explorer: context.explorer, sellerEpochs, epochs, own });
223
+ const totalPower = BigInt(indexed.network.current?.totalPowerWeight ?? '0') || context.totalPowerWeight;
224
+ const yourTotalPower = [...own.values()].reduce((sum, entry) => sum + entry.power, 0n);
225
+ return toJson({
226
+ ...base,
227
+ totalActiveStake: indexed.network.current?.totalActiveStake ?? '0',
228
+ totalPowerWeight: totalPower.toString(),
229
+ networkVolumes: epochs.map((epoch) => ({ epoch, usdc: metrics.find((row) => row.epoch === epoch)?.volumeUsdc ?? '0' })),
230
+ yourTotalPower: yourTotalPower.toString(),
231
+ yourNetworkShareBps: bps(yourTotalPower, totalPower),
232
+ source: 'indexer',
233
+ sourceError: null,
234
+ pools: views,
235
+ });
236
+ }
237
+ catch (error) {
238
+ if (!(error instanceof IndexerError))
239
+ throw error;
240
+ return chainOnlyPools(ctx, context, base, error.message);
241
+ }
242
+ }
243
+ return chainOnlyPools(ctx, context, base, null);
244
+ }
245
+ async function chainOnlyPools(ctx, context, base, sourceError) {
246
+ const pools = ctx.requirePools();
247
+ const agents = [...context.ownPositions.keys()].map((agentId) => [agentId, null]);
248
+ const views = sortPools(await describePools(ctx, agents, context));
249
+ const [totalActiveStake, network] = await Promise.all([
250
+ safe(() => pools.totalActiveStakeAtEpoch(context.stack.currentEpoch), 0n),
251
+ networkVolumes(ctx, context.stack, context.epochs),
252
+ ]);
253
+ const yourTotalPower = views.reduce((sum, pool) => sum + BigInt(pool.yourPower), 0n);
254
+ return toJson({
255
+ ...base,
256
+ totalActiveStake: totalActiveStake.toString(),
257
+ totalPowerWeight: context.totalPowerWeight.toString(),
258
+ networkVolumes: network,
259
+ yourTotalPower: yourTotalPower.toString(),
260
+ yourNetworkShareBps: bps(yourTotalPower, context.totalPowerWeight),
261
+ source: 'chain',
262
+ sourceError,
263
+ pools: views,
264
+ });
265
+ }
266
+ export async function singlePool(ctx, agentId) {
267
+ const context = await poolContext(ctx);
268
+ const indexer = ctx.indexer();
269
+ if (indexer) {
270
+ try {
271
+ const [indexed, sellerEpochs, own] = await Promise.all([indexer.pools(), indexer.sellerEpochs(VOLUME_EPOCHS), ownPools(ctx, context)]);
272
+ const ownHere = new Map([...own.entries()].filter(([id]) => id === agentId));
273
+ const explorer = { byAddress: context.explorer.byAddress, byAgent: new Map([...context.explorer.byAgent.entries()].filter(([id]) => id === agentId)) };
274
+ const merged = mergePools({ indexed: { ...indexed, pools: indexed.pools.filter((pool) => pool.agentId === agentId) }, explorer, sellerEpochs, epochs: context.epochs, own: ownHere });
275
+ const view = merged.find((pool) => pool.agentId === agentId);
276
+ if (view)
277
+ return toJson({ ...view, currentEpoch: context.stack.currentEpoch });
278
+ }
279
+ catch (error) {
280
+ if (!(error instanceof IndexerError))
281
+ throw error;
282
+ }
283
+ }
284
+ const [view] = await describePools(ctx, [[agentId, null]], context);
285
+ return toJson({ ...view, currentEpoch: context.stack.currentEpoch });
286
+ }
287
+ //# sourceMappingURL=pools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pools.js","sourceRoot":"","sources":["../../src/service/pools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import { type SellerPoolPosition } from '@antseed/node/payments';
2
+ import type { AntsContext } from './context.js';
3
+ import type { PositionView, PositionsView, StakeRequest, MoveRequest, SplitRequest, MergeRequest, ExtendRequest, MaxLockRequest, WithdrawRequest } from '../api-types.js';
4
+ import { type IndexedPosition } from './indexer.js';
5
+ import { type StepReporter } from './steps.js';
6
+ export interface PositionDetail extends PositionView {
7
+ raw: SellerPoolPosition;
8
+ }
9
+ /**
10
+ * Ids of this wallet's positions that left the on-chain enumeration (split,
11
+ * merge, move sources; withdrawals), as the indexer knows them. Empty without
12
+ * an indexer; never reconstructed from log scans.
13
+ */
14
+ export declare function closedPositionIds(ctx: AntsContext): Promise<{
15
+ ids: number[];
16
+ source: PositionsView['historySource'];
17
+ rows: IndexedPosition[];
18
+ }>;
19
+ /**
20
+ * The wallet's open positions from the on-chain `stakerPositionIds`
21
+ * enumeration, plus its closed positions from the indexer (with the reward
22
+ * still pending on them read live). The chain is never scanned for history.
23
+ */
24
+ export declare function positions(ctx: AntsContext): Promise<PositionsView>;
25
+ export declare function stake(ctx: AntsContext, request: StakeRequest, report?: StepReporter): Promise<{
26
+ hash: string;
27
+ amount: string;
28
+ agentId: number;
29
+ epochs: number;
30
+ }>;
31
+ export declare function move(ctx: AntsContext, request: MoveRequest, report?: StepReporter): Promise<{
32
+ hash: string;
33
+ }>;
34
+ export declare function split(ctx: AntsContext, request: SplitRequest, report?: StepReporter): Promise<{
35
+ hash: string;
36
+ }>;
37
+ export declare function merge(ctx: AntsContext, request: MergeRequest, report?: StepReporter): Promise<{
38
+ hash: string;
39
+ }>;
40
+ export declare function extend(ctx: AntsContext, request: ExtendRequest, report?: StepReporter): Promise<{
41
+ hash: string;
42
+ }>;
43
+ export declare function maxLock(ctx: AntsContext, request: MaxLockRequest, report?: StepReporter): Promise<{
44
+ hash: string;
45
+ }>;
46
+ export interface WithdrawPreview {
47
+ positions: Array<{
48
+ id: number;
49
+ amount: string;
50
+ slashBps: number;
51
+ slashedAmount: string;
52
+ returnedAmount: string;
53
+ }>;
54
+ totalSlashed: string;
55
+ totalReturned: string;
56
+ earlyExit: boolean;
57
+ }
58
+ export declare function previewWithdraw(ctx: AntsContext, ids: number[]): Promise<WithdrawPreview>;
59
+ export declare function withdraw(ctx: AntsContext, request: WithdrawRequest, report?: StepReporter): Promise<{
60
+ hash: string;
61
+ preview: WithdrawPreview;
62
+ }>;