degate-cli 1.0.0 → 1.0.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.
Files changed (2) hide show
  1. package/cli.js +63 -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) {
@@ -493,15 +498,51 @@ async function buildSession(privateKey, keyNonce = 1, env = 'dev') {
493
498
  const jwt = await getAccessToken(keys.DGWallet.privateKey);
494
499
  const client = createApiClient(jwt);
495
500
 
501
+ spinner.text = '获取链配置 (exchange_address)...';
502
+ const remoteExchangeAddr = await fetchExchangeAddress(client);
503
+ if (remoteExchangeAddr) {
504
+ const cfg = getConfig();
505
+ if (cfg.EXCHANGE_ADDRESS.toLowerCase() !== remoteExchangeAddr.toLowerCase()) {
506
+ console.log(chalk.yellow(`\n [配置修正] EXCHANGE_ADDRESS: ${cfg.EXCHANGE_ADDRESS} → ${remoteExchangeAddr}`));
507
+ cfg.EXCHANGE_ADDRESS = remoteExchangeAddr;
508
+ }
509
+ }
510
+
496
511
  spinner.text = '获取 DA Owner...';
497
512
  const da_owner = await fetchDAOwner(keys.eoaAddress) || `${keys.DGWallet.address}_0`;
498
513
 
499
514
  spinner.text = '检查 DA 注册状态...';
500
- const { das: registeredDAs } = await fetchRegisteredDAs(client);
501
- const needsSync = !registeredDAs.SOLANA?.address || !registeredDAs.ETHEREUM?.address;
515
+ let registeredDAs = {};
516
+ let needsSync = false;
517
+ try {
518
+ const result = await fetchRegisteredDAs(client);
519
+ registeredDAs = result.das;
520
+ needsSync = !registeredDAs.SOLANA?.address || !registeredDAs.ETHEREUM?.address;
521
+ } catch {
522
+ needsSync = true;
523
+ }
524
+
502
525
  if (needsSync) {
503
526
  spinner.text = '注册 DA 地址到后端...';
504
- await registerDAs(client, { eoaAddress: keys.eoaAddress, keys, keyNonce });
527
+ try {
528
+ await registerDAs(client, { eoaAddress: keys.eoaAddress, keys, keyNonce });
529
+ spinner.text = 'DA 注册成功';
530
+ } catch (regErr) {
531
+ // 注册失败时二次确认 DA 是否已存在(常见于重复 setup)
532
+ try {
533
+ const recheck = await fetchRegisteredDAs(client);
534
+ const alreadyRegistered = recheck.das.SOLANA?.address && recheck.das.ETHEREUM?.address;
535
+ if (alreadyRegistered) {
536
+ registeredDAs = recheck.das;
537
+ needsSync = false;
538
+ spinner.text = 'DA 已存在,跳过注册';
539
+ } else {
540
+ throw regErr;
541
+ }
542
+ } catch {
543
+ throw regErr;
544
+ }
545
+ }
505
546
  }
506
547
 
507
548
  spinner.text = '获取链配置...';
@@ -537,6 +578,7 @@ async function buildSession(privateKey, keyNonce = 1, env = 'dev') {
537
578
  console.log(chalk.gray(` DGWallet: ${keys.DGWallet.address}`));
538
579
  console.log(chalk.gray(` DA Owner: ${da_owner}`));
539
580
  console.log(chalk.gray(` Solana DA: ${keys.SOLANA.address}`));
581
+ console.log(chalk.gray(` DA 状态: ${needsSync ? '刚注册' : '已存在'}`));
540
582
  return session;
541
583
  } catch (err) {
542
584
  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.1",
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"