Pārlūkot izejas kodu

fix: closePosition 改用 nftMintAddress 参数并清理调试日志

关仓接口需要传 nftMintAddress 而非 positionAddress,通过 getPositionDetail 获取后传入

Co-authored-by: Cursor <cursoragent@cursor.com>
zhangchunrui 1 mēnesi atpakaļ
vecāks
revīzija
b3bb8cd552
2 mainītis faili ar 14 papildinājumiem un 26 dzēšanām
  1. 9 2
      src/core/sniper.js
  2. 5 24
      src/services/byreal.js

+ 9 - 2
src/core/sniper.js

@@ -445,9 +445,16 @@ export class SniperEngine {
           continue;
         }
         logger.info(`Closing our position: ${myPositionAddress} (parent was ${parentPositionAddress})`);
-        logger.info(`Close context: targetPosition=${targetPositionAddress}, copiedData=${JSON.stringify(copiedData)}`);
+
+        // 获取我的仓位详情,拿到 nftMintAddress(关仓接口需要)
+        const myPositionDetail = await ByrealAPI.getPositionDetail(myPositionAddress);
+        const nftMintAddress = myPositionDetail?.nftMintAddress || myPositionDetail?.nftMint;
+        if (!nftMintAddress) {
+          logger.error(`Could not get nftMintAddress for position ${myPositionAddress}, skip close`);
+          continue;
+        }
         
-        const success = await ByrealAPI.closePosition(myPositionAddress);
+        const success = await ByrealAPI.closePosition(nftMintAddress);
         
         if (success) {
           this.closedCache.add(parentPositionAddress, {

+ 5 - 24
src/services/byreal.js

@@ -220,27 +220,20 @@ export class ByrealAPI {
     }
   }
 
-  static async closePosition(positionAddress) {
+  static async closePosition(nftMintAddress) {
     try {
-      logger.info(`Closing position: ${positionAddress}`);
-      logger.info(`Close URL: ${CONFIG.CLOSE_ACTION_URL}`);
+      logger.info(`Closing position with nftMintAddress: ${nftMintAddress}`);
 
-      const body = { positionAddress };
+      const body = { nftMintAddress };
       const headers = {
         Authorization: CONFIG.AUTH_HEADER,
         'Content-Type': 'application/json',
       };
 
-      logger.info(`Close request body: ${JSON.stringify(body)}`);
-      logger.info(`Close request headers: ${JSON.stringify({ ...headers, Authorization: headers.Authorization ? '[REDACTED]' : 'MISSING' })}`);
-
       const response = await axios.post(CONFIG.CLOSE_ACTION_URL, body, { headers });
 
-      logger.info(`Close response status: ${response.status}`);
-      logger.info(`Close response data: ${JSON.stringify(response.data)}`);
-
       if (response.data?.success) {
-        logger.success(`Position closed successfully: ${positionAddress}`);
+        logger.success(`Position closed successfully: ${nftMintAddress}`);
         return true;
       } else {
         logger.error('Close request failed:', JSON.stringify(response.data));
@@ -249,19 +242,7 @@ export class ByrealAPI {
     } catch (error) {
       logger.error('Error closing position:', error.message);
       if (error.response) {
-        logger.error(`Close response status: ${error.response.status}`);
-        logger.error(`Close response statusText: ${error.response.statusText}`);
-        logger.error(`Close response data: ${JSON.stringify(error.response.data)}`);
-        logger.error(`Close response headers: ${JSON.stringify(error.response.headers)}`);
-      } else if (error.request) {
-        logger.error('No response received from server (request was sent but no response)');
-        logger.error(`Request URL: ${error.config?.url}`);
-        logger.error(`Request method: ${error.config?.method}`);
-      } else {
-        logger.error('Error setting up request:', error.message);
-      }
-      if (error.config) {
-        logger.error(`Full request config: URL=${error.config.url}, method=${error.config.method}, data=${JSON.stringify(error.config.data)}`);
+        logger.error(`Close response status: ${error.response.status}, data: ${JSON.stringify(error.response.data)}`);
       }
       return false;
     }