@zeroexcore/trader 1.0.0
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 +125 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +28 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/book.d.ts +3 -0
- package/dist/commands/book.d.ts.map +1 -0
- package/dist/commands/book.js +44 -0
- package/dist/commands/book.js.map +1 -0
- package/dist/commands/diagnose.d.ts +3 -0
- package/dist/commands/diagnose.d.ts.map +1 -0
- package/dist/commands/diagnose.js +148 -0
- package/dist/commands/diagnose.js.map +1 -0
- package/dist/commands/nft/floor.d.ts +3 -0
- package/dist/commands/nft/floor.d.ts.map +1 -0
- package/dist/commands/nft/floor.js +30 -0
- package/dist/commands/nft/floor.js.map +1 -0
- package/dist/commands/nft/index.d.ts +3 -0
- package/dist/commands/nft/index.d.ts.map +1 -0
- package/dist/commands/nft/index.js +14 -0
- package/dist/commands/nft/index.js.map +1 -0
- package/dist/commands/nft/listings.d.ts +3 -0
- package/dist/commands/nft/listings.d.ts.map +1 -0
- package/dist/commands/nft/listings.js +37 -0
- package/dist/commands/nft/listings.js.map +1 -0
- package/dist/commands/nft/popular.d.ts +3 -0
- package/dist/commands/nft/popular.d.ts.map +1 -0
- package/dist/commands/nft/popular.js +32 -0
- package/dist/commands/nft/popular.js.map +1 -0
- package/dist/commands/nft/portfolio.d.ts +3 -0
- package/dist/commands/nft/portfolio.d.ts.map +1 -0
- package/dist/commands/nft/portfolio.js +43 -0
- package/dist/commands/nft/portfolio.js.map +1 -0
- package/dist/commands/nft/search.d.ts +3 -0
- package/dist/commands/nft/search.d.ts.map +1 -0
- package/dist/commands/nft/search.js +36 -0
- package/dist/commands/nft/search.js.map +1 -0
- package/dist/commands/nft.d.ts +3 -0
- package/dist/commands/nft.d.ts.map +1 -0
- package/dist/commands/nft.js +165 -0
- package/dist/commands/nft.js.map +1 -0
- package/dist/commands/nfts/floor.d.ts +3 -0
- package/dist/commands/nfts/floor.d.ts.map +1 -0
- package/dist/commands/nfts/floor.js +30 -0
- package/dist/commands/nfts/floor.js.map +1 -0
- package/dist/commands/nfts/index.d.ts +3 -0
- package/dist/commands/nfts/index.d.ts.map +1 -0
- package/dist/commands/nfts/index.js +14 -0
- package/dist/commands/nfts/index.js.map +1 -0
- package/dist/commands/nfts/listings.d.ts +3 -0
- package/dist/commands/nfts/listings.d.ts.map +1 -0
- package/dist/commands/nfts/listings.js +37 -0
- package/dist/commands/nfts/listings.js.map +1 -0
- package/dist/commands/nfts/popular.d.ts +3 -0
- package/dist/commands/nfts/popular.d.ts.map +1 -0
- package/dist/commands/nfts/popular.js +32 -0
- package/dist/commands/nfts/popular.js.map +1 -0
- package/dist/commands/nfts/positions.d.ts +3 -0
- package/dist/commands/nfts/positions.d.ts.map +1 -0
- package/dist/commands/nfts/positions.js +23 -0
- package/dist/commands/nfts/positions.js.map +1 -0
- package/dist/commands/nfts/search.d.ts +3 -0
- package/dist/commands/nfts/search.d.ts.map +1 -0
- package/dist/commands/nfts/search.js +36 -0
- package/dist/commands/nfts/search.js.map +1 -0
- package/dist/commands/perps/index.d.ts +3 -0
- package/dist/commands/perps/index.d.ts.map +1 -0
- package/dist/commands/perps/index.js +10 -0
- package/dist/commands/perps/index.js.map +1 -0
- package/dist/commands/perps/info.d.ts +3 -0
- package/dist/commands/perps/info.d.ts.map +1 -0
- package/dist/commands/perps/info.js +51 -0
- package/dist/commands/perps/info.js.map +1 -0
- package/dist/commands/perps/markets.d.ts +3 -0
- package/dist/commands/perps/markets.d.ts.map +1 -0
- package/dist/commands/perps/markets.js +43 -0
- package/dist/commands/perps/markets.js.map +1 -0
- package/dist/commands/perps/pool.d.ts +3 -0
- package/dist/commands/perps/pool.d.ts.map +1 -0
- package/dist/commands/perps/pool.js +33 -0
- package/dist/commands/perps/pool.js.map +1 -0
- package/dist/commands/perps/positions.d.ts +3 -0
- package/dist/commands/perps/positions.d.ts.map +1 -0
- package/dist/commands/perps/positions.js +68 -0
- package/dist/commands/perps/positions.js.map +1 -0
- package/dist/commands/perps/show.d.ts +3 -0
- package/dist/commands/perps/show.d.ts.map +1 -0
- package/dist/commands/perps/show.js +37 -0
- package/dist/commands/perps/show.js.map +1 -0
- package/dist/commands/perps.d.ts +3 -0
- package/dist/commands/perps.d.ts.map +1 -0
- package/dist/commands/perps.js +186 -0
- package/dist/commands/perps.js.map +1 -0
- package/dist/commands/portfolio.d.ts +3 -0
- package/dist/commands/portfolio.d.ts.map +1 -0
- package/dist/commands/portfolio.js +89 -0
- package/dist/commands/portfolio.js.map +1 -0
- package/dist/commands/positions/close.d.ts +3 -0
- package/dist/commands/positions/close.d.ts.map +1 -0
- package/dist/commands/positions/close.js +31 -0
- package/dist/commands/positions/close.js.map +1 -0
- package/dist/commands/positions/filter.d.ts +3 -0
- package/dist/commands/positions/filter.d.ts.map +1 -0
- package/dist/commands/positions/filter.js +20 -0
- package/dist/commands/positions/filter.js.map +1 -0
- package/dist/commands/positions/index.d.ts +3 -0
- package/dist/commands/positions/index.d.ts.map +1 -0
- package/dist/commands/positions/index.js +22 -0
- package/dist/commands/positions/index.js.map +1 -0
- package/dist/commands/positions/list.d.ts +3 -0
- package/dist/commands/positions/list.d.ts.map +1 -0
- package/dist/commands/positions/list.js +38 -0
- package/dist/commands/positions/list.js.map +1 -0
- package/dist/commands/positions/note.d.ts +3 -0
- package/dist/commands/positions/note.d.ts.map +1 -0
- package/dist/commands/positions/note.js +19 -0
- package/dist/commands/positions/note.js.map +1 -0
- package/dist/commands/positions/open.d.ts +3 -0
- package/dist/commands/positions/open.d.ts.map +1 -0
- package/dist/commands/positions/open.js +47 -0
- package/dist/commands/positions/open.js.map +1 -0
- package/dist/commands/positions/show.d.ts +3 -0
- package/dist/commands/positions/show.d.ts.map +1 -0
- package/dist/commands/positions/show.js +46 -0
- package/dist/commands/positions/show.js.map +1 -0
- package/dist/commands/positions/stats.d.ts +3 -0
- package/dist/commands/positions/stats.d.ts.map +1 -0
- package/dist/commands/positions/stats.js +27 -0
- package/dist/commands/positions/stats.js.map +1 -0
- package/dist/commands/positions/tag.d.ts +3 -0
- package/dist/commands/positions/tag.d.ts.map +1 -0
- package/dist/commands/positions/tag.js +19 -0
- package/dist/commands/positions/tag.js.map +1 -0
- package/dist/commands/positions/update.d.ts +3 -0
- package/dist/commands/positions/update.d.ts.map +1 -0
- package/dist/commands/positions/update.js +35 -0
- package/dist/commands/positions/update.js.map +1 -0
- package/dist/commands/positions.d.ts +3 -0
- package/dist/commands/positions.d.ts.map +1 -0
- package/dist/commands/positions.js +247 -0
- package/dist/commands/positions.js.map +1 -0
- package/dist/commands/predict/browse.d.ts +3 -0
- package/dist/commands/predict/browse.d.ts.map +1 -0
- package/dist/commands/predict/browse.js +46 -0
- package/dist/commands/predict/browse.js.map +1 -0
- package/dist/commands/predict/buy.d.ts +3 -0
- package/dist/commands/predict/buy.d.ts.map +1 -0
- package/dist/commands/predict/buy.js +79 -0
- package/dist/commands/predict/buy.js.map +1 -0
- package/dist/commands/predict/claim.d.ts +3 -0
- package/dist/commands/predict/claim.d.ts.map +1 -0
- package/dist/commands/predict/claim.js +58 -0
- package/dist/commands/predict/claim.js.map +1 -0
- package/dist/commands/predict/close.d.ts +3 -0
- package/dist/commands/predict/close.d.ts.map +1 -0
- package/dist/commands/predict/close.js +56 -0
- package/dist/commands/predict/close.js.map +1 -0
- package/dist/commands/predict/index.d.ts +3 -0
- package/dist/commands/predict/index.d.ts.map +1 -0
- package/dist/commands/predict/index.js +20 -0
- package/dist/commands/predict/index.js.map +1 -0
- package/dist/commands/predict/list.d.ts +3 -0
- package/dist/commands/predict/list.d.ts.map +1 -0
- package/dist/commands/predict/list.js +46 -0
- package/dist/commands/predict/list.js.map +1 -0
- package/dist/commands/predict/market.d.ts +3 -0
- package/dist/commands/predict/market.d.ts.map +1 -0
- package/dist/commands/predict/market.js +37 -0
- package/dist/commands/predict/market.js.map +1 -0
- package/dist/commands/predict/positions.d.ts +3 -0
- package/dist/commands/predict/positions.d.ts.map +1 -0
- package/dist/commands/predict/positions.js +71 -0
- package/dist/commands/predict/positions.js.map +1 -0
- package/dist/commands/predict/search.d.ts +3 -0
- package/dist/commands/predict/search.d.ts.map +1 -0
- package/dist/commands/predict/search.js +32 -0
- package/dist/commands/predict/search.js.map +1 -0
- package/dist/commands/predict/sell.d.ts +3 -0
- package/dist/commands/predict/sell.d.ts.map +1 -0
- package/dist/commands/predict/sell.js +65 -0
- package/dist/commands/predict/sell.js.map +1 -0
- package/dist/commands/predict/show.d.ts +3 -0
- package/dist/commands/predict/show.d.ts.map +1 -0
- package/dist/commands/predict/show.js +37 -0
- package/dist/commands/predict/show.js.map +1 -0
- package/dist/commands/predict/watch.d.ts +3 -0
- package/dist/commands/predict/watch.d.ts.map +1 -0
- package/dist/commands/predict/watch.js +73 -0
- package/dist/commands/predict/watch.js.map +1 -0
- package/dist/commands/predict.d.ts +3 -0
- package/dist/commands/predict.d.ts.map +1 -0
- package/dist/commands/predict.js +484 -0
- package/dist/commands/predict.js.map +1 -0
- package/dist/commands/shared.d.ts +18 -0
- package/dist/commands/shared.d.ts.map +1 -0
- package/dist/commands/shared.js +51 -0
- package/dist/commands/shared.js.map +1 -0
- package/dist/commands/tokens/add.d.ts +3 -0
- package/dist/commands/tokens/add.d.ts.map +1 -0
- package/dist/commands/tokens/add.js +17 -0
- package/dist/commands/tokens/add.js.map +1 -0
- package/dist/commands/tokens/browse.d.ts +3 -0
- package/dist/commands/tokens/browse.d.ts.map +1 -0
- package/dist/commands/tokens/browse.js +19 -0
- package/dist/commands/tokens/browse.js.map +1 -0
- package/dist/commands/tokens/index.d.ts +3 -0
- package/dist/commands/tokens/index.d.ts.map +1 -0
- package/dist/commands/tokens/index.js +22 -0
- package/dist/commands/tokens/index.js.map +1 -0
- package/dist/commands/tokens/info.d.ts +3 -0
- package/dist/commands/tokens/info.d.ts.map +1 -0
- package/dist/commands/tokens/info.js +13 -0
- package/dist/commands/tokens/info.js.map +1 -0
- package/dist/commands/tokens/list.d.ts +3 -0
- package/dist/commands/tokens/list.d.ts.map +1 -0
- package/dist/commands/tokens/list.js +16 -0
- package/dist/commands/tokens/list.js.map +1 -0
- package/dist/commands/tokens/positions.d.ts +3 -0
- package/dist/commands/tokens/positions.d.ts.map +1 -0
- package/dist/commands/tokens/positions.js +25 -0
- package/dist/commands/tokens/positions.js.map +1 -0
- package/dist/commands/tokens/quote.d.ts +3 -0
- package/dist/commands/tokens/quote.d.ts.map +1 -0
- package/dist/commands/tokens/quote.js +50 -0
- package/dist/commands/tokens/quote.js.map +1 -0
- package/dist/commands/tokens/remove.d.ts +3 -0
- package/dist/commands/tokens/remove.d.ts.map +1 -0
- package/dist/commands/tokens/remove.js +17 -0
- package/dist/commands/tokens/remove.js.map +1 -0
- package/dist/commands/tokens/search.d.ts +3 -0
- package/dist/commands/tokens/search.d.ts.map +1 -0
- package/dist/commands/tokens/search.js +19 -0
- package/dist/commands/tokens/search.js.map +1 -0
- package/dist/commands/tokens/swap.d.ts +3 -0
- package/dist/commands/tokens/swap.d.ts.map +1 -0
- package/dist/commands/tokens/swap.js +88 -0
- package/dist/commands/tokens/swap.js.map +1 -0
- package/dist/commands/trade/index.d.ts +3 -0
- package/dist/commands/trade/index.d.ts.map +1 -0
- package/dist/commands/trade/index.js +8 -0
- package/dist/commands/trade/index.js.map +1 -0
- package/dist/commands/trade/info.d.ts +3 -0
- package/dist/commands/trade/info.d.ts.map +1 -0
- package/dist/commands/trade/info.js +37 -0
- package/dist/commands/trade/info.js.map +1 -0
- package/dist/commands/trade/quote.d.ts +3 -0
- package/dist/commands/trade/quote.d.ts.map +1 -0
- package/dist/commands/trade/quote.js +56 -0
- package/dist/commands/trade/quote.js.map +1 -0
- package/dist/commands/trade/search.d.ts +3 -0
- package/dist/commands/trade/search.d.ts.map +1 -0
- package/dist/commands/trade/search.js +22 -0
- package/dist/commands/trade/search.js.map +1 -0
- package/dist/commands/trade/swap.d.ts +3 -0
- package/dist/commands/trade/swap.d.ts.map +1 -0
- package/dist/commands/trade/swap.js +70 -0
- package/dist/commands/trade/swap.js.map +1 -0
- package/dist/commands/trade.d.ts +5 -0
- package/dist/commands/trade.d.ts.map +1 -0
- package/dist/commands/trade.js +167 -0
- package/dist/commands/trade.js.map +1 -0
- package/dist/commands/wallet.d.ts +3 -0
- package/dist/commands/wallet.d.ts.map +1 -0
- package/dist/commands/wallet.js +45 -0
- package/dist/commands/wallet.js.map +1 -0
- package/dist/config.d.ts +86 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +169 -0
- package/dist/config.js.map +1 -0
- package/dist/utils/amounts.d.ts +40 -0
- package/dist/utils/amounts.d.ts.map +1 -0
- package/dist/utils/amounts.js +113 -0
- package/dist/utils/amounts.js.map +1 -0
- package/dist/utils/helius.d.ts +39 -0
- package/dist/utils/helius.d.ts.map +1 -0
- package/dist/utils/helius.js +253 -0
- package/dist/utils/helius.js.map +1 -0
- package/dist/utils/jupiter.d.ts +42 -0
- package/dist/utils/jupiter.d.ts.map +1 -0
- package/dist/utils/jupiter.js +106 -0
- package/dist/utils/jupiter.js.map +1 -0
- package/dist/utils/nft.d.ts +75 -0
- package/dist/utils/nft.d.ts.map +1 -0
- package/dist/utils/nft.js +168 -0
- package/dist/utils/nft.js.map +1 -0
- package/dist/utils/perps/doves-idl.d.ts +380 -0
- package/dist/utils/perps/doves-idl.d.ts.map +1 -0
- package/dist/utils/perps/doves-idl.js +379 -0
- package/dist/utils/perps/doves-idl.js.map +1 -0
- package/dist/utils/perps/idl.json +7241 -0
- package/dist/utils/perps/index.d.ts +45 -0
- package/dist/utils/perps/index.d.ts.map +1 -0
- package/dist/utils/perps/index.js +102 -0
- package/dist/utils/perps/index.js.map +1 -0
- package/dist/utils/perps/jupiter-perpetuals-idl.d.ts +7243 -0
- package/dist/utils/perps/jupiter-perpetuals-idl.d.ts.map +1 -0
- package/dist/utils/perps/jupiter-perpetuals-idl.js +7242 -0
- package/dist/utils/perps/jupiter-perpetuals-idl.js.map +1 -0
- package/dist/utils/positions.d.ts +198 -0
- package/dist/utils/positions.d.ts.map +1 -0
- package/dist/utils/positions.js +595 -0
- package/dist/utils/positions.js.map +1 -0
- package/dist/utils/prediction.d.ts +196 -0
- package/dist/utils/prediction.d.ts.map +1 -0
- package/dist/utils/prediction.js +187 -0
- package/dist/utils/prediction.js.map +1 -0
- package/dist/utils/solana.d.ts +9 -0
- package/dist/utils/solana.d.ts.map +1 -0
- package/dist/utils/solana.js +45 -0
- package/dist/utils/solana.js.map +1 -0
- package/dist/utils/token-book.d.ts +9 -0
- package/dist/utils/token-book.d.ts.map +1 -0
- package/dist/utils/token-book.js +69 -0
- package/dist/utils/token-book.js.map +1 -0
- package/dist/utils/token-info.d.ts +48 -0
- package/dist/utils/token-info.d.ts.map +1 -0
- package/dist/utils/token-info.js +332 -0
- package/dist/utils/token-info.js.map +1 -0
- package/dist/utils/wallet.d.ts +31 -0
- package/dist/utils/wallet.d.ts.map +1 -0
- package/dist/utils/wallet.js +181 -0
- package/dist/utils/wallet.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import Big from 'big.js';
|
|
2
|
+
import { requireHeliusKey, apis, tokens, getDecimalsFromCache } from '../config.js';
|
|
3
|
+
/**
|
|
4
|
+
* Convert human-readable amount to smallest unit (with decimals)
|
|
5
|
+
* Uses Big.js for precision - safe for large numbers and financial calculations
|
|
6
|
+
*
|
|
7
|
+
* Examples:
|
|
8
|
+
* toSmallestUnit(1, 9) = "1000000000" (1 SOL)
|
|
9
|
+
* toSmallestUnit(100, 6) = "100000000" (100 USDC)
|
|
10
|
+
* toSmallestUnit(0.000001, 9) = "1000" (0.000001 SOL)
|
|
11
|
+
*/
|
|
12
|
+
export function toSmallestUnit(amount, decimals) {
|
|
13
|
+
try {
|
|
14
|
+
const bigAmount = new Big(amount);
|
|
15
|
+
const multiplier = new Big(10).pow(decimals);
|
|
16
|
+
const result = bigAmount.times(multiplier);
|
|
17
|
+
// Return as integer string (no decimals in smallest unit)
|
|
18
|
+
return result.round(0, Big.roundDown).toFixed(0);
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
throw new Error(`Invalid amount for conversion: ${amount}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Convert smallest unit to human-readable amount
|
|
26
|
+
* Uses Big.js for precision
|
|
27
|
+
*
|
|
28
|
+
* Examples:
|
|
29
|
+
* fromSmallestUnit('1000000000', 9) = "1" (1 SOL)
|
|
30
|
+
* fromSmallestUnit('100000000', 6) = "100" (100 USDC)
|
|
31
|
+
*/
|
|
32
|
+
export function fromSmallestUnit(amount, decimals) {
|
|
33
|
+
try {
|
|
34
|
+
const bigAmount = new Big(amount);
|
|
35
|
+
const divisor = new Big(10).pow(decimals);
|
|
36
|
+
const result = bigAmount.div(divisor);
|
|
37
|
+
return result.toFixed(); // Returns string with appropriate precision
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
throw new Error(`Invalid amount for conversion: ${amount}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Safe multiplication for token amounts
|
|
45
|
+
*/
|
|
46
|
+
export function multiplyAmounts(amount1, amount2) {
|
|
47
|
+
const big1 = new Big(amount1);
|
|
48
|
+
const big2 = new Big(amount2);
|
|
49
|
+
return big1.times(big2).toFixed();
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Safe division for token amounts
|
|
53
|
+
*/
|
|
54
|
+
export function divideAmounts(amount1, amount2) {
|
|
55
|
+
const big1 = new Big(amount1);
|
|
56
|
+
const big2 = new Big(amount2);
|
|
57
|
+
return big1.div(big2).toFixed();
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Safe addition for token amounts
|
|
61
|
+
*/
|
|
62
|
+
export function addAmounts(amount1, amount2) {
|
|
63
|
+
const big1 = new Big(amount1);
|
|
64
|
+
const big2 = new Big(amount2);
|
|
65
|
+
return big1.plus(big2).toFixed();
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Safe subtraction for token amounts
|
|
69
|
+
*/
|
|
70
|
+
export function subtractAmounts(amount1, amount2) {
|
|
71
|
+
const big1 = new Big(amount1);
|
|
72
|
+
const big2 = new Big(amount2);
|
|
73
|
+
return big1.minus(big2).toFixed();
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Get token decimals from Helius or cache
|
|
77
|
+
*/
|
|
78
|
+
export async function getTokenDecimals(mintAddress) {
|
|
79
|
+
const heliusApiKey = requireHeliusKey();
|
|
80
|
+
// Special case for native SOL
|
|
81
|
+
if (mintAddress === tokens.SOL) {
|
|
82
|
+
return 9;
|
|
83
|
+
}
|
|
84
|
+
// Check centralized cache first
|
|
85
|
+
const cached = getDecimalsFromCache(mintAddress);
|
|
86
|
+
if (cached !== undefined) {
|
|
87
|
+
return cached;
|
|
88
|
+
}
|
|
89
|
+
// Fetch from Helius DAS API
|
|
90
|
+
try {
|
|
91
|
+
const url = apis.heliusRpc(heliusApiKey);
|
|
92
|
+
const response = await fetch(url, {
|
|
93
|
+
method: 'POST',
|
|
94
|
+
headers: { 'Content-Type': 'application/json' },
|
|
95
|
+
body: JSON.stringify({
|
|
96
|
+
jsonrpc: '2.0',
|
|
97
|
+
id: 'decimals',
|
|
98
|
+
method: 'getAsset',
|
|
99
|
+
params: { id: mintAddress },
|
|
100
|
+
}),
|
|
101
|
+
});
|
|
102
|
+
const { result } = await response.json();
|
|
103
|
+
if (result?.token_info?.decimals !== undefined) {
|
|
104
|
+
return result.token_info.decimals;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
console.warn('Failed to fetch decimals from Helius, defaulting to 9');
|
|
109
|
+
}
|
|
110
|
+
// Default to 9 if we can't fetch (most SPL tokens use 9)
|
|
111
|
+
return 9;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=amounts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"amounts.js","sourceRoot":"","sources":["../../src/utils/amounts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export interface TokenBalance {
|
|
2
|
+
name: string;
|
|
3
|
+
symbol: string;
|
|
4
|
+
mint: string;
|
|
5
|
+
balance: number;
|
|
6
|
+
decimals: number;
|
|
7
|
+
valueUsd: number;
|
|
8
|
+
pricePerToken: number;
|
|
9
|
+
}
|
|
10
|
+
export interface PortfolioData {
|
|
11
|
+
totalValueUsd: number;
|
|
12
|
+
tokens: TokenBalance[];
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Fetch portfolio using Helius DAS API
|
|
16
|
+
*/
|
|
17
|
+
export declare function getPortfolio(address: string): Promise<PortfolioData>;
|
|
18
|
+
/**
|
|
19
|
+
* Get transaction history for PnL calculation
|
|
20
|
+
*/
|
|
21
|
+
export declare function getTransactionHistory(address: string, mint?: string): Promise<any[]>;
|
|
22
|
+
/**
|
|
23
|
+
* Calculate PnL for a specific token
|
|
24
|
+
*/
|
|
25
|
+
export declare function calculatePnL(address: string, mint: string): Promise<{
|
|
26
|
+
mint: string;
|
|
27
|
+
totalBought: number;
|
|
28
|
+
totalSold: number;
|
|
29
|
+
currentHolding: number;
|
|
30
|
+
costBasis: number;
|
|
31
|
+
avgPurchasePrice: number;
|
|
32
|
+
currentPrice: number;
|
|
33
|
+
priceChange: number;
|
|
34
|
+
currentValue: number;
|
|
35
|
+
realizedPnL: number;
|
|
36
|
+
unrealizedPnL: number;
|
|
37
|
+
totalPnL: number;
|
|
38
|
+
}>;
|
|
39
|
+
//# sourceMappingURL=helius.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helius.d.ts","sourceRoot":"","sources":["../../src/utils/helius.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,YAAY,EAAE,CAAC;CACxB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA+I1E;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,GAAG,EAAE,CAAC,CAehB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;;;;;;;;;;;;;GA+G/D"}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import { requireHeliusKey, apis, tokens } from '../config.js';
|
|
2
|
+
/**
|
|
3
|
+
* Fetch portfolio using Helius DAS API
|
|
4
|
+
*/
|
|
5
|
+
export async function getPortfolio(address) {
|
|
6
|
+
const heliusApiKey = requireHeliusKey();
|
|
7
|
+
const url = apis.heliusRpc(heliusApiKey);
|
|
8
|
+
const response = await fetch(url, {
|
|
9
|
+
method: 'POST',
|
|
10
|
+
headers: { 'Content-Type': 'application/json' },
|
|
11
|
+
body: JSON.stringify({
|
|
12
|
+
jsonrpc: '2.0',
|
|
13
|
+
id: 'portfolio-fetch',
|
|
14
|
+
method: 'getAssetsByOwner',
|
|
15
|
+
params: {
|
|
16
|
+
ownerAddress: address,
|
|
17
|
+
displayOptions: {
|
|
18
|
+
showFungible: true,
|
|
19
|
+
showNativeBalance: true,
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
}),
|
|
23
|
+
});
|
|
24
|
+
const data = await response.json();
|
|
25
|
+
if (data.error) {
|
|
26
|
+
throw new Error(`Helius API error: ${data.error.message}`);
|
|
27
|
+
}
|
|
28
|
+
const tokenBalances = [];
|
|
29
|
+
let totalValueUsd = 0;
|
|
30
|
+
// Get native SOL balance separately using getBalance RPC call
|
|
31
|
+
try {
|
|
32
|
+
const solBalanceResponse = await fetch(url, {
|
|
33
|
+
method: 'POST',
|
|
34
|
+
headers: { 'Content-Type': 'application/json' },
|
|
35
|
+
body: JSON.stringify({
|
|
36
|
+
jsonrpc: '2.0',
|
|
37
|
+
id: 'sol-balance',
|
|
38
|
+
method: 'getBalance',
|
|
39
|
+
params: [address],
|
|
40
|
+
}),
|
|
41
|
+
});
|
|
42
|
+
const solData = await solBalanceResponse.json();
|
|
43
|
+
if (solData.result && solData.result.value > 0) {
|
|
44
|
+
const solBalance = solData.result.value / 1e9; // Convert lamports to SOL
|
|
45
|
+
// Get SOL price from Helius DAS API (same as wSOL)
|
|
46
|
+
// SOL/wSOL are the same token, DAS API provides USDC price
|
|
47
|
+
let solPrice = 0;
|
|
48
|
+
try {
|
|
49
|
+
const solPriceResponse = await fetch(url, {
|
|
50
|
+
method: 'POST',
|
|
51
|
+
headers: { 'Content-Type': 'application/json' },
|
|
52
|
+
body: JSON.stringify({
|
|
53
|
+
jsonrpc: '2.0',
|
|
54
|
+
id: 'sol-price',
|
|
55
|
+
method: 'getAsset',
|
|
56
|
+
params: {
|
|
57
|
+
id: tokens.SOL,
|
|
58
|
+
},
|
|
59
|
+
}),
|
|
60
|
+
});
|
|
61
|
+
const solPriceData = await solPriceResponse.json();
|
|
62
|
+
if (solPriceData.result?.token_info?.price_info?.price_per_token) {
|
|
63
|
+
solPrice = solPriceData.result.token_info.price_info.price_per_token;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch (e) {
|
|
67
|
+
console.warn('Unable to fetch SOL price from Helius DAS API');
|
|
68
|
+
solPrice = 0;
|
|
69
|
+
}
|
|
70
|
+
const solValueUsd = solBalance * solPrice;
|
|
71
|
+
tokenBalances.push({
|
|
72
|
+
name: 'Solana',
|
|
73
|
+
symbol: 'SOL',
|
|
74
|
+
mint: tokens.SOL,
|
|
75
|
+
balance: solBalance,
|
|
76
|
+
decimals: 9,
|
|
77
|
+
valueUsd: solValueUsd,
|
|
78
|
+
pricePerToken: solPrice,
|
|
79
|
+
});
|
|
80
|
+
totalValueUsd += solValueUsd;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
console.error('Error fetching SOL balance:', error);
|
|
85
|
+
}
|
|
86
|
+
// Process fungible tokens (SPL tokens)
|
|
87
|
+
for (const asset of data.result?.items || []) {
|
|
88
|
+
if (asset.interface === 'FungibleToken' || asset.interface === 'FungibleAsset') {
|
|
89
|
+
const balance = asset.token_info?.balance || 0;
|
|
90
|
+
const decimals = asset.token_info?.decimals || 0;
|
|
91
|
+
const normalizedBalance = balance / Math.pow(10, decimals);
|
|
92
|
+
let pricePerToken = asset.token_info?.price_info?.price_per_token || 0;
|
|
93
|
+
// If Helius doesn't have price, try Jupiter quote vs USDC
|
|
94
|
+
if (pricePerToken === 0 && normalizedBalance > 0) {
|
|
95
|
+
try {
|
|
96
|
+
const quoteUrl = new URL(apis.jupiterQuote);
|
|
97
|
+
quoteUrl.searchParams.append('inputMint', asset.id);
|
|
98
|
+
quoteUrl.searchParams.append('outputMint', tokens.USDC);
|
|
99
|
+
quoteUrl.searchParams.append('amount', Math.pow(10, decimals).toString()); // 1 token
|
|
100
|
+
const quoteResponse = await fetch(quoteUrl.toString());
|
|
101
|
+
const quoteData = await quoteResponse.json();
|
|
102
|
+
if (quoteData.outAmount) {
|
|
103
|
+
pricePerToken = parseFloat(quoteData.outAmount) / 1e6; // USDC has 6 decimals
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch (e) {
|
|
107
|
+
// Silently fail, keep price as 0
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const valueUsd = normalizedBalance * pricePerToken;
|
|
111
|
+
tokenBalances.push({
|
|
112
|
+
name: asset.content?.metadata?.name || 'Unknown',
|
|
113
|
+
symbol: asset.content?.metadata?.symbol || '???',
|
|
114
|
+
mint: asset.id,
|
|
115
|
+
balance: normalizedBalance,
|
|
116
|
+
decimals,
|
|
117
|
+
valueUsd,
|
|
118
|
+
pricePerToken,
|
|
119
|
+
});
|
|
120
|
+
totalValueUsd += valueUsd;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Sort by USD value descending
|
|
124
|
+
tokenBalances.sort((a, b) => b.valueUsd - a.valueUsd);
|
|
125
|
+
return {
|
|
126
|
+
totalValueUsd,
|
|
127
|
+
tokens: tokenBalances,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Get transaction history for PnL calculation
|
|
132
|
+
*/
|
|
133
|
+
export async function getTransactionHistory(address, mint) {
|
|
134
|
+
const heliusApiKey = requireHeliusKey();
|
|
135
|
+
const url = apis.heliusTransactions(address, heliusApiKey);
|
|
136
|
+
const response = await fetch(url);
|
|
137
|
+
const transactions = await response.json();
|
|
138
|
+
// Filter by mint if provided
|
|
139
|
+
if (mint) {
|
|
140
|
+
return transactions.filter((tx) => {
|
|
141
|
+
return tx.tokenTransfers?.some((t) => t.mint === mint);
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
return transactions;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Calculate PnL for a specific token
|
|
148
|
+
*/
|
|
149
|
+
export async function calculatePnL(address, mint) {
|
|
150
|
+
const heliusApiKey = requireHeliusKey();
|
|
151
|
+
const url = apis.heliusTransactions(address, heliusApiKey);
|
|
152
|
+
const response = await fetch(url);
|
|
153
|
+
const transactions = await response.json();
|
|
154
|
+
let totalBought = 0;
|
|
155
|
+
let totalCostBasis = 0;
|
|
156
|
+
let totalSold = 0;
|
|
157
|
+
let totalRevenue = 0;
|
|
158
|
+
// Special handling for native SOL
|
|
159
|
+
const isNativeSOL = mint === tokens.SOL;
|
|
160
|
+
for (const tx of transactions) {
|
|
161
|
+
if (isNativeSOL) {
|
|
162
|
+
// Process native SOL transfers
|
|
163
|
+
for (const transfer of tx.nativeTransfers || []) {
|
|
164
|
+
const amount = transfer.amount / 1e9; // Convert lamports to SOL
|
|
165
|
+
// Get SOL price at the time of the transaction
|
|
166
|
+
let priceAtTime = 0;
|
|
167
|
+
try {
|
|
168
|
+
// In production, you'd fetch historical price. For now, use current price as estimate
|
|
169
|
+
const solPriceUrl = apis.heliusRpc(heliusApiKey);
|
|
170
|
+
const priceResponse = await fetch(solPriceUrl, {
|
|
171
|
+
method: 'POST',
|
|
172
|
+
headers: { 'Content-Type': 'application/json' },
|
|
173
|
+
body: JSON.stringify({
|
|
174
|
+
jsonrpc: '2.0',
|
|
175
|
+
id: 'price',
|
|
176
|
+
method: 'getAsset',
|
|
177
|
+
params: { id: mint },
|
|
178
|
+
}),
|
|
179
|
+
});
|
|
180
|
+
const priceData = await priceResponse.json();
|
|
181
|
+
priceAtTime = priceData.result?.token_info?.price_info?.price_per_token || 0;
|
|
182
|
+
}
|
|
183
|
+
catch (e) {
|
|
184
|
+
priceAtTime = 0;
|
|
185
|
+
}
|
|
186
|
+
const usdValue = amount * priceAtTime;
|
|
187
|
+
if (transfer.fromUserAccount === address) {
|
|
188
|
+
// Outgoing (sell/spend)
|
|
189
|
+
totalSold += amount;
|
|
190
|
+
totalRevenue += usdValue;
|
|
191
|
+
}
|
|
192
|
+
else if (transfer.toUserAccount === address) {
|
|
193
|
+
// Incoming (buy/receive)
|
|
194
|
+
totalBought += amount;
|
|
195
|
+
totalCostBasis += usdValue;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
// Process SPL token transfers
|
|
201
|
+
for (const transfer of tx.tokenTransfers || []) {
|
|
202
|
+
if (transfer.mint !== mint)
|
|
203
|
+
continue;
|
|
204
|
+
const amount = transfer.tokenAmount;
|
|
205
|
+
const usdValue = transfer.tokenAmount * (transfer.pricePerToken || 0);
|
|
206
|
+
if (transfer.fromUserAccount === address) {
|
|
207
|
+
// Sell
|
|
208
|
+
totalSold += amount;
|
|
209
|
+
totalRevenue += usdValue;
|
|
210
|
+
}
|
|
211
|
+
else if (transfer.toUserAccount === address) {
|
|
212
|
+
// Buy
|
|
213
|
+
totalBought += amount;
|
|
214
|
+
totalCostBasis += usdValue;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
// Current holdings
|
|
220
|
+
const portfolio = await getPortfolio(address);
|
|
221
|
+
const currentHolding = portfolio.tokens.find(t => t.mint === mint);
|
|
222
|
+
const currentValue = currentHolding?.valueUsd || 0;
|
|
223
|
+
const currentPrice = currentHolding?.pricePerToken || 0;
|
|
224
|
+
// Realized PnL (from sells)
|
|
225
|
+
const realizedPnL = totalBought > 0
|
|
226
|
+
? totalRevenue - (totalCostBasis * (totalSold / totalBought))
|
|
227
|
+
: 0;
|
|
228
|
+
// Unrealized PnL (current holdings)
|
|
229
|
+
const remainingCostBasis = totalBought > 0
|
|
230
|
+
? totalCostBasis - (totalCostBasis * (totalSold / totalBought))
|
|
231
|
+
: 0;
|
|
232
|
+
const unrealizedPnL = currentValue - remainingCostBasis;
|
|
233
|
+
// Calculate average purchase price
|
|
234
|
+
const avgPurchasePrice = totalBought > 0 ? totalCostBasis / totalBought : 0;
|
|
235
|
+
const priceChange = avgPurchasePrice > 0
|
|
236
|
+
? ((currentPrice - avgPurchasePrice) / avgPurchasePrice) * 100
|
|
237
|
+
: 0;
|
|
238
|
+
return {
|
|
239
|
+
mint,
|
|
240
|
+
totalBought,
|
|
241
|
+
totalSold,
|
|
242
|
+
currentHolding: currentHolding?.balance || 0,
|
|
243
|
+
costBasis: totalCostBasis,
|
|
244
|
+
avgPurchasePrice,
|
|
245
|
+
currentPrice,
|
|
246
|
+
priceChange,
|
|
247
|
+
currentValue,
|
|
248
|
+
realizedPnL,
|
|
249
|
+
unrealizedPnL,
|
|
250
|
+
totalPnL: realizedPnL + unrealizedPnL,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=helius.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helius.js","sourceRoot":"","sources":["../../src/utils/helius.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Connection, Keypair } from '@solana/web3.js';
|
|
2
|
+
export interface SwapParams {
|
|
3
|
+
inputMint: string;
|
|
4
|
+
outputMint: string;
|
|
5
|
+
amount: number;
|
|
6
|
+
slippageBps?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface SwapQuote {
|
|
9
|
+
inputMint: string;
|
|
10
|
+
outputMint: string;
|
|
11
|
+
inAmount: string;
|
|
12
|
+
outAmount: string;
|
|
13
|
+
priceImpactPct: number;
|
|
14
|
+
route: any;
|
|
15
|
+
transaction?: string;
|
|
16
|
+
requestId?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Get swap order from Jupiter Ultra API v1
|
|
20
|
+
*/
|
|
21
|
+
export declare function getSwapQuote(params: SwapParams & {
|
|
22
|
+
taker?: string;
|
|
23
|
+
}): Promise<SwapQuote>;
|
|
24
|
+
/**
|
|
25
|
+
* Execute swap via Jupiter Ultra API v1
|
|
26
|
+
* Ultra handles transaction building, signing, sending, and confirmation
|
|
27
|
+
*/
|
|
28
|
+
export declare function executeSwap(connection: Connection, keypair: Keypair, quote: SwapQuote, priorityFeeLamports?: number): Promise<string>;
|
|
29
|
+
/**
|
|
30
|
+
* Search tokens via Jupiter Token API V2
|
|
31
|
+
*/
|
|
32
|
+
export declare function searchToken(query: string): Promise<any[]>;
|
|
33
|
+
/**
|
|
34
|
+
* Browse top tokens by organic score via Jupiter Token API V2
|
|
35
|
+
*/
|
|
36
|
+
export declare function browseTokens(limit?: number): Promise<any[]>;
|
|
37
|
+
export declare const COMMON_TOKENS: {
|
|
38
|
+
SOL: string;
|
|
39
|
+
USDC: string;
|
|
40
|
+
USDT: string;
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=jupiter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jupiter.d.ts","sourceRoot":"","sources":["../../src/utils/jupiter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAwB,MAAM,iBAAiB,CAAC;AAG5E,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,GAAG,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAkC9F;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,SAAS,EAChB,mBAAmB,CAAC,EAAE,MAAM,GAC3B,OAAO,CAAC,MAAM,CAAC,CAyCjB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAQ/D;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,KAAK,SAAK,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAQ7D;AAGD,eAAO,MAAM,aAAa;;;;CAIzB,CAAC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { VersionedTransaction } from '@solana/web3.js';
|
|
2
|
+
import { apis, tokens, requireJupiterKey } from '../config.js';
|
|
3
|
+
/**
|
|
4
|
+
* Get swap order from Jupiter Ultra API v1
|
|
5
|
+
*/
|
|
6
|
+
export async function getSwapQuote(params) {
|
|
7
|
+
const { inputMint, outputMint, amount, slippageBps = 50, taker } = params;
|
|
8
|
+
const jupiterApiKey = requireJupiterKey();
|
|
9
|
+
const url = new URL(`${apis.jupiterUltra}/order`);
|
|
10
|
+
url.searchParams.append('inputMint', inputMint);
|
|
11
|
+
url.searchParams.append('outputMint', outputMint);
|
|
12
|
+
url.searchParams.append('amount', amount.toString());
|
|
13
|
+
url.searchParams.append('slippageBps', slippageBps.toString());
|
|
14
|
+
// Add taker (wallet address) to get transaction included in response
|
|
15
|
+
if (taker) {
|
|
16
|
+
url.searchParams.append('taker', taker);
|
|
17
|
+
}
|
|
18
|
+
const response = await fetch(url.toString(), {
|
|
19
|
+
headers: {
|
|
20
|
+
'x-api-key': jupiterApiKey,
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
if (!response.ok) {
|
|
24
|
+
const errorText = await response.text();
|
|
25
|
+
throw new Error(`Jupiter API error (${response.status}): ${errorText}`);
|
|
26
|
+
}
|
|
27
|
+
const quote = await response.json();
|
|
28
|
+
if (quote.error) {
|
|
29
|
+
throw new Error(`Jupiter quote error: ${quote.error}`);
|
|
30
|
+
}
|
|
31
|
+
return quote;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Execute swap via Jupiter Ultra API v1
|
|
35
|
+
* Ultra handles transaction building, signing, sending, and confirmation
|
|
36
|
+
*/
|
|
37
|
+
export async function executeSwap(connection, keypair, quote, priorityFeeLamports) {
|
|
38
|
+
const jupiterApiKey = requireJupiterKey();
|
|
39
|
+
// Extract transaction from order response
|
|
40
|
+
const transactionBase64 = quote.transaction;
|
|
41
|
+
if (!transactionBase64) {
|
|
42
|
+
throw new Error('No transaction in order response');
|
|
43
|
+
}
|
|
44
|
+
// Deserialize, sign, and re-serialize transaction
|
|
45
|
+
const transaction = VersionedTransaction.deserialize(Buffer.from(transactionBase64, 'base64'));
|
|
46
|
+
transaction.sign([keypair]);
|
|
47
|
+
const signedTransaction = Buffer.from(transaction.serialize()).toString('base64');
|
|
48
|
+
// Execute via Ultra API
|
|
49
|
+
const executeResponse = await fetch(`${apis.jupiterUltra}/execute`, {
|
|
50
|
+
method: 'POST',
|
|
51
|
+
headers: {
|
|
52
|
+
'Content-Type': 'application/json',
|
|
53
|
+
'x-api-key': jupiterApiKey,
|
|
54
|
+
},
|
|
55
|
+
body: JSON.stringify({
|
|
56
|
+
signedTransaction,
|
|
57
|
+
requestId: quote.requestId,
|
|
58
|
+
}),
|
|
59
|
+
});
|
|
60
|
+
if (!executeResponse.ok) {
|
|
61
|
+
const errorText = await executeResponse.text();
|
|
62
|
+
throw new Error(`Execute error (${executeResponse.status}): ${errorText}`);
|
|
63
|
+
}
|
|
64
|
+
const result = await executeResponse.json();
|
|
65
|
+
// Check execution status
|
|
66
|
+
if (result.status === 'Success') {
|
|
67
|
+
console.log('✅ Swap executed successfully via Jupiter Ultra API');
|
|
68
|
+
return result.signature;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
throw new Error(`Swap failed: ${JSON.stringify(result)}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Search tokens via Jupiter Token API V2
|
|
76
|
+
*/
|
|
77
|
+
export async function searchToken(query) {
|
|
78
|
+
const jupiterApiKey = requireJupiterKey();
|
|
79
|
+
const url = `${apis.jupiterTokenSearch}?query=${encodeURIComponent(query)}`;
|
|
80
|
+
const response = await fetch(url, {
|
|
81
|
+
headers: { 'x-api-key': jupiterApiKey },
|
|
82
|
+
});
|
|
83
|
+
if (!response.ok)
|
|
84
|
+
throw new Error(`Token search failed: ${response.status}`);
|
|
85
|
+
return (await response.json());
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Browse top tokens by organic score via Jupiter Token API V2
|
|
89
|
+
*/
|
|
90
|
+
export async function browseTokens(limit = 15) {
|
|
91
|
+
const jupiterApiKey = requireJupiterKey();
|
|
92
|
+
const url = `${apis.jupiterTokenTop}?limit=${limit}`;
|
|
93
|
+
const response = await fetch(url, {
|
|
94
|
+
headers: { 'x-api-key': jupiterApiKey },
|
|
95
|
+
});
|
|
96
|
+
if (!response.ok)
|
|
97
|
+
throw new Error(`Token browse failed: ${response.status}`);
|
|
98
|
+
return (await response.json());
|
|
99
|
+
}
|
|
100
|
+
// Common token mints for quick reference
|
|
101
|
+
export const COMMON_TOKENS = {
|
|
102
|
+
SOL: tokens.SOL,
|
|
103
|
+
USDC: tokens.USDC,
|
|
104
|
+
USDT: tokens.USDT,
|
|
105
|
+
};
|
|
106
|
+
//# sourceMappingURL=jupiter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jupiter.js","sourceRoot":"","sources":["../../src/utils/jupiter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import Big from 'big.js';
|
|
2
|
+
export interface NFTListing {
|
|
3
|
+
mint: string;
|
|
4
|
+
name: string;
|
|
5
|
+
image: string;
|
|
6
|
+
price: Big;
|
|
7
|
+
seller: string;
|
|
8
|
+
collection: string;
|
|
9
|
+
attributes?: Record<string, string>;
|
|
10
|
+
}
|
|
11
|
+
export interface CollectionStats {
|
|
12
|
+
symbol: string;
|
|
13
|
+
name: string;
|
|
14
|
+
floorPrice: Big;
|
|
15
|
+
listedCount: number;
|
|
16
|
+
volumeAll: Big;
|
|
17
|
+
}
|
|
18
|
+
export interface CryptCard {
|
|
19
|
+
mint: string;
|
|
20
|
+
name: string;
|
|
21
|
+
image: string;
|
|
22
|
+
insuredValue: number;
|
|
23
|
+
grade?: string;
|
|
24
|
+
gradeNum?: number;
|
|
25
|
+
year?: string;
|
|
26
|
+
category: string;
|
|
27
|
+
rarity?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface GachaStock {
|
|
30
|
+
common: number;
|
|
31
|
+
uncommon: number;
|
|
32
|
+
rare: number;
|
|
33
|
+
epic: number;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get collection stats including floor price
|
|
37
|
+
*/
|
|
38
|
+
export declare function getCollectionStats(symbol: string): Promise<CollectionStats>;
|
|
39
|
+
/**
|
|
40
|
+
* Get listings for a collection
|
|
41
|
+
*/
|
|
42
|
+
export declare function getListings(symbol: string, limit?: number): Promise<NFTListing[]>;
|
|
43
|
+
/**
|
|
44
|
+
* Get popular collections
|
|
45
|
+
*/
|
|
46
|
+
export declare function getPopularCollections(limit?: number): Promise<CollectionStats[]>;
|
|
47
|
+
/**
|
|
48
|
+
* Search collections by name
|
|
49
|
+
*/
|
|
50
|
+
export declare function searchCollections(query: string): Promise<CollectionStats[]>;
|
|
51
|
+
/**
|
|
52
|
+
* Get NFTs owned by a wallet
|
|
53
|
+
*/
|
|
54
|
+
export declare function getWalletNFTs(walletAddress: string): Promise<any[]>;
|
|
55
|
+
/**
|
|
56
|
+
* Get gacha machine stock
|
|
57
|
+
*/
|
|
58
|
+
export declare function getGachaStock(): Promise<Record<string, GachaStock>>;
|
|
59
|
+
/**
|
|
60
|
+
* Get cards available in gacha by rarity
|
|
61
|
+
*/
|
|
62
|
+
export declare function getGachaCards(packType?: 'pokemon_50' | 'pokemon_250' | 'pokemon_1000', rarity?: 'common' | 'uncommon' | 'rare' | 'epic'): Promise<CryptCard[]>;
|
|
63
|
+
/**
|
|
64
|
+
* Get Pokemon listings from Collector Crypt on Magic Eden
|
|
65
|
+
*/
|
|
66
|
+
export declare function getCryptListings(limit?: number): Promise<NFTListing[]>;
|
|
67
|
+
/**
|
|
68
|
+
* Get gacha machine status
|
|
69
|
+
*/
|
|
70
|
+
export declare function getGachaStatus(): Promise<{
|
|
71
|
+
machineStatus: string;
|
|
72
|
+
}>;
|
|
73
|
+
export declare function formatSol(amount: Big): string;
|
|
74
|
+
export declare function solToUsd(sol: Big, solPrice?: number): Big;
|
|
75
|
+
//# sourceMappingURL=nft.d.ts.map
|