four-flap-meme-sdk 1.4.87 → 1.4.89

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 (142) hide show
  1. package/dist/sol/constants.d.ts +126 -0
  2. package/dist/sol/constants.js +145 -0
  3. package/dist/sol/dex/blockrazor/client.d.ts +51 -0
  4. package/dist/sol/dex/blockrazor/client.js +96 -0
  5. package/dist/sol/dex/blockrazor/constants.d.ts +34 -0
  6. package/dist/sol/dex/blockrazor/constants.js +55 -0
  7. package/dist/sol/dex/blockrazor/geyser.d.ts +128 -0
  8. package/dist/sol/dex/blockrazor/geyser.js +530 -0
  9. package/dist/sol/dex/blockrazor/index.d.ts +18 -0
  10. package/dist/sol/dex/blockrazor/index.js +23 -0
  11. package/dist/sol/dex/blockrazor/send.d.ts +135 -0
  12. package/dist/sol/dex/blockrazor/send.js +254 -0
  13. package/dist/sol/dex/blockrazor/types.d.ts +191 -0
  14. package/dist/sol/dex/blockrazor/types.js +5 -0
  15. package/dist/sol/dex/index.d.ts +10 -0
  16. package/dist/sol/dex/index.js +16 -0
  17. package/dist/sol/dex/jup/client.d.ts +33 -0
  18. package/dist/sol/dex/jup/client.js +110 -0
  19. package/dist/sol/dex/jup/index.d.ts +16 -0
  20. package/dist/sol/dex/jup/index.js +148 -0
  21. package/dist/sol/dex/jup/legacy.d.ts +623 -0
  22. package/dist/sol/dex/jup/legacy.js +416 -0
  23. package/dist/sol/dex/jup/lend.d.ts +640 -0
  24. package/dist/sol/dex/jup/lend.js +603 -0
  25. package/dist/sol/dex/jup/portfolio.d.ts +362 -0
  26. package/dist/sol/dex/jup/portfolio.js +367 -0
  27. package/dist/sol/dex/jup/price.d.ts +173 -0
  28. package/dist/sol/dex/jup/price.js +220 -0
  29. package/dist/sol/dex/jup/recurring.d.ts +437 -0
  30. package/dist/sol/dex/jup/recurring.js +320 -0
  31. package/dist/sol/dex/jup/send.d.ts +282 -0
  32. package/dist/sol/dex/jup/send.js +295 -0
  33. package/dist/sol/dex/jup/studio.d.ts +457 -0
  34. package/dist/sol/dex/jup/studio.js +488 -0
  35. package/dist/sol/dex/jup/tokens.d.ts +767 -0
  36. package/dist/sol/dex/jup/tokens.js +697 -0
  37. package/dist/sol/dex/jup/trigger.d.ts +511 -0
  38. package/dist/sol/dex/jup/trigger.js +397 -0
  39. package/dist/sol/dex/jup/types.d.ts +433 -0
  40. package/dist/sol/dex/jup/types.js +5 -0
  41. package/dist/sol/dex/jup/ultra.d.ts +646 -0
  42. package/dist/sol/dex/jup/ultra.js +853 -0
  43. package/dist/sol/dex/meteora/client.d.ts +76 -0
  44. package/dist/sol/dex/meteora/client.js +219 -0
  45. package/dist/sol/dex/meteora/damm-v1-bundle.d.ts +61 -0
  46. package/dist/sol/dex/meteora/damm-v1-bundle.js +112 -0
  47. package/dist/sol/dex/meteora/damm-v1.d.ts +118 -0
  48. package/dist/sol/dex/meteora/damm-v1.js +315 -0
  49. package/dist/sol/dex/meteora/damm-v2-bundle.d.ts +82 -0
  50. package/dist/sol/dex/meteora/damm-v2-bundle.js +242 -0
  51. package/dist/sol/dex/meteora/damm-v2.d.ts +172 -0
  52. package/dist/sol/dex/meteora/damm-v2.js +632 -0
  53. package/dist/sol/dex/meteora/dbc-bundle.d.ts +123 -0
  54. package/dist/sol/dex/meteora/dbc-bundle.js +304 -0
  55. package/dist/sol/dex/meteora/dbc.d.ts +192 -0
  56. package/dist/sol/dex/meteora/dbc.js +619 -0
  57. package/dist/sol/dex/meteora/dlmm-bundle.d.ts +39 -0
  58. package/dist/sol/dex/meteora/dlmm-bundle.js +189 -0
  59. package/dist/sol/dex/meteora/dlmm.d.ts +157 -0
  60. package/dist/sol/dex/meteora/dlmm.js +671 -0
  61. package/dist/sol/dex/meteora/index.d.ts +25 -0
  62. package/dist/sol/dex/meteora/index.js +65 -0
  63. package/dist/sol/dex/meteora/types.d.ts +787 -0
  64. package/dist/sol/dex/meteora/types.js +110 -0
  65. package/dist/sol/dex/orca/index.d.ts +10 -0
  66. package/dist/sol/dex/orca/index.js +16 -0
  67. package/dist/sol/dex/orca/orca-bundle.d.ts +41 -0
  68. package/dist/sol/dex/orca/orca-bundle.js +173 -0
  69. package/dist/sol/dex/orca/orca.d.ts +65 -0
  70. package/dist/sol/dex/orca/orca.js +474 -0
  71. package/dist/sol/dex/orca/types.d.ts +263 -0
  72. package/dist/sol/dex/orca/types.js +38 -0
  73. package/dist/sol/dex/orca/wavebreak-bundle.d.ts +34 -0
  74. package/dist/sol/dex/orca/wavebreak-bundle.js +198 -0
  75. package/dist/sol/dex/orca/wavebreak-types.d.ts +227 -0
  76. package/dist/sol/dex/orca/wavebreak-types.js +23 -0
  77. package/dist/sol/dex/orca/wavebreak.d.ts +78 -0
  78. package/dist/sol/dex/orca/wavebreak.js +497 -0
  79. package/dist/sol/dex/pump/index.d.ts +9 -0
  80. package/dist/sol/dex/pump/index.js +14 -0
  81. package/dist/sol/dex/pump/pump-bundle.d.ts +92 -0
  82. package/dist/sol/dex/pump/pump-bundle.js +383 -0
  83. package/dist/sol/dex/pump/pump-swap-bundle.d.ts +103 -0
  84. package/dist/sol/dex/pump/pump-swap-bundle.js +380 -0
  85. package/dist/sol/dex/pump/pump-swap.d.ts +46 -0
  86. package/dist/sol/dex/pump/pump-swap.js +199 -0
  87. package/dist/sol/dex/pump/pump.d.ts +35 -0
  88. package/dist/sol/dex/pump/pump.js +352 -0
  89. package/dist/sol/dex/pump/types.d.ts +215 -0
  90. package/dist/sol/dex/pump/types.js +5 -0
  91. package/dist/sol/dex/raydium/index.d.ts +8 -0
  92. package/dist/sol/dex/raydium/index.js +12 -0
  93. package/dist/sol/dex/raydium/launchlab.d.ts +68 -0
  94. package/dist/sol/dex/raydium/launchlab.js +210 -0
  95. package/dist/sol/dex/raydium/raydium-bundle.d.ts +64 -0
  96. package/dist/sol/dex/raydium/raydium-bundle.js +324 -0
  97. package/dist/sol/dex/raydium/raydium.d.ts +40 -0
  98. package/dist/sol/dex/raydium/raydium.js +366 -0
  99. package/dist/sol/dex/raydium/types.d.ts +240 -0
  100. package/dist/sol/dex/raydium/types.js +5 -0
  101. package/dist/sol/index.d.ts +10 -0
  102. package/dist/sol/index.js +16 -0
  103. package/dist/sol/jito/bundle.d.ts +90 -0
  104. package/dist/sol/jito/bundle.js +263 -0
  105. package/dist/sol/jito/index.d.ts +7 -0
  106. package/dist/sol/jito/index.js +7 -0
  107. package/dist/sol/jito/tip.d.ts +51 -0
  108. package/dist/sol/jito/tip.js +83 -0
  109. package/dist/sol/jito/types.d.ts +100 -0
  110. package/dist/sol/jito/types.js +5 -0
  111. package/dist/sol/token/create-complete.d.ts +115 -0
  112. package/dist/sol/token/create-complete.js +235 -0
  113. package/dist/sol/token/create-token.d.ts +57 -0
  114. package/dist/sol/token/create-token.js +230 -0
  115. package/dist/sol/token/index.d.ts +9 -0
  116. package/dist/sol/token/index.js +14 -0
  117. package/dist/sol/token/metadata-upload.d.ts +86 -0
  118. package/dist/sol/token/metadata-upload.js +173 -0
  119. package/dist/sol/token/metadata.d.ts +92 -0
  120. package/dist/sol/token/metadata.js +274 -0
  121. package/dist/sol/token/types.d.ts +153 -0
  122. package/dist/sol/token/types.js +5 -0
  123. package/dist/sol/types.d.ts +176 -0
  124. package/dist/sol/types.js +7 -0
  125. package/dist/sol/utils/balance.d.ts +160 -0
  126. package/dist/sol/utils/balance.js +638 -0
  127. package/dist/sol/utils/connection.d.ts +78 -0
  128. package/dist/sol/utils/connection.js +168 -0
  129. package/dist/sol/utils/index.d.ts +9 -0
  130. package/dist/sol/utils/index.js +9 -0
  131. package/dist/sol/utils/lp-inspect.d.ts +129 -0
  132. package/dist/sol/utils/lp-inspect.js +900 -0
  133. package/dist/sol/utils/transfer.d.ts +125 -0
  134. package/dist/sol/utils/transfer.js +220 -0
  135. package/dist/sol/utils/wallet.d.ts +107 -0
  136. package/dist/sol/utils/wallet.js +210 -0
  137. package/dist/utils/constants.d.ts +2 -2
  138. package/dist/utils/constants.js +2 -2
  139. package/package.json +38 -3
  140. package/README.zh-CN.pdf +0 -0
  141. package/dist/flap/portal-bundle-merkle/encryption.d.ts +0 -16
  142. package/dist/flap/portal-bundle-merkle/encryption.js +0 -146
