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.
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -1
- package/dist/sol/constants.d.ts +150 -0
- package/dist/sol/constants.js +188 -0
- package/dist/sol/dex/blockrazor/client.d.ts +51 -0
- package/dist/sol/dex/blockrazor/client.js +96 -0
- package/dist/sol/dex/blockrazor/constants.d.ts +34 -0
- package/dist/sol/dex/blockrazor/constants.js +55 -0
- package/dist/sol/dex/blockrazor/geyser.d.ts +128 -0
- package/dist/sol/dex/blockrazor/geyser.js +530 -0
- package/dist/sol/dex/blockrazor/index.d.ts +18 -0
- package/dist/sol/dex/blockrazor/index.js +23 -0
- package/dist/sol/dex/blockrazor/send.d.ts +135 -0
- package/dist/sol/dex/blockrazor/send.js +254 -0
- package/dist/sol/dex/blockrazor/types.d.ts +191 -0
- package/dist/sol/dex/blockrazor/types.js +5 -0
- package/dist/sol/dex/index.d.ts +10 -0
- package/dist/sol/dex/index.js +16 -0
- package/dist/sol/dex/jup/client.d.ts +33 -0
- package/dist/sol/dex/jup/client.js +110 -0
- package/dist/sol/dex/jup/index.d.ts +16 -0
- package/dist/sol/dex/jup/index.js +148 -0
- package/dist/sol/dex/jup/legacy.d.ts +623 -0
- package/dist/sol/dex/jup/legacy.js +416 -0
- package/dist/sol/dex/jup/lend.d.ts +640 -0
- package/dist/sol/dex/jup/lend.js +603 -0
- package/dist/sol/dex/jup/portfolio.d.ts +362 -0
- package/dist/sol/dex/jup/portfolio.js +367 -0
- package/dist/sol/dex/jup/price.d.ts +173 -0
- package/dist/sol/dex/jup/price.js +220 -0
- package/dist/sol/dex/jup/recurring.d.ts +437 -0
- package/dist/sol/dex/jup/recurring.js +320 -0
- package/dist/sol/dex/jup/send.d.ts +282 -0
- package/dist/sol/dex/jup/send.js +295 -0
- package/dist/sol/dex/jup/studio.d.ts +457 -0
- package/dist/sol/dex/jup/studio.js +488 -0
- package/dist/sol/dex/jup/tokens.d.ts +767 -0
- package/dist/sol/dex/jup/tokens.js +697 -0
- package/dist/sol/dex/jup/trigger.d.ts +511 -0
- package/dist/sol/dex/jup/trigger.js +397 -0
- package/dist/sol/dex/jup/types.d.ts +433 -0
- package/dist/sol/dex/jup/types.js +5 -0
- package/dist/sol/dex/jup/ultra.d.ts +646 -0
- package/dist/sol/dex/jup/ultra.js +853 -0
- package/dist/sol/dex/meteora/client.d.ts +76 -0
- package/dist/sol/dex/meteora/client.js +219 -0
- package/dist/sol/dex/meteora/damm-v1-bundle.d.ts +61 -0
- package/dist/sol/dex/meteora/damm-v1-bundle.js +112 -0
- package/dist/sol/dex/meteora/damm-v1.d.ts +118 -0
- package/dist/sol/dex/meteora/damm-v1.js +315 -0
- package/dist/sol/dex/meteora/damm-v2-bundle.d.ts +82 -0
- package/dist/sol/dex/meteora/damm-v2-bundle.js +242 -0
- package/dist/sol/dex/meteora/damm-v2.d.ts +172 -0
- package/dist/sol/dex/meteora/damm-v2.js +632 -0
- package/dist/sol/dex/meteora/dbc-bundle.d.ts +123 -0
- package/dist/sol/dex/meteora/dbc-bundle.js +304 -0
- package/dist/sol/dex/meteora/dbc.d.ts +192 -0
- package/dist/sol/dex/meteora/dbc.js +619 -0
- package/dist/sol/dex/meteora/dlmm-bundle.d.ts +39 -0
- package/dist/sol/dex/meteora/dlmm-bundle.js +189 -0
- package/dist/sol/dex/meteora/dlmm.d.ts +157 -0
- package/dist/sol/dex/meteora/dlmm.js +671 -0
- package/dist/sol/dex/meteora/index.d.ts +25 -0
- package/dist/sol/dex/meteora/index.js +65 -0
- package/dist/sol/dex/meteora/types.d.ts +787 -0
- package/dist/sol/dex/meteora/types.js +110 -0
- package/dist/sol/dex/orca/index.d.ts +10 -0
- package/dist/sol/dex/orca/index.js +16 -0
- package/dist/sol/dex/orca/orca-bundle.d.ts +41 -0
- package/dist/sol/dex/orca/orca-bundle.js +173 -0
- package/dist/sol/dex/orca/orca.d.ts +65 -0
- package/dist/sol/dex/orca/orca.js +474 -0
- package/dist/sol/dex/orca/types.d.ts +263 -0
- package/dist/sol/dex/orca/types.js +38 -0
- package/dist/sol/dex/orca/wavebreak-bundle.d.ts +34 -0
- package/dist/sol/dex/orca/wavebreak-bundle.js +198 -0
- package/dist/sol/dex/orca/wavebreak-types.d.ts +227 -0
- package/dist/sol/dex/orca/wavebreak-types.js +23 -0
- package/dist/sol/dex/orca/wavebreak.d.ts +78 -0
- package/dist/sol/dex/orca/wavebreak.js +497 -0
- package/dist/sol/dex/pump/index.d.ts +9 -0
- package/dist/sol/dex/pump/index.js +14 -0
- package/dist/sol/dex/pump/pump-bundle.d.ts +92 -0
- package/dist/sol/dex/pump/pump-bundle.js +383 -0
- package/dist/sol/dex/pump/pump-swap-bundle.d.ts +103 -0
- package/dist/sol/dex/pump/pump-swap-bundle.js +380 -0
- package/dist/sol/dex/pump/pump-swap.d.ts +46 -0
- package/dist/sol/dex/pump/pump-swap.js +199 -0
- package/dist/sol/dex/pump/pump.d.ts +35 -0
- package/dist/sol/dex/pump/pump.js +352 -0
- package/dist/sol/dex/pump/types.d.ts +215 -0
- package/dist/sol/dex/pump/types.js +5 -0
- package/dist/sol/dex/raydium/index.d.ts +8 -0
- package/dist/sol/dex/raydium/index.js +12 -0
- package/dist/sol/dex/raydium/launchlab.d.ts +68 -0
- package/dist/sol/dex/raydium/launchlab.js +210 -0
- package/dist/sol/dex/raydium/raydium-bundle.d.ts +64 -0
- package/dist/sol/dex/raydium/raydium-bundle.js +324 -0
- package/dist/sol/dex/raydium/raydium.d.ts +40 -0
- package/dist/sol/dex/raydium/raydium.js +366 -0
- package/dist/sol/dex/raydium/types.d.ts +240 -0
- package/dist/sol/dex/raydium/types.js +5 -0
- package/dist/sol/index.d.ts +11 -0
- package/dist/sol/index.js +18 -0
- package/dist/sol/jito/bundle.d.ts +90 -0
- package/dist/sol/jito/bundle.js +263 -0
- package/dist/sol/jito/index.d.ts +7 -0
- package/dist/sol/jito/index.js +7 -0
- package/dist/sol/jito/tip.d.ts +51 -0
- package/dist/sol/jito/tip.js +83 -0
- package/dist/sol/jito/types.d.ts +100 -0
- package/dist/sol/jito/types.js +5 -0
- package/dist/sol/nozomi/client.d.ts +63 -0
- package/dist/sol/nozomi/client.js +222 -0
- package/dist/sol/nozomi/index.d.ts +8 -0
- package/dist/sol/nozomi/index.js +8 -0
- package/dist/sol/nozomi/tip.d.ts +50 -0
- package/dist/sol/nozomi/tip.js +80 -0
- package/dist/sol/nozomi/types.d.ts +96 -0
- package/dist/sol/nozomi/types.js +5 -0
- package/dist/sol/token/create-complete.d.ts +115 -0
- package/dist/sol/token/create-complete.js +235 -0
- package/dist/sol/token/create-token.d.ts +57 -0
- package/dist/sol/token/create-token.js +230 -0
- package/dist/sol/token/index.d.ts +9 -0
- package/dist/sol/token/index.js +14 -0
- package/dist/sol/token/metadata-upload.d.ts +86 -0
- package/dist/sol/token/metadata-upload.js +173 -0
- package/dist/sol/token/metadata.d.ts +92 -0
- package/dist/sol/token/metadata.js +274 -0
- package/dist/sol/token/types.d.ts +153 -0
- package/dist/sol/token/types.js +5 -0
- package/dist/sol/types.d.ts +176 -0
- package/dist/sol/types.js +7 -0
- package/dist/sol/utils/balance.d.ts +160 -0
- package/dist/sol/utils/balance.js +638 -0
- package/dist/sol/utils/connection.d.ts +78 -0
- package/dist/sol/utils/connection.js +168 -0
- package/dist/sol/utils/index.d.ts +9 -0
- package/dist/sol/utils/index.js +9 -0
- package/dist/sol/utils/lp-inspect.d.ts +75 -0
- package/dist/sol/utils/lp-inspect.js +235 -0
- package/dist/sol/utils/transfer.d.ts +196 -0
- package/dist/sol/utils/transfer.js +307 -0
- package/dist/sol/utils/wallet.d.ts +107 -0
- package/dist/sol/utils/wallet.js +210 -0
- package/package.json +44 -5
- package/README.zh-CN.pdf +0 -0
- package/dist/flap/portal-bundle-merkle/encryption.d.ts +0 -16
- 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
|
+
}
|