@vultisig/cli 0.1.0-alpha.1 → 0.1.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/README.md +6 -0
- package/dist/index.js +3185 -361
- package/package.json +4 -3
- package/dist/adapters/cli-context.js +0 -25
- package/dist/adapters/cli-context.js.map +0 -1
- package/dist/adapters/cli-runner.js +0 -47
- package/dist/adapters/cli-runner.js.map +0 -1
- package/dist/adapters/index.js +0 -6
- package/dist/adapters/index.js.map +0 -1
- package/dist/commands/balance.js +0 -65
- package/dist/commands/balance.js.map +0 -1
- package/dist/commands/chains.js +0 -46
- package/dist/commands/chains.js.map +0 -1
- package/dist/commands/index.js +0 -12
- package/dist/commands/index.js.map +0 -1
- package/dist/commands/settings.js +0 -151
- package/dist/commands/settings.js.map +0 -1
- package/dist/commands/swap.js +0 -180
- package/dist/commands/swap.js.map +0 -1
- package/dist/commands/tokens.js +0 -116
- package/dist/commands/tokens.js.map +0 -1
- package/dist/commands/transaction.js +0 -99
- package/dist/commands/transaction.js.map +0 -1
- package/dist/commands/vault-management.js +0 -360
- package/dist/commands/vault-management.js.map +0 -1
- package/dist/core/command-context.js +0 -81
- package/dist/core/command-context.js.map +0 -1
- package/dist/core/index.js +0 -7
- package/dist/core/index.js.map +0 -1
- package/dist/core/password-manager.js +0 -92
- package/dist/core/password-manager.js.map +0 -1
- package/dist/core/types.js +0 -2
- package/dist/core/types.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/interactive/completer.js +0 -170
- package/dist/interactive/completer.js.map +0 -1
- package/dist/interactive/event-buffer.js +0 -186
- package/dist/interactive/event-buffer.js.map +0 -1
- package/dist/interactive/index.js +0 -9
- package/dist/interactive/index.js.map +0 -1
- package/dist/interactive/session.js +0 -525
- package/dist/interactive/session.js.map +0 -1
- package/dist/interactive/shell-commands.js +0 -167
- package/dist/interactive/shell-commands.js.map +0 -1
- package/dist/interactive/shell-context.js +0 -112
- package/dist/interactive/shell-context.js.map +0 -1
- package/dist/lib/completion.js +0 -375
- package/dist/lib/completion.js.map +0 -1
- package/dist/lib/config.js +0 -172
- package/dist/lib/config.js.map +0 -1
- package/dist/lib/errors.js +0 -163
- package/dist/lib/errors.js.map +0 -1
- package/dist/lib/index.js +0 -9
- package/dist/lib/index.js.map +0 -1
- package/dist/lib/output.js +0 -155
- package/dist/lib/output.js.map +0 -1
- package/dist/lib/version.js +0 -210
- package/dist/lib/version.js.map +0 -1
- package/dist/ui.js +0 -286
- package/dist/ui.js.map +0 -1
package/dist/lib/version.js
DELETED
|
@@ -1,210 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Version Management for Vultisig CLI
|
|
3
|
-
*
|
|
4
|
-
* Provides version display and update checking functionality
|
|
5
|
-
*/
|
|
6
|
-
import chalk from 'chalk';
|
|
7
|
-
import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'fs';
|
|
8
|
-
import { homedir } from 'os';
|
|
9
|
-
import { join } from 'path';
|
|
10
|
-
import { info } from './output';
|
|
11
|
-
// Package version (will be replaced during build or read from package.json)
|
|
12
|
-
let cachedVersion = null;
|
|
13
|
-
/**
|
|
14
|
-
* Get the current CLI version
|
|
15
|
-
*/
|
|
16
|
-
export function getVersion() {
|
|
17
|
-
if (cachedVersion)
|
|
18
|
-
return cachedVersion;
|
|
19
|
-
try {
|
|
20
|
-
// Try to read from package.json in the installed location
|
|
21
|
-
const packagePath = new URL('../../package.json', import.meta.url);
|
|
22
|
-
const pkg = JSON.parse(readFileSync(packagePath, 'utf-8'));
|
|
23
|
-
cachedVersion = pkg.version;
|
|
24
|
-
return cachedVersion;
|
|
25
|
-
}
|
|
26
|
-
catch {
|
|
27
|
-
// Fallback version
|
|
28
|
-
cachedVersion = '0.1.0-beta.1';
|
|
29
|
-
return cachedVersion;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
const CACHE_DIR = join(homedir(), '.vultisig', 'cache');
|
|
33
|
-
const VERSION_CACHE_FILE = join(CACHE_DIR, 'version-check.json');
|
|
34
|
-
const CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours
|
|
35
|
-
/**
|
|
36
|
-
* Read version cache
|
|
37
|
-
*/
|
|
38
|
-
function readVersionCache() {
|
|
39
|
-
try {
|
|
40
|
-
if (!existsSync(VERSION_CACHE_FILE))
|
|
41
|
-
return null;
|
|
42
|
-
const data = readFileSync(VERSION_CACHE_FILE, 'utf-8');
|
|
43
|
-
return JSON.parse(data);
|
|
44
|
-
}
|
|
45
|
-
catch {
|
|
46
|
-
return null;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Write version cache
|
|
51
|
-
*/
|
|
52
|
-
function writeVersionCache(cache) {
|
|
53
|
-
try {
|
|
54
|
-
if (!existsSync(CACHE_DIR)) {
|
|
55
|
-
mkdirSync(CACHE_DIR, { recursive: true });
|
|
56
|
-
}
|
|
57
|
-
writeFileSync(VERSION_CACHE_FILE, JSON.stringify(cache, null, 2));
|
|
58
|
-
}
|
|
59
|
-
catch {
|
|
60
|
-
// Ignore cache write errors
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Check npm registry for latest version
|
|
65
|
-
*/
|
|
66
|
-
async function fetchLatestVersion() {
|
|
67
|
-
try {
|
|
68
|
-
const controller = new AbortController();
|
|
69
|
-
const timeout = setTimeout(() => controller.abort(), 5000); // 5 second timeout
|
|
70
|
-
const response = await fetch('https://registry.npmjs.org/@vultisig/cli/latest', {
|
|
71
|
-
signal: controller.signal,
|
|
72
|
-
headers: {
|
|
73
|
-
Accept: 'application/json',
|
|
74
|
-
},
|
|
75
|
-
});
|
|
76
|
-
clearTimeout(timeout);
|
|
77
|
-
if (!response.ok)
|
|
78
|
-
return null;
|
|
79
|
-
const data = (await response.json());
|
|
80
|
-
return data.version ?? null;
|
|
81
|
-
}
|
|
82
|
-
catch {
|
|
83
|
-
return null;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Compare semantic versions
|
|
88
|
-
* Returns true if v2 is newer than v1
|
|
89
|
-
*/
|
|
90
|
-
function isNewerVersion(v1, v2) {
|
|
91
|
-
const parse = (v) => {
|
|
92
|
-
// Remove 'v' prefix and beta/alpha suffixes for comparison
|
|
93
|
-
const clean = v.replace(/^v/, '').replace(/-.*$/, '');
|
|
94
|
-
return clean.split('.').map(n => parseInt(n, 10) || 0);
|
|
95
|
-
};
|
|
96
|
-
const p1 = parse(v1);
|
|
97
|
-
const p2 = parse(v2);
|
|
98
|
-
for (let i = 0; i < 3; i++) {
|
|
99
|
-
const n1 = p1[i] ?? 0;
|
|
100
|
-
const n2 = p2[i] ?? 0;
|
|
101
|
-
if (n2 > n1)
|
|
102
|
-
return true;
|
|
103
|
-
if (n2 < n1)
|
|
104
|
-
return false;
|
|
105
|
-
}
|
|
106
|
-
// Check if v2 is stable while v1 is beta/alpha
|
|
107
|
-
if (v1.includes('-') && !v2.includes('-'))
|
|
108
|
-
return true;
|
|
109
|
-
return false;
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Check for updates (non-blocking, returns immediately if cached)
|
|
113
|
-
*/
|
|
114
|
-
export async function checkForUpdates() {
|
|
115
|
-
// Skip if update check is disabled
|
|
116
|
-
if (process.env.VULTISIG_NO_UPDATE_CHECK === '1') {
|
|
117
|
-
return null;
|
|
118
|
-
}
|
|
119
|
-
const currentVersion = getVersion();
|
|
120
|
-
const cache = readVersionCache();
|
|
121
|
-
// Use cached result if still valid
|
|
122
|
-
if (cache && Date.now() - cache.lastCheck < CACHE_TTL_MS) {
|
|
123
|
-
return {
|
|
124
|
-
currentVersion,
|
|
125
|
-
latestVersion: cache.latestVersion,
|
|
126
|
-
updateAvailable: cache.latestVersion ? isNewerVersion(currentVersion, cache.latestVersion) : false,
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
// Fetch in background, don't block
|
|
130
|
-
const latestVersion = await fetchLatestVersion();
|
|
131
|
-
// Update cache
|
|
132
|
-
writeVersionCache({
|
|
133
|
-
lastCheck: Date.now(),
|
|
134
|
-
latestVersion,
|
|
135
|
-
});
|
|
136
|
-
return {
|
|
137
|
-
currentVersion,
|
|
138
|
-
latestVersion,
|
|
139
|
-
updateAvailable: latestVersion ? isNewerVersion(currentVersion, latestVersion) : false,
|
|
140
|
-
};
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* Print update notification if available
|
|
144
|
-
*/
|
|
145
|
-
export async function printUpdateNotification() {
|
|
146
|
-
try {
|
|
147
|
-
const result = await checkForUpdates();
|
|
148
|
-
if (result?.updateAvailable && result.latestVersion) {
|
|
149
|
-
info('');
|
|
150
|
-
info(chalk.yellow(`Update available: ${result.currentVersion} -> ${result.latestVersion}`));
|
|
151
|
-
info(chalk.gray(`Run "vultisig update" or "npm update -g @vultisig/cli" to update`));
|
|
152
|
-
info('');
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
catch {
|
|
156
|
-
// Silently ignore update check failures
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
/**
|
|
160
|
-
* Format version output for --version flag
|
|
161
|
-
*/
|
|
162
|
-
export function formatVersionShort() {
|
|
163
|
-
return `vultisig/${getVersion()}`;
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* Format detailed version output for 'version' command
|
|
167
|
-
*/
|
|
168
|
-
export function formatVersionDetailed() {
|
|
169
|
-
const lines = [];
|
|
170
|
-
lines.push(chalk.bold(`Vultisig CLI v${getVersion()}`));
|
|
171
|
-
lines.push('');
|
|
172
|
-
lines.push(` Node.js: ${process.version}`);
|
|
173
|
-
lines.push(` Platform: ${process.platform}-${process.arch}`);
|
|
174
|
-
lines.push(` Config: ~/.vultisig/`);
|
|
175
|
-
return lines.join('\n');
|
|
176
|
-
}
|
|
177
|
-
export function detectInstallMethod() {
|
|
178
|
-
const execPath = process.execPath;
|
|
179
|
-
if (execPath.includes('homebrew') || execPath.includes('Cellar')) {
|
|
180
|
-
return 'homebrew';
|
|
181
|
-
}
|
|
182
|
-
if (process.env.npm_execpath?.includes('yarn')) {
|
|
183
|
-
return 'yarn';
|
|
184
|
-
}
|
|
185
|
-
if (process.env.npm_config_user_agent?.includes('npm')) {
|
|
186
|
-
return 'npm';
|
|
187
|
-
}
|
|
188
|
-
// Check if running from global npm/yarn
|
|
189
|
-
if (execPath.includes('node_modules')) {
|
|
190
|
-
return 'npm';
|
|
191
|
-
}
|
|
192
|
-
return 'unknown';
|
|
193
|
-
}
|
|
194
|
-
/**
|
|
195
|
-
* Get update command for detected install method
|
|
196
|
-
*/
|
|
197
|
-
export function getUpdateCommand() {
|
|
198
|
-
const method = detectInstallMethod();
|
|
199
|
-
switch (method) {
|
|
200
|
-
case 'npm':
|
|
201
|
-
return 'npm update -g @vultisig/cli';
|
|
202
|
-
case 'yarn':
|
|
203
|
-
return 'yarn global upgrade @vultisig/cli';
|
|
204
|
-
case 'homebrew':
|
|
205
|
-
return 'brew upgrade vultisig';
|
|
206
|
-
default:
|
|
207
|
-
return 'npm update -g @vultisig/cli';
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
//# sourceMappingURL=version.js.map
|
package/dist/lib/version.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/lib/version.ts"],"names":[],"mappings":"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"}
|
package/dist/ui.js
DELETED
|
@@ -1,286 +0,0 @@
|
|
|
1
|
-
import { fiatCurrencyNameRecord, Vultisig } from '@vultisig/sdk';
|
|
2
|
-
import chalk from 'chalk';
|
|
3
|
-
import inquirer from 'inquirer';
|
|
4
|
-
// Import output helpers
|
|
5
|
-
import { info, isJsonOutput, printError, printResult, printTable, warn } from './lib/output';
|
|
6
|
-
// ============================================================================
|
|
7
|
-
// Display Formatters
|
|
8
|
-
// ============================================================================
|
|
9
|
-
export function displayBalance(chain, balance) {
|
|
10
|
-
printResult(chalk.cyan(`\n${chain} Balance:`));
|
|
11
|
-
printResult(` Amount: ${balance.amount} ${balance.symbol}`);
|
|
12
|
-
if (balance.fiatValue && balance.fiatCurrency) {
|
|
13
|
-
printResult(` Value: ${balance.fiatValue.toFixed(2)} ${balance.fiatCurrency}`);
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
export function displayBalancesTable(balances) {
|
|
17
|
-
printResult(chalk.cyan('\nPortfolio Balances:\n'));
|
|
18
|
-
const tableData = Object.entries(balances).map(([chain, balance]) => ({
|
|
19
|
-
Chain: chain,
|
|
20
|
-
Amount: balance.amount,
|
|
21
|
-
Symbol: balance.symbol,
|
|
22
|
-
Value: balance.fiatValue && balance.fiatCurrency ? `${balance.fiatValue.toFixed(2)} ${balance.fiatCurrency}` : 'N/A',
|
|
23
|
-
}));
|
|
24
|
-
printTable(tableData);
|
|
25
|
-
}
|
|
26
|
-
export function displayPortfolio(portfolio, currency) {
|
|
27
|
-
const currencyName = fiatCurrencyNameRecord[currency];
|
|
28
|
-
// Display total value
|
|
29
|
-
printResult(chalk.cyan('\n+----------------------------------------+'));
|
|
30
|
-
printResult(chalk.cyan(`| Portfolio Total Value (${currencyName}) |`));
|
|
31
|
-
printResult(chalk.cyan('+----------------------------------------+'));
|
|
32
|
-
const totalDisplay = portfolio.totalValue.amount.padEnd(20) + portfolio.totalValue.currency.toUpperCase().padStart(16);
|
|
33
|
-
printResult(chalk.cyan('| ') + chalk.bold.green(totalDisplay) + chalk.cyan(' |'));
|
|
34
|
-
printResult(chalk.cyan('+----------------------------------------+\n'));
|
|
35
|
-
// Display breakdown by chain
|
|
36
|
-
printResult(chalk.bold('Chain Breakdown:\n'));
|
|
37
|
-
const table = portfolio.chainBalances.map(({ chain, balance, value }) => ({
|
|
38
|
-
Chain: chain,
|
|
39
|
-
Amount: balance.amount,
|
|
40
|
-
Symbol: balance.symbol,
|
|
41
|
-
Value: value ? `${value.amount} ${value.currency.toUpperCase()}` : 'N/A',
|
|
42
|
-
}));
|
|
43
|
-
printTable(table);
|
|
44
|
-
}
|
|
45
|
-
export function displayAddresses(addresses) {
|
|
46
|
-
printResult(chalk.cyan('\nVault Addresses:\n'));
|
|
47
|
-
const table = Object.entries(addresses).map(([chain, address]) => ({
|
|
48
|
-
Chain: chain,
|
|
49
|
-
Address: address,
|
|
50
|
-
}));
|
|
51
|
-
printTable(table);
|
|
52
|
-
}
|
|
53
|
-
export function displayVaultInfo(vault) {
|
|
54
|
-
printResult(chalk.cyan('\n+----------------------------------------+'));
|
|
55
|
-
printResult(chalk.cyan('| Vault Information |'));
|
|
56
|
-
printResult(chalk.cyan('+----------------------------------------+\n'));
|
|
57
|
-
// Basic info
|
|
58
|
-
printResult(chalk.bold('Basic Information:'));
|
|
59
|
-
printResult(` Name: ${chalk.green(vault.name)}`);
|
|
60
|
-
printResult(` ID: ${vault.id}`);
|
|
61
|
-
printResult(` Type: ${chalk.yellow(vault.type)}`);
|
|
62
|
-
printResult(` Created: ${new Date(vault.createdAt).toLocaleString()}`);
|
|
63
|
-
printResult(` Last Modified: ${new Date(vault.lastModified).toLocaleString()}`);
|
|
64
|
-
// Security info
|
|
65
|
-
printResult(chalk.bold('\nSecurity:'));
|
|
66
|
-
printResult(` Encrypted: ${vault.isEncrypted ? chalk.green('Yes') : chalk.gray('No')}`);
|
|
67
|
-
printResult(` Backed Up: ${vault.isBackedUp ? chalk.green('Yes') : chalk.yellow('No')}`);
|
|
68
|
-
// MPC info
|
|
69
|
-
printResult(chalk.bold('\nMPC Configuration:'));
|
|
70
|
-
printResult(` Library Type: ${vault.libType}`);
|
|
71
|
-
printResult(` Threshold: ${chalk.cyan(vault.threshold)} of ${chalk.cyan(vault.totalSigners)}`);
|
|
72
|
-
printResult(` Local Party: ${vault.localPartyId}`);
|
|
73
|
-
printResult(` Total Signers: ${vault.totalSigners}`);
|
|
74
|
-
// Signing modes
|
|
75
|
-
const modes = vault.availableSigningModes;
|
|
76
|
-
printResult(chalk.bold('\nSigning Modes:'));
|
|
77
|
-
modes.forEach(mode => {
|
|
78
|
-
printResult(` - ${mode}`);
|
|
79
|
-
});
|
|
80
|
-
// Chains
|
|
81
|
-
const chains = vault.chains;
|
|
82
|
-
printResult(chalk.bold('\nChains:'));
|
|
83
|
-
printResult(` Total: ${chains.length}`);
|
|
84
|
-
chains.forEach((chain) => {
|
|
85
|
-
printResult(` - ${chain}`);
|
|
86
|
-
});
|
|
87
|
-
// Currency
|
|
88
|
-
printResult(chalk.bold('\nPreferences:'));
|
|
89
|
-
printResult(` Currency: ${vault.currency.toUpperCase()}`);
|
|
90
|
-
// Public keys
|
|
91
|
-
printResult(chalk.bold('\nPublic Keys:'));
|
|
92
|
-
printResult(` ECDSA: ${vault.publicKeys.ecdsa.substring(0, 20)}...`);
|
|
93
|
-
printResult(` EdDSA: ${vault.publicKeys.eddsa.substring(0, 20)}...`);
|
|
94
|
-
printResult(` Chain Code: ${vault.hexChainCode.substring(0, 20)}...\n`);
|
|
95
|
-
}
|
|
96
|
-
export function displayTransactionPreview(fromAddress, toAddress, amount, symbol, chain, memo, gas) {
|
|
97
|
-
if (gas) {
|
|
98
|
-
const bigIntReplacer = (_k, v) => (typeof v === 'bigint' ? v.toString() : v);
|
|
99
|
-
info(chalk.blue(`\nEstimated gas: ${JSON.stringify(gas, bigIntReplacer, 2)}`));
|
|
100
|
-
}
|
|
101
|
-
printResult(chalk.cyan('\nTransaction Preview:'));
|
|
102
|
-
printResult(` From: ${fromAddress}`);
|
|
103
|
-
printResult(` To: ${toAddress}`);
|
|
104
|
-
printResult(` Amount: ${amount} ${symbol}`);
|
|
105
|
-
printResult(` Chain: ${chain}`);
|
|
106
|
-
if (memo) {
|
|
107
|
-
printResult(` Memo: ${memo}`);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
export function displayTransactionResult(chain, txHash) {
|
|
111
|
-
const explorerUrl = Vultisig.getTxExplorerUrl(chain, txHash);
|
|
112
|
-
printResult(txHash);
|
|
113
|
-
printResult(explorerUrl);
|
|
114
|
-
}
|
|
115
|
-
export function displayVaultsList(vaults, activeVault) {
|
|
116
|
-
printResult(chalk.cyan('\nStored Vaults:\n'));
|
|
117
|
-
const table = vaults.map(vault => ({
|
|
118
|
-
ID: vault.id,
|
|
119
|
-
Name: vault.name === activeVault?.name ? chalk.green(`${vault.name} (active)`) : vault.name,
|
|
120
|
-
Type: vault.type,
|
|
121
|
-
Chains: vault.chains.length,
|
|
122
|
-
Created: new Date(vault.createdAt).toLocaleDateString(),
|
|
123
|
-
}));
|
|
124
|
-
printTable(table);
|
|
125
|
-
}
|
|
126
|
-
// ============================================================================
|
|
127
|
-
// User Prompts
|
|
128
|
-
// ============================================================================
|
|
129
|
-
export async function confirmTransaction() {
|
|
130
|
-
const { confirmed } = await inquirer.prompt([
|
|
131
|
-
{
|
|
132
|
-
type: 'confirm',
|
|
133
|
-
name: 'confirmed',
|
|
134
|
-
message: 'Proceed with this transaction?',
|
|
135
|
-
default: false,
|
|
136
|
-
},
|
|
137
|
-
]);
|
|
138
|
-
return confirmed;
|
|
139
|
-
}
|
|
140
|
-
export async function promptForPassword(message = 'Enter password:') {
|
|
141
|
-
const { password } = await inquirer.prompt([
|
|
142
|
-
{
|
|
143
|
-
type: 'password',
|
|
144
|
-
name: 'password',
|
|
145
|
-
message,
|
|
146
|
-
mask: '*',
|
|
147
|
-
},
|
|
148
|
-
]);
|
|
149
|
-
return password;
|
|
150
|
-
}
|
|
151
|
-
// ============================================================================
|
|
152
|
-
// Vault Event Handlers
|
|
153
|
-
// ============================================================================
|
|
154
|
-
export function setupVaultEvents(vault) {
|
|
155
|
-
// Balance updates
|
|
156
|
-
vault.on('balanceUpdated', ({ chain, balance, tokenId }) => {
|
|
157
|
-
const asset = tokenId ? `${balance.symbol} token` : balance.symbol;
|
|
158
|
-
info(chalk.blue(`i Balance updated for ${chain} (${asset}): ${balance.amount}`));
|
|
159
|
-
});
|
|
160
|
-
// Transaction broadcast
|
|
161
|
-
vault.on('transactionBroadcast', ({ chain, txHash }) => {
|
|
162
|
-
info(chalk.green(`+ Transaction broadcast on ${chain}`));
|
|
163
|
-
info(chalk.blue(` TX Hash: ${txHash}`));
|
|
164
|
-
});
|
|
165
|
-
// Chain added
|
|
166
|
-
vault.on('chainAdded', ({ chain }) => {
|
|
167
|
-
info(chalk.green(`+ Chain added: ${chain}`));
|
|
168
|
-
});
|
|
169
|
-
// Chain removed
|
|
170
|
-
vault.on('chainRemoved', ({ chain }) => {
|
|
171
|
-
warn(chalk.yellow(`i Chain removed: ${chain}`));
|
|
172
|
-
});
|
|
173
|
-
// Token added
|
|
174
|
-
vault.on('tokenAdded', ({ chain, token }) => {
|
|
175
|
-
info(chalk.green(`+ Token added: ${token.symbol} on ${chain}`));
|
|
176
|
-
});
|
|
177
|
-
// Values updated
|
|
178
|
-
vault.on('valuesUpdated', ({ chain }) => {
|
|
179
|
-
if (chain === 'all') {
|
|
180
|
-
info(chalk.blue('i Portfolio values updated'));
|
|
181
|
-
}
|
|
182
|
-
else {
|
|
183
|
-
info(chalk.blue(`i Values updated for ${chain}`));
|
|
184
|
-
}
|
|
185
|
-
});
|
|
186
|
-
// Errors - skip in JSON mode (errors are reported via JSON response)
|
|
187
|
-
if (!isJsonOutput()) {
|
|
188
|
-
vault.on('error', (err) => {
|
|
189
|
-
printError(chalk.red(`x Vault error: ${err.message}`));
|
|
190
|
-
});
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
// ============================================================================
|
|
194
|
-
// Swap Display Helpers
|
|
195
|
-
// ============================================================================
|
|
196
|
-
/**
|
|
197
|
-
* Format bigint amount to human-readable string
|
|
198
|
-
*/
|
|
199
|
-
function formatBigintAmount(amount, decimals) {
|
|
200
|
-
if (amount === 0n)
|
|
201
|
-
return '0';
|
|
202
|
-
const divisor = BigInt(10 ** decimals);
|
|
203
|
-
const whole = amount / divisor;
|
|
204
|
-
const fraction = amount % divisor;
|
|
205
|
-
if (fraction === 0n) {
|
|
206
|
-
return whole.toString();
|
|
207
|
-
}
|
|
208
|
-
const fractionStr = fraction.toString().padStart(decimals, '0');
|
|
209
|
-
// Trim trailing zeros
|
|
210
|
-
const trimmed = fractionStr.replace(/0+$/, '');
|
|
211
|
-
return `${whole}.${trimmed}`;
|
|
212
|
-
}
|
|
213
|
-
export function displaySwapPreview(quote, fromAmount, fromSymbol, toSymbol, options) {
|
|
214
|
-
const estimatedOutputFormatted = formatBigintAmount(quote.estimatedOutput, options.toDecimals);
|
|
215
|
-
printResult(chalk.cyan('\nSwap Preview:'));
|
|
216
|
-
printResult(` From: ${fromAmount} ${fromSymbol}`);
|
|
217
|
-
printResult(` To: ${estimatedOutputFormatted} ${toSymbol}`);
|
|
218
|
-
// Show fiat value if available
|
|
219
|
-
if (quote.estimatedOutputFiat !== undefined) {
|
|
220
|
-
printResult(` (~$${quote.estimatedOutputFiat.toFixed(2)})`);
|
|
221
|
-
}
|
|
222
|
-
printResult(` Provider: ${quote.provider}`);
|
|
223
|
-
if (quote.fees) {
|
|
224
|
-
const networkFeeFormatted = formatBigintAmount(quote.fees.network, options.feeDecimals);
|
|
225
|
-
const totalFeeFormatted = formatBigintAmount(quote.fees.total, options.feeDecimals);
|
|
226
|
-
printResult(chalk.bold('\n Fees:'));
|
|
227
|
-
printResult(` Network: ${networkFeeFormatted} ${options.feeSymbol}`);
|
|
228
|
-
// Show fiat fee if available
|
|
229
|
-
if (quote.feesFiat) {
|
|
230
|
-
printResult(` (~$${quote.feesFiat.network.toFixed(2)})`);
|
|
231
|
-
}
|
|
232
|
-
if (quote.fees.affiliate && quote.fees.affiliate > 0n) {
|
|
233
|
-
const affiliateFeeFormatted = formatBigintAmount(quote.fees.affiliate, options.feeDecimals);
|
|
234
|
-
printResult(` Affiliate: ${affiliateFeeFormatted} ${options.feeSymbol}`);
|
|
235
|
-
if (quote.feesFiat?.affiliate) {
|
|
236
|
-
printResult(` (~$${quote.feesFiat.affiliate.toFixed(2)})`);
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
printResult(` Total: ${totalFeeFormatted} ${options.feeSymbol}`);
|
|
240
|
-
if (quote.feesFiat) {
|
|
241
|
-
printResult(` (~$${quote.feesFiat.total.toFixed(2)})`);
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
if (quote.warnings && quote.warnings.length > 0) {
|
|
245
|
-
printResult(chalk.yellow('\n Warnings:'));
|
|
246
|
-
quote.warnings.forEach(warning => {
|
|
247
|
-
printResult(chalk.yellow(` - ${warning}`));
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
if (quote.requiresApproval) {
|
|
251
|
-
printResult(chalk.yellow('\n Token approval required before swap'));
|
|
252
|
-
if (quote.approvalInfo) {
|
|
253
|
-
printResult(` Spender: ${quote.approvalInfo.spender}`);
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
// Show expiry
|
|
257
|
-
const expiresIn = Math.max(0, Math.floor((quote.expiresAt - Date.now()) / 1000));
|
|
258
|
-
info(chalk.gray(`\n Quote expires in ${expiresIn}s`));
|
|
259
|
-
}
|
|
260
|
-
export function displaySwapResult(fromChain, _toChain, txHash, quote, toDecimals) {
|
|
261
|
-
const explorerUrl = Vultisig.getTxExplorerUrl(fromChain, txHash);
|
|
262
|
-
const estimatedOutputFormatted = formatBigintAmount(quote.estimatedOutput, toDecimals);
|
|
263
|
-
printResult(txHash);
|
|
264
|
-
printResult(explorerUrl);
|
|
265
|
-
printResult(estimatedOutputFormatted);
|
|
266
|
-
}
|
|
267
|
-
export function displaySwapChains(chains) {
|
|
268
|
-
printResult(chalk.cyan('\nSupported Swap Chains:\n'));
|
|
269
|
-
const table = chains.map(chain => ({
|
|
270
|
-
Chain: chain,
|
|
271
|
-
}));
|
|
272
|
-
printTable(table);
|
|
273
|
-
printResult(`\nTotal: ${chains.length} chains`);
|
|
274
|
-
}
|
|
275
|
-
export async function confirmSwap() {
|
|
276
|
-
const { confirmed } = await inquirer.prompt([
|
|
277
|
-
{
|
|
278
|
-
type: 'confirm',
|
|
279
|
-
name: 'confirmed',
|
|
280
|
-
message: 'Proceed with this swap?',
|
|
281
|
-
default: false,
|
|
282
|
-
},
|
|
283
|
-
]);
|
|
284
|
-
return confirmed;
|
|
285
|
-
}
|
|
286
|
-
//# sourceMappingURL=ui.js.map
|
package/dist/ui.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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"}
|