Реалізація продажу криптовалюти за фіат (Off-Ramp) у мобільному застосунку
Ми стикалися з цим десятки разів: клієнт хоче вивести криптовалюту на картку, але провайдер вимагає відправити крипту першою, а гроші прийдуть через пару банківських днів. Довіра — головний бар'єр, який вирішується інтерфейсом і прозорістю. У цій статті розберемо, як ми інтегрували off-ramp від Transak і MoonPay — під ключ, включаючи KYC, SEPA та push-сповіщення. Оцінимо проєкт — терміни від 5 до 12 днів залежно від складності. Наш досвід — 5+ років у мобільній розробці фіатних шлюзів, 30+ інтеграцій з платіжними провайдерами. За 5 років роботи ми запустили 15+ проєктів з off-ramp для fintech-компаній.
Особливість 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
| Характеристика | Transak | MoonPay |
|---|---|---|
| Підтримка SEPA Instant | Так (30+ країн) | Так (єврозона) |
| Верифікація банк. рахунку | Мікротранзакції | Open Banking / мікротранзакції |
| Час виведення (SEPA) | 1–2 дні | 1–2 дні |
| Комісія для користувача | 0.5–2% | 0.5–2% |
| Мобільний SDK | URL-віджет | URL-віджет + нативний SDK |
Чому off-ramp вимагає triple-check транзакцій?
Через незворотність криптовалютних переказів кожна операція перевіряється тричі: локально в застосунку, на стороні провайдера та в блокчейні. Ми додаємо екран підтвердження з деталями (адреса, сума, курс) і таймером. Якщо користувач не підтверджує за хвилину — котирування згорає, курс перераховується. Це знижує ризик помилок і підвищує довіру.
Як прискорити виведення через SEPA Instant?
SEPA Instant доступний не для всіх країн і банків. Щоб його використовувати, провайдер повинен підтримувати цю систему та мати партнерський банк у цільовій зоні. Transak покриває 30+ країн через партнерство з британським банком. Ми рекомендуємо використовувати SEPA Instant як основний метод для Європи — швидкість 10 секунд проти 1–2 днів у звичайного SEPA. В інтерфейсі варто підсвічувати цей варіант як рекомендований.
Статус і нотифікації
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") } Що входить у роботу (deliverables)
- Інтеграція одного провайдера off-ramp (Transak або MoonPay) — 5 днів.
- Мультипровайдерна конфігурація з перемиканням — 8–12 днів.
- Включає: UI‑екран введення суми, обробка редиректів через deeplink, отримання статусів через webhook, налаштування push‑сповіщень.
- Документація по flow та опис архітектури.
- Підтримка при релізі в App Store / Google Play.
Терміни: 5 днів для одного провайдера, 8–12 для мультипровайдера. Зв'яжіться з нами, щоб оцінити ваш проєкт — отримайте консультацію щодо вибору провайдера та архітектури. Гарантуємо прозорість і відповідність SEPA та App Store Review Guidelines (розділ 5.1).







