6.0 KiB
Fee Oracle Specification
Overview
This document specifies the fee estimation service that calculates and predicts transaction fees based on historical data and current mempool conditions.
Architecture
flowchart TB
subgraph Data[Data Sources]
Blocks[Recent Blocks]
Mempool[Current Mempool]
History[Historical Data]
end
subgraph Analysis[Analysis]
Percentile[Percentile Calculator]
Prediction[Prediction Model]
Adjust[Market Adjuster]
end
subgraph Output[Output]
Estimates[Fee Estimates]
API[API Endpoint]
Cache[Cache]
end
Blocks --> Percentile
Mempool --> Percentile
History --> Prediction
Percentile --> Adjust
Prediction --> Adjust
Adjust --> Estimates
Estimates --> API
Estimates --> Cache
Fee Calculation Methods
Method 1: Percentile-Based (Primary)
Algorithm:
- Collect gas prices from recent N blocks (e.g., 100 blocks)
- Calculate percentiles: 25th, 50th, 75th, 95th
- Use percentiles as fee estimates
Percentile Mapping:
- Slow: 25th percentile
- Standard: 50th percentile (median)
- Fast: 75th percentile
- Urgent: 95th percentile
Update Frequency: Every new block
Method 2: Mempool-Based Adjustment
Algorithm:
- Start with percentile-based estimates
- Analyze current mempool:
- Average gas price of pending transactions
- Pending transaction count
- Mempool pressure (pending / recent block capacity)
- Adjust estimates based on mempool conditions
Adjustment Factors:
- High mempool pressure → Increase estimates
- Low mempool pressure → Decrease estimates
- Recent confirmed gas prices → Weight recent data more
Method 3: Time-Based Prediction
Algorithm:
- Predict fees for different confirmation times
- Example: "To be confirmed in 1 block, use X gas price"
- Use historical data to train model
Prediction Targets:
- 1 block (next block)
- 3 blocks (within 3 blocks)
- 10 blocks (within 10 blocks)
Fee Estimate Structure
Standard Estimates
{
"chain_id": 138,
"block_number": 12345,
"estimates": {
"slow": {
"gas_price": "20000000000",
"max_fee_per_gas": "20000000000",
"max_priority_fee_per_gas": "1000000000",
"confidence": 0.95,
"estimated_confirmation_time": "5 minutes"
},
"standard": {
"gas_price": "30000000000",
"max_fee_per_gas": "30000000000",
"max_priority_fee_per_gas": "2000000000",
"confidence": 0.90,
"estimated_confirmation_time": "2 minutes"
},
"fast": {
"gas_price": "50000000000",
"max_fee_per_gas": "50000000000",
"max_priority_fee_per_gas": "3000000000",
"confidence": 0.85,
"estimated_confirmation_time": "30 seconds"
},
"urgent": {
"gas_price": "100000000000",
"max_fee_per_gas": "100000000000",
"max_priority_fee_per_gas": "5000000000",
"confidence": 0.80,
"estimated_confirmation_time": "next block"
}
},
"timestamp": "2024-01-01T00:00:00Z"
}
EIP-1559 Support
For EIP-1559 Chains:
- Provide
max_fee_per_gasandmax_priority_fee_per_gas - Calculate base fee prediction
- Estimate priority fee needed for desired speed
Historical Fee Analysis
Data Collection
Sources:
- Recent blocks (last 100-1000 blocks)
- Historical fee data (time-series database)
Metrics Tracked:
- Min, max, average gas price per block
- Percentiles (25th, 50th, 75th, 95th, 99th)
- Gas price distribution
- Confirmation time by gas price
Analysis Windows
Short-term (Last 10 blocks):
- Most recent trends
- Quick response to market changes
Medium-term (Last 100 blocks):
- Stable baseline
- Primary estimate source
Long-term (Last 1000 blocks):
- Historical patterns
- Anomaly detection
Prediction Models
Simple Moving Average
Algorithm: Average of recent N blocks
Pros: Simple, fast Cons: Slow to adapt to changes
Weighted Moving Average
Algorithm: Weight recent blocks more heavily
Pros: Faster adaptation Cons: More volatile
Machine Learning Models (Future)
Potential Models:
- Linear regression
- Time series forecasting (ARIMA, LSTM)
- Classification (predict confirmation time)
Features:
- Historical gas prices
- Mempool metrics
- Block time
- Network activity
API Endpoint
Get Fee Estimates
GET /api/v1/mempool/{chain_id}/fees
Query Parameters:
block_target(integer): Target confirmation block (optional)
Response: Fee estimates object (see structure above)
Get Fee History
GET /api/v1/mempool/{chain_id}/fees/history
Query Parameters:
period(string): Time period (1h, 24h, 7d, 30d)interval(string): Aggregation interval (1m, 5m, 1h)
Response: Historical fee data with timestamps
Caching Strategy
Cache Duration
- Fee Estimates: 10 seconds (update every block)
- Fee History: 5 minutes (less frequently updated)
Cache Invalidation
- Invalidate on new block
- Invalidate on significant mempool changes
Performance Considerations
Calculation Performance
Target: Calculate estimates in < 100ms
Optimization:
- Pre-calculate percentiles
- Cache historical data
- Use efficient algorithms
Update Frequency
Block-based: Update on every new block Time-based: Update every 10 seconds (fallback)
Accuracy Metrics
Tracking Accuracy
Metrics:
- Predicted vs actual confirmation time
- Predicted vs actual gas price used
- Estimate accuracy by tier (slow/standard/fast/urgent)
Confidence Scores
Calculation:
- Based on historical accuracy
- Variance in recent data
- Mempool stability
Display: Include confidence score in estimates
Monitoring
Metrics
- Fee estimate accuracy
- Update latency
- Calculation time
- Cache hit rate
Alerts
- High prediction error (> 50% off)
- Calculation timeout
- Cache miss rate spike
References
- Mempool Service: See
mempool-service.md - Time-Series Schema: See
../database/timeseries-schema.md