@@ -0,0 +1,853 @@
1
+ /**
2
+ * Jupiter Ultra API
3
+ * @module sol/dex/jup/ultra
4
+ *
5
+ * Ultra API 提供最优化的交易路由和执行
6
+ * 文档: https://docs.jup.ag/docs/apis/ultra-api
7
+ */
8
+ import { jupGet, jupPost } from './client.js';
9
+ // ============================================================================
10
+ // Order - 获取交易报价和交易
11
+ // ============================================================================
12
+ /**
13
+ * 获取 Swap 报价和未签名交易
14
+ *
15
+ * @param params 请求参数
16
+ * @param config Jupiter 配置
17
+ * @returns Order 响应(包含报价和未签名交易)
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * import { Sol } from 'four-flap-meme-sdk'
22
+ *
23
+ * // 设置 API Key
24
+ * Sol.setJupiterConfig({ apiKey: 'your-api-key' })
25
+ *
26
+ * // 获取报价
27
+ * const order = await Sol.getJupiterOrder({
28
+ * inputMint: 'So11111111111111111111111111111111111111112', // SOL
29
+ * outputMint: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', // USDC
30
+ * amount: '10000000', // 0.01 SOL
31
+ * taker: 'BQ72nSv9f3PRyRKCBnHLVrerrv37CYTHm5h3s9VSGQDV',
32
+ * })
33
+ *
34
+ * console.log('输出数量:', order.outAmount)
35
+ * console.log('价格影响:', order.priceImpact)
36
+ * console.log('路由:', order.router)
37
+ * ```
38
+ */
39
+ export async function getJupiterOrder(params, config) {
40
+ // 处理 excludeRouters 数组
41
+ let excludeRouters;
42
+ if (params.excludeRouters) {
43
+ excludeRouters = Array.isArray(params.excludeRouters)
44
+ ? params.excludeRouters.join(',')
45
+ : params.excludeRouters;
46
+ }
47
+ const queryParams = {
48
+ inputMint: params.inputMint,
49
+ outputMint: params.outputMint,
50
+ amount: params.amount,
51
+ taker: params.taker,
52
+ receiver: params.receiver,
53
+ payer: params.payer,
54
+ closeAuthority: params.closeAuthority,
55
+ referralAccount: params.referralAccount,
56
+ referralFee: params.referralFee,
57
+ excludeRouters,
58
+ excludeDexes: params.excludeDexes,
59
+ };
60
+ return jupGet('/ultra/v1/order', queryParams, config);
61
+ }
62
+ /**
63
+ * 获取 Swap 报价(不包含交易,仅报价)
64
+ *
65
+ * @param inputMint 输入代币 Mint
66
+ * @param outputMint 输出代币 Mint
67
+ * @param amount 输入数量
68
+ * @param config Jupiter 配置
69
+ * @returns Order 响应(transaction 为 null)
70
+ *
71
+ * @example
72
+ * ```typescript
73
+ * const quote = await Sol.getJupiterQuote(
74
+ * 'So11111111111111111111111111111111111111112', // SOL
75
+ * 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', // USDC
76
+ * '10000000', // 0.01 SOL
77
+ * )
78
+ * console.log('预期输出:', quote.outAmount)
79
+ * ```
80
+ */
81
+ export async function getJupiterQuote(inputMint, outputMint, amount, config) {
82
+ return getJupiterOrder({ inputMint, outputMint, amount }, config);
83
+ }
84
+ /**
85
+ * 获取带交易的 Swap 报价
86
+ *
87
+ * @param inputMint 输入代币 Mint
88
+ * @param outputMint 输出代币 Mint
89
+ * @param amount 输入数量
90
+ * @param taker 交易者地址
91
+ * @param options 可选参数
92
+ * @param config Jupiter 配置
93
+ * @returns Order 响应(包含未签名交易)
94
+ *
95
+ * @example
96
+ * ```typescript
97
+ * const order = await Sol.getJupiterSwapTransaction(
98
+ * 'So11111111111111111111111111111111111111112',
99
+ * 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
100
+ * '10000000',
101
+ * wallet.publicKey.toBase58(),
102
+ * )
103
+ *
104
+ * if (order.transaction) {
105
+ * // 签名并执行交易
106
+ * const tx = Transaction.from(Buffer.from(order.transaction, 'base64'))
107
+ * tx.sign(wallet)
108
+ * await Sol.executeJupiterOrder({
109
+ * signedTransaction: tx.serialize().toString('base64'),
110
+ * requestId: order.requestId,
111
+ * })
112
+ * }
113
+ * ```
114
+ */
115
+ export async function getJupiterSwapTransaction(inputMint, outputMint, amount, taker, options, config) {
116
+ return getJupiterOrder({
117
+ inputMint,
118
+ outputMint,
119
+ amount,
120
+ taker,
121
+ ...options,
122
+ }, config);
123
+ }
124
+ // ============================================================================
125
+ // Execute - 执行交易
126
+ // ============================================================================
127
+ /**
128
+ * 执行已签名的 Swap 交易
129
+ *
130
+ * @param params 执行参数
131
+ * @param config Jupiter 配置
132
+ * @returns 执行结果
133
+ *
134
+ * @example
135
+ * ```typescript
136
+ * const result = await Sol.executeJupiterOrder({
137
+ * signedTransaction: signedTxBase64,
138
+ * requestId: order.requestId,
139
+ * })
140
+ *
141
+ * if (result.status === 'Success') {
142
+ * console.log('交易成功:', result.signature)
143
+ * }
144
+ * ```
145
+ */
146
+ export async function executeJupiterOrder(params, config) {
147
+ return jupPost('/ultra/v1/execute', {
148
+ signedTransaction: params.signedTransaction,
149
+ requestId: params.requestId,
150
+ }, config);
151
+ }
152
+ // ============================================================================
153
+ // 便捷方法
154
+ // ============================================================================
155
+ /**
156
+ * 计算 Swap 输出数量
157
+ *
158
+ * @param inputMint 输入代币
159
+ * @param outputMint 输出代币
160
+ * @param amount 输入数量
161
+ * @param config Jupiter 配置
162
+ * @returns 输出数量和相关信息
163
+ */
164
+ export async function calculateSwapOutput(inputMint, outputMint, amount, config) {
165
+ const quote = await getJupiterQuote(inputMint, outputMint, amount, config);
166
+ return {
167
+ inAmount: quote.inAmount,
168
+ outAmount: quote.outAmount,
169
+ priceImpact: quote.priceImpact || 0,
170
+ slippageBps: quote.slippageBps,
171
+ feeBps: quote.feeBps,
172
+ routeLabel: quote.routePlan[0]?.swapInfo.label || 'Unknown',
173
+ };
174
+ }
175
+ /**
176
+ * 获取代币价格 (以 USDC 计)
177
+ *
178
+ * @param mint 代币 Mint
179
+ * @param amount 数量 (最小单位)
180
+ * @param config Jupiter 配置
181
+ * @returns USD 价格
182
+ */
183
+ export async function getTokenUsdPrice(mint, amount = '1000000000', // 默认 1 token (假设 9 位精度)
184
+ config) {
185
+ const USDC = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v';
186
+ if (mint === USDC) {
187
+ return 1;
188
+ }
189
+ try {
190
+ const quote = await getJupiterQuote(mint, USDC, amount, config);
191
+ return quote.outUsdValue || null;
192
+ }
193
+ catch {
194
+ return null;
195
+ }
196
+ }
197
+ // ============================================================================
198
+ // Holdings - 获取账户持仓
199
+ // ============================================================================
200
+ /**
201
+ * 获取账户完整持仓信息
202
+ *
203
+ * 返回账户的原生 SOL 余额和所有代币持仓,包括每个代币账户的详细信息。
204
+ *
205
+ * @param address 钱包地址
206
+ * @param config Jupiter 配置
207
+ * @returns Holdings 响应
208
+ *
209
+ * @example
210
+ * ```typescript
211
+ * import { Sol } from 'four-flap-meme-sdk'
212
+ *
213
+ * Sol.setJupiterConfig({ apiKey: 'your-api-key' })
214
+ *
215
+ * const holdings = await Sol.getJupiterHoldings(
216
+ * '3X2LFoTQecbpqCR7G5tL1kczqBKurjKPHhKSZrJ4wgWc'
217
+ * )
218
+ *
219
+ * // 原生 SOL 余额
220
+ * console.log('SOL 余额:', holdings.uiAmount, 'SOL')
221
+ *
222
+ * // 遍历代币持仓
223
+ * for (const [mint, accounts] of Object.entries(holdings.tokens)) {
224
+ * for (const account of accounts) {
225
+ * console.log(`${mint}: ${account.uiAmountString}`)
226
+ * console.log(` 账户: ${account.account}`)
227
+ * console.log(` ATA: ${account.isAssociatedTokenAccount}`)
228
+ * console.log(` 冻结: ${account.isFrozen}`)
229
+ * }
230
+ * }
231
+ * ```
232
+ *
233
+ * @note 对于持有超过数千种代币的钱包,响应可能较慢。
234
+ * 如果只需要 SOL 余额,请使用 getJupiterNativeHoldings()
235
+ */
236
+ export async function getJupiterHoldings(address, config) {
237
+ return jupGet(`/ultra/v1/holdings/${address}`, {}, config);
238
+ }
239
+ /**
240
+ * 获取账户原生 SOL 余额
241
+ *
242
+ * 仅获取 SOL 余额,比 getJupiterHoldings() 更快。
243
+ *
244
+ * @param address 钱包地址
245
+ * @param config Jupiter 配置
246
+ * @returns Native Holdings 响应
247
+ *
248
+ * @example
249
+ * ```typescript
250
+ * const native = await Sol.getJupiterNativeHoldings(
251
+ * '3X2LFoTQecbpqCR7G5tL1kczqBKurjKPHhKSZrJ4wgWc'
252
+ * )
253
+ *
254
+ * console.log('SOL 余额:', native.uiAmount, 'SOL')
255
+ * console.log('Lamports:', native.amount)
256
+ * ```
257
+ */
258
+ export async function getJupiterNativeHoldings(address, config) {
259
+ return jupGet(`/ultra/v1/holdings/${address}/native`, {}, config);
260
+ }
261
+ /**
262
+ * 获取指定代币的持仓
263
+ *
264
+ * @param address 钱包地址
265
+ * @param mint 代币 Mint 地址
266
+ * @param config Jupiter 配置
267
+ * @returns 代币账户信息数组,如果没有持仓则返回空数组
268
+ *
269
+ * @example
270
+ * ```typescript
271
+ * const jupSolHoldings = await Sol.getJupiterTokenHolding(
272
+ * '3X2LFoTQecbpqCR7G5tL1kczqBKurjKPHhKSZrJ4wgWc',
273
+ * 'jupSoLaHXQiZZTSfEWMTRRgpnyFm8f6sZdosWBjx93v', // jupSOL
274
+ * )
275
+ *
276
+ * if (jupSolHoldings.length > 0) {
277
+ * console.log('jupSOL 余额:', jupSolHoldings[0].uiAmountString)
278
+ * }
279
+ * ```
280
+ */
281
+ export async function getJupiterTokenHolding(address, mint, config) {
282
+ const holdings = await getJupiterHoldings(address, config);
283
+ return holdings.tokens[mint] || [];
284
+ }
285
+ /**
286
+ * 获取账户所有代币余额汇总
287
+ *
288
+ * @param address 钱包地址
289
+ * @param config Jupiter 配置
290
+ * @returns 代币余额映射 { mint: uiAmount }
291
+ *
292
+ * @example
293
+ * ```typescript
294
+ * const balances = await Sol.getJupiterTokenBalances(
295
+ * '3X2LFoTQecbpqCR7G5tL1kczqBKurjKPHhKSZrJ4wgWc'
296
+ * )
297
+ *
298
+ * for (const [mint, balance] of Object.entries(balances)) {
299
+ * console.log(`${mint}: ${balance}`)
300
+ * }
301
+ * ```
302
+ */
303
+ export async function getJupiterTokenBalances(address, config) {
304
+ const holdings = await getJupiterHoldings(address, config);
305
+ const balances = {};
306
+ for (const [mint, accounts] of Object.entries(holdings.tokens)) {
307
+ // 累加同一代币的所有账户余额
308
+ balances[mint] = accounts.reduce((sum, acc) => sum + acc.uiAmount, 0);
309
+ }
310
+ return balances;
311
+ }
312
+ // ============================================================================
313
+ // Shield - 代币风险检测
314
+ // ============================================================================
315
+ /**
316
+ * 检测代币风险警告
317
+ *
318
+ * Shield API 用于获取代币的安全信息和风险警告。
319
+ * 如果代币有潜在风险,会在 warnings 对象中返回警告信息。
320
+ *
321
+ * @param mints 代币 mint 地址数组
322
+ * @param config Jupiter 配置
323
+ * @returns Shield 响应
324
+ *
325
+ * @example
326
+ * ```typescript
327
+ * import { Sol } from 'four-flap-meme-sdk'
328
+ *
329
+ * Sol.setJupiterConfig({ apiKey: 'your-api-key' })
330
+ *
331
+ * // 检查多个代币
332
+ * const shield = await Sol.getJupiterShield([
333
+ * 'So11111111111111111111111111111111111111112', // SOL
334
+ * 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', // USDC
335
+ * ])
336
+ *
337
+ * // 检查警告
338
+ * for (const [mint, warnings] of Object.entries(shield.warnings)) {
339
+ * console.log(`代币 ${mint} 有风险:`)
340
+ * warnings.forEach(w => console.log(` - ${w}`))
341
+ * }
342
+ *
343
+ * // 如果 warnings 为空对象,说明代币安全
344
+ * if (Object.keys(shield.warnings).length === 0) {
345
+ * console.log('所有代币安全')
346
+ * }
347
+ * ```
348
+ */
349
+ export async function getJupiterShield(mints, config) {
350
+ const mintsParam = mints.join(',');
351
+ return jupGet('/ultra/v1/shield', { mints: mintsParam }, config);
352
+ }
353
+ /**
354
+ * 检查单个代币是否有风险
355
+ *
356
+ * @param mint 代币 mint 地址
357
+ * @param config Jupiter 配置
358
+ * @returns 警告信息数组,如果为空则代币安全
359
+ *
360
+ * @example
361
+ * ```typescript
362
+ * const warnings = await Sol.checkTokenSafety(
363
+ * 'SomeSuspiciousTokenMintAddress...'
364
+ * )
365
+ *
366
+ * if (warnings.length > 0) {
367
+ * warnings.forEach(w => {
368
+ * console.log(`⚠️ [${w.severity}] ${w.type}: ${w.message}`)
369
+ * if (w.source) console.log(` 来源: ${w.source}`)
370
+ * })
371
+ * } else {
372
+ * console.log('✓ 代币安全')
373
+ * }
374
+ * ```
375
+ */
376
+ export async function checkTokenSafety(mint, config) {
377
+ const shield = await getJupiterShield([mint], config);
378
+ return shield.warnings[mint] || [];
379
+ }
380
+ /**
381
+ * 批量检查代币安全性
382
+ *
383
+ * @param mints 代币 mint 地址数组
384
+ * @param config Jupiter 配置
385
+ * @returns 安全性检查结果
386
+ *
387
+ * @example
388
+ * ```typescript
389
+ * const results = await Sol.batchCheckTokenSafety([
390
+ * 'Token1...',
391
+ * 'Token2...',
392
+ * 'Token3...',
393
+ * ])
394
+ *
395
+ * for (const [mint, result] of Object.entries(results)) {
396
+ * if (result.safe) {
397
+ * console.log(`✓ ${mint}: 安全`)
398
+ * } else {
399
+ * const criticals = result.warnings.filter(w => w.severity === 'critical')
400
+ * console.log(`⚠️ ${mint}: ${criticals.length} 个严重警告`)
401
+ * }
402
+ * }
403
+ * ```
404
+ */
405
+ export async function batchCheckTokenSafety(mints, config) {
406
+ const shield = await getJupiterShield(mints, config);
407
+ const results = {};
408
+ const severityOrder = { info: 1, warning: 2, critical: 3 };
409
+ for (const mint of mints) {
410
+ const warnings = shield.warnings[mint] || [];
411
+ const hasCritical = warnings.some(w => w.severity === 'critical');
412
+ let maxSeverity = null;
413
+ for (const w of warnings) {
414
+ if (!maxSeverity || severityOrder[w.severity] > severityOrder[maxSeverity]) {
415
+ maxSeverity = w.severity;
416
+ }
417
+ }
418
+ results[mint] = {
419
+ safe: warnings.length === 0,
420
+ warnings,
421
+ hasCritical,
422
+ maxSeverity,
423
+ };
424
+ }
425
+ return results;
426
+ }
427
+ /**
428
+ * 检查代币是否有严重风险
429
+ *
430
+ * @param mint 代币 mint 地址
431
+ * @param config Jupiter 配置
432
+ * @returns 是否有严重 (critical) 风险
433
+ *
434
+ * @example
435
+ * ```typescript
436
+ * const isCritical = await Sol.hasTokenCriticalRisk('TokenMint...')
437
+ * if (isCritical) {
438
+ * console.log('⛔ 代币有严重风险,不建议交易')
439
+ * }
440
+ * ```
441
+ */
442
+ export async function hasTokenCriticalRisk(mint, config) {
443
+ const warnings = await checkTokenSafety(mint, config);
444
+ return warnings.some(w => w.severity === 'critical');
445
+ }
446
+ // ============================================================================
447
+ // Search - 代币搜索
448
+ // ============================================================================
449
+ /**
450
+ * 搜索代币信息
451
+ *
452
+ * 可通过代币符号、名称或 mint 地址搜索代币。
453
+ * 支持逗号分隔搜索多个代币(最多100个 mint 地址)。
454
+ *
455
+ * @param query 搜索查询(symbol、name 或 mint 地址,逗号分隔可搜索多个)
456
+ * @param config Jupiter 配置
457
+ * @returns 代币信息数组
458
+ *
459
+ * @example
460
+ * ```typescript
461
+ * import { Sol } from 'four-flap-meme-sdk'
462
+ *
463
+ * Sol.setJupiterConfig({ apiKey: 'your-api-key' })
464
+ *
465
+ * // 通过符号搜索
466
+ * const tokens = await Sol.searchJupiterTokens('USDC')
467
+ *
468
+ * // 通过 mint 地址搜索
469
+ * const usdc = await Sol.searchJupiterTokens(
470
+ * 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'
471
+ * )
472
+ *
473
+ * // 搜索多个代币
474
+ * const multiple = await Sol.searchJupiterTokens(
475
+ * 'So11111111111111111111111111111111111111112,EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'
476
+ * )
477
+ *
478
+ * // 查看代币信息
479
+ * tokens.forEach(token => {
480
+ * console.log(`${token.symbol}: $${token.usdPrice}`)
481
+ * console.log(` 市值: $${token.mcap}`)
482
+ * console.log(` 流动性: $${token.liquidity}`)
483
+ * console.log(` 24h 价格变化: ${token.stats24h?.priceChange}%`)
484
+ * console.log(` 有机评分: ${token.organicScoreLabel}`)
485
+ * })
486
+ * ```
487
+ */
488
+ export async function searchJupiterTokens(query, config) {
489
+ return jupGet('/ultra/v1/search', { query }, config);
490
+ }
491
+ /**
492
+ * 批量搜索代币(通过 mint 地址数组)
493
+ *
494
+ * @param mints 代币 mint 地址数组(最多100个)
495
+ * @param config Jupiter 配置
496
+ * @returns 代币信息数组
497
+ *
498
+ * @example
499
+ * ```typescript
500
+ * const tokens = await Sol.batchSearchTokens([
501
+ * 'So11111111111111111111111111111111111111112', // SOL
502
+ * 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', // USDC
503
+ * 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB', // USDT
504
+ * ])
505
+ * ```
506
+ */
507
+ export async function batchSearchTokens(mints, config) {
508
+ if (mints.length > 100) {
509
+ throw new Error('Maximum 100 mint addresses allowed');
510
+ }
511
+ return searchJupiterTokens(mints.join(','), config);
512
+ }
513
+ /**
514
+ * 获取单个代币详细信息
515
+ *
516
+ * @param mint 代币 mint 地址
517
+ * @param config Jupiter 配置
518
+ * @returns 代币信息,如果未找到则返回 null
519
+ *
520
+ * @example
521
+ * ```typescript
522
+ * const usdc = await Sol.getJupiterTokenInfo(
523
+ * 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'
524
+ * )
525
+ *
526
+ * if (usdc) {
527
+ * console.log(`${usdc.name} (${usdc.symbol})`)
528
+ * console.log(`价格: $${usdc.usdPrice}`)
529
+ * console.log(`市值: $${usdc.mcap}`)
530
+ * console.log(`FDV: $${usdc.fdv}`)
531
+ * console.log(`流动性: $${usdc.liquidity}`)
532
+ * console.log(`持有者: ${usdc.holderCount}`)
533
+ * console.log(`已验证: ${usdc.isVerified}`)
534
+ *
535
+ * // 审计信息
536
+ * if (usdc.audit) {
537
+ * console.log(`Mint 权限禁用: ${usdc.audit.mintAuthorityDisabled}`)
538
+ * console.log(`冻结权限禁用: ${usdc.audit.freezeAuthorityDisabled}`)
539
+ * }
540
+ * }
541
+ * ```
542
+ */
543
+ export async function getJupiterTokenInfo(mint, config) {
544
+ const results = await searchJupiterTokens(mint, config);
545
+ return results.find(t => t.id === mint) || results[0] || null;
546
+ }
547
+ /**
548
+ * 获取代币价格和市值信息
549
+ *
550
+ * @param mint 代币 mint 地址
551
+ * @param config Jupiter 配置
552
+ * @returns 价格和市值信息
553
+ *
554
+ * @example
555
+ * ```typescript
556
+ * const priceInfo = await Sol.getJupiterTokenPriceInfo(
557
+ * 'So11111111111111111111111111111111111111112'
558
+ * )
559
+ *
560
+ * console.log(`价格: $${priceInfo.price}`)
561
+ * console.log(`24h 变化: ${priceInfo.priceChange24h}%`)
562
+ * console.log(`市值: $${priceInfo.mcap}`)
563
+ * ```
564
+ */
565
+ export async function getJupiterTokenPriceInfo(mint, config) {
566
+ const token = await getJupiterTokenInfo(mint, config);
567
+ if (!token) {
568
+ return {
569
+ price: null,
570
+ priceChange5m: null,
571
+ priceChange1h: null,
572
+ priceChange6h: null,
573
+ priceChange24h: null,
574
+ mcap: null,
575
+ fdv: null,
576
+ liquidity: null,
577
+ volume24h: null,
578
+ };
579
+ }
580
+ return {
581
+ price: token.usdPrice,
582
+ priceChange5m: token.stats5m?.priceChange || null,
583
+ priceChange1h: token.stats1h?.priceChange || null,
584
+ priceChange6h: token.stats6h?.priceChange || null,
585
+ priceChange24h: token.stats24h?.priceChange || null,
586
+ mcap: token.mcap,
587
+ fdv: token.fdv,
588
+ liquidity: token.liquidity,
589
+ volume24h: token.stats24h
590
+ ? (token.stats24h.buyVolume || 0) + (token.stats24h.sellVolume || 0)
591
+ : null,
592
+ };
593
+ }
594
+ /**
595
+ * 检查代币是否可信
596
+ *
597
+ * 基于审计信息和有机评分判断代币可信度
598
+ *
599
+ * @param mint 代币 mint 地址
600
+ * @param config Jupiter 配置
601
+ * @returns 可信度检查结果
602
+ *
603
+ * @example
604
+ * ```typescript
605
+ * const trust = await Sol.checkTokenTrust('TokenMint...')
606
+ *
607
+ * if (trust.isTrusted) {
608
+ * console.log('✓ 代币可信')
609
+ * } else {
610
+ * console.log('⚠️ 代币风险:', trust.warnings)
611
+ * }
612
+ * ```
613
+ */
614
+ export async function checkTokenTrust(mint, config) {
615
+ const token = await getJupiterTokenInfo(mint, config);
616
+ const warnings = [];
617
+ if (!token) {
618
+ return {
619
+ isTrusted: false,
620
+ isVerified: false,
621
+ organicScore: null,
622
+ organicScoreLabel: null,
623
+ hasMintAuthority: true,
624
+ hasFreezeAuthority: true,
625
+ isSuspicious: true,
626
+ warnings: ['Token not found'],
627
+ };
628
+ }
629
+ const audit = token.audit;
630
+ const isVerified = token.isVerified || false;
631
+ // 如果 mintAuthority/freezeAuthority 字段存在且非空,说明权限未禁用
632
+ const hasMintAuthority = !!token.mintAuthority;
633
+ const hasFreezeAuthority = !!token.freezeAuthority;
634
+ const isSuspicious = audit?.isSus || false;
635
+ // 收集警告
636
+ if (!isVerified)
637
+ warnings.push('Not verified');
638
+ if (hasMintAuthority)
639
+ warnings.push('Mint authority enabled');
640
+ if (hasFreezeAuthority)
641
+ warnings.push('Freeze authority enabled');
642
+ if (isSuspicious)
643
+ warnings.push('Flagged as suspicious');
644
+ if (token.organicScoreLabel === 'low')
645
+ warnings.push('Low organic score');
646
+ if (audit?.topHoldersPercentage && audit.topHoldersPercentage > 50) {
647
+ warnings.push(`Top holders own ${audit.topHoldersPercentage.toFixed(2)}%`);
648
+ }
649
+ if (audit?.devBalancePercentage && audit.devBalancePercentage > 10) {
650
+ warnings.push(`Dev owns ${audit.devBalancePercentage.toFixed(2)}%`);
651
+ }
652
+ // 综合判断是否可信
653
+ // 注意:对于稳定币如 USDC,mintAuthority 和 freezeAuthority 是正常存在的
654
+ const isTrusted = isVerified &&
655
+ !isSuspicious &&
656
+ token.organicScoreLabel !== 'low';
657
+ return {
658
+ isTrusted,
659
+ isVerified,
660
+ organicScore: token.organicScore,
661
+ organicScoreLabel: token.organicScoreLabel,
662
+ hasMintAuthority,
663
+ hasFreezeAuthority,
664
+ isSuspicious,
665
+ warnings,
666
+ };
667
+ }
668
+ // ============================================================================
669
+ // Routers - 获取可用路由器列表
670
+ // ============================================================================
671
+ /**
672
+ * 获取可用路由器列表
673
+ *
674
+ * 返回 Jupiter Ultra API 支持的所有路由器信息。
675
+ *
676
+ * @param config Jupiter 配置
677
+ * @returns 路由器信息数组
678
+ *
679
+ * @example
680
+ * ```typescript
681
+ * import { Sol } from 'four-flap-meme-sdk'
682
+ *
683
+ * Sol.setJupiterConfig({ apiKey: 'your-api-key' })
684
+ *
685
+ * const routers = await Sol.getJupiterRouters()
686
+ *
687
+ * routers.forEach(router => {
688
+ * console.log(`${router.name} (${router.id})`)
689
+ * console.log(` 图标: ${router.icon}`)
690
+ * })
691
+ *
692
+ * // 输出:
693
+ * // Iris (iris)
694
+ * // JupiterZ (jupiterz)
695
+ * ```
696
+ */
697
+ export async function getJupiterRouters(config) {
698
+ return jupGet('/ultra/v1/order/routers', {}, config);
699
+ }
700
+ /**
701
+ * 获取路由器 ID 列表
702
+ *
703
+ * @param config Jupiter 配置
704
+ * @returns 路由器 ID 数组
705
+ *
706
+ * @example
707
+ * ```typescript
708
+ * const routerIds = await Sol.getJupiterRouterIds()
709
+ * // ['iris', 'jupiterz']
710
+ * ```
711
+ */
712
+ export async function getJupiterRouterIds(config) {
713
+ const routers = await getJupiterRouters(config);
714
+ return routers.map(r => r.id);
715
+ }
716
+ // ============================================================================
717
+ // Balances - 轻量余额查询
718
+ // ============================================================================
719
+ /**
720
+ * 获取账户所有代币余额(轻量版)
721
+ *
722
+ * 比 getJupiterHoldings() 更轻量,返回格式更简洁。
723
+ * 键为代币符号 (SOL) 或 mint 地址。
724
+ *
725
+ * @param address 钱包地址
726
+ * @param config Jupiter 配置
727
+ * @returns 代币余额映射
728
+ *
729
+ * @example
730
+ * ```typescript
731
+ * import { Sol } from 'four-flap-meme-sdk'
732
+ *
733
+ * Sol.setJupiterConfig({ apiKey: 'your-api-key' })
734
+ *
735
+ * const balances = await Sol.getJupiterBalances(
736
+ * 'GqUEBPPxiq3YjDxTe7TPhoSzSEGNPpSy4ciScxpd1hJz'
737
+ * )
738
+ *
739
+ * // 原生 SOL 余额
740
+ * console.log('SOL:', balances['SOL'].uiAmount)
741
+ *
742
+ * // 代币余额 (通过 mint 地址)
743
+ * const usdcMint = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'
744
+ * if (balances[usdcMint]) {
745
+ * console.log('USDC:', balances[usdcMint].uiAmount)
746
+ * }
747
+ *
748
+ * // 遍历所有余额
749
+ * for (const [key, info] of Object.entries(balances)) {
750
+ * console.log(`${key}: ${info.uiAmount} (frozen: ${info.isFrozen})`)
751
+ * }
752
+ * ```
753
+ */
754
+ export async function getJupiterBalances(address, config) {
755
+ return jupGet(`/ultra/v1/balances/${address}`, {}, config);
756
+ }
757
+ /**
758
+ * 获取账户 SOL 余额
759
+ *
760
+ * @param address 钱包地址
761
+ * @param config Jupiter 配置
762
+ * @returns SOL 余额信息,如果账户不存在返回 null
763
+ *
764
+ * @example
765
+ * ```typescript
766
+ * const sol = await Sol.getJupiterSolBalance('wallet...')
767
+ * if (sol) {
768
+ * console.log('SOL 余额:', sol.uiAmount)
769
+ * }
770
+ * ```
771
+ */
772
+ export async function getJupiterSolBalance(address, config) {
773
+ const balances = await getJupiterBalances(address, config);
774
+ return balances['SOL'] || null;
775
+ }
776
+ /**
777
+ * 获取账户指定代币余额
778
+ *
779
+ * @param address 钱包地址
780
+ * @param mint 代币 mint 地址
781
+ * @param config Jupiter 配置
782
+ * @returns 代币余额信息,如果没有该代币返回 null
783
+ *
784
+ * @example
785
+ * ```typescript
786
+ * const usdc = await Sol.getJupiterTokenBalance(
787
+ * 'wallet...',
788
+ * 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'
789
+ * )
790
+ * if (usdc) {
791
+ * console.log('USDC 余额:', usdc.uiAmount)
792
+ * }
793
+ * ```
794
+ */
795
+ export async function getJupiterTokenBalance(address, mint, config) {
796
+ const balances = await getJupiterBalances(address, config);
797
+ return balances[mint] || null;
798
+ }
799
+ /**
800
+ * 获取账户所有非零余额的代币 mint 列表
801
+ *
802
+ * @param address 钱包地址
803
+ * @param config Jupiter 配置
804
+ * @returns 代币 mint 地址数组(不包含 SOL)
805
+ *
806
+ * @example
807
+ * ```typescript
808
+ * const mints = await Sol.getJupiterTokenMints('wallet...')
809
+ * console.log('持有的代币:', mints)
810
+ * ```
811
+ */
812
+ export async function getJupiterTokenMints(address, config) {
813
+ const balances = await getJupiterBalances(address, config);
814
+ return Object.keys(balances).filter(key => key !== 'SOL');
815
+ }
816
+ /**
817
+ * 获取账户余额摘要
818
+ *
819
+ * @param address 钱包地址
820
+ * @param config Jupiter 配置
821
+ * @returns 余额摘要
822
+ *
823
+ * @example
824
+ * ```typescript
825
+ * const summary = await Sol.getJupiterBalanceSummary('wallet...')
826
+ * console.log('SOL:', summary.solBalance)
827
+ * console.log('代币数量:', summary.tokenCount)
828
+ * console.log('冻结代币:', summary.frozenCount)
829
+ * ```
830
+ */
831
+ export async function getJupiterBalanceSummary(address, config) {
832
+ const balances = await getJupiterBalances(address, config);
833
+ const solBalance = balances['SOL']?.uiAmount || 0;
834
+ const tokens = [];
835
+ let frozenCount = 0;
836
+ for (const [key, info] of Object.entries(balances)) {
837
+ if (key === 'SOL')
838
+ continue;
839
+ tokens.push({
840
+ mint: key,
841
+ balance: info.uiAmount,
842
+ isFrozen: info.isFrozen,
843
+ });
844
+ if (info.isFrozen)
845
+ frozenCount++;
846
+ }
847
+ return {
848
+ solBalance,
849
+ tokenCount: tokens.length,
850
+ frozenCount,
851
+ tokens,
852
+ };
853
+ }