@darksol/terminal 0.8.0 → 0.8.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 CHANGED
@@ -15,7 +15,7 @@ A unified CLI for market intel, trading, AI-powered analysis, on-chain oracle, c
15
15
  [![License: GPL-3.0](https://img.shields.io/badge/License-GPL--3.0-gold.svg)](https://www.gnu.org/licenses/gpl-3.0)
16
16
  [![Node](https://img.shields.io/badge/node-%3E%3D18.0.0-green.svg)](https://nodejs.org/)
17
17
 
18
- - Current release: **0.8.0**
18
+ - Current release: **0.8.1**
19
19
  - Changelog: `CHANGELOG.md`
20
20
 
21
21
  ## Install
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@darksol/terminal",
3
- "version": "0.8.0",
3
+ "version": "0.8.1",
4
4
  "description": "DARKSOL Terminal — unified CLI for all DARKSOL services. Market intel, trading, oracle, casino, and more.",
5
5
  "type": "module",
6
6
  "bin": {
package/skill/SKILL.md CHANGED
@@ -7,7 +7,7 @@ description: "DARKSOL Terminal — unified CLI + x402 platform for trading, wall
7
7
 
8
8
  **All DARKSOL services. One terminal. Zero trust required. 🌑**
9
9
 
10
- `@darksol/terminal` v0.7.1 | npm: `npm install -g @darksol/terminal`
10
+ `@darksol/terminal` v0.8.0 | npm: `npm install -g @darksol/terminal`
11
11
 
12
12
  ---
13
13
 
@@ -63,10 +63,11 @@ darksol wallet use <name> # Set active wallet
63
63
  darksol wallet export [name] # Export (password required for PK)
64
64
  ```
65
65
 
66
- ### 📊 Trading (5 chains)
66
+ ### 📊 Trading (60+ chains via LI.FI)
67
67
  ```bash
68
- darksol trade swap # Interactive swap (prompts for pair + amount)
69
- darksol trade swap -i ETH -o USDC -a 0.1 # Uniswap V3 swap with slippage protection
68
+ darksol trade swap # Interactive swap (LI.FI best route across 31 DEXs)
69
+ darksol trade swap -i ETH -o USDC -a 0.1 # LI.FI swap with Uniswap V3 fallback
70
+ darksol trade swap -i ETH -o USDC -a 0.1 --direct # Force direct Uniswap V3 (skip LI.FI)
70
71
  darksol trade swap -i ETH -o USDC -a 0.1 -p "pw" -y # Non-interactive (automation/cron)
71
72
  darksol trade pairs # Show common pairs for active chain
72
73
  darksol trade snipe <token> -a 0.05 # Fast buy with gas boost
@@ -76,8 +77,20 @@ darksol send # Interactive ETH/ERC-20 transfer
76
77
  darksol receive # Show your address for receiving
77
78
  ```
78
79
 
79
- **Supported chains:** Base (default), Ethereum, Polygon, Arbitrum, Optimism
80
- **Swap routers:** Base uses SwapRouter02 (V2), others use V1 SwapRouter. Handled automatically.
80
+ ### 🌉 Cross-Chain Bridge (LI.FI)
81
+ ```bash
82
+ darksol bridge send # Interactive bridge flow
83
+ darksol bridge send -f base -t arbitrum --token ETH -a 0.1 # Bridge ETH from Base to Arbitrum
84
+ darksol bridge send -f ethereum -t polygon --token USDC -a 100 -p "pw" -y # Non-interactive
85
+ darksol bridge status <txHash> # Track cross-chain transfer
86
+ darksol bridge status <txHash> -f base -t arbitrum # Faster status with chain hints
87
+ darksol bridge chains # Show all 60+ supported chains
88
+ ```
89
+
90
+ **LI.FI routing:** Aggregates 27 bridges and 31 DEXs across 60 chains. Finds optimal route automatically.
91
+ **Swap routing:** LI.FI primary, Uniswap V3 fallback. Use `--direct` to skip LI.FI.
92
+ **API key:** Free tier works without key (200 req/2hr). Higher limits: `darksol keys add lifi`
93
+ **Supported chains:** Base, Ethereum, Polygon, Arbitrum, Optimism, Avalanche, BSC, zkSync, Scroll, Linea, + 50 more
81
94
 
82
95
  ### 📈 DCA (Dollar-Cost Averaging)
83
96
  ```bash
@@ -1,7 +1,5 @@
1
1
  import { fetchJSON } from '../utils/fetch.js';
2
- import fetch from 'node-fetch';
3
- import { ethers } from 'ethers';
4
- import { getServiceURL, getConfig, getRPC } from '../config/store.js';
2
+ import { getServiceURL, getConfig } from '../config/store.js';
5
3
  import { theme } from '../ui/theme.js';
6
4
  import { spinner, kvDisplay, success, error, warn, info, table } from '../ui/components.js';
7
5
  import { showSection } from '../ui/banner.js';
@@ -181,82 +179,36 @@ export async function casinoBet(gameType, betParams = {}, opts = {}) {
181
179
  return;
182
180
  }
183
181
 
184
- // ── Payment: Send 1 USDC to the house ──
185
- const HOUSE_WALLET = '0x7B0a6330121B26100D47BCcd5640cc6617F8adA7';
186
- const USDC_BASE = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913';
187
- const USDC_AMOUNT = '1000000'; // 1 USDC (6 decimals)
182
+ // ── Place bet via x402 (EIP-3009 auto-pay) ──
183
+ const signerToken = process.env.DARKSOL_SIGNER_TOKEN || getConfig('signerToken') || null;
184
+ const signerUp = await isSignerRunning(signerToken);
188
185
 
189
- const paymentSpin = spinner('Sending $1 USDC to the house...').start();
190
- let paymentTxHash;
191
-
192
- try {
193
- // Try agent signer first
194
- const signerToken = process.env.DARKSOL_SIGNER_TOKEN || getConfig('signerToken') || null;
195
- const signerUp = await isSignerRunning(signerToken);
196
-
197
- if (signerUp) {
198
- // Use agent signer to send USDC
199
- const headers = { 'Content-Type': 'application/json' };
200
- if (signerToken) headers.Authorization = `Bearer ${signerToken}`;
201
-
202
- // ERC-20 transfer calldata: transfer(address,uint256)
203
- const iface = new ethers.Interface(['function transfer(address to, uint256 amount) returns (bool)']);
204
- const txData = iface.encodeFunctionData('transfer', [HOUSE_WALLET, USDC_AMOUNT]);
205
-
206
- const resp = await fetch('http://127.0.0.1:18790/send', {
207
- method: 'POST',
208
- headers,
209
- body: JSON.stringify({ to: USDC_BASE, data: txData, value: '0' }),
210
- });
211
-
212
- if (!resp.ok) {
213
- const errText = await resp.text();
214
- throw new Error(`Signer refused: ${errText}`);
215
- }
216
-
217
- const result = await resp.json();
218
- paymentTxHash = result.txHash || result.hash;
219
- } else {
220
- // Try wallet directly (needs password)
221
- const activeWallet = getConfig('activeWallet');
222
- if (!activeWallet) throw new Error('No wallet configured. Set one: darksol wallet use <name>');
223
-
224
- const { decryptKey } = await import('../wallet/keystore.js');
225
- const password = process.env.DARKSOL_WALLET_PASSWORD;
226
- if (!password) {
227
- paymentSpin.fail('Payment requires agent signer or DARKSOL_WALLET_PASSWORD');
228
- info('Start agent signer: darksol signer start');
229
- info('Or set: export DARKSOL_WALLET_PASSWORD=<password>');
230
- return;
231
- }
232
-
233
- const pk = decryptKey(activeWallet, password);
234
- const provider = new ethers.JsonRpcProvider(getRPC('base'));
235
- const wallet = new ethers.Wallet(pk, provider);
236
- const usdc = new ethers.Contract(USDC_BASE, ['function transfer(address,uint256) returns (bool)'], wallet);
237
- const tx = await usdc.transfer(HOUSE_WALLET, USDC_AMOUNT);
238
- const receipt = await tx.wait();
239
- paymentTxHash = receipt.hash;
240
- }
241
-
242
- paymentSpin.succeed(`Payment sent: ${paymentTxHash.slice(0, 16)}...`);
243
- } catch (err) {
244
- paymentSpin.fail('Payment failed');
245
- error(err.message);
246
- if (err.message.includes('insufficient')) {
247
- info('You need at least 1 USDC on Base to play');
248
- }
186
+ if (!signerUp) {
187
+ error('Agent signer is required for casino bets (x402 payment).');
188
+ info('Start it: darksol agent start <wallet-name>');
249
189
  return;
250
190
  }
251
191
 
252
- // ── Place the bet with payment proof ──
253
192
  const spin = spinner(`Playing ${gameInfo.name}...`).start();
254
193
  try {
255
- const data = await fetchJSON(`${getURL()}/api/bet`, {
256
- method: 'POST',
257
- headers: { 'Content-Type': 'application/json' },
258
- body: JSON.stringify({ gameType, betParams, agentWallet, paymentTxHash }),
259
- });
194
+ const { fetchWithX402 } = await import('../utils/x402.js');
195
+ const result = await fetchWithX402(
196
+ `${getURL()}/api/bet`,
197
+ {
198
+ method: 'POST',
199
+ headers: { 'Content-Type': 'application/json' },
200
+ body: JSON.stringify({ gameType, betParams, agentWallet }),
201
+ },
202
+ { signerToken, autoSign: true },
203
+ );
204
+
205
+ if (result.error) {
206
+ spin.fail('Payment failed');
207
+ error(result.error);
208
+ return;
209
+ }
210
+
211
+ const data = result.data;
260
212
 
261
213
  if (data.won) {
262
214
  spin.succeed(theme.success(`YOU WON! $${data.payoutAmount} USDC`));
@@ -271,7 +223,7 @@ export async function casinoBet(gameType, betParams = {}, opts = {}) {
271
223
  ['Result', data.result || '-'],
272
224
  ['Won', data.won ? theme.success('YES! 🎉') : theme.error('No')],
273
225
  ['Payout', data.won ? `$${data.payoutAmount} USDC` : '$0'],
274
- ['Payment TX', paymentTxHash.slice(0, 20) + '...'],
226
+ ['Payment', result.paid ? theme.success('x402 ✓') : theme.dim('unpaid')],
275
227
  ['Oracle TX', data.oracleTxHash ? data.oracleTxHash.slice(0, 20) + '...' : '-'],
276
228
  ['Payout TX', data.payoutTxHash ? data.payoutTxHash.slice(0, 20) + '...' : '-'],
277
229
  ]);
@@ -286,8 +238,6 @@ export async function casinoBet(gameType, betParams = {}, opts = {}) {
286
238
  error(err.message);
287
239
  if (err.message.includes('not accepting') || err.message.includes('closed')) {
288
240
  info('The casino may be temporarily closed. Check: darksol casino status');
289
- } else if (err.message.includes('payment') || err.message.includes('Payment')) {
290
- info(`Your USDC was sent (${paymentTxHash.slice(0, 16)}...) — contact support if bet wasn't processed`);
291
241
  }
292
242
  }
293
243
  }