agentaos 0.2.0
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/LICENSE +199 -0
- package/README.md +249 -0
- package/dist/cli/commands/admin.command.d.ts +3 -0
- package/dist/cli/commands/admin.command.d.ts.map +1 -0
- package/dist/cli/commands/admin.command.js +415 -0
- package/dist/cli/commands/admin.command.js.map +1 -0
- package/dist/cli/commands/balance.command.d.ts +3 -0
- package/dist/cli/commands/balance.command.d.ts.map +1 -0
- package/dist/cli/commands/balance.command.js +65 -0
- package/dist/cli/commands/balance.command.js.map +1 -0
- package/dist/cli/commands/deploy.command.d.ts +3 -0
- package/dist/cli/commands/deploy.command.d.ts.map +1 -0
- package/dist/cli/commands/deploy.command.js +101 -0
- package/dist/cli/commands/deploy.command.js.map +1 -0
- package/dist/cli/commands/info.command.d.ts +3 -0
- package/dist/cli/commands/info.command.d.ts.map +1 -0
- package/dist/cli/commands/info.command.js +30 -0
- package/dist/cli/commands/info.command.js.map +1 -0
- package/dist/cli/commands/init.command.d.ts +3 -0
- package/dist/cli/commands/init.command.d.ts.map +1 -0
- package/dist/cli/commands/init.command.js +364 -0
- package/dist/cli/commands/init.command.js.map +1 -0
- package/dist/cli/commands/link.command.d.ts +3 -0
- package/dist/cli/commands/link.command.d.ts.map +1 -0
- package/dist/cli/commands/link.command.js +111 -0
- package/dist/cli/commands/link.command.js.map +1 -0
- package/dist/cli/commands/login.command.d.ts +4 -0
- package/dist/cli/commands/login.command.d.ts.map +1 -0
- package/dist/cli/commands/login.command.js +149 -0
- package/dist/cli/commands/login.command.js.map +1 -0
- package/dist/cli/commands/network.command.d.ts +3 -0
- package/dist/cli/commands/network.command.d.ts.map +1 -0
- package/dist/cli/commands/network.command.js +206 -0
- package/dist/cli/commands/network.command.js.map +1 -0
- package/dist/cli/commands/proxy.command.d.ts +3 -0
- package/dist/cli/commands/proxy.command.d.ts.map +1 -0
- package/dist/cli/commands/proxy.command.js +248 -0
- package/dist/cli/commands/proxy.command.js.map +1 -0
- package/dist/cli/commands/receive.command.d.ts +3 -0
- package/dist/cli/commands/receive.command.d.ts.map +1 -0
- package/dist/cli/commands/receive.command.js +360 -0
- package/dist/cli/commands/receive.command.js.map +1 -0
- package/dist/cli/commands/send.command.d.ts +3 -0
- package/dist/cli/commands/send.command.d.ts.map +1 -0
- package/dist/cli/commands/send.command.js +83 -0
- package/dist/cli/commands/send.command.js.map +1 -0
- package/dist/cli/commands/sign.command.d.ts +3 -0
- package/dist/cli/commands/sign.command.d.ts.map +1 -0
- package/dist/cli/commands/sign.command.js +53 -0
- package/dist/cli/commands/sign.command.js.map +1 -0
- package/dist/cli/commands/status.command.d.ts +3 -0
- package/dist/cli/commands/status.command.d.ts.map +1 -0
- package/dist/cli/commands/status.command.js +109 -0
- package/dist/cli/commands/status.command.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +50 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/theme.d.ts +35 -0
- package/dist/cli/theme.d.ts.map +1 -0
- package/dist/cli/theme.js +96 -0
- package/dist/cli/theme.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/__tests__/transfer-crypto.test.d.ts +2 -0
- package/dist/lib/__tests__/transfer-crypto.test.d.ts.map +1 -0
- package/dist/lib/__tests__/transfer-crypto.test.js +151 -0
- package/dist/lib/__tests__/transfer-crypto.test.js.map +1 -0
- package/dist/lib/authenticated-fetch.d.ts +6 -0
- package/dist/lib/authenticated-fetch.d.ts.map +1 -0
- package/dist/lib/authenticated-fetch.js +74 -0
- package/dist/lib/authenticated-fetch.js.map +1 -0
- package/dist/lib/config.d.ts +42 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +163 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/erc20-abi.d.ts +43 -0
- package/dist/lib/erc20-abi.d.ts.map +1 -0
- package/dist/lib/erc20-abi.js +34 -0
- package/dist/lib/erc20-abi.js.map +1 -0
- package/dist/lib/errors.d.ts +12 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +23 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/keychain.d.ts +11 -0
- package/dist/lib/keychain.d.ts.map +1 -0
- package/dist/lib/keychain.js +216 -0
- package/dist/lib/keychain.js.map +1 -0
- package/dist/lib/policy-conversions.d.ts +19 -0
- package/dist/lib/policy-conversions.d.ts.map +1 -0
- package/dist/lib/policy-conversions.js +62 -0
- package/dist/lib/policy-conversions.js.map +1 -0
- package/dist/lib/signer-manager.d.ts +17 -0
- package/dist/lib/signer-manager.d.ts.map +1 -0
- package/dist/lib/signer-manager.js +80 -0
- package/dist/lib/signer-manager.js.map +1 -0
- package/dist/lib/transfer-crypto.d.ts +36 -0
- package/dist/lib/transfer-crypto.d.ts.map +1 -0
- package/dist/lib/transfer-crypto.js +109 -0
- package/dist/lib/transfer-crypto.js.map +1 -0
- package/dist/lib/x402-client.d.ts +63 -0
- package/dist/lib/x402-client.d.ts.map +1 -0
- package/dist/lib/x402-client.js +236 -0
- package/dist/lib/x402-client.js.map +1 -0
- package/dist/mcp/index.d.ts +6 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +73 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/tools/call-contract.d.ts +4 -0
- package/dist/mcp/tools/call-contract.d.ts.map +1 -0
- package/dist/mcp/tools/call-contract.js +68 -0
- package/dist/mcp/tools/call-contract.js.map +1 -0
- package/dist/mcp/tools/execute.d.ts +4 -0
- package/dist/mcp/tools/execute.d.ts.map +1 -0
- package/dist/mcp/tools/execute.js +59 -0
- package/dist/mcp/tools/execute.js.map +1 -0
- package/dist/mcp/tools/get-audit-log.d.ts +4 -0
- package/dist/mcp/tools/get-audit-log.d.ts.map +1 -0
- package/dist/mcp/tools/get-audit-log.js +85 -0
- package/dist/mcp/tools/get-audit-log.js.map +1 -0
- package/dist/mcp/tools/get-balances.d.ts +4 -0
- package/dist/mcp/tools/get-balances.d.ts.map +1 -0
- package/dist/mcp/tools/get-balances.js +84 -0
- package/dist/mcp/tools/get-balances.js.map +1 -0
- package/dist/mcp/tools/get-status.d.ts +4 -0
- package/dist/mcp/tools/get-status.d.ts.map +1 -0
- package/dist/mcp/tools/get-status.js +66 -0
- package/dist/mcp/tools/get-status.js.map +1 -0
- package/dist/mcp/tools/list-networks.d.ts +4 -0
- package/dist/mcp/tools/list-networks.d.ts.map +1 -0
- package/dist/mcp/tools/list-networks.js +36 -0
- package/dist/mcp/tools/list-networks.js.map +1 -0
- package/dist/mcp/tools/list-signers.d.ts +4 -0
- package/dist/mcp/tools/list-signers.d.ts.map +1 -0
- package/dist/mcp/tools/list-signers.js +36 -0
- package/dist/mcp/tools/list-signers.js.map +1 -0
- package/dist/mcp/tools/read-contract.d.ts +4 -0
- package/dist/mcp/tools/read-contract.d.ts.map +1 -0
- package/dist/mcp/tools/read-contract.js +62 -0
- package/dist/mcp/tools/read-contract.js.map +1 -0
- package/dist/mcp/tools/resolve-address.d.ts +4 -0
- package/dist/mcp/tools/resolve-address.d.ts.map +1 -0
- package/dist/mcp/tools/resolve-address.js +37 -0
- package/dist/mcp/tools/resolve-address.js.map +1 -0
- package/dist/mcp/tools/send-eth.d.ts +4 -0
- package/dist/mcp/tools/send-eth.d.ts.map +1 -0
- package/dist/mcp/tools/send-eth.js +52 -0
- package/dist/mcp/tools/send-eth.js.map +1 -0
- package/dist/mcp/tools/send-token.d.ts +4 -0
- package/dist/mcp/tools/send-token.d.ts.map +1 -0
- package/dist/mcp/tools/send-token.js +102 -0
- package/dist/mcp/tools/send-token.js.map +1 -0
- package/dist/mcp/tools/sign-message.d.ts +4 -0
- package/dist/mcp/tools/sign-message.d.ts.map +1 -0
- package/dist/mcp/tools/sign-message.js +33 -0
- package/dist/mcp/tools/sign-message.js.map +1 -0
- package/dist/mcp/tools/sign-typed-data.d.ts +4 -0
- package/dist/mcp/tools/sign-typed-data.d.ts.map +1 -0
- package/dist/mcp/tools/sign-typed-data.js +48 -0
- package/dist/mcp/tools/sign-typed-data.js.map +1 -0
- package/dist/mcp/tools/simulate.d.ts +4 -0
- package/dist/mcp/tools/simulate.d.ts.map +1 -0
- package/dist/mcp/tools/simulate.js +54 -0
- package/dist/mcp/tools/simulate.js.map +1 -0
- package/dist/mcp/tools/wallet-overview.d.ts +4 -0
- package/dist/mcp/tools/wallet-overview.d.ts.map +1 -0
- package/dist/mcp/tools/wallet-overview.js +109 -0
- package/dist/mcp/tools/wallet-overview.js.map +1 -0
- package/dist/mcp/tools/x402-check.d.ts +3 -0
- package/dist/mcp/tools/x402-check.d.ts.map +1 -0
- package/dist/mcp/tools/x402-check.js +44 -0
- package/dist/mcp/tools/x402-check.js.map +1 -0
- package/dist/mcp/tools/x402-discover.d.ts +3 -0
- package/dist/mcp/tools/x402-discover.d.ts.map +1 -0
- package/dist/mcp/tools/x402-discover.js +42 -0
- package/dist/mcp/tools/x402-discover.js.map +1 -0
- package/dist/mcp/tools/x402-fetch.d.ts +4 -0
- package/dist/mcp/tools/x402-fetch.d.ts.map +1 -0
- package/dist/mcp/tools/x402-fetch.js +45 -0
- package/dist/mcp/tools/x402-fetch.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
import { CRITERION_CATALOG } from '@agentaos/core';
|
|
2
|
+
import { confirm, input, select } from '@inquirer/prompts';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import ora from 'ora';
|
|
6
|
+
import { formatEther } from 'viem';
|
|
7
|
+
import { loadSignerConfig } from '../../lib/config.js';
|
|
8
|
+
import { getSession } from '../../lib/keychain.js';
|
|
9
|
+
import { buildRules, parseFormValues } from '../../lib/policy-conversions.js';
|
|
10
|
+
import { brand, danger, dim, failMark, promptTheme, success, warn } from '../theme.js';
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
// Error handler (clean output, no stack traces)
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
function withErrorHandler(
|
|
15
|
+
// biome-ignore lint/suspicious/noExplicitAny: commander action callbacks use any[]
|
|
16
|
+
fn) {
|
|
17
|
+
// biome-ignore lint/suspicious/noExplicitAny: commander action callbacks use any[]
|
|
18
|
+
return async (...args) => {
|
|
19
|
+
try {
|
|
20
|
+
await fn(...args);
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
if (error instanceof Error && error.name === 'ExitPromptError') {
|
|
24
|
+
console.log(dim('\n Cancelled.\n'));
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
28
|
+
console.error(`\n ${failMark(message)}\n`);
|
|
29
|
+
process.exitCode = 1;
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
// Auth resolution — uses session JWT from `agenta login`
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
async function getAdminContext(command) {
|
|
37
|
+
const signerName = command.optsWithGlobals().signer;
|
|
38
|
+
const config = loadSignerConfig(signerName);
|
|
39
|
+
if (!config.signerId) {
|
|
40
|
+
throw new Error('No signer ID in config. Re-run `agenta init` or add signerId to config.');
|
|
41
|
+
}
|
|
42
|
+
const token = await getSession();
|
|
43
|
+
if (!token) {
|
|
44
|
+
throw new Error(`Not logged in. Run ${chalk.bold('agenta login')} first.`);
|
|
45
|
+
}
|
|
46
|
+
const headers = {
|
|
47
|
+
'content-type': 'application/json',
|
|
48
|
+
authorization: `Bearer ${token}`,
|
|
49
|
+
};
|
|
50
|
+
return { config, signerName: config.signerName, signerId: config.signerId, headers };
|
|
51
|
+
}
|
|
52
|
+
function getAuditContext(command) {
|
|
53
|
+
const signerName = command.optsWithGlobals().signer;
|
|
54
|
+
const config = loadSignerConfig(signerName);
|
|
55
|
+
return {
|
|
56
|
+
config,
|
|
57
|
+
headers: {
|
|
58
|
+
'x-api-key': config.apiKey,
|
|
59
|
+
'content-type': 'application/json',
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
// Fetch helper
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
async function adminFetch(baseUrl, path, headers, method = 'GET', body) {
|
|
67
|
+
const url = `${baseUrl.replace(/\/+$/, '')}/api/v1${path}`;
|
|
68
|
+
const response = await fetch(url, {
|
|
69
|
+
method,
|
|
70
|
+
headers,
|
|
71
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
72
|
+
signal: AbortSignal.timeout(30_000),
|
|
73
|
+
});
|
|
74
|
+
if (!response.ok) {
|
|
75
|
+
const text = await response.text();
|
|
76
|
+
throw new Error(`Server returned ${response.status}: ${text}`);
|
|
77
|
+
}
|
|
78
|
+
if (response.status === 204)
|
|
79
|
+
return undefined;
|
|
80
|
+
return response.json();
|
|
81
|
+
}
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
// Visual helpers
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
function fmtAddr(address) {
|
|
86
|
+
if (!address || address.length < 10)
|
|
87
|
+
return dim('—');
|
|
88
|
+
return `${address.slice(0, 6)}…${address.slice(-4)}`;
|
|
89
|
+
}
|
|
90
|
+
function fmtId(id) {
|
|
91
|
+
return id.length > 12 ? `${id.slice(0, 8)}…` : id;
|
|
92
|
+
}
|
|
93
|
+
function fmtCriterion(type, criterion) {
|
|
94
|
+
switch (type) {
|
|
95
|
+
case 'evmAddress': {
|
|
96
|
+
const op = criterion.operator;
|
|
97
|
+
const addrs = criterion.addresses ?? [];
|
|
98
|
+
const label = op === 'not_in' ? 'Blocked' : 'Approved';
|
|
99
|
+
return `${label}: ${addrs.map(fmtAddr).join(', ') || dim('none')}`;
|
|
100
|
+
}
|
|
101
|
+
case 'maxPerTxUsd':
|
|
102
|
+
return `Max/tx: $${criterion.maxUsd}`;
|
|
103
|
+
case 'dailyLimitUsd':
|
|
104
|
+
return `Daily: $${criterion.maxUsd}`;
|
|
105
|
+
case 'monthlyLimitUsd':
|
|
106
|
+
return `Monthly: $${criterion.maxUsd}`;
|
|
107
|
+
case 'ethValue':
|
|
108
|
+
return `ETH value ${criterion.operator ?? '<='} ${criterion.value}`;
|
|
109
|
+
case 'rateLimit':
|
|
110
|
+
return `Rate: ${criterion.maxPerHour}/hr`;
|
|
111
|
+
case 'timeWindow':
|
|
112
|
+
return `Hours: ${criterion.startHour}:00–${criterion.endHour}:00 UTC`;
|
|
113
|
+
case 'evmNetwork': {
|
|
114
|
+
const ids = criterion.chainIds ?? [];
|
|
115
|
+
return `Chains: ${ids.join(', ')}`;
|
|
116
|
+
}
|
|
117
|
+
case 'evmFunction': {
|
|
118
|
+
const sels = criterion.selectors ?? [];
|
|
119
|
+
return `Functions: ${sels.join(', ') || dim('any')}`;
|
|
120
|
+
}
|
|
121
|
+
case 'ipAddress': {
|
|
122
|
+
const ips = criterion.ips ?? [];
|
|
123
|
+
return `IPs: ${ips.join(', ')}`;
|
|
124
|
+
}
|
|
125
|
+
case 'blockInfiniteApprovals':
|
|
126
|
+
return 'Block infinite approvals';
|
|
127
|
+
case 'maxSlippage':
|
|
128
|
+
return `Max slippage: ${criterion.maxPercent}%`;
|
|
129
|
+
case 'mevProtection':
|
|
130
|
+
return `MEV protection ${dim('(advisory)')}`;
|
|
131
|
+
default:
|
|
132
|
+
return `${type}: ${JSON.stringify(criterion)}`;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
function formatWei(weiStr) {
|
|
136
|
+
if (!weiStr || weiStr === '0')
|
|
137
|
+
return '0';
|
|
138
|
+
try {
|
|
139
|
+
return formatEther(BigInt(weiStr));
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return weiStr;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI escape stripping is intentional
|
|
146
|
+
const ANSI_RE = /\u001B\[[0-9;]*m/g;
|
|
147
|
+
function pad(str, width) {
|
|
148
|
+
const visible = str.replace(ANSI_RE, '');
|
|
149
|
+
return str + ' '.repeat(Math.max(0, width - visible.length));
|
|
150
|
+
}
|
|
151
|
+
// ---------------------------------------------------------------------------
|
|
152
|
+
// ---------------------------------------------------------------------------
|
|
153
|
+
// Subcommands
|
|
154
|
+
// ---------------------------------------------------------------------------
|
|
155
|
+
// -- Policies ----------------------------------------------------------------
|
|
156
|
+
async function handlePoliciesList(command) {
|
|
157
|
+
const ctx = await getAdminContext(command);
|
|
158
|
+
const spinner = ora({ text: 'Fetching policy\u2026', indent: 2 }).start();
|
|
159
|
+
let doc = null;
|
|
160
|
+
try {
|
|
161
|
+
doc = await adminFetch(ctx.config.serverUrl, `/signers/${ctx.signerId}/policy`, ctx.headers);
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
// No active policy
|
|
165
|
+
}
|
|
166
|
+
spinner.stop();
|
|
167
|
+
console.log('');
|
|
168
|
+
console.log(` Policy for ${chalk.bold(ctx.signerName)} ${dim(`(${fmtAddr(ctx.config.ethAddress)})`)}`);
|
|
169
|
+
console.log('');
|
|
170
|
+
if (!doc || !doc.rules || doc.rules.length === 0) {
|
|
171
|
+
console.log(dim(' No policy configured.'));
|
|
172
|
+
console.log(dim(` Run ${chalk.reset('agenta admin policies edit')} to create one.`));
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
console.log(` ${dim('Status:')} ${success('active')}`);
|
|
176
|
+
if (doc.version)
|
|
177
|
+
console.log(` ${dim('Version:')} ${doc.version}`);
|
|
178
|
+
console.log('');
|
|
179
|
+
for (const rule of doc.rules) {
|
|
180
|
+
const action = rule.action ?? 'accept';
|
|
181
|
+
const criteria = rule.criteria ?? [];
|
|
182
|
+
const actionLabel = action === 'reject' ? danger('REJECT') : success('ACCEPT');
|
|
183
|
+
console.log(` ${actionLabel} if:`);
|
|
184
|
+
for (const criterion of criteria) {
|
|
185
|
+
const type = criterion.type;
|
|
186
|
+
console.log(` ${fmtCriterion(type, criterion)}`);
|
|
187
|
+
}
|
|
188
|
+
console.log('');
|
|
189
|
+
}
|
|
190
|
+
console.log(dim(' Always-on: Scam blacklist, Contract scanner'));
|
|
191
|
+
}
|
|
192
|
+
console.log('');
|
|
193
|
+
}
|
|
194
|
+
const policiesEditCommand = new Command('edit')
|
|
195
|
+
.description('Edit policy rules interactively')
|
|
196
|
+
.action(withErrorHandler(async (_opts, command) => {
|
|
197
|
+
const ctx = await getAdminContext(command);
|
|
198
|
+
const spinner = ora({ text: 'Fetching current policy\u2026', indent: 2 }).start();
|
|
199
|
+
let currentRules = [];
|
|
200
|
+
try {
|
|
201
|
+
const doc = await adminFetch(ctx.config.serverUrl, `/signers/${ctx.signerId}/policy`, ctx.headers);
|
|
202
|
+
currentRules = doc.rules ?? [];
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
// No active policy
|
|
206
|
+
}
|
|
207
|
+
spinner.stop();
|
|
208
|
+
const { values, enabled } = parseFormValues(currentRules);
|
|
209
|
+
const newEnabled = { ...enabled };
|
|
210
|
+
const newValues = { ...values };
|
|
211
|
+
const editableCriteria = CRITERION_CATALOG.filter((m) => !m.alwaysOn);
|
|
212
|
+
console.log('');
|
|
213
|
+
console.log(brand(' Configure policy rules'));
|
|
214
|
+
console.log(dim(' Toggle rules on/off, then set values for enabled rules.'));
|
|
215
|
+
console.log('');
|
|
216
|
+
for (const meta of editableCriteria) {
|
|
217
|
+
const isEnabled = newEnabled[meta.type] ?? false;
|
|
218
|
+
const shouldEnable = await confirm({
|
|
219
|
+
message: `${meta.label} \u2014 ${meta.description}`,
|
|
220
|
+
default: isEnabled,
|
|
221
|
+
theme: promptTheme,
|
|
222
|
+
});
|
|
223
|
+
newEnabled[meta.type] = shouldEnable;
|
|
224
|
+
if (shouldEnable && meta.fields.length > 0) {
|
|
225
|
+
const fieldValues = newValues[meta.type] ?? meta.fromCriterion({});
|
|
226
|
+
for (const field of meta.fields) {
|
|
227
|
+
const currentVal = fieldValues[field.key];
|
|
228
|
+
if (field.type === 'toggle') {
|
|
229
|
+
fieldValues[field.key] = await confirm({
|
|
230
|
+
message: ` ${field.label}`,
|
|
231
|
+
default: currentVal !== false,
|
|
232
|
+
theme: promptTheme,
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
else if (field.type === 'addresses' ||
|
|
236
|
+
field.type === 'selectors' ||
|
|
237
|
+
field.type === 'ips') {
|
|
238
|
+
const current = currentVal ?? [];
|
|
239
|
+
const answer = await input({
|
|
240
|
+
message: ` ${field.label} (comma-separated)`,
|
|
241
|
+
default: current.join(', '),
|
|
242
|
+
theme: promptTheme,
|
|
243
|
+
});
|
|
244
|
+
fieldValues[field.key] = answer
|
|
245
|
+
.split(',')
|
|
246
|
+
.map((s) => s.trim())
|
|
247
|
+
.filter(Boolean);
|
|
248
|
+
}
|
|
249
|
+
else if (field.type === 'chains') {
|
|
250
|
+
const current = currentVal ?? [];
|
|
251
|
+
const answer = await input({
|
|
252
|
+
message: ` ${field.label} (chain IDs, comma-separated)`,
|
|
253
|
+
default: current.join(', '),
|
|
254
|
+
theme: promptTheme,
|
|
255
|
+
});
|
|
256
|
+
fieldValues[field.key] = answer
|
|
257
|
+
.split(',')
|
|
258
|
+
.map((s) => Number(s.trim()))
|
|
259
|
+
.filter((n) => !Number.isNaN(n));
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
const suffix = field.unit ? ` (${field.unit})` : '';
|
|
263
|
+
const answer = await input({
|
|
264
|
+
message: ` ${field.label}${suffix}`,
|
|
265
|
+
default: currentVal !== undefined ? String(currentVal) : undefined,
|
|
266
|
+
theme: promptTheme,
|
|
267
|
+
});
|
|
268
|
+
fieldValues[field.key] = answer === '' ? undefined : Number(answer);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
newValues[meta.type] = fieldValues;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
// Build rules
|
|
275
|
+
const rules = buildRules(newValues, newEnabled);
|
|
276
|
+
const enabledCount = Object.values(newEnabled).filter(Boolean).length;
|
|
277
|
+
console.log('');
|
|
278
|
+
console.log(` ${enabledCount} rule${enabledCount !== 1 ? 's' : ''} configured.`);
|
|
279
|
+
if (rules.length === 0) {
|
|
280
|
+
console.log(warn(' No rules \u2014 all transactions will use default deny.'));
|
|
281
|
+
}
|
|
282
|
+
const ok = await confirm({
|
|
283
|
+
message: 'Save policy?',
|
|
284
|
+
default: true,
|
|
285
|
+
theme: promptTheme,
|
|
286
|
+
});
|
|
287
|
+
if (!ok) {
|
|
288
|
+
console.log(dim('\n Cancelled.\n'));
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
const saveSpinner = ora({ text: 'Saving policy\u2026', indent: 2 }).start();
|
|
292
|
+
await adminFetch(ctx.config.serverUrl, `/signers/${ctx.signerId}/policy`, ctx.headers, 'PUT', { rules });
|
|
293
|
+
saveSpinner.succeed(`Policy saved (${enabledCount} rules)`);
|
|
294
|
+
console.log('');
|
|
295
|
+
}));
|
|
296
|
+
// -- Pause / Resume ----------------------------------------------------------
|
|
297
|
+
const pauseCommand = new Command('pause').description('Pause wallet (blocks all signing)').action(withErrorHandler(async (_opts, command) => {
|
|
298
|
+
const ctx = await getAdminContext(command);
|
|
299
|
+
console.log('');
|
|
300
|
+
console.log(` Pause ${chalk.bold(ctx.signerName)} ${dim(`(${fmtAddr(ctx.config.ethAddress)})`)}`);
|
|
301
|
+
console.log(warn(' This will block ALL signing requests until resumed.'));
|
|
302
|
+
console.log('');
|
|
303
|
+
const ok = await confirm({ message: 'Confirm pause?', default: false, theme: promptTheme });
|
|
304
|
+
if (!ok) {
|
|
305
|
+
console.log(dim('\n Cancelled.\n'));
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
const spinner = ora({ text: 'Pausing…', indent: 2 }).start();
|
|
309
|
+
await adminFetch(ctx.config.serverUrl, `/signers/${ctx.signerId}/pause`, ctx.headers, 'POST');
|
|
310
|
+
spinner.succeed('Wallet paused');
|
|
311
|
+
console.log('');
|
|
312
|
+
}));
|
|
313
|
+
const resumeCommand = new Command('resume')
|
|
314
|
+
.description('Resume wallet (re-enables signing)')
|
|
315
|
+
.action(withErrorHandler(async (_opts, command) => {
|
|
316
|
+
const ctx = await getAdminContext(command);
|
|
317
|
+
const ok = await confirm({
|
|
318
|
+
message: `Resume "${ctx.signerName}"?`,
|
|
319
|
+
default: true,
|
|
320
|
+
theme: promptTheme,
|
|
321
|
+
});
|
|
322
|
+
if (!ok) {
|
|
323
|
+
console.log(dim('\n Cancelled.\n'));
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
const spinner = ora({ text: 'Resuming…', indent: 2 }).start();
|
|
327
|
+
await adminFetch(ctx.config.serverUrl, `/signers/${ctx.signerId}/resume`, ctx.headers, 'POST');
|
|
328
|
+
spinner.succeed('Wallet resumed');
|
|
329
|
+
console.log('');
|
|
330
|
+
}));
|
|
331
|
+
// -- Audit -------------------------------------------------------------------
|
|
332
|
+
const auditCommand = new Command('audit')
|
|
333
|
+
.description('View signing request audit log')
|
|
334
|
+
.option('--limit <n>', 'Number of entries', '20')
|
|
335
|
+
.option('--status <status>', 'Filter: completed, blocked, failed, pending')
|
|
336
|
+
.option('--export', 'Output CSV to stdout')
|
|
337
|
+
.action(withErrorHandler(async (opts, command) => {
|
|
338
|
+
const params = new URLSearchParams();
|
|
339
|
+
// Export requires session auth (SessionGuard); list accepts either
|
|
340
|
+
if (opts.export) {
|
|
341
|
+
const { config, headers } = await getAdminContext(command);
|
|
342
|
+
if (!config.signerId)
|
|
343
|
+
throw new Error('No signer ID in config.');
|
|
344
|
+
params.set('signerId', config.signerId);
|
|
345
|
+
if (opts.status)
|
|
346
|
+
params.set('status', opts.status);
|
|
347
|
+
const baseUrl = config.serverUrl.replace(/\/+$/, '');
|
|
348
|
+
const url = `${baseUrl}/api/v1/audit-log/export?${params}`;
|
|
349
|
+
const response = await fetch(url, { headers, signal: AbortSignal.timeout(30_000) });
|
|
350
|
+
if (!response.ok)
|
|
351
|
+
throw new Error(`Server returned ${response.status}`);
|
|
352
|
+
const csv = await response.text();
|
|
353
|
+
process.stdout.write(csv);
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
const { config } = getAuditContext(command);
|
|
357
|
+
const signerId = config.signerId;
|
|
358
|
+
if (!signerId)
|
|
359
|
+
throw new Error('No signer ID in config.');
|
|
360
|
+
params.set('signerId', signerId);
|
|
361
|
+
params.set('limit', opts.limit);
|
|
362
|
+
if (opts.status)
|
|
363
|
+
params.set('status', opts.status);
|
|
364
|
+
const baseUrl = config.serverUrl.replace(/\/+$/, '');
|
|
365
|
+
const headers = { 'x-api-key': config.apiKey };
|
|
366
|
+
const spinner = ora({ text: 'Fetching audit log…', indent: 2 }).start();
|
|
367
|
+
const url = `${baseUrl}/api/v1/audit-log?${params}`;
|
|
368
|
+
const response = await fetch(url, { headers, signal: AbortSignal.timeout(30_000) });
|
|
369
|
+
if (!response.ok)
|
|
370
|
+
throw new Error(`Server returned ${response.status}`);
|
|
371
|
+
const data = (await response.json());
|
|
372
|
+
const entries = data.entries || data.data || [];
|
|
373
|
+
spinner.stop();
|
|
374
|
+
console.log('');
|
|
375
|
+
console.log(` Audit log for ${chalk.bold(config.signerName)}`);
|
|
376
|
+
console.log('');
|
|
377
|
+
if (entries.length === 0) {
|
|
378
|
+
console.log(dim(' No entries found.'));
|
|
379
|
+
}
|
|
380
|
+
else {
|
|
381
|
+
const tw = 12;
|
|
382
|
+
const pw = 14;
|
|
383
|
+
const sw = 10;
|
|
384
|
+
const aw = 14;
|
|
385
|
+
console.log(` ${pad(dim('Time'), 19)} ${pad(dim('Type'), tw)} ${pad(dim('Path'), pw)} ${pad(dim('Status'), sw)} ${pad(dim('To'), aw)} ${dim('Value')}`);
|
|
386
|
+
console.log(dim(` ${'─'.repeat(19)} ${'─'.repeat(tw)} ${'─'.repeat(pw)} ${'─'.repeat(sw)} ${'─'.repeat(aw)} ${'─'.repeat(10)}`));
|
|
387
|
+
for (const e of entries) {
|
|
388
|
+
const time = new Date(e.createdAt).toISOString().replace('T', ' ').slice(0, 19);
|
|
389
|
+
const type = pad(e.requestType || '—', tw);
|
|
390
|
+
const path = pad(e.signingPath || '—', pw);
|
|
391
|
+
const statusFn = e.status === 'completed' ? success : e.status === 'blocked' ? danger : warn;
|
|
392
|
+
const status = pad(statusFn(e.status), sw);
|
|
393
|
+
const to = pad(e.toAddress ? fmtAddr(e.toAddress) : '—', aw);
|
|
394
|
+
const value = e.valueWei ? `${formatWei(e.valueWei)} ETH` : '—';
|
|
395
|
+
console.log(` ${time} ${type} ${path} ${status} ${to} ${value}`);
|
|
396
|
+
}
|
|
397
|
+
console.log('');
|
|
398
|
+
console.log(dim(` ${entries.length} entries. Use --limit to see more, --export for CSV.`));
|
|
399
|
+
}
|
|
400
|
+
console.log('');
|
|
401
|
+
}));
|
|
402
|
+
// ---------------------------------------------------------------------------
|
|
403
|
+
// Main command group
|
|
404
|
+
// ---------------------------------------------------------------------------
|
|
405
|
+
const policiesCommand = new Command('policies').description('Manage signing policies').action(withErrorHandler(async (_opts, command) => {
|
|
406
|
+
await handlePoliciesList(command);
|
|
407
|
+
}));
|
|
408
|
+
policiesCommand.addCommand(policiesEditCommand);
|
|
409
|
+
export const adminCommand = new Command('admin')
|
|
410
|
+
.description('Admin operations — requires agenta login (policies, pause/resume, audit)')
|
|
411
|
+
.addCommand(policiesCommand)
|
|
412
|
+
.addCommand(pauseCommand)
|
|
413
|
+
.addCommand(resumeCommand)
|
|
414
|
+
.addCommand(auditCommand);
|
|
415
|
+
//# sourceMappingURL=admin.command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.command.js","sourceRoot":"","sources":["../../../src/cli/commands/admin.command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAA+B,MAAM,WAAW,CAAC;AACjE,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,EAAqB,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAC9E,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAEvF,8EAA8E;AAC9E,gDAAgD;AAChD,8EAA8E;AAE9E,SAAS,gBAAgB;AACxB,mFAAmF;AACnF,EAAqC;IAGrC,mFAAmF;IACnF,OAAO,KAAK,EAAE,GAAG,IAAW,EAAE,EAAE;QAC/B,IAAI,CAAC;YACJ,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QACnB,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACzB,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;gBAChE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;gBACrC,OAAO;YACR,CAAC;YACD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACzE,OAAO,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC5C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACtB,CAAC;IACF,CAAC,CAAC;AACH,CAAC;AA+BD,8EAA8E;AAC9E,yDAAyD;AACzD,8EAA8E;AAE9E,KAAK,UAAU,eAAe,CAAC,OAAoB;IAClD,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC;IACpD,MAAM,MAAM,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAE5C,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,UAAU,EAAE,CAAC;IACjC,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,sBAAsB,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,OAAO,GAA2B;QACvC,cAAc,EAAE,kBAAkB;QAClC,aAAa,EAAE,UAAU,KAAK,EAAE;KAChC,CAAC;IAEF,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;AACtF,CAAC;AAED,SAAS,eAAe,CAAC,OAAoB;IAI5C,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC;IACpD,MAAM,MAAM,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAC5C,OAAO;QACN,MAAM;QACN,OAAO,EAAE;YACR,WAAW,EAAE,MAAM,CAAC,MAAM;YAC1B,cAAc,EAAE,kBAAkB;SAClC;KACD,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,KAAK,UAAU,UAAU,CACxB,OAAe,EACf,IAAY,EACZ,OAA+B,EAC/B,MAAM,GAAG,KAAK,EACd,IAAc;IAEd,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,IAAI,EAAE,CAAC;IAC3D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QACjC,MAAM;QACN,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;QAC7C,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;KACnC,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QAClB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,SAAc,CAAC;IACnD,OAAO,QAAQ,CAAC,IAAI,EAAgB,CAAC;AACtC,CAAC;AAED,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,SAAS,OAAO,CAAC,OAAe;IAC/B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;IACrD,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACtD,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACxB,OAAO,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AACnD,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,SAAkC;IACrE,QAAQ,IAAI,EAAE,CAAC;QACd,KAAK,YAAY,CAAC,CAAC,CAAC;YACnB,MAAM,EAAE,GAAG,SAAS,CAAC,QAAkB,CAAC;YACxC,MAAM,KAAK,GAAI,SAAS,CAAC,SAAsB,IAAI,EAAE,CAAC;YACtD,MAAM,KAAK,GAAG,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;YACvD,OAAO,GAAG,KAAK,KAAK,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACpE,CAAC;QACD,KAAK,aAAa;YACjB,OAAO,YAAY,SAAS,CAAC,MAAM,EAAE,CAAC;QACvC,KAAK,eAAe;YACnB,OAAO,WAAW,SAAS,CAAC,MAAM,EAAE,CAAC;QACtC,KAAK,iBAAiB;YACrB,OAAO,aAAa,SAAS,CAAC,MAAM,EAAE,CAAC;QACxC,KAAK,UAAU;YACd,OAAO,aAAa,SAAS,CAAC,QAAQ,IAAI,IAAI,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;QACrE,KAAK,WAAW;YACf,OAAO,SAAS,SAAS,CAAC,UAAU,KAAK,CAAC;QAC3C,KAAK,YAAY;YAChB,OAAO,UAAU,SAAS,CAAC,SAAS,OAAO,SAAS,CAAC,OAAO,SAAS,CAAC;QACvE,KAAK,YAAY,CAAC,CAAC,CAAC;YACnB,MAAM,GAAG,GAAI,SAAS,CAAC,QAAqB,IAAI,EAAE,CAAC;YACnD,OAAO,WAAW,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,CAAC;QACD,KAAK,aAAa,CAAC,CAAC,CAAC;YACpB,MAAM,IAAI,GAAI,SAAS,CAAC,SAAsB,IAAI,EAAE,CAAC;YACrD,OAAO,cAAc,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YAClB,MAAM,GAAG,GAAI,SAAS,CAAC,GAAgB,IAAI,EAAE,CAAC;YAC9C,OAAO,QAAQ,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,CAAC;QACD,KAAK,wBAAwB;YAC5B,OAAO,0BAA0B,CAAC;QACnC,KAAK,aAAa;YACjB,OAAO,iBAAiB,SAAS,CAAC,UAAU,GAAG,CAAC;QACjD,KAAK,eAAe;YACnB,OAAO,kBAAkB,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9C;YACC,OAAO,GAAG,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;IACjD,CAAC;AACF,CAAC;AAED,SAAS,SAAS,CAAC,MAA0B;IAC5C,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,GAAG,CAAC;IAC1C,IAAI,CAAC;QACJ,OAAO,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,MAAM,CAAC;IACf,CAAC;AACF,CAAC;AAED,gGAAgG;AAChG,MAAM,OAAO,GAAG,mBAAmB,CAAC;AAEpC,SAAS,GAAG,CAAC,GAAW,EAAE,KAAa;IACtC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACzC,OAAO,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,8EAA8E;AAC9E,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E,+EAA+E;AAE/E,KAAK,UAAU,kBAAkB,CAAC,OAAoB;IACrD,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IAE1E,IAAI,GAAG,GAA0B,IAAI,CAAC;IACtC,IAAI,CAAC;QACJ,GAAG,GAAG,MAAM,UAAU,CACrB,GAAG,CAAC,MAAM,CAAC,SAAS,EACpB,YAAY,GAAG,CAAC,QAAQ,SAAS,EACjC,GAAG,CAAC,OAAO,CACX,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACR,mBAAmB;IACpB,CAAC;IAED,OAAO,CAAC,IAAI,EAAE,CAAC;IAEf,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CACV,gBAAgB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAC1F,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,KAAK,CAAC,4BAA4B,CAAC,iBAAiB,CAAC,CAAC,CAAC;IACvF,CAAC;SAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACxD,IAAI,GAAG,CAAC,OAAO;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAI,IAA4B,CAAC,MAAM,IAAI,QAAQ,CAAC;YAChE,MAAM,QAAQ,GAAI,IAAiD,CAAC,QAAQ,IAAI,EAAE,CAAC;YACnF,MAAM,WAAW,GAAG,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAE/E,OAAO,CAAC,GAAG,CAAC,KAAK,WAAW,MAAM,CAAC,CAAC;YACpC,KAAK,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;gBAClC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAc,CAAC;gBACtC,OAAO,CAAC,GAAG,CAAC,OAAO,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;YACrD,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACjB,CAAC;AAED,MAAM,mBAAmB,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC7C,WAAW,CAAC,iCAAiC,CAAC;KAC9C,MAAM,CACN,gBAAgB,CAAC,KAAK,EAAE,KAAc,EAAE,OAAoB,EAAE,EAAE;IAC/D,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,+BAA+B,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IAElF,IAAI,YAAY,GAA8B,EAAE,CAAC;IACjD,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,MAAM,UAAU,CAC3B,GAAG,CAAC,MAAM,CAAC,SAAS,EACpB,YAAY,GAAG,CAAC,QAAQ,SAAS,EACjC,GAAG,CAAC,OAAO,CACX,CAAC;QACF,YAAY,GAAG,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACR,mBAAmB;IACpB,CAAC;IAED,OAAO,CAAC,IAAI,EAAE,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC;IAC1D,MAAM,UAAU,GAA4B,EAAE,GAAG,OAAO,EAAE,CAAC;IAC3D,MAAM,SAAS,GAA4C,EAAE,GAAG,MAAM,EAAE,CAAC;IAEzE,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAEtE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,KAAK,MAAM,IAAI,IAAI,gBAAgB,EAAE,CAAC;QACrC,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC;QACjD,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC;YAClC,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,WAAW,EAAE;YACnD,OAAO,EAAE,SAAS;YAClB,KAAK,EAAE,WAAW;SAClB,CAAC,CAAC;QAEH,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC;QAErC,IAAI,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YAEnE,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjC,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAE1C,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC7B,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,OAAO,CAAC;wBACtC,OAAO,EAAE,KAAK,KAAK,CAAC,KAAK,EAAE;wBAC3B,OAAO,EAAE,UAAU,KAAK,KAAK;wBAC7B,KAAK,EAAE,WAAW;qBAClB,CAAC,CAAC;gBACJ,CAAC;qBAAM,IACN,KAAK,CAAC,IAAI,KAAK,WAAW;oBAC1B,KAAK,CAAC,IAAI,KAAK,WAAW;oBAC1B,KAAK,CAAC,IAAI,KAAK,KAAK,EACnB,CAAC;oBACF,MAAM,OAAO,GAAI,UAAuB,IAAI,EAAE,CAAC;oBAC/C,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC;wBAC1B,OAAO,EAAE,KAAK,KAAK,CAAC,KAAK,oBAAoB;wBAC7C,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;wBAC3B,KAAK,EAAE,WAAW;qBAClB,CAAC,CAAC;oBACH,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM;yBAC7B,KAAK,CAAC,GAAG,CAAC;yBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;yBACpB,MAAM,CAAC,OAAO,CAAC,CAAC;gBACnB,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACpC,MAAM,OAAO,GAAI,UAAuB,IAAI,EAAE,CAAC;oBAC/C,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC;wBAC1B,OAAO,EAAE,KAAK,KAAK,CAAC,KAAK,+BAA+B;wBACxD,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;wBAC3B,KAAK,EAAE,WAAW;qBAClB,CAAC,CAAC;oBACH,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM;yBAC7B,KAAK,CAAC,GAAG,CAAC;yBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;yBAC5B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnC,CAAC;qBAAM,CAAC;oBACP,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBACpD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC;wBAC1B,OAAO,EAAE,KAAK,KAAK,CAAC,KAAK,GAAG,MAAM,EAAE;wBACpC,OAAO,EAAE,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS;wBAClE,KAAK,EAAE,WAAW;qBAClB,CAAC,CAAC;oBACH,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBACrE,CAAC;YACF,CAAC;YAED,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC;QACpC,CAAC;IACF,CAAC;IAED,cAAc;IACd,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAChD,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAEtE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,YAAY,QAAQ,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;IAElF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC;QACxB,OAAO,EAAE,cAAc;QACvB,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,WAAW;KAClB,CAAC,CAAC;IAEH,IAAI,CAAC,EAAE,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;QACrC,OAAO;IACR,CAAC;IAED,MAAM,WAAW,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IAE5E,MAAM,UAAU,CACf,GAAG,CAAC,MAAM,CAAC,SAAS,EACpB,YAAY,GAAG,CAAC,QAAQ,SAAS,EACjC,GAAG,CAAC,OAAO,EACX,KAAK,EACL,EAAE,KAAK,EAAE,CACT,CAAC;IAEF,WAAW,CAAC,OAAO,CAAC,iBAAiB,YAAY,SAAS,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACjB,CAAC,CAAC,CACF,CAAC;AAEH,+EAA+E;AAE/E,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,mCAAmC,CAAC,CAAC,MAAM,CAChG,gBAAgB,CAAC,KAAK,EAAE,KAAc,EAAE,OAAoB,EAAE,EAAE;IAC/D,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;IAE3C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CACV,WAAW,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CACrF,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;IAC5F,IAAI,CAAC,EAAE,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;QACrC,OAAO;IACR,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IAC7D,MAAM,UAAU,CACf,GAAG,CAAC,MAAM,CAAC,SAAS,EACpB,YAAY,GAAG,CAAC,QAAQ,QAAQ,EAChC,GAAG,CAAC,OAAO,EACX,MAAM,CACN,CAAC;IACF,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACjB,CAAC,CAAC,CACF,CAAC;AAEF,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KACzC,WAAW,CAAC,oCAAoC,CAAC;KACjD,MAAM,CACN,gBAAgB,CAAC,KAAK,EAAE,KAAc,EAAE,OAAoB,EAAE,EAAE;IAC/D,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;IAE3C,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC;QACxB,OAAO,EAAE,WAAW,GAAG,CAAC,UAAU,IAAI;QACtC,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,WAAW;KAClB,CAAC,CAAC;IACH,IAAI,CAAC,EAAE,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;QACrC,OAAO;IACR,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IAC9D,MAAM,UAAU,CACf,GAAG,CAAC,MAAM,CAAC,SAAS,EACpB,YAAY,GAAG,CAAC,QAAQ,SAAS,EACjC,GAAG,CAAC,OAAO,EACX,MAAM,CACN,CAAC;IACF,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACjB,CAAC,CAAC,CACF,CAAC;AAEH,+EAA+E;AAE/E,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KACvC,WAAW,CAAC,gCAAgC,CAAC;KAC7C,MAAM,CAAC,aAAa,EAAE,mBAAmB,EAAE,IAAI,CAAC;KAChD,MAAM,CAAC,mBAAmB,EAAE,6CAA6C,CAAC;KAC1E,MAAM,CAAC,UAAU,EAAE,sBAAsB,CAAC;KAC1C,MAAM,CACN,gBAAgB,CACf,KAAK,EAAE,IAA0D,EAAE,OAAoB,EAAE,EAAE;IAC1F,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;IAErC,mEAAmE;IACnE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QACjB,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;QAC3D,IAAI,CAAC,MAAM,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QACjE,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAEnD,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACrD,MAAM,GAAG,GAAG,GAAG,OAAO,4BAA4B,MAAM,EAAE,CAAC;QAC3D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACpF,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACxE,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1B,OAAO;IACR,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACjC,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAE1D,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACjC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,IAAI,CAAC,MAAM;QAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAEnD,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACrD,MAAM,OAAO,GAA2B,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IAEvE,MAAM,OAAO,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IACxE,MAAM,GAAG,GAAG,GAAG,OAAO,qBAAqB,MAAM,EAAE,CAAC;IACpD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACpF,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAExE,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAoD,CAAC;IACxF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IAEhD,OAAO,CAAC,IAAI,EAAE,CAAC;IAEf,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC;IACzC,CAAC;SAAM,CAAC;QACP,MAAM,EAAE,GAAG,EAAE,CAAC;QACd,MAAM,EAAE,GAAG,EAAE,CAAC;QACd,MAAM,EAAE,GAAG,EAAE,CAAC;QACd,MAAM,EAAE,GAAG,EAAE,CAAC;QAEd,OAAO,CAAC,GAAG,CACV,KAAK,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,OAAO,CAAC,EAAE,CAChJ,CAAC;QACF,OAAO,CAAC,GAAG,CACV,GAAG,CACF,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CACpH,CACD,CAAC;QAEF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAChF,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,WAAW,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;YAC3C,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,WAAW,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;YAC3C,MAAM,QAAQ,GACb,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;YAC7E,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3C,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC7D,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;YAEhE,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,MAAM,KAAK,EAAE,KAAK,KAAK,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CACV,GAAG,CAAC,KAAK,OAAO,CAAC,MAAM,sDAAsD,CAAC,CAC9E,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACjB,CAAC,CACD,CACD,CAAC;AAEH,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,yBAAyB,CAAC,CAAC,MAAM,CAC5F,gBAAgB,CAAC,KAAK,EAAE,KAAc,EAAE,OAAoB,EAAE,EAAE;IAC/D,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC,CAAC,CACF,CAAC;AAEF,eAAe,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC;AAEhD,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC9C,WAAW,CAAC,0EAA0E,CAAC;KACvF,UAAU,CAAC,eAAe,CAAC;KAC3B,UAAU,CAAC,YAAY,CAAC;KACxB,UAAU,CAAC,aAAa,CAAC;KACzB,UAAU,CAAC,YAAY,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"balance.command.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/balance.command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAA+B,MAAM,WAAW,CAAC;AAMjE,eAAO,MAAM,cAAc,SA6DxB,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { formatUnits } from 'viem';
|
|
5
|
+
import { createClientFromConfig, loadSignerConfig } from '../../lib/config.js';
|
|
6
|
+
import { brand, danger, dim, statusColor, warn } from '../theme.js';
|
|
7
|
+
export const balanceCommand = new Command('balance')
|
|
8
|
+
.description('Show ETH balance for the configured account')
|
|
9
|
+
.option('-n, --network <network>', 'Override default network')
|
|
10
|
+
.action(async (options, command) => {
|
|
11
|
+
const spinner = ora({ text: 'Loading configuration...', indent: 2 }).start();
|
|
12
|
+
let config;
|
|
13
|
+
try {
|
|
14
|
+
config = loadSignerConfig(command.optsWithGlobals().signer);
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
18
|
+
spinner.fail(message);
|
|
19
|
+
process.exitCode = 1;
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const network = options.network ?? config.network;
|
|
23
|
+
if (!network) {
|
|
24
|
+
spinner.fail('No network specified. Use --network <name> or set it in signer config.');
|
|
25
|
+
process.exitCode = 1;
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
spinner.text = `Fetching balance on ${network}...`;
|
|
29
|
+
const { api } = createClientFromConfig(config);
|
|
30
|
+
try {
|
|
31
|
+
const signer = await api.getDefaultSigner();
|
|
32
|
+
const bal = await api.getBalance(signer.id, network);
|
|
33
|
+
spinner.succeed(`Balance on ${network}`);
|
|
34
|
+
console.log('');
|
|
35
|
+
console.log(` ${chalk.bold(signer.name)}`);
|
|
36
|
+
console.log(` Address: ${brand(signer.ethAddress)}`);
|
|
37
|
+
if (bal.balances.length === 0) {
|
|
38
|
+
console.log(` ${warn(' No balance data available')}`);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
for (const nb of bal.balances) {
|
|
42
|
+
const ethDisplay = formatUnits(BigInt(nb.balance), 18);
|
|
43
|
+
const label = ` ${nb.network}:`;
|
|
44
|
+
if (nb.rpcError) {
|
|
45
|
+
console.log(`${label.padEnd(20)}${warn('RPC error')}`);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
console.log(`${label.padEnd(20)}${chalk.bold(ethDisplay)} ETH`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
console.log(` Status: ${statusColor(signer.status)}`);
|
|
53
|
+
const explorerUrl = await api.getExplorerTxUrl(network, signer.ethAddress);
|
|
54
|
+
if (explorerUrl) {
|
|
55
|
+
console.log(` Explorer: ${dim(explorerUrl)}`);
|
|
56
|
+
}
|
|
57
|
+
console.log('');
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
61
|
+
spinner.fail(`Failed to fetch balance: ${message}`);
|
|
62
|
+
process.exitCode = 1;
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
//# sourceMappingURL=balance.command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"balance.command.js","sourceRoot":"","sources":["../../../src/cli/commands/balance.command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.command.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/deploy.command.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAA+B,MAAM,WAAW,CAAC;AAiCjE,eAAO,MAAM,aAAa,SA6FxB,CAAC"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { Command } from 'commander';
|
|
4
|
+
import ora from 'ora';
|
|
5
|
+
import { createClientFromConfig, createSignerFromConfig, loadSignerConfig, } from '../../lib/config.js';
|
|
6
|
+
import { brand, danger, dim } from '../theme.js';
|
|
7
|
+
function isHexString(value) {
|
|
8
|
+
const clean = value.startsWith('0x') ? value.slice(2) : value;
|
|
9
|
+
return /^[0-9a-fA-F]*$/.test(clean) && clean.length > 0 && clean.length % 2 === 0;
|
|
10
|
+
}
|
|
11
|
+
function loadBytecode(bytecodeArg) {
|
|
12
|
+
if (existsSync(bytecodeArg)) {
|
|
13
|
+
const content = readFileSync(bytecodeArg, 'utf-8').trim();
|
|
14
|
+
if (!isHexString(content)) {
|
|
15
|
+
throw new Error('File does not contain valid hex bytecode.');
|
|
16
|
+
}
|
|
17
|
+
return content.startsWith('0x') ? content : `0x${content}`;
|
|
18
|
+
}
|
|
19
|
+
if (!isHexString(bytecodeArg)) {
|
|
20
|
+
throw new Error('Bytecode must be a valid hex string or a path to a file containing hex bytecode.');
|
|
21
|
+
}
|
|
22
|
+
return bytecodeArg.startsWith('0x') ? bytecodeArg : `0x${bytecodeArg}`;
|
|
23
|
+
}
|
|
24
|
+
export const deployCommand = new Command('deploy')
|
|
25
|
+
.description('Deploy a smart contract')
|
|
26
|
+
.argument('<bytecode>', 'Contract bytecode (hex string or file path)')
|
|
27
|
+
.option('-n, --network <network>', 'Override default network')
|
|
28
|
+
.option('--constructor-args <args>', 'ABI-encoded constructor arguments (hex)')
|
|
29
|
+
.action(async (bytecodeArg, options, command) => {
|
|
30
|
+
let config;
|
|
31
|
+
try {
|
|
32
|
+
config = loadSignerConfig(command.optsWithGlobals().signer);
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
36
|
+
console.error(danger(`\n Error: ${message}\n`));
|
|
37
|
+
process.exitCode = 1;
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
let bytecode;
|
|
41
|
+
try {
|
|
42
|
+
bytecode = loadBytecode(bytecodeArg);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
46
|
+
console.error(danger(`\n Error: ${message}\n`));
|
|
47
|
+
process.exitCode = 1;
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (options.constructorArgs) {
|
|
51
|
+
const args = options.constructorArgs.startsWith('0x')
|
|
52
|
+
? options.constructorArgs.slice(2)
|
|
53
|
+
: options.constructorArgs;
|
|
54
|
+
bytecode = `${bytecode}${args}`;
|
|
55
|
+
}
|
|
56
|
+
const network = options.network ?? config.network;
|
|
57
|
+
if (!network) {
|
|
58
|
+
console.error(danger('\n Error: No network specified. Use --network <name>.\n'));
|
|
59
|
+
process.exitCode = 1;
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const { api } = createClientFromConfig(config);
|
|
63
|
+
console.log(chalk.bold('\n Contract Deployment'));
|
|
64
|
+
console.log(dim(` ${'-'.repeat(40)}`));
|
|
65
|
+
console.log(` Network: ${network}`);
|
|
66
|
+
console.log(` Bytecode: ${dim(bytecode.slice(0, 24))}...${dim(`(${bytecode.length} chars)`)}`);
|
|
67
|
+
if (options.constructorArgs) {
|
|
68
|
+
console.log(` Args: ${dim(options.constructorArgs.slice(0, 24))}...`);
|
|
69
|
+
}
|
|
70
|
+
console.log('');
|
|
71
|
+
const spinner = ora({ text: 'Loading keyshare...', indent: 2 }).start();
|
|
72
|
+
let signer;
|
|
73
|
+
try {
|
|
74
|
+
signer = await createSignerFromConfig(config);
|
|
75
|
+
spinner.text = 'Deploying contract (threshold ECDSA)...';
|
|
76
|
+
const transaction = {
|
|
77
|
+
to: null,
|
|
78
|
+
data: bytecode,
|
|
79
|
+
value: '0',
|
|
80
|
+
network,
|
|
81
|
+
};
|
|
82
|
+
const result = await signer.signTransaction(transaction);
|
|
83
|
+
spinner.succeed('Contract deployed successfully');
|
|
84
|
+
console.log('');
|
|
85
|
+
console.log(` ${chalk.bold('Tx Hash:')} ${brand(result.txHash)}`);
|
|
86
|
+
const txExplorer = await api.getExplorerTxUrl(network, result.txHash);
|
|
87
|
+
if (txExplorer) {
|
|
88
|
+
console.log(` ${chalk.bold('Tx URL:')} ${dim(txExplorer)}`);
|
|
89
|
+
}
|
|
90
|
+
console.log('');
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
94
|
+
spinner.fail(`Deployment failed: ${message}`);
|
|
95
|
+
process.exitCode = 1;
|
|
96
|
+
}
|
|
97
|
+
finally {
|
|
98
|
+
signer?.destroy();
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
//# sourceMappingURL=deploy.command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.command.js","sourceRoot":"","sources":["../../../src/cli/commands/deploy.command.ts"],"names":[],"mappings":"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"}
|