four-flap-meme-sdk 1.5.55 → 1.5.56

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 (150) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.js +1 -1
  3. package/dist/sol/constants.d.ts +150 -0
  4. package/dist/sol/constants.js +188 -0
  5. package/dist/sol/dex/blockrazor/client.d.ts +51 -0
  6. package/dist/sol/dex/blockrazor/client.js +96 -0
  7. package/dist/sol/dex/blockrazor/constants.d.ts +34 -0
  8. package/dist/sol/dex/blockrazor/constants.js +55 -0
  9. package/dist/sol/dex/blockrazor/geyser.d.ts +128 -0
  10. package/dist/sol/dex/blockrazor/geyser.js +530 -0
  11. package/dist/sol/dex/blockrazor/index.d.ts +18 -0
  12. package/dist/sol/dex/blockrazor/index.js +23 -0
  13. package/dist/sol/dex/blockrazor/send.d.ts +135 -0
  14. package/dist/sol/dex/blockrazor/send.js +254 -0
  15. package/dist/sol/dex/blockrazor/types.d.ts +191 -0
  16. package/dist/sol/dex/blockrazor/types.js +5 -0
  17. package/dist/sol/dex/index.d.ts +10 -0
  18. package/dist/sol/dex/index.js +16 -0
  19. package/dist/sol/dex/jup/client.d.ts +33 -0
  20. package/dist/sol/dex/jup/client.js +110 -0
  21. package/dist/sol/dex/jup/index.d.ts +16 -0
  22. package/dist/sol/dex/jup/index.js +148 -0
  23. package/dist/sol/dex/jup/legacy.d.ts +623 -0
  24. package/dist/sol/dex/jup/legacy.js +416 -0
  25. package/dist/sol/dex/jup/lend.d.ts +640 -0
  26. package/dist/sol/dex/jup/lend.js +603 -0
  27. package/dist/sol/dex/jup/portfolio.d.ts +362 -0
  28. package/dist/sol/dex/jup/portfolio.js +367 -0
  29. package/dist/sol/dex/jup/price.d.ts +173 -0
  30. package/dist/sol/dex/jup/price.js +220 -0
  31. package/dist/sol/dex/jup/recurring.d.ts +437 -0
  32. package/dist/sol/dex/jup/recurring.js +320 -0
  33. package/dist/sol/dex/jup/send.d.ts +282 -0
  34. package/dist/sol/dex/jup/send.js +295 -0
  35. package/dist/sol/dex/jup/studio.d.ts +457 -0
  36. package/dist/sol/dex/jup/studio.js +488 -0
  37. package/dist/sol/dex/jup/tokens.d.ts +767 -0
  38. package/dist/sol/dex/jup/tokens.js +697 -0
  39. package/dist/sol/dex/jup/trigger.d.ts +511 -0
  40. package/dist/sol/dex/jup/trigger.js +397 -0
  41. package/dist/sol/dex/jup/types.d.ts +433 -0
  42. package/dist/sol/dex/jup/types.js +5 -0
  43. package/dist/sol/dex/jup/ultra.d.ts +646 -0
  44. package/dist/sol/dex/jup/ultra.js +853 -0
  45. package/dist/sol/dex/meteora/client.d.ts +76 -0
  46. package/dist/sol/dex/meteora/client.js +219 -0
  47. package/dist/sol/dex/meteora/damm-v1-bundle.d.ts +61 -0
  48. package/dist/sol/dex/meteora/damm-v1-bundle.js +112 -0
  49. package/dist/sol/dex/meteora/damm-v1.d.ts +118 -0
  50. package/dist/sol/dex/meteora/damm-v1.js +315 -0
  51. package/dist/sol/dex/meteora/damm-v2-bundle.d.ts +82 -0
  52. package/dist/sol/dex/meteora/damm-v2-bundle.js +242 -0
  53. package/dist/sol/dex/meteora/damm-v2.d.ts +172 -0
  54. package/dist/sol/dex/meteora/damm-v2.js +632 -0
  55. package/dist/sol/dex/meteora/dbc-bundle.d.ts +123 -0
  56. package/dist/sol/dex/meteora/dbc-bundle.js +304 -0
  57. package/dist/sol/dex/meteora/dbc.d.ts +192 -0
  58. package/dist/sol/dex/meteora/dbc.js +619 -0
  59. package/dist/sol/dex/meteora/dlmm-bundle.d.ts +39 -0
  60. package/dist/sol/dex/meteora/dlmm-bundle.js +189 -0
  61. package/dist/sol/dex/meteora/dlmm.d.ts +157 -0
  62. package/dist/sol/dex/meteora/dlmm.js +671 -0
  63. package/dist/sol/dex/meteora/index.d.ts +25 -0
  64. package/dist/sol/dex/meteora/index.js +65 -0
  65. package/dist/sol/dex/meteora/types.d.ts +787 -0
  66. package/dist/sol/dex/meteora/types.js +110 -0
  67. package/dist/sol/dex/orca/index.d.ts +10 -0
  68. package/dist/sol/dex/orca/index.js +16 -0
  69. package/dist/sol/dex/orca/orca-bundle.d.ts +41 -0
  70. package/dist/sol/dex/orca/orca-bundle.js +173 -0
  71. package/dist/sol/dex/orca/orca.d.ts +65 -0
  72. package/dist/sol/dex/orca/orca.js +474 -0
  73. package/dist/sol/dex/orca/types.d.ts +263 -0
  74. package/dist/sol/dex/orca/types.js +38 -0
  75. package/dist/sol/dex/orca/wavebreak-bundle.d.ts +34 -0
  76. package/dist/sol/dex/orca/wavebreak-bundle.js +198 -0
  77. package/dist/sol/dex/orca/wavebreak-types.d.ts +227 -0
  78. package/dist/sol/dex/orca/wavebreak-types.js +23 -0
  79. package/dist/sol/dex/orca/wavebreak.d.ts +78 -0
  80. package/dist/sol/dex/orca/wavebreak.js +497 -0
  81. package/dist/sol/dex/pump/index.d.ts +9 -0
  82. package/dist/sol/dex/pump/index.js +14 -0
  83. package/dist/sol/dex/pump/pump-bundle.d.ts +92 -0
  84. package/dist/sol/dex/pump/pump-bundle.js +383 -0
  85. package/dist/sol/dex/pump/pump-swap-bundle.d.ts +103 -0
  86. package/dist/sol/dex/pump/pump-swap-bundle.js +380 -0
  87. package/dist/sol/dex/pump/pump-swap.d.ts +46 -0
  88. package/dist/sol/dex/pump/pump-swap.js +199 -0
  89. package/dist/sol/dex/pump/pump.d.ts +35 -0
  90. package/dist/sol/dex/pump/pump.js +352 -0
  91. package/dist/sol/dex/pump/types.d.ts +215 -0
  92. package/dist/sol/dex/pump/types.js +5 -0
  93. package/dist/sol/dex/raydium/index.d.ts +8 -0
  94. package/dist/sol/dex/raydium/index.js +12 -0
  95. package/dist/sol/dex/raydium/launchlab.d.ts +68 -0
  96. package/dist/sol/dex/raydium/launchlab.js +210 -0
  97. package/dist/sol/dex/raydium/raydium-bundle.d.ts +64 -0
  98. package/dist/sol/dex/raydium/raydium-bundle.js +324 -0
  99. package/dist/sol/dex/raydium/raydium.d.ts +40 -0
  100. package/dist/sol/dex/raydium/raydium.js +366 -0
  101. package/dist/sol/dex/raydium/types.d.ts +240 -0
  102. package/dist/sol/dex/raydium/types.js +5 -0
  103. package/dist/sol/index.d.ts +11 -0
  104. package/dist/sol/index.js +18 -0
  105. package/dist/sol/jito/bundle.d.ts +90 -0
  106. package/dist/sol/jito/bundle.js +263 -0
  107. package/dist/sol/jito/index.d.ts +7 -0
  108. package/dist/sol/jito/index.js +7 -0
  109. package/dist/sol/jito/tip.d.ts +51 -0
  110. package/dist/sol/jito/tip.js +83 -0
  111. package/dist/sol/jito/types.d.ts +100 -0
  112. package/dist/sol/jito/types.js +5 -0
  113. package/dist/sol/nozomi/client.d.ts +63 -0
  114. package/dist/sol/nozomi/client.js +222 -0
  115. package/dist/sol/nozomi/index.d.ts +8 -0
  116. package/dist/sol/nozomi/index.js +8 -0
  117. package/dist/sol/nozomi/tip.d.ts +50 -0
  118. package/dist/sol/nozomi/tip.js +80 -0
  119. package/dist/sol/nozomi/types.d.ts +96 -0
  120. package/dist/sol/nozomi/types.js +5 -0
  121. package/dist/sol/token/create-complete.d.ts +115 -0
  122. package/dist/sol/token/create-complete.js +235 -0
  123. package/dist/sol/token/create-token.d.ts +57 -0
  124. package/dist/sol/token/create-token.js +230 -0
  125. package/dist/sol/token/index.d.ts +9 -0
  126. package/dist/sol/token/index.js +14 -0
  127. package/dist/sol/token/metadata-upload.d.ts +86 -0
  128. package/dist/sol/token/metadata-upload.js +173 -0
  129. package/dist/sol/token/metadata.d.ts +92 -0
  130. package/dist/sol/token/metadata.js +274 -0
  131. package/dist/sol/token/types.d.ts +153 -0
  132. package/dist/sol/token/types.js +5 -0
  133. package/dist/sol/types.d.ts +176 -0
  134. package/dist/sol/types.js +7 -0
  135. package/dist/sol/utils/balance.d.ts +160 -0
  136. package/dist/sol/utils/balance.js +638 -0
  137. package/dist/sol/utils/connection.d.ts +78 -0
  138. package/dist/sol/utils/connection.js +168 -0
  139. package/dist/sol/utils/index.d.ts +9 -0
  140. package/dist/sol/utils/index.js +9 -0
  141. package/dist/sol/utils/lp-inspect.d.ts +75 -0
  142. package/dist/sol/utils/lp-inspect.js +235 -0
  143. package/dist/sol/utils/transfer.d.ts +196 -0
  144. package/dist/sol/utils/transfer.js +307 -0
  145. package/dist/sol/utils/wallet.d.ts +107 -0
  146. package/dist/sol/utils/wallet.js +210 -0
  147. package/package.json +44 -5
  148. package/README.zh-CN.pdf +0 -0
  149. package/dist/flap/portal-bundle-merkle/encryption.d.ts +0 -16
  150. package/dist/flap/portal-bundle-merkle/encryption.js +0 -146
