@3rd-eye-labs/openmm 0.1.6 → 0.1.7
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 +0 -2
- package/dist/cli/commands/grid.d.ts +3 -0
- package/dist/cli/commands/grid.d.ts.map +1 -0
- package/dist/cli/commands/grid.js +103 -0
- package/dist/cli/commands/grid.js.map +1 -0
- package/dist/cli/commands/multi-trade.d.ts +3 -0
- package/dist/cli/commands/multi-trade.d.ts.map +1 -0
- package/dist/cli/commands/multi-trade.js +175 -0
- package/dist/cli/commands/multi-trade.js.map +1 -0
- package/dist/cli/pool-discovery.d.ts +56 -0
- package/dist/cli/pool-discovery.d.ts.map +1 -0
- package/dist/cli/pool-discovery.js +283 -0
- package/dist/cli/pool-discovery.js.map +1 -0
- package/dist/config/environment.d.ts +19 -0
- package/dist/config/environment.d.ts.map +1 -1
- package/dist/config/environment.js +87 -58
- package/dist/config/environment.js.map +1 -1
- package/dist/core/price-aggregation/price-cache.d.ts +55 -0
- package/dist/core/price-aggregation/price-cache.d.ts.map +1 -0
- package/dist/core/price-aggregation/price-cache.js +152 -0
- package/dist/core/price-aggregation/price-cache.js.map +1 -0
- package/dist/examples/mexc-connector-comprehensive-test.d.ts +15 -0
- package/dist/examples/mexc-connector-comprehensive-test.d.ts.map +1 -0
- package/dist/examples/mexc-connector-comprehensive-test.js +514 -0
- package/dist/examples/mexc-connector-comprehensive-test.js.map +1 -0
- package/dist/examples/mexc-order-update-test.d.ts +4 -0
- package/dist/examples/mexc-order-update-test.d.ts.map +1 -0
- package/dist/examples/mexc-order-update-test.js +186 -0
- package/dist/examples/mexc-order-update-test.js.map +1 -0
- package/dist/examples/mexc-test.d.ts +9 -0
- package/dist/examples/mexc-test.d.ts.map +1 -0
- package/dist/examples/mexc-test.js +218 -0
- package/dist/examples/mexc-test.js.map +1 -0
- package/dist/examples/mexc-trades-debug.d.ts +2 -0
- package/dist/examples/mexc-trades-debug.d.ts.map +1 -0
- package/dist/examples/mexc-trades-debug.js +101 -0
- package/dist/examples/mexc-trades-debug.js.map +1 -0
- package/dist/examples/mexc-trades-subscription-debug.d.ts +2 -0
- package/dist/examples/mexc-trades-subscription-debug.d.ts.map +1 -0
- package/dist/examples/mexc-trades-subscription-debug.js +150 -0
- package/dist/examples/mexc-trades-subscription-debug.js.map +1 -0
- package/dist/examples/mexc-websocket-test.d.ts +8 -0
- package/dist/examples/mexc-websocket-test.d.ts.map +1 -0
- package/dist/examples/mexc-websocket-test.js +115 -0
- package/dist/examples/mexc-websocket-test.js.map +1 -0
- package/dist/examples/test-protobuf-status-detection.d.ts +9 -0
- package/dist/examples/test-protobuf-status-detection.d.ts.map +1 -0
- package/dist/examples/test-protobuf-status-detection.js +83 -0
- package/dist/examples/test-protobuf-status-detection.js.map +1 -0
- package/dist/exchanges/base-exchange-connector.d.ts +33 -0
- package/dist/exchanges/base-exchange-connector.d.ts.map +1 -0
- package/dist/exchanges/base-exchange-connector.js +55 -0
- package/dist/exchanges/base-exchange-connector.js.map +1 -0
- package/dist/exchanges/kraken/test-kraken-websocket.d.ts +19 -0
- package/dist/exchanges/kraken/test-kraken-websocket.d.ts.map +1 -0
- package/dist/exchanges/kraken/test-kraken-websocket.js +413 -0
- package/dist/exchanges/kraken/test-kraken-websocket.js.map +1 -0
- package/dist/mcp/resources/index.d.ts +3 -0
- package/dist/mcp/resources/index.d.ts.map +1 -0
- package/dist/mcp/resources/index.js +11 -0
- package/dist/mcp/resources/index.js.map +1 -0
- package/dist/mcp/server.d.ts +4 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +29 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +3 -0
- package/dist/mcp/tools/index.d.ts.map +1 -0
- package/dist/mcp/tools/index.js +12 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/tests/fixtures/test-helpers.d.ts +5 -0
- package/dist/tests/fixtures/test-helpers.d.ts.map +1 -0
- package/dist/tests/fixtures/test-helpers.js +8 -0
- package/dist/tests/fixtures/test-helpers.js.map +1 -0
- package/dist/tests/integration/exchanges/mexc/mexc-integration.test.d.ts +2 -0
- package/dist/tests/integration/exchanges/mexc/mexc-integration.test.d.ts.map +1 -0
- package/dist/tests/integration/exchanges/mexc/mexc-integration.test.js +237 -0
- package/dist/tests/integration/exchanges/mexc/mexc-integration.test.js.map +1 -0
- package/dist/tests/integration/price-aggregation/cardano-price-service.test.d.ts +2 -0
- package/dist/tests/integration/price-aggregation/cardano-price-service.test.d.ts.map +1 -0
- package/dist/tests/integration/price-aggregation/cardano-price-service.test.js +57 -0
- package/dist/tests/integration/price-aggregation/cardano-price-service.test.js.map +1 -0
- package/dist/tests/integration/price-aggregation/price-aggregation-integration.test.d.ts +2 -0
- package/dist/tests/integration/price-aggregation/price-aggregation-integration.test.d.ts.map +1 -0
- package/dist/tests/integration/price-aggregation/price-aggregation-integration.test.js +141 -0
- package/dist/tests/integration/price-aggregation/price-aggregation-integration.test.js.map +1 -0
- package/dist/tests/integration/strategies/grid/grid-strategy-e2e.test.d.ts +2 -0
- package/dist/tests/integration/strategies/grid/grid-strategy-e2e.test.d.ts.map +1 -0
- package/dist/tests/integration/strategies/grid/grid-strategy-e2e.test.js +375 -0
- package/dist/tests/integration/strategies/grid/grid-strategy-e2e.test.js.map +1 -0
- package/dist/tests/unit/cli/exchange-factory.test.d.ts +2 -0
- package/dist/tests/unit/cli/exchange-factory.test.d.ts.map +1 -0
- package/dist/tests/unit/cli/exchange-factory.test.js +148 -0
- package/dist/tests/unit/cli/exchange-factory.test.js.map +1 -0
- package/dist/tests/unit/config/environment.test.d.ts +2 -0
- package/dist/tests/unit/config/environment.test.d.ts.map +1 -0
- package/dist/tests/unit/config/environment.test.js +158 -0
- package/dist/tests/unit/config/environment.test.js.map +1 -0
- package/dist/tests/unit/config/launcher-config.test.d.ts +2 -0
- package/dist/tests/unit/config/launcher-config.test.d.ts.map +1 -0
- package/dist/tests/unit/config/launcher-config.test.js +117 -0
- package/dist/tests/unit/config/launcher-config.test.js.map +1 -0
- package/dist/tests/unit/config/price-aggregation.test.d.ts +2 -0
- package/dist/tests/unit/config/price-aggregation.test.d.ts.map +1 -0
- package/dist/tests/unit/config/price-aggregation.test.js +144 -0
- package/dist/tests/unit/config/price-aggregation.test.js.map +1 -0
- package/dist/tests/unit/core/exchange/base-exchange-connector.test.d.ts +2 -0
- package/dist/tests/unit/core/exchange/base-exchange-connector.test.d.ts.map +1 -0
- package/dist/tests/unit/core/exchange/base-exchange-connector.test.js +191 -0
- package/dist/tests/unit/core/exchange/base-exchange-connector.test.js.map +1 -0
- package/dist/tests/unit/core/exchange/base-exchange-data-mapper.test.d.ts +2 -0
- package/dist/tests/unit/core/exchange/base-exchange-data-mapper.test.d.ts.map +1 -0
- package/dist/tests/unit/core/exchange/base-exchange-data-mapper.test.js +324 -0
- package/dist/tests/unit/core/exchange/base-exchange-data-mapper.test.js.map +1 -0
- package/dist/tests/unit/core/price-aggregation/cardano-price-service.test.d.ts +2 -0
- package/dist/tests/unit/core/price-aggregation/cardano-price-service.test.d.ts.map +1 -0
- package/dist/tests/unit/core/price-aggregation/cardano-price-service.test.js +177 -0
- package/dist/tests/unit/core/price-aggregation/cardano-price-service.test.js.map +1 -0
- package/dist/tests/unit/core/price-aggregation/iris-api-client.test.d.ts +2 -0
- package/dist/tests/unit/core/price-aggregation/iris-api-client.test.d.ts.map +1 -0
- package/dist/tests/unit/core/price-aggregation/iris-api-client.test.js +168 -0
- package/dist/tests/unit/core/price-aggregation/iris-api-client.test.js.map +1 -0
- package/dist/tests/unit/core/price-aggregation/iris-pool-discovery.test.d.ts +2 -0
- package/dist/tests/unit/core/price-aggregation/iris-pool-discovery.test.d.ts.map +1 -0
- package/dist/tests/unit/core/price-aggregation/iris-pool-discovery.test.js +217 -0
- package/dist/tests/unit/core/price-aggregation/iris-pool-discovery.test.js.map +1 -0
- package/dist/tests/unit/core/price-aggregation/price-calculator.test.d.ts +2 -0
- package/dist/tests/unit/core/price-aggregation/price-calculator.test.d.ts.map +1 -0
- package/dist/tests/unit/core/price-aggregation/price-calculator.test.js +229 -0
- package/dist/tests/unit/core/price-aggregation/price-calculator.test.js.map +1 -0
- package/dist/tests/unit/core/risk-management/risk-manager.test.d.ts +2 -0
- package/dist/tests/unit/core/risk-management/risk-manager.test.d.ts.map +1 -0
- package/dist/tests/unit/core/risk-management/risk-manager.test.js +194 -0
- package/dist/tests/unit/core/risk-management/risk-manager.test.js.map +1 -0
- package/dist/tests/unit/core/strategy/base-strategy.test.d.ts +2 -0
- package/dist/tests/unit/core/strategy/base-strategy.test.d.ts.map +1 -0
- package/dist/tests/unit/core/strategy/base-strategy.test.js +254 -0
- package/dist/tests/unit/core/strategy/base-strategy.test.js.map +1 -0
- package/dist/tests/unit/core/strategy/strategy-factory.test.d.ts +2 -0
- package/dist/tests/unit/core/strategy/strategy-factory.test.d.ts.map +1 -0
- package/dist/tests/unit/core/strategy/strategy-factory.test.js +213 -0
- package/dist/tests/unit/core/strategy/strategy-factory.test.js.map +1 -0
- package/dist/tests/unit/exchanges/mexc/mexc-auth.test.d.ts +2 -0
- package/dist/tests/unit/exchanges/mexc/mexc-auth.test.d.ts.map +1 -0
- package/dist/tests/unit/exchanges/mexc/mexc-auth.test.js +452 -0
- package/dist/tests/unit/exchanges/mexc/mexc-auth.test.js.map +1 -0
- package/dist/tests/unit/exchanges/mexc/mexc-connector.test.d.ts +2 -0
- package/dist/tests/unit/exchanges/mexc/mexc-connector.test.d.ts.map +1 -0
- package/dist/tests/unit/exchanges/mexc/mexc-connector.test.js +1419 -0
- package/dist/tests/unit/exchanges/mexc/mexc-connector.test.js.map +1 -0
- package/dist/tests/unit/exchanges/mexc/mexc-data-mapper.test.d.ts +2 -0
- package/dist/tests/unit/exchanges/mexc/mexc-data-mapper.test.d.ts.map +1 -0
- package/dist/tests/unit/exchanges/mexc/mexc-data-mapper.test.js +435 -0
- package/dist/tests/unit/exchanges/mexc/mexc-data-mapper.test.js.map +1 -0
- package/dist/tests/unit/exchanges/mexc/mexc-protobuf-decoder.test.d.ts +2 -0
- package/dist/tests/unit/exchanges/mexc/mexc-protobuf-decoder.test.d.ts.map +1 -0
- package/dist/tests/unit/exchanges/mexc/mexc-protobuf-decoder.test.js +314 -0
- package/dist/tests/unit/exchanges/mexc/mexc-protobuf-decoder.test.js.map +1 -0
- package/dist/tests/unit/exchanges/mexc/mexc-protobuf-status-detection.test.d.ts +2 -0
- package/dist/tests/unit/exchanges/mexc/mexc-protobuf-status-detection.test.d.ts.map +1 -0
- package/dist/tests/unit/exchanges/mexc/mexc-protobuf-status-detection.test.js +178 -0
- package/dist/tests/unit/exchanges/mexc/mexc-protobuf-status-detection.test.js.map +1 -0
- package/dist/tests/unit/exchanges/mexc/mexc-user-stream.test.d.ts +2 -0
- package/dist/tests/unit/exchanges/mexc/mexc-user-stream.test.d.ts.map +1 -0
- package/dist/tests/unit/exchanges/mexc/mexc-user-stream.test.js +502 -0
- package/dist/tests/unit/exchanges/mexc/mexc-user-stream.test.js.map +1 -0
- package/dist/tests/unit/exchanges/mexc/mexc-utils.test.d.ts +2 -0
- package/dist/tests/unit/exchanges/mexc/mexc-utils.test.d.ts.map +1 -0
- package/dist/tests/unit/exchanges/mexc/mexc-utils.test.js +317 -0
- package/dist/tests/unit/exchanges/mexc/mexc-utils.test.js.map +1 -0
- package/dist/tests/unit/exchanges/mexc/mexc-websocket.test.d.ts +2 -0
- package/dist/tests/unit/exchanges/mexc/mexc-websocket.test.d.ts.map +1 -0
- package/dist/tests/unit/exchanges/mexc/mexc-websocket.test.js +843 -0
- package/dist/tests/unit/exchanges/mexc/mexc-websocket.test.js.map +1 -0
- package/dist/tests/unit/strategies/grid/grid-calculator.test.d.ts +2 -0
- package/dist/tests/unit/strategies/grid/grid-calculator.test.d.ts.map +1 -0
- package/dist/tests/unit/strategies/grid/grid-calculator.test.js +67 -0
- package/dist/tests/unit/strategies/grid/grid-calculator.test.js.map +1 -0
- package/dist/tests/unit/strategies/grid/grid-order-manager.test.d.ts +2 -0
- package/dist/tests/unit/strategies/grid/grid-order-manager.test.d.ts.map +1 -0
- package/dist/tests/unit/strategies/grid/grid-order-manager.test.js +211 -0
- package/dist/tests/unit/strategies/grid/grid-order-manager.test.js.map +1 -0
- package/dist/tests/unit/strategies/grid/grid-strategy-simple.test.d.ts +2 -0
- package/dist/tests/unit/strategies/grid/grid-strategy-simple.test.d.ts.map +1 -0
- package/dist/tests/unit/strategies/grid/grid-strategy-simple.test.js +197 -0
- package/dist/tests/unit/strategies/grid/grid-strategy-simple.test.js.map +1 -0
- package/dist/tests/unit/strategies/grid/grid-strategy.test.d.ts +2 -0
- package/dist/tests/unit/strategies/grid/grid-strategy.test.d.ts.map +1 -0
- package/dist/tests/unit/strategies/grid/grid-strategy.test.js +429 -0
- package/dist/tests/unit/strategies/grid/grid-strategy.test.js.map +1 -0
- package/dist/tests/unit/utils/logger.test.d.ts +2 -0
- package/dist/tests/unit/utils/logger.test.d.ts.map +1 -0
- package/dist/tests/unit/utils/logger.test.js +260 -0
- package/dist/tests/unit/utils/logger.test.js.map +1 -0
- package/dist/tests/unit/utils/symbol-utils.test.d.ts +2 -0
- package/dist/tests/unit/utils/symbol-utils.test.d.ts.map +1 -0
- package/dist/tests/unit/utils/symbol-utils.test.js +178 -0
- package/dist/tests/unit/utils/symbol-utils.test.js.map +1 -0
- package/dist/types/price-aggregation.d.ts +31 -0
- package/dist/types/price-aggregation.d.ts.map +1 -0
- package/dist/types/price-aggregation.js +6 -0
- package/dist/types/price-aggregation.js.map +1 -0
- package/dist/utils/crypto.d.ts +15 -0
- package/dist/utils/crypto.d.ts.map +1 -0
- package/dist/utils/crypto.js +50 -0
- package/dist/utils/crypto.js.map +1 -0
- package/dist/utils/validation.d.ts +36 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +174 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Pool Discovery CLI
|
|
5
|
+
* Command-line tool to discover Cardano liquidity pool identifiers and metrics
|
|
6
|
+
* for any native token to be used in Market Making strategies
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.PoolDiscoveryCLI = void 0;
|
|
10
|
+
const iris_pool_discovery_1 = require("../core/price-aggregation/iris-pool-discovery");
|
|
11
|
+
const iris_api_client_1 = require("../core/price-aggregation/iris-api-client");
|
|
12
|
+
const price_aggregation_1 = require("../config/price-aggregation");
|
|
13
|
+
class PoolDiscoveryCLI {
|
|
14
|
+
constructor() {
|
|
15
|
+
this.poolDiscovery = new iris_pool_discovery_1.IrisPoolDiscovery();
|
|
16
|
+
this.irisClient = new iris_api_client_1.IrisApiClient();
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Main discovery function for any Cardano native token
|
|
20
|
+
*/
|
|
21
|
+
async discoverTokenPools(tokenSymbol, options = {}) {
|
|
22
|
+
const symbol = tokenSymbol.toUpperCase();
|
|
23
|
+
if (!(0, price_aggregation_1.isTokenSupported)(symbol)) {
|
|
24
|
+
throw new Error(`Unsupported token: ${symbol}. Supported tokens: ${(0, price_aggregation_1.getSupportedTokens)().join(', ')}`);
|
|
25
|
+
}
|
|
26
|
+
const tokenConfig = (0, price_aggregation_1.getTokenConfig)(symbol);
|
|
27
|
+
const { limit = 10, minLiquidity, showAll = false } = options;
|
|
28
|
+
console.log(`🔍 Discovering liquidity pools for ${symbol} token...`);
|
|
29
|
+
console.log(`Policy ID: ${tokenConfig.policyId}`);
|
|
30
|
+
console.log(`Asset Name (hex): ${tokenConfig.assetName}`);
|
|
31
|
+
console.log('─'.repeat(80));
|
|
32
|
+
try {
|
|
33
|
+
// Discover all pools for the token
|
|
34
|
+
const pools = await this.poolDiscovery.discoverPools('lovelace', tokenConfig);
|
|
35
|
+
// Filter by minimum liquidity if specified
|
|
36
|
+
const filteredPools = minLiquidity
|
|
37
|
+
? pools.filter(pool => Number(pool.state?.tvl || 0) >= minLiquidity)
|
|
38
|
+
: pools;
|
|
39
|
+
// Sort by TVL (highest first) and apply limit
|
|
40
|
+
const sortedPools = filteredPools
|
|
41
|
+
.sort((a, b) => Number(b.state?.tvl || 0) - Number(a.state?.tvl || 0))
|
|
42
|
+
.slice(0, showAll ? filteredPools.length : limit);
|
|
43
|
+
const totalLiquidity = pools.reduce((sum, pool) => sum + Number(pool.state?.tvl || 0), 0);
|
|
44
|
+
// Convert to CLI-friendly format
|
|
45
|
+
const poolInfos = sortedPools.map(pool => ({
|
|
46
|
+
identifier: pool.identifier || 'N/A',
|
|
47
|
+
dex: pool.dex || 'Unknown',
|
|
48
|
+
tvl: Number(pool.state?.tvl || 0),
|
|
49
|
+
reserveA: Number(pool.state?.reserveA || 0),
|
|
50
|
+
reserveB: Number(pool.state?.reserveB || 0),
|
|
51
|
+
address: pool.address || 'N/A',
|
|
52
|
+
isActive: pool.isActive || false
|
|
53
|
+
}));
|
|
54
|
+
// Get recommended identifiers (top 3 by TVL)
|
|
55
|
+
const recommendedIdentifiers = poolInfos
|
|
56
|
+
.slice(0, 3)
|
|
57
|
+
.filter(pool => pool.isActive)
|
|
58
|
+
.map(pool => pool.identifier);
|
|
59
|
+
return {
|
|
60
|
+
token: symbol,
|
|
61
|
+
policyId: tokenConfig.policyId,
|
|
62
|
+
assetName: tokenConfig.assetName,
|
|
63
|
+
totalPools: pools.length,
|
|
64
|
+
totalLiquidity,
|
|
65
|
+
pools: poolInfos,
|
|
66
|
+
recommendedIdentifiers
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
throw new Error(`Pool discovery failed for ${symbol}: ${error}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Display discovery results in a formatted table
|
|
75
|
+
*/
|
|
76
|
+
displayResults(result) {
|
|
77
|
+
console.log(`\n📊 ${result.token} Liquidity Pool Discovery Results`);
|
|
78
|
+
console.log('═'.repeat(80));
|
|
79
|
+
console.log(`Total Pools Found: ${result.totalPools}`);
|
|
80
|
+
console.log(`Total Liquidity: ${this.formatCurrency(result.totalLiquidity)}`);
|
|
81
|
+
console.log(`Token Policy ID: ${result.policyId}`);
|
|
82
|
+
console.log(`Asset Name (hex): ${result.assetName}`);
|
|
83
|
+
if (result.pools.length === 0) {
|
|
84
|
+
console.log('\n❌ No liquidity pools found for this token.');
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
console.log('\n🏊 Pool Details:');
|
|
88
|
+
console.log('─'.repeat(80));
|
|
89
|
+
console.log('Rank | DEX | TVL | Identifier | Active');
|
|
90
|
+
console.log('─'.repeat(80));
|
|
91
|
+
result.pools.forEach((pool, index) => {
|
|
92
|
+
const rank = `${index + 1}`.padStart(4);
|
|
93
|
+
const dex = pool.dex.substring(0, 12).padEnd(12);
|
|
94
|
+
const tvl = this.formatCurrency(pool.tvl).padStart(12);
|
|
95
|
+
const identifier = pool.identifier.substring(0, 29).padEnd(29);
|
|
96
|
+
const status = pool.isActive ? '✅' : '❌';
|
|
97
|
+
console.log(`${rank} | ${dex} | ${tvl} | ${identifier} | ${status}`);
|
|
98
|
+
});
|
|
99
|
+
console.log('\n🎯 Recommended Pool Identifiers for Market Making:');
|
|
100
|
+
console.log('─'.repeat(60));
|
|
101
|
+
if (result.recommendedIdentifiers.length === 0) {
|
|
102
|
+
console.log('❌ No active pools with sufficient liquidity found.');
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
result.recommendedIdentifiers.forEach((id, index) => {
|
|
106
|
+
const pool = result.pools.find(p => p.identifier === id);
|
|
107
|
+
console.log(`${index + 1}. ${id}`);
|
|
108
|
+
console.log(` DEX: ${pool?.dex}, TVL: ${this.formatCurrency(pool?.tvl || 0)}`);
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
console.log('\n💡 Usage Instructions:');
|
|
112
|
+
console.log('─'.repeat(40));
|
|
113
|
+
console.log('1. Use the recommended pool identifiers in your market making strategy');
|
|
114
|
+
console.log('2. Higher TVL pools typically offer better price stability');
|
|
115
|
+
console.log('3. Monitor multiple pools for price aggregation and arbitrage opportunities');
|
|
116
|
+
console.log(`4. Current minimum liquidity threshold: ${this.formatCurrency((0, price_aggregation_1.getTokenConfig)(result.token).minLiquidityThreshold || 0)}`);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Get live price information for discovered pools
|
|
120
|
+
*/
|
|
121
|
+
async getPoolPrices(identifiers) {
|
|
122
|
+
if (identifiers.length === 0) {
|
|
123
|
+
console.log('❌ No pool identifiers provided');
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
console.log('\n💰 Getting live prices from Iris API...');
|
|
127
|
+
try {
|
|
128
|
+
const prices = await this.irisClient.fetchPrices(identifiers, 'OpenMM-PoolDiscovery/1.0');
|
|
129
|
+
console.log('─'.repeat(50));
|
|
130
|
+
console.log('Pool ID | Price (ADA)');
|
|
131
|
+
console.log('─'.repeat(50));
|
|
132
|
+
identifiers.forEach((id, index) => {
|
|
133
|
+
const price = prices[index] || 0;
|
|
134
|
+
const shortId = id.substring(0, 33).padEnd(33);
|
|
135
|
+
console.log(`${shortId} | ${price.toFixed(8)}`);
|
|
136
|
+
});
|
|
137
|
+
const avgPrice = prices.reduce((sum, p) => sum + p, 0) / prices.length;
|
|
138
|
+
console.log('─'.repeat(50));
|
|
139
|
+
console.log(`Average Price: ${avgPrice.toFixed(8)} ADA per token`);
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
console.log(`❌ Failed to fetch prices: ${error}`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Format currency with K/M suffixes
|
|
147
|
+
*/
|
|
148
|
+
formatCurrency(amount) {
|
|
149
|
+
if (amount === 0)
|
|
150
|
+
return '$0';
|
|
151
|
+
if (amount >= 1000000) {
|
|
152
|
+
return `$${(amount / 1000000).toFixed(1)}M`;
|
|
153
|
+
}
|
|
154
|
+
if (amount >= 1000) {
|
|
155
|
+
return `$${(amount / 1000).toFixed(1)}K`;
|
|
156
|
+
}
|
|
157
|
+
return `$${amount.toFixed(0)}`;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Add a new token configuration (for advanced users)
|
|
161
|
+
*/
|
|
162
|
+
suggestTokenConfig(policyId, assetNameHex, symbol) {
|
|
163
|
+
console.log('\n🔧 Token Configuration for Custom Token:');
|
|
164
|
+
console.log('─'.repeat(50));
|
|
165
|
+
console.log(`Symbol: ${symbol.toUpperCase()}`);
|
|
166
|
+
console.log(`Policy ID: ${policyId}`);
|
|
167
|
+
console.log(`Asset Name (hex): ${assetNameHex}`);
|
|
168
|
+
console.log('\nAdd this to your src/config/price-aggregation.ts:');
|
|
169
|
+
console.log('─'.repeat(50));
|
|
170
|
+
console.log(`'${symbol.toUpperCase()}': {`);
|
|
171
|
+
console.log(` symbol: '${symbol.toUpperCase()}',`);
|
|
172
|
+
console.log(` policyId: '${policyId}',`);
|
|
173
|
+
console.log(` assetName: '${assetNameHex}',`);
|
|
174
|
+
console.log(` minLiquidityThreshold: 25000 // Adjust as needed`);
|
|
175
|
+
console.log(`}`);
|
|
176
|
+
return {
|
|
177
|
+
symbol: symbol.toUpperCase(),
|
|
178
|
+
policyId,
|
|
179
|
+
assetName: assetNameHex,
|
|
180
|
+
minLiquidityThreshold: 25000
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
exports.PoolDiscoveryCLI = PoolDiscoveryCLI;
|
|
185
|
+
/**
|
|
186
|
+
* CLI Entry Point
|
|
187
|
+
*/
|
|
188
|
+
async function main() {
|
|
189
|
+
const args = process.argv.slice(2);
|
|
190
|
+
const cli = new PoolDiscoveryCLI();
|
|
191
|
+
if (args.length === 0 || args[0] === '--help' || args[0] === '-h') {
|
|
192
|
+
console.log('🔍 OpenMM Pool Discovery CLI');
|
|
193
|
+
console.log('═'.repeat(40));
|
|
194
|
+
console.log('Usage: npm run pool-discovery <command> [options]');
|
|
195
|
+
console.log('\nCommands:');
|
|
196
|
+
console.log(' discover <TOKEN> Discover pools for a supported token');
|
|
197
|
+
console.log(' supported List all supported tokens');
|
|
198
|
+
console.log(' prices <TOKEN> Get live prices for token pools');
|
|
199
|
+
console.log(' custom <POLICY> <HEX> <SYMBOL> Generate config for custom token');
|
|
200
|
+
console.log('\nOptions:');
|
|
201
|
+
console.log(' --limit <N> Limit number of pools shown (default: 10)');
|
|
202
|
+
console.log(' --min-liquidity <N> Filter pools by minimum TVL');
|
|
203
|
+
console.log(' --show-all Show all pools (ignore limit)');
|
|
204
|
+
console.log('\nExamples:');
|
|
205
|
+
console.log(' npm run pool-discovery discover NIGHT');
|
|
206
|
+
console.log(' npm run pool-discovery discover SNEK --limit 5');
|
|
207
|
+
console.log(' npm run pool-discovery discover INDY --min-liquidity 100000');
|
|
208
|
+
console.log(' npm run pool-discovery prices NIGHT');
|
|
209
|
+
console.log(' npm run pool-discovery supported');
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
const command = args[0];
|
|
213
|
+
try {
|
|
214
|
+
switch (command) {
|
|
215
|
+
case 'discover': {
|
|
216
|
+
if (args.length < 2) {
|
|
217
|
+
console.log('❌ Token symbol required. Usage: npm run pool-discovery discover <TOKEN>');
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
const token = args[1];
|
|
221
|
+
const options = {};
|
|
222
|
+
// Parse options
|
|
223
|
+
for (let i = 2; i < args.length; i += 2) {
|
|
224
|
+
switch (args[i]) {
|
|
225
|
+
case '--limit':
|
|
226
|
+
options.limit = parseInt(args[i + 1]);
|
|
227
|
+
break;
|
|
228
|
+
case '--min-liquidity':
|
|
229
|
+
options.minLiquidity = parseInt(args[i + 1]);
|
|
230
|
+
break;
|
|
231
|
+
case '--show-all':
|
|
232
|
+
options.showAll = true;
|
|
233
|
+
i--; // No value to consume
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
const result = await cli.discoverTokenPools(token, options);
|
|
238
|
+
cli.displayResults(result);
|
|
239
|
+
break;
|
|
240
|
+
}
|
|
241
|
+
case 'supported': {
|
|
242
|
+
console.log('🎯 Supported Tokens:');
|
|
243
|
+
console.log('─'.repeat(20));
|
|
244
|
+
(0, price_aggregation_1.getSupportedTokens)().forEach(token => {
|
|
245
|
+
const config = (0, price_aggregation_1.getTokenConfig)(token);
|
|
246
|
+
console.log(`${token} (Min Liquidity: ${cli['formatCurrency'](config.minLiquidityThreshold || 0)})`);
|
|
247
|
+
});
|
|
248
|
+
break;
|
|
249
|
+
}
|
|
250
|
+
case 'prices': {
|
|
251
|
+
if (args.length < 2) {
|
|
252
|
+
console.log('❌ Token symbol required. Usage: npm run pool-discovery prices <TOKEN>');
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
const token = args[1];
|
|
256
|
+
const result = await cli.discoverTokenPools(token, { limit: 3 });
|
|
257
|
+
await cli.getPoolPrices(result.recommendedIdentifiers);
|
|
258
|
+
break;
|
|
259
|
+
}
|
|
260
|
+
case 'custom': {
|
|
261
|
+
if (args.length < 4) {
|
|
262
|
+
console.log('❌ Usage: npm run pool-discovery custom <POLICY_ID> <ASSET_NAME_HEX> <SYMBOL>');
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
const [, policyId, assetNameHex, symbol] = args;
|
|
266
|
+
cli.suggestTokenConfig(policyId, assetNameHex, symbol);
|
|
267
|
+
break;
|
|
268
|
+
}
|
|
269
|
+
default:
|
|
270
|
+
console.log(`❌ Unknown command: ${command}`);
|
|
271
|
+
console.log('Run "npm run pool-discovery --help" for usage information.');
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
catch (error) {
|
|
275
|
+
console.error('❌ Error:', error.message);
|
|
276
|
+
process.exit(1);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
// Run CLI if this file is executed directly
|
|
280
|
+
if (require.main === module) {
|
|
281
|
+
main().catch(console.error);
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=pool-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool-discovery.js","sourceRoot":"","sources":["../../src/cli/pool-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,6 +20,25 @@ interface EnvironmentConfig {
|
|
|
20
20
|
logLevel: string;
|
|
21
21
|
nodeEnv: string;
|
|
22
22
|
}
|
|
23
|
+
declare class EnvironmentValidator {
|
|
24
|
+
private static validateOptional;
|
|
25
|
+
/**
|
|
26
|
+
* Validate environment configuration.
|
|
27
|
+
*
|
|
28
|
+
* IMPORTANT: This method throws errors instead of calling process.exit()
|
|
29
|
+
* to allow callers (like MCP servers) to handle errors gracefully.
|
|
30
|
+
*
|
|
31
|
+
* All exchange credentials are now optional - validation happens at
|
|
32
|
+
* runtime when a specific exchange is used.
|
|
33
|
+
*/
|
|
34
|
+
static validate(): EnvironmentConfig;
|
|
35
|
+
/**
|
|
36
|
+
* Validate that a specific exchange is configured.
|
|
37
|
+
* Call this at runtime when an exchange is actually used.
|
|
38
|
+
*/
|
|
39
|
+
static validateExchange(exchange: 'mexc' | 'gateio' | 'bitget' | 'kraken'): void;
|
|
40
|
+
}
|
|
23
41
|
export declare const config: EnvironmentConfig;
|
|
42
|
+
export { EnvironmentValidator };
|
|
24
43
|
export default config;
|
|
25
44
|
//# sourceMappingURL=environment.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../src/config/environment.ts"],"names":[],"mappings":"AAOA,UAAU,iBAAiB;IACzB,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;IAEF,MAAM,CAAC,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IAEF,MAAM,CAAC,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IAEF,MAAM,CAAC,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IAEF,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;
|
|
1
|
+
{"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../src/config/environment.ts"],"names":[],"mappings":"AAOA,UAAU,iBAAiB;IACzB,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;IAEF,MAAM,CAAC,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IAEF,MAAM,CAAC,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IAEF,MAAM,CAAC,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IAEF,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,cAAM,oBAAoB;IACxB,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAI/B;;;;;;;;OAQG;IACH,MAAM,CAAC,QAAQ,IAAI,iBAAiB;IAoDpC;;;OAGG;IACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,IAAI;CAiBjF;AAMD,eAAO,MAAM,MAAM,EAAE,iBAoBnB,CAAC;AAGH,OAAO,EAAE,oBAAoB,EAAE,CAAC;AAChC,eAAe,MAAM,CAAC"}
|
|
@@ -3,79 +3,108 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.config = void 0;
|
|
6
|
+
exports.EnvironmentValidator = exports.config = void 0;
|
|
7
7
|
const dotenv_1 = __importDefault(require("dotenv"));
|
|
8
8
|
const utils_1 = require("../utils");
|
|
9
9
|
dotenv_1.default.config();
|
|
10
10
|
const logger = (0, utils_1.createLogger)('environment-validator');
|
|
11
11
|
class EnvironmentValidator {
|
|
12
|
-
static validateRequired(key, value) {
|
|
13
|
-
if (!value || value.trim() === '') {
|
|
14
|
-
throw new Error(`Required environment variable ${key} is missing or empty`);
|
|
15
|
-
}
|
|
16
|
-
return value.trim();
|
|
17
|
-
}
|
|
18
12
|
static validateOptional(value) {
|
|
19
13
|
return value && value.trim() !== '' ? value.trim() : undefined;
|
|
20
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Validate environment configuration.
|
|
17
|
+
*
|
|
18
|
+
* IMPORTANT: This method throws errors instead of calling process.exit()
|
|
19
|
+
* to allow callers (like MCP servers) to handle errors gracefully.
|
|
20
|
+
*
|
|
21
|
+
* All exchange credentials are now optional - validation happens at
|
|
22
|
+
* runtime when a specific exchange is used.
|
|
23
|
+
*/
|
|
21
24
|
static validate() {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
const config = {
|
|
26
|
+
// MEXC is now optional like other exchanges
|
|
27
|
+
mexc: process.env.MEXC_API_KEY && process.env.MEXC_SECRET
|
|
28
|
+
? {
|
|
29
|
+
apiKey: process.env.MEXC_API_KEY.trim(),
|
|
30
|
+
secret: process.env.MEXC_SECRET.trim(),
|
|
27
31
|
uid: this.validateOptional(process.env.MEXC_UID),
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
|
|
32
|
+
}
|
|
33
|
+
: { apiKey: '', secret: '' }, // Empty config - will fail at runtime if used
|
|
34
|
+
logLevel: process.env.LOG_LEVEL || 'info',
|
|
35
|
+
nodeEnv: process.env.NODE_ENV || 'development',
|
|
36
|
+
};
|
|
37
|
+
if (process.env.GATEIO_API_KEY && process.env.GATEIO_SECRET) {
|
|
38
|
+
config.gateio = {
|
|
39
|
+
apiKey: process.env.GATEIO_API_KEY.trim(),
|
|
40
|
+
secret: process.env.GATEIO_SECRET.trim(),
|
|
31
41
|
};
|
|
32
|
-
if (process.env.GATEIO_API_KEY && process.env.GATEIO_SECRET) {
|
|
33
|
-
config.gateio = {
|
|
34
|
-
apiKey: process.env.GATEIO_API_KEY,
|
|
35
|
-
secret: process.env.GATEIO_SECRET,
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
if (process.env.BITGET_API_KEY &&
|
|
39
|
-
process.env.BITGET_SECRET &&
|
|
40
|
-
process.env.BITGET_PASSPHRASE) {
|
|
41
|
-
config.bitget = {
|
|
42
|
-
apiKey: process.env.BITGET_API_KEY,
|
|
43
|
-
secret: process.env.BITGET_SECRET,
|
|
44
|
-
passphrase: process.env.BITGET_PASSPHRASE,
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
if (process.env.KRAKEN_API_KEY && process.env.KRAKEN_SECRET) {
|
|
48
|
-
config.kraken = {
|
|
49
|
-
apiKey: process.env.KRAKEN_API_KEY,
|
|
50
|
-
secret: process.env.KRAKEN_SECRET,
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
const validLogLevels = ['error', 'warn', 'info', 'debug'];
|
|
54
|
-
if (!validLogLevels.includes(config.logLevel)) {
|
|
55
|
-
const errorMessage = `Invalid LOG_LEVEL: ${config.logLevel}. Must be one of: ${validLogLevels.join(', ')}`;
|
|
56
|
-
logger.error('Environment validation failed', { error: errorMessage });
|
|
57
|
-
logger.error('Please check your .env file and ensure all required variables are set');
|
|
58
|
-
logger.error('See .env.example for reference');
|
|
59
|
-
process.exit(1);
|
|
60
|
-
}
|
|
61
|
-
return config;
|
|
62
42
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
43
|
+
if (process.env.BITGET_API_KEY &&
|
|
44
|
+
process.env.BITGET_SECRET &&
|
|
45
|
+
process.env.BITGET_PASSPHRASE) {
|
|
46
|
+
config.bitget = {
|
|
47
|
+
apiKey: process.env.BITGET_API_KEY.trim(),
|
|
48
|
+
secret: process.env.BITGET_SECRET.trim(),
|
|
49
|
+
passphrase: process.env.BITGET_PASSPHRASE.trim(),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
if (process.env.KRAKEN_API_KEY && process.env.KRAKEN_SECRET) {
|
|
53
|
+
config.kraken = {
|
|
54
|
+
apiKey: process.env.KRAKEN_API_KEY.trim(),
|
|
55
|
+
secret: process.env.KRAKEN_SECRET.trim(),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
const validLogLevels = ['error', 'warn', 'info', 'debug'];
|
|
59
|
+
if (!validLogLevels.includes(config.logLevel)) {
|
|
60
|
+
// Throw instead of process.exit - let caller handle it
|
|
61
|
+
throw new Error(`Invalid LOG_LEVEL: ${config.logLevel}. Must be one of: ${validLogLevels.join(', ')}`);
|
|
62
|
+
}
|
|
63
|
+
return config;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Validate that a specific exchange is configured.
|
|
67
|
+
* Call this at runtime when an exchange is actually used.
|
|
68
|
+
*/
|
|
69
|
+
static validateExchange(exchange) {
|
|
70
|
+
const cfg = exports.config[exchange];
|
|
71
|
+
if (!cfg || !cfg.apiKey || !cfg.secret) {
|
|
72
|
+
throw new Error(`Exchange ${exchange.toUpperCase()} is not configured. ` +
|
|
73
|
+
`Please set ${exchange.toUpperCase()}_API_KEY and ${exchange.toUpperCase()}_SECRET environment variables.`);
|
|
74
|
+
}
|
|
75
|
+
if (exchange === 'bitget') {
|
|
76
|
+
const bitgetCfg = exports.config.bitget;
|
|
77
|
+
if (!bitgetCfg?.passphrase) {
|
|
78
|
+
throw new Error(`Bitget requires BITGET_PASSPHRASE environment variable.`);
|
|
67
79
|
}
|
|
68
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
69
|
-
logger.error('Environment validation failed', { error: errorMessage });
|
|
70
|
-
logger.error('Please check your .env file and ensure all required variables are set');
|
|
71
|
-
logger.error('See .env.example for reference');
|
|
72
|
-
process.exit(1);
|
|
73
80
|
}
|
|
74
81
|
}
|
|
75
82
|
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
83
|
+
exports.EnvironmentValidator = EnvironmentValidator;
|
|
84
|
+
// Lazy validation - validates at import but doesn't call process.exit()
|
|
85
|
+
// Errors are thrown and can be caught by the caller
|
|
86
|
+
let _config = null;
|
|
87
|
+
exports.config = new Proxy({}, {
|
|
88
|
+
get(_, prop) {
|
|
89
|
+
if (!_config) {
|
|
90
|
+
try {
|
|
91
|
+
_config = EnvironmentValidator.validate();
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
// Log the error but don't exit - let the caller handle it
|
|
95
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
96
|
+
logger.warn('Environment validation warning', { error: errorMessage });
|
|
97
|
+
logger.warn('Some exchanges may not be available. Set credentials to enable them.');
|
|
98
|
+
// Return a minimal config so the module can still load
|
|
99
|
+
_config = {
|
|
100
|
+
mexc: { apiKey: '', secret: '' },
|
|
101
|
+
logLevel: 'info',
|
|
102
|
+
nodeEnv: process.env.NODE_ENV || 'development',
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return _config[prop];
|
|
107
|
+
},
|
|
108
|
+
});
|
|
80
109
|
exports.default = exports.config;
|
|
81
110
|
//# sourceMappingURL=environment.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/config/environment.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAC5B,oCAAwC;AAExC,gBAAM,CAAC,MAAM,EAAE,CAAC;AAEhB,MAAM,MAAM,GAAG,IAAA,oBAAY,EAAC,uBAAuB,CAAC,CAAC;AA6BrD,MAAM,oBAAoB;IAChB,MAAM,CAAC,gBAAgB,CAAC,
|
|
1
|
+
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/config/environment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Price Cache
|
|
3
|
+
* Manages price caching with 1-minute TTL and fallback strategies
|
|
4
|
+
*/
|
|
5
|
+
export declare class PriceCache {
|
|
6
|
+
private cache;
|
|
7
|
+
private fallbackCache;
|
|
8
|
+
/**
|
|
9
|
+
* Cache price with TTL (1 minute as requested)
|
|
10
|
+
*/
|
|
11
|
+
cachePrice(symbol: string, price: number, ttl?: number): void;
|
|
12
|
+
/**
|
|
13
|
+
* Get cached price if still valid
|
|
14
|
+
*/
|
|
15
|
+
getCachedPrice(symbol: string): number | null;
|
|
16
|
+
/**
|
|
17
|
+
* Get fallback price (last known good price, even if stale)
|
|
18
|
+
* Used when Iris API fails
|
|
19
|
+
*/
|
|
20
|
+
getFallbackPrice(symbol: string): number | null;
|
|
21
|
+
/**
|
|
22
|
+
* Check if cached price object is valid
|
|
23
|
+
*/
|
|
24
|
+
private isCacheValid;
|
|
25
|
+
/**
|
|
26
|
+
* Get cache statistics for monitoring
|
|
27
|
+
*/
|
|
28
|
+
getCacheStats(): {
|
|
29
|
+
activeEntries: number;
|
|
30
|
+
fallbackEntries: number;
|
|
31
|
+
hitRate: number;
|
|
32
|
+
oldestEntry: Date | null;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Get age of cached price in seconds
|
|
36
|
+
*/
|
|
37
|
+
getCacheAge(symbol: string): number | null;
|
|
38
|
+
/**
|
|
39
|
+
* Clear all caches
|
|
40
|
+
*/
|
|
41
|
+
clearCache(): void;
|
|
42
|
+
/**
|
|
43
|
+
* Clear expired entries from cache
|
|
44
|
+
*/
|
|
45
|
+
private cleanupCache;
|
|
46
|
+
/**
|
|
47
|
+
* Get oldest cache entry timestamp
|
|
48
|
+
*/
|
|
49
|
+
private getOldestCacheEntry;
|
|
50
|
+
/**
|
|
51
|
+
* Get key of oldest cache entry
|
|
52
|
+
*/
|
|
53
|
+
private getOldestCacheKey;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=price-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"price-cache.d.ts","sourceRoot":"","sources":["../../../src/core/price-aggregation/price-cache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAAuC;IACpD,OAAO,CAAC,aAAa,CAAuC;IAE5D;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,GAAE,MAAiC,GAAG,IAAI;IAkBvF;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAa7C;;;OAGG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAa/C;;OAEG;IACH,OAAO,CAAC,YAAY;IAKpB;;OAEG;IACH,aAAa,IAAI;QACf,aAAa,EAAE,MAAM,CAAC;QACtB,eAAe,EAAE,MAAM,CAAC;QACxB,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;KAC1B;IAoBD;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAO1C;;OAEG;IACH,UAAU,IAAI,IAAI;IAKlB;;OAEG;IACH,OAAO,CAAC,YAAY;IAyBpB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAY3B;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAa1B"}
|