@antseed/cli 0.1.157 → 0.1.159

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 (285) hide show
  1. package/README.md +158 -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/buyer/start.d.ts.map +1 -1
  167. package/dist/cli/commands/buyer/start.js +7 -1
  168. package/dist/cli/commands/buyer/start.js.map +1 -1
  169. package/dist/cli/commands/emissions.d.ts +7 -0
  170. package/dist/cli/commands/emissions.d.ts.map +1 -1
  171. package/dist/cli/commands/emissions.js +105 -27
  172. package/dist/cli/commands/emissions.js.map +1 -1
  173. package/dist/cli/commands/emissions.test.js +7 -1
  174. package/dist/cli/commands/emissions.test.js.map +1 -1
  175. package/dist/cli/commands/network/browse.d.ts.map +1 -1
  176. package/dist/cli/commands/network/browse.js +12 -3
  177. package/dist/cli/commands/network/browse.js.map +1 -1
  178. package/dist/cli/commands/network/chain-config-helper.d.ts +21 -1
  179. package/dist/cli/commands/network/chain-config-helper.d.ts.map +1 -1
  180. package/dist/cli/commands/network/chain-config-helper.js +6 -1
  181. package/dist/cli/commands/network/chain-config-helper.js.map +1 -1
  182. package/dist/cli/commands/network/peer.d.ts.map +1 -1
  183. package/dist/cli/commands/network/peer.js +21 -1
  184. package/dist/cli/commands/network/peer.js.map +1 -1
  185. package/dist/cli/commands/parse-positive-integer.d.ts +2 -0
  186. package/dist/cli/commands/parse-positive-integer.d.ts.map +1 -0
  187. package/dist/cli/commands/parse-positive-integer.js +9 -0
  188. package/dist/cli/commands/parse-positive-integer.js.map +1 -0
  189. package/dist/cli/commands/reward-actions.d.ts +11 -0
  190. package/dist/cli/commands/reward-actions.d.ts.map +1 -0
  191. package/dist/cli/commands/reward-actions.js +22 -0
  192. package/dist/cli/commands/reward-actions.js.map +1 -0
  193. package/dist/cli/commands/seller/contract-clients.test.d.ts +2 -0
  194. package/dist/cli/commands/seller/contract-clients.test.d.ts.map +1 -0
  195. package/dist/cli/commands/seller/contract-clients.test.js +46 -0
  196. package/dist/cli/commands/seller/contract-clients.test.js.map +1 -0
  197. package/dist/cli/commands/seller/index.d.ts.map +1 -1
  198. package/dist/cli/commands/seller/index.js +4 -2
  199. package/dist/cli/commands/seller/index.js.map +1 -1
  200. package/dist/cli/commands/seller/pool.d.ts +15 -0
  201. package/dist/cli/commands/seller/pool.d.ts.map +1 -0
  202. package/dist/cli/commands/seller/pool.js +201 -0
  203. package/dist/cli/commands/seller/pool.js.map +1 -0
  204. package/dist/cli/commands/seller/pool.test.d.ts +2 -0
  205. package/dist/cli/commands/seller/pool.test.d.ts.map +1 -0
  206. package/dist/cli/commands/seller/pool.test.js +16 -0
  207. package/dist/cli/commands/seller/pool.test.js.map +1 -0
  208. package/dist/cli/commands/seller/register.d.ts.map +1 -1
  209. package/dist/cli/commands/seller/register.js +38 -8
  210. package/dist/cli/commands/seller/register.js.map +1 -1
  211. package/dist/cli/commands/seller/rewards.d.ts +13 -0
  212. package/dist/cli/commands/seller/rewards.d.ts.map +1 -0
  213. package/dist/cli/commands/seller/rewards.js +115 -0
  214. package/dist/cli/commands/seller/rewards.js.map +1 -0
  215. package/dist/cli/commands/seller/rewards.test.d.ts +2 -0
  216. package/dist/cli/commands/seller/rewards.test.d.ts.map +1 -0
  217. package/dist/cli/commands/seller/rewards.test.js +21 -0
  218. package/dist/cli/commands/seller/rewards.test.js.map +1 -0
  219. package/dist/cli/commands/seller/setup.d.ts.map +1 -1
  220. package/dist/cli/commands/seller/setup.js +2 -1
  221. package/dist/cli/commands/seller/setup.js.map +1 -1
  222. package/dist/cli/commands/seller/stake.d.ts.map +1 -1
  223. package/dist/cli/commands/seller/stake.js +104 -65
  224. package/dist/cli/commands/seller/stake.js.map +1 -1
  225. package/dist/cli/commands/seller/stake.test.d.ts +2 -0
  226. package/dist/cli/commands/seller/stake.test.d.ts.map +1 -0
  227. package/dist/cli/commands/seller/stake.test.js +99 -0
  228. package/dist/cli/commands/seller/stake.test.js.map +1 -0
  229. package/dist/cli/commands/seller/start.d.ts.map +1 -1
  230. package/dist/cli/commands/seller/start.js +6 -0
  231. package/dist/cli/commands/seller/start.js.map +1 -1
  232. package/dist/cli/commands/seller/status.d.ts.map +1 -1
  233. package/dist/cli/commands/seller/status.js +44 -2
  234. package/dist/cli/commands/seller/status.js.map +1 -1
  235. package/dist/cli/index.js +2 -0
  236. package/dist/cli/index.js.map +1 -1
  237. package/dist/cli/payment-utils.d.ts +33 -2
  238. package/dist/cli/payment-utils.d.ts.map +1 -1
  239. package/dist/cli/payment-utils.js +101 -2
  240. package/dist/cli/payment-utils.js.map +1 -1
  241. package/dist/config/types.d.ts +20 -0
  242. package/dist/config/types.d.ts.map +1 -1
  243. package/dist/plugins/verifier-evidence.test.d.ts +2 -0
  244. package/dist/plugins/verifier-evidence.test.d.ts.map +1 -0
  245. package/dist/plugins/verifier-evidence.test.js +41 -0
  246. package/dist/plugins/verifier-evidence.test.js.map +1 -0
  247. package/dist/plugins/verifier.d.ts +8 -10
  248. package/dist/plugins/verifier.d.ts.map +1 -1
  249. package/dist/plugins/verifier.js +23 -51
  250. package/dist/plugins/verifier.js.map +1 -1
  251. package/dist/plugins/verifier.test.js +1 -37
  252. package/dist/plugins/verifier.test.js.map +1 -1
  253. package/dist/proxy/buyer-proxy.d.ts +2 -1
  254. package/dist/proxy/buyer-proxy.d.ts.map +1 -1
  255. package/dist/proxy/buyer-proxy.js +104 -28
  256. package/dist/proxy/buyer-proxy.js.map +1 -1
  257. package/dist/proxy/buyer-proxy.test.js +177 -19
  258. package/dist/proxy/buyer-proxy.test.js.map +1 -1
  259. package/dist/proxy/network-models.d.ts +1 -2
  260. package/dist/proxy/network-models.d.ts.map +1 -1
  261. package/dist/proxy/network-models.js +10 -23
  262. package/dist/proxy/network-models.js.map +1 -1
  263. package/dist/proxy/network-models.test.js +56 -27
  264. package/dist/proxy/network-models.test.js.map +1 -1
  265. package/dist/proxy/tee-control.d.ts +14 -0
  266. package/dist/proxy/tee-control.d.ts.map +1 -0
  267. package/dist/proxy/tee-control.js +100 -0
  268. package/dist/proxy/tee-control.js.map +1 -0
  269. package/dist/proxy/tee-control.test.d.ts +2 -0
  270. package/dist/proxy/tee-control.test.d.ts.map +1 -0
  271. package/dist/proxy/tee-control.test.js +56 -0
  272. package/dist/proxy/tee-control.test.js.map +1 -0
  273. package/dist/proxy/tee-verification.d.ts +24 -0
  274. package/dist/proxy/tee-verification.d.ts.map +1 -0
  275. package/dist/proxy/tee-verification.js +128 -0
  276. package/dist/proxy/tee-verification.js.map +1 -0
  277. package/dist/proxy/tee-verification.test.d.ts +2 -0
  278. package/dist/proxy/tee-verification.test.d.ts.map +1 -0
  279. package/dist/proxy/tee-verification.test.js +241 -0
  280. package/dist/proxy/tee-verification.test.js.map +1 -0
  281. package/package.json +8 -6
  282. package/dist/cli/commands/seller/emissions.d.ts +0 -3
  283. package/dist/cli/commands/seller/emissions.d.ts.map +0 -1
  284. package/dist/cli/commands/seller/emissions.js +0 -5
  285. package/dist/cli/commands/seller/emissions.js.map +0 -1