@@ -0,0 +1,603 @@
1
+ /**
2
+ * Jupiter Lend API (Jupiter Earn)
3
+ * @module sol/dex/jup/lend
4
+ *
5
+ * Lend API 提供存款赚息功能
6
+ * 用户可以存入代币获取 APY 收益
7
+ */
8
+ import { jupGet, jupPost } from './client.js';
9
+ // ============================================================================
10
+ // Deposit - 存款
11
+ // ============================================================================
12
+ /**
13
+ * 构建存款交易
14
+ *
15
+ * 将代币存入 Jupiter Earn 赚取利息。
16
+ *
17
+ * @param params 存款参数
18
+ * @param config Jupiter 配置
19
+ * @returns 未签名交易
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * import { Sol } from 'four-flap-meme-sdk'
24
+ *
25
+ * Sol.setJupiterConfig({ apiKey: 'your-api-key' })
26
+ *
27
+ * // 存入 5 USDC
28
+ * const result = await Sol.buildLendDeposit({
29
+ * asset: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', // USDC
30
+ * signer: wallet.publicKey.toBase58(),
31
+ * amount: '5', // 5 USDC
32
+ * })
33
+ *
34
+ * // 签名并发送
35
+ * const tx = VersionedTransaction.deserialize(
36
+ * Buffer.from(result.transaction, 'base64')
37
+ * )
38
+ * tx.sign([wallet])
39
+ * const signature = await connection.sendTransaction(tx)
40
+ * ```
41
+ */
42
+ export async function buildLendDeposit(params, config) {
43
+ return jupPost('/lend/v1/earn/deposit', params, config);
44
+ }
45
+ // ============================================================================
46
+ // Withdraw - 取款
47
+ // ============================================================================
48
+ /**
49
+ * 构建取款交易
50
+ *
51
+ * 从 Jupiter Earn 取出存款和收益。
52
+ *
53
+ * @param params 取款参数
54
+ * @param config Jupiter 配置
55
+ * @returns 未签名交易
56
+ *
57
+ * @example
58
+ * ```typescript
59
+ * // 取出 5 USDC
60
+ * const result = await Sol.buildLendWithdraw({
61
+ * asset: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
62
+ * signer: wallet.publicKey.toBase58(),
63
+ * amount: '5',
64
+ * })
65
+ *
66
+ * // 签名并发送
67
+ * const tx = VersionedTransaction.deserialize(
68
+ * Buffer.from(result.transaction, 'base64')
69
+ * )
70
+ * tx.sign([wallet])
71
+ * await connection.sendTransaction(tx)
72
+ * ```
73
+ */
74
+ export async function buildLendWithdraw(params, config) {
75
+ return jupPost('/lend/v1/earn/withdraw', params, config);
76
+ }
77
+ // ============================================================================
78
+ // Mint - 按份额存款
79
+ // ============================================================================
80
+ /**
81
+ * 构建 Mint 交易 (按份额存款)
82
+ *
83
+ * 使用份额 (shares) 而非代币数量来存款。
84
+ * 这是更底层的接口,适合精确控制份额的场景。
85
+ *
86
+ * @param params Mint 参数
87
+ * @param config Jupiter 配置
88
+ * @returns 未签名交易
89
+ *
90
+ * @example
91
+ * ```typescript
92
+ * const result = await Sol.buildLendMint({
93
+ * asset: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
94
+ * signer: wallet.publicKey.toBase58(),
95
+ * shares: '1000000', // 份额数量
96
+ * })
97
+ * ```
98
+ */
99
+ export async function buildLendMint(params, config) {
100
+ return jupPost('/lend/v1/earn/mint', params, config);
101
+ }
102
+ // ============================================================================
103
+ // Burn - 按份额取款
104
+ // ============================================================================
105
+ /**
106
+ * 构建 Burn 交易 (按份额取款)
107
+ *
108
+ * 使用份额 (shares) 而非代币数量来取款。
109
+ * 这是更底层的接口,适合精确控制份额的场景。
110
+ *
111
+ * @param params Burn 参数
112
+ * @param config Jupiter 配置
113
+ * @returns 未签名交易
114
+ *
115
+ * @example
116
+ * ```typescript
117
+ * const result = await Sol.buildLendBurn({
118
+ * asset: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
119
+ * signer: wallet.publicKey.toBase58(),
120
+ * shares: '1000000', // 份额数量
121
+ * })
122
+ * ```
123
+ */
124
+ export async function buildLendBurn(params, config) {
125
+ return jupPost('/lend/v1/earn/burn', params, config);
126
+ }
127
+ // ============================================================================
128
+ // Redeem - 按份额赎回
129
+ // ============================================================================
130
+ /**
131
+ * 构建 Redeem 交易 (按份额赎回)
132
+ *
133
+ * 与 Burn 类似,使用份额来赎回代币。
134
+ *
135
+ * @param params Redeem 参数
136
+ * @param config Jupiter 配置
137
+ * @returns 未签名交易
138
+ *
139
+ * @example
140
+ * ```typescript
141
+ * const result = await Sol.buildLendRedeem({
142
+ * asset: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
143
+ * signer: wallet.publicKey.toBase58(),
144
+ * shares: '1000000',
145
+ * })
146
+ * ```
147
+ */
148
+ export async function buildLendRedeem(params, config) {
149
+ return jupPost('/lend/v1/earn/redeem', params, config);
150
+ }
151
+ // ============================================================================
152
+ // Instructions - 获取分解指令
153
+ // ============================================================================
154
+ /**
155
+ * 获取存款指令
156
+ *
157
+ * 返回单个指令而非完整交易,适合自定义组装交易。
158
+ *
159
+ * @param params 存款参数
160
+ * @param config Jupiter 配置
161
+ * @returns 指令
162
+ *
163
+ * @example
164
+ * ```typescript
165
+ * const instruction = await Sol.getLendDepositInstruction({
166
+ * asset: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
167
+ * signer: wallet.publicKey.toBase58(),
168
+ * amount: '5',
169
+ * })
170
+ *
171
+ * // 反序列化为 TransactionInstruction
172
+ * const ix = new TransactionInstruction({
173
+ * programId: new PublicKey(instruction.programId),
174
+ * keys: instruction.accounts.map(acc => ({
175
+ * pubkey: new PublicKey(acc.pubkey),
176
+ * isSigner: acc.isSigner,
177
+ * isWritable: acc.isWritable,
178
+ * })),
179
+ * data: Buffer.from(instruction.data, 'base64'),
180
+ * })
181
+ * ```
182
+ */
183
+ export async function getLendDepositInstruction(params, config) {
184
+ return jupPost('/lend/v1/earn/deposit-instructions', params, config);
185
+ }
186
+ /**
187
+ * 获取取款指令
188
+ *
189
+ * @param params 取款参数
190
+ * @param config Jupiter 配置
191
+ * @returns 指令
192
+ */
193
+ export async function getLendWithdrawInstruction(params, config) {
194
+ return jupPost('/lend/v1/earn/withdraw-instructions', params, config);
195
+ }
196
+ /**
197
+ * 获取 Mint 指令
198
+ *
199
+ * @param params Mint 参数
200
+ * @param config Jupiter 配置
201
+ * @returns 指令
202
+ */
203
+ export async function getLendMintInstruction(params, config) {
204
+ return jupPost('/lend/v1/earn/mint-instructions', params, config);
205
+ }
206
+ /**
207
+ * 获取 Burn 指令
208
+ *
209
+ * @param params Burn 参数
210
+ * @param config Jupiter 配置
211
+ * @returns 指令
212
+ */
213
+ export async function getLendBurnInstruction(params, config) {
214
+ return jupPost('/lend/v1/earn/burn-instructions', params, config);
215
+ }
216
+ /**
217
+ * 获取 Redeem 指令
218
+ *
219
+ * @param params Redeem 参数
220
+ * @param config Jupiter 配置
221
+ * @returns 指令
222
+ */
223
+ export async function getLendRedeemInstruction(params, config) {
224
+ return jupPost('/lend/v1/earn/redeem-instructions', params, config);
225
+ }
226
+ // ============================================================================
227
+ // Tokens - 获取支持的代币
228
+ // ============================================================================
229
+ /**
230
+ * 获取所有 Earn 支持的代币
231
+ *
232
+ * 返回详细的代币信息,包括:
233
+ * - jl 代币地址和底层资产地址
234
+ * - 当前收益率 (APY)
235
+ * - 总存款量和总供应量
236
+ * - 份额转换比率
237
+ * - 流动性数据
238
+ *
239
+ * @param config Jupiter 配置
240
+ * @returns 代币信息数组
241
+ *
242
+ * @example
243
+ * ```typescript
244
+ * const tokens = await Sol.getEarnTokens()
245
+ *
246
+ * tokens.forEach(token => {
247
+ * // 计算 APY (基点转百分比)
248
+ * const apy = Number(token.totalRate) / 100
249
+ *
250
+ * console.log(`${token.symbol}:`)
251
+ * console.log(` APY: ${apy.toFixed(2)}%`)
252
+ * console.log(` 底层资产: ${token.asset.symbol}`)
253
+ * console.log(` 价格: $${token.asset.price}`)
254
+ * console.log(` jl代币地址: ${token.address}`)
255
+ * console.log(` 资产地址: ${token.assetAddress}`)
256
+ * })
257
+ *
258
+ * // 示例输出:
259
+ * // jlUSDC:
260
+ * // APY: 5.46%
261
+ * // 底层资产: USDC
262
+ * // 价格: $0.999730840125
263
+ * ```
264
+ */
265
+ export async function getEarnTokens(config) {
266
+ return jupGet('/lend/v1/earn/tokens', {}, config);
267
+ }
268
+ /**
269
+ * 获取单个代币的 Earn 信息
270
+ *
271
+ * @param assetMint 底层资产 Mint 地址
272
+ * @param config Jupiter 配置
273
+ * @returns 代币信息或 null
274
+ *
275
+ * @example
276
+ * ```typescript
277
+ * const usdcInfo = await Sol.getEarnTokenByAsset(
278
+ * 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'
279
+ * )
280
+ *
281
+ * if (usdcInfo) {
282
+ * console.log('USDC APY:', Number(usdcInfo.totalRate) / 100, '%')
283
+ * }
284
+ * ```
285
+ */
286
+ export async function getEarnTokenByAsset(assetMint, config) {
287
+ const tokens = await getEarnTokens(config);
288
+ return tokens.find(t => t.assetAddress === assetMint) || null;
289
+ }
290
+ /**
291
+ * 获取所有 Earn APY 信息
292
+ *
293
+ * @param config Jupiter 配置
294
+ * @returns APY 映射 { assetMint: { symbol, apy, supplyRate, rewardsRate } }
295
+ *
296
+ * @example
297
+ * ```typescript
298
+ * const apys = await Sol.getEarnApys()
299
+ *
300
+ * // { 'EPj...': { symbol: 'USDC', apy: 5.46, ... }, ... }
301
+ * console.log('USDC APY:', apys['EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'].apy)
302
+ * ```
303
+ */
304
+ export async function getEarnApys(config) {
305
+ const tokens = await getEarnTokens(config);
306
+ const result = {};
307
+ for (const token of tokens) {
308
+ result[token.assetAddress] = {
309
+ symbol: token.asset.symbol,
310
+ jlSymbol: token.symbol,
311
+ apy: Number(token.totalRate) / 100, // 基点转百分比
312
+ supplyRate: Number(token.supplyRate) / 100,
313
+ rewardsRate: Number(token.rewardsRate) / 100,
314
+ price: parseFloat(token.asset.price),
315
+ };
316
+ }
317
+ return result;
318
+ }
319
+ /**
320
+ * 计算份额对应的资产数量
321
+ *
322
+ * @param shares 份额数量 (最小单位)
323
+ * @param tokenInfo 代币信息
324
+ * @returns 资产数量 (最小单位)
325
+ */
326
+ export function sharesToAssets(shares, tokenInfo) {
327
+ const sharesNum = BigInt(shares);
328
+ const convertToAssets = BigInt(tokenInfo.convertToAssets);
329
+ // convertToAssets 是 1e6 份额对应的资产数量
330
+ return sharesNum * convertToAssets / BigInt(1000000);
331
+ }
332
+ /**
333
+ * 计算资产数量对应的份额
334
+ *
335
+ * @param assets 资产数量 (最小单位)
336
+ * @param tokenInfo 代币信息
337
+ * @returns 份额数量 (最小单位)
338
+ */
339
+ export function assetsToShares(assets, tokenInfo) {
340
+ const assetsNum = BigInt(assets);
341
+ const convertToShares = BigInt(tokenInfo.convertToShares);
342
+ // convertToShares 是 1e6 资产对应的份额数量
343
+ return assetsNum * convertToShares / BigInt(1000000);
344
+ }
345
+ // ============================================================================
346
+ // Positions - 用户仓位
347
+ // ============================================================================
348
+ /**
349
+ * 获取用户的 Earn 仓位
350
+ *
351
+ * 返回用户在所有 Earn 代币的存款仓位。
352
+ *
353
+ * @param users 用户地址(支持单个或多个,逗号分隔)
354
+ * @param config Jupiter 配置
355
+ * @returns 仓位数组
356
+ *
357
+ * @example
358
+ * ```typescript
359
+ * const positions = await Sol.getEarnPositions(
360
+ * '9yFqMjJgsEcZ8GnEtFqxw1oFbPPVpypMVgYzQWgECFNy'
361
+ * )
362
+ *
363
+ * positions.forEach(pos => {
364
+ * if (BigInt(pos.shares) > 0n) {
365
+ * console.log(`${pos.token.asset.symbol}:`)
366
+ * console.log(` 份额: ${pos.shares}`)
367
+ * console.log(` 底层资产: ${pos.underlyingAssets}`)
368
+ * console.log(` APY: ${Number(pos.token.totalRate) / 100}%`)
369
+ * }
370
+ * })
371
+ * ```
372
+ */
373
+ export async function getEarnPositions(users, config) {
374
+ const usersParam = Array.isArray(users) ? users.join(',') : users;
375
+ return jupGet('/lend/v1/earn/positions', { users: usersParam }, config);
376
+ }
377
+ /**
378
+ * 获取用户在指定代币的 Earn 仓位
379
+ *
380
+ * @param user 用户地址
381
+ * @param assetMint 底层资产 Mint 地址
382
+ * @param config Jupiter 配置
383
+ * @returns 仓位或 null
384
+ *
385
+ * @example
386
+ * ```typescript
387
+ * const usdcPosition = await Sol.getEarnPositionByAsset(
388
+ * '9yFqMjJgsEcZ8GnEtFqxw1oFbPPVpypMVgYzQWgECFNy',
389
+ * 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', // USDC
390
+ * )
391
+ *
392
+ * if (usdcPosition && BigInt(usdcPosition.shares) > 0n) {
393
+ * console.log('USDC 存款:', usdcPosition.underlyingAssets)
394
+ * }
395
+ * ```
396
+ */
397
+ export async function getEarnPositionByAsset(user, assetMint, config) {
398
+ const positions = await getEarnPositions(user, config);
399
+ return positions.find(p => p.token.assetAddress === assetMint) || null;
400
+ }
401
+ /**
402
+ * 获取用户的非零 Earn 仓位
403
+ *
404
+ * @param user 用户地址
405
+ * @param config Jupiter 配置
406
+ * @returns 非零仓位数组
407
+ *
408
+ * @example
409
+ * ```typescript
410
+ * const activePositions = await Sol.getActiveEarnPositions(
411
+ * '9yFqMjJgsEcZ8GnEtFqxw1oFbPPVpypMVgYzQWgECFNy'
412
+ * )
413
+ *
414
+ * activePositions.forEach(pos => {
415
+ * console.log(`${pos.token.asset.symbol}: ${pos.underlyingAssets}`)
416
+ * })
417
+ * ```
418
+ */
419
+ export async function getActiveEarnPositions(user, config) {
420
+ const positions = await getEarnPositions(user, config);
421
+ return positions.filter(p => BigInt(p.shares) > 0n || BigInt(p.underlyingBalance) > 0n);
422
+ }
423
+ /**
424
+ * 获取用户的 Earn 资产总值 (USD)
425
+ *
426
+ * @param user 用户地址
427
+ * @param config Jupiter 配置
428
+ * @returns 总值 USD
429
+ *
430
+ * @example
431
+ * ```typescript
432
+ * const totalValue = await Sol.getEarnTotalValue(
433
+ * '9yFqMjJgsEcZ8GnEtFqxw1oFbPPVpypMVgYzQWgECFNy'
434
+ * )
435
+ * console.log('Earn 总值: $' + totalValue.toFixed(2))
436
+ * ```
437
+ */
438
+ export async function getEarnTotalValue(user, config) {
439
+ const positions = await getEarnPositions(user, config);
440
+ let totalValue = 0;
441
+ for (const pos of positions) {
442
+ const underlyingAssets = BigInt(pos.underlyingAssets);
443
+ if (underlyingAssets > 0n) {
444
+ const price = parseFloat(pos.token.asset.price);
445
+ const decimals = pos.token.decimals;
446
+ const uiAmount = Number(underlyingAssets) / Math.pow(10, decimals);
447
+ totalValue += uiAmount * price;
448
+ }
449
+ }
450
+ return totalValue;
451
+ }
452
+ // ============================================================================
453
+ // Earnings - 收益统计
454
+ // ============================================================================
455
+ /**
456
+ * 获取用户的收益统计
457
+ *
458
+ * 返回用户的存款、取款和收益汇总。
459
+ *
460
+ * @param user 用户地址(可选,不传则获取所有)
461
+ * @param config Jupiter 配置
462
+ * @returns 收益信息数组
463
+ *
464
+ * @example
465
+ * ```typescript
466
+ * const earnings = await Sol.getEarnEarnings(
467
+ * '9yFqMjJgsEcZ8GnEtFqxw1oFbPPVpypMVgYzQWgECFNy'
468
+ * )
469
+ *
470
+ * earnings.forEach(e => {
471
+ * console.log(`代币: ${e.address}`)
472
+ * console.log(` 总存款: ${e.totalDeposits}`)
473
+ * console.log(` 总取款: ${e.totalWithdraws}`)
474
+ * console.log(` 当前余额: ${e.totalBalance}`)
475
+ * console.log(` 收益: ${e.earnings}`)
476
+ * })
477
+ * ```
478
+ */
479
+ export async function getEarnEarnings(user, config) {
480
+ const params = {};
481
+ if (user) {
482
+ params.user = user;
483
+ }
484
+ return jupGet('/lend/v1/earn/earnings', params, config);
485
+ }
486
+ /**
487
+ * 获取用户在指定代币的收益
488
+ *
489
+ * @param user 用户地址
490
+ * @param jlTokenAddress jl 代币地址(如 jlUSDC 地址)
491
+ * @param config Jupiter 配置
492
+ * @returns 收益信息或 null
493
+ */
494
+ export async function getEarnEarningsByToken(user, jlTokenAddress, config) {
495
+ const earnings = await getEarnEarnings(user, config);
496
+ return earnings.find(e => e.address === jlTokenAddress) || null;
497
+ }
498
+ /**
499
+ * 获取用户的总收益汇总
500
+ *
501
+ * @param user 用户地址
502
+ * @param config Jupiter 配置
503
+ * @returns 汇总信息
504
+ *
505
+ * @example
506
+ * ```typescript
507
+ * const summary = await Sol.getEarnEarningsSummary(user)
508
+ * console.log('总存款:', summary.totalDeposits)
509
+ * console.log('总取款:', summary.totalWithdraws)
510
+ * console.log('总收益:', summary.totalEarnings)
511
+ * ```
512
+ */
513
+ export async function getEarnEarningsSummary(user, config) {
514
+ const earnings = await getEarnEarnings(user, config);
515
+ let totalDeposits = 0n;
516
+ let totalWithdraws = 0n;
517
+ let totalBalance = 0n;
518
+ let totalEarnings = 0n;
519
+ for (const e of earnings) {
520
+ totalDeposits += BigInt(e.totalDeposits || '0');
521
+ totalWithdraws += BigInt(e.totalWithdraws || '0');
522
+ totalBalance += BigInt(e.totalBalance || '0');
523
+ totalEarnings += BigInt(e.earnings || '0');
524
+ }
525
+ return {
526
+ totalDeposits,
527
+ totalWithdraws,
528
+ totalBalance,
529
+ totalEarnings,
530
+ };
531
+ }
532
+ // ============================================================================
533
+ // 便捷方法
534
+ // ============================================================================
535
+ /** 常见的 Earn 支持代币 */
536
+ export const LEND_SUPPORTED_ASSETS = {
537
+ /** USDC */
538
+ USDC: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
539
+ /** USDT */
540
+ USDT: 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB',
541
+ /** SOL */
542
+ SOL: 'So11111111111111111111111111111111111111112',
543
+ };
544
+ /**
545
+ * 存入 USDC
546
+ *
547
+ * @param signer 签名者公钥
548
+ * @param amount 数量 (UI 数量,如 "100" 表示 100 USDC)
549
+ * @param config Jupiter 配置
550
+ * @returns 未签名交易
551
+ */
552
+ export async function depositUsdc(signer, amount, config) {
553
+ return buildLendDeposit({
554
+ asset: LEND_SUPPORTED_ASSETS.USDC,
555
+ signer,
556
+ amount,
557
+ }, config);
558
+ }
559
+ /**
560
+ * 取出 USDC
561
+ *
562
+ * @param signer 签名者公钥
563
+ * @param amount 数量
564
+ * @param config Jupiter 配置
565
+ * @returns 未签名交易
566
+ */
567
+ export async function withdrawUsdc(signer, amount, config) {
568
+ return buildLendWithdraw({
569
+ asset: LEND_SUPPORTED_ASSETS.USDC,
570
+ signer,
571
+ amount,
572
+ }, config);
573
+ }
574
+ /**
575
+ * 存入 SOL
576
+ *
577
+ * @param signer 签名者公钥
578
+ * @param amount 数量 (UI 数量,如 "1" 表示 1 SOL)
579
+ * @param config Jupiter 配置
580
+ * @returns 未签名交易
581
+ */
582
+ export async function depositSol(signer, amount, config) {
583
+ return buildLendDeposit({
584
+ asset: LEND_SUPPORTED_ASSETS.SOL,
585
+ signer,
586
+ amount,
587
+ }, config);
588
+ }
589
+ /**
590
+ * 取出 SOL
591
+ *
592
+ * @param signer 签名者公钥
593
+ * @param amount 数量
594
+ * @param config Jupiter 配置
595
+ * @returns 未签名交易
596
+ */
597
+ export async function withdrawSol(signer, amount, config) {
598
+ return buildLendWithdraw({
599
+ asset: LEND_SUPPORTED_ASSETS.SOL,
600
+ signer,
601
+ amount,
602
+ }, config);
603
+ }