@3rd-eye-labs/openmm 0.1.1 ā 0.1.4
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 +34 -1
- package/dist/cli/cli.js +55 -36
- package/dist/cli/cli.js.map +1 -1
- package/dist/cli/commands/ohlcv.d.ts +3 -0
- package/dist/cli/commands/ohlcv.d.ts.map +1 -0
- package/dist/cli/commands/ohlcv.js +115 -0
- package/dist/cli/commands/ohlcv.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +3 -0
- package/dist/cli/commands/setup.d.ts.map +1 -0
- package/dist/cli/commands/setup.js +253 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/commands/wallet.d.ts +7 -0
- package/dist/cli/commands/wallet.d.ts.map +1 -0
- package/dist/cli/commands/wallet.js +271 -0
- package/dist/cli/commands/wallet.js.map +1 -0
- package/dist/core/exchange/base-exchange-connector.d.ts +2 -1
- package/dist/core/exchange/base-exchange-connector.d.ts.map +1 -1
- package/dist/core/exchange/base-exchange-connector.js.map +1 -1
- package/dist/exchanges/bitget/bitget-connector.d.ts +11 -1
- package/dist/exchanges/bitget/bitget-connector.d.ts.map +1 -1
- package/dist/exchanges/bitget/bitget-connector.js +52 -0
- package/dist/exchanges/bitget/bitget-connector.js.map +1 -1
- package/dist/exchanges/gateio/gateio-connector.d.ts +11 -1
- package/dist/exchanges/gateio/gateio-connector.d.ts.map +1 -1
- package/dist/exchanges/gateio/gateio-connector.js +54 -0
- package/dist/exchanges/gateio/gateio-connector.js.map +1 -1
- package/dist/exchanges/kraken/kraken-connector.d.ts +6 -1
- package/dist/exchanges/kraken/kraken-connector.d.ts.map +1 -1
- package/dist/exchanges/kraken/kraken-connector.js +44 -0
- package/dist/exchanges/kraken/kraken-connector.js.map +1 -1
- package/dist/exchanges/mexc/mexc-auth.d.ts +1 -0
- package/dist/exchanges/mexc/mexc-auth.d.ts.map +1 -1
- package/dist/exchanges/mexc/mexc-auth.js +4 -1
- package/dist/exchanges/mexc/mexc-auth.js.map +1 -1
- package/dist/exchanges/mexc/mexc-connector.d.ts +6 -1
- package/dist/exchanges/mexc/mexc-connector.d.ts.map +1 -1
- package/dist/exchanges/mexc/mexc-connector.js +37 -0
- package/dist/exchanges/mexc/mexc-connector.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -1
- package/dist/index.js.map +1 -1
- package/dist/types/market.d.ts +15 -0
- package/dist/types/market.d.ts.map +1 -1
- package/dist/x402/crypto.d.ts +79 -0
- package/dist/x402/crypto.d.ts.map +1 -0
- package/dist/x402/crypto.js +300 -0
- package/dist/x402/crypto.js.map +1 -0
- package/dist/x402/evm.d.ts +41 -0
- package/dist/x402/evm.d.ts.map +1 -0
- package/dist/x402/evm.js +229 -0
- package/dist/x402/evm.js.map +1 -0
- package/dist/x402/handler.d.ts +53 -0
- package/dist/x402/handler.d.ts.map +1 -0
- package/dist/x402/handler.js +233 -0
- package/dist/x402/handler.js.map +1 -0
- package/dist/x402/index.d.ts +29 -0
- package/dist/x402/index.d.ts.map +1 -0
- package/dist/x402/index.js +67 -0
- package/dist/x402/index.js.map +1 -0
- package/dist/x402/types.d.ts +185 -0
- package/dist/x402/types.d.ts.map +1 -0
- package/dist/x402/types.js +7 -0
- package/dist/x402/types.js.map +1 -0
- package/dist/x402/wallet.d.ts +65 -0
- package/dist/x402/wallet.d.ts.map +1 -0
- package/dist/x402/wallet.js +282 -0
- package/dist/x402/wallet.js.map +1 -0
- package/package.json +1 -1
- package/dist/cli/commands/grid.d.ts +0 -3
- package/dist/cli/commands/grid.d.ts.map +0 -1
- package/dist/cli/commands/grid.js +0 -103
- package/dist/cli/commands/grid.js.map +0 -1
- package/dist/cli/commands/multi-trade.d.ts +0 -3
- package/dist/cli/commands/multi-trade.d.ts.map +0 -1
- package/dist/cli/commands/multi-trade.js +0 -175
- package/dist/cli/commands/multi-trade.js.map +0 -1
- package/dist/cli/pool-discovery.d.ts +0 -56
- package/dist/cli/pool-discovery.d.ts.map +0 -1
- package/dist/cli/pool-discovery.js +0 -283
- package/dist/cli/pool-discovery.js.map +0 -1
- package/dist/core/price-aggregation/price-cache.d.ts +0 -55
- package/dist/core/price-aggregation/price-cache.d.ts.map +0 -1
- package/dist/core/price-aggregation/price-cache.js +0 -152
- package/dist/core/price-aggregation/price-cache.js.map +0 -1
- package/dist/examples/mexc-connector-comprehensive-test.d.ts +0 -15
- package/dist/examples/mexc-connector-comprehensive-test.d.ts.map +0 -1
- package/dist/examples/mexc-connector-comprehensive-test.js +0 -514
- package/dist/examples/mexc-connector-comprehensive-test.js.map +0 -1
- package/dist/examples/mexc-order-update-test.d.ts +0 -4
- package/dist/examples/mexc-order-update-test.d.ts.map +0 -1
- package/dist/examples/mexc-order-update-test.js +0 -186
- package/dist/examples/mexc-order-update-test.js.map +0 -1
- package/dist/examples/mexc-test.d.ts +0 -9
- package/dist/examples/mexc-test.d.ts.map +0 -1
- package/dist/examples/mexc-test.js +0 -218
- package/dist/examples/mexc-test.js.map +0 -1
- package/dist/examples/mexc-trades-debug.d.ts +0 -2
- package/dist/examples/mexc-trades-debug.d.ts.map +0 -1
- package/dist/examples/mexc-trades-debug.js +0 -101
- package/dist/examples/mexc-trades-debug.js.map +0 -1
- package/dist/examples/mexc-trades-subscription-debug.d.ts +0 -2
- package/dist/examples/mexc-trades-subscription-debug.d.ts.map +0 -1
- package/dist/examples/mexc-trades-subscription-debug.js +0 -150
- package/dist/examples/mexc-trades-subscription-debug.js.map +0 -1
- package/dist/examples/mexc-websocket-test.d.ts +0 -8
- package/dist/examples/mexc-websocket-test.d.ts.map +0 -1
- package/dist/examples/mexc-websocket-test.js +0 -115
- package/dist/examples/mexc-websocket-test.js.map +0 -1
- package/dist/examples/test-protobuf-status-detection.d.ts +0 -9
- package/dist/examples/test-protobuf-status-detection.d.ts.map +0 -1
- package/dist/examples/test-protobuf-status-detection.js +0 -83
- package/dist/examples/test-protobuf-status-detection.js.map +0 -1
- package/dist/exchanges/base-exchange-connector.d.ts +0 -33
- package/dist/exchanges/base-exchange-connector.d.ts.map +0 -1
- package/dist/exchanges/base-exchange-connector.js +0 -55
- package/dist/exchanges/base-exchange-connector.js.map +0 -1
- package/dist/exchanges/kraken/test-kraken-websocket.d.ts +0 -19
- package/dist/exchanges/kraken/test-kraken-websocket.d.ts.map +0 -1
- package/dist/exchanges/kraken/test-kraken-websocket.js +0 -413
- package/dist/exchanges/kraken/test-kraken-websocket.js.map +0 -1
- package/dist/mcp/resources/index.d.ts +0 -3
- package/dist/mcp/resources/index.d.ts.map +0 -1
- package/dist/mcp/resources/index.js +0 -11
- package/dist/mcp/resources/index.js.map +0 -1
- package/dist/mcp/server.d.ts +0 -4
- package/dist/mcp/server.d.ts.map +0 -1
- package/dist/mcp/server.js +0 -29
- package/dist/mcp/server.js.map +0 -1
- package/dist/mcp/tools/index.d.ts +0 -3
- package/dist/mcp/tools/index.d.ts.map +0 -1
- package/dist/mcp/tools/index.js +0 -12
- package/dist/mcp/tools/index.js.map +0 -1
- package/dist/tests/fixtures/test-helpers.d.ts +0 -5
- package/dist/tests/fixtures/test-helpers.d.ts.map +0 -1
- package/dist/tests/fixtures/test-helpers.js +0 -8
- package/dist/tests/fixtures/test-helpers.js.map +0 -1
- package/dist/tests/integration/exchanges/mexc/mexc-integration.test.d.ts +0 -2
- package/dist/tests/integration/exchanges/mexc/mexc-integration.test.d.ts.map +0 -1
- package/dist/tests/integration/exchanges/mexc/mexc-integration.test.js +0 -237
- package/dist/tests/integration/exchanges/mexc/mexc-integration.test.js.map +0 -1
- package/dist/tests/integration/price-aggregation/cardano-price-service.test.d.ts +0 -2
- package/dist/tests/integration/price-aggregation/cardano-price-service.test.d.ts.map +0 -1
- package/dist/tests/integration/price-aggregation/cardano-price-service.test.js +0 -57
- package/dist/tests/integration/price-aggregation/cardano-price-service.test.js.map +0 -1
- package/dist/tests/integration/price-aggregation/price-aggregation-integration.test.d.ts +0 -2
- package/dist/tests/integration/price-aggregation/price-aggregation-integration.test.d.ts.map +0 -1
- package/dist/tests/integration/price-aggregation/price-aggregation-integration.test.js +0 -141
- package/dist/tests/integration/price-aggregation/price-aggregation-integration.test.js.map +0 -1
- package/dist/tests/integration/strategies/grid/grid-strategy-e2e.test.d.ts +0 -2
- package/dist/tests/integration/strategies/grid/grid-strategy-e2e.test.d.ts.map +0 -1
- package/dist/tests/integration/strategies/grid/grid-strategy-e2e.test.js +0 -375
- package/dist/tests/integration/strategies/grid/grid-strategy-e2e.test.js.map +0 -1
- package/dist/tests/unit/cli/exchange-factory.test.d.ts +0 -2
- package/dist/tests/unit/cli/exchange-factory.test.d.ts.map +0 -1
- package/dist/tests/unit/cli/exchange-factory.test.js +0 -148
- package/dist/tests/unit/cli/exchange-factory.test.js.map +0 -1
- package/dist/tests/unit/config/environment.test.d.ts +0 -2
- package/dist/tests/unit/config/environment.test.d.ts.map +0 -1
- package/dist/tests/unit/config/environment.test.js +0 -158
- package/dist/tests/unit/config/environment.test.js.map +0 -1
- package/dist/tests/unit/config/launcher-config.test.d.ts +0 -2
- package/dist/tests/unit/config/launcher-config.test.d.ts.map +0 -1
- package/dist/tests/unit/config/launcher-config.test.js +0 -117
- package/dist/tests/unit/config/launcher-config.test.js.map +0 -1
- package/dist/tests/unit/config/price-aggregation.test.d.ts +0 -2
- package/dist/tests/unit/config/price-aggregation.test.d.ts.map +0 -1
- package/dist/tests/unit/config/price-aggregation.test.js +0 -144
- package/dist/tests/unit/config/price-aggregation.test.js.map +0 -1
- package/dist/tests/unit/core/exchange/base-exchange-connector.test.d.ts +0 -2
- package/dist/tests/unit/core/exchange/base-exchange-connector.test.d.ts.map +0 -1
- package/dist/tests/unit/core/exchange/base-exchange-connector.test.js +0 -191
- package/dist/tests/unit/core/exchange/base-exchange-connector.test.js.map +0 -1
- package/dist/tests/unit/core/exchange/base-exchange-data-mapper.test.d.ts +0 -2
- package/dist/tests/unit/core/exchange/base-exchange-data-mapper.test.d.ts.map +0 -1
- package/dist/tests/unit/core/exchange/base-exchange-data-mapper.test.js +0 -324
- package/dist/tests/unit/core/exchange/base-exchange-data-mapper.test.js.map +0 -1
- package/dist/tests/unit/core/price-aggregation/cardano-price-service.test.d.ts +0 -2
- package/dist/tests/unit/core/price-aggregation/cardano-price-service.test.d.ts.map +0 -1
- package/dist/tests/unit/core/price-aggregation/cardano-price-service.test.js +0 -177
- package/dist/tests/unit/core/price-aggregation/cardano-price-service.test.js.map +0 -1
- package/dist/tests/unit/core/price-aggregation/iris-api-client.test.d.ts +0 -2
- package/dist/tests/unit/core/price-aggregation/iris-api-client.test.d.ts.map +0 -1
- package/dist/tests/unit/core/price-aggregation/iris-api-client.test.js +0 -168
- package/dist/tests/unit/core/price-aggregation/iris-api-client.test.js.map +0 -1
- package/dist/tests/unit/core/price-aggregation/iris-pool-discovery.test.d.ts +0 -2
- package/dist/tests/unit/core/price-aggregation/iris-pool-discovery.test.d.ts.map +0 -1
- package/dist/tests/unit/core/price-aggregation/iris-pool-discovery.test.js +0 -217
- package/dist/tests/unit/core/price-aggregation/iris-pool-discovery.test.js.map +0 -1
- package/dist/tests/unit/core/price-aggregation/price-calculator.test.d.ts +0 -2
- package/dist/tests/unit/core/price-aggregation/price-calculator.test.d.ts.map +0 -1
- package/dist/tests/unit/core/price-aggregation/price-calculator.test.js +0 -229
- package/dist/tests/unit/core/price-aggregation/price-calculator.test.js.map +0 -1
- package/dist/tests/unit/core/risk-management/risk-manager.test.d.ts +0 -2
- package/dist/tests/unit/core/risk-management/risk-manager.test.d.ts.map +0 -1
- package/dist/tests/unit/core/risk-management/risk-manager.test.js +0 -194
- package/dist/tests/unit/core/risk-management/risk-manager.test.js.map +0 -1
- package/dist/tests/unit/core/strategy/base-strategy.test.d.ts +0 -2
- package/dist/tests/unit/core/strategy/base-strategy.test.d.ts.map +0 -1
- package/dist/tests/unit/core/strategy/base-strategy.test.js +0 -254
- package/dist/tests/unit/core/strategy/base-strategy.test.js.map +0 -1
- package/dist/tests/unit/core/strategy/strategy-factory.test.d.ts +0 -2
- package/dist/tests/unit/core/strategy/strategy-factory.test.d.ts.map +0 -1
- package/dist/tests/unit/core/strategy/strategy-factory.test.js +0 -213
- package/dist/tests/unit/core/strategy/strategy-factory.test.js.map +0 -1
- package/dist/tests/unit/exchanges/mexc/mexc-auth.test.d.ts +0 -2
- package/dist/tests/unit/exchanges/mexc/mexc-auth.test.d.ts.map +0 -1
- package/dist/tests/unit/exchanges/mexc/mexc-auth.test.js +0 -452
- package/dist/tests/unit/exchanges/mexc/mexc-auth.test.js.map +0 -1
- package/dist/tests/unit/exchanges/mexc/mexc-connector.test.d.ts +0 -2
- package/dist/tests/unit/exchanges/mexc/mexc-connector.test.d.ts.map +0 -1
- package/dist/tests/unit/exchanges/mexc/mexc-connector.test.js +0 -1419
- package/dist/tests/unit/exchanges/mexc/mexc-connector.test.js.map +0 -1
- package/dist/tests/unit/exchanges/mexc/mexc-data-mapper.test.d.ts +0 -2
- package/dist/tests/unit/exchanges/mexc/mexc-data-mapper.test.d.ts.map +0 -1
- package/dist/tests/unit/exchanges/mexc/mexc-data-mapper.test.js +0 -435
- package/dist/tests/unit/exchanges/mexc/mexc-data-mapper.test.js.map +0 -1
- package/dist/tests/unit/exchanges/mexc/mexc-protobuf-decoder.test.d.ts +0 -2
- package/dist/tests/unit/exchanges/mexc/mexc-protobuf-decoder.test.d.ts.map +0 -1
- package/dist/tests/unit/exchanges/mexc/mexc-protobuf-decoder.test.js +0 -314
- package/dist/tests/unit/exchanges/mexc/mexc-protobuf-decoder.test.js.map +0 -1
- package/dist/tests/unit/exchanges/mexc/mexc-protobuf-status-detection.test.d.ts +0 -2
- package/dist/tests/unit/exchanges/mexc/mexc-protobuf-status-detection.test.d.ts.map +0 -1
- package/dist/tests/unit/exchanges/mexc/mexc-protobuf-status-detection.test.js +0 -178
- package/dist/tests/unit/exchanges/mexc/mexc-protobuf-status-detection.test.js.map +0 -1
- package/dist/tests/unit/exchanges/mexc/mexc-user-stream.test.d.ts +0 -2
- package/dist/tests/unit/exchanges/mexc/mexc-user-stream.test.d.ts.map +0 -1
- package/dist/tests/unit/exchanges/mexc/mexc-user-stream.test.js +0 -502
- package/dist/tests/unit/exchanges/mexc/mexc-user-stream.test.js.map +0 -1
- package/dist/tests/unit/exchanges/mexc/mexc-utils.test.d.ts +0 -2
- package/dist/tests/unit/exchanges/mexc/mexc-utils.test.d.ts.map +0 -1
- package/dist/tests/unit/exchanges/mexc/mexc-utils.test.js +0 -317
- package/dist/tests/unit/exchanges/mexc/mexc-utils.test.js.map +0 -1
- package/dist/tests/unit/exchanges/mexc/mexc-websocket.test.d.ts +0 -2
- package/dist/tests/unit/exchanges/mexc/mexc-websocket.test.d.ts.map +0 -1
- package/dist/tests/unit/exchanges/mexc/mexc-websocket.test.js +0 -843
- package/dist/tests/unit/exchanges/mexc/mexc-websocket.test.js.map +0 -1
- package/dist/tests/unit/strategies/grid/grid-calculator.test.d.ts +0 -2
- package/dist/tests/unit/strategies/grid/grid-calculator.test.d.ts.map +0 -1
- package/dist/tests/unit/strategies/grid/grid-calculator.test.js +0 -67
- package/dist/tests/unit/strategies/grid/grid-calculator.test.js.map +0 -1
- package/dist/tests/unit/strategies/grid/grid-order-manager.test.d.ts +0 -2
- package/dist/tests/unit/strategies/grid/grid-order-manager.test.d.ts.map +0 -1
- package/dist/tests/unit/strategies/grid/grid-order-manager.test.js +0 -211
- package/dist/tests/unit/strategies/grid/grid-order-manager.test.js.map +0 -1
- package/dist/tests/unit/strategies/grid/grid-strategy-simple.test.d.ts +0 -2
- package/dist/tests/unit/strategies/grid/grid-strategy-simple.test.d.ts.map +0 -1
- package/dist/tests/unit/strategies/grid/grid-strategy-simple.test.js +0 -197
- package/dist/tests/unit/strategies/grid/grid-strategy-simple.test.js.map +0 -1
- package/dist/tests/unit/strategies/grid/grid-strategy.test.d.ts +0 -2
- package/dist/tests/unit/strategies/grid/grid-strategy.test.d.ts.map +0 -1
- package/dist/tests/unit/strategies/grid/grid-strategy.test.js +0 -429
- package/dist/tests/unit/strategies/grid/grid-strategy.test.js.map +0 -1
- package/dist/tests/unit/utils/logger.test.d.ts +0 -2
- package/dist/tests/unit/utils/logger.test.d.ts.map +0 -1
- package/dist/tests/unit/utils/logger.test.js +0 -260
- package/dist/tests/unit/utils/logger.test.js.map +0 -1
- package/dist/tests/unit/utils/symbol-utils.test.d.ts +0 -2
- package/dist/tests/unit/utils/symbol-utils.test.d.ts.map +0 -1
- package/dist/tests/unit/utils/symbol-utils.test.js +0 -178
- package/dist/tests/unit/utils/symbol-utils.test.js.map +0 -1
- package/dist/types/price-aggregation.d.ts +0 -31
- package/dist/types/price-aggregation.d.ts.map +0 -1
- package/dist/types/price-aggregation.js +0 -6
- package/dist/types/price-aggregation.js.map +0 -1
- package/dist/utils/crypto.d.ts +0 -15
- package/dist/utils/crypto.d.ts.map +0 -1
- package/dist/utils/crypto.js +0 -50
- package/dist/utils/crypto.js.map +0 -1
- package/dist/utils/validation.d.ts +0 -36
- package/dist/utils/validation.d.ts.map +0 -1
- package/dist/utils/validation.js +0 -174
- package/dist/utils/validation.js.map +0 -1
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* OpenMM x402 Wallet Management
|
|
4
|
+
* Local key generation and storage for EVM and Solana chains.
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.resolvePassword = resolvePassword;
|
|
11
|
+
exports.getWalletConfig = getWalletConfig;
|
|
12
|
+
exports.listWallets = listWallets;
|
|
13
|
+
exports.createWallet = createWallet;
|
|
14
|
+
exports.showWallet = showWallet;
|
|
15
|
+
exports.exportWallet = exportWallet;
|
|
16
|
+
exports.setDefaultWallet = setDefaultWallet;
|
|
17
|
+
exports.deleteWallet = deleteWallet;
|
|
18
|
+
exports.getDefaultWalletAddresses = getDefaultWalletAddresses;
|
|
19
|
+
const fs_1 = __importDefault(require("fs"));
|
|
20
|
+
const path_1 = __importDefault(require("path"));
|
|
21
|
+
const crypto_1 = require("./crypto");
|
|
22
|
+
// ============= Constants =============
|
|
23
|
+
function getWalletsDir() {
|
|
24
|
+
const configDir = path_1.default.join(process.env.HOME || process.env.USERPROFILE || '', '.openmm');
|
|
25
|
+
return path_1.default.join(configDir, 'wallets');
|
|
26
|
+
}
|
|
27
|
+
function getWalletConfigPath() {
|
|
28
|
+
return path_1.default.join(getWalletsDir(), 'config.json');
|
|
29
|
+
}
|
|
30
|
+
const WALLET_NAME_RE = /^[a-zA-Z0-9_-]{1,64}$/;
|
|
31
|
+
// ============= Helpers =============
|
|
32
|
+
function ensureWalletsDir() {
|
|
33
|
+
const dir = getWalletsDir();
|
|
34
|
+
if (!fs_1.default.existsSync(dir)) {
|
|
35
|
+
fs_1.default.mkdirSync(dir, { mode: 0o700, recursive: true });
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function validateWalletName(name) {
|
|
39
|
+
if (!name || !WALLET_NAME_RE.test(name)) {
|
|
40
|
+
throw new Error('Wallet name must be 1-64 characters: letters, numbers, hyphens, underscores only');
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function getWalletFile(name) {
|
|
44
|
+
validateWalletName(name);
|
|
45
|
+
return path_1.default.join(getWalletsDir(), `${name}.json`);
|
|
46
|
+
}
|
|
47
|
+
// ============= Password Resolution =============
|
|
48
|
+
/**
|
|
49
|
+
* Resolve wallet password from environment variable.
|
|
50
|
+
*/
|
|
51
|
+
function resolvePassword() {
|
|
52
|
+
return process.env.OPENMM_WALLET_PASSWORD || null;
|
|
53
|
+
}
|
|
54
|
+
// ============= Configuration =============
|
|
55
|
+
/**
|
|
56
|
+
* Get wallet configuration.
|
|
57
|
+
*/
|
|
58
|
+
function getWalletConfig() {
|
|
59
|
+
const configPath = getWalletConfigPath();
|
|
60
|
+
if (!fs_1.default.existsSync(configPath)) {
|
|
61
|
+
return { defaultWallet: null, passwordHash: null };
|
|
62
|
+
}
|
|
63
|
+
return JSON.parse(fs_1.default.readFileSync(configPath, 'utf8'));
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Save wallet configuration.
|
|
67
|
+
*/
|
|
68
|
+
function saveWalletConfig(config) {
|
|
69
|
+
ensureWalletsDir();
|
|
70
|
+
fs_1.default.writeFileSync(getWalletConfigPath(), JSON.stringify(config, null, 2), { mode: 0o600 });
|
|
71
|
+
}
|
|
72
|
+
// ============= Wallet Operations =============
|
|
73
|
+
/**
|
|
74
|
+
* Generate an EVM wallet (secp256k1).
|
|
75
|
+
*/
|
|
76
|
+
function generateEvmWallet() {
|
|
77
|
+
const privateKey = (0, crypto_1.generatePrivateKey)();
|
|
78
|
+
const address = (0, crypto_1.privateKeyToEvmAddress)(privateKey);
|
|
79
|
+
const privateKeyHex = privateKey.toString('hex');
|
|
80
|
+
// Zero sensitive buffer
|
|
81
|
+
privateKey.fill(0);
|
|
82
|
+
return { privateKey: privateKeyHex, address };
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Generate a Solana wallet (Ed25519).
|
|
86
|
+
*/
|
|
87
|
+
function generateSolanaWallet() {
|
|
88
|
+
const { privateKey, publicKey } = (0, crypto_1.generateSolanaKeypair)();
|
|
89
|
+
return {
|
|
90
|
+
privateKey: privateKey.toString('hex'),
|
|
91
|
+
address: (0, crypto_1.base58Encode)(publicKey),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* List all wallets.
|
|
96
|
+
*/
|
|
97
|
+
function listWallets() {
|
|
98
|
+
ensureWalletsDir();
|
|
99
|
+
const config = getWalletConfig();
|
|
100
|
+
const walletsDir = getWalletsDir();
|
|
101
|
+
const files = fs_1.default.readdirSync(walletsDir).filter(f => f.endsWith('.json') && f !== 'config.json');
|
|
102
|
+
const wallets = files.map(f => {
|
|
103
|
+
const data = JSON.parse(fs_1.default.readFileSync(path_1.default.join(walletsDir, f), 'utf8'));
|
|
104
|
+
return {
|
|
105
|
+
name: data.name,
|
|
106
|
+
evm: data.evm?.address || null,
|
|
107
|
+
solana: data.solana?.address || null,
|
|
108
|
+
createdAt: data.createdAt,
|
|
109
|
+
isDefault: data.name === config.defaultWallet,
|
|
110
|
+
};
|
|
111
|
+
});
|
|
112
|
+
return { wallets, defaultWallet: config.defaultWallet };
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Create a new wallet pair (EVM + Solana).
|
|
116
|
+
*/
|
|
117
|
+
function createWallet(name, password) {
|
|
118
|
+
ensureWalletsDir();
|
|
119
|
+
const config = getWalletConfig();
|
|
120
|
+
const walletFile = getWalletFile(name);
|
|
121
|
+
if (fs_1.default.existsSync(walletFile)) {
|
|
122
|
+
throw new Error(`Wallet "${name}" already exists`);
|
|
123
|
+
}
|
|
124
|
+
// Validate password requirements
|
|
125
|
+
if (password === null) {
|
|
126
|
+
// Passwordless mode: reject if existing wallets are encrypted
|
|
127
|
+
if (config.passwordHash) {
|
|
128
|
+
throw new Error('Existing wallets are password-protected. Set OPENMM_WALLET_PASSWORD.');
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
// Encrypted mode
|
|
133
|
+
if (password.length < 12) {
|
|
134
|
+
throw new Error('Password must be at least 12 characters');
|
|
135
|
+
}
|
|
136
|
+
if (!config.passwordHash) {
|
|
137
|
+
// First encrypted wallet: reject if passwordless local wallets exist
|
|
138
|
+
const walletsDir = getWalletsDir();
|
|
139
|
+
const existingWallets = fs_1.default
|
|
140
|
+
.readdirSync(walletsDir)
|
|
141
|
+
.filter(f => f.endsWith('.json') && f !== 'config.json');
|
|
142
|
+
if (existingWallets.length > 0) {
|
|
143
|
+
throw new Error('Existing wallets are passwordless. Cannot mix encrypted and unencrypted wallets.');
|
|
144
|
+
}
|
|
145
|
+
config.passwordHash = (0, crypto_1.hashPassword)(password);
|
|
146
|
+
}
|
|
147
|
+
else if (!(0, crypto_1.verifyPassword)(password, config.passwordHash)) {
|
|
148
|
+
throw new Error('Incorrect password');
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// Generate wallets
|
|
152
|
+
const evm = generateEvmWallet();
|
|
153
|
+
const solana = generateSolanaWallet();
|
|
154
|
+
const wallet = {
|
|
155
|
+
name,
|
|
156
|
+
createdAt: new Date().toISOString(),
|
|
157
|
+
evm: {
|
|
158
|
+
address: evm.address,
|
|
159
|
+
encrypted: (0, crypto_1.encryptKey)(evm.privateKey, password),
|
|
160
|
+
},
|
|
161
|
+
solana: {
|
|
162
|
+
address: solana.address,
|
|
163
|
+
encrypted: (0, crypto_1.encryptKey)(solana.privateKey, password),
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
fs_1.default.writeFileSync(walletFile, JSON.stringify(wallet, null, 2), { mode: 0o600 });
|
|
167
|
+
// Set as default if it's the first wallet
|
|
168
|
+
if (!config.defaultWallet) {
|
|
169
|
+
config.defaultWallet = name;
|
|
170
|
+
}
|
|
171
|
+
saveWalletConfig(config);
|
|
172
|
+
return {
|
|
173
|
+
name,
|
|
174
|
+
evm: evm.address,
|
|
175
|
+
solana: solana.address,
|
|
176
|
+
isDefault: config.defaultWallet === name,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Show wallet details (addresses only, no keys).
|
|
181
|
+
*/
|
|
182
|
+
function showWallet(name) {
|
|
183
|
+
const walletFile = getWalletFile(name);
|
|
184
|
+
if (!fs_1.default.existsSync(walletFile)) {
|
|
185
|
+
throw new Error(`Wallet "${name}" not found`);
|
|
186
|
+
}
|
|
187
|
+
const data = JSON.parse(fs_1.default.readFileSync(walletFile, 'utf8'));
|
|
188
|
+
const config = getWalletConfig();
|
|
189
|
+
return {
|
|
190
|
+
name: data.name,
|
|
191
|
+
evm: data.evm?.address || null,
|
|
192
|
+
solana: data.solana?.address || null,
|
|
193
|
+
createdAt: data.createdAt,
|
|
194
|
+
isDefault: data.name === config.defaultWallet,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Export private keys for a wallet (requires password).
|
|
199
|
+
*/
|
|
200
|
+
function exportWallet(name, password) {
|
|
201
|
+
const walletFile = getWalletFile(name);
|
|
202
|
+
if (!fs_1.default.existsSync(walletFile)) {
|
|
203
|
+
throw new Error(`Wallet "${name}" not found`);
|
|
204
|
+
}
|
|
205
|
+
const data = JSON.parse(fs_1.default.readFileSync(walletFile, 'utf8'));
|
|
206
|
+
const config = getWalletConfig();
|
|
207
|
+
if (config.passwordHash && !(0, crypto_1.verifyPassword)(password || '', config.passwordHash)) {
|
|
208
|
+
throw new Error('Incorrect password');
|
|
209
|
+
}
|
|
210
|
+
return {
|
|
211
|
+
name: data.name,
|
|
212
|
+
evm: {
|
|
213
|
+
address: data.evm?.address || '',
|
|
214
|
+
privateKey: data.evm ? (0, crypto_1.decryptKey)(data.evm.encrypted, password) : '',
|
|
215
|
+
},
|
|
216
|
+
solana: data.solana
|
|
217
|
+
? {
|
|
218
|
+
address: data.solana.address,
|
|
219
|
+
privateKey: (0, crypto_1.decryptKey)(data.solana.encrypted, password),
|
|
220
|
+
}
|
|
221
|
+
: undefined,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Set the default wallet.
|
|
226
|
+
*/
|
|
227
|
+
function setDefaultWallet(name) {
|
|
228
|
+
const walletFile = getWalletFile(name);
|
|
229
|
+
if (!fs_1.default.existsSync(walletFile)) {
|
|
230
|
+
throw new Error(`Wallet "${name}" not found`);
|
|
231
|
+
}
|
|
232
|
+
const config = getWalletConfig();
|
|
233
|
+
config.defaultWallet = name;
|
|
234
|
+
saveWalletConfig(config);
|
|
235
|
+
return { defaultWallet: name };
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Delete a wallet.
|
|
239
|
+
*/
|
|
240
|
+
function deleteWallet(name, password) {
|
|
241
|
+
const walletFile = getWalletFile(name);
|
|
242
|
+
if (!fs_1.default.existsSync(walletFile)) {
|
|
243
|
+
throw new Error(`Wallet "${name}" not found`);
|
|
244
|
+
}
|
|
245
|
+
const config = getWalletConfig();
|
|
246
|
+
if (config.passwordHash && !(0, crypto_1.verifyPassword)(password || '', config.passwordHash)) {
|
|
247
|
+
throw new Error('Incorrect password');
|
|
248
|
+
}
|
|
249
|
+
fs_1.default.unlinkSync(walletFile);
|
|
250
|
+
const remaining = fs_1.default
|
|
251
|
+
.readdirSync(getWalletsDir())
|
|
252
|
+
.filter(f => f.endsWith('.json') && f !== 'config.json');
|
|
253
|
+
if (remaining.length === 0) {
|
|
254
|
+
config.defaultWallet = null;
|
|
255
|
+
config.passwordHash = null;
|
|
256
|
+
}
|
|
257
|
+
else if (config.defaultWallet === name) {
|
|
258
|
+
config.defaultWallet = remaining[0].replace('.json', '');
|
|
259
|
+
}
|
|
260
|
+
saveWalletConfig(config);
|
|
261
|
+
return { deleted: name, newDefault: config.defaultWallet };
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Get the default wallet's addresses without requiring password.
|
|
265
|
+
*/
|
|
266
|
+
function getDefaultWalletAddresses() {
|
|
267
|
+
const config = getWalletConfig();
|
|
268
|
+
if (!config.defaultWallet)
|
|
269
|
+
return null;
|
|
270
|
+
try {
|
|
271
|
+
const wallet = showWallet(config.defaultWallet);
|
|
272
|
+
return {
|
|
273
|
+
name: wallet.name,
|
|
274
|
+
evm: wallet.evm,
|
|
275
|
+
solana: wallet.solana,
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
catch {
|
|
279
|
+
return null;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=wallet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/x402/wallet.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;AA8DH,0CAEC;AAOD,0CAMC;AAwCD,kCAmBC;AAKD,oCA8EC;AAKD,gCAsBC;AAKD,oCA0BC;AAKD,4CAWC;AAKD,oCA8BC;AAKD,8DAkBC;AA7VD,4CAAoB;AACpB,gDAAwB;AACxB,qCASkB;AASlB,wCAAwC;AAExC,SAAS,aAAa;IACpB,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;IAC1F,OAAO,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,mBAAmB;IAC1B,OAAO,cAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,aAAa,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,cAAc,GAAG,uBAAuB,CAAC;AAE/C,sCAAsC;AAEtC,SAAS,gBAAgB;IACvB,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;IAC5B,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,YAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY;IACtC,IAAI,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CACb,kFAAkF,CACnF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACzB,OAAO,cAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;AACpD,CAAC;AAED,kDAAkD;AAElD;;GAEG;AACH,SAAgB,eAAe;IAC7B,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,IAAI,CAAC;AACpD,CAAC;AAED,4CAA4C;AAE5C;;GAEG;AACH,SAAgB,eAAe;IAC7B,MAAM,UAAU,GAAG,mBAAmB,EAAE,CAAC;IACzC,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;IACrD,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;AACzD,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,MAAoB;IAC5C,gBAAgB,EAAE,CAAC;IACnB,YAAE,CAAC,aAAa,CAAC,mBAAmB,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC5F,CAAC;AAED,gDAAgD;AAEhD;;GAEG;AACH,SAAS,iBAAiB;IACxB,MAAM,UAAU,GAAG,IAAA,2BAAkB,GAAE,CAAC;IACxC,MAAM,OAAO,GAAG,IAAA,+BAAsB,EAAC,UAAU,CAAC,CAAC;IACnD,MAAM,aAAa,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEjD,wBAAwB;IACxB,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEnB,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB;IAC3B,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,IAAA,8BAAqB,GAAE,CAAC;IAC1D,OAAO;QACL,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC;QACtC,OAAO,EAAE,IAAA,qBAAY,EAAC,SAAS,CAAC;KACjC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,WAAW;IACzB,gBAAgB,EAAE,CAAC;IACnB,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IAEnC,MAAM,KAAK,GAAG,YAAE,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,aAAa,CAAC,CAAC;IAEjG,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QAC5B,MAAM,IAAI,GAAiB,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QACzF,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,IAAI,IAAI;YAC9B,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI,IAAI;YACpC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,aAAa;SAC9C,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC;AAC1D,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAC1B,IAAY,EACZ,QAAuB;IAOvB,gBAAgB,EAAE,CAAC;IACnB,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAEvC,IAAI,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,kBAAkB,CAAC,CAAC;IACrD,CAAC;IAED,iCAAiC;IACjC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,8DAA8D;QAC9D,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;SAAM,CAAC;QACN,iBAAiB;QACjB,IAAI,QAAQ,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YACzB,qEAAqE;YACrE,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;YACnC,MAAM,eAAe,GAAG,YAAE;iBACvB,WAAW,CAAC,UAAU,CAAC;iBACvB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,aAAa,CAAC,CAAC;YAE3D,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,MAAM,IAAI,KAAK,CACb,kFAAkF,CACnF,CAAC;YACJ,CAAC;YACD,MAAM,CAAC,YAAY,GAAG,IAAA,qBAAY,EAAC,QAAQ,CAAC,CAAC;QAC/C,CAAC;aAAM,IAAI,CAAC,IAAA,uBAAc,EAAC,QAAQ,EAAE,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,oBAAoB,EAAE,CAAC;IAEtC,MAAM,MAAM,GAAiB;QAC3B,IAAI;QACJ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,GAAG,EAAE;YACH,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,SAAS,EAAE,IAAA,mBAAU,EAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAiB;SAChE;QACD,MAAM,EAAE;YACN,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,SAAS,EAAE,IAAA,mBAAU,EAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAiB;SACnE;KACF,CAAC;IAEF,YAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAE/E,0CAA0C;IAC1C,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;QAC1B,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC;IAC9B,CAAC;IACD,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAEzB,OAAO;QACL,IAAI;QACJ,GAAG,EAAE,GAAG,CAAC,OAAO;QAChB,MAAM,EAAE,MAAM,CAAC,OAAO;QACtB,SAAS,EAAE,MAAM,CAAC,aAAa,KAAK,IAAI;KACzC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,UAAU,CAAC,IAAY;IAOrC,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,aAAa,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,IAAI,GAAiB,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IAEjC,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,IAAI,IAAI;QAC9B,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI,IAAI;QACpC,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,SAAS,EAAE,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,aAAa;KAC9C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAC,IAAY,EAAE,QAAuB;IAChE,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,aAAa,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,IAAI,GAAiB,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IAEjC,IAAI,MAAM,CAAC,YAAY,IAAI,CAAC,IAAA,uBAAc,EAAC,QAAQ,IAAI,EAAE,EAAE,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;QAChF,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;IAED,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,GAAG,EAAE;YACH,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,IAAI,EAAE;YAChC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAA,mBAAU,EAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;SACrE;QACD,MAAM,EAAE,IAAI,CAAC,MAAM;YACjB,CAAC,CAAC;gBACE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;gBAC5B,UAAU,EAAE,IAAA,mBAAU,EAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC;aACxD;YACH,CAAC,CAAC,SAAS;KACd,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,IAAY;IAC3C,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,aAAa,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC;IAC5B,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAEzB,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAC1B,IAAY,EACZ,QAAuB;IAEvB,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,aAAa,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IAEjC,IAAI,MAAM,CAAC,YAAY,IAAI,CAAC,IAAA,uBAAc,EAAC,QAAQ,IAAI,EAAE,EAAE,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;QAChF,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;IAED,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAE1B,MAAM,SAAS,GAAG,YAAE;SACjB,WAAW,CAAC,aAAa,EAAE,CAAC;SAC5B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,aAAa,CAAC,CAAC;IAE3D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC;IAC7B,CAAC;SAAM,IAAI,MAAM,CAAC,aAAa,KAAK,IAAI,EAAE,CAAC;QACzC,MAAM,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAEzB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC;AAC7D,CAAC;AAED;;GAEG;AACH,SAAgB,yBAAyB;IAKvC,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,IAAI,CAAC,MAAM,CAAC,aAAa;QAAE,OAAO,IAAI,CAAC;IAEvC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAChD,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"grid.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/grid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,WAAW,SAiFpB,CAAC"}
|
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.gridCommand = void 0;
|
|
7
|
-
const commander_1 = require("commander");
|
|
8
|
-
const exchange_factory_1 = require("../exchange-factory");
|
|
9
|
-
const error_handler_1 = require("../utils/error-handler");
|
|
10
|
-
const strategy_factory_1 = require("../../core/strategy/strategy-factory");
|
|
11
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
12
|
-
exports.gridCommand = new commander_1.Command('grid')
|
|
13
|
-
.description('Start grid trading strategy on specified exchange and symbol')
|
|
14
|
-
.requiredOption('-e, --exchange <exchange>', 'Exchange to trade on (mexc)')
|
|
15
|
-
.requiredOption('-s, --symbol <symbol>', 'Trading pair (INDYUSDT, INDY/USDT, BTCUSDT, etc.)')
|
|
16
|
-
.option('--levels <number>', 'Number of grid levels each side', '5')
|
|
17
|
-
.option('--spacing <decimal>', 'Spacing between levels as decimal (0.02 = 2%)', '0.02')
|
|
18
|
-
.option('--size <number>', 'Order size in quote currency', '50')
|
|
19
|
-
.option('--confidence <decimal>', 'Minimum price confidence (0.6 = 60%)', '0.6')
|
|
20
|
-
.option('--deviation <decimal>', 'Price deviation threshold (0.015 = 1.5%)', '0.015')
|
|
21
|
-
.option('--debounce <ms>', 'Adjustment debounce time in ms', '2000')
|
|
22
|
-
.option('--max-position <decimal>', 'Maximum position size as % of balance (0.8 = 80%)', '0.8')
|
|
23
|
-
.option('--safety-reserve <decimal>', 'Safety reserve as % of balance (0.2 = 20%)', '0.2')
|
|
24
|
-
.option('--dry-run', 'Simulate trading without placing real orders')
|
|
25
|
-
.action(async (options) => {
|
|
26
|
-
let strategy = null;
|
|
27
|
-
const shutdown = async (signal) => {
|
|
28
|
-
console.log(chalk_1.default.yellow(`\n${signal} received. Stopping grid strategy...`));
|
|
29
|
-
if (strategy) {
|
|
30
|
-
try {
|
|
31
|
-
await strategy.stop();
|
|
32
|
-
console.log(chalk_1.default.green('Grid strategy stopped successfully.'));
|
|
33
|
-
}
|
|
34
|
-
catch (error) {
|
|
35
|
-
console.error(chalk_1.default.red('Error stopping strategy:'), error);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
await exchange_factory_1.ExchangeFactory.disconnectAll();
|
|
39
|
-
process.exit(0);
|
|
40
|
-
};
|
|
41
|
-
process.on('SIGTERM', () => shutdown('SIGTERM'));
|
|
42
|
-
process.on('SIGINT', () => shutdown('SIGINT'));
|
|
43
|
-
await (0, error_handler_1.executeCommand)(async () => {
|
|
44
|
-
try {
|
|
45
|
-
console.log(chalk_1.default.blue('š Starting Grid Trading Strategy'));
|
|
46
|
-
console.log(chalk_1.default.gray(`Exchange: ${options.exchange.toUpperCase()}`));
|
|
47
|
-
console.log(chalk_1.default.gray(`Symbol: ${options.symbol.toUpperCase()}`));
|
|
48
|
-
console.log(chalk_1.default.gray(`Grid Levels: ${options.levels} each side`));
|
|
49
|
-
console.log(chalk_1.default.gray(`Grid Spacing: ${(parseFloat(options.spacing) * 100).toFixed(1)}%`));
|
|
50
|
-
console.log(chalk_1.default.gray(`Order Size: $${options.size}`));
|
|
51
|
-
console.log(chalk_1.default.gray(`Max Position: ${(parseFloat(options.maxPosition) * 100).toFixed(0)}%`));
|
|
52
|
-
console.log(chalk_1.default.gray(`Safety Reserve: ${(parseFloat(options.safetyReserve) * 100).toFixed(0)}%`));
|
|
53
|
-
if (options.dryRun) {
|
|
54
|
-
console.log(chalk_1.default.yellow('ā ļø DRY RUN MODE - No real orders will be placed'));
|
|
55
|
-
}
|
|
56
|
-
const config = {
|
|
57
|
-
strategy: 'grid',
|
|
58
|
-
exchange: options.exchange,
|
|
59
|
-
symbol: options.symbol
|
|
60
|
-
};
|
|
61
|
-
const params = {
|
|
62
|
-
gridLevels: parseInt(options.levels),
|
|
63
|
-
gridSpacing: parseFloat(options.spacing),
|
|
64
|
-
orderSize: parseFloat(options.size),
|
|
65
|
-
minConfidence: parseFloat(options.confidence),
|
|
66
|
-
priceDeviationThreshold: parseFloat(options.deviation),
|
|
67
|
-
adjustmentDebounce: parseInt(options.debounce),
|
|
68
|
-
maxPositionSize: parseFloat(options.maxPosition),
|
|
69
|
-
safetyReservePercentage: parseFloat(options.safetyReserve)
|
|
70
|
-
};
|
|
71
|
-
strategy = await strategy_factory_1.StrategyFactory.create(config, params);
|
|
72
|
-
console.log(chalk_1.default.green('ā
Grid strategy initialized successfully'));
|
|
73
|
-
console.log(chalk_1.default.blue('š Starting grid strategy...'));
|
|
74
|
-
await strategy.start();
|
|
75
|
-
console.log(chalk_1.default.green('ā
Grid strategy is now running!'));
|
|
76
|
-
console.log(chalk_1.default.gray('Press Ctrl+C to stop the strategy gracefully'));
|
|
77
|
-
await new Promise(() => { });
|
|
78
|
-
}
|
|
79
|
-
catch (error) {
|
|
80
|
-
(0, error_handler_1.handleError)(error, 'Grid Strategy');
|
|
81
|
-
}
|
|
82
|
-
}, 'grid strategy');
|
|
83
|
-
});
|
|
84
|
-
exports.gridCommand.addHelpText('after', `
|
|
85
|
-
Examples:
|
|
86
|
-
$ openmm grid --exchange mexc --symbol INDYUSDT # Start INDY/USDT grid with defaults
|
|
87
|
-
$ openmm grid --exchange mexc --symbol INDY/USDT --levels 7 --size 100 # Custom parameters
|
|
88
|
-
$ openmm grid --exchange mexc --symbol BTCUSDT --spacing 0.015 # BTC grid with 1.5% spacing
|
|
89
|
-
$ openmm grid --exchange mexc --symbol INDYUSDT --dry-run # Test mode (no real orders)
|
|
90
|
-
|
|
91
|
-
Grid Strategy Parameters:
|
|
92
|
-
--levels: Number of buy and sell orders each side (default: 5, range: 1-20)
|
|
93
|
-
--spacing: Price spacing between grid levels (default: 0.02 = 2%)
|
|
94
|
-
--size: Order size in quote currency like USDT (default: 50)
|
|
95
|
-
--confidence: Minimum price confidence to trade (default: 0.6 = 60%)
|
|
96
|
-
--deviation: Price movement % to trigger grid recreation (default: 0.015 = 1.5%)
|
|
97
|
-
--debounce: Delay between grid adjustments in ms (default: 2000ms)
|
|
98
|
-
--max-position: Maximum position size as % of balance (default: 0.8 = 80%)
|
|
99
|
-
--safety-reserve: Safety reserve as % of balance (default: 0.2 = 20%)
|
|
100
|
-
|
|
101
|
-
Note: Ensure MEXC_API_KEY and MEXC_SECRET_KEY environment variables are set.
|
|
102
|
-
`);
|
|
103
|
-
//# sourceMappingURL=grid.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"grid.js","sourceRoot":"","sources":["../../../src/cli/commands/grid.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"multi-trade.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/multi-trade.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,eAAO,MAAM,iBAAiB,SA+J1B,CAAC"}
|
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.multiTradeCommand = void 0;
|
|
7
|
-
const commander_1 = require("commander");
|
|
8
|
-
const exchange_factory_1 = require("../exchange-factory");
|
|
9
|
-
const error_handler_1 = require("../utils/error-handler");
|
|
10
|
-
const strategy_factory_1 = require("../../core/strategy/strategy-factory");
|
|
11
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
12
|
-
exports.multiTradeCommand = new commander_1.Command('multi-trade')
|
|
13
|
-
.description('Start trading with the same strategy across multiple exchanges simultaneously')
|
|
14
|
-
.requiredOption('-s, --strategy <strategy>', 'Trading strategy to use (grid)')
|
|
15
|
-
.requiredOption('--exchanges <exchanges>', 'Comma-separated exchanges (e.g., mexc,bitget,gateio)')
|
|
16
|
-
.requiredOption('--symbol <symbol>', 'Trading pair (SNEK/USDT, INDY/USDT, etc.)')
|
|
17
|
-
.option('--levels <number>', 'Grid: Number of levels each side (default: 5)', '5')
|
|
18
|
-
.option('--spacing <decimal>', 'Grid: Spacing between levels as decimal (0.02 = 2%)', '0.02')
|
|
19
|
-
.option('--size <number>', 'Grid: Order size in quote currency (default: 50)', '50')
|
|
20
|
-
.option('--confidence <decimal>', 'Grid: Minimum price confidence (0.6 = 60%)', '0.6')
|
|
21
|
-
.option('--deviation <decimal>', 'Grid: Price deviation threshold (0.015 = 1.5%)', '0.015')
|
|
22
|
-
.option('--debounce <ms>', 'Grid: Adjustment debounce time in ms (default: 2000)', '2000')
|
|
23
|
-
.option('--max-position <decimal>', 'Grid: Maximum position size as % of balance (0.8 = 80%)', '0.8')
|
|
24
|
-
.option('--safety-reserve <decimal>', 'Grid: Safety reserve as % of balance (0.2 = 20%)', '0.2')
|
|
25
|
-
.option('--dry-run', 'Simulate trading without placing real orders')
|
|
26
|
-
.option('--stagger <ms>', 'Stagger start time between exchanges in ms (default: 1000)', '1000')
|
|
27
|
-
.action(async (options) => {
|
|
28
|
-
const strategies = [];
|
|
29
|
-
let isShuttingDown = false;
|
|
30
|
-
const shutdown = async (signal) => {
|
|
31
|
-
if (isShuttingDown)
|
|
32
|
-
return;
|
|
33
|
-
isShuttingDown = true;
|
|
34
|
-
console.log(chalk_1.default.yellow(`\n${signal} received. Stopping all strategies...`));
|
|
35
|
-
const stopPromises = strategies.map(async ({ exchange, strategy }) => {
|
|
36
|
-
try {
|
|
37
|
-
console.log(chalk_1.default.gray(`Stopping ${exchange.toUpperCase()} strategy...`));
|
|
38
|
-
await strategy.stop();
|
|
39
|
-
console.log(chalk_1.default.green(`ā
${exchange.toUpperCase()} strategy stopped`));
|
|
40
|
-
}
|
|
41
|
-
catch (error) {
|
|
42
|
-
console.error(chalk_1.default.red(`ā Error stopping ${exchange.toUpperCase()} strategy:`), error);
|
|
43
|
-
}
|
|
44
|
-
});
|
|
45
|
-
await Promise.allSettled(stopPromises);
|
|
46
|
-
await exchange_factory_1.ExchangeFactory.disconnectAll();
|
|
47
|
-
console.log(chalk_1.default.green('All strategies stopped successfully.'));
|
|
48
|
-
process.exit(0);
|
|
49
|
-
};
|
|
50
|
-
process.on('SIGTERM', () => shutdown('SIGTERM'));
|
|
51
|
-
process.on('SIGINT', () => shutdown('SIGINT'));
|
|
52
|
-
await (0, error_handler_1.executeCommand)(async () => {
|
|
53
|
-
const strategyType = options.strategy.toLowerCase();
|
|
54
|
-
const exchanges = options.exchanges.split(',').map((ex) => ex.trim());
|
|
55
|
-
const staggerMs = parseInt(options.stagger);
|
|
56
|
-
const validExchanges = ['mexc', 'bitget', 'gateio'];
|
|
57
|
-
for (const exchange of exchanges) {
|
|
58
|
-
if (!validExchanges.includes(exchange)) {
|
|
59
|
-
throw new Error(`Invalid exchange: ${exchange}. Supported: ${validExchanges.join(', ')}`);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
try {
|
|
63
|
-
console.log(chalk_1.default.blue('š Starting Multi-Exchange Trading Strategy'));
|
|
64
|
-
console.log(chalk_1.default.gray(`Strategy: ${options.strategy.toUpperCase()}`));
|
|
65
|
-
console.log(chalk_1.default.gray(`Exchanges: ${exchanges.map(ex => ex.toUpperCase()).join(', ')}`));
|
|
66
|
-
console.log(chalk_1.default.gray(`Symbol: ${options.symbol.toUpperCase()}`));
|
|
67
|
-
if (options.dryRun) {
|
|
68
|
-
console.log(chalk_1.default.yellow('ā ļø DRY RUN MODE - No real orders will be placed'));
|
|
69
|
-
}
|
|
70
|
-
if (staggerMs > 0) {
|
|
71
|
-
console.log(chalk_1.default.gray(`Stagger Time: ${staggerMs}ms between exchanges`));
|
|
72
|
-
}
|
|
73
|
-
let params = {};
|
|
74
|
-
if (strategyType === 'grid') {
|
|
75
|
-
console.log(chalk_1.default.gray(`Grid Levels: ${options.levels} each side`));
|
|
76
|
-
console.log(chalk_1.default.gray(`Grid Spacing: ${(parseFloat(options.spacing) * 100).toFixed(1)}%`));
|
|
77
|
-
console.log(chalk_1.default.gray(`Order Size: $${options.size} per exchange`));
|
|
78
|
-
console.log(chalk_1.default.gray(`Max Position: ${(parseFloat(options.maxPosition) * 100).toFixed(0)}%`));
|
|
79
|
-
console.log(chalk_1.default.gray(`Safety Reserve: ${(parseFloat(options.safetyReserve) * 100).toFixed(0)}%`));
|
|
80
|
-
params = {
|
|
81
|
-
gridLevels: parseInt(options.levels),
|
|
82
|
-
gridSpacing: parseFloat(options.spacing),
|
|
83
|
-
orderSize: parseFloat(options.size),
|
|
84
|
-
minConfidence: parseFloat(options.confidence),
|
|
85
|
-
priceDeviationThreshold: parseFloat(options.deviation),
|
|
86
|
-
adjustmentDebounce: parseInt(options.debounce),
|
|
87
|
-
maxPositionSize: parseFloat(options.maxPosition),
|
|
88
|
-
safetyReservePercentage: parseFloat(options.safetyReserve),
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
console.log(chalk_1.default.blue('āļø Creating strategies for all exchanges...'));
|
|
92
|
-
for (const exchange of exchanges) {
|
|
93
|
-
const config = {
|
|
94
|
-
strategy: strategyType,
|
|
95
|
-
exchange,
|
|
96
|
-
symbol: options.symbol,
|
|
97
|
-
};
|
|
98
|
-
console.log(chalk_1.default.gray(`Creating ${exchange.toUpperCase()} strategy...`));
|
|
99
|
-
const strategy = await strategy_factory_1.StrategyFactory.create(config, params);
|
|
100
|
-
strategies.push({
|
|
101
|
-
exchange,
|
|
102
|
-
strategy,
|
|
103
|
-
config,
|
|
104
|
-
params,
|
|
105
|
-
});
|
|
106
|
-
console.log(chalk_1.default.green(`ā
${exchange.toUpperCase()} strategy initialized`));
|
|
107
|
-
}
|
|
108
|
-
console.log(chalk_1.default.green(`ā
All ${strategies.length} strategies initialized successfully`));
|
|
109
|
-
console.log(chalk_1.default.blue('š Starting all strategies...'));
|
|
110
|
-
for (let i = 0; i < strategies.length; i++) {
|
|
111
|
-
const { exchange, strategy } = strategies[i];
|
|
112
|
-
if (i > 0 && staggerMs > 0) {
|
|
113
|
-
console.log(chalk_1.default.gray(`Waiting ${staggerMs}ms before starting ${exchange.toUpperCase()}...`));
|
|
114
|
-
await new Promise(resolve => setTimeout(resolve, staggerMs));
|
|
115
|
-
}
|
|
116
|
-
console.log(chalk_1.default.blue(`š Starting ${exchange.toUpperCase()} strategy...`));
|
|
117
|
-
await strategy.start();
|
|
118
|
-
console.log(chalk_1.default.green(`ā
${exchange.toUpperCase()} strategy is running!`));
|
|
119
|
-
}
|
|
120
|
-
console.log(chalk_1.default.green('š All strategies are now running simultaneously!'));
|
|
121
|
-
console.log(chalk_1.default.gray('Press Ctrl+C to stop all strategies gracefully'));
|
|
122
|
-
console.log(chalk_1.default.blue('\nš Active Strategies:'));
|
|
123
|
-
strategies.forEach(({ exchange }) => {
|
|
124
|
-
console.log(chalk_1.default.green(` ā
${exchange.toUpperCase()}: ${options.symbol} ${options.strategy.toUpperCase()}`));
|
|
125
|
-
});
|
|
126
|
-
console.log('');
|
|
127
|
-
await new Promise(() => { });
|
|
128
|
-
}
|
|
129
|
-
catch (error) {
|
|
130
|
-
isShuttingDown = true;
|
|
131
|
-
await Promise.allSettled(strategies.map(({ strategy }) => strategy.stop().catch(() => { })));
|
|
132
|
-
(0, error_handler_1.handleError)(error, 'Multi-Exchange Trading Strategy');
|
|
133
|
-
}
|
|
134
|
-
}, 'multi-exchange trading strategy');
|
|
135
|
-
});
|
|
136
|
-
exports.multiTradeCommand.addHelpText('after', `
|
|
137
|
-
Examples:
|
|
138
|
-
$ openmm multi-trade --strategy grid --exchanges mexc,bitget,gateio --symbol SNEK/USDT
|
|
139
|
-
# Run SNEK/USDT grid on all three exchanges simultaneously
|
|
140
|
-
|
|
141
|
-
$ openmm multi-trade --strategy grid --exchanges mexc,bitget --symbol INDY/USDT --levels 10
|
|
142
|
-
# Run INDY/USDT grid on MEXC and Bitget with 10 levels
|
|
143
|
-
|
|
144
|
-
$ openmm multi-trade --strategy grid --exchanges bitget,gateio --symbol BTC/USDT --size 100 --spacing 0.01
|
|
145
|
-
# Run BTC/USDT grid on Bitget and Gate.io with $100 orders and 1% spacing
|
|
146
|
-
|
|
147
|
-
$ openmm multi-trade --strategy grid --exchanges mexc,gateio --symbol SNEK/USDT --stagger 2000
|
|
148
|
-
# Start MEXC first, then Gate.io 2 seconds later
|
|
149
|
-
|
|
150
|
-
$ openmm multi-trade --strategy grid --exchanges mexc,bitget,gateio --symbol SNEK/USDT --dry-run
|
|
151
|
-
# Test mode across all exchanges without real orders
|
|
152
|
-
|
|
153
|
-
Multi-Exchange Strategy Features:
|
|
154
|
-
⢠Simultaneous execution across multiple exchanges
|
|
155
|
-
⢠Independent risk management per exchange
|
|
156
|
-
⢠Coordinated shutdown with Ctrl+C
|
|
157
|
-
⢠Optional staggered start times
|
|
158
|
-
⢠Real-time status monitoring
|
|
159
|
-
⢠Unified parameter configuration
|
|
160
|
-
|
|
161
|
-
Stagger Option:
|
|
162
|
-
--stagger: Delay between starting each exchange (in milliseconds)
|
|
163
|
-
Use this to avoid hitting API rate limits during initialization
|
|
164
|
-
|
|
165
|
-
Exchange Combinations:
|
|
166
|
-
⢠All three: mexc,bitget,gateio
|
|
167
|
-
⢠Any two: mexc,bitget or mexc,gateio or bitget,gateio
|
|
168
|
-
⢠Single exchange: Use regular 'trade' command instead
|
|
169
|
-
|
|
170
|
-
Note: Each exchange requires its own API credentials:
|
|
171
|
-
- MEXC: MEXC_API_KEY and MEXC_SECRET_KEY
|
|
172
|
-
- Bitget: BITGET_API_KEY, BITGET_SECRET, and BITGET_PASSPHRASE
|
|
173
|
-
- Gate.io: GATEIO_API_KEY and GATEIO_SECRET
|
|
174
|
-
`);
|
|
175
|
-
//# sourceMappingURL=multi-trade.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"multi-trade.js","sourceRoot":"","sources":["../../../src/cli/commands/multi-trade.ts"],"names":[],"mappings":"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"}
|