@antseed/cli 0.1.157 → 0.1.158

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 (237) hide show
  1. package/README.md +135 -6
  2. package/dist/cli/commands/ants/addresses.d.ts +3 -0
  3. package/dist/cli/commands/ants/addresses.d.ts.map +1 -0
  4. package/dist/cli/commands/ants/addresses.js +20 -0
  5. package/dist/cli/commands/ants/addresses.js.map +1 -0
  6. package/dist/cli/commands/ants/addresses.test.d.ts +2 -0
  7. package/dist/cli/commands/ants/addresses.test.d.ts.map +1 -0
  8. package/dist/cli/commands/ants/addresses.test.js +12 -0
  9. package/dist/cli/commands/ants/addresses.test.js.map +1 -0
  10. package/dist/cli/commands/ants/arguments.test.d.ts +2 -0
  11. package/dist/cli/commands/ants/arguments.test.d.ts.map +1 -0
  12. package/dist/cli/commands/ants/arguments.test.js +51 -0
  13. package/dist/cli/commands/ants/arguments.test.js.map +1 -0
  14. package/dist/cli/commands/ants/dashboard.d.ts +4 -0
  15. package/dist/cli/commands/ants/dashboard.d.ts.map +1 -0
  16. package/dist/cli/commands/ants/dashboard.js +45 -0
  17. package/dist/cli/commands/ants/dashboard.js.map +1 -0
  18. package/dist/cli/commands/ants/dashboard.test.d.ts +2 -0
  19. package/dist/cli/commands/ants/dashboard.test.d.ts.map +1 -0
  20. package/dist/cli/commands/ants/dashboard.test.js +14 -0
  21. package/dist/cli/commands/ants/dashboard.test.js.map +1 -0
  22. package/dist/cli/commands/ants/emissions.d.ts +5 -0
  23. package/dist/cli/commands/ants/emissions.d.ts.map +1 -0
  24. package/dist/cli/commands/ants/emissions.js +44 -0
  25. package/dist/cli/commands/ants/emissions.js.map +1 -0
  26. package/dist/cli/commands/ants/emissions.test.d.ts +2 -0
  27. package/dist/cli/commands/ants/emissions.test.d.ts.map +1 -0
  28. package/dist/cli/commands/ants/emissions.test.js +17 -0
  29. package/dist/cli/commands/ants/emissions.test.js.map +1 -0
  30. package/dist/cli/commands/ants/extend.d.ts +3 -0
  31. package/dist/cli/commands/ants/extend.d.ts.map +1 -0
  32. package/dist/cli/commands/ants/extend.js +14 -0
  33. package/dist/cli/commands/ants/extend.js.map +1 -0
  34. package/dist/cli/commands/ants/extend.test.d.ts +2 -0
  35. package/dist/cli/commands/ants/extend.test.d.ts.map +1 -0
  36. package/dist/cli/commands/ants/extend.test.js +13 -0
  37. package/dist/cli/commands/ants/extend.test.js.map +1 -0
  38. package/dist/cli/commands/ants/index.d.ts +7 -0
  39. package/dist/cli/commands/ants/index.d.ts.map +1 -0
  40. package/dist/cli/commands/ants/index.js +46 -0
  41. package/dist/cli/commands/ants/index.js.map +1 -0
  42. package/dist/cli/commands/ants/index.test.d.ts +2 -0
  43. package/dist/cli/commands/ants/index.test.d.ts.map +1 -0
  44. package/dist/cli/commands/ants/index.test.js +24 -0
  45. package/dist/cli/commands/ants/index.test.js.map +1 -0
  46. package/dist/cli/commands/ants/max-lock.d.ts +3 -0
  47. package/dist/cli/commands/ants/max-lock.d.ts.map +1 -0
  48. package/dist/cli/commands/ants/max-lock.js +13 -0
  49. package/dist/cli/commands/ants/max-lock.js.map +1 -0
  50. package/dist/cli/commands/ants/max-lock.test.d.ts +2 -0
  51. package/dist/cli/commands/ants/max-lock.test.d.ts.map +1 -0
  52. package/dist/cli/commands/ants/max-lock.test.js +15 -0
  53. package/dist/cli/commands/ants/max-lock.test.js.map +1 -0
  54. package/dist/cli/commands/ants/merge.d.ts +3 -0
  55. package/dist/cli/commands/ants/merge.d.ts.map +1 -0
  56. package/dist/cli/commands/ants/merge.js +12 -0
  57. package/dist/cli/commands/ants/merge.js.map +1 -0
  58. package/dist/cli/commands/ants/merge.test.d.ts +2 -0
  59. package/dist/cli/commands/ants/merge.test.d.ts.map +1 -0
  60. package/dist/cli/commands/ants/merge.test.js +16 -0
  61. package/dist/cli/commands/ants/merge.test.js.map +1 -0
  62. package/dist/cli/commands/ants/move.d.ts +3 -0
  63. package/dist/cli/commands/ants/move.d.ts.map +1 -0
  64. package/dist/cli/commands/ants/move.js +14 -0
  65. package/dist/cli/commands/ants/move.js.map +1 -0
  66. package/dist/cli/commands/ants/move.test.d.ts +2 -0
  67. package/dist/cli/commands/ants/move.test.d.ts.map +1 -0
  68. package/dist/cli/commands/ants/move.test.js +16 -0
  69. package/dist/cli/commands/ants/move.test.js.map +1 -0
  70. package/dist/cli/commands/ants/pool.d.ts +3 -0
  71. package/dist/cli/commands/ants/pool.d.ts.map +1 -0
  72. package/dist/cli/commands/ants/pool.js +21 -0
  73. package/dist/cli/commands/ants/pool.js.map +1 -0
  74. package/dist/cli/commands/ants/pool.test.d.ts +2 -0
  75. package/dist/cli/commands/ants/pool.test.d.ts.map +1 -0
  76. package/dist/cli/commands/ants/pool.test.js +13 -0
  77. package/dist/cli/commands/ants/pool.test.js.map +1 -0
  78. package/dist/cli/commands/ants/pools.d.ts +6 -0
  79. package/dist/cli/commands/ants/pools.d.ts.map +1 -0
  80. package/dist/cli/commands/ants/pools.js +50 -0
  81. package/dist/cli/commands/ants/pools.js.map +1 -0
  82. package/dist/cli/commands/ants/pools.test.d.ts +2 -0
  83. package/dist/cli/commands/ants/pools.test.d.ts.map +1 -0
  84. package/dist/cli/commands/ants/pools.test.js +18 -0
  85. package/dist/cli/commands/ants/pools.test.js.map +1 -0
  86. package/dist/cli/commands/ants/positions.d.ts +6 -0
  87. package/dist/cli/commands/ants/positions.d.ts.map +1 -0
  88. package/dist/cli/commands/ants/positions.js +46 -0
  89. package/dist/cli/commands/ants/positions.js.map +1 -0
  90. package/dist/cli/commands/ants/positions.test.d.ts +2 -0
  91. package/dist/cli/commands/ants/positions.test.d.ts.map +1 -0
  92. package/dist/cli/commands/ants/positions.test.js +19 -0
  93. package/dist/cli/commands/ants/positions.test.js.map +1 -0
  94. package/dist/cli/commands/ants/rewards.d.ts +9 -0
  95. package/dist/cli/commands/ants/rewards.d.ts.map +1 -0
  96. package/dist/cli/commands/ants/rewards.js +93 -0
  97. package/dist/cli/commands/ants/rewards.js.map +1 -0
  98. package/dist/cli/commands/ants/rewards.test.d.ts +2 -0
  99. package/dist/cli/commands/ants/rewards.test.d.ts.map +1 -0
  100. package/dist/cli/commands/ants/rewards.test.js +46 -0
  101. package/dist/cli/commands/ants/rewards.test.js.map +1 -0
  102. package/dist/cli/commands/ants/seller.d.ts +3 -0
  103. package/dist/cli/commands/ants/seller.d.ts.map +1 -0
  104. package/dist/cli/commands/ants/seller.js +32 -0
  105. package/dist/cli/commands/ants/seller.js.map +1 -0
  106. package/dist/cli/commands/ants/seller.test.d.ts +2 -0
  107. package/dist/cli/commands/ants/seller.test.d.ts.map +1 -0
  108. package/dist/cli/commands/ants/seller.test.js +16 -0
  109. package/dist/cli/commands/ants/seller.test.js.map +1 -0
  110. package/dist/cli/commands/ants/shared.d.ts +26 -0
  111. package/dist/cli/commands/ants/shared.d.ts.map +1 -0
  112. package/dist/cli/commands/ants/shared.js +94 -0
  113. package/dist/cli/commands/ants/shared.js.map +1 -0
  114. package/dist/cli/commands/ants/shared.test.d.ts +2 -0
  115. package/dist/cli/commands/ants/shared.test.d.ts.map +1 -0
  116. package/dist/cli/commands/ants/shared.test.js +25 -0
  117. package/dist/cli/commands/ants/shared.test.js.map +1 -0
  118. package/dist/cli/commands/ants/split.d.ts +3 -0
  119. package/dist/cli/commands/ants/split.d.ts.map +1 -0
  120. package/dist/cli/commands/ants/split.js +12 -0
  121. package/dist/cli/commands/ants/split.js.map +1 -0
  122. package/dist/cli/commands/ants/split.test.d.ts +2 -0
  123. package/dist/cli/commands/ants/split.test.d.ts.map +1 -0
  124. package/dist/cli/commands/ants/split.test.js +13 -0
  125. package/dist/cli/commands/ants/split.test.js.map +1 -0
  126. package/dist/cli/commands/ants/stake.d.ts +3 -0
  127. package/dist/cli/commands/ants/stake.d.ts.map +1 -0
  128. package/dist/cli/commands/ants/stake.js +15 -0
  129. package/dist/cli/commands/ants/stake.js.map +1 -0
  130. package/dist/cli/commands/ants/stake.test.d.ts +2 -0
  131. package/dist/cli/commands/ants/stake.test.d.ts.map +1 -0
  132. package/dist/cli/commands/ants/stake.test.js +17 -0
  133. package/dist/cli/commands/ants/stake.test.js.map +1 -0
  134. package/dist/cli/commands/ants/status.d.ts +9 -0
  135. package/dist/cli/commands/ants/status.d.ts.map +1 -0
  136. package/dist/cli/commands/ants/status.js +43 -0
  137. package/dist/cli/commands/ants/status.js.map +1 -0
  138. package/dist/cli/commands/ants/status.test.d.ts +2 -0
  139. package/dist/cli/commands/ants/status.test.d.ts.map +1 -0
  140. package/dist/cli/commands/ants/status.test.js +23 -0
  141. package/dist/cli/commands/ants/status.test.js.map +1 -0
  142. package/dist/cli/commands/ants/usage.d.ts +4 -0
  143. package/dist/cli/commands/ants/usage.d.ts.map +1 -0
  144. package/dist/cli/commands/ants/usage.js +31 -0
  145. package/dist/cli/commands/ants/usage.js.map +1 -0
  146. package/dist/cli/commands/ants/usage.test.d.ts +2 -0
  147. package/dist/cli/commands/ants/usage.test.d.ts.map +1 -0
  148. package/dist/cli/commands/ants/usage.test.js +15 -0
  149. package/dist/cli/commands/ants/usage.test.js.map +1 -0
  150. package/dist/cli/commands/ants/verify.d.ts +3 -0
  151. package/dist/cli/commands/ants/verify.d.ts.map +1 -0
  152. package/dist/cli/commands/ants/verify.js +51 -0
  153. package/dist/cli/commands/ants/verify.js.map +1 -0
  154. package/dist/cli/commands/ants/verify.test.d.ts +2 -0
  155. package/dist/cli/commands/ants/verify.test.d.ts.map +1 -0
  156. package/dist/cli/commands/ants/verify.test.js +51 -0
  157. package/dist/cli/commands/ants/verify.test.js.map +1 -0
  158. package/dist/cli/commands/ants/withdraw.d.ts +16 -0
  159. package/dist/cli/commands/ants/withdraw.d.ts.map +1 -0
  160. package/dist/cli/commands/ants/withdraw.js +48 -0
  161. package/dist/cli/commands/ants/withdraw.js.map +1 -0
  162. package/dist/cli/commands/ants/withdraw.test.d.ts +2 -0
  163. package/dist/cli/commands/ants/withdraw.test.d.ts.map +1 -0
  164. package/dist/cli/commands/ants/withdraw.test.js +30 -0
  165. package/dist/cli/commands/ants/withdraw.test.js.map +1 -0
  166. package/dist/cli/commands/emissions.d.ts +7 -0
  167. package/dist/cli/commands/emissions.d.ts.map +1 -1
  168. package/dist/cli/commands/emissions.js +105 -27
  169. package/dist/cli/commands/emissions.js.map +1 -1
  170. package/dist/cli/commands/emissions.test.js +7 -1
  171. package/dist/cli/commands/emissions.test.js.map +1 -1
  172. package/dist/cli/commands/network/chain-config-helper.d.ts +18 -0
  173. package/dist/cli/commands/network/chain-config-helper.d.ts.map +1 -1
  174. package/dist/cli/commands/network/chain-config-helper.js.map +1 -1
  175. package/dist/cli/commands/parse-positive-integer.d.ts +2 -0
  176. package/dist/cli/commands/parse-positive-integer.d.ts.map +1 -0
  177. package/dist/cli/commands/parse-positive-integer.js +9 -0
  178. package/dist/cli/commands/parse-positive-integer.js.map +1 -0
  179. package/dist/cli/commands/reward-actions.d.ts +11 -0
  180. package/dist/cli/commands/reward-actions.d.ts.map +1 -0
  181. package/dist/cli/commands/reward-actions.js +22 -0
  182. package/dist/cli/commands/reward-actions.js.map +1 -0
  183. package/dist/cli/commands/seller/contract-clients.test.d.ts +2 -0
  184. package/dist/cli/commands/seller/contract-clients.test.d.ts.map +1 -0
  185. package/dist/cli/commands/seller/contract-clients.test.js +45 -0
  186. package/dist/cli/commands/seller/contract-clients.test.js.map +1 -0
  187. package/dist/cli/commands/seller/index.d.ts.map +1 -1
  188. package/dist/cli/commands/seller/index.js +4 -2
  189. package/dist/cli/commands/seller/index.js.map +1 -1
  190. package/dist/cli/commands/seller/pool.d.ts +15 -0
  191. package/dist/cli/commands/seller/pool.d.ts.map +1 -0
  192. package/dist/cli/commands/seller/pool.js +201 -0
  193. package/dist/cli/commands/seller/pool.js.map +1 -0
  194. package/dist/cli/commands/seller/pool.test.d.ts +2 -0
  195. package/dist/cli/commands/seller/pool.test.d.ts.map +1 -0
  196. package/dist/cli/commands/seller/pool.test.js +16 -0
  197. package/dist/cli/commands/seller/pool.test.js.map +1 -0
  198. package/dist/cli/commands/seller/register.d.ts.map +1 -1
  199. package/dist/cli/commands/seller/register.js +38 -8
  200. package/dist/cli/commands/seller/register.js.map +1 -1
  201. package/dist/cli/commands/seller/rewards.d.ts +13 -0
  202. package/dist/cli/commands/seller/rewards.d.ts.map +1 -0
  203. package/dist/cli/commands/seller/rewards.js +115 -0
  204. package/dist/cli/commands/seller/rewards.js.map +1 -0
  205. package/dist/cli/commands/seller/rewards.test.d.ts +2 -0
  206. package/dist/cli/commands/seller/rewards.test.d.ts.map +1 -0
  207. package/dist/cli/commands/seller/rewards.test.js +21 -0
  208. package/dist/cli/commands/seller/rewards.test.js.map +1 -0
  209. package/dist/cli/commands/seller/setup.d.ts.map +1 -1
  210. package/dist/cli/commands/seller/setup.js +2 -1
  211. package/dist/cli/commands/seller/setup.js.map +1 -1
  212. package/dist/cli/commands/seller/stake.d.ts.map +1 -1
  213. package/dist/cli/commands/seller/stake.js +104 -65
  214. package/dist/cli/commands/seller/stake.js.map +1 -1
  215. package/dist/cli/commands/seller/stake.test.d.ts +2 -0
  216. package/dist/cli/commands/seller/stake.test.d.ts.map +1 -0
  217. package/dist/cli/commands/seller/stake.test.js +99 -0
  218. package/dist/cli/commands/seller/stake.test.js.map +1 -0
  219. package/dist/cli/commands/seller/start.d.ts.map +1 -1
  220. package/dist/cli/commands/seller/start.js +6 -0
  221. package/dist/cli/commands/seller/start.js.map +1 -1
  222. package/dist/cli/commands/seller/status.d.ts.map +1 -1
  223. package/dist/cli/commands/seller/status.js +44 -2
  224. package/dist/cli/commands/seller/status.js.map +1 -1
  225. package/dist/cli/index.js +2 -0
  226. package/dist/cli/index.js.map +1 -1
  227. package/dist/cli/payment-utils.d.ts +33 -2
  228. package/dist/cli/payment-utils.d.ts.map +1 -1
  229. package/dist/cli/payment-utils.js +101 -2
  230. package/dist/cli/payment-utils.js.map +1 -1
  231. package/dist/config/types.d.ts +20 -0
  232. package/dist/config/types.d.ts.map +1 -1
  233. package/package.json +7 -6
  234. package/dist/cli/commands/seller/emissions.d.ts +0 -3
  235. package/dist/cli/commands/seller/emissions.d.ts.map +0 -1
  236. package/dist/cli/commands/seller/emissions.js +0 -5
  237. package/dist/cli/commands/seller/emissions.js.map +0 -1
