Разработка крипто-обменника
Крипто-обменник проще биржи архитектурно, но требует продуманной бизнес-логики: управление ликвидностью, курсообразование, интеграция с платёжными системами. Задача обменника — купить криптовалюту у одной стороны и продать другой с маржой или напрямую конвертировать.
Модели обменника
Агрегатор (без собственной ликвидности)
Обменник роутит транзакции через API партнёров: Changelly, ChangeNow, SimpleSwap. Своих резервов нет, прибыль — партнёрская комиссия или разница курсов.
Плюсы: минимальные операционные риски, быстрый запуск.
Минусы: зависимость от партнёров, ограниченный контроль над курсами.
С собственными резервами
Обменник держит запасы разных валют. При обмене — выдаёт из резерва, пополняет через биржи.
Плюсы: полный контроль над курсами, нет зависимости от партнёров.
Минусы: операционные риски (хранение криптовалюты), необходимость управления ликвидностью.
Гибридная модель
Мелкие обмены — из резерва, крупные — через агрегатор. Оптимальный выбор для большинства проектов.
Курсообразование
class RateCalculator:
def __init__(self, markup_pct: float = 1.5):
self.markup_pct = markup_pct # маржа обменника
self.price_feeds: dict[str, PriceFeed] = {} # цены с внешних бирж
def get_exchange_rate(self, from_currency: str, to_currency: str,
amount: Decimal) -> ExchangeQuote:
# Получаем базовую рыночную цену
market_rate = self.price_feeds['binance'].get_price(from_currency, to_currency)
# Применяем маркап
markup_multiplier = Decimal(1) - Decimal(str(self.markup_pct)) / 100
client_rate = market_rate * markup_multiplier
# Учитываем fee сети (сумма которую потеряем на transfer)
network_fee = self.get_network_fee(to_currency)
result_amount = amount * client_rate - network_fee
return ExchangeQuote(
from_currency=from_currency,
to_currency=to_currency,
from_amount=amount,
to_amount=result_amount,
rate=client_rate,
network_fee=network_fee,
expires_at=datetime.utcnow() + timedelta(minutes=15), # фиксируем курс на 15 мин
)
Динамическая маржа
Маржа зависит от суммы: малые суммы — высокая маржа (высокий % fee от сети), крупные — пониженная для привлечения больших клиентов:
def get_dynamic_markup(self, amount_usd: Decimal) -> Decimal:
tiers = [
(Decimal('100'), Decimal('3.0')), # до $100 — 3%
(Decimal('1000'), Decimal('2.0')), # до $1000 — 2%
(Decimal('10000'), Decimal('1.5')), # до $10k — 1.5%
(Decimal('inf'), Decimal('1.0')), # выше $10k — 1%
]
for threshold, markup in tiers:
if amount_usd <= threshold:
return markup
return tiers[-1][1]
Процесс обмена
1. Клиент указывает: отдаю BTC, получаю USDT, сумма X
2. Система: генерирует депозитный адрес BTC, фиксирует курс на 15-30 мин
3. Клиент отправляет BTC на депозитный адрес
4. Система: мониторит блокчейн, ждёт N подтверждений
5. После подтверждения: конвертирует и отправляет USDT на адрес клиента
6. Клиент получает уведомление с TxHash вывода
Ключевые состояния транзакции:
class ExchangeStatus(str, Enum):
CREATED = 'created' # создана, ожидаем депозит
AWAITING = 'awaiting' # депозит замечен, ожидаем подтверждения
CONFIRMING = 'confirming' # N/M подтверждений
EXCHANGING = 'exchanging' # конвертируем
SENDING = 'sending' # отправляем клиенту
FINISHED = 'finished' # завершено
EXPIRED = 'expired' # время истекло, депозита не было
FAILED = 'failed' # ошибка
REFUNDED = 'refunded' # возврат
Управление резервами
class ReserveManager:
def reserve_for_exchange(self, currency: str, amount: Decimal) -> bool:
"""Резервируем сумму для выплаты клиенту"""
available = self.get_available_reserve(currency)
if available < amount:
# Не хватает резервов — нужно пополнить
self.trigger_reserve_topup(currency, amount)
return False
# Атомарно резервируем
self.db.execute(
"UPDATE reserves SET reserved = reserved + %s WHERE currency = %s",
(amount, currency)
)
return True
def check_low_reserves(self):
"""Уведомление при низких резервах"""
for currency, balance in self.get_all_reserves():
threshold = self.config.reserve_thresholds[currency]
if balance < threshold:
self.alerter.send(f"Low reserve: {currency} = {balance} (threshold: {threshold})")
Технический стек
| Компонент | Технология |
|---|---|
| Backend | Python (FastAPI) / Go |
| База данных | PostgreSQL |
| Блокчейн мониторинг | Собственный + Alchemy/QuickNode |
| Курсовые данные | Binance / CoinGecko API |
| Очереди задач | Redis + Celery / Bull |
| Frontend | React / Next.js |
| KYC/AML | Sumsub / Veriff (опционально) |
Сроки разработки
- MVP (2–3 пары, без KYC): 6–8 недель
- Полноценный обменник (10+ пар, KYC, admin panel): 3–4 месяца
- Мобильное приложение: +2–3 месяца







