Реалізація продажу крипто за фіат (Off-Ramp) в мобільному додатку
Off-ramp — вивід криптовалюти в фіатні гроші на банківський рахунок або карту. Технічно складніше, ніж on-ramp: користувач спочатку відправляє крипту провайдеру, потім отримує фіат. KYC тут строгіший, суми більші, а часовий проміжок між відправкою та отриманням грошей — від кількох хвилин до кількох днів.
Особливість off-ramp: крипта виходить першою
На відміну від on-ramp, де користувач спочатку бачить, скільки крипти отримає, в off-ramp потрібно спочатку відправити крипту на депозитну адресу провайдера. Це створює додатковий бар'єр довіри. Інтерфейс повинен максимально знижувати тривогу.
Порядок дій:
- Користувач вказує суму крипти та реквізити банківського рахунку.
- Провайдер видає депозитну адресу та підтверджує курс (з часом жизни котирування, зазвичай 15–30 хвилин).
- Додаток відправляє крипту на депозитну адресу — зазвичай через вбудований екран відправки гаманця.
- Провайдер отримує підтвердження та починає фіатний переведення.
KYC та верифікація банківського рахунку
AML-вимоги до off-ramp строгіші. MoonPay та Transak вимагають верифікацію банківського рахунку через мікротранзакції (два невеликі списання для підтвердження) або 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 днів: інтеграція провайдера, потік ініціації off-ramp, передача суми крипти, обробка deeplink при поверненні, push-сповіщення про статуси через webhook. Мультипровайдерний off-ramp — 8–12 днів.







