Реалізація P2P-торговлі в мобільному додатку біржі
P2P-торговля — обмін криптовалюти між користувачами напрямик з еськро-захистом з боку біржі. Покупець переводит фіат продавцю (по банку, готівкою, через платіжну систему), продавець підтверджує — біржа видає крипту з еськро покупцю. Архітектурно це мессенджер плюс торговельна платформа плюс арбітражна система в одному додатку.
Листинг оголошень: фільтри та сортування
Сторінка оголошень — ключовий екран P2P. Користувач бачить список пропозицій з ціною, лімітами, методами оплати та рейтингом продавця.
Фільтри: сума (фіат), метод оплати (Tinkoff, Сбербанк, QIWI, готівка тощо), валюта фіату. Сортування по ціні. При завантаженні — pagination cursor-based (не offset), бо список змінюється у реальному часі.
На Binance P2P API (неофіційний): POST https://p2p.binance.com/bapi/c2c/v2/friendly/c2c/adv/search. Офіційні біржі з P2P надають свої API — структура схожа.
// Android — запрос листинга P2P оголошень
data class P2PSearchRequest(
val asset: String, // BTC, USDT, ETH
val fiat: String, // RUB, USD, EUR
val tradeType: String, // BUY або SELL
val payTypes: List<String>, // ["Tinkoff", "RaiffeisenBank"]
val page: Int = 1,
val rows: Int = 20,
val transAmount: String = "" // сума угоди для фільтра по лімітам
)
Flow угоди: 7 стану
P2P угода проходить через конечний автомат станів:
| Стан | Дія | Кто |
|---|---|---|
CREATED |
Ордер створеної, крипта заблокована в еськро | Система |
WAITING_PAYMENT |
Очікування оплати фіатом | Покупець |
PAID |
Покупець натиснув «Оплатив» | Покупець |
RELEASING |
Продавець перевіряє поступлення | Продавець |
COMPLETED |
Продавець підтвердив, крипта відправлена | Система |
APPEALING |
Відкритий спір (appeal) | Будь-хто |
CANCELLED |
Відмінена | Будь-хто |
У мобільному UI — екран угоди з таймером, інструкцією для поточного етапу та кнопками дій. Таймер оплати (зазвичай 15–30 хвилин) — критично важливий: при закінченні ордер автоматично скасовується.
Вбудований чат
Чат всередині угоди — обов'язкова частина. Продавець та покупець повинні узгодити реквізити, покупець може надіслати скриншот оплати.
Мінімальний чат: WebSocket для real-time сообщений, підтримка зображень (скриншоти чеків), системні сообщения про зміну статусу угоди.
// iOS — модель сообщения P2P чату
struct P2PChatMessage: Identifiable, Codable {
let id: String
let orderId: String
let senderId: String
let messageType: MessageType // text / image / system
let content: String
let imageUrl: String?
let timestamp: Date
var isSystemMessage: Bool { messageType == .system }
}
Зображення — важливий момент: користувачі надсилають скриншоти банківських переводів для підтвердження оплати. Нужна завантаження фото з можливістю перегляду в повний екран. Зберігання скриншотів — обов'язково для арбітражу.
Push-сповіщення та таймери
P2P без уведомлень — мертворождений функціонал. Обов'язкові события:
- Нове сообщение в чаті — миттєво
- Покупець натиснув «Оплатив» — миттєво продавцю
- Таймер закінчується через 5 хвилин — обом учасникам
- Відкритий спір (appeal) — обом
Deep link з уведомлення — відкриває конкретний екран угоди по orderId.
Appeal (спір) та арбітраж
При конфлікті будь-яка сторона може відкрити спір. В інтерфейсі — кнопка «Відкрити спір» з обов'язковим вибором причини та прикріпленням доказів (скриншоти). Після відкриття — чат недоступний для змін (freeze), підключається арбітр біржі.
Мобільний додаток повинен забезпечити завантаження кількох зображень для докладної бази. На iOS — UIImagePickerController або PHPickerViewController (iOS 14+). На Android — ActivityResultContracts.GetMultipleContents.
Рейтинг та верифікація продавців
Карточка продавця: відсоток завершених угод, кількість угод за 30 днів, час першої відповіді, значки верифікації (KYC, Email, SMS). Це напрямо впливає на довіру — показуй повну статистику, не приховуй.
Часовий графік: MVP P2P модуля — 6–10 тижнів. Включає листинг з фільтрами, flow угоди з таймером, вбудований чат з зображеннями, push-сповіщення. Без системи арбітражу та верифікації продавців — 4–5 тижнів.







