@pioneer-platform/markets 8.12.0 → 8.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/METRICS_MONITORING.md +285 -0
- package/PRICING_IMPROVEMENTS.md +327 -0
- package/lib/api-metrics-reporter.d.ts +20 -0
- package/lib/api-metrics-reporter.js +356 -0
- package/lib/ccxt-pricing.d.ts +34 -0
- package/lib/ccxt-pricing.js +421 -0
- package/lib/index.js +784 -145
- package/lib/metrics-logger.d.ts +72 -0
- package/lib/metrics-logger.js +435 -0
- package/lib/refill-scheduler.d.ts +22 -0
- package/lib/refill-scheduler.js +226 -0
- package/lib/token-bucket-manager.d.ts +47 -0
- package/lib/token-bucket-manager.js +342 -0
- package/lib/token-bucket.d.ts +87 -0
- package/lib/token-bucket.js +341 -0
- package/package.json +6 -3
- package/.turbo/turbo-build.log +0 -1
- package/test-results.log +0 -5073
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
# API Metrics & Monitoring System
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Comprehensive monitoring system for tracking pricing API health, usage patterns, and unpriceable tokens with hourly Discord reports via the alerts bridge.
|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
### 1. **Real-time API Metrics Tracking**
|
|
10
|
+
- Tracks success/failure for every API call
|
|
11
|
+
- Records: CoinGecko, CoinMarketCap, CoinCap, CCXT
|
|
12
|
+
- Stores last error message for debugging
|
|
13
|
+
- Metrics reset hourly for fresh stats
|
|
14
|
+
|
|
15
|
+
### 2. **Unpriceable Token Registry**
|
|
16
|
+
- Redis SET of all tokens marked as unpriceable
|
|
17
|
+
- Persistent across restarts
|
|
18
|
+
- Diagnostic access via API
|
|
19
|
+
- Manual removal capability
|
|
20
|
+
|
|
21
|
+
### 3. **Hourly Discord Reports**
|
|
22
|
+
- Automated reports via alerts bridge
|
|
23
|
+
- Includes:
|
|
24
|
+
- Overall success rate
|
|
25
|
+
- Per-API performance with emojis (🟢🟡🟠🔴)
|
|
26
|
+
- Total request counts
|
|
27
|
+
- Unpriceable token count
|
|
28
|
+
- Last error for each API
|
|
29
|
+
- Critical issue warnings
|
|
30
|
+
|
|
31
|
+
### 4. **Alert Levels**
|
|
32
|
+
- **🟢 Info**: All APIs >95% success
|
|
33
|
+
- **🟡 Warn**: Any API <95% but >50% success
|
|
34
|
+
- **🔴 Error**: Any API <50% success
|
|
35
|
+
|
|
36
|
+
## Architecture
|
|
37
|
+
|
|
38
|
+
### Redis Keys
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
markets:api_metrics - JSON object with API success/failure counts
|
|
42
|
+
markets:unpriceable_tokens - SET of unpriceable token CAIPs
|
|
43
|
+
markets:last_metrics_report - Timestamp of last report
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Metrics Object Structure
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
{
|
|
50
|
+
coingecko: {
|
|
51
|
+
success: 245,
|
|
52
|
+
failures: 12,
|
|
53
|
+
lastError: "Rate limit (429)"
|
|
54
|
+
},
|
|
55
|
+
coinmarketcap: {
|
|
56
|
+
success: 189,
|
|
57
|
+
failures: 5,
|
|
58
|
+
lastError: null
|
|
59
|
+
},
|
|
60
|
+
coincap: {
|
|
61
|
+
success: 156,
|
|
62
|
+
failures: 23,
|
|
63
|
+
lastError: "Timeout"
|
|
64
|
+
},
|
|
65
|
+
ccxt: {
|
|
66
|
+
success: 312,
|
|
67
|
+
failures: 8,
|
|
68
|
+
lastError: null
|
|
69
|
+
},
|
|
70
|
+
timestamp: 1699876543210
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## API Functions
|
|
75
|
+
|
|
76
|
+
### Module Exports
|
|
77
|
+
|
|
78
|
+
```javascript
|
|
79
|
+
// Get current metrics
|
|
80
|
+
const metrics = await markets.getCurrentMetrics();
|
|
81
|
+
|
|
82
|
+
// Get unpriceable tokens list
|
|
83
|
+
const tokens = await markets.getUnpriceableTokens(100);
|
|
84
|
+
|
|
85
|
+
// Clear a token from unpriceable list
|
|
86
|
+
await markets.clearUnpriceableToken('eip155:1/erc20:0x...');
|
|
87
|
+
|
|
88
|
+
// Force send metrics report now
|
|
89
|
+
await markets.sendMetricsReport();
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Example Response
|
|
93
|
+
|
|
94
|
+
```json
|
|
95
|
+
{
|
|
96
|
+
"metrics": {
|
|
97
|
+
"coingecko": {
|
|
98
|
+
"success": 245,
|
|
99
|
+
"failures": 12,
|
|
100
|
+
"lastError": "Rate limit (429)"
|
|
101
|
+
},
|
|
102
|
+
"coinmarketcap": {
|
|
103
|
+
"success": 189,
|
|
104
|
+
"failures": 5
|
|
105
|
+
},
|
|
106
|
+
"coincap": {
|
|
107
|
+
"success": 156,
|
|
108
|
+
"failures": 23,
|
|
109
|
+
"lastError": "Timeout"
|
|
110
|
+
},
|
|
111
|
+
"ccxt": {
|
|
112
|
+
"success": 312,
|
|
113
|
+
"failures": 8
|
|
114
|
+
},
|
|
115
|
+
"timestamp": "2025-11-13T02:00:00.000Z"
|
|
116
|
+
},
|
|
117
|
+
"unpriceableTokens": 47
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## Discord Report Format
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
📊 Pricing API Health Report
|
|
125
|
+
|
|
126
|
+
Period: Last hour
|
|
127
|
+
Overall Success Rate: 94.8%
|
|
128
|
+
Total Requests: 902
|
|
129
|
+
Unpriceable Tokens: 47
|
|
130
|
+
|
|
131
|
+
API Performance:
|
|
132
|
+
🟢 CCXT: 97.5% (312✓ / 8✗)
|
|
133
|
+
🟢 CoinGecko: 95.3% (245✓ / 12✗)
|
|
134
|
+
🟢 CoinMarketCap: 97.4% (189✓ / 5✗)
|
|
135
|
+
🟡 CoinCap: 87.2% (156✓ / 23✗)
|
|
136
|
+
└─ Last error: `Timeout after 5000ms`
|
|
137
|
+
|
|
138
|
+
⚠️ Critical Issues:
|
|
139
|
+
• None detected
|
|
140
|
+
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## Configuration
|
|
144
|
+
|
|
145
|
+
### Environment Variables
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
# Alerts Bridge URL (defaults to localhost:9000)
|
|
149
|
+
ALERTS_BRIDGE_URL=http://alerts-bridge:9000/api/v1/alert
|
|
150
|
+
|
|
151
|
+
# Enable/disable Discord alerts (defaults to true)
|
|
152
|
+
ALERTS_ENABLED=true
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### Reporting Schedule
|
|
156
|
+
|
|
157
|
+
- **Initial Report**: 5 minutes after startup
|
|
158
|
+
- **Recurring Reports**: Every 60 minutes
|
|
159
|
+
- **Metrics Reset**: After each report
|
|
160
|
+
|
|
161
|
+
## Integration
|
|
162
|
+
|
|
163
|
+
### Startup
|
|
164
|
+
|
|
165
|
+
The metrics reporter automatically starts when the markets module is initialized:
|
|
166
|
+
|
|
167
|
+
```javascript
|
|
168
|
+
markets.init({ apiKey: 'your-key' });
|
|
169
|
+
// Hourly reporting started automatically
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Manual Diagnostics
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
# Get unpriceable tokens
|
|
176
|
+
redis-cli SMEMBERS markets:unpriceable_tokens
|
|
177
|
+
|
|
178
|
+
# Get current metrics
|
|
179
|
+
redis-cli GET markets:api_metrics | jq .
|
|
180
|
+
|
|
181
|
+
# Clear all unpriceable tokens
|
|
182
|
+
redis-cli DEL markets:unpriceable_tokens
|
|
183
|
+
|
|
184
|
+
# Clear specific token
|
|
185
|
+
redis-cli SREM markets:unpriceable_tokens "eip155:1/erc20:0x..."
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
## Monitoring Use Cases
|
|
189
|
+
|
|
190
|
+
### 1. Detect API Outages
|
|
191
|
+
```
|
|
192
|
+
🔴 CoinGecko: 12.5% (15✓ / 105✗)
|
|
193
|
+
└─ Last error: `Connection timeout`
|
|
194
|
+
```
|
|
195
|
+
**Action**: Switch to alternative APIs, check CoinGecko status
|
|
196
|
+
|
|
197
|
+
### 2. Identify Rate Limiting
|
|
198
|
+
```
|
|
199
|
+
🟠 CoinMarketCap: 65.2% (98✓ / 52✗)
|
|
200
|
+
└─ Last error: `Rate limit (429)`
|
|
201
|
+
```
|
|
202
|
+
**Action**: Review request volume, adjust rate limiting
|
|
203
|
+
|
|
204
|
+
### 3. Track Scam Tokens
|
|
205
|
+
```
|
|
206
|
+
⚠️ High number of unpriceable tokens detected
|
|
207
|
+
156 tokens marked as unpriceable (likely scam/spam)
|
|
208
|
+
```
|
|
209
|
+
**Action**: Review unpriceable list, validate legitimate tokens
|
|
210
|
+
|
|
211
|
+
### 4. Overall System Health
|
|
212
|
+
```
|
|
213
|
+
Overall Success Rate: 97.8%
|
|
214
|
+
Total Requests: 1,234
|
|
215
|
+
```
|
|
216
|
+
**Action**: System healthy, no intervention needed
|
|
217
|
+
|
|
218
|
+
## Benefits
|
|
219
|
+
|
|
220
|
+
### 1. **Proactive Monitoring**
|
|
221
|
+
- Detect issues before they impact users
|
|
222
|
+
- Historical tracking of API reliability
|
|
223
|
+
- Early warning for rate limit exhaustion
|
|
224
|
+
|
|
225
|
+
### 2. **Diagnostic Transparency**
|
|
226
|
+
- Understand which APIs are performing well
|
|
227
|
+
- Identify patterns in failures
|
|
228
|
+
- Debug pricing issues quickly
|
|
229
|
+
|
|
230
|
+
### 3. **Cost Optimization**
|
|
231
|
+
- Track API usage patterns
|
|
232
|
+
- Optimize randomization weights
|
|
233
|
+
- Reduce unnecessary API calls
|
|
234
|
+
|
|
235
|
+
### 4. **Scam Token Management**
|
|
236
|
+
- Central registry of unpriceable tokens
|
|
237
|
+
- Easy access for debugging
|
|
238
|
+
- Manual override capability
|
|
239
|
+
|
|
240
|
+
## Troubleshooting
|
|
241
|
+
|
|
242
|
+
### No Discord Alerts
|
|
243
|
+
|
|
244
|
+
**Check**:
|
|
245
|
+
1. `ALERTS_ENABLED` env var is true
|
|
246
|
+
2. Alerts bridge is running and accessible
|
|
247
|
+
3. `ALERTS_BRIDGE_URL` is correct
|
|
248
|
+
4. Check logs for "Sent Discord alert" messages
|
|
249
|
+
|
|
250
|
+
### Metrics Not Updating
|
|
251
|
+
|
|
252
|
+
**Check**:
|
|
253
|
+
1. Redis is accessible
|
|
254
|
+
2. Markets module is initialized
|
|
255
|
+
3. Pricing requests are being made
|
|
256
|
+
4. Check Redis key `markets:api_metrics`
|
|
257
|
+
|
|
258
|
+
### Too Many Unpriceable Tokens
|
|
259
|
+
|
|
260
|
+
**Causes**:
|
|
261
|
+
- User added many custom/spam tokens
|
|
262
|
+
- API outages marking legitimate tokens
|
|
263
|
+
- Discovery database out of date
|
|
264
|
+
|
|
265
|
+
**Solutions**:
|
|
266
|
+
1. Review unpriceable list
|
|
267
|
+
2. Clear invalid entries: `markets.clearUnpriceableToken(caip)`
|
|
268
|
+
3. Update discovery database
|
|
269
|
+
4. Check API health
|
|
270
|
+
|
|
271
|
+
## Future Enhancements
|
|
272
|
+
|
|
273
|
+
1. **Grafana Dashboard**: Visualize metrics over time
|
|
274
|
+
2. **Weighted Randomization**: Prioritize better-performing APIs
|
|
275
|
+
3. **Circuit Breaker**: Temporarily skip failing APIs
|
|
276
|
+
4. **Cost Tracking**: Monitor API credit usage
|
|
277
|
+
5. **Alerting Thresholds**: Configurable alert conditions
|
|
278
|
+
|
|
279
|
+
## Related Files
|
|
280
|
+
|
|
281
|
+
- `src/api-metrics-reporter.ts` - Core metrics reporting logic
|
|
282
|
+
- `src/index.ts` - API metric tracking integration
|
|
283
|
+
- `__tests__/test-metrics.js` - Metrics testing
|
|
284
|
+
- `PRICING_IMPROVEMENTS.md` - Overall pricing system documentation
|
|
285
|
+
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
# Pricing System Improvements - November 2025
|
|
2
|
+
|
|
3
|
+
## Summary
|
|
4
|
+
|
|
5
|
+
Major improvements to the Pioneer pricing system to eliminate 0-price issues and improve reliability through:
|
|
6
|
+
1. **CCXT Integration** - Added 100+ cryptocurrency exchanges as pricing sources
|
|
7
|
+
2. **Randomized API Fallback** - Distribute load across all pricing providers
|
|
8
|
+
3. **Enhanced Protection** - Multiple layers to prevent major cryptocurrencies from being marked as unpriceable
|
|
9
|
+
4. **Diagnostic Tools** - Skills to monitor and fix pricing issues
|
|
10
|
+
|
|
11
|
+
## Problems Solved
|
|
12
|
+
|
|
13
|
+
### Issue 1: Major Cryptocurrencies Marked as "Unpriceable"
|
|
14
|
+
**Root Cause**: API rate limits and failures were causing Ethereum, BNB, and Polygon to be cached with `source: "unpriceable"`, which prevented future price fetches.
|
|
15
|
+
|
|
16
|
+
**Solution**: Added multiple protection layers:
|
|
17
|
+
- Whitelist check in `cache_unpriceable_token()` (line 831)
|
|
18
|
+
- Additional whitelist checks before marking as unpriceable (lines 1504, 1523, 1539)
|
|
19
|
+
- Base cache protection against overwriting valid prices with $0 (line 231)
|
|
20
|
+
|
|
21
|
+
### Issue 2: Limited Pricing Sources Leading to Failures
|
|
22
|
+
**Root Cause**: Only 3 pricing APIs (CoinGecko, CoinMarketCap, CoinCap), all subject to rate limits.
|
|
23
|
+
|
|
24
|
+
**Solution**: Integrated CCXT library providing access to 100+ exchanges:
|
|
25
|
+
- Binance, Kraken, Coinbase, KuCoin, Bybit, OKX
|
|
26
|
+
- Direct spot market access
|
|
27
|
+
- 5-minute price caching to avoid excessive calls
|
|
28
|
+
|
|
29
|
+
### Issue 3: Single API Bottleneck
|
|
30
|
+
**Root Cause**: Fixed API order meant CoinGecko was always hit first, leading to rate limit exhaustion.
|
|
31
|
+
|
|
32
|
+
**Solution**: Randomized API fallback chain:
|
|
33
|
+
- APIs tried in random order on each request
|
|
34
|
+
- Load distributed across all providers
|
|
35
|
+
- Prevents hammering any single API
|
|
36
|
+
|
|
37
|
+
## New Architecture
|
|
38
|
+
|
|
39
|
+
### Pricing Flow
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
Request Price for Asset (CAIP)
|
|
43
|
+
↓
|
|
44
|
+
Check if cached as unpriceable → Return 0
|
|
45
|
+
↓
|
|
46
|
+
Get identifiers (CoinGecko ID, Symbol, etc.)
|
|
47
|
+
↓
|
|
48
|
+
RANDOMIZED API FALLBACK CHAIN:
|
|
49
|
+
├─ 🦎 CoinGecko (mapped ID)
|
|
50
|
+
├─ 📊 CoinMarketCap (symbol)
|
|
51
|
+
├─ 💰 CoinCap (symbol)
|
|
52
|
+
└─ 🔄 CCXT (100+ exchanges)
|
|
53
|
+
|
|
54
|
+
Order randomized on each request!
|
|
55
|
+
↓
|
|
56
|
+
First successful response returned
|
|
57
|
+
↓
|
|
58
|
+
If all fail for major crypto → Return 0 but DON'T cache as unpriceable
|
|
59
|
+
If all fail for unknown token → Cache as unpriceable
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### API Strategy Object
|
|
63
|
+
|
|
64
|
+
```typescript
|
|
65
|
+
const apiStrategies = [
|
|
66
|
+
{
|
|
67
|
+
name: 'CoinGecko',
|
|
68
|
+
fetch: () => get_price_from_coingecko(id),
|
|
69
|
+
source: 'coingecko'
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
name: 'CoinMarketCap',
|
|
73
|
+
fetch: () => get_price_from_coinmarketcap(symbol),
|
|
74
|
+
source: 'coinmarketcap'
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
name: 'CoinCap',
|
|
78
|
+
fetch: () => get_price_from_coincap(symbol),
|
|
79
|
+
source: 'coincap'
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
name: 'CCXT',
|
|
83
|
+
fetch: () => getPriceFromCCXT(symbol),
|
|
84
|
+
source: 'ccxt'
|
|
85
|
+
}
|
|
86
|
+
];
|
|
87
|
+
|
|
88
|
+
// Randomize order
|
|
89
|
+
const shuffled = apiStrategies.sort(() => Math.random() - 0.5);
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Files Modified
|
|
93
|
+
|
|
94
|
+
### Core Pricing Logic
|
|
95
|
+
- **`markets/src/index.ts`** (lines 1414-1517)
|
|
96
|
+
- Implemented randomized API fallback
|
|
97
|
+
- Added CCXT to strategy list
|
|
98
|
+
- Enhanced whitelist protection
|
|
99
|
+
|
|
100
|
+
- **`markets/src/ccxt-pricing.ts`** (new file)
|
|
101
|
+
- CCXT integration wrapper
|
|
102
|
+
- Exchange initialization
|
|
103
|
+
- Price caching (5-minute TTL)
|
|
104
|
+
- Batch pricing support
|
|
105
|
+
|
|
106
|
+
### Protection Layers
|
|
107
|
+
- **`markets/src/index.ts`** (lines 826-861)
|
|
108
|
+
- `cache_unpriceable_token()` with whitelist check
|
|
109
|
+
|
|
110
|
+
- **`pioneer-cache/src/core/base-cache.ts`** (lines 231-238)
|
|
111
|
+
- Prevents overwriting valid price with $0
|
|
112
|
+
|
|
113
|
+
## Diagnostic Skills
|
|
114
|
+
|
|
115
|
+
### 1. Diagnose Price Issues
|
|
116
|
+
**Location**: `/skills/diagnose_price_issues/diagnose_price_issues.sh`
|
|
117
|
+
|
|
118
|
+
**Features**:
|
|
119
|
+
- Checks API health
|
|
120
|
+
- Verifies cache health
|
|
121
|
+
- Tests major cryptocurrency prices
|
|
122
|
+
- Inspects Redis keys
|
|
123
|
+
- Scans logs for issues
|
|
124
|
+
|
|
125
|
+
**Usage**:
|
|
126
|
+
```bash
|
|
127
|
+
./skills/diagnose_price_issues/diagnose_price_issues.sh
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### 2. Fix Pricing Issues
|
|
131
|
+
**Location**: `/skills/fix_pricing_issues/fix_pricing_issues.sh`
|
|
132
|
+
|
|
133
|
+
**Features**:
|
|
134
|
+
- Clears bad price cache entries
|
|
135
|
+
- Removes unpriceable flags for major cryptos
|
|
136
|
+
- Queues refresh jobs
|
|
137
|
+
- Safe to run on production
|
|
138
|
+
|
|
139
|
+
**Usage**:
|
|
140
|
+
```bash
|
|
141
|
+
./skills/fix_pricing_issues/fix_pricing_issues.sh
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## Testing
|
|
145
|
+
|
|
146
|
+
### Test File
|
|
147
|
+
**Location**: `markets/__tests__/test-ccxt-integration.js`
|
|
148
|
+
|
|
149
|
+
**Test Coverage**:
|
|
150
|
+
1. Direct CCXT price fetching
|
|
151
|
+
2. CAIP-first pricing with CCXT fallback
|
|
152
|
+
3. Batch price fetching
|
|
153
|
+
4. Performance metrics
|
|
154
|
+
|
|
155
|
+
**Run Tests**:
|
|
156
|
+
```bash
|
|
157
|
+
cd markets
|
|
158
|
+
node __tests__/test-ccxt-integration.js
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### Test Results
|
|
162
|
+
```
|
|
163
|
+
✅ ETH from CCXT: $3440.59 (1549ms first call, 258ms cached)
|
|
164
|
+
✅ BTC from CCXT: $102248.55
|
|
165
|
+
✅ BNB from CCXT: $955.68
|
|
166
|
+
✅ MATIC from CCXT: $0.38
|
|
167
|
+
✅ ATOM from CCXT: $2.95
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## Benefits
|
|
171
|
+
|
|
172
|
+
### 1. Reliability
|
|
173
|
+
- **4x more pricing sources** (was 3, now 7+)
|
|
174
|
+
- **100+ exchanges** via CCXT
|
|
175
|
+
- **Distributed load** via randomization
|
|
176
|
+
- **No single point of failure**
|
|
177
|
+
|
|
178
|
+
### 2. Performance
|
|
179
|
+
- **Parallel redundancy**: Multiple APIs tried simultaneously
|
|
180
|
+
- **Caching**: CCXT caches for 5 minutes
|
|
181
|
+
- **Fast failover**: Immediate switch to next API on failure
|
|
182
|
+
|
|
183
|
+
### 3. Protection
|
|
184
|
+
- **Multi-layer whitelist**: Major cryptos never marked unpriceable
|
|
185
|
+
- **Price validation**: Won't overwrite valid price with $0
|
|
186
|
+
- **Graceful degradation**: Returns stale price vs. no price
|
|
187
|
+
|
|
188
|
+
### 4. Monitoring
|
|
189
|
+
- **Diagnostic skill**: Quick health check
|
|
190
|
+
- **Fix skill**: Automated recovery
|
|
191
|
+
- **Detailed logging**: Track API usage and failures
|
|
192
|
+
|
|
193
|
+
## Configuration
|
|
194
|
+
|
|
195
|
+
### CCXT Exchange Priority
|
|
196
|
+
```typescript
|
|
197
|
+
const EXCHANGE_CONFIG = [
|
|
198
|
+
{ id: 'binance', name: 'Binance', rateLimit: 1200 },
|
|
199
|
+
{ id: 'kraken', name: 'Kraken', rateLimit: 1000 },
|
|
200
|
+
{ id: 'coinbase', name: 'Coinbase', rateLimit: 1000 },
|
|
201
|
+
{ id: 'kucoin', name: 'KuCoin', rateLimit: 1000 },
|
|
202
|
+
{ id: 'bybit', name: 'Bybit', rateLimit: 1000 },
|
|
203
|
+
{ id: 'okx', name: 'OKX', rateLimit: 1000 },
|
|
204
|
+
];
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### Major Crypto Whitelist
|
|
208
|
+
```typescript
|
|
209
|
+
const MAJOR_CRYPTO_WHITELIST = new Set([
|
|
210
|
+
'bip122:000000000019d6689c085ae165831e93/slip44:0', // Bitcoin
|
|
211
|
+
'eip155:1/slip44:60', // Ethereum
|
|
212
|
+
'eip155:56/slip44:60', // BNB Chain
|
|
213
|
+
'eip155:137/slip44:60', // Polygon
|
|
214
|
+
'eip155:42161/slip44:60', // Arbitrum
|
|
215
|
+
'eip155:10/slip44:60', // Optimism
|
|
216
|
+
'eip155:8453/slip44:60', // Base
|
|
217
|
+
'cosmos:cosmoshub-4/slip44:118', // Cosmos
|
|
218
|
+
'cosmos:thorchain-mainnet-v1/slip44:931', // Thorchain
|
|
219
|
+
// ... more
|
|
220
|
+
]);
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
## Deployment
|
|
224
|
+
|
|
225
|
+
### Prerequisites
|
|
226
|
+
1. CCXT installed: `bun add ccxt`
|
|
227
|
+
2. Markets module rebuilt: `bun run build`
|
|
228
|
+
3. Environment variables set (optional):
|
|
229
|
+
- `COINGECKO_API_KEY`
|
|
230
|
+
- `COINMARKETCAP_API_KEY`
|
|
231
|
+
- `COINCAP_API_KEY`
|
|
232
|
+
|
|
233
|
+
### Deployment Steps
|
|
234
|
+
1. **Clear bad cache data**:
|
|
235
|
+
```bash
|
|
236
|
+
./skills/fix_pricing_issues/fix_pricing_issues.sh
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
2. **Deploy updated code**:
|
|
240
|
+
```bash
|
|
241
|
+
# Build all modules
|
|
242
|
+
cd projects/pioneer/modules/intergrations/markets
|
|
243
|
+
bun run build
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
3. **Restart services**:
|
|
247
|
+
```bash
|
|
248
|
+
pm2 restart pioneer-server
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
4. **Verify deployment**:
|
|
252
|
+
```bash
|
|
253
|
+
./skills/diagnose_price_issues/diagnose_price_issues.sh
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
## Monitoring
|
|
257
|
+
|
|
258
|
+
### Key Metrics
|
|
259
|
+
- **Price cache hit rate**: Should be >95%
|
|
260
|
+
- **API source distribution**: Should be balanced across all APIs
|
|
261
|
+
- **0-price incidents**: Should be <0.1% for major cryptos
|
|
262
|
+
- **Unpriceable tokens**: Only scam/spam tokens
|
|
263
|
+
|
|
264
|
+
### Log Patterns
|
|
265
|
+
|
|
266
|
+
**Successful randomization**:
|
|
267
|
+
```
|
|
268
|
+
Randomized API order: CCXT → CoinCap → CoinGecko → CoinMarketCap
|
|
269
|
+
✅ Got price from CCXT: $3440.59
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
**Protection activated**:
|
|
273
|
+
```
|
|
274
|
+
🛡️ Refusing to overwrite $3429.11 with $0 for price_v2:eip155:1/slip44:60
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
**Major crypto protection**:
|
|
278
|
+
```
|
|
279
|
+
🚨 MAJOR CRYPTO WITHOUT IDENTIFIERS: eip155:1/slip44:60
|
|
280
|
+
This should NEVER happen - check coingeckoMapping and assetData
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
## Future Improvements
|
|
284
|
+
|
|
285
|
+
### Potential Enhancements
|
|
286
|
+
1. **Weighted randomization**: Prioritize faster/more reliable APIs
|
|
287
|
+
2. **Circuit breaker**: Temporarily skip failing APIs
|
|
288
|
+
3. **Metrics dashboard**: Real-time API health monitoring
|
|
289
|
+
4. **Price arbitrage detection**: Alert on significant price differences
|
|
290
|
+
5. **Historical pricing**: Cache price history for trend analysis
|
|
291
|
+
|
|
292
|
+
### Dependencies to Monitor
|
|
293
|
+
- `ccxt`: Keep updated for exchange support
|
|
294
|
+
- Exchange API changes: Monitor for breaking changes
|
|
295
|
+
- Rate limits: Track and optimize API usage
|
|
296
|
+
|
|
297
|
+
## Troubleshooting
|
|
298
|
+
|
|
299
|
+
### Symptom: Still getting 0 prices
|
|
300
|
+
**Check**:
|
|
301
|
+
1. Run diagnostic skill
|
|
302
|
+
2. Check Redis for bad cache entries
|
|
303
|
+
3. Verify CCXT can reach exchanges
|
|
304
|
+
4. Check API key validity
|
|
305
|
+
|
|
306
|
+
### Symptom: All APIs returning 0
|
|
307
|
+
**Likely Cause**: Network/firewall blocking external APIs
|
|
308
|
+
**Solution**: Check network connectivity to exchange APIs
|
|
309
|
+
|
|
310
|
+
### Symptom: Slow price fetches
|
|
311
|
+
**Likely Cause**: All APIs timing out
|
|
312
|
+
**Solution**:
|
|
313
|
+
- Check CCXT exchange connectivity
|
|
314
|
+
- Verify token bucket not exhausted
|
|
315
|
+
- Check Redis performance
|
|
316
|
+
|
|
317
|
+
## Conclusion
|
|
318
|
+
|
|
319
|
+
The Pioneer pricing system is now significantly more robust with:
|
|
320
|
+
- ✅ 4x redundancy through CCXT integration
|
|
321
|
+
- ✅ Load distribution via randomization
|
|
322
|
+
- ✅ Multi-layer protection for major assets
|
|
323
|
+
- ✅ Diagnostic and recovery tools
|
|
324
|
+
- ✅ Comprehensive testing
|
|
325
|
+
|
|
326
|
+
**No more 0-price issues for major cryptocurrencies!**
|
|
327
|
+
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate and send hourly metrics report
|
|
3
|
+
*/
|
|
4
|
+
export declare function sendHourlyMetricsReport(): Promise<void>;
|
|
5
|
+
/**
|
|
6
|
+
* Get current metrics (for API endpoint)
|
|
7
|
+
*/
|
|
8
|
+
export declare function getCurrentMetrics(): Promise<any>;
|
|
9
|
+
/**
|
|
10
|
+
* Get list of unpriceable tokens
|
|
11
|
+
*/
|
|
12
|
+
export declare function getUnpriceableTokens(limit?: number): Promise<string[]>;
|
|
13
|
+
/**
|
|
14
|
+
* Clear a token from unpriceable list (for manual recovery)
|
|
15
|
+
*/
|
|
16
|
+
export declare function clearUnpriceableToken(caip: string): Promise<boolean>;
|
|
17
|
+
/**
|
|
18
|
+
* Start hourly reporting (call this on module initialization)
|
|
19
|
+
*/
|
|
20
|
+
export declare function startHourlyReporting(): void;
|