Jelajahi Sumber

fix(jupiter): Price API v3 需 API Key,增加未配置与 401 时的提示

- 未设置 JUPITER_API_KEY 时提前返回并打印配置说明
- 401 时提示在 .env 中设置有效 Key(portal.jup.ag)

Co-authored-by: Cursor <cursoragent@cursor.com>
lushdog@outlook.com 1 bulan lalu
induk
melakukan
f15d6530f7
1 mengubah file dengan 21 tambahan dan 4 penghapusan
  1. 21 4
      src/lib/jupiter.ts

+ 21 - 4
src/lib/jupiter.ts

@@ -76,12 +76,12 @@ function getJupiterHeaders(): Record<string, string> {
 	return headers
 }
 
-/** Jupiter Price API v3 返回的单个代币价格(price.jup.ag 已弃用,请用 api.jup.ag/price/v3) */
+/** Jupiter Price API v3 返回的单个代币价格(需 API Key,从 https://portal.jup.ag/ 获取) */
 const JUPITER_PRICE_API_URL =
 	process.env.JUPITER_PRICE_API_URL || 'https://api.jup.ag/price/v3'
 
 /**
- * 从 Jupiter Price API v3 获取代币 USD 价格(备用,避免使用已弃用的 price.jup.ag
+ * 从 Jupiter Price API v3 获取代币 USD 价格(需配置环境变量 JUPITER_API_KEY
  * @returns 成功时返回 { tokenAPriceUsd, tokenBPriceUsd },失败返回 null
  */
 export async function getTokenPricesFromJupiter(
@@ -89,6 +89,12 @@ export async function getTokenPricesFromJupiter(
 	mintB: string
 ): Promise<{ tokenAPriceUsd: number; tokenBPriceUsd: number } | null> {
 	try {
+		if (!process.env.JUPITER_API_KEY) {
+			console.warn(
+				'Jupiter Price API v3 需要 API Key,请在 .env 中设置 JUPITER_API_KEY(从 https://portal.jup.ag/ 获取)'
+			)
+			return null
+		}
 		const ids = [mintA, mintB].filter((m, i, arr) => arr.indexOf(m) === i).join(',')
 		const data = await ky
 			.get(`${JUPITER_PRICE_API_URL}?ids=${ids}`, {
@@ -107,8 +113,19 @@ export async function getTokenPricesFromJupiter(
 			return { tokenAPriceUsd: pa, tokenBPriceUsd: pb }
 		}
 		return null
-	} catch (error) {
-		console.warn('Jupiter price v3 fetch failed:', error)
+	} catch (error: unknown) {
+		const is401 =
+			error &&
+			typeof error === 'object' &&
+			'response' in error &&
+			(error as { response?: { status?: number } }).response?.status === 401
+		if (is401) {
+			console.warn(
+				'Jupiter Price API v3 返回 401:请在 .env 中设置有效的 JUPITER_API_KEY(从 https://portal.jup.ag/ 获取)'
+			)
+		} else {
+			console.warn('Jupiter price v3 fetch failed:', error)
+		}
 		return null
 	}
 }