@@ -0,0 +1,43 @@
1
+ import chalk from 'chalk';
2
+ import Table from 'cli-table3';
3
+ import { overview, rewards, formatAnts } from '@antseed/ants';
4
+ import { ants, epochDate, printJson, runRead } from './shared.js';
5
+ export function formatDuration(seconds) {
6
+ const days = Math.floor(seconds / 86_400);
7
+ const hours = Math.floor((seconds % 86_400) / 3600);
8
+ const minutes = Math.floor((seconds % 3600) / 60);
9
+ return days > 0 ? `${days}d ${hours}h ${minutes}m` : `${hours}h ${minutes}m`;
10
+ }
11
+ export function phaseLabel(view) {
12
+ switch (view.phase) {
13
+ case 'legacy': return 'legacy emissions only';
14
+ case 'deployed': return `deployed, activates at epoch ${view.epoch.effective}`;
15
+ case 'active': return 'recognized usage active';
16
+ default: return view.phase;
17
+ }
18
+ }
19
+ export function registerAntsStatusCommand(antsCmd) {
20
+ antsCmd
21
+ .command('status')
22
+ .description('Protocol phase, epoch, wallet balances, stake, and claimable rewards')
23
+ .option('--json', 'output as JSON', false)
24
+ .action(async (options) => runRead(antsCmd, 'Loading status...', async ({ ctx }) => {
25
+ const view = await overview(ctx);
26
+ const pending = await rewards(ctx).catch(() => null);
27
+ if (options.json)
28
+ return printJson({ ...view, rewards: pending });
29
+ console.log(chalk.bold('ANTS status\n'));
30
+ const table = new Table({ head: ['Metric', 'Value'], colWidths: [28, 64] });
31
+ table.push(['Chain', `${view.chainId} (${view.rpcUrl})`], ['Protocol phase', phaseLabel(view)], ['Epoch', `${view.epoch.current} (next boundary ${epochDate(view.epoch.genesis, view.epoch.epochDuration, view.epoch.current + 1)}, in ${formatDuration(view.epoch.secondsToBoundary)})`], ['Wallet', view.wallet.address], ['ANTS balance', ants(view.wallet.ants)], ['ETH balance', `${(Number(view.wallet.eth) / 1e18).toFixed(6)} ETH`], ['ANTS transferable', view.wallet.canTransfer ? 'yes' : 'no (transfers disabled, not whitelisted)'], ['Active stake', `${ants(view.wallet.totalActiveStake)} in ${view.wallet.positionCount} position(s)`], ['Seller agent', view.wallet.agentId ? `${view.wallet.agentId}${view.wallet.sellerBound ? ' (bound in seller registry)' : ' (legacy binding only)'}` : 'none']);
32
+ if (view.network) {
33
+ table.push(['Network active stake', ants(view.network.totalActiveStake)], ['Epoch emission', ants(view.network.epochEmission, 0)], ['Staker budget (epoch)', ants(view.network.stakerBudget, 0)], ['Usage budgets (epoch)', `buyers ${formatAnts(view.network.usageBuyerBudget, 0)} / sellers ${formatAnts(view.network.usageSellerBudget, 0)} ANTS`], ['ANTS supply', `${formatAnts(view.network.antsTotalSupply, 0)} / ${formatAnts(view.network.antsMaxSupply, 0)}`]);
34
+ }
35
+ if (pending)
36
+ table.push(['Claimable rewards', ants(pending.total)]);
37
+ console.log(table.toString());
38
+ for (const notice of view.notices)
39
+ console.log(chalk.yellow(`⚠ ${notice}`));
40
+ console.log(chalk.dim('\nOpen the dashboard with: antseed ants'));
41
+ }));
42
+ }
43
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../../src/cli/commands/ants/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=status.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.test.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/ants/status.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ import assert from 'node:assert/strict';
2
+ import test from 'node:test';
3
+ import { Command } from 'commander';
4
+ import { formatDuration, phaseLabel, registerAntsStatusCommand } from './status.js';
5
+ test('status offers JSON output', () => {
6
+ const ants = new Command('ants');
7
+ registerAntsStatusCommand(ants);
8
+ const status = ants.commands.find((command) => command.name() === 'status');
9
+ assert.ok(status);
10
+ assert.ok(status.options.some((option) => option.long === '--json'));
11
+ });
12
+ test('formatDuration drops the day component under one day', () => {
13
+ assert.equal(formatDuration(90_061), '1d 1h 1m');
14
+ assert.equal(formatDuration(3_660), '1h 1m');
15
+ assert.equal(formatDuration(59), '0h 0m');
16
+ });
17
+ test('phaseLabel names the cutover epoch while deployed', () => {
18
+ const epoch = { effective: 22 };
19
+ assert.equal(phaseLabel({ phase: 'legacy', epoch }), 'legacy emissions only');
20
+ assert.equal(phaseLabel({ phase: 'deployed', epoch }), 'deployed, activates at epoch 22');
21
+ assert.equal(phaseLabel({ phase: 'active', epoch }), 'recognized usage active');
22
+ });
23
+ //# sourceMappingURL=status.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.test.js","sourceRoot":"","sources":["../../../../src/cli/commands/ants/status.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAEpF,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACrC,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,yBAAyB,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,QAAQ,CAAC,CAAC;IAC5E,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;IAClB,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC;AACvE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sDAAsD,EAAE,GAAG,EAAE;IAChE,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC;IACjD,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mDAAmD,EAAE,GAAG,EAAE;IAC7D,MAAM,KAAK,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAChC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,uBAAuB,CAAC,CAAC;IAC9E,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,iCAAiC,CAAC,CAAC;IAC1F,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,yBAAyB,CAAC,CAAC;AAClF,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Command } from 'commander';
2
+ export declare const DEFAULT_USAGE_EPOCHS = 8;
3
+ export declare function registerAntsUsageCommand(antsCmd: Command): void;
4
+ //# sourceMappingURL=usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/ants/usage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqB/D"}
@@ -0,0 +1,31 @@
1
+ import { parsePositiveInteger } from '../parse-positive-integer.js';
2
+ import chalk from 'chalk';
3
+ import Table from 'cli-table3';
4
+ import { usage } from '@antseed/ants';
5
+ import { printJson, runRead } from './shared.js';
6
+ export const DEFAULT_USAGE_EPOCHS = 8;
7
+ export function registerAntsUsageCommand(antsCmd) {
8
+ antsCmd
9
+ .command('usage')
10
+ .description('Your buyer/seller usage points per epoch and network totals')
11
+ .option('--epochs <n>', 'number of recent epochs', parsePositiveInteger, DEFAULT_USAGE_EPOCHS)
12
+ .option('--json', 'output as JSON', false)
13
+ .action(async (options) => runRead(antsCmd, 'Loading usage...', async ({ ctx }) => {
14
+ const view = await usage(ctx, { epochs: options.epochs });
15
+ if (options.json)
16
+ return printJson(view);
17
+ if (view.source === 'chain' && view.sourceError)
18
+ console.log(chalk.yellow(`Per-epoch usage unavailable: ${view.sourceError}`));
19
+ if (view.epochs.length === 0) {
20
+ console.log(chalk.yellow(`No recognized-usage epochs yet (accounting starts at epoch ${view.firstRewardedEpoch ?? '?'}, current epoch ${view.currentEpoch}).`));
21
+ return;
22
+ }
23
+ const table = new Table({ head: ['Epoch', 'Your buyer pts', 'Weighted', 'Your seller pts', 'Agent', 'Net buyer pts', 'Net seller pts', 'Net pool pts'] });
24
+ for (const row of view.epochs) {
25
+ table.push([row.epoch, row.buyerPoints, row.weightedBuyerPoints, row.sellerPoints, row.agentId || '—', row.totalBuyerPoints, row.totalSellerPoints, row.totalPoolPoints]);
26
+ }
27
+ console.log(table.toString());
28
+ console.log(chalk.dim(`Lifetime buyer points ${view.totals.buyerPoints} (weighted ${view.totals.buyerWeightedPoints}). Points policy ${view.pointsPolicy ?? 'none'}.`));
29
+ }));
30
+ }
31
+ //# sourceMappingURL=usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../../../src/cli/commands/ants/usage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAEtC,MAAM,UAAU,wBAAwB,CAAC,OAAgB;IACvD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,6DAA6D,CAAC;SAC1E,MAAM,CAAC,cAAc,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,oBAAoB,CAAC;SAC7F,MAAM,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,CAAC;SACzC,MAAM,CAAC,KAAK,EAAE,OAA0C,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;QACnH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1D,IAAI,OAAO,CAAC,IAAI;YAAE,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gCAAgC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAC/H,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,8DAA8D,IAAI,CAAC,kBAAkB,IAAI,GAAG,mBAAmB,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC;YAChK,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,iBAAiB,EAAE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,cAAc,CAAC,EAAE,CAAC,CAAC;QAC1J,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,mBAAmB,EAAE,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,OAAO,IAAI,GAAG,EAAE,GAAG,CAAC,gBAAgB,EAAE,GAAG,CAAC,iBAAiB,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;QAC5K,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yBAAyB,IAAI,CAAC,MAAM,CAAC,WAAW,cAAc,IAAI,CAAC,MAAM,CAAC,mBAAmB,oBAAoB,IAAI,CAAC,YAAY,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC;IAC1K,CAAC,CAAC,CAAC,CAAC;AACR,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=usage.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.test.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/ants/usage.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import assert from 'node:assert/strict';
2
+ import test from 'node:test';
3
+ import { Command } from 'commander';
4
+ import { DEFAULT_USAGE_EPOCHS, registerAntsUsageCommand } from './usage.js';
5
+ test('usage looks back a fixed number of epochs by default', () => {
6
+ const ants = new Command('ants');
7
+ registerAntsUsageCommand(ants);
8
+ const usage = ants.commands.find((command) => command.name() === 'usage');
9
+ assert.ok(usage);
10
+ const epochs = usage.options.find((option) => option.long === '--epochs');
11
+ assert.ok(epochs);
12
+ assert.equal(epochs.defaultValue, DEFAULT_USAGE_EPOCHS);
13
+ assert.ok(usage.options.some((option) => option.long === '--json'));
14
+ });
15
+ //# sourceMappingURL=usage.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.test.js","sourceRoot":"","sources":["../../../../src/cli/commands/ants/usage.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE5E,IAAI,CAAC,sDAAsD,EAAE,GAAG,EAAE;IAChE,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,wBAAwB,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,OAAO,CAAC,CAAC;IAC1E,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IACjB,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;IAC1E,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;IAClB,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,oBAAoB,CAAC,CAAC;IACxD,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC;AACtE,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerAntsVerifyCommand(antsCmd: Command): void;
3
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/ants/verify.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoDhE"}
@@ -0,0 +1,51 @@
1
+ import chalk from 'chalk';
2
+ import Table from 'cli-table3';
3
+ import { readFile } from 'node:fs/promises';
4
+ import { verification, proofStatus, submitProof, formatBps, formatUsdc, validateSellerProofArtifact, sellerProofId } from '@antseed/ants';
5
+ import { confirm, printJson, runAction, runRead } from './shared.js';
6
+ export function registerAntsVerifyCommand(antsCmd) {
7
+ const verify = antsCmd.command('verify').description('Wash-trading verification: seller status, proof submission, proof progress');
8
+ verify.argument('[seller]', 'seller address to inspect (default: your wallet)')
9
+ .option('--json', 'output as JSON', false)
10
+ .action(async (seller, options) => runRead(antsCmd, 'Loading verification status...', async ({ ctx }) => {
11
+ const view = await verification(ctx, seller);
12
+ if (options.json)
13
+ return printJson(view);
14
+ if (!view.registry)
15
+ return console.log(chalk.yellow('No wash-trading registry is configured for this chain.'));
16
+ console.log(chalk.bold('Wash-trading registry\n'));
17
+ const table = new Table({ head: ['Field', 'Value'] });
18
+ table.push(['Registry', view.registry.address], ['SP1 verifier', `${view.registry.verifier} (hash ${view.registry.verifierHash})`], ['Seller program vkey', view.registry.sellerProgramVKey], ['Historical period', `blocks ${view.registry.periodStartBlock}–${view.registry.periodEndBlock}`], ['Flag threshold', `${formatBps(view.registry.thresholdBps)} of authenticated volume`], ['Blockhash store', view.registry.blockhashStore], ['Enforced in accounting', view.enforced ? 'yes (points policy registry pins this registry)' : 'no']);
19
+ console.log(table.toString());
20
+ if (view.seller) {
21
+ console.log(chalk.bold(`\nSeller ${view.seller.seller}\n`));
22
+ const status = new Table({ head: ['Field', 'Value'] });
23
+ status.push(['Proven wash volume', `${formatUsdc(view.seller.provenWashVolume)} USDC`], ['Authenticated total volume', `${formatUsdc(view.seller.totalSellerVolume)} USDC`], ['Proven wash share', formatBps(view.seller.provenWashShareBps)], ['Flagged', view.seller.isProvenWashTrader ? chalk.red('yes — new usage earns zero points') : 'no'], ['Evidence digest', view.seller.evidenceDigest]);
24
+ console.log(status.toString());
25
+ }
26
+ }));
27
+ verify.command('submit <artifact>')
28
+ .description('Stage, authenticate, and finalize a loop-proof seller proof artifact (resumable)')
29
+ .option('-y, --yes', 'skip the confirmation', false)
30
+ .action(async (artifactPath, options) => runAction(antsCmd, 'Reading artifact...', async ({ ctx }, report, spinner) => {
31
+ const artifact = validateSellerProofArtifact(JSON.parse(await readFile(artifactPath, 'utf-8')));
32
+ spinner.stop();
33
+ console.log(`Seller ${artifact.seller}, proof ${sellerProofId(artifact.publicValues)}, ${artifact.blockAuthenticationChunkCount} chunk(s) / ${artifact.blockReferenceCount} block references.`);
34
+ console.log(chalk.yellow('Submission is permanent and permissionless: a finalized result records the seller\'s proven wash ratio on chain.'));
35
+ if (!options.yes && !(await confirm('Submit this proof? [y/N] ')))
36
+ throw new Error('Submission cancelled.');
37
+ spinner.start('Submitting proof...');
38
+ const result = await submitProof(ctx, artifact, report);
39
+ return `Proof ${result.proofId} finalized for ${result.seller} (${result.transactions.length} transaction(s))`;
40
+ }));
41
+ verify.command('proof <proofId>')
42
+ .description('Show staging/authentication/finalization progress of a proof ID')
43
+ .option('--json', 'output as JSON', false)
44
+ .action(async (proofId, options) => runRead(antsCmd, 'Loading proof...', async ({ ctx }) => {
45
+ const status = await proofStatus(ctx, proofId);
46
+ if (options.json || verify.opts().json)
47
+ return printJson(status);
48
+ console.log(`Proof ${status.proofId}: ${status.finalized ? 'finalized' : status.staged ? 'staged' : 'not staged'}; ${status.authenticatedBlockChunkCount} chunk(s) / ${status.authenticatedBlockReferenceCount} block reference(s) authenticated.`);
49
+ }));
50
+ }
51
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../../../src/cli/commands/ants/verify.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,2BAA2B,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC1I,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAErE,MAAM,UAAU,yBAAyB,CAAC,OAAgB;IACxD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,4EAA4E,CAAC,CAAC;IAEnI,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,kDAAkD,CAAC;SAC5E,MAAM,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,CAAC;SACzC,MAAM,CAAC,KAAK,EAAE,MAA0B,EAAE,OAA0B,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,gCAAgC,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;QAC7I,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC7C,IAAI,OAAO,CAAC,IAAI;YAAE,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,wDAAwD,CAAC,CAAC,CAAC;QAC/G,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QACtD,KAAK,CAAC,IAAI,CACR,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,UAAU,IAAI,CAAC,QAAQ,CAAC,YAAY,GAAG,CAAC,EACvH,CAAC,qBAAqB,EAAE,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,mBAAmB,EAAE,UAAU,IAAI,CAAC,QAAQ,CAAC,gBAAgB,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC,EAC3J,CAAC,gBAAgB,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,0BAA0B,CAAC,EAAE,CAAC,iBAAiB,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EACzI,CAAC,wBAAwB,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,iDAAiD,CAAC,CAAC,CAAC,IAAI,CAAC,CACrG,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC9B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;YAC5D,MAAM,MAAM,GAAG,IAAI,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;YACvD,MAAM,CAAC,IAAI,CACT,CAAC,oBAAoB,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC,4BAA4B,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAC/J,CAAC,mBAAmB,EAAE,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EACrK,CAAC,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAChD,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QACjC,CAAC;IACH,CAAC,CAAC,CAAC,CAAC;IAEN,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC;SAChC,WAAW,CAAC,kFAAkF,CAAC;SAC/F,MAAM,CAAC,WAAW,EAAE,uBAAuB,EAAE,KAAK,CAAC;SACnD,MAAM,CAAC,KAAK,EAAE,YAAoB,EAAE,OAAyB,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;QAC9I,MAAM,QAAQ,GAAG,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;QAChG,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,UAAU,QAAQ,CAAC,MAAM,WAAW,aAAa,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,QAAQ,CAAC,6BAA6B,eAAe,QAAQ,CAAC,mBAAmB,oBAAoB,CAAC,CAAC;QAChM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kHAAkH,CAAC,CAAC,CAAC;QAC9I,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,2BAA2B,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC5G,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QACxD,OAAO,SAAS,MAAM,CAAC,OAAO,kBAAkB,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,YAAY,CAAC,MAAM,kBAAkB,CAAC;IACjH,CAAC,CAAC,CAAC,CAAC;IAEN,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC;SAC9B,WAAW,CAAC,iEAAiE,CAAC;SAC9E,MAAM,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,CAAC;SACzC,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,OAA0B,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;QACpH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC/C,IAAI,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,EAAqB,CAAC,IAAI;YAAE,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC;QACpF,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,KAAK,MAAM,CAAC,4BAA4B,eAAe,MAAM,CAAC,gCAAgC,oCAAoC,CAAC,CAAC;IACtP,CAAC,CAAC,CAAC,CAAC;AACR,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=verify.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.test.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/ants/verify.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,51 @@
1
+ import assert from 'node:assert/strict';
2
+ import test, { mock } from 'node:test';
3
+ import { mkdtemp, rm, writeFile } from 'node:fs/promises';
4
+ import { tmpdir } from 'node:os';
5
+ import { join } from 'node:path';
6
+ import { Command } from 'commander';
7
+ import { AntsContext } from '@antseed/ants';
8
+ import { registerAntsVerifyCommand } from './verify.js';
9
+ test('verify inspects a seller by default and exposes submit and proof', () => {
10
+ const ants = new Command('ants');
11
+ registerAntsVerifyCommand(ants);
12
+ const verify = ants.commands.find((command) => command.name() === 'verify');
13
+ assert.ok(verify);
14
+ assert.equal(verify.registeredArguments[0]?.name(), 'seller');
15
+ assert.equal(verify.registeredArguments[0]?.required, false);
16
+ assert.deepEqual(verify.commands.map((command) => command.name()).sort(), ['proof', 'submit']);
17
+ });
18
+ test('verify submit asks for confirmation unless --yes is given', () => {
19
+ const ants = new Command('ants');
20
+ registerAntsVerifyCommand(ants);
21
+ const submit = ants.commands.find((command) => command.name() === 'verify').commands.find((command) => command.name() === 'submit');
22
+ assert.deepEqual(submit.registeredArguments.map((argument) => argument.name()), ['artifact']);
23
+ const yes = submit.options.find((option) => option.long === '--yes');
24
+ assert.ok(yes);
25
+ assert.equal(yes.defaultValue, false);
26
+ });
27
+ test('proof prints JSON when the parent consumes the nested --json flag', async () => {
28
+ const dataDir = await mkdtemp(join(tmpdir(), 'antseed-proof-json-'));
29
+ const config = join(dataDir, 'config.json');
30
+ await writeFile(config, JSON.stringify({ payments: { crypto: { chainId: 'base-local' } } }));
31
+ const ants = new Command('ants').option('--config <path>', 'config', config).option('--data-dir <path>', 'wallet', dataDir);
32
+ registerAntsVerifyCommand(ants);
33
+ const proofId = `0x${'a'.repeat(64)}`;
34
+ const status = { proofId, staged: true, finalized: false, authenticatedBlockReferenceCount: 2, authenticatedBlockChunkCount: 1 };
35
+ const selectRpc = mock.method(AntsContext.prototype, 'selectRpc', async () => { });
36
+ const registry = mock.method(AntsContext.prototype, 'washRegistry', () => ({ proofStatus: async () => status }));
37
+ const output = [];
38
+ const log = mock.method(console, 'log', (value) => { output.push(value); });
39
+ try {
40
+ await ants.parseAsync(['verify', 'proof', proofId, '--json'], { from: 'user' });
41
+ assert.equal(output.length, 1);
42
+ assert.deepEqual(JSON.parse(output[0]), status);
43
+ }
44
+ finally {
45
+ selectRpc.mock.restore();
46
+ registry.mock.restore();
47
+ log.mock.restore();
48
+ await rm(dataDir, { recursive: true, force: true });
49
+ }
50
+ });
51
+ //# sourceMappingURL=verify.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.test.js","sourceRoot":"","sources":["../../../../src/cli/commands/ants/verify.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { Command } from 'commander';
2
+ import { type WithdrawPreview } from '@antseed/ants';
3
+ export interface WithdrawOptions {
4
+ acceptSlashing: boolean;
5
+ yes: boolean;
6
+ preview: boolean;
7
+ }
8
+ export type WithdrawDecision = 'preview' | 'send' | 'confirm';
9
+ /**
10
+ * What to do after the estimate is shown: stop at the preview, send right
11
+ * away (matured positions, or an accepted early exit with --yes), or ask the
12
+ * user first. Early exits without --accept-slashing are refused.
13
+ */
14
+ export declare function withdrawDecision(preview: Pick<WithdrawPreview, 'earlyExit'>, options: WithdrawOptions): WithdrawDecision;
15
+ export declare function registerAntsWithdrawCommand(antsCmd: Command): void;
16
+ //# sourceMappingURL=withdraw.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withdraw.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/ants/withdraw.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,OAAO,EAAyC,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAG5F,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,OAAO,CAAC;IACxB,GAAG,EAAE,OAAO,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;AAE9D;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,EAAE,OAAO,EAAE,eAAe,GAAG,gBAAgB,CAKxH;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2BlE"}
@@ -0,0 +1,48 @@
1
+ import chalk from 'chalk';
2
+ import Table from 'cli-table3';
3
+ import { previewWithdraw, withdraw, formatAnts } from '@antseed/ants';
4
+ import { ants, confirm, parseIds, pct, runAction } from './shared.js';
5
+ /**
6
+ * What to do after the estimate is shown: stop at the preview, send right
7
+ * away (matured positions, or an accepted early exit with --yes), or ask the
8
+ * user first. Early exits without --accept-slashing are refused.
9
+ */
10
+ export function withdrawDecision(preview, options) {
11
+ if (options.preview)
12
+ return 'preview';
13
+ if (!preview.earlyExit)
14
+ return 'send';
15
+ if (!options.acceptSlashing)
16
+ throw new Error('Positions are still locked. Re-run with --accept-slashing to proceed.');
17
+ return options.yes ? 'send' : 'confirm';
18
+ }
19
+ export function registerAntsWithdrawCommand(antsCmd) {
20
+ antsCmd
21
+ .command('withdraw <ids...>')
22
+ .description('Withdraw positions (early exits burn part of the principal)')
23
+ .option('--accept-slashing', 'allow an early exit after reviewing the estimated burn', false)
24
+ .option('-y, --yes', 'skip the interactive confirmation (requires --accept-slashing for early exits)', false)
25
+ .option('--preview', 'only show the estimate', false)
26
+ .action(async (ids, options) => runAction(antsCmd, 'Checking positions...', async ({ ctx }, report, spinner) => {
27
+ const preview = await previewWithdraw(ctx, parseIds(ids));
28
+ spinner.stop();
29
+ const table = new Table({ head: ['ID', 'Amount', 'Slash', 'Burned', 'Returned'] });
30
+ for (const row of preview.positions) {
31
+ table.push([row.id, formatAnts(row.amount), pct(row.slashBps), formatAnts(row.slashedAmount), formatAnts(row.returnedAmount)]);
32
+ }
33
+ console.log(table.toString());
34
+ if (preview.earlyExit) {
35
+ console.log(chalk.red(`Estimated principal burned: ${ants(preview.totalSlashed)}. Final slashing is computed on-chain at confirmation.`));
36
+ }
37
+ const decision = withdrawDecision(preview, options);
38
+ if (decision === 'preview')
39
+ return 'Preview only; nothing sent';
40
+ if (decision === 'confirm' && !(await confirm(chalk.red(`Withdraw and burn about ${ants(preview.totalSlashed)}? [y/N] `)))) {
41
+ throw new Error('Withdrawal cancelled.');
42
+ }
43
+ spinner.start('Withdrawing...');
44
+ const result = await withdraw(ctx, { positionIds: parseIds(ids), acceptSlashing: options.acceptSlashing, maxSlashedAmount: preview.totalSlashed }, report);
45
+ return `Withdrew ${ids.length} position(s); returned about ${ants(result.preview.totalReturned)}`;
46
+ }));
47
+ }
48
+ //# sourceMappingURL=withdraw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withdraw.js","sourceRoot":"","sources":["../../../../src/cli/commands/ants/withdraw.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=withdraw.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withdraw.test.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/ants/withdraw.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,30 @@
1
+ import assert from 'node:assert/strict';
2
+ import test from 'node:test';
3
+ import { Command } from 'commander';
4
+ import { registerAntsWithdrawCommand, withdrawDecision } from './withdraw.js';
5
+ test('withdraw keeps the safety flags explicit and off by default', () => {
6
+ const ants = new Command('ants');
7
+ registerAntsWithdrawCommand(ants);
8
+ const withdraw = ants.commands.find((command) => command.name() === 'withdraw');
9
+ assert.ok(withdraw);
10
+ for (const flag of ['--accept-slashing', '--yes', '--preview']) {
11
+ const defaultValue = withdraw.options.find((entry) => entry.long === flag)?.defaultValue;
12
+ assert.equal(defaultValue, false, `${flag} defaults off`);
13
+ }
14
+ });
15
+ test('withdrawDecision sends matured positions without ceremony', () => {
16
+ assert.equal(withdrawDecision({ earlyExit: false }, { acceptSlashing: false, yes: false, preview: false }), 'send');
17
+ });
18
+ test('withdrawDecision refuses an early exit unless slashing is accepted', () => {
19
+ assert.throws(() => withdrawDecision({ earlyExit: true }, { acceptSlashing: false, yes: false, preview: false }), /--accept-slashing/);
20
+ assert.throws(() => withdrawDecision({ earlyExit: true }, { acceptSlashing: false, yes: true, preview: false }), /--accept-slashing/);
21
+ });
22
+ test('withdrawDecision asks before an accepted early exit unless --yes is given', () => {
23
+ assert.equal(withdrawDecision({ earlyExit: true }, { acceptSlashing: true, yes: false, preview: false }), 'confirm');
24
+ assert.equal(withdrawDecision({ earlyExit: true }, { acceptSlashing: true, yes: true, preview: false }), 'send');
25
+ });
26
+ test('withdrawDecision never sends in preview mode', () => {
27
+ assert.equal(withdrawDecision({ earlyExit: true }, { acceptSlashing: true, yes: true, preview: true }), 'preview');
28
+ assert.equal(withdrawDecision({ earlyExit: false }, { acceptSlashing: false, yes: false, preview: true }), 'preview');
29
+ });
30
+ //# sourceMappingURL=withdraw.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withdraw.test.js","sourceRoot":"","sources":["../../../../src/cli/commands/ants/withdraw.test.ts"],"names":[],"mappings":"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"}
@@ -6,5 +6,12 @@ export interface PendingEmissions {
6
6
  }
7
7
  export declare function pastEpochs(currentEpoch: number): number[];
8
8
  export declare function claimablePendingForRole(pending: PendingEmissions, role: EmissionsRole): bigint;
9
+ export declare function selectedEmissionStacks(options: {
10
+ legacyOnly?: boolean;
11
+ newOnly?: boolean;
12
+ }): {
13
+ legacy: boolean;
14
+ recognized: boolean;
15
+ };
9
16
  export declare function registerEmissionsCommand(parentCmd: Command, role: EmissionsRole): void;
10
17
  //# sourceMappingURL=emissions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"emissions.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/emissions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWzC,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE/C,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,CAEzD;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,CAE9F;AAUD,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,CAqFtF"}
1
+ {"version":3,"file":"emissions.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/emissions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoBzC,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE/C,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,CAEzD;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,CAE9F;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAMrI;AAUD,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,CA+JtF"}