@vultisig/cli 0.1.0-alpha.1
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 +391 -0
- package/dist/adapters/cli-context.js +25 -0
- package/dist/adapters/cli-context.js.map +1 -0
- package/dist/adapters/cli-runner.js +47 -0
- package/dist/adapters/cli-runner.js.map +1 -0
- package/dist/adapters/index.js +6 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/commands/balance.js +65 -0
- package/dist/commands/balance.js.map +1 -0
- package/dist/commands/chains.js +46 -0
- package/dist/commands/chains.js.map +1 -0
- package/dist/commands/index.js +12 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/settings.js +151 -0
- package/dist/commands/settings.js.map +1 -0
- package/dist/commands/swap.js +180 -0
- package/dist/commands/swap.js.map +1 -0
- package/dist/commands/tokens.js +116 -0
- package/dist/commands/tokens.js.map +1 -0
- package/dist/commands/transaction.js +99 -0
- package/dist/commands/transaction.js.map +1 -0
- package/dist/commands/vault-management.js +360 -0
- package/dist/commands/vault-management.js.map +1 -0
- package/dist/core/command-context.js +81 -0
- package/dist/core/command-context.js.map +1 -0
- package/dist/core/index.js +7 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/password-manager.js +92 -0
- package/dist/core/password-manager.js.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.js +440 -0
- package/dist/index.js.map +1 -0
- package/dist/interactive/completer.js +170 -0
- package/dist/interactive/completer.js.map +1 -0
- package/dist/interactive/event-buffer.js +186 -0
- package/dist/interactive/event-buffer.js.map +1 -0
- package/dist/interactive/index.js +9 -0
- package/dist/interactive/index.js.map +1 -0
- package/dist/interactive/session.js +525 -0
- package/dist/interactive/session.js.map +1 -0
- package/dist/interactive/shell-commands.js +167 -0
- package/dist/interactive/shell-commands.js.map +1 -0
- package/dist/interactive/shell-context.js +112 -0
- package/dist/interactive/shell-context.js.map +1 -0
- package/dist/lib/completion.js +375 -0
- package/dist/lib/completion.js.map +1 -0
- package/dist/lib/config.js +172 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/errors.js +163 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/index.js +9 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/output.js +155 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/version.js +210 -0
- package/dist/lib/version.js.map +1 -0
- package/dist/ui.js +286 -0
- package/dist/ui.js.map +1 -0
- package/package.json +76 -0
package/README.md
ADDED
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
# Vultisig CLI
|
|
2
|
+
|
|
3
|
+
Command-line wallet for Vultisig - secure multi-party computation (MPC) wallet management across 40+ blockchains.
|
|
4
|
+
|
|
5
|
+
> **Tip:** Use `vsig` as a shorthand alias for `vultisig` - all commands work with both!
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
### npm (recommended)
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
# Install globally
|
|
13
|
+
npm install -g @vultisig/cli
|
|
14
|
+
|
|
15
|
+
# Verify installation
|
|
16
|
+
vultisig --version
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### npx (no installation)
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
# Run directly without installing
|
|
23
|
+
npx @vultisig/cli balance ethereum
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### From source
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
# Clone the repository
|
|
30
|
+
git clone https://github.com/vultisig/vultisig-sdk.git
|
|
31
|
+
cd vultisig-sdk
|
|
32
|
+
|
|
33
|
+
# Install dependencies
|
|
34
|
+
yarn install
|
|
35
|
+
|
|
36
|
+
# Run CLI
|
|
37
|
+
yarn cli --help
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Shell Completion
|
|
41
|
+
|
|
42
|
+
Enable tab completion for commands, chains, and vault names (works for both `vultisig` and `vsig`):
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
# Install completion for your shell
|
|
46
|
+
vultisig completion --install
|
|
47
|
+
|
|
48
|
+
# Or manually add to your shell config
|
|
49
|
+
vultisig completion bash >> ~/.bashrc
|
|
50
|
+
vultisig completion zsh >> ~/.zshrc
|
|
51
|
+
vultisig completion fish >> ~/.config/fish/completions/vultisig.fish
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Quick Start
|
|
55
|
+
|
|
56
|
+
### Create a Vault
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
vultisig create
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
You'll be prompted to:
|
|
63
|
+
1. Enter a vault name
|
|
64
|
+
2. Set a password (min 8 characters)
|
|
65
|
+
3. Provide an email for verification
|
|
66
|
+
4. Enter the verification code sent to your email
|
|
67
|
+
|
|
68
|
+
### Check Balances
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
# All chains
|
|
72
|
+
vultisig balance
|
|
73
|
+
|
|
74
|
+
# Specific chain
|
|
75
|
+
vultisig balance ethereum
|
|
76
|
+
|
|
77
|
+
# Include token balances
|
|
78
|
+
vultisig balance ethereum --tokens
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Send Transaction
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
# Send native token
|
|
85
|
+
vultisig send ethereum 0xRecipient... 0.1
|
|
86
|
+
|
|
87
|
+
# Send ERC-20 token
|
|
88
|
+
vultisig send ethereum 0xRecipient... 100 --token 0xTokenAddress...
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Interactive Shell
|
|
92
|
+
|
|
93
|
+
Start an interactive session with tab completion and password caching:
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
vultisig --interactive
|
|
97
|
+
# or
|
|
98
|
+
vultisig -i
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Commands
|
|
102
|
+
|
|
103
|
+
### Vault Management
|
|
104
|
+
|
|
105
|
+
| Command | Description |
|
|
106
|
+
|---------|-------------|
|
|
107
|
+
| `create` | Create a new vault |
|
|
108
|
+
| `import <file>` | Import vault from .vult file |
|
|
109
|
+
| `export [path]` | Export vault to file |
|
|
110
|
+
| `verify <vaultId>` | Verify vault with email code |
|
|
111
|
+
| `vaults` | List all stored vaults |
|
|
112
|
+
| `switch <vaultId>` | Switch to a different vault |
|
|
113
|
+
| `rename <newName>` | Rename the active vault |
|
|
114
|
+
| `info` | Show detailed vault information |
|
|
115
|
+
|
|
116
|
+
### Wallet Operations
|
|
117
|
+
|
|
118
|
+
| Command | Description |
|
|
119
|
+
|---------|-------------|
|
|
120
|
+
| `balance [chain]` | Show balance for a chain or all chains |
|
|
121
|
+
| `send <chain> <to> <amount>` | Send tokens to an address |
|
|
122
|
+
| `addresses` | Show all vault addresses |
|
|
123
|
+
| `portfolio` | Show total portfolio value |
|
|
124
|
+
|
|
125
|
+
### Chain & Token Management
|
|
126
|
+
|
|
127
|
+
| Command | Description |
|
|
128
|
+
|---------|-------------|
|
|
129
|
+
| `chains` | List and manage chains (--add, --remove) |
|
|
130
|
+
| `tokens <chain>` | List and manage tokens for a chain |
|
|
131
|
+
|
|
132
|
+
### Swap Operations
|
|
133
|
+
|
|
134
|
+
| Command | Description |
|
|
135
|
+
|---------|-------------|
|
|
136
|
+
| `swap-chains` | List chains that support swaps |
|
|
137
|
+
| `swap-quote <from> <to> <amount>` | Get a swap quote |
|
|
138
|
+
| `swap <from> <to> <amount>` | Execute a swap |
|
|
139
|
+
|
|
140
|
+
### Settings
|
|
141
|
+
|
|
142
|
+
| Command | Description |
|
|
143
|
+
|---------|-------------|
|
|
144
|
+
| `currency [code]` | View or set currency preference |
|
|
145
|
+
| `server` | Check server connectivity |
|
|
146
|
+
| `address-book` | Manage saved addresses |
|
|
147
|
+
|
|
148
|
+
### CLI Management
|
|
149
|
+
|
|
150
|
+
| Command | Description |
|
|
151
|
+
|---------|-------------|
|
|
152
|
+
| `version` | Show detailed version info |
|
|
153
|
+
| `update` | Check for updates |
|
|
154
|
+
| `completion` | Generate shell completion |
|
|
155
|
+
|
|
156
|
+
### Interactive Shell Commands
|
|
157
|
+
|
|
158
|
+
| Command | Description |
|
|
159
|
+
|---------|-------------|
|
|
160
|
+
| `lock` | Lock vault (clear cached password) |
|
|
161
|
+
| `unlock` | Unlock vault (cache password) |
|
|
162
|
+
| `status` | Show vault status |
|
|
163
|
+
| `help` | Show available commands |
|
|
164
|
+
| `.exit` | Exit the shell |
|
|
165
|
+
|
|
166
|
+
## Global Options
|
|
167
|
+
|
|
168
|
+
```
|
|
169
|
+
-v, --version Show version
|
|
170
|
+
-i, --interactive Start interactive shell mode
|
|
171
|
+
-o, --output <format> Output format: table, json (default: table)
|
|
172
|
+
--silent Suppress informational output, show only results
|
|
173
|
+
--debug Enable debug output
|
|
174
|
+
-h, --help Show help
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### Silent Mode
|
|
178
|
+
|
|
179
|
+
Use `--silent` to suppress spinners, progress messages, and informational output. Only results and errors are shown:
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
# Normal output shows spinners and status messages
|
|
183
|
+
vultisig balance ethereum
|
|
184
|
+
# ✓ Loading vault...
|
|
185
|
+
# ✓ Fetching balance...
|
|
186
|
+
# ETH: 1.5
|
|
187
|
+
|
|
188
|
+
# Silent mode shows only the result
|
|
189
|
+
vultisig balance ethereum --silent
|
|
190
|
+
# ETH: 1.5
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
Silent mode is useful for scripts where you only want the final output.
|
|
194
|
+
|
|
195
|
+
### JSON Output
|
|
196
|
+
|
|
197
|
+
Use `-o json` or `--output json` to get structured JSON output. JSON mode automatically enables silent mode:
|
|
198
|
+
|
|
199
|
+
```bash
|
|
200
|
+
# Get balance as JSON
|
|
201
|
+
vultisig balance ethereum -o json
|
|
202
|
+
```
|
|
203
|
+
```json
|
|
204
|
+
{
|
|
205
|
+
"chain": "ethereum",
|
|
206
|
+
"balance": {
|
|
207
|
+
"native": "1.5",
|
|
208
|
+
"symbol": "ETH",
|
|
209
|
+
"usdValue": "3750.00"
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
```bash
|
|
215
|
+
# Get all balances as JSON
|
|
216
|
+
vultisig balance -o json
|
|
217
|
+
```
|
|
218
|
+
```json
|
|
219
|
+
{
|
|
220
|
+
"balances": [
|
|
221
|
+
{ "chain": "ethereum", "native": "1.5", "symbol": "ETH", "usdValue": "3750.00" },
|
|
222
|
+
{ "chain": "bitcoin", "native": "0.1", "symbol": "BTC", "usdValue": "6500.00" }
|
|
223
|
+
]
|
|
224
|
+
}
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
```bash
|
|
228
|
+
# Get portfolio as JSON
|
|
229
|
+
vultisig portfolio -o json
|
|
230
|
+
```
|
|
231
|
+
```json
|
|
232
|
+
{
|
|
233
|
+
"portfolio": {
|
|
234
|
+
"totalUsdValue": "10250.00",
|
|
235
|
+
"chains": [...]
|
|
236
|
+
},
|
|
237
|
+
"currency": "USD"
|
|
238
|
+
}
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
```bash
|
|
242
|
+
# List vaults as JSON
|
|
243
|
+
vultisig vaults -o json
|
|
244
|
+
```
|
|
245
|
+
```json
|
|
246
|
+
{
|
|
247
|
+
"vaults": [
|
|
248
|
+
{ "id": "abc123", "name": "Main Wallet", "isActive": true }
|
|
249
|
+
],
|
|
250
|
+
"activeVaultId": "abc123"
|
|
251
|
+
}
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
```bash
|
|
255
|
+
# Get swap quote as JSON
|
|
256
|
+
vultisig swap-quote ethereum thorchain 0.1 -o json
|
|
257
|
+
```
|
|
258
|
+
```json
|
|
259
|
+
{
|
|
260
|
+
"quote": {
|
|
261
|
+
"fromChain": "ethereum",
|
|
262
|
+
"toChain": "thorchain",
|
|
263
|
+
"fromAmount": "0.1",
|
|
264
|
+
"expectedOutput": "125.5",
|
|
265
|
+
"route": "..."
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
JSON output is ideal for:
|
|
271
|
+
- Scripting and automation
|
|
272
|
+
- Parsing output programmatically
|
|
273
|
+
- Integration with other tools (e.g., `jq`):
|
|
274
|
+
|
|
275
|
+
```bash
|
|
276
|
+
# Extract just the ETH balance using jq
|
|
277
|
+
vultisig balance ethereum -o json | jq -r '.balance.native'
|
|
278
|
+
|
|
279
|
+
# Get total portfolio value
|
|
280
|
+
vultisig portfolio -o json | jq -r '.portfolio.totalUsdValue'
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
## Configuration
|
|
284
|
+
|
|
285
|
+
### Environment Variables
|
|
286
|
+
|
|
287
|
+
```bash
|
|
288
|
+
# Override config directory
|
|
289
|
+
VULTISIG_CONFIG_DIR=/custom/path
|
|
290
|
+
|
|
291
|
+
# Disable colored output
|
|
292
|
+
VULTISIG_NO_COLOR=1
|
|
293
|
+
|
|
294
|
+
# Enable silent mode (suppress spinners and info messages)
|
|
295
|
+
VULTISIG_SILENT=1
|
|
296
|
+
|
|
297
|
+
# Enable debug output
|
|
298
|
+
VULTISIG_DEBUG=1
|
|
299
|
+
|
|
300
|
+
# Disable update checking
|
|
301
|
+
VULTISIG_NO_UPDATE_CHECK=1
|
|
302
|
+
|
|
303
|
+
# Vault password (for automation - use with caution!)
|
|
304
|
+
VAULT_PASSWORD=mypassword
|
|
305
|
+
|
|
306
|
+
# Multiple vault passwords
|
|
307
|
+
VAULT_PASSWORDS="Vault1:pass1 Vault2:pass2"
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
### Config Directory
|
|
311
|
+
|
|
312
|
+
Configuration is stored in `~/.vultisig/`:
|
|
313
|
+
|
|
314
|
+
```
|
|
315
|
+
~/.vultisig/
|
|
316
|
+
├── config.json # User preferences
|
|
317
|
+
├── vaults/ # Vault data
|
|
318
|
+
├── cache/ # Version checks, etc.
|
|
319
|
+
└── address-book.json
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
## Security Best Practices
|
|
323
|
+
|
|
324
|
+
- Never store passwords in plain text for production use
|
|
325
|
+
- Always verify transaction details before confirming
|
|
326
|
+
- Use testnets for development and testing
|
|
327
|
+
- Keep vault backup files in a secure location
|
|
328
|
+
- Never commit .vult files or .env with passwords to git
|
|
329
|
+
|
|
330
|
+
## Supported Chains
|
|
331
|
+
|
|
332
|
+
40+ blockchains including:
|
|
333
|
+
- **EVM**: Ethereum, Polygon, Arbitrum, Optimism, BSC, Base, Avalanche
|
|
334
|
+
- **UTXO**: Bitcoin, Litecoin, Dogecoin, Dash, Zcash
|
|
335
|
+
- **Cosmos**: Cosmos Hub, THORChain, Maya, Dydx, Kujira
|
|
336
|
+
- **Others**: Solana, Sui, Polkadot, Ripple
|
|
337
|
+
|
|
338
|
+
## Exit Codes
|
|
339
|
+
|
|
340
|
+
| Code | Meaning |
|
|
341
|
+
|------|---------|
|
|
342
|
+
| 0 | Success |
|
|
343
|
+
| 1 | General error |
|
|
344
|
+
| 2 | Invalid usage |
|
|
345
|
+
| 3 | Configuration error |
|
|
346
|
+
| 4 | Authentication error |
|
|
347
|
+
| 5 | Network error |
|
|
348
|
+
| 6 | Vault error |
|
|
349
|
+
| 7 | Transaction error |
|
|
350
|
+
|
|
351
|
+
## Troubleshooting
|
|
352
|
+
|
|
353
|
+
### "No active vault" error
|
|
354
|
+
|
|
355
|
+
Create or import a vault first:
|
|
356
|
+
```bash
|
|
357
|
+
vultisig create
|
|
358
|
+
# or
|
|
359
|
+
vultisig import /path/to/vault.vult
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
### Network errors
|
|
363
|
+
|
|
364
|
+
1. Check your internet connection
|
|
365
|
+
2. Run `vultisig server` to check connectivity
|
|
366
|
+
3. Try again in a few moments
|
|
367
|
+
|
|
368
|
+
### Update issues
|
|
369
|
+
|
|
370
|
+
```bash
|
|
371
|
+
# Check for updates
|
|
372
|
+
vultisig update --check
|
|
373
|
+
|
|
374
|
+
# Update manually
|
|
375
|
+
npm update -g @vultisig/cli
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
## Documentation
|
|
379
|
+
|
|
380
|
+
- [SDK Documentation](../../packages/sdk/README.md)
|
|
381
|
+
- [API Reference](https://docs.vultisig.com)
|
|
382
|
+
|
|
383
|
+
## Support
|
|
384
|
+
|
|
385
|
+
- [GitHub Issues](https://github.com/vultisig/vultisig-sdk/issues)
|
|
386
|
+
- [Discord](https://discord.gg/vultisig)
|
|
387
|
+
- [Documentation](https://docs.vultisig.com)
|
|
388
|
+
|
|
389
|
+
## License
|
|
390
|
+
|
|
391
|
+
MIT
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { BaseCommandContext } from '../core/command-context';
|
|
2
|
+
import { getPassword } from '../core/password-manager';
|
|
3
|
+
/**
|
|
4
|
+
* CLI-specific implementation of CommandContext
|
|
5
|
+
*/
|
|
6
|
+
export class CLIContext extends BaseCommandContext {
|
|
7
|
+
get isInteractive() {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Get password for a vault
|
|
12
|
+
* In CLI mode, we check env vars first, then prompt
|
|
13
|
+
* No caching since each command runs independently
|
|
14
|
+
*/
|
|
15
|
+
async getPassword(vaultId, vaultName) {
|
|
16
|
+
return getPassword(vaultId, vaultName);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Create a CLI context from an initialized SDK
|
|
21
|
+
*/
|
|
22
|
+
export function createCLIContext(sdk) {
|
|
23
|
+
return new CLIContext(sdk);
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=cli-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-context.js","sourceRoot":"","sources":["../../src/adapters/cli-context.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAEtD;;GAEG;AACH,MAAM,OAAO,UAAW,SAAQ,kBAAkB;IAChD,IAAI,aAAa;QACf,OAAO,KAAK,CAAA;IACd,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,WAAW,CAAC,OAAe,EAAE,SAAkB;QACnD,OAAO,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IACxC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAa;IAC5C,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,CAAA;AAC5B,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Runner - Wraps command execution for CLI mode
|
|
3
|
+
*
|
|
4
|
+
* Provides:
|
|
5
|
+
* - Error handling with process exit
|
|
6
|
+
* - Consistent exit codes
|
|
7
|
+
* - Cleanup on completion
|
|
8
|
+
*/
|
|
9
|
+
import { isJsonOutput, outputJsonError, printError } from '../lib/output';
|
|
10
|
+
/**
|
|
11
|
+
* Wrap a command handler with CLI exit behavior
|
|
12
|
+
* - Exits with code 0 on success
|
|
13
|
+
* - Exits with code 1 on error (or custom exitCode)
|
|
14
|
+
*/
|
|
15
|
+
export function withExit(handler) {
|
|
16
|
+
return async (...args) => {
|
|
17
|
+
try {
|
|
18
|
+
await handler(...args);
|
|
19
|
+
process.exit(0);
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
const exitCode = err.exitCode ?? 1;
|
|
23
|
+
// In JSON mode, output structured error
|
|
24
|
+
if (isJsonOutput()) {
|
|
25
|
+
outputJsonError(err.message, err.code ?? 'GENERAL_ERROR');
|
|
26
|
+
process.exit(exitCode);
|
|
27
|
+
}
|
|
28
|
+
if (err.exitCode !== undefined) {
|
|
29
|
+
process.exit(err.exitCode);
|
|
30
|
+
}
|
|
31
|
+
printError(`\nx ${err.message}`);
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Run a command with context and automatic cleanup
|
|
38
|
+
*/
|
|
39
|
+
export async function runCommand(ctx, handler) {
|
|
40
|
+
try {
|
|
41
|
+
return await handler();
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
// Context cleanup happens in the withExit wrapper
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=cli-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-runner.js","sourceRoot":"","sources":["../../src/adapters/cli-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAGzE;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAkB,OAAsC;IAC9E,OAAO,KAAK,EAAE,GAAG,IAAO,EAAE,EAAE;QAC1B,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,GAAG,IAAI,CAAC,CAAA;YACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAA;YAElC,wCAAwC;YACxC,IAAI,YAAY,EAAE,EAAE,CAAC;gBACnB,eAAe,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,IAAI,eAAe,CAAC,CAAA;gBACzD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YACxB,CAAC;YAED,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC/B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YAC5B,CAAC;YACD,UAAU,CAAC,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;YAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;IACH,CAAC,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAI,GAAe,EAAE,OAAyB;IAC5E,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,EAAE,CAAA;IACxB,CAAC;YAAS,CAAC;QACT,kDAAkD;IACpD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { fiatCurrencies, fiatCurrencyNameRecord } from '@vultisig/sdk';
|
|
2
|
+
import { createSpinner, error, isJsonOutput, outputJson, warn } from '../lib/output';
|
|
3
|
+
import { displayBalance, displayBalancesTable, displayPortfolio } from '../ui';
|
|
4
|
+
/**
|
|
5
|
+
* Execute balance command - show balance for one chain or all chains
|
|
6
|
+
*/
|
|
7
|
+
export async function executeBalance(ctx, options = {}) {
|
|
8
|
+
const vault = await ctx.ensureActiveVault();
|
|
9
|
+
const spinner = createSpinner('Loading balances...');
|
|
10
|
+
if (options.chain) {
|
|
11
|
+
const balance = await vault.balance(options.chain);
|
|
12
|
+
spinner.succeed('Balance loaded');
|
|
13
|
+
if (isJsonOutput()) {
|
|
14
|
+
outputJson({ chain: options.chain, balance });
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
displayBalance(options.chain, balance);
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
const balances = await vault.balances(undefined, options.includeTokens);
|
|
21
|
+
spinner.succeed('Balances loaded');
|
|
22
|
+
if (isJsonOutput()) {
|
|
23
|
+
outputJson({ balances });
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
displayBalancesTable(balances);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Execute portfolio command - show total portfolio value with breakdown
|
|
31
|
+
*/
|
|
32
|
+
export async function executePortfolio(ctx, options = {}) {
|
|
33
|
+
const vault = await ctx.ensureActiveVault();
|
|
34
|
+
const currency = options.currency || 'usd';
|
|
35
|
+
if (!fiatCurrencies.includes(currency)) {
|
|
36
|
+
error(`x Invalid currency: ${currency}`);
|
|
37
|
+
warn(`Supported currencies: ${fiatCurrencies.join(', ')}`);
|
|
38
|
+
throw new Error('Invalid currency');
|
|
39
|
+
}
|
|
40
|
+
if (vault.currency !== currency) {
|
|
41
|
+
await vault.setCurrency(currency);
|
|
42
|
+
}
|
|
43
|
+
const currencyName = fiatCurrencyNameRecord[currency];
|
|
44
|
+
const spinner = createSpinner(`Loading portfolio in ${currencyName}...`);
|
|
45
|
+
const totalValue = await vault.getTotalValue(currency);
|
|
46
|
+
const chains = vault.chains;
|
|
47
|
+
const chainBalances = await Promise.all(chains.map(async (chain) => {
|
|
48
|
+
const balance = await vault.balance(chain);
|
|
49
|
+
try {
|
|
50
|
+
const value = await vault.getValue(chain, undefined, currency);
|
|
51
|
+
return { chain, balance, value };
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return { chain, balance };
|
|
55
|
+
}
|
|
56
|
+
}));
|
|
57
|
+
const portfolio = { totalValue, chainBalances };
|
|
58
|
+
spinner.succeed('Portfolio loaded');
|
|
59
|
+
if (isJsonOutput()) {
|
|
60
|
+
outputJson({ portfolio, currency });
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
displayPortfolio(portfolio, currency);
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=balance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"balance.js","sourceRoot":"","sources":["../../src/commands/balance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { createSpinner, info, isJsonOutput, outputJson, printResult, success } from '../lib/output';
|
|
3
|
+
import { displayAddresses } from '../ui';
|
|
4
|
+
/**
|
|
5
|
+
* Execute chains command - list, add, or remove chains
|
|
6
|
+
*/
|
|
7
|
+
export async function executeChains(ctx, options = {}) {
|
|
8
|
+
const vault = await ctx.ensureActiveVault();
|
|
9
|
+
if (options.add) {
|
|
10
|
+
await vault.addChain(options.add);
|
|
11
|
+
success(`\n+ Added chain: ${options.add}`);
|
|
12
|
+
const address = await vault.address(options.add);
|
|
13
|
+
info(`Address: ${address}`);
|
|
14
|
+
}
|
|
15
|
+
else if (options.remove) {
|
|
16
|
+
await vault.removeChain(options.remove);
|
|
17
|
+
success(`\n+ Removed chain: ${options.remove}`);
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
const chains = vault.chains;
|
|
21
|
+
if (isJsonOutput()) {
|
|
22
|
+
outputJson({ chains: [...chains] });
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
printResult(chalk.cyan('\nActive Chains:\n'));
|
|
26
|
+
chains.forEach((chain) => {
|
|
27
|
+
printResult(` - ${chain}`);
|
|
28
|
+
});
|
|
29
|
+
info(chalk.gray('\nUse --add <chain> to add a chain or --remove <chain> to remove one'));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Execute addresses command - show all vault addresses
|
|
34
|
+
*/
|
|
35
|
+
export async function executeAddresses(ctx) {
|
|
36
|
+
const vault = await ctx.ensureActiveVault();
|
|
37
|
+
const spinner = createSpinner('Loading addresses...');
|
|
38
|
+
const addresses = await vault.addresses();
|
|
39
|
+
spinner.succeed('Addresses loaded');
|
|
40
|
+
if (isJsonOutput()) {
|
|
41
|
+
outputJson({ addresses });
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
displayAddresses(addresses);
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=chains.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chains.js","sourceRoot":"","sources":["../../src/commands/chains.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACnG,OAAO,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAA;AAOxC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAmB,EAAE,UAAyB,EAAE;IAClF,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,iBAAiB,EAAE,CAAA;IAE3C,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,MAAM,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACjC,OAAO,CAAC,oBAAoB,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;QAC1C,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAChD,IAAI,CAAC,YAAY,OAAO,EAAE,CAAC,CAAA;IAC7B,CAAC;SAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QACvC,OAAO,CAAC,sBAAsB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IACjD,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAA;QAE3B,IAAI,YAAY,EAAE,EAAE,CAAC;YACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,CAAA;YACnC,OAAM;QACR,CAAC;QAED,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAA;QAC7C,MAAM,CAAC,OAAO,CAAC,CAAC,KAAY,EAAE,EAAE;YAC9B,WAAW,CAAC,OAAO,KAAK,EAAE,CAAC,CAAA;QAC7B,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC,CAAA;IAC1F,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAmB;IACxD,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,iBAAiB,EAAE,CAAA;IAE3C,MAAM,OAAO,GAAG,aAAa,CAAC,sBAAsB,CAAC,CAAA;IACrD,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE,CAAA;IAEzC,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAA;IAEnC,IAAI,YAAY,EAAE,EAAE,CAAC;QACnB,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC,CAAA;QACzB,OAAM;IACR,CAAC;IAED,gBAAgB,CAAC,SAAS,CAAC,CAAA;AAC7B,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command exports - all command logic for CLI and Interactive Shell
|
|
3
|
+
*/
|
|
4
|
+
export { executeBalance, executePortfolio } from './balance';
|
|
5
|
+
export { executeAddresses, executeChains } from './chains';
|
|
6
|
+
export { addToken, executeTokens, listTokens, removeToken } from './tokens';
|
|
7
|
+
// Transaction commands
|
|
8
|
+
export { executeSend, sendTransaction } from './transaction';
|
|
9
|
+
export { executeCreate, executeExport, executeImport, executeInfo, executeRename, executeSwitch, executeVaults, executeVerify, } from './vault-management';
|
|
10
|
+
export { executeSwap, executeSwapChains, executeSwapQuote } from './swap';
|
|
11
|
+
export { executeAddressBook, executeCurrency, executeServer } from './settings';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAI5D,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAI1D,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAE3E,uBAAuB;AACvB,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAI5D,OAAO,EACL,aAAa,EACb,aAAa,EACb,aAAa,EACb,WAAW,EACX,aAAa,EACb,aAAa,EACb,aAAa,EACb,aAAa,GACd,MAAM,oBAAoB,CAAA;AAI3B,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAA;AAIzE,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA"}
|