Setting up bridging aggregator gas oracles involves configuring real-time gas price feeds for cross-chain bridges and aggregators. Here’s a step-by-step guide:
1. Understand the Purpose

Gas oracles for bridging aggregators:
Estimate transaction costs on destination chains
Help users choose optimal routes based on gas prices
Prevent failed transactions due to low gas
2. Key Components
Gas Oracle Sources
Chain-specific RPC nodes (
eth_gasPrice,eth_feeHistory)Public gas APIs (Etherscan, GasStation, Polygon Gas Station)
Gas price predictors (EIP-1559
maxFeePerGasandmaxPriorityFeePerGas)Aggregated gas data from services like:
GasNow (deprecated for Ethereum, but alternatives exist)
Blocknative Gas Platform
OpenZeppelin Defender Gas Station
Chainlink Gas Station (for some chains)
Bridge-Specific Needs
L1→L2 bridges: Need L1 gas + L2 gas estimates
L2→L2: Need both L2 gas prices
Multichain bridges: Need gas data for all supported chains
3. Implementation Steps
3.1. Single Chain Gas Oracle
// Example: Ethereum EIP-1559 gas oracle
async function getEthereumGas() {
const feeHistory = await provider.send("eth_feeHistory", [
"0x4", // 4 blocks
"latest",
[25, 50, 75] // percentiles
]);
const baseFee = parseInt(feeHistory.baseFeePerGas[feeHistory.baseFeePerGas.length - 1], 16);
const priorityFee = parseInt(feeHistory.reward[0][0], 16);
return {
maxFeePerGas: baseFee + priorityFee,
maxPriorityFeePerGas: priorityFee,
gasPrice: baseFee + priorityFee // legacy
};
}
3.2. Multi-Chain Gas Oracle Service
# Pseudocode for multi-chain gas oracle
class GasOracleService:
def __init__(self):
self.chains = {
'ethereum': {'rpc': ETH_RPC, 'type': 'eip1559'},
'bsc': {'rpc': BSC_RPC, 'type': 'legacy'},
'polygon': {'rpc': POLYGON_RPC, 'type': 'legacy'},
'arbitrum': {'rpc': ARB_RPC, 'type': 'eip1559'}
}
async def get_gas_all_chains(self):
prices = {}
for chain, config in self.chains.items():
if config['type'] == 'eip1559':
prices[chain] = await self.get_eip1559_gas(config['rpc'])
else:
prices[chain] = await self.get_legacy_gas(config['rpc'])
return prices
3.3. Integrate with Bridge Aggregator
// Bridge routing with gas consideration
async function findBestRoute(
fromChain: string,
toChain: string,
gasData: GasPrices
) {
const routes = await getAvailableRoutes(fromChain, toChain);
for (const route of routes) {
// Calculate total cost = bridge fee + destination gas
route.totalCost = route.bridgeFee +
(route.destinationGasLimit * gasData[toChain].gasPrice);
}
return routes.sort((a, b) => a.totalCost - b.totalCost)[0];
}
4. Oracle Deployment Options
Option A: Self-Hosted Oracle
Run your own nodes/RPC endpoints
Fetch gas data periodically (every 10-15 seconds)
Expose via API endpoint
Pros: Full control, no API costs
Cons: Maintenance overhead
Option B: Third-Party Oracle Services
Chainlink Data Feeds: Use existing gas price feeds
Pyth Network: Cross-chain gas price data
API3: First-party oracles
Pros: Reliable, decentralized
Cons: Cost, may not support all chains
Option C: Hybrid Approach
Use third-party for main chains (Ethereum)
Self-host for smaller chains
Implement fallback mechanisms
5. Configuration Example
Gas Oracle Config File
chains:
ethereum:
gas_oracle:
source: "eip1559"
rpc: "https://eth.llamarpc.com"
fallback_api: "https://api.etherscan.io/v1/gas/estimator"
update_interval: 15
priority_levels:
low: 1.0
medium: 1.5
high: 2.0
polygon:
gas_oracle:
source: "legacy"
rpc: "https://polygon-rpc.com"
gas_station: "https://gasstation.polygon.technology/v2"
update_interval: 30
Bridge Aggregator Integration
class BridgeAggregator {
constructor(gasOracle) {
this.gasOracle = gasOracle;
}
async quoteBridge(params) {
const gasPrices = await this.gasOracle.getCurrentPrices();
return {
route: params.route,
estimatedGas: params.gasLimit * gasPrices[params.destinationChain].medium,
totalCost: params.bridgeFee + (params.gasLimit * gasPrices[params.destinationChain].medium)
};
}
}
6. Best Practices
Cache Results: Update every 15-30 seconds, not every request
Fallback Sources: Have multiple data sources per chain
Monitor Accuracy: Track actual vs estimated gas costs
Adjust for Congestion: Scale gas estimates during high traffic
Cross-Chain Validation: Verify gas prices match destination chain requirements
Security: Sign oracle responses if used on-chain
7. Available Tools & Libraries
Open Source Gas Oracles:
SDKs:
Monitoring: Grafana dashboards for gas price tracking
8. Example Architecture
User Request → Bridge Aggregator → Gas Oracle Service → Route Calculation
↓ ↓ ↓
Quote with Multiple Real-time gas
gas estimates bridge options for all chains
Important Considerations
L2 Variations: Arbitrum/Optimism have different gas models
Gas Tokens: Some chains use different tokens for gas
Gas Sponsorship: Some bridges sponsor gas (like Biconomy)
Dynamic Updates: Gas prices change rapidly during congestion
Start with a simple implementation using public RPCs and APIs, then scale to a more robust solution as your bridging aggregator grows in usage and supported chains.
