Розробка торгового бота для DEX на Base
Base — це OP Stack L2 від Coinbase, запущений в серпні 2023. За перший рік виріс в один з топ-3 L2 по TVL та активним адресам. Для торгових ботів Base цікавий по трьох причинам: низький газ (в 50–100x дешевше mainnet), зростаюча DEX ліквідність на Aerodrome та Uniswap V3, та специфіка sequencer, яка відрізняється від Ethereum.
Екосистема DEX на Base
Ключові платформи для інтеграції:
| DEX | Модель | Об'єм (2024) | Особливості |
|---|---|---|---|
| Aerodrome Finance | ve(3,3) AMM + CLOB | $1B+ / день | Форк Velodrome, нативний DEX Base |
| Uniswap V3 | Concentrated liquidity | $500M+ / день | Стандартний V3, ті ж контракти що mainnet |
| BaseSwap | Fork Uniswap V2 | $50M / день | Менше ліквідності |
| SushiSwap | V2 + Trident | $20M / день | Мультичейн, кросс-DEX арбітраж |
Aerodrome — пріоритет для глибокої інтеграції: 60%+ DEX об'єму Base проходить через нього.
Aerodrome: архітектура, важлива для бота
Aerodrome наслідує Velodrome V2 архітектуру з двома типами пулів:
Volatile pools (Pool.sol): стандартна x*y=k формула. Підходит для некорельованих пар (ETH/USDC, cbBTC/USDC).
Stable pools (Pool.sol з stable=true): крива x³y + y³x = k — оптимізована для близьких по цені активів (USDC/USDT, cbETH/wstETH). Важливо: для стейбл-пулів getAmountOut() дає інший результат при тих же вхідних даних.
// Aerodrome Router ABI
const AERODROME_ROUTER = '0xcF77a3Ba9A5CA399B7c97c74d54e5b1Beb874E43'
const routes = [{
from: WETH_ADDRESS,
to: USDC_ADDRESS,
stable: false, // Для volatile пари
factory: AERODROME_FACTORY
}]
const amounts = await aerodromeRouter.getAmountsOut(amountIn, routes)
Помилка, яку роблять розробники з EVM-фоном: використовують stable: false для всіх пар. Для USDC/USDbC пари це дає розраховану amountOut в 5–10% гіршою через неправильну криву.
ve(3,3) та epoch rewards
Aerodrome використовує veAERO (locked voting tokens) для спрямування emissions в пули. Для арбітражного бота це важливо опосередковано: пули з високими emissions привабляють більше LP, мають менший slippage. Відстеження голосувань та emissions допомагає передбачити, де з'явиться глибока ліквідність.
Sequencer специфіка на Base
Base використовує централізований sequencer під управлінням Coinbase. Для ботів це принципово змінює MEV ландшафт:
- Публічного mempool у Ethereum-смислі немає. Sequencer публікує транзакції атомарно.
- Класичні sandwich атаки через frontrunning практично неможливі.
- Арбітраж DEX ↔ DEX на Base працює добре: немає конкуренції з flashbots bundles у тій же формі.
- Latency до sequencer критична: розміщення сервера в us-east-1 (AWS) або co-location у San Francisco (ближче до Coinbase інфраструктури) дає перевагу.
Транзакції відправляються прямо в https://mainnet.base.org RPC або через Alchemy/Infura Base endpoints. Для мінімальної latency — власна нода з op-geth або прямий endpoint Coinbase (через партнерську програму).
Арбітражна стратегія: Base міжпротокольний
Найдоступніший та найстабільніший MEV на Base — арбітраж між різними DEX:
Аеродром vs Uniswap V3: та ж пара (ETH/USDC) торгується на двох різних площадках з різною ціною через асинхронну LP поведінку.
Стейблкоин арбітраж: USDC vs USDbC (bridged USDC) vs axlUSDC — часто торгуються з slight discount/premium на різних пулах.
cbETH / wstETH арбітраж: похідні ETH активи, ціна прив'язана до ETH через exchange rate. При відхиленні від справедливої вартості — арбітражна можливість.
Базовий цикл бота:
async function checkArbitrage(tokenA: Address, tokenB: Address) {
// Паралельний запрос цін з двох DEX
const [aeroPrice, uniPrice] = await Promise.all([
getAerodromePrice(tokenA, tokenB, amountIn),
getUniswapV3Price(tokenA, tokenB, amountIn)
])
const priceDiff = Math.abs(aeroPrice - uniPrice) / Math.min(aeroPrice, uniPrice)
if (priceDiff > MIN_PROFIT_THRESHOLD) {
const gasEstimate = await estimateArbitrageGas(...)
const gasCostUSD = gasEstimate * gasPrice * ethPrice
const grossProfit = calculateProfit(aeroPrice, uniPrice, amountIn)
if (grossProfit > gasCostUSD * 1.5) { // Мінімум 1.5x покриття gas
await executeArbitrage(...)
}
}
}
Атомарний арбітраж через flash loan
На Base доступні Aave V3 flash loans (контракт деплоєн на Base). Атомарний арбітраж: беремо flash loan → купляємо дешевше → продаємо дороже → повертаємо flash loan + fee (0.09%).
Перевага: не потрібен власний капітал для арбітражу. Flash loan fee 0.09% встановлює мінімальний поріг прибутковості — різниця цін повинна бути > 0.09% + gas.
contract BaseArbitrageBot is IFlashLoanSimpleReceiver {
function executeArbitrage(address token, uint256 amount, bytes calldata params) external {
// Запитуємо flash loan
POOL.flashLoanSimple(address(this), token, amount, params, 0);
}
function executeOperation(
address asset, uint256 amount, uint256 premium,
address, bytes calldata params
) external override returns (bool) {
(address dexA, address dexB, bytes memory swapDataA, bytes memory swapDataB)
= abi.decode(params, (address, address, bytes, bytes));
// Купляємо на dexA (дешевше)
IERC20(asset).approve(dexA, amount);
(bool successA,) = dexA.call(swapDataA);
require(successA, "Swap A failed");
// Продаємо на dexB (дороже)
uint256 received = IERC20(outputToken).balanceOf(address(this));
IERC20(outputToken).approve(dexB, received);
(bool successB,) = dexB.call(swapDataB);
require(successB, "Swap B failed");
// Повертаємо flash loan + premium
uint256 repayAmount = amount + premium;
IERC20(asset).approve(address(POOL), repayAmount);
return true;
}
}
Контракт — мініималістичний. Ніякого storage state — все через calldata та события.
Мониторинг та управління ризиками
Price deviation alerts: якщо розбіжність цін між DEX перевищує 2% — потенціальна аномалія (манипуляція, баг оракула). Бот повинен зупинятися до прояснення.
Gas price tracking: на Base газ нестабільний при високій нагрузі. Бот повинен проверяти eth_gasPrice та встановлювати maxFeePerGas динамічно. Жорсткий ліміт gas price — вище порогу арбітраж нецікавий.
Slippage на крупних позиціях: розрахунок getAmountsOut для суми X не враховує, що під час виконання ціна сдвинеться. Для крупних свапів потрібна симуляція з урахуванням price impact — або поділ на кілька менших транзакцій.
Dead man's switch: якщо бот не робив транзакцій більше N хвилин при наявності можливостей — алерт на Telegram/Discord. Могло статися: нода упала, немає балансу на газ, unexpected revert.
Стек розробки
Бот: TypeScript + viem (переважніше ethers.js для Base через кращу підтримку EIP-1559 типів). Bull (Redis-backed queue) для управління чергою транзакцій. Prometheus + Grafana для метрик.
Контракти: Solidity 0.8.24 + Foundry. Fork-тест на Base mainnet через forge test --fork-url https://mainnet.base.org. Foundry підтримує Base як target network.
Деплой бота: Docker на AWS EC2 (us-east-1) або Fly.io для простоти, з автоматичним рестартом через systemd/Supervisor.
Процес роботи
Дослідження (2–3 дні). Аналіз MEV можливостей на Base через Dune Analytics, оцінка об'ємів та конкуренції.
Розробка (1–2 тижні). Інтеграція з Aerodrome та Uniswap V3, арбітражний движок, flash loan контракт, мониторинг.
Тестування (3–5 днів). Backtesting на історичних даних Base, paper trading в fork-тестах.
Запуск. Деплой з малими сумами → мониторинг продуктивності → масштабування.







