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