@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,332 @@
|
|
|
1
|
+
import { apis, explorers, requireHeliusKey } from '../config.js';
|
|
2
|
+
import { resolveToken } from './token-book.js';
|
|
3
|
+
/**
|
|
4
|
+
* Get token info from Helius DAS API
|
|
5
|
+
*/
|
|
6
|
+
async function getHeliusTokenInfo(mintAddress) {
|
|
7
|
+
const heliusApiKey = requireHeliusKey();
|
|
8
|
+
const url = apis.heliusRpc(heliusApiKey);
|
|
9
|
+
try {
|
|
10
|
+
const response = await fetch(url, {
|
|
11
|
+
method: 'POST',
|
|
12
|
+
headers: { 'Content-Type': 'application/json' },
|
|
13
|
+
body: JSON.stringify({
|
|
14
|
+
jsonrpc: '2.0',
|
|
15
|
+
id: 'token-info',
|
|
16
|
+
method: 'getAsset',
|
|
17
|
+
params: { id: mintAddress },
|
|
18
|
+
}),
|
|
19
|
+
});
|
|
20
|
+
const { result } = await response.json();
|
|
21
|
+
if (!result)
|
|
22
|
+
return {};
|
|
23
|
+
return {
|
|
24
|
+
address: mintAddress,
|
|
25
|
+
symbol: result.content?.metadata?.symbol || '???',
|
|
26
|
+
name: result.content?.metadata?.name || 'Unknown',
|
|
27
|
+
decimals: result.token_info?.decimals || 0,
|
|
28
|
+
price: result.token_info?.price_info?.price_per_token,
|
|
29
|
+
supply: result.token_info?.supply,
|
|
30
|
+
logoUri: result.content?.links?.image,
|
|
31
|
+
verified: result.token_info?.price_info !== undefined,
|
|
32
|
+
verifiedSource: 'helius',
|
|
33
|
+
freezeAuthority: result.authorities?.find((a) => a.type === 'freeze')?.address,
|
|
34
|
+
mintAuthority: result.authorities?.find((a) => a.type === 'mint')?.address,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
console.error('Helius error:', error);
|
|
39
|
+
return {};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get token holders count via Helius
|
|
44
|
+
*/
|
|
45
|
+
async function getTokenHolders(mintAddress) {
|
|
46
|
+
const heliusApiKey = requireHeliusKey();
|
|
47
|
+
const url = apis.heliusRpc(heliusApiKey);
|
|
48
|
+
try {
|
|
49
|
+
// Get largest token accounts (top 20)
|
|
50
|
+
const response = await fetch(url, {
|
|
51
|
+
method: 'POST',
|
|
52
|
+
headers: { 'Content-Type': 'application/json' },
|
|
53
|
+
body: JSON.stringify({
|
|
54
|
+
jsonrpc: '2.0',
|
|
55
|
+
id: 'holders',
|
|
56
|
+
method: 'getTokenLargestAccounts',
|
|
57
|
+
params: [mintAddress],
|
|
58
|
+
}),
|
|
59
|
+
});
|
|
60
|
+
const { result } = await response.json();
|
|
61
|
+
// This returns top 20, but doesn't give us total count
|
|
62
|
+
// Would need getProgramAccounts for full count (expensive)
|
|
63
|
+
return result?.value?.length;
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Get token info from Jupiter
|
|
71
|
+
*/
|
|
72
|
+
async function getJupiterTokenInfo(mintAddress) {
|
|
73
|
+
try {
|
|
74
|
+
// Check if token is in verified list
|
|
75
|
+
const verifiedResponse = await fetch('https://tokens.jup.ag/tokens?tags=verified');
|
|
76
|
+
const verifiedTokens = await verifiedResponse.json();
|
|
77
|
+
const verifiedToken = verifiedTokens.find((t) => t.address === mintAddress);
|
|
78
|
+
if (verifiedToken) {
|
|
79
|
+
return {
|
|
80
|
+
symbol: verifiedToken.symbol,
|
|
81
|
+
name: verifiedToken.name,
|
|
82
|
+
decimals: verifiedToken.decimals,
|
|
83
|
+
logoUri: verifiedToken.logoURI,
|
|
84
|
+
verified: true,
|
|
85
|
+
verifiedSource: 'jupiter',
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
// Check strict list
|
|
89
|
+
const strictResponse = await fetch('https://tokens.jup.ag/tokens?tags=strict');
|
|
90
|
+
const strictTokens = await strictResponse.json();
|
|
91
|
+
const strictToken = strictTokens.find((t) => t.address === mintAddress);
|
|
92
|
+
if (strictToken) {
|
|
93
|
+
return {
|
|
94
|
+
symbol: strictToken.symbol,
|
|
95
|
+
name: strictToken.name,
|
|
96
|
+
decimals: strictToken.decimals,
|
|
97
|
+
logoUri: strictToken.logoURI,
|
|
98
|
+
verified: true,
|
|
99
|
+
verifiedSource: 'jupiter-strict',
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
// Check all tokens
|
|
103
|
+
const allResponse = await fetch('https://tokens.jup.ag/tokens');
|
|
104
|
+
const allTokens = await allResponse.json();
|
|
105
|
+
const token = allTokens.find((t) => t.address === mintAddress);
|
|
106
|
+
if (token) {
|
|
107
|
+
return {
|
|
108
|
+
symbol: token.symbol,
|
|
109
|
+
name: token.name,
|
|
110
|
+
decimals: token.decimals,
|
|
111
|
+
logoUri: token.logoURI,
|
|
112
|
+
verified: false,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
return {};
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
console.error('Jupiter error:', error);
|
|
119
|
+
return {};
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Get market data from DexScreener
|
|
124
|
+
*/
|
|
125
|
+
async function getDexScreenerInfo(mintAddress) {
|
|
126
|
+
try {
|
|
127
|
+
const response = await fetch(`https://api.dexscreener.com/latest/dex/tokens/${mintAddress}`);
|
|
128
|
+
const data = await response.json();
|
|
129
|
+
if (!data.pairs || data.pairs.length === 0) {
|
|
130
|
+
return {};
|
|
131
|
+
}
|
|
132
|
+
// Get the most liquid pair
|
|
133
|
+
const mainPair = data.pairs.reduce((prev, current) => (current.liquidity?.usd || 0) > (prev.liquidity?.usd || 0) ? current : prev);
|
|
134
|
+
return {
|
|
135
|
+
symbol: mainPair.baseToken?.symbol || mainPair.quoteToken?.symbol,
|
|
136
|
+
name: mainPair.baseToken?.name || mainPair.quoteToken?.name,
|
|
137
|
+
price: parseFloat(mainPair.priceUsd),
|
|
138
|
+
priceChange24h: mainPair.priceChange?.h24,
|
|
139
|
+
volume24h: mainPair.volume?.h24,
|
|
140
|
+
liquidity: mainPair.liquidity?.usd,
|
|
141
|
+
marketCap: mainPair.marketCap,
|
|
142
|
+
fdv: mainPair.fdv,
|
|
143
|
+
markets: data.pairs.slice(0, 5).map((p) => ({
|
|
144
|
+
dex: p.dexId,
|
|
145
|
+
pair: p.pairAddress,
|
|
146
|
+
liquidity: p.liquidity?.usd || 0,
|
|
147
|
+
})),
|
|
148
|
+
website: mainPair.info?.websites?.[0]?.url || mainPair.info?.websites?.[0],
|
|
149
|
+
twitter: mainPair.info?.socials?.find((s) => s.type === 'twitter')?.url,
|
|
150
|
+
telegram: mainPair.info?.socials?.find((s) => s.type === 'telegram')?.url,
|
|
151
|
+
discord: mainPair.info?.socials?.find((s) => s.type === 'discord')?.url,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
console.error('DexScreener error:', error);
|
|
156
|
+
return {};
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Get additional analytics from Birdeye
|
|
161
|
+
*/
|
|
162
|
+
async function getBirdeyeInfo(mintAddress) {
|
|
163
|
+
// Note: Birdeye requires API key for most endpoints
|
|
164
|
+
// Using public endpoints only
|
|
165
|
+
try {
|
|
166
|
+
const response = await fetch(`https://public-api.birdeye.so/public/token_overview?address=${mintAddress}`, {
|
|
167
|
+
headers: {
|
|
168
|
+
'X-API-KEY': process.env.BIRDEYE_API_KEY || '',
|
|
169
|
+
},
|
|
170
|
+
});
|
|
171
|
+
if (!response.ok)
|
|
172
|
+
return {};
|
|
173
|
+
const data = await response.json();
|
|
174
|
+
if (!data.success || !data.data)
|
|
175
|
+
return {};
|
|
176
|
+
return {
|
|
177
|
+
price: data.data.price,
|
|
178
|
+
priceChange24h: data.data.priceChange24h,
|
|
179
|
+
volume24h: data.data.volume24h,
|
|
180
|
+
volumeChange24h: data.data.volume24hChange,
|
|
181
|
+
liquidity: data.data.liquidity,
|
|
182
|
+
marketCap: data.data.mc,
|
|
183
|
+
holders: data.data.holder,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
// Fail silently if no API key
|
|
188
|
+
return {};
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Aggregate token info from all sources
|
|
193
|
+
* Simplified to use only Helius + DexScreener (most reliable)
|
|
194
|
+
*/
|
|
195
|
+
export async function getTokenInfo(mintOrSymbol) {
|
|
196
|
+
const mintAddress = resolveToken(mintOrSymbol);
|
|
197
|
+
if (mintAddress.length < 32) {
|
|
198
|
+
throw new Error(`Token symbol '${mintOrSymbol}' not found in token book. Use address or add to book with: trader book add ${mintOrSymbol.toUpperCase()} <address>`);
|
|
199
|
+
}
|
|
200
|
+
console.log(`š Fetching token info from Helius + DexScreener...`);
|
|
201
|
+
// Fetch from working sources only (skip Jupiter tokens API due to Node fetch issues)
|
|
202
|
+
const [helius, dexscreener, holders] = await Promise.all([
|
|
203
|
+
getHeliusTokenInfo(mintAddress),
|
|
204
|
+
getDexScreenerInfo(mintAddress),
|
|
205
|
+
getTokenHolders(mintAddress),
|
|
206
|
+
]);
|
|
207
|
+
// Merge data with priority: Helius > DexScreener
|
|
208
|
+
const merged = {
|
|
209
|
+
address: mintAddress,
|
|
210
|
+
symbol: helius.symbol || dexscreener.symbol || '???',
|
|
211
|
+
name: helius.name || dexscreener.name || 'Unknown',
|
|
212
|
+
decimals: helius.decimals || 9,
|
|
213
|
+
// Market data - prefer DexScreener for real-time prices
|
|
214
|
+
price: dexscreener.price || helius.price,
|
|
215
|
+
priceChange24h: dexscreener.priceChange24h,
|
|
216
|
+
volume24h: dexscreener.volume24h,
|
|
217
|
+
liquidity: dexscreener.liquidity,
|
|
218
|
+
marketCap: dexscreener.marketCap,
|
|
219
|
+
fdv: dexscreener.fdv,
|
|
220
|
+
// Supply
|
|
221
|
+
supply: helius.supply,
|
|
222
|
+
// Verification (from Helius only since we're not calling Jupiter API)
|
|
223
|
+
verified: helius.verified || false,
|
|
224
|
+
verifiedSource: helius.verifiedSource,
|
|
225
|
+
freezeAuthority: helius.freezeAuthority,
|
|
226
|
+
mintAuthority: helius.mintAuthority,
|
|
227
|
+
// Holders
|
|
228
|
+
holders: holders,
|
|
229
|
+
// Links
|
|
230
|
+
logoUri: helius.logoUri,
|
|
231
|
+
description: helius.description,
|
|
232
|
+
website: dexscreener.website,
|
|
233
|
+
twitter: dexscreener.twitter,
|
|
234
|
+
telegram: dexscreener.telegram,
|
|
235
|
+
discord: dexscreener.discord,
|
|
236
|
+
// Markets
|
|
237
|
+
markets: dexscreener.markets,
|
|
238
|
+
// Source tracking
|
|
239
|
+
sources: [
|
|
240
|
+
helius.symbol ? 'helius' : '',
|
|
241
|
+
dexscreener.price ? 'dexscreener' : '',
|
|
242
|
+
].filter(Boolean),
|
|
243
|
+
};
|
|
244
|
+
return merged;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Format token info for display
|
|
248
|
+
*/
|
|
249
|
+
export function formatTokenInfo(info) {
|
|
250
|
+
const sections = [];
|
|
251
|
+
// Header
|
|
252
|
+
sections.push(`
|
|
253
|
+
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
254
|
+
ā ${info.name} (${info.symbol})
|
|
255
|
+
ā ${info.address}
|
|
256
|
+
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
257
|
+
`);
|
|
258
|
+
// Verification
|
|
259
|
+
const verificationEmoji = info.verified ? 'ā
' : 'ā';
|
|
260
|
+
sections.push(`
|
|
261
|
+
š VERIFICATION
|
|
262
|
+
Status: ${verificationEmoji} ${info.verified ? 'Verified' : 'Not Verified'}${info.verifiedSource ? ` (${info.verifiedSource})` : ''}
|
|
263
|
+
Mint Authority: ${info.mintAuthority || 'None (immutable)'}
|
|
264
|
+
Freeze Authority: ${info.freezeAuthority || 'None'}
|
|
265
|
+
`);
|
|
266
|
+
// Market Data
|
|
267
|
+
if (info.price !== undefined) {
|
|
268
|
+
const priceChange = info.priceChange24h
|
|
269
|
+
? `${info.priceChange24h > 0 ? 'š' : 'š'} ${info.priceChange24h.toFixed(2)}%`
|
|
270
|
+
: 'N/A';
|
|
271
|
+
sections.push(`
|
|
272
|
+
š° MARKET DATA
|
|
273
|
+
Price: $${info.price.toFixed(info.price < 1 ? 6 : 2)}
|
|
274
|
+
24h Change: ${priceChange}
|
|
275
|
+
Market Cap: ${info.marketCap ? `$${(info.marketCap / 1e6).toFixed(2)}M` : 'N/A'}
|
|
276
|
+
FDV: ${info.fdv ? `$${(info.fdv / 1e6).toFixed(2)}M` : 'N/A'}
|
|
277
|
+
`);
|
|
278
|
+
}
|
|
279
|
+
// Volume & Liquidity
|
|
280
|
+
if (info.volume24h !== undefined || info.liquidity !== undefined) {
|
|
281
|
+
sections.push(`
|
|
282
|
+
š LIQUIDITY & VOLUME
|
|
283
|
+
24h Volume: ${info.volume24h ? `$${(info.volume24h / 1e3).toFixed(1)}K` : 'N/A'}
|
|
284
|
+
Liquidity: ${info.liquidity ? `$${(info.liquidity / 1e3).toFixed(1)}K` : 'N/A'}
|
|
285
|
+
`);
|
|
286
|
+
}
|
|
287
|
+
// Supply & Holders
|
|
288
|
+
sections.push(`
|
|
289
|
+
šŖ SUPPLY & HOLDERS
|
|
290
|
+
Total Supply: ${info.supply ? info.supply.toLocaleString() : 'N/A'}
|
|
291
|
+
Holders: ${info.holders ? info.holders.toLocaleString() : 'N/A'}
|
|
292
|
+
Decimals: ${info.decimals}
|
|
293
|
+
`);
|
|
294
|
+
// Links
|
|
295
|
+
const links = [];
|
|
296
|
+
if (info.website)
|
|
297
|
+
links.push(`Website: ${info.website}`);
|
|
298
|
+
if (info.twitter)
|
|
299
|
+
links.push(`Twitter: ${info.twitter}`);
|
|
300
|
+
if (info.telegram)
|
|
301
|
+
links.push(`Telegram: ${info.telegram}`);
|
|
302
|
+
if (info.discord)
|
|
303
|
+
links.push(`Discord: ${info.discord}`);
|
|
304
|
+
if (links.length > 0) {
|
|
305
|
+
sections.push(`
|
|
306
|
+
š LINKS
|
|
307
|
+
${links.join('\n ')}
|
|
308
|
+
`);
|
|
309
|
+
}
|
|
310
|
+
// Explorers
|
|
311
|
+
sections.push(`
|
|
312
|
+
š EXPLORERS
|
|
313
|
+
Solscan: ${explorers.solscanToken(info.address)}
|
|
314
|
+
Solana Explorer: ${explorers.solanaExplorer(info.address)}
|
|
315
|
+
`);
|
|
316
|
+
if (info.markets && info.markets.length > 0) {
|
|
317
|
+
sections.push(` DexScreener: ${explorers.dexscreener(info.markets[0].pair)}\n`);
|
|
318
|
+
}
|
|
319
|
+
// Markets
|
|
320
|
+
if (info.markets && info.markets.length > 0) {
|
|
321
|
+
sections.push(`
|
|
322
|
+
šŖ TOP MARKETS
|
|
323
|
+
${info.markets.map(m => ` ${m.dex.toUpperCase()}: $${(m.liquidity / 1e3).toFixed(1)}K liquidity`).join('\n')}
|
|
324
|
+
`);
|
|
325
|
+
}
|
|
326
|
+
// Footer
|
|
327
|
+
sections.push(`
|
|
328
|
+
š” Data Sources: ${info.sources.join(', ')}
|
|
329
|
+
`);
|
|
330
|
+
return sections.join('');
|
|
331
|
+
}
|
|
332
|
+
//# sourceMappingURL=token-info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-info.js","sourceRoot":"","sources":["../../src/utils/token-info.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Keypair, PublicKey } from '@solana/web3.js';
|
|
2
|
+
/**
|
|
3
|
+
* Generate a new Solana keypair and securely store it
|
|
4
|
+
* SECURITY: Wallet is encrypted at rest. Agent should NEVER disclose the private key.
|
|
5
|
+
* NOTE: This can be run by agent (one-time operation). Export requires manual confirmation.
|
|
6
|
+
*/
|
|
7
|
+
export declare function generateWallet(password: string): PublicKey;
|
|
8
|
+
/**
|
|
9
|
+
* Load existing wallet and return public key only
|
|
10
|
+
*/
|
|
11
|
+
export declare function loadWallet(password: string): PublicKey;
|
|
12
|
+
/**
|
|
13
|
+
* Load keypair for signing transactions (internal use only)
|
|
14
|
+
*/
|
|
15
|
+
export declare function loadKeypairForSigning(password: string): Keypair;
|
|
16
|
+
/**
|
|
17
|
+
* Get wallet address without exposing private key
|
|
18
|
+
*/
|
|
19
|
+
export declare function getWalletAddress(password: string): string;
|
|
20
|
+
/**
|
|
21
|
+
* Require user to type a confirmation phrase
|
|
22
|
+
* This prevents automated extraction via agents/bots
|
|
23
|
+
*/
|
|
24
|
+
export declare function requireManualConfirmation(action: string): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Export private key as base58 string for backup
|
|
27
|
+
* WARNING: Only use this for secure backup. Never share.
|
|
28
|
+
* SECURITY: Requires manual confirmation - cannot be automated via agent/remote.
|
|
29
|
+
*/
|
|
30
|
+
export declare function exportPrivateKey(password: string): Promise<string>;
|
|
31
|
+
//# sourceMappingURL=wallet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../src/utils/wallet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAOrD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAyB1D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAUtD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAQ/D;AAoCD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGzD;AAwBD;;;GAGG;AACH,wBAAsB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+C7E;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA+BxE"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { Keypair } from '@solana/web3.js';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import crypto from 'crypto';
|
|
4
|
+
import { paths } from '../config.js';
|
|
5
|
+
const ALGORITHM = 'aes-256-gcm';
|
|
6
|
+
/**
|
|
7
|
+
* Generate a new Solana keypair and securely store it
|
|
8
|
+
* SECURITY: Wallet is encrypted at rest. Agent should NEVER disclose the private key.
|
|
9
|
+
* NOTE: This can be run by agent (one-time operation). Export requires manual confirmation.
|
|
10
|
+
*/
|
|
11
|
+
export function generateWallet(password) {
|
|
12
|
+
const walletDir = paths.openclawDir();
|
|
13
|
+
const walletPath = paths.walletFile();
|
|
14
|
+
// Create .openclaw directory if it doesn't exist
|
|
15
|
+
if (!fs.existsSync(walletDir)) {
|
|
16
|
+
fs.mkdirSync(walletDir, { mode: 0o700, recursive: true });
|
|
17
|
+
}
|
|
18
|
+
// Check if wallet already exists
|
|
19
|
+
if (fs.existsSync(walletPath)) {
|
|
20
|
+
throw new Error('Wallet already exists. Use load-wallet to retrieve address.');
|
|
21
|
+
}
|
|
22
|
+
// Generate new keypair
|
|
23
|
+
const keypair = Keypair.generate();
|
|
24
|
+
// Encrypt and save
|
|
25
|
+
const encrypted = encryptKeypair(keypair, password);
|
|
26
|
+
fs.writeFileSync(walletPath, JSON.stringify(encrypted), { mode: 0o600 });
|
|
27
|
+
console.log('ā ļø SECURITY NOTICE: Wallet generated and encrypted at:', walletPath);
|
|
28
|
+
console.log('ā ļø DO NOT share private key or password with anyone');
|
|
29
|
+
return keypair.publicKey;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Load existing wallet and return public key only
|
|
33
|
+
*/
|
|
34
|
+
export function loadWallet(password) {
|
|
35
|
+
const walletPath = paths.walletFile();
|
|
36
|
+
if (!fs.existsSync(walletPath)) {
|
|
37
|
+
throw new Error('No wallet found. Use generate-wallet first.');
|
|
38
|
+
}
|
|
39
|
+
const encrypted = JSON.parse(fs.readFileSync(walletPath, 'utf-8'));
|
|
40
|
+
const keypair = decryptKeypair(encrypted, password);
|
|
41
|
+
return keypair.publicKey;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Load keypair for signing transactions (internal use only)
|
|
45
|
+
*/
|
|
46
|
+
export function loadKeypairForSigning(password) {
|
|
47
|
+
const walletPath = paths.walletFile();
|
|
48
|
+
if (!fs.existsSync(walletPath)) {
|
|
49
|
+
throw new Error('No wallet found. Use generate-wallet first.');
|
|
50
|
+
}
|
|
51
|
+
const encrypted = JSON.parse(fs.readFileSync(walletPath, 'utf-8'));
|
|
52
|
+
return decryptKeypair(encrypted, password);
|
|
53
|
+
}
|
|
54
|
+
function encryptKeypair(keypair, password) {
|
|
55
|
+
const key = crypto.scryptSync(password, 'salt', 32);
|
|
56
|
+
const iv = crypto.randomBytes(16);
|
|
57
|
+
const cipher = crypto.createCipheriv(ALGORITHM, key, iv);
|
|
58
|
+
const secretKey = Buffer.from(keypair.secretKey);
|
|
59
|
+
let encrypted = cipher.update(secretKey);
|
|
60
|
+
encrypted = Buffer.concat([encrypted, cipher.final()]);
|
|
61
|
+
const authTag = cipher.getAuthTag();
|
|
62
|
+
return {
|
|
63
|
+
iv: iv.toString('hex'),
|
|
64
|
+
authTag: authTag.toString('hex'),
|
|
65
|
+
encrypted: encrypted.toString('hex')
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function decryptKeypair(encrypted, password) {
|
|
69
|
+
const key = crypto.scryptSync(password, 'salt', 32);
|
|
70
|
+
const decipher = crypto.createDecipheriv(ALGORITHM, key, Buffer.from(encrypted.iv, 'hex'));
|
|
71
|
+
decipher.setAuthTag(Buffer.from(encrypted.authTag, 'hex'));
|
|
72
|
+
let decrypted = decipher.update(Buffer.from(encrypted.encrypted, 'hex'));
|
|
73
|
+
decrypted = Buffer.concat([decrypted, decipher.final()]);
|
|
74
|
+
return Keypair.fromSecretKey(decrypted);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Get wallet address without exposing private key
|
|
78
|
+
*/
|
|
79
|
+
export function getWalletAddress(password) {
|
|
80
|
+
const publicKey = loadWallet(password);
|
|
81
|
+
return publicKey.toBase58();
|
|
82
|
+
}
|
|
83
|
+
import * as readline from 'readline';
|
|
84
|
+
// Word list for generating confirmation phrases
|
|
85
|
+
const CONFIRM_WORDS = [
|
|
86
|
+
'alpha', 'bravo', 'charlie', 'delta', 'echo', 'foxtrot', 'golf', 'hotel',
|
|
87
|
+
'india', 'juliet', 'kilo', 'lima', 'mike', 'november', 'oscar', 'papa',
|
|
88
|
+
'quebec', 'romeo', 'sierra', 'tango', 'uniform', 'victor', 'whiskey', 'xray',
|
|
89
|
+
'yankee', 'zulu', 'red', 'blue', 'green', 'orange', 'purple', 'yellow'
|
|
90
|
+
];
|
|
91
|
+
/**
|
|
92
|
+
* Generate a random confirmation phrase
|
|
93
|
+
*/
|
|
94
|
+
function generateConfirmPhrase() {
|
|
95
|
+
const words = [];
|
|
96
|
+
for (let i = 0; i < 3; i++) {
|
|
97
|
+
const idx = Math.floor(Math.random() * CONFIRM_WORDS.length);
|
|
98
|
+
words.push(CONFIRM_WORDS[idx]);
|
|
99
|
+
}
|
|
100
|
+
return words.join('-');
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Require user to type a confirmation phrase
|
|
104
|
+
* This prevents automated extraction via agents/bots
|
|
105
|
+
*/
|
|
106
|
+
export async function requireManualConfirmation(action) {
|
|
107
|
+
// Check for agent environment - hard block
|
|
108
|
+
const agentIndicators = [
|
|
109
|
+
'OPENCLAW_SESSION',
|
|
110
|
+
'OPENCLAW_AGENT',
|
|
111
|
+
'OPENCLAW_CHANNEL',
|
|
112
|
+
'TELEGRAM_BOT_TOKEN',
|
|
113
|
+
'DISCORD_TOKEN',
|
|
114
|
+
'SLACK_BOT_TOKEN',
|
|
115
|
+
];
|
|
116
|
+
if (agentIndicators.some(env => process.env[env])) {
|
|
117
|
+
throw new Error('š SECURITY: This command cannot be run via agent/bot.\n' +
|
|
118
|
+
'SSH into your server and run directly: trader wallet export');
|
|
119
|
+
}
|
|
120
|
+
const phrase = generateConfirmPhrase();
|
|
121
|
+
console.log('\nš SECURITY CONFIRMATION REQUIRED');
|
|
122
|
+
console.log(` Action: ${action}`);
|
|
123
|
+
console.log(`\n To confirm, type this phrase exactly: ${phrase}\n`);
|
|
124
|
+
const rl = readline.createInterface({
|
|
125
|
+
input: process.stdin,
|
|
126
|
+
output: process.stdout,
|
|
127
|
+
});
|
|
128
|
+
return new Promise((resolve, reject) => {
|
|
129
|
+
// Timeout after 30 seconds
|
|
130
|
+
const timeout = setTimeout(() => {
|
|
131
|
+
rl.close();
|
|
132
|
+
reject(new Error('Confirmation timed out. Please try again.'));
|
|
133
|
+
}, 30000);
|
|
134
|
+
rl.question(' Confirm: ', (answer) => {
|
|
135
|
+
clearTimeout(timeout);
|
|
136
|
+
rl.close();
|
|
137
|
+
if (answer.trim().toLowerCase() === phrase.toLowerCase()) {
|
|
138
|
+
resolve();
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
reject(new Error('Confirmation phrase did not match. Aborting for security.'));
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Export private key as base58 string for backup
|
|
148
|
+
* WARNING: Only use this for secure backup. Never share.
|
|
149
|
+
* SECURITY: Requires manual confirmation - cannot be automated via agent/remote.
|
|
150
|
+
*/
|
|
151
|
+
export async function exportPrivateKey(password) {
|
|
152
|
+
// Security check: require manual confirmation
|
|
153
|
+
await requireManualConfirmation('Export wallet private key');
|
|
154
|
+
const keypair = loadKeypairForSigning(password);
|
|
155
|
+
// Convert secret key (Uint8Array) to base58 for Phantom/Solflare import
|
|
156
|
+
const bs58Chars = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
|
|
157
|
+
let result = '';
|
|
158
|
+
let bytes = Array.from(keypair.secretKey);
|
|
159
|
+
while (bytes.length) {
|
|
160
|
+
let carry = 0;
|
|
161
|
+
const newBytes = [];
|
|
162
|
+
for (const byte of bytes) {
|
|
163
|
+
carry = carry * 256 + byte;
|
|
164
|
+
if (newBytes.length || carry >= 58) {
|
|
165
|
+
newBytes.push(Math.floor(carry / 58));
|
|
166
|
+
carry %= 58;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
result = bs58Chars[carry] + result;
|
|
170
|
+
bytes = newBytes;
|
|
171
|
+
}
|
|
172
|
+
// Add leading '1's for leading zero bytes
|
|
173
|
+
for (const byte of keypair.secretKey) {
|
|
174
|
+
if (byte === 0)
|
|
175
|
+
result = '1' + result;
|
|
176
|
+
else
|
|
177
|
+
break;
|
|
178
|
+
}
|
|
179
|
+
return result;
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=wallet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/utils/wallet.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@zeroexcore/trader",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Solana trading CLI - Trade tokens, track portfolio, bet on prediction markets",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/cli.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"trader": "./dist/cli.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist"
|
|
12
|
+
],
|
|
13
|
+
"publishConfig": {
|
|
14
|
+
"access": "public"
|
|
15
|
+
},
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "tsc",
|
|
18
|
+
"dev": "tsx src/cli.ts",
|
|
19
|
+
"start": "node dist/cli.js",
|
|
20
|
+
"prepublishOnly": "npm run build"
|
|
21
|
+
},
|
|
22
|
+
"keywords": [
|
|
23
|
+
"solana",
|
|
24
|
+
"trading",
|
|
25
|
+
"cli",
|
|
26
|
+
"openclaw",
|
|
27
|
+
"rwa",
|
|
28
|
+
"defi"
|
|
29
|
+
],
|
|
30
|
+
"author": "",
|
|
31
|
+
"license": "ISC",
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"@coral-xyz/anchor": "0.29.0",
|
|
34
|
+
"@solana/spl-token": "0.4.14",
|
|
35
|
+
"@solana/web3.js": "1.98.4",
|
|
36
|
+
"big.js": "7.0.1",
|
|
37
|
+
"commander": "12.1.0",
|
|
38
|
+
"dotenv": "16.6.1",
|
|
39
|
+
"tsx": "4.21.0"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@types/big.js": "6.2.2",
|
|
43
|
+
"@types/node": "25.3.2",
|
|
44
|
+
"typescript": "5.9.3"
|
|
45
|
+
}
|
|
46
|
+
}
|