Розробка flash loan арбітражного бота
Розрив у ціні WETH між Uniswap v3 та SushiSwap: 0.3%. На $500k занятих через Aave flash loan — це $1,500 до комісій. Після уплати 0.09% flash loan fee ($450) та газу ($20-50 на Ethereum mainnet) — чистий прибуток близько $1,000 за одну атомарну транзакцію, яка виконується або повністю, або откатується без потерь капіталу. Саме ця атомарність робить flash loan арбітраж принципово іншим видом торгівлі порівняно з класичним.
Чому «простий» арбітраж не працює
Gas auction та MEV конкуренція
На публічному mempool ти не один, хто бачить ціновий розрив. MEV-боти сканують mempool та фронтранять прибуткові транзакції — виставляють більш високий gas price, їхня транзакція потрапляє в блок першою, розрив закривається, твоя транзакція реверсується, газ сгорів.
Рішення: відправка через Flashbots eth_sendBundle. Транзакція йде напрямки валідатору, минаючи публічний mempool. Ніякого фронтраннінгу, ніякого gas auction з ботами. Flashbots беруть процент від прибутку (miner tip), але це передбачувано.
Другий варіант — MEV Blocker або BuilderNet для ширшого охоплення. На L2 (Arbitrum, Base) централізований sequencer знижує MEV-ризики, але не усуває їх повністю — приватні mempool там теж є.
Sandwich-захист у executor-контракті
Контракт отримав flash loan, купив WETH на DEX A, повинен продати на DEX B. Між цими двома свапами є вікно — в теорії sandwich-бот може вмішатися, якщо транзакція багатошагова. На практиці для flash loan арбітража все виконується в одній транзакції, тому зовнішній sandwich неможливий. Але amountOutMinimum на кожний свап обов'язковий — інакше sandwich у межах того ж блока через інші транзакції може зсунути price пулу.
Revert та газ-потері
Flash loan реверсується, якщо не повернути борг з fee в тій же транзакції. Якщо арбітражна логіка падає — весь газ сгорає. На Ethereum mainnet невдала транзакція обходиться в $10-50. При високій частоті спроб це накопичується.
Оптимізація: pre-simulation перед відправкою. eth_call з повним calldata — контракт моделюється безплатно, і ми бачимо revert/success до того, як тратити реальний газ. У production-боті це обов'язковий крок: simulate → if success → send bundle.
Як будуємо систему
Компоненти
Price scanner — off-chain сервіс на TypeScript/viem, підписаний на `Swap» события всіх відстежуваних пулів через WebSocket. При кожній eventi перерахуємо spot price та порівнюємо з матрицею пар. Виявлений розрив > порога (з врахуванням всіх комісій) — сигнал для арбітража.
Profit calculator — точний розрахунок PnL з врахуванням: flash loan fee (Aave v3: 0.09%, Balancer: 0%), газу на поточному блоці (через eth_gasPrice + EIP-1559 base fee), slippage обох свапів (через Quoter), multisig tip для Flashbots. Якщо результат негативний — не відправляємо.
Executor contract — Solidity контракт, реалізуючий IFlashLoanSimpleReceiver (Aave) або IFlashLoanRecipient (Balancer). Усередину executeOperation / receiveFlashLoan — логіка двох свапів та повернення боргу.
| Flash loan провайдер | Fee | Ліміт | Особливості |
|---|---|---|---|
| Aave v3 | 0.09% | Ліквідність пулу | ERC-3156 сумісний |
| Balancer v2 | 0% | Ліквідність vault | Немає fee до кінця транзакції |
| Uniswap v3 | 0.05-1% | Ліквідність пулу | Flash swap, токен повертається в пул |
| dYdX | 0% | Обмежені активи | Solo Margin, складніше інтегрувати |
Executor: що усередину
function executeOperation(
address asset,
uint256 amount,
uint256 premium,
address initiator,
bytes calldata params
) external returns (bool) {
require(msg.sender == address(POOL), "Caller not Aave Pool");
require(initiator == address(this), "Initiator mismatch");
(address dexA, address dexB, uint256 amountOutMin) =
abi.decode(params, (address, address, uint256));
// swap on DEX A
uint256 received = _swapExact(dexA, asset, targetToken, amount, 0);
// swap back on DEX B
uint256 finalAmount = _swapExact(dexB, targetToken, asset, received, amountOutMin);
uint256 totalDebt = amount + premium;
require(finalAmount >= totalDebt, "Unprofitable");
IERC20(asset).approve(address(POOL), totalDebt);
return true;
}
Перевірки msg.sender та initiator» — обов'язкові. Без них будь-хто може викликати executeOperationнапрямки, передаючи довільнийparams`, та дренувати токени, які контракт тримає в approve.
Моніторинг та обслуговування
Арбітражний бот — не set-and-forget система. Розриви сужаються по мірі того, як конкурентів стає більше. Потрібен dashboard: кількість спроб на годину, процент успішних, середня прибуток, витрата газу. Якщо success rate падає нижче 5% — пора переглядати пороги або додавати нові пари.
Процес роботи
Аналітика (2-3 дні). Визначаємо цільові пари, чейни, DEX. Аналізуємо історичні дані розривів через The Graph або Dune Analytics — оцінюємо реалістичну прибутковість.
Розробка (1-2 тижні). Executor-контракт + off-chain scanner + Flashbots інтеграція. Fork-тесты на історичному блоці з реальними розривами.
Тестування. Прогон на testnet (Sepolia) з тестовими flash loan. Потім mainnet в режимі simulation-only (тільки eth_call, без відправки) — тиждень збору даних та калібровки порогів.
Продакшн деплой. Executor через Gnosis Safe (owner-функції захищені). Скрипти моніторингу та auto-restart через PM2.
Орієнтири по срокам
Базовий бот для одного чейну та двох DEX — 1-2 тижні. Мультичейн система з власним price graph та Flashbots інтеграцією — 3-4 тижні.
Вартість розраховується після аналізу технічного завдання.







