Purpose and Responsibilities
The Driver provides a standardized interface for solver engines:- Liquidity Fetching: Collects on-chain liquidity from DEXes (Uniswap, Balancer, etc.)
- Solution Encoding: Converts high-level solutions into settlement contract calldata
- Simulation: Validates solutions before submission using Tenderly, Enso, or node simulation
- Transaction Submission: Manages gas pricing, nonce handling, and tx broadcast
- Mempool Integration: Monitors transaction status and handles replacements
- Quote Generation: Provides price quotes based on solver solutions
The Driver-Solver architecture separates concerns: Solvers focus on route-finding algorithms, while Drivers handle all blockchain interactions.
Solution Execution Flow
Fromcrates/driver/README.md, the interaction follows this sequence:
Request Flow
Liquidity Fetching
The Driver collects on-chain liquidity from multiple DEX protocols:Supported Liquidity Sources
Fromcrates/driver/example.toml:
Base Tokens
Define tokens that can appear as intermediate hops:CoW AMMs
Include CoW Protocol AMM pools:Simulation and Settlement
Simulation Options
The Driver supports multiple simulation backends:1. Ethereum Node (Default)
Simulates using the configured Ethereum RPC:- ✅ No additional configuration
- ✅ Accurate gas estimation
- ⚠️ Slower than specialized simulators
2. Tenderly
High-performance simulation with debugging features:- ✅ Fast simulation
- ✅ Detailed execution traces
- ✅ Automatic failure debugging
- ⚠️ Requires Tenderly account
3. Enso
Specialized simulation for complex DeFi interactions:- ✅ Optimized for DeFi protocols
- ✅ Fast execution
- ⚠️ Requires Enso service
Simulation Tuning
Optimize simulation behavior:Settlement Encoding
Driver converts solutions to settlement contract calldata:Transaction Submission
Gas Price Management
Fromcrates/driver/example.toml:
Mempool Configuration
Configure multiple mempools for transaction submission:- Multiple submission endpoints for redundancy
- Automatic gas price adjustment
- Transaction replacement logic
- Nonce management
- Reorg handling
Account Management
Solvers can use different accounts for submission:Configuration Options
Command-Line Arguments
Fromcrates/driver/src/infra/cli.rs:
| Argument | Environment Variable | Default | Description |
|---|---|---|---|
--addr | ADDR | 0.0.0.0:11088 | HTTP server address |
--log | LOG | warn,driver=debug | Log filter |
--ethrpc | ETHRPC | Required | Ethereum RPC URL |
--ethrpc-max-batch-size | ETHRPC_MAX_BATCH_SIZE | 20 | RPC batch size |
--ethrpc-max-concurrent-requests | ETHRPC_MAX_CONCURRENT_REQUESTS | 10 | Concurrent RPC calls |
--config | CONFIG | Required | Path to TOML config |
Configuration File Structure
Complete example fromcrates/driver/example.toml:
Colocated vs Non-Colocated Solvers
From CLAUDE.md architecture description:Colocated Solvers
External partners run their own driver + solver:- ✅ Full control over infrastructure
- ✅ Can optimize driver for specific solver
- ✅ Keep solver logic private
- ⚠️ Must maintain driver version
- ⚠️ Responsible for settlements
Non-Colocated Solvers
We run the driver, configured with solver API:- ✅ CoW Protocol handles driver maintenance
- ✅ Simplified partner integration
- ✅ Protocol manages settlements
- ⚠️ Solver must expose HTTP API
- ⚠️ Less infrastructure control
Non-colocated is recommended for new solvers. It reduces operational burden and lets partners focus on algorithm development.
Running the Service
Basic Setup
Docker Deployment
Environment Configuration
API Endpoints
POST /solve
Receive auction and return solutions:POST /settle
Execute winning solution:POST /quote
Generate quote for trading:See the OpenAPI documentation at
/docs endpoint for complete API reference.Monitoring and Debugging
Metrics
Prometheus metrics available:driver_solve_duration_seconds- Time to process /solve requestsdriver_simulation_duration_seconds- Simulation latencydriver_settlement_submissions- Settlement submission attemptsdriver_liquidity_fetch_duration_seconds- Liquidity fetch time
Logging
Structured logs with trace IDs:Tenderly Integration
If using Tenderly simulator:Performance Optimization
RPC Batching
Batch multiple RPC calls:
Concurrent Requests
Increase parallelism:
Liquidity Caching
Pre-initialize pools:
Simulation
Use Tenderly for speed:
Troubleshooting
Solver Connection Failures
Check solver endpoint is accessible:Simulation Failures
Review simulation logs and verify:- Token allowances
- Sufficient balances
- Valid solution encoding
- Gas limits
Transaction Submission Errors
Common issues:- Nonce conflicts (check mempool state)
- Gas price too low
- Insufficient ETH for gas
- Smart contract reverts
High Latency
Optimize:- Increase RPC batch size
- Use Tenderly for simulation
- Reduce liquidity sources
- Enable request compression
