@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.
- package/README.md +158 -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/buyer/start.d.ts.map +1 -1
- package/dist/cli/commands/buyer/start.js +7 -1
- package/dist/cli/commands/buyer/start.js.map +1 -1
- 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/browse.d.ts.map +1 -1
- package/dist/cli/commands/network/browse.js +12 -3
- package/dist/cli/commands/network/browse.js.map +1 -1
- package/dist/cli/commands/network/chain-config-helper.d.ts +21 -1
- package/dist/cli/commands/network/chain-config-helper.d.ts.map +1 -1
- package/dist/cli/commands/network/chain-config-helper.js +6 -1
- package/dist/cli/commands/network/chain-config-helper.js.map +1 -1
- package/dist/cli/commands/network/peer.d.ts.map +1 -1
- package/dist/cli/commands/network/peer.js +21 -1
- package/dist/cli/commands/network/peer.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 +46 -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/plugins/verifier-evidence.test.d.ts +2 -0
- package/dist/plugins/verifier-evidence.test.d.ts.map +1 -0
- package/dist/plugins/verifier-evidence.test.js +41 -0
- package/dist/plugins/verifier-evidence.test.js.map +1 -0
- package/dist/plugins/verifier.d.ts +8 -10
- package/dist/plugins/verifier.d.ts.map +1 -1
- package/dist/plugins/verifier.js +23 -51
- package/dist/plugins/verifier.js.map +1 -1
- package/dist/plugins/verifier.test.js +1 -37
- package/dist/plugins/verifier.test.js.map +1 -1
- package/dist/proxy/buyer-proxy.d.ts +2 -1
- package/dist/proxy/buyer-proxy.d.ts.map +1 -1
- package/dist/proxy/buyer-proxy.js +104 -28
- package/dist/proxy/buyer-proxy.js.map +1 -1
- package/dist/proxy/buyer-proxy.test.js +177 -19
- package/dist/proxy/buyer-proxy.test.js.map +1 -1
- package/dist/proxy/network-models.d.ts +1 -2
- package/dist/proxy/network-models.d.ts.map +1 -1
- package/dist/proxy/network-models.js +10 -23
- package/dist/proxy/network-models.js.map +1 -1
- package/dist/proxy/network-models.test.js +56 -27
- package/dist/proxy/network-models.test.js.map +1 -1
- package/dist/proxy/tee-control.d.ts +14 -0
- package/dist/proxy/tee-control.d.ts.map +1 -0
- package/dist/proxy/tee-control.js +100 -0
- package/dist/proxy/tee-control.js.map +1 -0
- package/dist/proxy/tee-control.test.d.ts +2 -0
- package/dist/proxy/tee-control.test.d.ts.map +1 -0
- package/dist/proxy/tee-control.test.js +56 -0
- package/dist/proxy/tee-control.test.js.map +1 -0
- package/dist/proxy/tee-verification.d.ts +24 -0
- package/dist/proxy/tee-verification.d.ts.map +1 -0
- package/dist/proxy/tee-verification.js +128 -0
- package/dist/proxy/tee-verification.js.map +1 -0
- package/dist/proxy/tee-verification.test.d.ts +2 -0
- package/dist/proxy/tee-verification.test.d.ts.map +1 -0
- package/dist/proxy/tee-verification.test.js +241 -0
- package/dist/proxy/tee-verification.test.js.map +1 -0
- package/package.json +8 -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,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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|