Розробка крипто-обменника
Крипто-обменник простіше біржі архітектурно, але вимагає продуманої бізнес-логіки: управління ліквідністю, курсообразування, інтеграція з платіжними системами. Задача обменника — купити криптовалюту у однієї сторони та продати іншій з маржою або напряму конвертувати.
Моделі обменника
Агрегатор (без власної ліквідності)
Обменник роутить транзакції через 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 місяці







