@antseed/cli 0.1.156 → 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.
- package/README.md +135 -6
- package/dist/cli/commands/ants/addresses.d.ts +3 -0
- package/dist/cli/commands/ants/addresses.d.ts.map +1 -0
- package/dist/cli/commands/ants/addresses.js +20 -0
- package/dist/cli/commands/ants/addresses.js.map +1 -0
- package/dist/cli/commands/ants/addresses.test.d.ts +2 -0
- package/dist/cli/commands/ants/addresses.test.d.ts.map +1 -0
- package/dist/cli/commands/ants/addresses.test.js +12 -0
- package/dist/cli/commands/ants/addresses.test.js.map +1 -0
- package/dist/cli/commands/ants/arguments.test.d.ts +2 -0
- package/dist/cli/commands/ants/arguments.test.d.ts.map +1 -0
- package/dist/cli/commands/ants/arguments.test.js +51 -0
- package/dist/cli/commands/ants/arguments.test.js.map +1 -0
- package/dist/cli/commands/ants/dashboard.d.ts +4 -0
- package/dist/cli/commands/ants/dashboard.d.ts.map +1 -0
- package/dist/cli/commands/ants/dashboard.js +45 -0
- package/dist/cli/commands/ants/dashboard.js.map +1 -0
- package/dist/cli/commands/ants/dashboard.test.d.ts +2 -0
- package/dist/cli/commands/ants/dashboard.test.d.ts.map +1 -0
- package/dist/cli/commands/ants/dashboard.test.js +14 -0
- package/dist/cli/commands/ants/dashboard.test.js.map +1 -0
- package/dist/cli/commands/ants/emissions.d.ts +5 -0
- package/dist/cli/commands/ants/emissions.d.ts.map +1 -0
- package/dist/cli/commands/ants/emissions.js +44 -0
- package/dist/cli/commands/ants/emissions.js.map +1 -0
- package/dist/cli/commands/ants/emissions.test.d.ts +2 -0
- package/dist/cli/commands/ants/emissions.test.d.ts.map +1 -0
- package/dist/cli/commands/ants/emissions.test.js +17 -0
- package/dist/cli/commands/ants/emissions.test.js.map +1 -0
- package/dist/cli/commands/ants/extend.d.ts +3 -0
- package/dist/cli/commands/ants/extend.d.ts.map +1 -0
- package/dist/cli/commands/ants/extend.js +14 -0
- package/dist/cli/commands/ants/extend.js.map +1 -0
- package/dist/cli/commands/ants/extend.test.d.ts +2 -0
- package/dist/cli/commands/ants/extend.test.d.ts.map +1 -0
- package/dist/cli/commands/ants/extend.test.js +13 -0
- package/dist/cli/commands/ants/extend.test.js.map +1 -0
- package/dist/cli/commands/ants/index.d.ts +7 -0
- package/dist/cli/commands/ants/index.d.ts.map +1 -0
- package/dist/cli/commands/ants/index.js +46 -0
- package/dist/cli/commands/ants/index.js.map +1 -0
- package/dist/cli/commands/ants/index.test.d.ts +2 -0
- package/dist/cli/commands/ants/index.test.d.ts.map +1 -0
- package/dist/cli/commands/ants/index.test.js +24 -0
- package/dist/cli/commands/ants/index.test.js.map +1 -0
- package/dist/cli/commands/ants/max-lock.d.ts +3 -0
- package/dist/cli/commands/ants/max-lock.d.ts.map +1 -0
- package/dist/cli/commands/ants/max-lock.js +13 -0
- package/dist/cli/commands/ants/max-lock.js.map +1 -0
- package/dist/cli/commands/ants/max-lock.test.d.ts +2 -0
- package/dist/cli/commands/ants/max-lock.test.d.ts.map +1 -0
- package/dist/cli/commands/ants/max-lock.test.js +15 -0
- package/dist/cli/commands/ants/max-lock.test.js.map +1 -0
- package/dist/cli/commands/ants/merge.d.ts +3 -0
- package/dist/cli/commands/ants/merge.d.ts.map +1 -0
- package/dist/cli/commands/ants/merge.js +12 -0
- package/dist/cli/commands/ants/merge.js.map +1 -0
- package/dist/cli/commands/ants/merge.test.d.ts +2 -0
- package/dist/cli/commands/ants/merge.test.d.ts.map +1 -0
- package/dist/cli/commands/ants/merge.test.js +16 -0
- package/dist/cli/commands/ants/merge.test.js.map +1 -0
- package/dist/cli/commands/ants/move.d.ts +3 -0
- package/dist/cli/commands/ants/move.d.ts.map +1 -0
- package/dist/cli/commands/ants/move.js +14 -0
- package/dist/cli/commands/ants/move.js.map +1 -0
- package/dist/cli/commands/ants/move.test.d.ts +2 -0
- package/dist/cli/commands/ants/move.test.d.ts.map +1 -0
- package/dist/cli/commands/ants/move.test.js +16 -0
- package/dist/cli/commands/ants/move.test.js.map +1 -0
- package/dist/cli/commands/ants/pool.d.ts +3 -0
- package/dist/cli/commands/ants/pool.d.ts.map +1 -0
- package/dist/cli/commands/ants/pool.js +21 -0
- package/dist/cli/commands/ants/pool.js.map +1 -0
- package/dist/cli/commands/ants/pool.test.d.ts +2 -0
- package/dist/cli/commands/ants/pool.test.d.ts.map +1 -0
- package/dist/cli/commands/ants/pool.test.js +13 -0
- package/dist/cli/commands/ants/pool.test.js.map +1 -0
- package/dist/cli/commands/ants/pools.d.ts +6 -0
- package/dist/cli/commands/ants/pools.d.ts.map +1 -0
- package/dist/cli/commands/ants/pools.js +50 -0
- package/dist/cli/commands/ants/pools.js.map +1 -0
- package/dist/cli/commands/ants/pools.test.d.ts +2 -0
- package/dist/cli/commands/ants/pools.test.d.ts.map +1 -0
- package/dist/cli/commands/ants/pools.test.js +18 -0
- package/dist/cli/commands/ants/pools.test.js.map +1 -0
- package/dist/cli/commands/ants/positions.d.ts +6 -0
- package/dist/cli/commands/ants/positions.d.ts.map +1 -0
- package/dist/cli/commands/ants/positions.js +46 -0
- package/dist/cli/commands/ants/positions.js.map +1 -0
- package/dist/cli/commands/ants/positions.test.d.ts +2 -0
- package/dist/cli/commands/ants/positions.test.d.ts.map +1 -0
- package/dist/cli/commands/ants/positions.test.js +19 -0
- package/dist/cli/commands/ants/positions.test.js.map +1 -0
- package/dist/cli/commands/ants/rewards.d.ts +9 -0
- package/dist/cli/commands/ants/rewards.d.ts.map +1 -0
- package/dist/cli/commands/ants/rewards.js +93 -0
- package/dist/cli/commands/ants/rewards.js.map +1 -0
- package/dist/cli/commands/ants/rewards.test.d.ts +2 -0
- package/dist/cli/commands/ants/rewards.test.d.ts.map +1 -0
- package/dist/cli/commands/ants/rewards.test.js +46 -0
- package/dist/cli/commands/ants/rewards.test.js.map +1 -0
- package/dist/cli/commands/ants/seller.d.ts +3 -0
- package/dist/cli/commands/ants/seller.d.ts.map +1 -0
- package/dist/cli/commands/ants/seller.js +32 -0
- package/dist/cli/commands/ants/seller.js.map +1 -0
- package/dist/cli/commands/ants/seller.test.d.ts +2 -0
- package/dist/cli/commands/ants/seller.test.d.ts.map +1 -0
- package/dist/cli/commands/ants/seller.test.js +16 -0
- package/dist/cli/commands/ants/seller.test.js.map +1 -0
- package/dist/cli/commands/ants/shared.d.ts +26 -0
- package/dist/cli/commands/ants/shared.d.ts.map +1 -0
- package/dist/cli/commands/ants/shared.js +94 -0
- package/dist/cli/commands/ants/shared.js.map +1 -0
- package/dist/cli/commands/ants/shared.test.d.ts +2 -0
- package/dist/cli/commands/ants/shared.test.d.ts.map +1 -0
- package/dist/cli/commands/ants/shared.test.js +25 -0
- package/dist/cli/commands/ants/shared.test.js.map +1 -0
- package/dist/cli/commands/ants/split.d.ts +3 -0
- package/dist/cli/commands/ants/split.d.ts.map +1 -0
- package/dist/cli/commands/ants/split.js +12 -0
- package/dist/cli/commands/ants/split.js.map +1 -0
- package/dist/cli/commands/ants/split.test.d.ts +2 -0
- package/dist/cli/commands/ants/split.test.d.ts.map +1 -0
- package/dist/cli/commands/ants/split.test.js +13 -0
- package/dist/cli/commands/ants/split.test.js.map +1 -0
- package/dist/cli/commands/ants/stake.d.ts +3 -0
- package/dist/cli/commands/ants/stake.d.ts.map +1 -0
- package/dist/cli/commands/ants/stake.js +15 -0
- package/dist/cli/commands/ants/stake.js.map +1 -0
- package/dist/cli/commands/ants/stake.test.d.ts +2 -0
- package/dist/cli/commands/ants/stake.test.d.ts.map +1 -0
- package/dist/cli/commands/ants/stake.test.js +17 -0
- package/dist/cli/commands/ants/stake.test.js.map +1 -0
- package/dist/cli/commands/ants/status.d.ts +9 -0
- package/dist/cli/commands/ants/status.d.ts.map +1 -0
- package/dist/cli/commands/ants/status.js +43 -0
- package/dist/cli/commands/ants/status.js.map +1 -0
- package/dist/cli/commands/ants/status.test.d.ts +2 -0
- package/dist/cli/commands/ants/status.test.d.ts.map +1 -0
- package/dist/cli/commands/ants/status.test.js +23 -0
- package/dist/cli/commands/ants/status.test.js.map +1 -0
- package/dist/cli/commands/ants/usage.d.ts +4 -0
- package/dist/cli/commands/ants/usage.d.ts.map +1 -0
- package/dist/cli/commands/ants/usage.js +31 -0
- package/dist/cli/commands/ants/usage.js.map +1 -0
- package/dist/cli/commands/ants/usage.test.d.ts +2 -0
- package/dist/cli/commands/ants/usage.test.d.ts.map +1 -0
- package/dist/cli/commands/ants/usage.test.js +15 -0
- package/dist/cli/commands/ants/usage.test.js.map +1 -0
- package/dist/cli/commands/ants/verify.d.ts +3 -0
- package/dist/cli/commands/ants/verify.d.ts.map +1 -0
- package/dist/cli/commands/ants/verify.js +51 -0
- package/dist/cli/commands/ants/verify.js.map +1 -0
- package/dist/cli/commands/ants/verify.test.d.ts +2 -0
- package/dist/cli/commands/ants/verify.test.d.ts.map +1 -0
- package/dist/cli/commands/ants/verify.test.js +51 -0
- package/dist/cli/commands/ants/verify.test.js.map +1 -0
- package/dist/cli/commands/ants/withdraw.d.ts +16 -0
- package/dist/cli/commands/ants/withdraw.d.ts.map +1 -0
- package/dist/cli/commands/ants/withdraw.js +48 -0
- package/dist/cli/commands/ants/withdraw.js.map +1 -0
- package/dist/cli/commands/ants/withdraw.test.d.ts +2 -0
- package/dist/cli/commands/ants/withdraw.test.d.ts.map +1 -0
- package/dist/cli/commands/ants/withdraw.test.js +30 -0
- package/dist/cli/commands/ants/withdraw.test.js.map +1 -0
- package/dist/cli/commands/emissions.d.ts +7 -0
- package/dist/cli/commands/emissions.d.ts.map +1 -1
- package/dist/cli/commands/emissions.js +105 -27
- package/dist/cli/commands/emissions.js.map +1 -1
- package/dist/cli/commands/emissions.test.js +7 -1
- package/dist/cli/commands/emissions.test.js.map +1 -1
- package/dist/cli/commands/network/chain-config-helper.d.ts +18 -0
- package/dist/cli/commands/network/chain-config-helper.d.ts.map +1 -1
- package/dist/cli/commands/network/chain-config-helper.js.map +1 -1
- package/dist/cli/commands/parse-positive-integer.d.ts +2 -0
- package/dist/cli/commands/parse-positive-integer.d.ts.map +1 -0
- package/dist/cli/commands/parse-positive-integer.js +9 -0
- package/dist/cli/commands/parse-positive-integer.js.map +1 -0
- package/dist/cli/commands/reward-actions.d.ts +11 -0
- package/dist/cli/commands/reward-actions.d.ts.map +1 -0
- package/dist/cli/commands/reward-actions.js +22 -0
- package/dist/cli/commands/reward-actions.js.map +1 -0
- package/dist/cli/commands/seller/contract-clients.test.d.ts +2 -0
- package/dist/cli/commands/seller/contract-clients.test.d.ts.map +1 -0
- package/dist/cli/commands/seller/contract-clients.test.js +45 -0
- package/dist/cli/commands/seller/contract-clients.test.js.map +1 -0
- package/dist/cli/commands/seller/index.d.ts.map +1 -1
- package/dist/cli/commands/seller/index.js +4 -2
- package/dist/cli/commands/seller/index.js.map +1 -1
- package/dist/cli/commands/seller/pool.d.ts +15 -0
- package/dist/cli/commands/seller/pool.d.ts.map +1 -0
- package/dist/cli/commands/seller/pool.js +201 -0
- package/dist/cli/commands/seller/pool.js.map +1 -0
- package/dist/cli/commands/seller/pool.test.d.ts +2 -0
- package/dist/cli/commands/seller/pool.test.d.ts.map +1 -0
- package/dist/cli/commands/seller/pool.test.js +16 -0
- package/dist/cli/commands/seller/pool.test.js.map +1 -0
- package/dist/cli/commands/seller/register.d.ts.map +1 -1
- package/dist/cli/commands/seller/register.js +38 -8
- package/dist/cli/commands/seller/register.js.map +1 -1
- package/dist/cli/commands/seller/rewards.d.ts +13 -0
- package/dist/cli/commands/seller/rewards.d.ts.map +1 -0
- package/dist/cli/commands/seller/rewards.js +115 -0
- package/dist/cli/commands/seller/rewards.js.map +1 -0
- package/dist/cli/commands/seller/rewards.test.d.ts +2 -0
- package/dist/cli/commands/seller/rewards.test.d.ts.map +1 -0
- package/dist/cli/commands/seller/rewards.test.js +21 -0
- package/dist/cli/commands/seller/rewards.test.js.map +1 -0
- package/dist/cli/commands/seller/setup.d.ts.map +1 -1
- package/dist/cli/commands/seller/setup.js +2 -1
- package/dist/cli/commands/seller/setup.js.map +1 -1
- package/dist/cli/commands/seller/stake.d.ts.map +1 -1
- package/dist/cli/commands/seller/stake.js +104 -65
- package/dist/cli/commands/seller/stake.js.map +1 -1
- package/dist/cli/commands/seller/stake.test.d.ts +2 -0
- package/dist/cli/commands/seller/stake.test.d.ts.map +1 -0
- package/dist/cli/commands/seller/stake.test.js +99 -0
- package/dist/cli/commands/seller/stake.test.js.map +1 -0
- package/dist/cli/commands/seller/start.d.ts.map +1 -1
- package/dist/cli/commands/seller/start.js +6 -0
- package/dist/cli/commands/seller/start.js.map +1 -1
- package/dist/cli/commands/seller/status.d.ts.map +1 -1
- package/dist/cli/commands/seller/status.js +44 -2
- package/dist/cli/commands/seller/status.js.map +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/payment-utils.d.ts +33 -2
- package/dist/cli/payment-utils.d.ts.map +1 -1
- package/dist/cli/payment-utils.js +101 -2
- package/dist/cli/payment-utils.js.map +1 -1
- package/dist/config/types.d.ts +20 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/proxy/buyer-proxy.d.ts.map +1 -1
- package/dist/proxy/buyer-proxy.js +27 -8
- package/dist/proxy/buyer-proxy.js.map +1 -1
- package/dist/proxy/buyer-proxy.test.js +126 -2
- package/dist/proxy/buyer-proxy.test.js.map +1 -1
- package/package.json +7 -6
- package/dist/cli/commands/seller/emissions.d.ts +0 -3
- package/dist/cli/commands/seller/emissions.d.ts.map +0 -1
- package/dist/cli/commands/seller/emissions.js +0 -5
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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":"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"}
|
|
@@ -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 @@
|
|
|
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;
|
|
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"}
|