Реализация продажи криптовалюты за фиат (Off-Ramp) в мобильном приложении
Off-ramp — вывод криптовалюты в фиатные деньги на банковский счёт или карту. Технически сложнее on-ramp: пользователь сначала отправляет крипту провайдеру, потом получает фиат. KYC здесь строже, суммы выше, а таймаут между отправкой и получением денег — от нескольких минут до нескольких дней.
Особенность off-ramp: крипта уходит первой
В отличие от on-ramp, где пользователь сначала видит, сколько крипты получит, в off-ramp нужно сначала отправить крипту на депозитный адрес провайдера. Это создаёт дополнительный барьер доверия. Интерфейс должен максимально снижать тревогу.
Порядок действий:
- Пользователь указывает сумму крипты и реквизиты банковского счёта.
- Провайдер выдаёт депозитный адрес и подтверждает курс (с временем жизни котировки, обычно 15–30 минут).
- Приложение отправляет крипту на депозитный адрес — обычно через встроенный экран отправки кошелька.
- Провайдер получает подтверждение, начинает фиатный перевод.
KYC и верификация банковского счёта
AML-требования к off-ramp строже. MoonPay и Transak требуют верификацию банковского счёта через микротранзакции (2 небольших списания для подтверждения) или через Open Banking (Plaid, TrueLayer).
Приложение должно явно информировать пользователя о сроках KYC — верификация может занять 1–3 рабочих дня при первом off-ramp. Повторные операции — мгновенно после одобрения.
// iOS — запуск Transak off-ramp виджета
var components = URLComponents(string: "https://global.transak.com")!
components.queryItems = [
.init(name: "apiKey", value: transakApiKey),
.init(name: "walletAddress", value: userWalletAddress),
.init(name: "defaultCryptoCurrency", value: "ETH"),
.init(name: "productsAvailed", value: "SELL"), // только off-ramp
.init(name: "redirectURL", value: "myapp://offramp-callback"),
.init(name: "themeColor", value: "000000")
]
let safariVC = SFSafariViewController(url: components.url!)
present(safariVC, animated: true)
Поддержка SEPA и wire transfer
Для европейских пользователей — SEPA Instant (зачисление за 10 секунд) и SEPA Credit Transfer (1–2 рабочих дня). Для международных — Wire (SWIFT, 2–5 дней). Провайдеры сами определяют доступные методы по стране пользователя.
Transak поддерживает SEPA для 30+ европейских стран. MoonPay — SEPA, банковский перевод для UK (Faster Payments).
Статус и нотификации
Off-ramp транзакция проходит несколько статусов: crypto_received → processing → fiat_sent → completed. Каждый переход — push-уведомление. Пользователь не должен угадывать, на каком этапе его деньги.
// Android — webhook обработчик статусов (серверная часть, прокидывается в push)
when (webhookEvent.status) {
"AWAITING_PAYMENT_FROM_USER" -> sendPush("Ожидаем отправку $amount $currency")
"PAYMENT_DONE_MARKED_BY_USER" -> sendPush("Крипта получена, идёт проверка")
"ON_HOLD_PENDING_DELIVERY_FROM_TRANSAK" -> sendPush("Перевод инициирован")
"COMPLETED" -> sendPush("$fiatAmount ${fiatCurrency} отправлены на счёт")
"FAILED" -> sendPush("Операция отклонена: $reason")
}
Сроки: 5 дней: интеграция провайдера, flow инициации off-ramp, передача суммы крипты, обработка deeplink при возврате, push-уведомления о статусах через webhook. Мультипровайдерный off-ramp — 8–12 дней.







