Everyone uses DEX aggregators—1inch, ParaSwap, 0x. But aggregators themselves have different prices. Koan is a meta-aggregator: we aggregate the aggregators so you always get the best rate.

1 / 4
$2.4M+
Cumulative trading volume
12,500+
Total transactions
3,200+
Unique wallets
3
Base, Lisk, Sonic
The Problem
I noticed this while trading on Sonic. Swapped 1000 USDC for S tokens on 1inch, then checked ParaSwap out of curiosity. ParaSwap would have given me 2% more.
2% on $1000 is $20. Not life-changing. But across thousands of users and millions in volume? That's real money being lost to aggregator arbitrage.
How It Works
When you initiate a swap on Koan:
User wants: 1000 USDC → ETH
┌─────────────────────────────────────────────────────┐
│ Koan Protocol │
│ │
│ Query all aggregators simultaneously: │
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ 1inch │ │ ParaSwap│ │ 0x │ │ Odos │ │
│ │ 0.312 │ │ 0.315 │ │ 0.311 │ │ 0.314 │ │
│ │ ETH │ │ ETH ✓ │ │ ETH │ │ ETH │ │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
│ │
│ Best rate: ParaSwap @ 0.315 ETH │
│ Execute through ParaSwap │
└─────────────────────────────────────────────────────┘
Aggregators We Query
| Aggregator | Chains | Notes |
|---|---|---|
| 1inch | Most EVM | Industry standard |
| ParaSwap | Most EVM | Often best for stablecoins |
| 0x Protocol | Most EVM | Good liquidity |
| Odos | Base, others | Smart order routing |
| KyberSwap | Multi-chain | Good for exotic pairs |
| OpenOcean | Multi-chain | Wide coverage |
Beyond Swaps
Fiat On/Off Ramps
The "last mile" problem—getting money in and out. We aggregated ramp providers too.
- On-ramp: MoonPay, Transak, Ramp Network
- Off-ramp: Direct to bank, 150+ countries
Prediction Markets
Simple price prediction game. Pick UP or DOWN for BTC/ETH over 5, 15, or 60 minutes. Winners share the pool.
Lottery
Weekly draws with Chainlink VRF for provably fair randomness. Portion of ticket sales burned.
Technical Highlights
Quote Engine
async function getBestQuote(params: SwapParams): Promise<Quote> {
const quotes = await Promise.allSettled([
query1inch(params),
queryParaSwap(params),
query0x(params),
queryOdos(params),
]);
return quotes
.filter((q) => q.status === "fulfilled")
.map((q) => q.value)
.reduce((best, curr) => (curr.netReturn > best.netReturn ? curr : best));
}
Typical latency: 200-400ms across all aggregators.
What I Learned
- Aggregation is recursive — If aggregators exist, meta-aggregators will too
- Latency is money — Every 100ms of quote latency is potential slippage
- Users want ecosystems — Single-purpose DeFi apps struggle to retain users