pump-trader 1.0.0 → 1.0.1
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.md +24 -2
- package/index.js +83 -4
- package/index.ts +83 -4
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -162,9 +162,31 @@ console.log(completed); // 是否完成内盘
|
|
|
162
162
|
|
|
163
163
|
### 查询余额
|
|
164
164
|
|
|
165
|
+
#### 查询单个代币余额
|
|
166
|
+
|
|
167
|
+
```javascript
|
|
168
|
+
// 查询指定代币的余额
|
|
169
|
+
const balance = await trader.tokenBalance(tokenAddr);
|
|
170
|
+
console.log(balance); // 返回数字,例如:123.45
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
#### 查询所有代币余额
|
|
174
|
+
|
|
175
|
+
```javascript
|
|
176
|
+
// 查询账户所有的代币(余额 > 0)
|
|
177
|
+
const allTokens = await trader.tokenBalance();
|
|
178
|
+
|
|
179
|
+
// 返回数组:[{ mint, amount, decimals, uiAmount }, ...]
|
|
180
|
+
allTokens.forEach((token) => {
|
|
181
|
+
console.log(`${token.mint}: ${token.uiAmount}`);
|
|
182
|
+
});
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
#### 使用专用方法
|
|
186
|
+
|
|
165
187
|
```javascript
|
|
166
|
-
//
|
|
167
|
-
const
|
|
188
|
+
// 直接调用方法查询所有代币
|
|
189
|
+
const allBalances = await trader.getAllTokenBalances();
|
|
168
190
|
|
|
169
191
|
// SOL 余额
|
|
170
192
|
const solBalance = await trader.solBalance();
|
package/index.js
CHANGED
|
@@ -371,14 +371,93 @@ export class PumpTrader {
|
|
|
371
371
|
|
|
372
372
|
/* ---------- 余额查询 ---------- */
|
|
373
373
|
|
|
374
|
-
|
|
375
|
-
|
|
374
|
+
/**
|
|
375
|
+
* 查询代币余额
|
|
376
|
+
* @param {string} tokenAddr - 代币地址(可选),如果不传则返回所有代币
|
|
377
|
+
* @returns {Promise<number|Array>} 如果传入地址则返回该代币的余额数字,否则返回所有代币的详细信息
|
|
378
|
+
*/
|
|
379
|
+
async tokenBalance(tokenAddr = null) {
|
|
380
|
+
if (tokenAddr) {
|
|
381
|
+
// 查询单个代币
|
|
382
|
+
const mint = new PublicKey(tokenAddr);
|
|
383
|
+
const tokenAccounts = await this.connection.getParsedTokenAccountsByOwner(
|
|
384
|
+
this.wallet.publicKey,
|
|
385
|
+
{ mint }
|
|
386
|
+
);
|
|
387
|
+
return tokenAccounts.value[0]?.account.data.parsed.info.tokenAmount.uiAmount || 0;
|
|
388
|
+
} else {
|
|
389
|
+
// 查询所有代币
|
|
390
|
+
return this.getAllTokenBalances();
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
/**
|
|
395
|
+
* 获取账户所有代币余额(仅显示余额 > 0 的)
|
|
396
|
+
* @returns {Promise<Array>} 代币信息数组,包含mint地址、余额等信息
|
|
397
|
+
*/
|
|
398
|
+
async getAllTokenBalances() {
|
|
376
399
|
const tokenAccounts = await this.connection.getParsedTokenAccountsByOwner(
|
|
377
400
|
this.wallet.publicKey,
|
|
378
|
-
{
|
|
401
|
+
{ programId: TOKEN_PROGRAM_ID }
|
|
379
402
|
);
|
|
380
403
|
|
|
381
|
-
|
|
404
|
+
const balances = tokenAccounts.value
|
|
405
|
+
.map((account) => {
|
|
406
|
+
const parsed = account.account.data.parsed;
|
|
407
|
+
if (parsed.type !== 'account') return null;
|
|
408
|
+
|
|
409
|
+
const tokenAmount = parsed.info.tokenAmount;
|
|
410
|
+
if (Number(tokenAmount.amount) === 0) return null;
|
|
411
|
+
|
|
412
|
+
return {
|
|
413
|
+
mint: parsed.info.mint,
|
|
414
|
+
amount: BigInt(tokenAmount.amount),
|
|
415
|
+
decimals: tokenAmount.decimals,
|
|
416
|
+
uiAmount: tokenAmount.uiAmount || 0
|
|
417
|
+
};
|
|
418
|
+
})
|
|
419
|
+
.filter((item) => item !== null);
|
|
420
|
+
|
|
421
|
+
// 同时查询 TOKEN_2022_PROGRAM_ID
|
|
422
|
+
const token2022Accounts = await this.connection.getParsedTokenAccountsByOwner(
|
|
423
|
+
this.wallet.publicKey,
|
|
424
|
+
{ programId: TOKEN_2022_PROGRAM_ID }
|
|
425
|
+
);
|
|
426
|
+
|
|
427
|
+
const token2022Balances = token2022Accounts.value
|
|
428
|
+
.map((account) => {
|
|
429
|
+
const parsed = account.account.data.parsed;
|
|
430
|
+
if (parsed.type !== 'account') return null;
|
|
431
|
+
|
|
432
|
+
const tokenAmount = parsed.info.tokenAmount;
|
|
433
|
+
if (Number(tokenAmount.amount) === 0) return null;
|
|
434
|
+
|
|
435
|
+
return {
|
|
436
|
+
mint: parsed.info.mint,
|
|
437
|
+
amount: BigInt(tokenAmount.amount),
|
|
438
|
+
decimals: tokenAmount.decimals,
|
|
439
|
+
uiAmount: tokenAmount.uiAmount || 0
|
|
440
|
+
};
|
|
441
|
+
})
|
|
442
|
+
.filter((item) => item !== null);
|
|
443
|
+
|
|
444
|
+
// 合并并去重
|
|
445
|
+
const allBalances = [...balances, ...token2022Balances];
|
|
446
|
+
const seen = new Set();
|
|
447
|
+
const uniqueBalances = allBalances
|
|
448
|
+
.filter((b) => {
|
|
449
|
+
if (seen.has(b.mint)) return false;
|
|
450
|
+
seen.add(b.mint);
|
|
451
|
+
return true;
|
|
452
|
+
})
|
|
453
|
+
.map((b) => ({
|
|
454
|
+
mint: b.mint,
|
|
455
|
+
amount: Number(b.amount),
|
|
456
|
+
decimals: b.decimals,
|
|
457
|
+
uiAmount: b.uiAmount
|
|
458
|
+
}));
|
|
459
|
+
|
|
460
|
+
return uniqueBalances;
|
|
382
461
|
}
|
|
383
462
|
|
|
384
463
|
async solBalance() {
|
package/index.ts
CHANGED
|
@@ -469,14 +469,93 @@ export class PumpTrader {
|
|
|
469
469
|
|
|
470
470
|
/* ---------- 余额查询 ---------- */
|
|
471
471
|
|
|
472
|
-
|
|
473
|
-
|
|
472
|
+
/**
|
|
473
|
+
* 查询代币余额
|
|
474
|
+
* @param tokenAddr - 代币地址(可选),如果不传则返回所有代币
|
|
475
|
+
* @returns 如果传入地址则返回该代币的余额数字,否则返回所有代币的详细信息
|
|
476
|
+
*/
|
|
477
|
+
async tokenBalance(tokenAddr?: string): Promise<number | Array<{ mint: string; amount: number; decimals: number; uiAmount: number }>> {
|
|
478
|
+
if (tokenAddr) {
|
|
479
|
+
// 查询单个代币
|
|
480
|
+
const mint = new PublicKey(tokenAddr);
|
|
481
|
+
const tokenAccounts = await this.connection.getParsedTokenAccountsByOwner(
|
|
482
|
+
this.wallet.publicKey,
|
|
483
|
+
{ mint }
|
|
484
|
+
);
|
|
485
|
+
return tokenAccounts.value[0]?.account.data.parsed.info.tokenAmount.uiAmount || 0;
|
|
486
|
+
} else {
|
|
487
|
+
// 查询所有代币
|
|
488
|
+
return this.getAllTokenBalances();
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
/**
|
|
493
|
+
* 获取账户所有代币余额(仅显示余额 > 0 的)
|
|
494
|
+
* @returns 代币信息数组,包含mint地址、余额等信息
|
|
495
|
+
*/
|
|
496
|
+
async getAllTokenBalances(): Promise<Array<{ mint: string; amount: number; decimals: number; uiAmount: number }>> {
|
|
474
497
|
const tokenAccounts = await this.connection.getParsedTokenAccountsByOwner(
|
|
475
498
|
this.wallet.publicKey,
|
|
476
|
-
{
|
|
499
|
+
{ programId: TOKEN_PROGRAM_ID }
|
|
477
500
|
);
|
|
478
501
|
|
|
479
|
-
|
|
502
|
+
const balances = tokenAccounts.value
|
|
503
|
+
.map((account) => {
|
|
504
|
+
const parsed = account.account.data.parsed;
|
|
505
|
+
if (parsed.type !== 'account') return null;
|
|
506
|
+
|
|
507
|
+
const tokenAmount = parsed.info.tokenAmount;
|
|
508
|
+
if (Number(tokenAmount.amount) === 0) return null; // 跳过余额为0的
|
|
509
|
+
|
|
510
|
+
return {
|
|
511
|
+
mint: parsed.info.mint,
|
|
512
|
+
amount: BigInt(tokenAmount.amount),
|
|
513
|
+
decimals: tokenAmount.decimals,
|
|
514
|
+
uiAmount: tokenAmount.uiAmount || 0
|
|
515
|
+
};
|
|
516
|
+
})
|
|
517
|
+
.filter((item) => item !== null) as Array<{ mint: string; amount: bigint; decimals: number; uiAmount: number }>;
|
|
518
|
+
|
|
519
|
+
// 同时查询 TOKEN_2022_PROGRAM_ID
|
|
520
|
+
const token2022Accounts = await this.connection.getParsedTokenAccountsByOwner(
|
|
521
|
+
this.wallet.publicKey,
|
|
522
|
+
{ programId: TOKEN_2022_PROGRAM_ID }
|
|
523
|
+
);
|
|
524
|
+
|
|
525
|
+
const token2022Balances = token2022Accounts.value
|
|
526
|
+
.map((account) => {
|
|
527
|
+
const parsed = account.account.data.parsed;
|
|
528
|
+
if (parsed.type !== 'account') return null;
|
|
529
|
+
|
|
530
|
+
const tokenAmount = parsed.info.tokenAmount;
|
|
531
|
+
if (Number(tokenAmount.amount) === 0) return null; // 跳过余额为0的
|
|
532
|
+
|
|
533
|
+
return {
|
|
534
|
+
mint: parsed.info.mint,
|
|
535
|
+
amount: BigInt(tokenAmount.amount),
|
|
536
|
+
decimals: tokenAmount.decimals,
|
|
537
|
+
uiAmount: tokenAmount.uiAmount || 0
|
|
538
|
+
};
|
|
539
|
+
})
|
|
540
|
+
.filter((item) => item !== null) as Array<{ mint: string; amount: bigint; decimals: number; uiAmount: number }>;
|
|
541
|
+
|
|
542
|
+
// 合并并去重
|
|
543
|
+
const allBalances = [...balances, ...token2022Balances];
|
|
544
|
+
const seen = new Set<string>();
|
|
545
|
+
const uniqueBalances = allBalances
|
|
546
|
+
.filter((b) => {
|
|
547
|
+
if (seen.has(b.mint)) return false;
|
|
548
|
+
seen.add(b.mint);
|
|
549
|
+
return true;
|
|
550
|
+
})
|
|
551
|
+
.map((b) => ({
|
|
552
|
+
mint: b.mint,
|
|
553
|
+
amount: Number(b.amount),
|
|
554
|
+
decimals: b.decimals,
|
|
555
|
+
uiAmount: b.uiAmount
|
|
556
|
+
}));
|
|
557
|
+
|
|
558
|
+
return uniqueBalances;
|
|
480
559
|
}
|
|
481
560
|
|
|
482
561
|
async solBalance(): Promise<number> {
|