|
@@ -76,12 +76,12 @@ function getJupiterHeaders(): Record<string, string> {
|
|
|
return headers
|
|
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 =
|
|
const JUPITER_PRICE_API_URL =
|
|
|
process.env.JUPITER_PRICE_API_URL || 'https://api.jup.ag/price/v3'
|
|
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
|
|
* @returns 成功时返回 { tokenAPriceUsd, tokenBPriceUsd },失败返回 null
|
|
|
*/
|
|
*/
|
|
|
export async function getTokenPricesFromJupiter(
|
|
export async function getTokenPricesFromJupiter(
|
|
@@ -89,6 +89,12 @@ export async function getTokenPricesFromJupiter(
|
|
|
mintB: string
|
|
mintB: string
|
|
|
): Promise<{ tokenAPriceUsd: number; tokenBPriceUsd: number } | null> {
|
|
): Promise<{ tokenAPriceUsd: number; tokenBPriceUsd: number } | null> {
|
|
|
try {
|
|
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 ids = [mintA, mintB].filter((m, i, arr) => arr.indexOf(m) === i).join(',')
|
|
|
const data = await ky
|
|
const data = await ky
|
|
|
.get(`${JUPITER_PRICE_API_URL}?ids=${ids}`, {
|
|
.get(`${JUPITER_PRICE_API_URL}?ids=${ids}`, {
|
|
@@ -107,8 +113,19 @@ export async function getTokenPricesFromJupiter(
|
|
|
return { tokenAPriceUsd: pa, tokenBPriceUsd: pb }
|
|
return { tokenAPriceUsd: pa, tokenBPriceUsd: pb }
|
|
|
}
|
|
}
|
|
|
return null
|
|
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
|
|
return null
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|