Разработка off-ramp шлюза (крипто → фиат)
Off-ramp — обратный процесс: пользователь продаёт криптовалюту и получает фиатные деньги на банковский счёт или карту. Технически и регуляторно это сложнее on-ramp: платформа принимает крипто (необратимо), конвертирует в фиат и выполняет банковский перевод. Любой сбой на любом этапе — прямые финансовые потери.
Ключевые отличия от on-ramp
В on-ramp основной риск — chargeback: пользователь вернёт платёж после получения крипто. В off-ramp эта угроза отсутствует, но появляются другие:
Compliance-риски: банки крайне осторожны в отношении крипто-компаний. Многие традиционные банки отказывают в обслуживании VASP. Нужны партнёрские банки с опытом работы с криптобизнесом.
AML-сложность: при off-ramp система должна проверить происхождение криптовалюты. Монеты с mixer'ов (Tornado Cash и аналоги) или известных мошеннических адресов должны быть заблокированы. Blockchain analytics — обязательный компонент.
FX-риск: между получением крипто и отправкой фиата проходит время. За это время курс может измениться. Система должна немедленно хеджировать позицию.
Архитектура off-ramp шлюза
Crypto Receiving Module — мониторинг входящих транзакций на deposit адресах. Ожидание необходимого количества подтверждений перед началом обработки.
Blockchain Analytics Module — скрининг входящих монет:
class CryptoScreener:
def __init__(self, chainalysis_client: ChainalysisClient):
self.client = chainalysis_client
async def screen_transaction(self, tx_hash: str, amount: float) -> ScreeningResult:
result = await self.client.check_transaction(tx_hash)
# Риск-классификация
if result.risk_score >= 8: # 0-10 шкала
return ScreeningResult.REJECT
elif result.risk_score >= 5:
return ScreeningResult.MANUAL_REVIEW
else:
return ScreeningResult.APPROVE
# Специфические кейсы
if any(cat in result.categories for cat in ["mixer", "sanctions", "darknet"]):
return ScreeningResult.REJECT
Hedging Module — немедленная продажа полученной крипто на CEX для фиксации курса. Время между получением и продажей должно быть минимальным.
Fiat Settlement Module — отправка банковского перевода. SEPA (Европа, 1 рабочий день), SWIFT (международные, 2–5 дней), Faster Payments (UK, минуты), ACH (США, 1–3 дня).
Hedging и управление курсовым риском
Между подтверждением транзакции в блокчейне и исполнением банковского перевода может пройти от нескольких минут до нескольких часов. За это время курс BTC может измениться на 1–3%.
Немедленный хедж через limit order на CEX сразу после получения достаточного числа подтверждений:
async def hedge_position(self, crypto_amount: Decimal, asset: str, order_id: str):
"""Немедленно продаём полученную крипто на бирже"""
exchange = self.get_best_exchange_for_hedging(asset)
# Market order для немедленного исполнения
sell_order = await exchange.create_market_sell_order(
symbol=f"{asset}/USDT",
amount=float(crypto_amount)
)
# Записываем результат хеджа для расчёта итоговой суммы
fill_price = sell_order["average"]
usdt_received = sell_order["cost"]
await self.order_repo.update_hedge(
order_id=order_id,
hedge_price=fill_price,
usdt_received=usdt_received
)
return usdt_received
Альтернатива market order — aggressive limit order (немного лучше bid-price) с автоматическим переходом в market order через 30 секунд при неисполнении.
Банковская интеграция
Для SEPA-переводов используем Banking-as-a-Service провайдеров: Modulr, ClearBank, Railsr, или прямую интеграцию с банком через SWIFT MT103/ISO 20022.
class SEPATransferService:
async def initiate_transfer(self, payout: Payout) -> str:
"""Возвращает transaction reference"""
payload = {
"amount": str(payout.fiat_amount),
"currency": payout.currency, # "EUR"
"creditor_name": payout.recipient_name,
"creditor_iban": payout.iban,
"creditor_bic": payout.bic,
"reference": payout.reference,
"end_to_end_id": str(payout.id)
}
resp = await self.banking_client.post("/payments/sepa", json=payload)
if resp.status_code == 201:
return resp.json()["transaction_id"]
else:
raise PaymentError(f"SEPA transfer failed: {resp.text}")
Процесс обработки заявки
- Пользователь создаёт заявку на вывод: указывает сумму/актив и реквизиты
- Система генерирует уникальный deposit address и показывает курс (действителен 15 минут)
- Пользователь отправляет крипто
- Система обнаруживает входящую транзакцию (мемпул мониторинг)
- Скрининг крипто через Chainalysis/Elliptic
- После N подтверждений — хедж на бирже
- Отправка банковского перевода
- Уведомление пользователя с transaction reference
Весь процесс от получения крипто до отправки банковского перевода — 10–30 минут. Зачисление на счёт пользователя — в зависимости от метода.
Лимиты и комплаенс
Off-ramp система обязана вести Travel Rule записи для транзакций > $1000/€1000 (FATF Recommendation 16). Для каждого перевода — идентификация отправителя (originator) и получателя (beneficiary) с передачей данных через IVMS101 стандарт при использовании совместимых VASP.
| Порог | Требование |
|---|---|
| < €1,000 | Базовая KYC (имя, email) |
| €1,000 – €10,000 | Полная KYC (документ + selfie) |
| > €10,000 | EDD (Enhanced Due Diligence) |
| > €10,000 в день | Автоматический SAR-репорт в FIU |
Мониторинг системы
Критические алерты: неотправленный перевод > 2 часов после хеджа, транзакция застряла в блокчейне > 2 часов (low gas fee), ошибка банковского API. Каждый шаг пайплайна пишет статус в PostgreSQL с timestamp — это позволяет отслеживать SLA и находить bottlenecks.







