forgex-cli 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 +479 -0
- package/dist/bin/forgex.d.ts +12 -0
- package/dist/bin/forgex.d.ts.map +1 -0
- package/dist/bin/forgex.js +23 -0
- package/dist/bin/forgex.js.map +1 -0
- package/dist/src/adapters/codex-adapter.d.ts +238 -0
- package/dist/src/adapters/codex-adapter.d.ts.map +1 -0
- package/dist/src/adapters/codex-adapter.js +524 -0
- package/dist/src/adapters/codex-adapter.js.map +1 -0
- package/dist/src/adapters/connection.d.ts +20 -0
- package/dist/src/adapters/connection.d.ts.map +1 -0
- package/dist/src/adapters/connection.js +43 -0
- package/dist/src/adapters/connection.js.map +1 -0
- package/dist/src/adapters/ipfs.d.ts +17 -0
- package/dist/src/adapters/ipfs.d.ts.map +1 -0
- package/dist/src/adapters/ipfs.js +30 -0
- package/dist/src/adapters/ipfs.js.map +1 -0
- package/dist/src/adapters/jito-adapter.d.ts +194 -0
- package/dist/src/adapters/jito-adapter.d.ts.map +1 -0
- package/dist/src/adapters/jito-adapter.js +474 -0
- package/dist/src/adapters/jito-adapter.js.map +1 -0
- package/dist/src/adapters/rpc-adapter.d.ts +148 -0
- package/dist/src/adapters/rpc-adapter.d.ts.map +1 -0
- package/dist/src/adapters/rpc-adapter.js +410 -0
- package/dist/src/adapters/rpc-adapter.js.map +1 -0
- package/dist/src/adapters/sdk-adapter.d.ts +148 -0
- package/dist/src/adapters/sdk-adapter.d.ts.map +1 -0
- package/dist/src/adapters/sdk-adapter.js +554 -0
- package/dist/src/adapters/sdk-adapter.js.map +1 -0
- package/dist/src/commands/config/index.d.ts +8 -0
- package/dist/src/commands/config/index.d.ts.map +1 -0
- package/dist/src/commands/config/index.js +91 -0
- package/dist/src/commands/config/index.js.map +1 -0
- package/dist/src/commands/query/index.d.ts +10 -0
- package/dist/src/commands/query/index.d.ts.map +1 -0
- package/dist/src/commands/query/index.js +376 -0
- package/dist/src/commands/query/index.js.map +1 -0
- package/dist/src/commands/sniper/index.d.ts +16 -0
- package/dist/src/commands/sniper/index.d.ts.map +1 -0
- package/dist/src/commands/sniper/index.js +292 -0
- package/dist/src/commands/sniper/index.js.map +1 -0
- package/dist/src/commands/token/index.d.ts +16 -0
- package/dist/src/commands/token/index.d.ts.map +1 -0
- package/dist/src/commands/token/index.js +295 -0
- package/dist/src/commands/token/index.js.map +1 -0
- package/dist/src/commands/tools/index.d.ts +17 -0
- package/dist/src/commands/tools/index.d.ts.map +1 -0
- package/dist/src/commands/tools/index.js +626 -0
- package/dist/src/commands/tools/index.js.map +1 -0
- package/dist/src/commands/trade/index.d.ts +8 -0
- package/dist/src/commands/trade/index.d.ts.map +1 -0
- package/dist/src/commands/trade/index.js +531 -0
- package/dist/src/commands/trade/index.js.map +1 -0
- package/dist/src/commands/transfer/index.d.ts +16 -0
- package/dist/src/commands/transfer/index.d.ts.map +1 -0
- package/dist/src/commands/transfer/index.js +509 -0
- package/dist/src/commands/transfer/index.js.map +1 -0
- package/dist/src/commands/wallet/index.d.ts +10 -0
- package/dist/src/commands/wallet/index.d.ts.map +1 -0
- package/dist/src/commands/wallet/index.js +828 -0
- package/dist/src/commands/wallet/index.js.map +1 -0
- package/dist/src/config.d.ts +74 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +190 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/const/IDL/index.d.ts +4 -0
- package/dist/src/const/IDL/index.d.ts.map +1 -0
- package/dist/src/const/IDL/index.js +2 -0
- package/dist/src/const/IDL/index.js.map +1 -0
- package/dist/src/const/IDL/meteora-DLMM.d.ts +10249 -0
- package/dist/src/const/IDL/meteora-DLMM.d.ts.map +1 -0
- package/dist/src/const/IDL/meteora-DLMM.js +4177 -0
- package/dist/src/const/IDL/meteora-DLMM.js.map +1 -0
- package/dist/src/const/IDL/pump-fun.d.ts +4811 -0
- package/dist/src/const/IDL/pump-fun.d.ts.map +1 -0
- package/dist/src/const/IDL/pump-fun.js +2954 -0
- package/dist/src/const/IDL/pump-fun.js.map +1 -0
- package/dist/src/const/IDL/pump-swap-IDL.d.ts +3119 -0
- package/dist/src/const/IDL/pump-swap-IDL.d.ts.map +1 -0
- package/dist/src/const/IDL/pump-swap-IDL.js +2095 -0
- package/dist/src/const/IDL/pump-swap-IDL.js.map +1 -0
- package/dist/src/const/IDL/raydium-launchlab-IDL.d.ts +4031 -0
- package/dist/src/const/IDL/raydium-launchlab-IDL.d.ts.map +1 -0
- package/dist/src/const/IDL/raydium-launchlab-IDL.js +2110 -0
- package/dist/src/const/IDL/raydium-launchlab-IDL.js.map +1 -0
- package/dist/src/const/index.d.ts +40 -0
- package/dist/src/const/index.d.ts.map +1 -0
- package/dist/src/const/index.js +57 -0
- package/dist/src/const/index.js.map +1 -0
- package/dist/src/data-source.d.ts +270 -0
- package/dist/src/data-source.d.ts.map +1 -0
- package/dist/src/data-source.js +628 -0
- package/dist/src/data-source.js.map +1 -0
- package/dist/src/data-store/index.d.ts +87 -0
- package/dist/src/data-store/index.d.ts.map +1 -0
- package/dist/src/data-store/index.js +561 -0
- package/dist/src/data-store/index.js.map +1 -0
- package/dist/src/data-store/types.d.ts +91 -0
- package/dist/src/data-store/types.d.ts.map +1 -0
- package/dist/src/data-store/types.js +8 -0
- package/dist/src/data-store/types.js.map +1 -0
- package/dist/src/index.d.ts +8 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +36 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/output.d.ts +52 -0
- package/dist/src/output.d.ts.map +1 -0
- package/dist/src/output.js +218 -0
- package/dist/src/output.js.map +1 -0
- package/dist/src/shims/store.d.ts +58 -0
- package/dist/src/shims/store.d.ts.map +1 -0
- package/dist/src/shims/store.js +55 -0
- package/dist/src/shims/store.js.map +1 -0
- package/dist/src/sol-sdk/account/index.d.ts +13 -0
- package/dist/src/sol-sdk/account/index.d.ts.map +1 -0
- package/dist/src/sol-sdk/account/index.js +174 -0
- package/dist/src/sol-sdk/account/index.js.map +1 -0
- package/dist/src/sol-sdk/account/lookupTable.d.ts +24 -0
- package/dist/src/sol-sdk/account/lookupTable.d.ts.map +1 -0
- package/dist/src/sol-sdk/account/lookupTable.js +103 -0
- package/dist/src/sol-sdk/account/lookupTable.js.map +1 -0
- package/dist/src/sol-sdk/batch/create.d.ts +23 -0
- package/dist/src/sol-sdk/batch/create.d.ts.map +1 -0
- package/dist/src/sol-sdk/batch/create.js +580 -0
- package/dist/src/sol-sdk/batch/create.js.map +1 -0
- package/dist/src/sol-sdk/batch/external-sniper.d.ts +31 -0
- package/dist/src/sol-sdk/batch/external-sniper.d.ts.map +1 -0
- package/dist/src/sol-sdk/batch/external-sniper.js +163 -0
- package/dist/src/sol-sdk/batch/external-sniper.js.map +1 -0
- package/dist/src/sol-sdk/batch/index.d.ts +144 -0
- package/dist/src/sol-sdk/batch/index.d.ts.map +1 -0
- package/dist/src/sol-sdk/batch/index.js +1573 -0
- package/dist/src/sol-sdk/batch/index.js.map +1 -0
- package/dist/src/sol-sdk/calc.d.ts +277 -0
- package/dist/src/sol-sdk/calc.d.ts.map +1 -0
- package/dist/src/sol-sdk/calc.js +590 -0
- package/dist/src/sol-sdk/calc.js.map +1 -0
- package/dist/src/sol-sdk/index.d.ts +1 -0
- package/dist/src/sol-sdk/index.d.ts.map +1 -0
- package/dist/src/sol-sdk/index.js +1 -0
- package/dist/src/sol-sdk/index.js.map +1 -0
- package/dist/src/sol-sdk/jito/index.d.ts +50 -0
- package/dist/src/sol-sdk/jito/index.d.ts.map +1 -0
- package/dist/src/sol-sdk/jito/index.js +225 -0
- package/dist/src/sol-sdk/jito/index.js.map +1 -0
- package/dist/src/sol-sdk/launchlab/index.d.ts +32 -0
- package/dist/src/sol-sdk/launchlab/index.d.ts.map +1 -0
- package/dist/src/sol-sdk/launchlab/index.js +78 -0
- package/dist/src/sol-sdk/launchlab/index.js.map +1 -0
- package/dist/src/sol-sdk/launchlab/instructions/buy.d.ts +27 -0
- package/dist/src/sol-sdk/launchlab/instructions/buy.d.ts.map +1 -0
- package/dist/src/sol-sdk/launchlab/instructions/buy.js +124 -0
- package/dist/src/sol-sdk/launchlab/instructions/buy.js.map +1 -0
- package/dist/src/sol-sdk/launchlab/instructions/create.d.ts +27 -0
- package/dist/src/sol-sdk/launchlab/instructions/create.d.ts.map +1 -0
- package/dist/src/sol-sdk/launchlab/instructions/create.js +125 -0
- package/dist/src/sol-sdk/launchlab/instructions/create.js.map +1 -0
- package/dist/src/sol-sdk/launchlab/instructions/sell.d.ts +15 -0
- package/dist/src/sol-sdk/launchlab/instructions/sell.d.ts.map +1 -0
- package/dist/src/sol-sdk/launchlab/instructions/sell.js +65 -0
- package/dist/src/sol-sdk/launchlab/instructions/sell.js.map +1 -0
- package/dist/src/sol-sdk/meteora/index.d.ts +32 -0
- package/dist/src/sol-sdk/meteora/index.d.ts.map +1 -0
- package/dist/src/sol-sdk/meteora/index.js +72 -0
- package/dist/src/sol-sdk/meteora/index.js.map +1 -0
- package/dist/src/sol-sdk/meteora/instructions/buy.d.ts +46 -0
- package/dist/src/sol-sdk/meteora/instructions/buy.d.ts.map +1 -0
- package/dist/src/sol-sdk/meteora/instructions/buy.js +153 -0
- package/dist/src/sol-sdk/meteora/instructions/buy.js.map +1 -0
- package/dist/src/sol-sdk/meteora/instructions/sell.d.ts +24 -0
- package/dist/src/sol-sdk/meteora/instructions/sell.d.ts.map +1 -0
- package/dist/src/sol-sdk/meteora/instructions/sell.js +98 -0
- package/dist/src/sol-sdk/meteora/instructions/sell.js.map +1 -0
- package/dist/src/sol-sdk/pump/index.d.ts +22 -0
- package/dist/src/sol-sdk/pump/index.d.ts.map +1 -0
- package/dist/src/sol-sdk/pump/index.js +101 -0
- package/dist/src/sol-sdk/pump/index.js.map +1 -0
- package/dist/src/sol-sdk/pump/instructions/buy.d.ts +29 -0
- package/dist/src/sol-sdk/pump/instructions/buy.d.ts.map +1 -0
- package/dist/src/sol-sdk/pump/instructions/buy.js +131 -0
- package/dist/src/sol-sdk/pump/instructions/buy.js.map +1 -0
- package/dist/src/sol-sdk/pump/instructions/createAndBuy.d.ts +36 -0
- package/dist/src/sol-sdk/pump/instructions/createAndBuy.d.ts.map +1 -0
- package/dist/src/sol-sdk/pump/instructions/createAndBuy.js +77 -0
- package/dist/src/sol-sdk/pump/instructions/createAndBuy.js.map +1 -0
- package/dist/src/sol-sdk/pump/instructions/sell.d.ts +7 -0
- package/dist/src/sol-sdk/pump/instructions/sell.d.ts.map +1 -0
- package/dist/src/sol-sdk/pump/instructions/sell.js +38 -0
- package/dist/src/sol-sdk/pump/instructions/sell.js.map +1 -0
- package/dist/src/sol-sdk/pumpswap/index.d.ts +9 -0
- package/dist/src/sol-sdk/pumpswap/index.d.ts.map +1 -0
- package/dist/src/sol-sdk/pumpswap/index.js +27 -0
- package/dist/src/sol-sdk/pumpswap/index.js.map +1 -0
- package/dist/src/sol-sdk/pumpswap/instructions/buy.d.ts +61 -0
- package/dist/src/sol-sdk/pumpswap/instructions/buy.d.ts.map +1 -0
- package/dist/src/sol-sdk/pumpswap/instructions/buy.js +215 -0
- package/dist/src/sol-sdk/pumpswap/instructions/buy.js.map +1 -0
- package/dist/src/sol-sdk/pumpswap/instructions/migrate.d.ts +3 -0
- package/dist/src/sol-sdk/pumpswap/instructions/migrate.d.ts.map +1 -0
- package/dist/src/sol-sdk/pumpswap/instructions/migrate.js +33 -0
- package/dist/src/sol-sdk/pumpswap/instructions/migrate.js.map +1 -0
- package/dist/src/sol-sdk/pumpswap/instructions/sell.d.ts +20 -0
- package/dist/src/sol-sdk/pumpswap/instructions/sell.d.ts.map +1 -0
- package/dist/src/sol-sdk/pumpswap/instructions/sell.js +107 -0
- package/dist/src/sol-sdk/pumpswap/instructions/sell.js.map +1 -0
- package/dist/src/sol-sdk/pumpswap/rpc/index.d.ts +28 -0
- package/dist/src/sol-sdk/pumpswap/rpc/index.d.ts.map +1 -0
- package/dist/src/sol-sdk/pumpswap/rpc/index.js +63 -0
- package/dist/src/sol-sdk/pumpswap/rpc/index.js.map +1 -0
- package/dist/src/sol-sdk/raydium/index.d.ts +16 -0
- package/dist/src/sol-sdk/raydium/index.d.ts.map +1 -0
- package/dist/src/sol-sdk/raydium/index.js +47 -0
- package/dist/src/sol-sdk/raydium/index.js.map +1 -0
- package/dist/src/sol-sdk/raydium/instructions/buy.d.ts +29 -0
- package/dist/src/sol-sdk/raydium/instructions/buy.d.ts.map +1 -0
- package/dist/src/sol-sdk/raydium/instructions/buy.js +106 -0
- package/dist/src/sol-sdk/raydium/instructions/buy.js.map +1 -0
- package/dist/src/sol-sdk/raydium/instructions/cpmmBuy.d.ts +29 -0
- package/dist/src/sol-sdk/raydium/instructions/cpmmBuy.d.ts.map +1 -0
- package/dist/src/sol-sdk/raydium/instructions/cpmmBuy.js +80 -0
- package/dist/src/sol-sdk/raydium/instructions/cpmmBuy.js.map +1 -0
- package/dist/src/sol-sdk/raydium/instructions/cpmmSell.d.ts +17 -0
- package/dist/src/sol-sdk/raydium/instructions/cpmmSell.d.ts.map +1 -0
- package/dist/src/sol-sdk/raydium/instructions/cpmmSell.js +56 -0
- package/dist/src/sol-sdk/raydium/instructions/cpmmSell.js.map +1 -0
- package/dist/src/sol-sdk/raydium/instructions/sell.d.ts +8558 -0
- package/dist/src/sol-sdk/raydium/instructions/sell.d.ts.map +1 -0
- package/dist/src/sol-sdk/raydium/instructions/sell.js +70 -0
- package/dist/src/sol-sdk/raydium/instructions/sell.js.map +1 -0
- package/dist/src/sol-sdk/raydium/rpc/index.d.ts +39 -0
- package/dist/src/sol-sdk/raydium/rpc/index.d.ts.map +1 -0
- package/dist/src/sol-sdk/raydium/rpc/index.js +82 -0
- package/dist/src/sol-sdk/raydium/rpc/index.js.map +1 -0
- package/dist/src/sol-sdk/raydium/rpc/raydium.d.ts +5 -0
- package/dist/src/sol-sdk/raydium/rpc/raydium.d.ts.map +1 -0
- package/dist/src/sol-sdk/raydium/rpc/raydium.js +18 -0
- package/dist/src/sol-sdk/raydium/rpc/raydium.js.map +1 -0
- package/dist/src/sol-sdk/rpc/index.d.ts +33 -0
- package/dist/src/sol-sdk/rpc/index.d.ts.map +1 -0
- package/dist/src/sol-sdk/rpc/index.js +128 -0
- package/dist/src/sol-sdk/rpc/index.js.map +1 -0
- package/dist/src/sol-sdk/transfer/index.d.ts +24 -0
- package/dist/src/sol-sdk/transfer/index.d.ts.map +1 -0
- package/dist/src/sol-sdk/transfer/index.js +65 -0
- package/dist/src/sol-sdk/transfer/index.js.map +1 -0
- package/dist/src/sol-sdk/turnover/index.d.ts +84 -0
- package/dist/src/sol-sdk/turnover/index.d.ts.map +1 -0
- package/dist/src/sol-sdk/turnover/index.js +569 -0
- package/dist/src/sol-sdk/turnover/index.js.map +1 -0
- package/dist/src/tx-tracker/detail-adapter.d.ts +100 -0
- package/dist/src/tx-tracker/detail-adapter.d.ts.map +1 -0
- package/dist/src/tx-tracker/detail-adapter.js +215 -0
- package/dist/src/tx-tracker/detail-adapter.js.map +1 -0
- package/dist/src/tx-tracker/index.d.ts +142 -0
- package/dist/src/tx-tracker/index.d.ts.map +1 -0
- package/dist/src/tx-tracker/index.js +447 -0
- package/dist/src/tx-tracker/index.js.map +1 -0
- package/dist/src/types/index.d.ts +76 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js +69 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/types/websocket.d.ts +15 -0
- package/dist/src/types/websocket.d.ts.map +1 -0
- package/dist/src/types/websocket.js +18 -0
- package/dist/src/types/websocket.js.map +1 -0
- package/dist/src/utils/index.d.ts +13 -0
- package/dist/src/utils/index.d.ts.map +1 -0
- package/dist/src/utils/index.js +174 -0
- package/dist/src/utils/index.js.map +1 -0
- package/dist/src/wallet-store.d.ts +124 -0
- package/dist/src/wallet-store.d.ts.map +1 -0
- package/dist/src/wallet-store.js +524 -0
- package/dist/src/wallet-store.js.map +1 -0
- package/package.json +86 -0
- package/scripts/postinstall.js +88 -0
|
@@ -0,0 +1,524 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ForgeX CLI 钱包存储
|
|
3
|
+
*
|
|
4
|
+
* 本地加密存储钱包组数据,替代前端的 IndexedDB 持久化方案。
|
|
5
|
+
* 使用 AES 加密私钥(静态加密),支持 KDF v3 格式导入/导出。
|
|
6
|
+
*
|
|
7
|
+
* 加密方案:
|
|
8
|
+
* - 每个 WalletInfo.privateKey 字段使用 CryptoJS AES 加密存储
|
|
9
|
+
* - master password 通过 FORGEX_PASSWORD 环境变量或 inquirer 交互输入
|
|
10
|
+
* - WalletStoreData.encrypted 标记区分加密格式和旧明文格式
|
|
11
|
+
* - 旧格式自动迁移到加密格式
|
|
12
|
+
*/
|
|
13
|
+
import fs from 'fs';
|
|
14
|
+
import path from 'path';
|
|
15
|
+
import CryptoJS from 'crypto-js';
|
|
16
|
+
import { Keypair } from '@solana/web3.js';
|
|
17
|
+
import bs58 from 'bs58';
|
|
18
|
+
import { WALLETS_DIR, ensureConfigDir } from './config.js';
|
|
19
|
+
// ============================================================
|
|
20
|
+
// 常量
|
|
21
|
+
// ============================================================
|
|
22
|
+
const STORE_FILE = 'wallet-store.json';
|
|
23
|
+
const ENCRYPTED_STORE_FILE = 'wallet-store.enc';
|
|
24
|
+
/** 用于密码校验的已知明文标记 */
|
|
25
|
+
const PASSWORD_CHECK_PLAINTEXT = 'FORGEX_PASSWORD_OK';
|
|
26
|
+
// ============================================================
|
|
27
|
+
// Master Password 管理
|
|
28
|
+
// ============================================================
|
|
29
|
+
/** 运行时内存中的 master password(进程生命周期内有效) */
|
|
30
|
+
let _masterPassword = null;
|
|
31
|
+
/**
|
|
32
|
+
* 设置 master password(供 CLI 入口调用)
|
|
33
|
+
* 密码将保存在内存中,仅在当前进程生命周期内有效。
|
|
34
|
+
*/
|
|
35
|
+
export function setMasterPassword(password) {
|
|
36
|
+
_masterPassword = password;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* 获取当前 master password
|
|
40
|
+
* 优先级:内存中的密码 > 环境变量 FORGEX_PASSWORD
|
|
41
|
+
*/
|
|
42
|
+
export function getMasterPassword() {
|
|
43
|
+
if (_masterPassword)
|
|
44
|
+
return _masterPassword;
|
|
45
|
+
const envPassword = process.env.FORGEX_PASSWORD;
|
|
46
|
+
if (envPassword) {
|
|
47
|
+
_masterPassword = envPassword;
|
|
48
|
+
return envPassword;
|
|
49
|
+
}
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 确保 master password 已设置。
|
|
54
|
+
* 如果未设置,尝试从环境变量读取;如果仍未获取到,通过 inquirer 交互提示输入。
|
|
55
|
+
* 此函数为异步函数,因为可能需要等待用户输入。
|
|
56
|
+
*/
|
|
57
|
+
export async function ensureMasterPassword() {
|
|
58
|
+
const existing = getMasterPassword();
|
|
59
|
+
if (existing)
|
|
60
|
+
return existing;
|
|
61
|
+
// 动态导入 inquirer 以避免在不需要时加载
|
|
62
|
+
const { password: passwordPrompt } = await import('@inquirer/prompts');
|
|
63
|
+
const pwd = await passwordPrompt({
|
|
64
|
+
message: '请输入钱包加密密码 (master password):',
|
|
65
|
+
mask: '*',
|
|
66
|
+
});
|
|
67
|
+
if (!pwd || pwd.trim().length === 0) {
|
|
68
|
+
throw new Error('密码不能为空');
|
|
69
|
+
}
|
|
70
|
+
_masterPassword = pwd;
|
|
71
|
+
return pwd;
|
|
72
|
+
}
|
|
73
|
+
// ============================================================
|
|
74
|
+
// 私钥加解密
|
|
75
|
+
// ============================================================
|
|
76
|
+
/** 使用 master password 加密一个私钥 */
|
|
77
|
+
function encryptPrivateKey(plainPrivateKey, password) {
|
|
78
|
+
return CryptoJS.AES.encrypt(plainPrivateKey, password).toString();
|
|
79
|
+
}
|
|
80
|
+
/** 使用 master password 解密一个私钥 */
|
|
81
|
+
function decryptPrivateKey(encryptedPrivateKey, password) {
|
|
82
|
+
const bytes = CryptoJS.AES.decrypt(encryptedPrivateKey, password);
|
|
83
|
+
const result = bytes.toString(CryptoJS.enc.Utf8);
|
|
84
|
+
if (!result) {
|
|
85
|
+
throw new Error('私钥解密失败:密码错误或数据已损坏');
|
|
86
|
+
}
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* 解密单个 WalletInfo 的私钥(供 SDK 和命令调用)
|
|
91
|
+
*
|
|
92
|
+
* 如果存储未加密(旧格式),直接返回原始 privateKey。
|
|
93
|
+
* 如果已加密,使用 master password 解密后返回 Base58 明文私钥。
|
|
94
|
+
*/
|
|
95
|
+
export function getDecryptedPrivateKey(walletInfo) {
|
|
96
|
+
const password = getMasterPassword();
|
|
97
|
+
// 如果没有设置密码,假定为未加密格式,直接返回
|
|
98
|
+
if (!password) {
|
|
99
|
+
return walletInfo.privateKey;
|
|
100
|
+
}
|
|
101
|
+
// 尝试解密
|
|
102
|
+
try {
|
|
103
|
+
const decrypted = decryptPrivateKey(walletInfo.privateKey, password);
|
|
104
|
+
// 验证解密结果是否为有效的 Base58 私钥
|
|
105
|
+
bs58.decode(decrypted);
|
|
106
|
+
return decrypted;
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
// 如果解密失败,可能是未加密的明文私钥(向后兼容)
|
|
110
|
+
try {
|
|
111
|
+
bs58.decode(walletInfo.privateKey);
|
|
112
|
+
return walletInfo.privateKey;
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
throw new Error(`私钥解密失败:密码错误或私钥数据已损坏 (钱包: ${walletInfo.walletAddress})`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* 异步版本的解密函数,会自动确保密码已设置
|
|
121
|
+
*/
|
|
122
|
+
export async function getDecryptedPrivateKeyAsync(walletInfo) {
|
|
123
|
+
await ensureMasterPassword();
|
|
124
|
+
return getDecryptedPrivateKey(walletInfo);
|
|
125
|
+
}
|
|
126
|
+
/** 生成密码校验值 */
|
|
127
|
+
function generatePasswordCheck(password) {
|
|
128
|
+
return CryptoJS.AES.encrypt(PASSWORD_CHECK_PLAINTEXT, password).toString();
|
|
129
|
+
}
|
|
130
|
+
/** 验证密码是否正确 */
|
|
131
|
+
function verifyPassword(password, checkValue) {
|
|
132
|
+
try {
|
|
133
|
+
const bytes = CryptoJS.AES.decrypt(checkValue, password);
|
|
134
|
+
const result = bytes.toString(CryptoJS.enc.Utf8);
|
|
135
|
+
return result === PASSWORD_CHECK_PLAINTEXT;
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// ============================================================
|
|
142
|
+
// 工具函数
|
|
143
|
+
// ============================================================
|
|
144
|
+
function getStorePath() {
|
|
145
|
+
ensureConfigDir();
|
|
146
|
+
return path.join(WALLETS_DIR, STORE_FILE);
|
|
147
|
+
}
|
|
148
|
+
function getEncryptedStorePath() {
|
|
149
|
+
ensureConfigDir();
|
|
150
|
+
return path.join(WALLETS_DIR, ENCRYPTED_STORE_FILE);
|
|
151
|
+
}
|
|
152
|
+
// ============================================================
|
|
153
|
+
// 存储操作
|
|
154
|
+
// ============================================================
|
|
155
|
+
/** 加载钱包存储数据(原始格式,不解密私钥) */
|
|
156
|
+
export function loadWalletStore() {
|
|
157
|
+
const storePath = getStorePath();
|
|
158
|
+
if (!fs.existsSync(storePath)) {
|
|
159
|
+
return { groups: {}, notes: {}, devWallets: {} };
|
|
160
|
+
}
|
|
161
|
+
try {
|
|
162
|
+
const raw = fs.readFileSync(storePath, 'utf-8');
|
|
163
|
+
return JSON.parse(raw);
|
|
164
|
+
}
|
|
165
|
+
catch (err) {
|
|
166
|
+
// 文件损坏:备份损坏文件并警告用户
|
|
167
|
+
const bakPath = `${storePath}.bak`;
|
|
168
|
+
try {
|
|
169
|
+
fs.renameSync(storePath, bakPath);
|
|
170
|
+
console.warn(`警告: 钱包存储文件已损坏,已备份至 ${bakPath}。将使用空数据继续运行。`);
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
console.warn(`警告: 钱包存储文件已损坏且无法创建备份。将使用空数据继续运行。`);
|
|
174
|
+
}
|
|
175
|
+
return { groups: {}, notes: {}, devWallets: {} };
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/** 保存钱包存储数据 */
|
|
179
|
+
export function saveWalletStore(data) {
|
|
180
|
+
ensureConfigDir();
|
|
181
|
+
const storePath = getStorePath();
|
|
182
|
+
fs.writeFileSync(storePath, JSON.stringify(data, null, 2), { encoding: 'utf-8', mode: 0o600 });
|
|
183
|
+
}
|
|
184
|
+
// ============================================================
|
|
185
|
+
// 加密迁移
|
|
186
|
+
// ============================================================
|
|
187
|
+
/**
|
|
188
|
+
* 检测存储是否为旧格式(未加密),如果是则提示并执行迁移。
|
|
189
|
+
*
|
|
190
|
+
* 此函数应在 CLI 入口处调用。迁移过程:
|
|
191
|
+
* 1. 读取明文存储
|
|
192
|
+
* 2. 确保用户设置了 master password
|
|
193
|
+
* 3. 加密所有 privateKey 字段
|
|
194
|
+
* 4. 添加 encrypted 标记和密码校验值
|
|
195
|
+
* 5. 保存加密后的存储
|
|
196
|
+
*/
|
|
197
|
+
export async function migrateToEncryptedStore() {
|
|
198
|
+
const store = loadWalletStore();
|
|
199
|
+
// 如果没有数据或已加密,跳过
|
|
200
|
+
if (Object.keys(store.groups).length === 0)
|
|
201
|
+
return;
|
|
202
|
+
if (store.encrypted === true)
|
|
203
|
+
return;
|
|
204
|
+
// 检查是否有需要加密的私钥
|
|
205
|
+
const hasPrivateKeys = Object.values(store.groups).some(g => g.wallets.some(w => w.privateKey && w.privateKey.length > 0));
|
|
206
|
+
if (!hasPrivateKeys)
|
|
207
|
+
return;
|
|
208
|
+
console.warn('检测到钱包存储使用旧格式(明文私钥),需要迁移到加密格式。');
|
|
209
|
+
const password = await ensureMasterPassword();
|
|
210
|
+
// 备份原始文件
|
|
211
|
+
const storePath = getStorePath();
|
|
212
|
+
const bakPath = `${storePath}.pre-encryption.bak`;
|
|
213
|
+
try {
|
|
214
|
+
fs.copyFileSync(storePath, bakPath);
|
|
215
|
+
fs.chmodSync(bakPath, 0o600);
|
|
216
|
+
console.warn(`已备份原始文件至 ${bakPath}`);
|
|
217
|
+
}
|
|
218
|
+
catch {
|
|
219
|
+
console.warn('警告: 无法创建备份文件,继续迁移...');
|
|
220
|
+
}
|
|
221
|
+
// 加密所有私钥
|
|
222
|
+
for (const group of Object.values(store.groups)) {
|
|
223
|
+
for (const wallet of group.wallets) {
|
|
224
|
+
if (wallet.privateKey) {
|
|
225
|
+
wallet.privateKey = encryptPrivateKey(wallet.privateKey, password);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
store.encrypted = true;
|
|
230
|
+
store.passwordCheck = generatePasswordCheck(password);
|
|
231
|
+
saveWalletStore(store);
|
|
232
|
+
console.warn('钱包存储已成功迁移到加密格式。');
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* 验证当前 master password 是否与存储中的密码校验值匹配。
|
|
236
|
+
* 如果存储未加密,返回 true。
|
|
237
|
+
*/
|
|
238
|
+
export function validateMasterPassword() {
|
|
239
|
+
const store = loadWalletStore();
|
|
240
|
+
if (!store.encrypted)
|
|
241
|
+
return true;
|
|
242
|
+
if (!store.passwordCheck)
|
|
243
|
+
return true; // 没有校验值时跳过
|
|
244
|
+
const password = getMasterPassword();
|
|
245
|
+
if (!password)
|
|
246
|
+
return false;
|
|
247
|
+
return verifyPassword(password, store.passwordCheck);
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* 确保密码已设置且正确。供 CLI 入口在执行需要私钥的命令前调用。
|
|
251
|
+
*/
|
|
252
|
+
export async function ensurePasswordAndValidate() {
|
|
253
|
+
const store = loadWalletStore();
|
|
254
|
+
if (!store.encrypted)
|
|
255
|
+
return; // 未加密存储不需要密码
|
|
256
|
+
const password = await ensureMasterPassword();
|
|
257
|
+
if (store.passwordCheck && !verifyPassword(password, store.passwordCheck)) {
|
|
258
|
+
_masterPassword = null; // 清除错误密码
|
|
259
|
+
throw new Error('密码错误:无法解密钱包存储。请检查密码是否正确。');
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
// ============================================================
|
|
263
|
+
// 钱包组操作
|
|
264
|
+
// ============================================================
|
|
265
|
+
/** 获取所有钱包组 */
|
|
266
|
+
export function getAllGroups() {
|
|
267
|
+
const store = loadWalletStore();
|
|
268
|
+
return Object.values(store.groups);
|
|
269
|
+
}
|
|
270
|
+
/** 获取单个钱包组 */
|
|
271
|
+
export function getGroup(groupId) {
|
|
272
|
+
const store = loadWalletStore();
|
|
273
|
+
return store.groups[groupId];
|
|
274
|
+
}
|
|
275
|
+
/** 保存钱包组(新增或更新) */
|
|
276
|
+
export function saveGroup(group) {
|
|
277
|
+
const store = loadWalletStore();
|
|
278
|
+
store.groups[group.groupId] = group;
|
|
279
|
+
saveWalletStore(store);
|
|
280
|
+
}
|
|
281
|
+
/** 删除钱包组 */
|
|
282
|
+
export function removeGroup(groupId) {
|
|
283
|
+
const store = loadWalletStore();
|
|
284
|
+
if (!store.groups[groupId])
|
|
285
|
+
return false;
|
|
286
|
+
delete store.groups[groupId];
|
|
287
|
+
saveWalletStore(store);
|
|
288
|
+
return true;
|
|
289
|
+
}
|
|
290
|
+
/** 向钱包组添加钱包(私钥将根据存储状态自动加密) */
|
|
291
|
+
export function addWalletsToGroup(groupId, wallets) {
|
|
292
|
+
const store = loadWalletStore();
|
|
293
|
+
const group = store.groups[groupId];
|
|
294
|
+
if (!group)
|
|
295
|
+
return false;
|
|
296
|
+
// 去重检查
|
|
297
|
+
const existingAddresses = new Set(group.wallets.map(w => w.walletAddress));
|
|
298
|
+
const newWallets = wallets.filter(w => !existingAddresses.has(w.walletAddress));
|
|
299
|
+
// 如果存储已加密,加密新钱包的私钥
|
|
300
|
+
if (store.encrypted) {
|
|
301
|
+
const password = getMasterPassword();
|
|
302
|
+
if (!password) {
|
|
303
|
+
throw new Error('存储已加密但未设置密码,请先调用 ensureMasterPassword()');
|
|
304
|
+
}
|
|
305
|
+
for (const w of newWallets) {
|
|
306
|
+
w.privateKey = encryptPrivateKey(w.privateKey, password);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
group.wallets.push(...newWallets);
|
|
310
|
+
saveWalletStore(store);
|
|
311
|
+
return true;
|
|
312
|
+
}
|
|
313
|
+
/** 从钱包组移除钱包 */
|
|
314
|
+
export function removeWalletsFromGroup(groupId, addresses) {
|
|
315
|
+
const store = loadWalletStore();
|
|
316
|
+
const group = store.groups[groupId];
|
|
317
|
+
if (!group)
|
|
318
|
+
return false;
|
|
319
|
+
const addrSet = new Set(addresses);
|
|
320
|
+
group.wallets = group.wallets.filter(w => !addrSet.has(w.walletAddress));
|
|
321
|
+
saveWalletStore(store);
|
|
322
|
+
return true;
|
|
323
|
+
}
|
|
324
|
+
// ============================================================
|
|
325
|
+
// 钱包生成
|
|
326
|
+
// ============================================================
|
|
327
|
+
/** 生成新钱包(返回明文私钥,存储时由 addWalletsToGroup 负责加密) */
|
|
328
|
+
export function generateWallets(count) {
|
|
329
|
+
const wallets = [];
|
|
330
|
+
for (let i = 0; i < count; i++) {
|
|
331
|
+
const keypair = Keypair.generate();
|
|
332
|
+
wallets.push({
|
|
333
|
+
walletAddress: keypair.publicKey.toBase58(),
|
|
334
|
+
privateKey: bs58.encode(keypair.secretKey),
|
|
335
|
+
note: '',
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
return wallets;
|
|
339
|
+
}
|
|
340
|
+
/** 从私钥恢复钱包信息 */
|
|
341
|
+
export function walletFromPrivateKey(privateKey, note = '') {
|
|
342
|
+
const keypair = Keypair.fromSecretKey(bs58.decode(privateKey));
|
|
343
|
+
return {
|
|
344
|
+
walletAddress: keypair.publicKey.toBase58(),
|
|
345
|
+
privateKey,
|
|
346
|
+
note,
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
// ============================================================
|
|
350
|
+
// 加密 / 导出(导出时解密,导入时加密)
|
|
351
|
+
// ============================================================
|
|
352
|
+
/** 加密导出钱包存储(整体加密,用于备份) */
|
|
353
|
+
export function encryptWalletStore(password) {
|
|
354
|
+
const store = loadWalletStore();
|
|
355
|
+
// 如果存储已加密,先解密私钥再整体加密
|
|
356
|
+
if (store.encrypted) {
|
|
357
|
+
const masterPwd = getMasterPassword();
|
|
358
|
+
if (masterPwd) {
|
|
359
|
+
for (const group of Object.values(store.groups)) {
|
|
360
|
+
for (const wallet of group.wallets) {
|
|
361
|
+
if (wallet.privateKey) {
|
|
362
|
+
try {
|
|
363
|
+
wallet.privateKey = decryptPrivateKey(wallet.privateKey, masterPwd);
|
|
364
|
+
}
|
|
365
|
+
catch {
|
|
366
|
+
// 如果解密失败,保持原样
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
// 移除加密标记(导出的是明文数据的整体加密)
|
|
374
|
+
const exportData = { ...store };
|
|
375
|
+
delete exportData.encrypted;
|
|
376
|
+
delete exportData.passwordCheck;
|
|
377
|
+
const json = JSON.stringify(exportData);
|
|
378
|
+
return CryptoJS.AES.encrypt(json, password).toString();
|
|
379
|
+
}
|
|
380
|
+
/** 解密导入钱包存储 */
|
|
381
|
+
export function decryptWalletStore(encrypted, password) {
|
|
382
|
+
try {
|
|
383
|
+
const bytes = CryptoJS.AES.decrypt(encrypted, password);
|
|
384
|
+
const decrypted = bytes.toString(CryptoJS.enc.Utf8);
|
|
385
|
+
if (!decrypted)
|
|
386
|
+
return null;
|
|
387
|
+
return JSON.parse(decrypted);
|
|
388
|
+
}
|
|
389
|
+
catch {
|
|
390
|
+
return null;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
/** 导出钱包组为 CSV(自动解密私钥) */
|
|
394
|
+
export function exportGroupToCsv(groupId) {
|
|
395
|
+
const group = getGroup(groupId);
|
|
396
|
+
if (!group)
|
|
397
|
+
return null;
|
|
398
|
+
const store = loadWalletStore();
|
|
399
|
+
const password = getMasterPassword();
|
|
400
|
+
const lines = ['WalletAddress,PrivateKey,Note'];
|
|
401
|
+
for (const w of group.wallets) {
|
|
402
|
+
const note = w.note.replace(/,/g, '\\,').replace(/\n/g, '\\n');
|
|
403
|
+
let pk = w.privateKey;
|
|
404
|
+
// 如果存储已加密,解密私钥用于导出
|
|
405
|
+
if (store.encrypted && password) {
|
|
406
|
+
try {
|
|
407
|
+
pk = decryptPrivateKey(pk, password);
|
|
408
|
+
}
|
|
409
|
+
catch {
|
|
410
|
+
// 解密失败时保持原样
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
lines.push(`${w.walletAddress},${pk},${note}`);
|
|
414
|
+
}
|
|
415
|
+
return lines.join('\n');
|
|
416
|
+
}
|
|
417
|
+
/** 从 CSV 导入钱包 */
|
|
418
|
+
export function importWalletsFromCsv(csvContent) {
|
|
419
|
+
const lines = csvContent.trim().split('\n');
|
|
420
|
+
const wallets = [];
|
|
421
|
+
// 跳过表头
|
|
422
|
+
const startIndex = lines[0]?.toLowerCase().includes('walletaddress') ? 1 : 0;
|
|
423
|
+
for (let i = startIndex; i < lines.length; i++) {
|
|
424
|
+
const line = lines[i].trim();
|
|
425
|
+
if (!line)
|
|
426
|
+
continue;
|
|
427
|
+
const parts = line.split(',');
|
|
428
|
+
if (parts.length < 2)
|
|
429
|
+
continue;
|
|
430
|
+
const address = parts[0].trim();
|
|
431
|
+
const privateKey = parts[1].trim();
|
|
432
|
+
const note = (parts[2] || '').trim().replace(/\\,/g, ',').replace(/\\n/g, '\n');
|
|
433
|
+
// 验证私钥
|
|
434
|
+
try {
|
|
435
|
+
const keypair = Keypair.fromSecretKey(bs58.decode(privateKey));
|
|
436
|
+
const derivedAddress = keypair.publicKey.toBase58();
|
|
437
|
+
if (address && derivedAddress !== address) {
|
|
438
|
+
console.warn(`警告: 地址不匹配 (行 ${i + 1}): ${address} != ${derivedAddress}`);
|
|
439
|
+
}
|
|
440
|
+
wallets.push({
|
|
441
|
+
walletAddress: derivedAddress,
|
|
442
|
+
privateKey,
|
|
443
|
+
note,
|
|
444
|
+
});
|
|
445
|
+
}
|
|
446
|
+
catch {
|
|
447
|
+
console.warn(`跳过无效私钥 (行 ${i + 1})`);
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
return wallets;
|
|
451
|
+
}
|
|
452
|
+
/** 导出所有钱包组为 JSON(兼容前端导入格式,自动解密私钥) */
|
|
453
|
+
export function exportAllGroupsJson() {
|
|
454
|
+
const groups = getAllGroups();
|
|
455
|
+
const store = loadWalletStore();
|
|
456
|
+
const password = getMasterPassword();
|
|
457
|
+
// 如果存储已加密,解密私钥用于导出
|
|
458
|
+
if (store.encrypted && password) {
|
|
459
|
+
for (const group of groups) {
|
|
460
|
+
for (const wallet of group.wallets) {
|
|
461
|
+
if (wallet.privateKey) {
|
|
462
|
+
try {
|
|
463
|
+
wallet.privateKey = decryptPrivateKey(wallet.privateKey, password);
|
|
464
|
+
}
|
|
465
|
+
catch {
|
|
466
|
+
// 解密失败时保持原样
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
return JSON.stringify(groups, null, 2);
|
|
473
|
+
}
|
|
474
|
+
/** 导出加密的钱包组 JSON */
|
|
475
|
+
export function exportEncryptedGroupsJson(password) {
|
|
476
|
+
const json = exportAllGroupsJson();
|
|
477
|
+
return CryptoJS.AES.encrypt(json, password).toString();
|
|
478
|
+
}
|
|
479
|
+
/** 导入钱包组 JSON */
|
|
480
|
+
export function importGroupsFromJson(jsonContent, password) {
|
|
481
|
+
let content = jsonContent;
|
|
482
|
+
// 尝试解密
|
|
483
|
+
if (password) {
|
|
484
|
+
try {
|
|
485
|
+
const bytes = CryptoJS.AES.decrypt(content, password);
|
|
486
|
+
const decrypted = bytes.toString(CryptoJS.enc.Utf8);
|
|
487
|
+
if (!decrypted)
|
|
488
|
+
return null;
|
|
489
|
+
content = decrypted;
|
|
490
|
+
}
|
|
491
|
+
catch {
|
|
492
|
+
return null;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
try {
|
|
496
|
+
const groups = JSON.parse(content);
|
|
497
|
+
if (!Array.isArray(groups))
|
|
498
|
+
return null;
|
|
499
|
+
return groups;
|
|
500
|
+
}
|
|
501
|
+
catch {
|
|
502
|
+
return null;
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
// ============================================================
|
|
506
|
+
// 备注管理
|
|
507
|
+
// ============================================================
|
|
508
|
+
/** 获取钱包备注 */
|
|
509
|
+
export function getNote(address) {
|
|
510
|
+
const store = loadWalletStore();
|
|
511
|
+
return store.notes[address] || '';
|
|
512
|
+
}
|
|
513
|
+
/** 设置钱包备注 */
|
|
514
|
+
export function setNote(address, note) {
|
|
515
|
+
const store = loadWalletStore();
|
|
516
|
+
store.notes[address] = note;
|
|
517
|
+
saveWalletStore(store);
|
|
518
|
+
}
|
|
519
|
+
/** 获取所有备注 */
|
|
520
|
+
export function getAllNotes() {
|
|
521
|
+
const store = loadWalletStore();
|
|
522
|
+
return store.notes;
|
|
523
|
+
}
|
|
524
|
+
//# sourceMappingURL=wallet-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet-store.js","sourceRoot":"","sources":["../../src/wallet-store.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "forgex-cli",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "ForgeX CLI - Solana on-chain market making system command-line tool",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"author": "cat",
|
|
7
|
+
"keywords": [
|
|
8
|
+
"solana",
|
|
9
|
+
"cli",
|
|
10
|
+
"market-making",
|
|
11
|
+
"defi",
|
|
12
|
+
"trading",
|
|
13
|
+
"wallet",
|
|
14
|
+
"pump-fun",
|
|
15
|
+
"raydium",
|
|
16
|
+
"jito"
|
|
17
|
+
],
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "https://github.com/forgex-org/forgex",
|
|
21
|
+
"directory": "cli"
|
|
22
|
+
},
|
|
23
|
+
"bin": {
|
|
24
|
+
"forgex": "./dist/bin/forgex.js"
|
|
25
|
+
},
|
|
26
|
+
"files": [
|
|
27
|
+
"dist/",
|
|
28
|
+
"scripts/postinstall.js",
|
|
29
|
+
"README.md"
|
|
30
|
+
],
|
|
31
|
+
"scripts": {
|
|
32
|
+
"build": "tsc && node scripts/fix-esm-imports.js",
|
|
33
|
+
"dev": "tsx bin/forgex.ts",
|
|
34
|
+
"start": "node dist/bin/forgex.js",
|
|
35
|
+
"clean": "rm -rf dist",
|
|
36
|
+
"test": "vitest run",
|
|
37
|
+
"test:watch": "vitest",
|
|
38
|
+
"prepublishOnly": "npm run clean && npm run build",
|
|
39
|
+
"postinstall": "node scripts/postinstall.js"
|
|
40
|
+
},
|
|
41
|
+
"engines": {
|
|
42
|
+
"node": ">=22.14.0"
|
|
43
|
+
},
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"@coral-xyz/anchor": "0.31.0",
|
|
46
|
+
"@solana/spl-token": "^0.4.13",
|
|
47
|
+
"@solana/web3.js": "^1.98.4",
|
|
48
|
+
"axios": "^1.8.3",
|
|
49
|
+
"bignumber.js": "^9.1.2",
|
|
50
|
+
"bn.js": "^5.2.1",
|
|
51
|
+
"bs58": "^6.0.0",
|
|
52
|
+
"buffer": "^6.0.3",
|
|
53
|
+
"chalk": "^5.3.0",
|
|
54
|
+
"cli-progress": "^3.12.0",
|
|
55
|
+
"cli-table3": "^0.6.5",
|
|
56
|
+
"commander": "^13.1.0",
|
|
57
|
+
"crypto-js": "^4.2.0",
|
|
58
|
+
"dayjs": "^1.11.13",
|
|
59
|
+
"form-data": "^4.0.1",
|
|
60
|
+
"inquirer": "^12.3.0",
|
|
61
|
+
"lodash": "^4.17.21",
|
|
62
|
+
"ora": "^8.1.1",
|
|
63
|
+
"pino-pretty": "^13.0.0"
|
|
64
|
+
},
|
|
65
|
+
"devDependencies": {
|
|
66
|
+
"@types/cli-progress": "^3.11.6",
|
|
67
|
+
"@types/crypto-js": "^4.2.2",
|
|
68
|
+
"@types/lodash": "^4.17.20",
|
|
69
|
+
"@types/node": "^22.0.0",
|
|
70
|
+
"tsx": "^4.19.0",
|
|
71
|
+
"typescript": "^5.6.0",
|
|
72
|
+
"vitest": "^4.0.18"
|
|
73
|
+
},
|
|
74
|
+
"peerDependencies": {
|
|
75
|
+
"@meteora-ag/dlmm": "^1.6.1",
|
|
76
|
+
"@raydium-io/raydium-sdk-v2": ">=0.1.132-alpha"
|
|
77
|
+
},
|
|
78
|
+
"peerDependenciesMeta": {
|
|
79
|
+
"@meteora-ag/dlmm": {
|
|
80
|
+
"optional": true
|
|
81
|
+
},
|
|
82
|
+
"@raydium-io/raydium-sdk-v2": {
|
|
83
|
+
"optional": true
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|