degate-cli 1.0.0 → 1.0.2

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.
Files changed (2) hide show
  1. package/cli.js +66 -21
  2. package/package.json +2 -2
package/cli.js CHANGED
@@ -32,7 +32,7 @@ const ENV_CONFIG = {
32
32
  prod: {
33
33
  DG_API: 'https://v1-mainnet-backend.degate.com',
34
34
  DEGATE_VERSION: 'V1',
35
- EXCHANGE_ADDRESS: '0x5859cCb16DC791f79AAFadD5B9768bC400797A29',
35
+ EXCHANGE_ADDRESS: '0x9C07A72177c5A05410cA338823e790876E79D73B',
36
36
  DEX_CHAIN_ID: 1,
37
37
  SIGN_TEMPLATE: 'S3',
38
38
  API_SIGN_VALID_ADDRESS: '',
@@ -237,6 +237,15 @@ async function getAccessToken(dgWalletPrivateKey) {
237
237
  return resp.data.token;
238
238
  }
239
239
 
240
+ async function fetchExchangeAddress(client) {
241
+ try {
242
+ const resp = await client.get('/order-book-api/v3/configuration');
243
+ return resp.data?.exchange_address || null;
244
+ } catch {
245
+ return null;
246
+ }
247
+ }
248
+
240
249
  async function fetchChainInfo(client) {
241
250
  const resp = await client.get('/order-book-api/intent/chains');
242
251
  const { chains } = resp.data;
@@ -293,23 +302,19 @@ async function fetchDAOwner(eoaAddress) {
293
302
  }
294
303
 
295
304
  async function fetchRegisteredDAs(authClient) {
296
- try {
297
- const resp = await authClient.get('/order-book-api/intent/daAddress');
298
- const { key_nonce_when_addr_generate, addresses } = resp.data || {};
299
- const das = {};
300
- (addresses || []).forEach(item => {
301
- const info = item.chain_addresses_info?.[0] || {};
302
- das[item.chain_name?.toUpperCase()] = {
303
- chain: item.chain_name?.toUpperCase(),
304
- address: info.address,
305
- publicKey: info.public_key,
306
- path: info.address_path,
307
- };
308
- });
309
- return { keyNonce: key_nonce_when_addr_generate, das };
310
- } catch {
311
- return { keyNonce: null, das: {} };
312
- }
305
+ const resp = await authClient.get('/order-book-api/intent/daAddress');
306
+ const { key_nonce_when_addr_generate, addresses } = resp.data || {};
307
+ const das = {};
308
+ (addresses || []).forEach(item => {
309
+ const info = item.chain_addresses_info?.[0] || {};
310
+ das[item.chain_name?.toUpperCase()] = {
311
+ chain: item.chain_name?.toUpperCase(),
312
+ address: info.address,
313
+ publicKey: info.public_key,
314
+ path: info.address_path,
315
+ };
316
+ });
317
+ return { keyNonce: key_nonce_when_addr_generate, das };
313
318
  }
314
319
 
315
320
  async function signSolanaMessage(message, privateKey) {
@@ -399,6 +404,9 @@ async function intentTryCreate(client, order) {
399
404
  const resp = await client.post('/order-book-api/intent/v2/compact_try_create', order, {
400
405
  headers: { Version: '0.0.1' },
401
406
  });
407
+ if (!resp.data?.result) {
408
+ console.log(chalk.yellow('[DEBUG] compact_try_create raw resp.data:'), JSON.stringify(resp.data, null, 2));
409
+ }
402
410
  return resp.data;
403
411
  }
404
412
 
@@ -493,15 +501,51 @@ async function buildSession(privateKey, keyNonce = 1, env = 'dev') {
493
501
  const jwt = await getAccessToken(keys.DGWallet.privateKey);
494
502
  const client = createApiClient(jwt);
495
503
 
504
+ spinner.text = '获取链配置 (exchange_address)...';
505
+ const remoteExchangeAddr = await fetchExchangeAddress(client);
506
+ if (remoteExchangeAddr) {
507
+ const cfg = getConfig();
508
+ if (cfg.EXCHANGE_ADDRESS.toLowerCase() !== remoteExchangeAddr.toLowerCase()) {
509
+ console.log(chalk.yellow(`\n [配置修正] EXCHANGE_ADDRESS: ${cfg.EXCHANGE_ADDRESS} → ${remoteExchangeAddr}`));
510
+ cfg.EXCHANGE_ADDRESS = remoteExchangeAddr;
511
+ }
512
+ }
513
+
496
514
  spinner.text = '获取 DA Owner...';
497
515
  const da_owner = await fetchDAOwner(keys.eoaAddress) || `${keys.DGWallet.address}_0`;
498
516
 
499
517
  spinner.text = '检查 DA 注册状态...';
500
- const { das: registeredDAs } = await fetchRegisteredDAs(client);
501
- const needsSync = !registeredDAs.SOLANA?.address || !registeredDAs.ETHEREUM?.address;
518
+ let registeredDAs = {};
519
+ let needsSync = false;
520
+ try {
521
+ const result = await fetchRegisteredDAs(client);
522
+ registeredDAs = result.das;
523
+ needsSync = !registeredDAs.SOLANA?.address || !registeredDAs.ETHEREUM?.address;
524
+ } catch {
525
+ needsSync = true;
526
+ }
527
+
502
528
  if (needsSync) {
503
529
  spinner.text = '注册 DA 地址到后端...';
504
- await registerDAs(client, { eoaAddress: keys.eoaAddress, keys, keyNonce });
530
+ try {
531
+ await registerDAs(client, { eoaAddress: keys.eoaAddress, keys, keyNonce });
532
+ spinner.text = 'DA 注册成功';
533
+ } catch (regErr) {
534
+ // 注册失败时二次确认 DA 是否已存在(常见于重复 setup)
535
+ try {
536
+ const recheck = await fetchRegisteredDAs(client);
537
+ const alreadyRegistered = recheck.das.SOLANA?.address && recheck.das.ETHEREUM?.address;
538
+ if (alreadyRegistered) {
539
+ registeredDAs = recheck.das;
540
+ needsSync = false;
541
+ spinner.text = 'DA 已存在,跳过注册';
542
+ } else {
543
+ throw regErr;
544
+ }
545
+ } catch {
546
+ throw regErr;
547
+ }
548
+ }
505
549
  }
506
550
 
507
551
  spinner.text = '获取链配置...';
@@ -537,6 +581,7 @@ async function buildSession(privateKey, keyNonce = 1, env = 'dev') {
537
581
  console.log(chalk.gray(` DGWallet: ${keys.DGWallet.address}`));
538
582
  console.log(chalk.gray(` DA Owner: ${da_owner}`));
539
583
  console.log(chalk.gray(` Solana DA: ${keys.SOLANA.address}`));
584
+ console.log(chalk.gray(` DA 状态: ${needsSync ? '刚注册' : '已存在'}`));
540
585
  return session;
541
586
  } catch (err) {
542
587
  spinner.fail('认证失败');
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "degate-cli",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "DeGate Turbo Range CLI - deposit/withdraw LP positions across Solana & EVM chains",
5
5
  "main": "cli.js",
6
6
  "bin": {
7
- "degate-cli": "./cli.js"
7
+ "degate-cli": "cli.js"
8
8
  },
9
9
  "scripts": {
10
10
  "start": "node cli.js"