awal 1.0.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 +84 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +32 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/address.d.ts +3 -0
- package/dist/commands/address.d.ts.map +1 -0
- package/dist/commands/address.js +33 -0
- package/dist/commands/address.js.map +1 -0
- package/dist/commands/auth.d.ts +3 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +76 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/balance.d.ts +3 -0
- package/dist/commands/balance.d.ts.map +1 -0
- package/dist/commands/balance.js +72 -0
- package/dist/commands/balance.js.map +1 -0
- package/dist/commands/bazaar.d.ts +3 -0
- package/dist/commands/bazaar.d.ts.map +1 -0
- package/dist/commands/bazaar.js +134 -0
- package/dist/commands/bazaar.js.map +1 -0
- package/dist/commands/discover.d.ts +3 -0
- package/dist/commands/discover.d.ts.map +1 -0
- package/dist/commands/discover.js +76 -0
- package/dist/commands/discover.js.map +1 -0
- package/dist/commands/pay.d.ts +3 -0
- package/dist/commands/pay.d.ts.map +1 -0
- package/dist/commands/pay.js +78 -0
- package/dist/commands/pay.js.map +1 -0
- package/dist/commands/send.d.ts +3 -0
- package/dist/commands/send.d.ts.map +1 -0
- package/dist/commands/send.js +144 -0
- package/dist/commands/send.js.map +1 -0
- package/dist/commands/show.d.ts +3 -0
- package/dist/commands/show.d.ts.map +1 -0
- package/dist/commands/show.js +31 -0
- package/dist/commands/show.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +89 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/trade.d.ts +3 -0
- package/dist/commands/trade.d.ts.map +1 -0
- package/dist/commands/trade.js +163 -0
- package/dist/commands/trade.js.map +1 -0
- package/dist/formatters/output.d.ts +38 -0
- package/dist/formatters/output.d.ts.map +1 -0
- package/dist/formatters/output.js +83 -0
- package/dist/formatters/output.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/ipcClient.d.ts +14 -0
- package/dist/ipcClient.d.ts.map +1 -0
- package/dist/ipcClient.js +127 -0
- package/dist/ipcClient.js.map +1 -0
- package/dist/utils/authCheck.d.ts +13 -0
- package/dist/utils/authCheck.d.ts.map +1 -0
- package/dist/utils/authCheck.js +34 -0
- package/dist/utils/authCheck.js.map +1 -0
- package/dist/utils/errors.d.ts +21 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +76 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/processCheck.d.ts +11 -0
- package/dist/utils/processCheck.d.ts.map +1 -0
- package/dist/utils/processCheck.js +68 -0
- package/dist/utils/processCheck.js.map +1 -0
- package/dist/utils/serverManager.d.ts +10 -0
- package/dist/utils/serverManager.d.ts.map +1 -0
- package/dist/utils/serverManager.js +167 -0
- package/dist/utils/serverManager.js.map +1 -0
- package/package.json +50 -0
- package/server-bundle/assets/fallback.html +112 -0
- package/server-bundle/assets/icon.png +0 -0
- package/server-bundle/assets/menubar-iconTemplate.png +0 -0
- package/server-bundle/assets/menubar-iconTemplate@2x.png +0 -0
- package/server-bundle/bundle-electron.js +22 -0
- package/server-bundle/package.json +15 -0
- package/server-bundle/preload.js +1 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { sendIpcRequest } from '../ipcClient.js';
|
|
5
|
+
import { requireAuth } from '../utils/authCheck.js';
|
|
6
|
+
import { formatError } from '../utils/errors.js';
|
|
7
|
+
import { formatJson, formatSuccess, formatUsdcAmount } from '../formatters/output.js';
|
|
8
|
+
export function createPayCommand() {
|
|
9
|
+
return new Command('pay')
|
|
10
|
+
.description('Make HTTP request with X402 payment handling')
|
|
11
|
+
.argument('<baseURL>', 'Base URL of the X402-enabled endpoint')
|
|
12
|
+
.argument('<path>', 'Request path')
|
|
13
|
+
.option('-X, --method <method>', 'HTTP method (GET, POST, PUT, DELETE, PATCH)', 'GET')
|
|
14
|
+
.option('-d, --data <json>', 'Request body as JSON')
|
|
15
|
+
.option('-q, --query <params>', 'Query parameters as JSON')
|
|
16
|
+
.option('--max-amount <amount>', 'Maximum amount per request in USDC atomic units')
|
|
17
|
+
.option('--correlation-id <id>', 'Correlation ID to group related operations')
|
|
18
|
+
.option('--json', 'Output as JSON')
|
|
19
|
+
.action(async (baseURL, path, options) => {
|
|
20
|
+
const spinner = ora('Making X402 request...').start();
|
|
21
|
+
try {
|
|
22
|
+
// Check authentication first
|
|
23
|
+
await requireAuth();
|
|
24
|
+
const data = {
|
|
25
|
+
baseURL,
|
|
26
|
+
path,
|
|
27
|
+
method: options.method.toUpperCase(),
|
|
28
|
+
};
|
|
29
|
+
if (options.data) {
|
|
30
|
+
try {
|
|
31
|
+
data.body = JSON.parse(options.data);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
spinner.fail('Invalid JSON in --data');
|
|
35
|
+
console.error(chalk.red('The --data option must be valid JSON'));
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (options.query) {
|
|
40
|
+
try {
|
|
41
|
+
data.queryParams = JSON.parse(options.query);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
spinner.fail('Invalid JSON in --query');
|
|
45
|
+
console.error(chalk.red('The --query option must be valid JSON'));
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (options.maxAmount) {
|
|
50
|
+
data.maxAmountPerRequest = parseInt(options.maxAmount, 10);
|
|
51
|
+
}
|
|
52
|
+
if (options.correlationId) {
|
|
53
|
+
data.correlationId = options.correlationId;
|
|
54
|
+
}
|
|
55
|
+
const result = (await sendIpcRequest('make-x402-request', data));
|
|
56
|
+
spinner.stop();
|
|
57
|
+
if (options.json) {
|
|
58
|
+
console.log(formatJson(result));
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
// Text output
|
|
62
|
+
console.log(formatSuccess(`Request completed (HTTP ${result.status})`));
|
|
63
|
+
if (result.paymentMade && result.amountPaid !== undefined) {
|
|
64
|
+
console.log(chalk.yellow(`Payment: ${formatUsdcAmount(result.amountPaid)}`));
|
|
65
|
+
}
|
|
66
|
+
if (result.data) {
|
|
67
|
+
console.log('\nResponse:');
|
|
68
|
+
console.log(typeof result.data === 'string' ? result.data : JSON.stringify(result.data, null, 2));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
spinner.fail('Request failed');
|
|
73
|
+
console.error(chalk.red(formatError(error)));
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=pay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pay.js","sourceRoot":"","sources":["../../src/commands/pay.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../../src/commands/send.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwEpC,wBAAgB,iBAAiB,IAAI,OAAO,CA4G3C"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { createPublicClient, http } from 'viem';
|
|
5
|
+
import { mainnet } from 'viem/chains';
|
|
6
|
+
import { normalize } from 'viem/ens';
|
|
7
|
+
import { sendIpcRequest } from '../ipcClient.js';
|
|
8
|
+
import { requireAuth } from '../utils/authCheck.js';
|
|
9
|
+
import { formatError } from '../utils/errors.js';
|
|
10
|
+
import { formatJson, formatSuccess } from '../formatters/output.js';
|
|
11
|
+
// Mainnet client for ENS resolution using public RPC with CCIP-Read support
|
|
12
|
+
const mainnetClient = createPublicClient({
|
|
13
|
+
chain: mainnet,
|
|
14
|
+
transport: http('https://eth.llamarpc.com', {
|
|
15
|
+
retryCount: 3,
|
|
16
|
+
retryDelay: 1000,
|
|
17
|
+
timeout: 15_000,
|
|
18
|
+
}),
|
|
19
|
+
});
|
|
20
|
+
/**
|
|
21
|
+
* Parses an amount string that can be in various formats:
|
|
22
|
+
* - "$0.01" or "$1.00" - Dollar format
|
|
23
|
+
* - "0.01" or "1.00" - Plain decimal
|
|
24
|
+
* - "1000000" - Atomic units (if > 100, assumed to be atomic)
|
|
25
|
+
*
|
|
26
|
+
* @returns Amount in USDC atomic units (6 decimals)
|
|
27
|
+
*/
|
|
28
|
+
function parseAmount(amountStr) {
|
|
29
|
+
// Remove $ prefix if present
|
|
30
|
+
const cleaned = amountStr.replace(/^\$/, '').trim();
|
|
31
|
+
// Parse as number
|
|
32
|
+
const num = parseFloat(cleaned);
|
|
33
|
+
if (isNaN(num) || num <= 0) {
|
|
34
|
+
throw new Error(`Invalid amount: ${amountStr}. Must be a positive number.`);
|
|
35
|
+
}
|
|
36
|
+
// If the number looks like atomic units (no decimal or > 100), treat as atomic
|
|
37
|
+
// Otherwise, convert from USDC to atomic (multiply by 10^6)
|
|
38
|
+
if (Number.isInteger(num) && num > 100) {
|
|
39
|
+
// Likely already in atomic units
|
|
40
|
+
return Math.floor(num).toString();
|
|
41
|
+
}
|
|
42
|
+
// Convert from USDC to atomic units (6 decimals)
|
|
43
|
+
const atomicUnits = Math.floor(num * 1_000_000);
|
|
44
|
+
return atomicUnits.toString();
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Formats atomic units as a human-readable USDC amount
|
|
48
|
+
*/
|
|
49
|
+
function formatUsdcFromAtomic(atomicUnits) {
|
|
50
|
+
const num = Number(atomicUnits);
|
|
51
|
+
const usdc = num / 1_000_000;
|
|
52
|
+
return `$${usdc.toFixed(2)} USDC`;
|
|
53
|
+
}
|
|
54
|
+
export function createSendCommand() {
|
|
55
|
+
return new Command('send')
|
|
56
|
+
.description('Send USDC to an address')
|
|
57
|
+
.argument('<amount>', 'Amount to send (e.g., "$0.01", "0.01", or atomic units)')
|
|
58
|
+
.argument('<recipient>', 'Recipient address (0x...) or ENS domain')
|
|
59
|
+
.option('--chain <chain>', 'Blockchain network (default: base)', 'base')
|
|
60
|
+
.option('--json', 'Output as JSON')
|
|
61
|
+
.action(async (amount, recipient, options) => {
|
|
62
|
+
const spinner = ora('Preparing transaction...').start();
|
|
63
|
+
try {
|
|
64
|
+
// Check authentication first
|
|
65
|
+
await requireAuth();
|
|
66
|
+
// Parse amount to atomic units
|
|
67
|
+
let atomicAmount;
|
|
68
|
+
try {
|
|
69
|
+
atomicAmount = parseAmount(amount);
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
spinner.fail('Invalid amount');
|
|
73
|
+
console.error(chalk.red(formatError(error)));
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
// Validate recipient address format
|
|
77
|
+
if (!recipient.match(/^0x[a-fA-F0-9]{40}$/) && !recipient.includes('.')) {
|
|
78
|
+
spinner.fail('Invalid recipient');
|
|
79
|
+
console.error(chalk.red('Recipient must be a valid Ethereum address (0x...) or ENS domain'));
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
82
|
+
const isEnsName = !recipient.match(/^0x[a-fA-F0-9]{40}$/) && recipient.includes('.');
|
|
83
|
+
let resolvedRecipient = recipient;
|
|
84
|
+
let ensName;
|
|
85
|
+
if (isEnsName) {
|
|
86
|
+
spinner.text = `Resolving ${recipient}...`;
|
|
87
|
+
try {
|
|
88
|
+
const address = await mainnetClient.getEnsAddress({
|
|
89
|
+
name: normalize(recipient),
|
|
90
|
+
});
|
|
91
|
+
if (!address) {
|
|
92
|
+
spinner.fail('ENS resolution failed');
|
|
93
|
+
console.error(chalk.red(`Could not resolve ENS name: ${recipient}. No address found.`));
|
|
94
|
+
process.exit(1);
|
|
95
|
+
}
|
|
96
|
+
resolvedRecipient = address;
|
|
97
|
+
ensName = recipient;
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
spinner.fail('ENS resolution failed');
|
|
101
|
+
console.error(chalk.red(`Failed to resolve ENS name "${recipient}": ${formatError(error)}`));
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
spinner.text = `Sending ${formatUsdcFromAtomic(atomicAmount)} to ${ensName || resolvedRecipient}...`;
|
|
106
|
+
const data = {
|
|
107
|
+
recipient: resolvedRecipient,
|
|
108
|
+
amountAtomic: atomicAmount,
|
|
109
|
+
chain: options.chain,
|
|
110
|
+
};
|
|
111
|
+
const result = (await sendIpcRequest('send-transaction', data));
|
|
112
|
+
spinner.stop();
|
|
113
|
+
if (result.error) {
|
|
114
|
+
console.error(chalk.red(`Transaction failed: ${result.error}`));
|
|
115
|
+
process.exit(1);
|
|
116
|
+
}
|
|
117
|
+
if (options.json) {
|
|
118
|
+
console.log(formatJson(result));
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
// Text output
|
|
122
|
+
if (ensName) {
|
|
123
|
+
console.log(formatSuccess(`Successfully sent ${formatUsdcFromAtomic(atomicAmount)} to ${ensName}`));
|
|
124
|
+
console.log(chalk.gray(`Resolved address: ${resolvedRecipient}`));
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
console.log(formatSuccess(`Successfully sent ${formatUsdcFromAtomic(atomicAmount)} to ${recipient}`));
|
|
128
|
+
}
|
|
129
|
+
console.log(chalk.gray(`Chain: ${result.chain}`));
|
|
130
|
+
if (result.transactionHash) {
|
|
131
|
+
console.log(chalk.gray(`Transaction: ${result.transactionHash}`));
|
|
132
|
+
}
|
|
133
|
+
if (result.blockExplorerUrl) {
|
|
134
|
+
console.log(chalk.cyan(`\nView on Basescan: ${result.blockExplorerUrl}`));
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
spinner.fail('Transaction failed');
|
|
139
|
+
console.error(chalk.red(formatError(error)));
|
|
140
|
+
process.exit(1);
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=send.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send.js","sourceRoot":"","sources":["../../src/commands/send.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAEpE,4EAA4E;AAC5E,MAAM,aAAa,GAAG,kBAAkB,CAAC;IACvC,KAAK,EAAE,OAAO;IACd,SAAS,EAAE,IAAI,CAAC,0BAA0B,EAAE;QAC1C,UAAU,EAAE,CAAC;QACb,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,MAAM;KAChB,CAAC;CACH,CAAC,CAAC;AAaH;;;;;;;GAOG;AACH,SAAS,WAAW,CAAC,SAAiB;IACpC,6BAA6B;IAC7B,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAEpD,kBAAkB;IAClB,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAEhC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,mBAAmB,SAAS,8BAA8B,CAAC,CAAC;IAC9E,CAAC;IAED,+EAA+E;IAC/E,4DAA4D;IAC5D,IAAI,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;QACvC,iCAAiC;QACjC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;IACpC,CAAC;IAED,iDAAiD;IACjD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC;IAChD,OAAO,WAAW,CAAC,QAAQ,EAAE,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAAC,WAAmB;IAC/C,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,GAAG,GAAG,SAAS,CAAC;IAC7B,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;SACvB,WAAW,CAAC,yBAAyB,CAAC;SACtC,QAAQ,CAAC,UAAU,EAAE,yDAAyD,CAAC;SAC/E,QAAQ,CAAC,aAAa,EAAE,yCAAyC,CAAC;SAClE,MAAM,CAAC,iBAAiB,EAAE,oCAAoC,EAAE,MAAM,CAAC;SACvE,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,SAAiB,EAAE,OAAO,EAAE,EAAE;QAC3D,MAAM,OAAO,GAAG,GAAG,CAAC,0BAA0B,CAAC,CAAC,KAAK,EAAE,CAAC;QAExD,IAAI,CAAC;YACH,6BAA6B;YAC7B,MAAM,WAAW,EAAE,CAAC;YAEpB,+BAA+B;YAC/B,IAAI,YAAoB,CAAC;YACzB,IAAI,CAAC;gBACH,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;YACrC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBAC/B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,oCAAoC;YACpC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,qBAAqB,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxE,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;gBAClC,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAC9E,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,SAAS,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,qBAAqB,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACrF,IAAI,iBAAiB,GAAG,SAAS,CAAC;YAClC,IAAI,OAA2B,CAAC;YAEhC,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,GAAG,aAAa,SAAS,KAAK,CAAC;gBAC3C,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,aAAa,CAAC;wBAChD,IAAI,EAAE,SAAS,CAAC,SAAS,CAAC;qBAC3B,CAAC,CAAC;oBACH,IAAI,CAAC,OAAO,EAAE,CAAC;wBACb,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;wBACtC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,+BAA+B,SAAS,qBAAqB,CAAC,CAAC,CAAC;wBACxF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAClB,CAAC;oBACD,iBAAiB,GAAG,OAAO,CAAC;oBAC5B,OAAO,GAAG,SAAS,CAAC;gBACtB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;oBACtC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,+BAA+B,SAAS,MAAM,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;oBAC7F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;YAED,OAAO,CAAC,IAAI,GAAG,WAAW,oBAAoB,CAAC,YAAY,CAAC,OAAO,OAAO,IAAI,iBAAiB,KAAK,CAAC;YAErG,MAAM,IAAI,GAAG;gBACX,SAAS,EAAE,iBAAiB;gBAC5B,YAAY,EAAE,YAAY;gBAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;aACrB,CAAC;YAEF,MAAM,MAAM,GAAG,CAAC,MAAM,cAAc,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAA4B,CAAC;YAC3F,OAAO,CAAC,IAAI,EAAE,CAAC;YAEf,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;gBAChC,OAAO;YACT,CAAC;YAED,cAAc;YACd,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CACT,aAAa,CACX,qBAAqB,oBAAoB,CAAC,YAAY,CAAC,OAAO,OAAO,EAAE,CACxE,CACF,CAAC;gBACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,iBAAiB,EAAE,CAAC,CAAC,CAAC;YACpE,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CACT,aAAa,CACX,qBAAqB,oBAAoB,CAAC,YAAY,CAAC,OAAO,SAAS,EAAE,CAC1E,CACF,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAElD,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;YACpE,CAAC;YAED,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACnC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"show.d.ts","sourceRoot":"","sources":["../../src/commands/show.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,iBAAiB,IAAI,OAAO,CAyB3C"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { sendIpcRequest, setOnInstalling, setOnWalletStarting } from '../ipcClient.js';
|
|
5
|
+
import { formatError } from '../utils/errors.js';
|
|
6
|
+
import { formatSuccess } from '../formatters/output.js';
|
|
7
|
+
export function createShowCommand() {
|
|
8
|
+
return new Command('show')
|
|
9
|
+
.description('Show and focus the wallet companion window')
|
|
10
|
+
.action(async () => {
|
|
11
|
+
const spinner = ora('Opening wallet...').start();
|
|
12
|
+
// Update spinner for installation and startup
|
|
13
|
+
setOnInstalling(() => {
|
|
14
|
+
spinner.text = 'Installing server bundle...';
|
|
15
|
+
});
|
|
16
|
+
setOnWalletStarting(() => {
|
|
17
|
+
spinner.text = 'Starting wallet...';
|
|
18
|
+
});
|
|
19
|
+
try {
|
|
20
|
+
await sendIpcRequest('show-window', {});
|
|
21
|
+
spinner.stop();
|
|
22
|
+
console.log(formatSuccess('Wallet window opened'));
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
spinner.fail('Failed to open wallet');
|
|
26
|
+
console.error(chalk.red(formatError(error)));
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=show.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"show.js","sourceRoot":"","sources":["../../src/commands/show.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACvF,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;SACvB,WAAW,CAAC,4CAA4C,CAAC;SACzD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,OAAO,GAAG,GAAG,CAAC,mBAAmB,CAAC,CAAC,KAAK,EAAE,CAAC;QAEjD,8CAA8C;QAC9C,eAAe,CAAC,GAAG,EAAE;YACnB,OAAO,CAAC,IAAI,GAAG,6BAA6B,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,mBAAmB,CAAC,GAAG,EAAE;YACvB,OAAO,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,cAAc,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;YACxC,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,sBAAsB,CAAC,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACtC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,mBAAmB,IAAI,OAAO,CA0F7C"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { sendIpcRequest, setOnWalletStarting, setOnInstalling } from '../ipcClient.js';
|
|
5
|
+
import { getPrimaryProcessPid } from '../utils/processCheck.js';
|
|
6
|
+
import { formatError } from '../utils/errors.js';
|
|
7
|
+
import { formatJson, formatKeyValue, formatSuccess, formatWarning } from '../formatters/output.js';
|
|
8
|
+
export function createStatusCommand() {
|
|
9
|
+
return new Command('status')
|
|
10
|
+
.description('Check wallet server health and authentication status')
|
|
11
|
+
.option('--json', 'Output as JSON')
|
|
12
|
+
.action(async (options) => {
|
|
13
|
+
const spinner = ora('Checking status...').start();
|
|
14
|
+
// Check wallet server health first
|
|
15
|
+
const walletPid = getPrimaryProcessPid();
|
|
16
|
+
const serverRunning = walletPid !== null;
|
|
17
|
+
if (!serverRunning) {
|
|
18
|
+
spinner.text = 'Starting wallet...';
|
|
19
|
+
}
|
|
20
|
+
// Update spinner for installation and startup
|
|
21
|
+
setOnInstalling(() => {
|
|
22
|
+
spinner.text = 'Installing server bundle...';
|
|
23
|
+
});
|
|
24
|
+
setOnWalletStarting(() => {
|
|
25
|
+
spinner.text = 'Starting wallet...';
|
|
26
|
+
});
|
|
27
|
+
try {
|
|
28
|
+
const rawResult = await sendIpcRequest('check-session-status', {});
|
|
29
|
+
spinner.stop();
|
|
30
|
+
// Re-check after potential startup
|
|
31
|
+
const currentPid = getPrimaryProcessPid();
|
|
32
|
+
const serverHealthy = currentPid !== null;
|
|
33
|
+
// The wallet returns a markdown string, parse it to determine auth status
|
|
34
|
+
const resultString = typeof rawResult === 'string' ? rawResult : '';
|
|
35
|
+
const isAuthenticated = resultString.includes('Authenticated') &&
|
|
36
|
+
!resultString.includes('Not Authenticated');
|
|
37
|
+
// Extract email if present (format: "Logged in as email@example.com")
|
|
38
|
+
const emailMatch = resultString.match(/Logged in as ([^\s]+)/);
|
|
39
|
+
const email = emailMatch ? emailMatch[1] : undefined;
|
|
40
|
+
if (options.json) {
|
|
41
|
+
console.log(formatJson({
|
|
42
|
+
server: {
|
|
43
|
+
running: serverHealthy,
|
|
44
|
+
pid: currentPid,
|
|
45
|
+
},
|
|
46
|
+
auth: {
|
|
47
|
+
authenticated: isAuthenticated,
|
|
48
|
+
email,
|
|
49
|
+
},
|
|
50
|
+
}));
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
// Text output - Server status
|
|
54
|
+
console.log(chalk.bold('Wallet Server'));
|
|
55
|
+
if (serverHealthy) {
|
|
56
|
+
console.log(formatSuccess(`Running (PID: ${currentPid})`));
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
console.log(formatWarning('Not running'));
|
|
60
|
+
}
|
|
61
|
+
// Text output - Auth status
|
|
62
|
+
console.log('');
|
|
63
|
+
console.log(chalk.bold('Authentication'));
|
|
64
|
+
if (isAuthenticated) {
|
|
65
|
+
console.log(formatSuccess('Authenticated'));
|
|
66
|
+
if (email) {
|
|
67
|
+
console.log(formatKeyValue({ 'Logged in as': email }));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
console.log(formatWarning('Not authenticated'));
|
|
72
|
+
console.log(chalk.dim(`
|
|
73
|
+
Sign in using one of:
|
|
74
|
+
1. Email OTP:
|
|
75
|
+
awal auth login <your-email>
|
|
76
|
+
awal auth verify <flow-id> <6-digit-code>
|
|
77
|
+
|
|
78
|
+
2. Wallet UI:
|
|
79
|
+
awal show`));
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
spinner.fail('Failed to check status');
|
|
84
|
+
console.error(chalk.red(formatError(error)));
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trade.d.ts","sourceRoot":"","sources":["../../src/commands/trade.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkGpC,wBAAgB,kBAAkB,IAAI,OAAO,CAgH5C"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { sendIpcRequest } from '../ipcClient.js';
|
|
5
|
+
import { requireAuth } from '../utils/authCheck.js';
|
|
6
|
+
import { formatError } from '../utils/errors.js';
|
|
7
|
+
import { formatJson, formatSuccess } from '../formatters/output.js';
|
|
8
|
+
// Known token aliases for display formatting
|
|
9
|
+
const TOKEN_ALIASES = {
|
|
10
|
+
usdc: { decimals: 6, display: 'USDC' },
|
|
11
|
+
eth: { decimals: 18, display: 'ETH' },
|
|
12
|
+
weth: { decimals: 18, display: 'WETH' },
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Check if a string is a valid Ethereum address
|
|
16
|
+
*/
|
|
17
|
+
function isAddress(value) {
|
|
18
|
+
return /^0x[a-fA-F0-9]{40}$/.test(value);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Resolve a token for display purposes only.
|
|
22
|
+
* The IPC handler will resolve addresses and decimals from chain.
|
|
23
|
+
*/
|
|
24
|
+
function resolveTokenDisplay(token) {
|
|
25
|
+
const lower = token.toLowerCase();
|
|
26
|
+
// Check if it's an alias
|
|
27
|
+
if (TOKEN_ALIASES[lower]) {
|
|
28
|
+
return {
|
|
29
|
+
token: lower,
|
|
30
|
+
decimals: TOKEN_ALIASES[lower].decimals,
|
|
31
|
+
display: TOKEN_ALIASES[lower].display,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
// Check if it's a valid address
|
|
35
|
+
if (isAddress(token)) {
|
|
36
|
+
return {
|
|
37
|
+
token: token,
|
|
38
|
+
decimals: 18, // Display default, actual decimals fetched by IPC handler
|
|
39
|
+
display: `${token.slice(0, 6)}...${token.slice(-4)}`,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Formats an amount for display (used for output messages)
|
|
46
|
+
*/
|
|
47
|
+
function formatAmountForDisplay(amount, display) {
|
|
48
|
+
// Remove $ prefix for parsing
|
|
49
|
+
const cleaned = amount.replace(/^\$/, '').trim();
|
|
50
|
+
const num = parseFloat(cleaned);
|
|
51
|
+
if (isNaN(num)) {
|
|
52
|
+
return `${amount} ${display}`;
|
|
53
|
+
}
|
|
54
|
+
if (display === 'USDC') {
|
|
55
|
+
return `$${num.toFixed(2)} USDC`;
|
|
56
|
+
}
|
|
57
|
+
return `${num} ${display}`;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Formats atomic units as a human-readable amount for display
|
|
61
|
+
*/
|
|
62
|
+
function formatAtomicAmount(atomicUnits, decimals, display) {
|
|
63
|
+
const num = Number(atomicUnits);
|
|
64
|
+
const readable = num / 10 ** decimals;
|
|
65
|
+
if (display === 'USDC') {
|
|
66
|
+
return `$${readable.toFixed(2)} USDC`;
|
|
67
|
+
}
|
|
68
|
+
// For other tokens, show more precision
|
|
69
|
+
return `${readable.toFixed(6)} ${display}`;
|
|
70
|
+
}
|
|
71
|
+
export function createTradeCommand() {
|
|
72
|
+
return new Command('trade')
|
|
73
|
+
.description('Swap tokens on Base network via CDP Swap API.\n\n' +
|
|
74
|
+
'Examples:\n' +
|
|
75
|
+
' awal trade $1 usdc eth # Swap $1 USDC for ETH\n' +
|
|
76
|
+
' awal trade 0.50 usdc eth # Swap $0.50 USDC for ETH\n' +
|
|
77
|
+
' awal trade 0.01 eth usdc # Swap 0.01 ETH for USDC\n' +
|
|
78
|
+
' awal trade 100 0x... 0x... # Swap using contract addresses')
|
|
79
|
+
.argument('<amount>', 'Amount to swap (e.g., "$1.00", "0.50", "500000")')
|
|
80
|
+
.argument('<from>', 'Source token: alias (usdc, eth, weth) or contract address (0x...)')
|
|
81
|
+
.argument('<to>', 'Destination token: alias (usdc, eth, weth) or contract address (0x...)')
|
|
82
|
+
.option('-c, --chain <chain>', 'Blockchain network', 'base')
|
|
83
|
+
.option('-s, --slippage <bps>', 'Slippage tolerance in basis points (100 = 1%)', '100')
|
|
84
|
+
.option('--json', 'Output result as JSON')
|
|
85
|
+
.action(async (amount, from, to, options) => {
|
|
86
|
+
const spinner = ora('Preparing swap...').start();
|
|
87
|
+
try {
|
|
88
|
+
// Check authentication first
|
|
89
|
+
await requireAuth();
|
|
90
|
+
// Resolve tokens for display (IPC handler resolves addresses/decimals from chain)
|
|
91
|
+
const fromResolved = resolveTokenDisplay(from);
|
|
92
|
+
const toResolved = resolveTokenDisplay(to);
|
|
93
|
+
if (!fromResolved) {
|
|
94
|
+
spinner.fail('Invalid token');
|
|
95
|
+
console.error(chalk.red(`Unknown token: ${from}. Use usdc, eth, weth, or a valid 0x address.`));
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
98
|
+
if (!toResolved) {
|
|
99
|
+
spinner.fail('Invalid token');
|
|
100
|
+
console.error(chalk.red(`Unknown token: ${to}. Use usdc, eth, weth, or a valid 0x address.`));
|
|
101
|
+
process.exit(1);
|
|
102
|
+
}
|
|
103
|
+
if (fromResolved.token.toLowerCase() === toResolved.token.toLowerCase()) {
|
|
104
|
+
spinner.fail('Invalid swap');
|
|
105
|
+
console.error(chalk.red('Cannot swap a token to itself.'));
|
|
106
|
+
process.exit(1);
|
|
107
|
+
}
|
|
108
|
+
// Validate amount is a valid format
|
|
109
|
+
const cleanedAmount = amount.replace(/^\$/, '').trim();
|
|
110
|
+
if (!/^[\d.]+$/.test(cleanedAmount) || parseFloat(cleanedAmount) <= 0) {
|
|
111
|
+
spinner.fail('Invalid amount');
|
|
112
|
+
console.error(chalk.red(`Invalid amount: ${amount}. Must be a positive number.`));
|
|
113
|
+
process.exit(1);
|
|
114
|
+
}
|
|
115
|
+
// Parse slippage
|
|
116
|
+
const slippageBps = parseInt(options.slippage, 10);
|
|
117
|
+
if (isNaN(slippageBps) || slippageBps < 0 || slippageBps > 5000) {
|
|
118
|
+
spinner.fail('Invalid slippage');
|
|
119
|
+
console.error(chalk.red('Slippage must be between 0 and 5000 basis points (0-50%)'));
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
122
|
+
spinner.text = `Swapping ${formatAmountForDisplay(amount, fromResolved.display)} for ${toResolved.display}...`;
|
|
123
|
+
// Pass token identifiers and human-readable amount to IPC handler
|
|
124
|
+
// IPC handler will resolve addresses, fetch decimals, and convert to atomic
|
|
125
|
+
const data = {
|
|
126
|
+
fromToken: fromResolved.token,
|
|
127
|
+
toToken: toResolved.token,
|
|
128
|
+
fromAmount: amount, // Human-readable, IPC handler converts to atomic
|
|
129
|
+
chain: options.chain,
|
|
130
|
+
slippageBps,
|
|
131
|
+
};
|
|
132
|
+
const result = (await sendIpcRequest('execute-swap', data));
|
|
133
|
+
spinner.stop();
|
|
134
|
+
if (result.error || !result.success) {
|
|
135
|
+
console.error(chalk.red(`Swap failed: ${result.error}`));
|
|
136
|
+
process.exit(1);
|
|
137
|
+
}
|
|
138
|
+
if (options.json) {
|
|
139
|
+
console.log(formatJson(result));
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
// Text output
|
|
143
|
+
const fromFormatted = formatAmountForDisplay(amount, fromResolved.display);
|
|
144
|
+
const toFormatted = result.toAmount
|
|
145
|
+
? formatAtomicAmount(result.toAmount, toResolved.decimals, toResolved.display)
|
|
146
|
+
: toResolved.display;
|
|
147
|
+
console.log(formatSuccess(`Successfully swapped ${fromFormatted} for ${toFormatted}`));
|
|
148
|
+
console.log(chalk.gray(`Chain: ${result.chain}`));
|
|
149
|
+
if (result.transactionHash) {
|
|
150
|
+
console.log(chalk.gray(`Transaction: ${result.transactionHash}`));
|
|
151
|
+
}
|
|
152
|
+
if (result.blockExplorerUrl) {
|
|
153
|
+
console.log(chalk.cyan(`\nView on Basescan: ${result.blockExplorerUrl}`));
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
spinner.fail('Swap failed');
|
|
158
|
+
console.error(chalk.red(formatError(error)));
|
|
159
|
+
process.exit(1);
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=trade.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trade.js","sourceRoot":"","sources":["../../src/commands/trade.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export type OutputFormat = 'json' | 'table' | 'text';
|
|
2
|
+
/**
|
|
3
|
+
* Formats data for JSON output
|
|
4
|
+
*/
|
|
5
|
+
export declare function formatJson(data: unknown): string;
|
|
6
|
+
/**
|
|
7
|
+
* Formats key-value pairs for text output
|
|
8
|
+
*/
|
|
9
|
+
export declare function formatKeyValue(data: Record<string, unknown>): string;
|
|
10
|
+
/**
|
|
11
|
+
* Formats an array of objects as a simple table
|
|
12
|
+
*/
|
|
13
|
+
export declare function formatTable(data: Record<string, unknown>[], columns: {
|
|
14
|
+
key: string;
|
|
15
|
+
header: string;
|
|
16
|
+
width?: number;
|
|
17
|
+
}[]): string;
|
|
18
|
+
/**
|
|
19
|
+
* Formats balance display
|
|
20
|
+
*/
|
|
21
|
+
export declare function formatBalance(formatted: string, token?: string, chain?: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* Formats a success message
|
|
24
|
+
*/
|
|
25
|
+
export declare function formatSuccess(message: string): string;
|
|
26
|
+
/**
|
|
27
|
+
* Formats a warning message
|
|
28
|
+
*/
|
|
29
|
+
export declare function formatWarning(message: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* Formats an info message
|
|
32
|
+
*/
|
|
33
|
+
export declare function formatInfo(message: string): string;
|
|
34
|
+
/**
|
|
35
|
+
* Formats USDC atomic units to human-readable format
|
|
36
|
+
*/
|
|
37
|
+
export declare function formatUsdcAmount(atomicUnits: number | string): string;
|
|
38
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/formatters/output.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAErD;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAEhD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAOpE;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAC/B,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GACzD,MAAM,CAmCR;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAIvF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAIrE"}
|