@@ -0,0 +1,93 @@
1
+ import { parsePositiveInteger } from '../parse-positive-integer.js';
2
+ import chalk from 'chalk';
3
+ import { rewards, claim, restake, stakeUsageRewards, compound, formatAnts } from '@antseed/ants';
4
+ import { ants, parseIds, printJson, runAction, runRead } from './shared.js';
5
+ export const REWARD_BUCKETS = ['staker', 'seller', 'buyer', 'legacy', 'locked'];
6
+ /** Buckets selected by `--staker/--seller/...` flags; an empty list means every bucket. */
7
+ export function selectedBuckets(options) {
8
+ return REWARD_BUCKETS.filter((bucket) => options[bucket] === true);
9
+ }
10
+ export function parseUsageSide(side) {
11
+ if (side !== 'seller' && side !== 'buyer')
12
+ throw new Error('--side must be seller or buyer.');
13
+ return side;
14
+ }
15
+ export function compoundSummary(result) {
16
+ const parts = [
17
+ result.restakedPositionIds.length ? `staker rewards from ${result.restakedPositionIds.length} position(s)` : '',
18
+ result.sellerEpochs.length ? `seller usage for ${result.sellerEpochs.length} epoch(s)` : '',
19
+ result.buyerEpochs.length ? `buyer usage for ${result.buyerEpochs.length} epoch(s)` : '',
20
+ result.movedPositionIds.length ? `moved ${result.movedPositionIds.length} position(s) to agent ${result.targetAgentId}` : '',
21
+ ].filter(Boolean);
22
+ return `Compounded ${parts.join(', ')} across ${result.transactions.length} transaction(s)`;
23
+ }
24
+ export function registerAntsRewardsCommand(antsCmd) {
25
+ const rewardsCmd = antsCmd
26
+ .command('rewards')
27
+ .description('View or claim ANTS rewards (staker, seller usage, buyer usage, legacy, locked)');
28
+ rewardsCmd
29
+ .option('--json', 'output as JSON', false)
30
+ .action(async (options) => runRead(antsCmd, 'Loading rewards...', async ({ ctx }) => {
31
+ const view = await rewards(ctx);
32
+ if (options.json)
33
+ return printJson(view);
34
+ console.log(chalk.bold('ANTS rewards\n'));
35
+ const line = (label, amount, note = '') => {
36
+ console.log(` ${label.padEnd(28)} ${chalk.green(ants(amount).padStart(24))} ${chalk.dim(note)}`);
37
+ };
38
+ line('Staker pool rewards', view.staker.total, view.staker.positions.length ? `${view.staker.positions.length} position(s)` : '');
39
+ line('Seller usage rewards', view.sellerUsage.total, view.sellerUsage.agentId ? `agent ${view.sellerUsage.agentId}` : 'no seller agent');
40
+ line('Buyer usage rewards', view.buyerUsage.total, view.buyerUsage.operator && !view.buyerUsage.claimable ? `paid to operator ${view.buyerUsage.operator}` : '');
41
+ line('Legacy seller emissions', view.legacy.seller, view.legacy.contract ?? '');
42
+ line('Legacy buyer emissions', view.legacy.buyer);
43
+ line('Locked legacy pool (claimable)', view.locked.claimable, `${formatAnts(view.locked.locked)} locked${view.locked.policy ? '' : ', release policy not installed (M002)'}`);
44
+ console.log(` ${'Total claimable'.padEnd(28)} ${chalk.bold(ants(view.total).padStart(24))}`);
45
+ for (const position of view.staker.positions.filter((entry) => BigInt(entry.amount) > 0n)) {
46
+ console.log(chalk.dim(` position ${position.id} (agent ${position.agentId}): ${formatAnts(position.amount)}${position.closed ? ', closed' : ''}`));
47
+ }
48
+ console.log(chalk.dim('\nClaim with: antseed ants rewards claim [--staker|--seller|--buyer|--legacy|--locked]. Compound with: antseed ants rewards restake --epochs <n>.'));
49
+ }));
50
+ rewardsCmd
51
+ .command('claim')
52
+ .description('Claim pending rewards into the wallet (all buckets unless filtered)')
53
+ .option('--staker', 'staker pool rewards', false)
54
+ .option('--seller', 'seller usage rewards', false)
55
+ .option('--buyer', 'buyer usage rewards', false)
56
+ .option('--legacy', 'legacy V2 emissions', false)
57
+ .option('--locked', 'locked legacy pool release', false)
58
+ .option('--recipient <address>', 'send claimed ANTS to another address (staker and locked buckets only)')
59
+ .action(async (options) => runAction(antsCmd, 'Claiming rewards...', async ({ ctx }, report) => {
60
+ const result = await claim(ctx, { buckets: selectedBuckets(options), recipient: options.recipient }, report);
61
+ if (result.transactions.length === 0)
62
+ return 'No pending rewards to claim';
63
+ return `Claimed ${ants(result.claimed)} across ${result.transactions.length} transaction(s)`;
64
+ }));
65
+ rewardsCmd
66
+ .command('restake [ids...]')
67
+ .description('Compound staker rewards into a new locked position (earns the restake weight bonus)')
68
+ .requiredOption('--epochs <n>', 'lock length for the new position', parsePositiveInteger)
69
+ .action(async (ids, options) => runAction(antsCmd, 'Restaking rewards...', async ({ ctx }, report) => {
70
+ const result = await restake(ctx, { positionIds: ids.length ? parseIds(ids) : undefined, epochs: options.epochs }, report);
71
+ return `Restaked rewards from position(s) ${result.positionIds.join(', ')} for ${result.epochs} epoch(s)`;
72
+ }));
73
+ rewardsCmd
74
+ .command('compound')
75
+ .description('Restake every restakable reward (staker pool, seller usage, buyer usage when operator) into new locked positions')
76
+ .requiredOption('--epochs <n>', 'lock length for the new positions', parsePositiveInteger)
77
+ .option('--to <agentId>', 'pool to hold the new positions (restaked in place, then moved; default: each reward\'s own pool)', parsePositiveInteger)
78
+ .action(async (options) => runAction(antsCmd, 'Compounding rewards...', async ({ ctx }, report) => {
79
+ const result = await compound(ctx, { epochs: options.epochs, targetAgentId: options.to }, report);
80
+ return compoundSummary(result);
81
+ }));
82
+ rewardsCmd
83
+ .command('stake-usage')
84
+ .description('Claim usage rewards straight into a new locked position instead of the wallet')
85
+ .requiredOption('--side <seller|buyer>', 'which usage rewards to stake')
86
+ .requiredOption('--epochs <n>', 'lock length for the new position', parsePositiveInteger)
87
+ .option('--agent <agentId>', 'destination pool for buyer rewards (sellers stake into their own agent)', parsePositiveInteger)
88
+ .action(async (options) => runAction(antsCmd, 'Staking usage rewards...', async ({ ctx }, report) => {
89
+ const result = await stakeUsageRewards(ctx, { side: parseUsageSide(options.side), epochs: options.epochs, stakeAgentId: options.agent }, report);
90
+ return `Staked usage rewards for epoch(s) ${result.epochsStaked.join(', ')}`;
91
+ }));
92
+ }
93
+ //# sourceMappingURL=rewards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewards.js","sourceRoot":"","sources":["../../../../src/cli/commands/ants/rewards.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=rewards.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewards.test.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/ants/rewards.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,46 @@
1
+ import assert from 'node:assert/strict';
2
+ import test from 'node:test';
3
+ import { Command } from 'commander';
4
+ import { compoundSummary, parseUsageSide, registerAntsRewardsCommand, selectedBuckets } from './rewards.js';
5
+ function rewardsCommand() {
6
+ const ants = new Command('ants');
7
+ registerAntsRewardsCommand(ants);
8
+ return ants.commands.find((command) => command.name() === 'rewards');
9
+ }
10
+ test('rewards exposes claim, restake, compound, and stake-usage', () => {
11
+ const rewards = rewardsCommand();
12
+ assert.ok(rewards);
13
+ assert.deepEqual(rewards.commands.map((command) => command.name()).sort(), ['claim', 'compound', 'restake', 'stake-usage']);
14
+ assert.ok(rewards.options.some((option) => option.long === '--json'));
15
+ });
16
+ test('claim has one flag per reward bucket', () => {
17
+ const claim = rewardsCommand().commands.find((command) => command.name() === 'claim');
18
+ const flags = claim.options.map((option) => option.long);
19
+ for (const bucket of ['--staker', '--seller', '--buyer', '--legacy', '--locked', '--recipient'])
20
+ assert.ok(flags.includes(bucket), bucket);
21
+ });
22
+ test('restake and compound require a lock length; compound can retarget with --to', () => {
23
+ const rewards = rewardsCommand();
24
+ const restake = rewards.commands.find((command) => command.name() === 'restake');
25
+ const compound = rewards.commands.find((command) => command.name() === 'compound');
26
+ assert.ok(restake.options.find((option) => option.long === '--epochs')?.mandatory);
27
+ assert.ok(compound.options.find((option) => option.long === '--epochs')?.mandatory);
28
+ assert.ok(compound.options.some((option) => option.long === '--to'));
29
+ assert.equal(restake.registeredArguments[0]?.name(), 'ids');
30
+ assert.equal(restake.registeredArguments[0]?.required, false);
31
+ });
32
+ test('selectedBuckets keeps only the flags that were set, in bucket order', () => {
33
+ assert.deepEqual(selectedBuckets({}), []);
34
+ assert.deepEqual(selectedBuckets({ locked: true, staker: true, buyer: false }), ['staker', 'locked']);
35
+ });
36
+ test('parseUsageSide only accepts seller or buyer', () => {
37
+ assert.equal(parseUsageSide('seller'), 'seller');
38
+ assert.equal(parseUsageSide('buyer'), 'buyer');
39
+ assert.throws(() => parseUsageSide('operator'), /--side must be seller or buyer/);
40
+ });
41
+ test('compoundSummary lists only the parts that happened', () => {
42
+ const base = { transactions: ['0x1', '0x2'], restakedPositionIds: [3, 4], sellerEpochs: [22], buyerEpochs: [], newPositionIds: [9, 10], movedPositionIds: [9, 10], targetAgentId: 7 };
43
+ assert.equal(compoundSummary(base), 'Compounded staker rewards from 2 position(s), seller usage for 1 epoch(s), moved 2 position(s) to agent 7 across 2 transaction(s)');
44
+ assert.equal(compoundSummary({ ...base, sellerEpochs: [], movedPositionIds: [], targetAgentId: null }), 'Compounded staker rewards from 2 position(s) across 2 transaction(s)');
45
+ });
46
+ //# sourceMappingURL=rewards.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewards.test.js","sourceRoot":"","sources":["../../../../src/cli/commands/ants/rewards.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerAntsSellerCommand(antsCmd: Command): void;
3
+ //# sourceMappingURL=seller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seller.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/ants/seller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiChE"}
@@ -0,0 +1,32 @@
1
+ import { parsePositiveInteger } from '../parse-positive-integer.js';
2
+ import Table from 'cli-table3';
3
+ import { seller, registerBinding, claimStarter, formatUsdc, formatAntsExact } from '@antseed/ants';
4
+ import { ants, printJson, runAction, runRead } from './shared.js';
5
+ export function registerAntsSellerCommand(antsCmd) {
6
+ const sellerCmd = antsCmd.command('seller').description('Seller-side staking state: identity binding, eligibility, starter grant');
7
+ sellerCmd.option('--json', 'output as JSON', false).action(async (options) => runRead(antsCmd, 'Loading seller state...', async ({ ctx }) => {
8
+ const view = await seller(ctx);
9
+ if (options.json)
10
+ return printJson(view);
11
+ const table = new Table({ head: ['Field', 'Value'] });
12
+ table.push(['Wallet', view.address], ['Agent ID', view.agentId || 'none'], ['ERC-8004 identity', view.identityRegistered ? 'registered' : 'not registered'], ['Seller registry binding', view.registryBound ? 'bound' : 'not bound (run: antseed seller register)'], ['Eligible to serve', view.eligible ? 'yes' : 'no'], ['Legacy USDC stake', `${formatUsdc(view.legacyStake)} USDC${view.legacyEligibilityEnabled === false ? ' (legacy fallback disabled)' : ''}`], ['Pool active stake', `${ants(view.poolActiveStake)}${view.minPoolStake ? ` (minimum ${formatAntsExact(view.minPoolStake)} ANTS)` : ''}`]);
13
+ if (view.starter) {
14
+ table.push(['Starter grant', view.starter.initialized ? 'already claimed' : view.starter.claimable ? `claimable: ${ants(view.starter.amount)} locked through epoch ${view.starter.endEpoch}` : view.starter.expired ? 'closed' : !view.starter.legacyEligible ? 'requires legacy USDC stake at or above the minimum' : 'faucet empty']);
15
+ }
16
+ console.log(table.toString());
17
+ }));
18
+ sellerCmd.command('register')
19
+ .description('Bind your agent ID in the seller registry (same as: antseed seller register)')
20
+ .option('--agent-id <id>', 'agent ID to bind (default: legacy staking binding)', parsePositiveInteger)
21
+ .action(async (options) => runAction(antsCmd, 'Registering...', async ({ ctx }, report) => {
22
+ const result = await registerBinding(ctx, options.agentId, report);
23
+ return result.sent ? `Agent ${result.agentId} bound to this wallet` : `Agent ${result.agentId} was already bound`;
24
+ }));
25
+ sellerCmd.command('claim-starter')
26
+ .description('Claim the legacy-seller starter ANTS position (same as: antseed seller legacy claim-starter)')
27
+ .action(async () => runAction(antsCmd, 'Claiming starter position...', async ({ ctx }, report) => {
28
+ const result = await claimStarter(ctx, report);
29
+ return `Starter position created for agent ${result.agentId}: ${ants(result.amount)} locked through epoch ${result.endEpoch}`;
30
+ }));
31
+ }
32
+ //# sourceMappingURL=seller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seller.js","sourceRoot":"","sources":["../../../../src/cli/commands/ants/seller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=seller.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seller.test.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/ants/seller.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ import assert from 'node:assert/strict';
2
+ import test from 'node:test';
3
+ import { Command } from 'commander';
4
+ import { registerAntsSellerCommand } from './seller.js';
5
+ test('seller shows state by default and exposes register and claim-starter', () => {
6
+ const ants = new Command('ants');
7
+ registerAntsSellerCommand(ants);
8
+ const seller = ants.commands.find((command) => command.name() === 'seller');
9
+ assert.ok(seller);
10
+ assert.ok(seller.options.some((option) => option.long === '--json'));
11
+ assert.deepEqual(seller.commands.map((command) => command.name()).sort(), ['claim-starter', 'register']);
12
+ const register = seller.commands.find((command) => command.name() === 'register');
13
+ assert.ok(register.options.some((option) => option.long === '--agent-id'));
14
+ assert.equal(register.options.find((option) => option.long === '--agent-id')?.mandatory, false);
15
+ });
16
+ //# sourceMappingURL=seller.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seller.test.js","sourceRoot":"","sources":["../../../../src/cli/commands/ants/seller.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,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAExD,IAAI,CAAC,sEAAsE,EAAE,GAAG,EAAE;IAChF,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;IACrE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC,CAAC;IACzG,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,UAAU,CAAE,CAAC;IACnF,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC;IAC3E,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;AAClG,CAAC,CAAC,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { Command } from 'commander';
2
+ import { type Ora } from 'ora';
3
+ import { AntsContext, type StepReporter } from '@antseed/ants';
4
+ import type { AntsChainConfig } from '@antseed/ants';
5
+ export interface AntsCommandContext {
6
+ ctx: AntsContext;
7
+ chain: AntsChainConfig;
8
+ dataDir: string;
9
+ configPath: string;
10
+ }
11
+ /** Build the ANTS service context from the CLI config and the node identity wallet. */
12
+ export declare function loadAntsContext(command: Command): Promise<AntsCommandContext>;
13
+ export declare function printJson(value: unknown): void;
14
+ export declare function ants(baseUnits: string | bigint, digits?: number): string;
15
+ export declare function explorerTx(evmChainId: number, hash: string): string;
16
+ /** Spinner-backed reporter: each step becomes a line, transaction hashes are printed dimmed. */
17
+ export declare function spinnerReporter(spinner: Ora, evmChainId: number): StepReporter;
18
+ export declare function runAction(command: Command, title: string, work: (context: AntsCommandContext, report: StepReporter, spinner: Ora) => Promise<string | void>): Promise<void>;
19
+ export declare function runRead(command: Command, title: string, work: (context: AntsCommandContext) => Promise<void>): Promise<void>;
20
+ export declare function parseIds(raw: string[]): number[];
21
+ export declare function epochDate(genesis: number, epochDuration: number, epoch: number): string;
22
+ export declare function pct(bps: number): string;
23
+ export declare function confirm(question: string): Promise<boolean>;
24
+ /** USDC base units (6 decimals) as a dollar string, e.g. 1234567 → "$1.23". */
25
+ export declare function usdc(baseUnits: string | bigint, digits?: number): string;
26
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/ants/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAY,EAAE,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,WAAW,EAA4B,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAIzF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,WAAW,CAAC;IACjB,KAAK,EAAE,eAAe,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,uFAAuF;AACvF,wBAAsB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAQnF;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAE9C;AAED,wBAAgB,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,SAAI,GAAG,MAAM,CAEnE;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAInE;AAED,gGAAgG;AAChG,wBAAgB,eAAe,CAAC,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY,CAU9E;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAUjL;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAUlI;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAEhD;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEvF;AAED,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEvC;AAED,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAYhE;AAED,+EAA+E;AAC/E,wBAAgB,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,SAAI,GAAG,MAAM,CAEnE"}
@@ -0,0 +1,94 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { AntsContext, formatAnts, jsonReplacer } from '@antseed/ants';
4
+ import { getGlobalOptions } from '../types.js';
5
+ import { loadConfig } from '../../../config/loader.js';
6
+ import { loadCryptoContext, requireCryptoConfig } from '../../payment-utils.js';
7
+ /** Build the ANTS service context from the CLI config and the node identity wallet. */
8
+ export async function loadAntsContext(command) {
9
+ const global = getGlobalOptions(command);
10
+ const config = await loadConfig(global.config);
11
+ const chain = requireCryptoConfig(config);
12
+ const { wallet, address } = await loadCryptoContext(global.dataDir);
13
+ const ctx = new AntsContext({ chain, address, signer: wallet });
14
+ await ctx.selectRpc();
15
+ return { ctx, chain: ctx.chain, dataDir: global.dataDir, configPath: global.config };
16
+ }
17
+ export function printJson(value) {
18
+ console.log(JSON.stringify(value, jsonReplacer, 2));
19
+ }
20
+ export function ants(baseUnits, digits = 4) {
21
+ return `${formatAnts(baseUnits, digits)} ANTS`;
22
+ }
23
+ export function explorerTx(evmChainId, hash) {
24
+ if (evmChainId === 8453)
25
+ return `https://basescan.org/tx/${hash}`;
26
+ if (evmChainId === 84532)
27
+ return `https://sepolia.basescan.org/tx/${hash}`;
28
+ return hash;
29
+ }
30
+ /** Spinner-backed reporter: each step becomes a line, transaction hashes are printed dimmed. */
31
+ export function spinnerReporter(spinner, evmChainId) {
32
+ return (label, hash) => {
33
+ if (hash) {
34
+ spinner.stopAndPersist({ symbol: chalk.green('✔'), text: label });
35
+ console.log(chalk.dim(` ${explorerTx(evmChainId, hash)}`));
36
+ spinner.start();
37
+ }
38
+ else {
39
+ spinner.text = label;
40
+ }
41
+ };
42
+ }
43
+ export async function runAction(command, title, work) {
44
+ const spinner = ora(title).start();
45
+ try {
46
+ const context = await loadAntsContext(command);
47
+ const summary = await work(context, spinnerReporter(spinner, context.chain.evmChainId), spinner);
48
+ spinner.succeed(chalk.green(summary ?? 'Done'));
49
+ }
50
+ catch (error) {
51
+ spinner.fail(chalk.red(error.message));
52
+ process.exitCode = 1;
53
+ }
54
+ }
55
+ export async function runRead(command, title, work) {
56
+ const spinner = ora(title).start();
57
+ try {
58
+ const context = await loadAntsContext(command);
59
+ spinner.stop();
60
+ await work(context);
61
+ }
62
+ catch (error) {
63
+ spinner.fail(chalk.red(error.message));
64
+ process.exitCode = 1;
65
+ }
66
+ }
67
+ export function parseIds(raw) {
68
+ return raw.map((value) => Number(value));
69
+ }
70
+ export function epochDate(genesis, epochDuration, epoch) {
71
+ return new Date((genesis + epoch * epochDuration) * 1000).toISOString().replace('T', ' ').slice(0, 16) + ' UTC';
72
+ }
73
+ export function pct(bps) {
74
+ return `${(bps / 100).toFixed(2).replace(/\.?0+$/, '')}%`;
75
+ }
76
+ export async function confirm(question) {
77
+ if (!process.stdin.isTTY || !process.stdout.isTTY) {
78
+ throw new Error('This action needs interactive confirmation. Re-run in a terminal or pass --yes after reviewing the estimate.');
79
+ }
80
+ const { createInterface } = await import('node:readline/promises');
81
+ const input = createInterface({ input: process.stdin, output: process.stdout });
82
+ try {
83
+ const answer = await input.question(question);
84
+ return ['y', 'yes'].includes(answer.trim().toLowerCase());
85
+ }
86
+ finally {
87
+ input.close();
88
+ }
89
+ }
90
+ /** USDC base units (6 decimals) as a dollar string, e.g. 1234567 → "$1.23". */
91
+ export function usdc(baseUnits, digits = 2) {
92
+ return `$${(Number(baseUnits) / 1e6).toLocaleString('en-US', { maximumFractionDigits: digits })}`;
93
+ }
94
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../src/cli/commands/ants/shared.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=shared.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.test.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/ants/shared.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ import assert from 'node:assert/strict';
2
+ import test from 'node:test';
3
+ import { ants, epochDate, explorerTx, parseIds, pct, usdc } from './shared.js';
4
+ test('parseIds turns positional strings into numbers', () => {
5
+ assert.deepEqual(parseIds(['1', '7']), [1, 7]);
6
+ });
7
+ test('pct trims trailing zeros from basis points', () => {
8
+ assert.equal(pct(2916), '29.16%');
9
+ assert.equal(pct(5000), '50%');
10
+ assert.equal(pct(0), '0%');
11
+ });
12
+ test('epochDate resolves an epoch boundary to a UTC timestamp', () => {
13
+ assert.equal(epochDate(1_775_728_461, 604_800, 22), '2026-09-10 09:54 UTC');
14
+ });
15
+ test('ants and usdc format base units with their unit', () => {
16
+ assert.equal(ants('1500000000000000000'), '1.5 ANTS');
17
+ assert.equal(usdc('1234567'), '$1.23');
18
+ assert.equal(usdc('1234567', 0), '$1');
19
+ });
20
+ test('explorerTx links Base mainnet and Sepolia, and falls back to the raw hash', () => {
21
+ assert.equal(explorerTx(8453, '0xabc'), 'https://basescan.org/tx/0xabc');
22
+ assert.equal(explorerTx(84532, '0xabc'), 'https://sepolia.basescan.org/tx/0xabc');
23
+ assert.equal(explorerTx(31337, '0xabc'), '0xabc');
24
+ });
25
+ //# sourceMappingURL=shared.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.test.js","sourceRoot":"","sources":["../../../../src/cli/commands/ants/shared.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAE/E,IAAI,CAAC,gDAAgD,EAAE,GAAG,EAAE;IAC1D,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,4CAA4C,EAAE,GAAG,EAAE;IACtD,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;IAClC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;IAC/B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAC7B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yDAAyD,EAAE,GAAG,EAAE;IACnE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,aAAa,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,sBAAsB,CAAC,CAAC;AAC9E,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iDAAiD,EAAE,GAAG,EAAE;IAC3D,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,EAAE,UAAU,CAAC,CAAC;IACtD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;IACvC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,2EAA2E,EAAE,GAAG,EAAE;IACrF,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,+BAA+B,CAAC,CAAC;IACzE,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,uCAAuC,CAAC,CAAC;IAClF,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;AACpD,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerAntsSplitCommand(antsCmd: Command): void;
3
+ //# sourceMappingURL=split.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"split.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/ants/split.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAQ/D"}
@@ -0,0 +1,12 @@
1
+ import { split } from '@antseed/ants';
2
+ import { runAction } from './shared.js';
3
+ export function registerAntsSplitCommand(antsCmd) {
4
+ antsCmd
5
+ .command('split <id> <amount>')
6
+ .description('Split ANTS out of a position into a second position with the same terms')
7
+ .action(async (id, amount) => runAction(antsCmd, 'Splitting position...', async ({ ctx }, report) => {
8
+ await split(ctx, { positionId: Number(id), amount }, report);
9
+ return `Split ${amount} ANTS out of position ${id}; both parts take effect next epoch`;
10
+ }));
11
+ }
12
+ //# sourceMappingURL=split.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"split.js","sourceRoot":"","sources":["../../../../src/cli/commands/ants/split.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,UAAU,wBAAwB,CAAC,OAAgB;IACvD,OAAO;SACJ,OAAO,CAAC,qBAAqB,CAAC;SAC9B,WAAW,CAAC,yEAAyE,CAAC;SACtF,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,MAAc,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,uBAAuB,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE;QAClH,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC;QAC7D,OAAO,SAAS,MAAM,yBAAyB,EAAE,qCAAqC,CAAC;IACzF,CAAC,CAAC,CAAC,CAAC;AACR,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=split.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"split.test.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/ants/split.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ import assert from 'node:assert/strict';
2
+ import test from 'node:test';
3
+ import { Command } from 'commander';
4
+ import { registerAntsSplitCommand } from './split.js';
5
+ test('split takes a position id and the amount to carve out', () => {
6
+ const ants = new Command('ants');
7
+ registerAntsSplitCommand(ants);
8
+ const split = ants.commands.find((command) => command.name() === 'split');
9
+ assert.ok(split);
10
+ assert.deepEqual(split.registeredArguments.map((argument) => argument.name()), ['id', 'amount']);
11
+ assert.ok(split.registeredArguments.every((argument) => argument.required));
12
+ });
13
+ //# sourceMappingURL=split.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"split.test.js","sourceRoot":"","sources":["../../../../src/cli/commands/ants/split.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,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAEtD,IAAI,CAAC,uDAAuD,EAAE,GAAG,EAAE;IACjE,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,CAAC,SAAS,CAAC,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IACjG,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC9E,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerAntsStakeCommand(antsCmd: Command): void;
3
+ //# sourceMappingURL=stake.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stake.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/ants/stake.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAU/D"}
@@ -0,0 +1,15 @@
1
+ import { parsePositiveInteger } from '../parse-positive-integer.js';
2
+ import { stake } from '@antseed/ants';
3
+ import { ants, runAction } from './shared.js';
4
+ export function registerAntsStakeCommand(antsCmd) {
5
+ antsCmd
6
+ .command('stake <amount>')
7
+ .description('Stake ANTS into a seller agent pool (creates a locked lANTS position)')
8
+ .requiredOption('--agent <agentId>', 'agent ID of the seller pool', parsePositiveInteger)
9
+ .requiredOption('--epochs <n>', 'lock length in epochs (1 epoch = 1 week)', parsePositiveInteger)
10
+ .action(async (amount, options) => runAction(antsCmd, 'Staking...', async ({ ctx }, report) => {
11
+ const result = await stake(ctx, { agentId: options.agent, amount, epochs: options.epochs }, report);
12
+ return `Staked ${ants(result.amount)} into agent ${result.agentId} for ${result.epochs} epoch(s); power activates next epoch`;
13
+ }));
14
+ }
15
+ //# sourceMappingURL=stake.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stake.js","sourceRoot":"","sources":["../../../../src/cli/commands/ants/stake.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,UAAU,wBAAwB,CAAC,OAAgB;IACvD,OAAO;SACJ,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,uEAAuE,CAAC;SACpF,cAAc,CAAC,mBAAmB,EAAE,6BAA6B,EAAE,oBAAoB,CAAC;SACxF,cAAc,CAAC,cAAc,EAAE,0CAA0C,EAAE,oBAAoB,CAAC;SAChG,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,OAA0C,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE;QACvI,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC;QACpG,OAAO,UAAU,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,eAAe,MAAM,CAAC,OAAO,QAAQ,MAAM,CAAC,MAAM,uCAAuC,CAAC;IAChI,CAAC,CAAC,CAAC,CAAC;AACR,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=stake.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stake.test.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/ants/stake.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ import assert from 'node:assert/strict';
2
+ import test from 'node:test';
3
+ import { Command } from 'commander';
4
+ import { registerAntsStakeCommand } from './stake.js';
5
+ test('stake takes an ANTS amount and requires a pool agent and lock length', () => {
6
+ const ants = new Command('ants');
7
+ registerAntsStakeCommand(ants);
8
+ const stake = ants.commands.find((command) => command.name() === 'stake');
9
+ assert.ok(stake);
10
+ assert.deepEqual(stake.registeredArguments.map((argument) => argument.name()), ['amount']);
11
+ const agent = stake.options.find((option) => option.long === '--agent');
12
+ const epochs = stake.options.find((option) => option.long === '--epochs');
13
+ assert.ok(agent?.mandatory, '--agent is required');
14
+ assert.ok(epochs?.mandatory, '--epochs is required');
15
+ assert.match(stake.description(), /ANTS/);
16
+ });
17
+ //# sourceMappingURL=stake.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stake.test.js","sourceRoot":"","sources":["../../../../src/cli/commands/ants/stake.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,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAEtD,IAAI,CAAC,sEAAsE,EAAE,GAAG,EAAE;IAChF,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,CAAC,SAAS,CAAC,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3F,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IACxE,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,KAAK,EAAE,SAAS,EAAE,qBAAqB,CAAC,CAAC;IACnD,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,sBAAsB,CAAC,CAAC;IACrD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { Command } from 'commander';
2
+ import { type OverviewView } from '@antseed/ants';
3
+ export declare function formatDuration(seconds: number): string;
4
+ export declare function phaseLabel(view: {
5
+ phase: OverviewView['phase'];
6
+ epoch: Pick<OverviewView['epoch'], 'effective'>;
7
+ }): string;
8
+ export declare function registerAntsStatusCommand(antsCmd: Command): void;
9
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/ants/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,OAAO,EAAiC,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAGjF,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAKtD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;IAAC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,CAAA;CAAE,GAAG,MAAM,CAO1H;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoChE"}