Зазначимо: коли клієнт приходить до нас з ідеєю P2P-біржі криптовалют, перше, що ми обговорюємо — ескроу-механізм. Без нього угоди між трейдерами перетворюються на «довірся або програй». Ми закладаємо escrow в архітектуру з самого старту: або смарт-контракт на EVM-сумісному ланцюжку, або кастодіальний сервіс із мультисігом. Вибір залежить від вимог до швидкості, комісій та децентралізації. При правильній реалізації середня газова комісія на Ethereum становить близько $5 за одну угоду, а час підтвердження блоку — від 12 секунд до кількох хвилин у години пік. На Polygon ці ж операції обходяться в $0.02, що при 10 000 угод дає економію в $49 800. Використання Polygon замість Ethereum знижує газові витрати у 250 разів. Розберемо деталі. Розробка мобільного додатка для P2P-біржі криптовалют вимагає ретельної архітектури, включаючи ескроу, смарт-контракт, кастодіальний гаманець, KYC, чат трейдерів та інтеграцію WalletConnect. Орієнтовна вартість повноцінного проекту стартує від $25 000.
Як побудувати архітектуру P2P-обміну криптовалют?
Смарт-контракт escrow — розробка мобільного додатка
Продавець депонує крипту в контракт через approve() + deposit(). Покупець переказує фіат будь-яким способом → натискає «підтвердити отримання» → контракт викликає release() і відправляє крипту покупцю. Якщо спір — арбітражна адреса може викликати resolveDispute(winner).
// Спрощена логіка escrow на EVM-сумісному ланцюжку contract P2PEscrow { enum Status { ACTIVE, RELEASED, REFUNDED, DISPUTED } struct Trade { address seller; address buyer; address token; uint256 amount; Status status; } mapping(uint256 => Trade) public trades; address public arbiter; function deposit(uint256 tradeId, address buyer, address token, uint256 amount) external { IERC20(token).transferFrom(msg.sender, address(this), amount); trades[tradeId] = Trade(msg.sender, buyer, token, amount, Status.ACTIVE); } function release(uint256 tradeId) external { Trade storage t = trades[tradeId]; require(msg.sender == t.seller, "Only seller"); require(t.status == Status.ACTIVE); t.status = Status.RELEASED; IERC20(t.token).transfer(t.buyer, t.amount); } function dispute(uint256 tradeId) external { Trade storage t = trades[tradeId]; require(msg.sender == t.buyer || msg.sender == t.seller); t.status = Status.DISPUTED; } function resolveDispute(uint256 tradeId, address winner) external { require(msg.sender == arbiter); Trade storage t = trades[tradeId]; require(t.status == Status.DISPUTED); IERC20(t.token).transfer(winner, t.amount); } } | Параметр | Смарт-контракт | Кастодіальний сервіс |
|---|---|---|
| Децентралізація | Так, користувачі контролюють ключі | Ні, оператор керує гаманцем |
| Газові збори | До $5 на ETH, до $0.02 на Polygon | Ні |
| Швидкість транзакції | 12 с – кілька хвилин | Миттєво |
| Безпека | Аудит контракту обов'язковий | HSM, мультисіг, cold wallet |
Кастодіальний escrow
Сервер зберігає крипту на hot wallet. Швидше, без газу, простіше UX. Вимагає високих стандартів безпеки: HSM для приватних ключів, мультисигнатурні гаманці (Gnosis Safe), cold/hot wallet розділення.
Як створити мобільний клієнт з Web3?
На iOS використовується web3.swift або кастомна інтеграція через URLSession до JSON-RPC. На Android — web3j. Для гаманця користувача — WalletConnect v2 (Sign SDK): дозволяє підключити MetaMask, Trust Wallet, Rainbow і надсилати транзакції через deep link без зберігання ключів у додатку. За даними офіційної документації WalletConnect, підключення займає менше 2 секунд.
// Підключення через WalletConnect v2 на iOS import WalletConnectSign class WalletService { func connect() async throws { let methods: Set<String> = ["eth_sendTransaction", "personal_sign"] let chains = [Blockchain("eip155:1")!] // Ethereum mainnet let namespaces: [String: ProposalNamespace] = [ "eip155": ProposalNamespace( chains: chains, methods: methods, events: ["chainChanged", "accountsChanged"] ) ] let uri = try await Sign.instance.connect(requiredNamespaces: namespaces) // Відкриваємо Deep Link до гаманця або показуємо QR await UIApplication.shared.open(uri.deepLink) } } Як інтегрувати WalletConnect?
- Встановіть SDK:
pod 'WalletConnectSwiftV2'для iOS абоimplementation 'com.walletconnect:sign:2.0'для Android. - Налаштуйте проект у хмарному дашборді WalletConnect, отримайте
projectId. - Ініціалізуйте клієнт через
Sign.instance.configure(projectId: ...). - Викличте метод
connect(requiredNamespaces:)для створення пари. - Відобразіть URI у вигляді QR-коду або deep link.
- Обробіть події
sessionSettlementтаsessionProposal.
Як забезпечити real-time оновлення стрічки ордерів?
Список ордерів на купівлю/продаж повинен оновлюватися в реальному часі — WebSocket від сервера. Новий ордер, зміна ціни, закриття угоди — все через push по ws://. На клієнті URLSessionWebSocketTask (iOS) або OkHttp WebSocket (Android).
Фільтрація ордерів: валюта, спосіб оплати (Tinkoff, Sberbank, СБП, готівка), діапазон суми, рейтинг продавця. Рейтингова система — обов'язковий елемент P2P. Без неї площадка не набирає довіру. Зберігаємо історію угод та відгуки, рейтинг рахуємо на сервері.
Чому KYC та чат — обов'язкові елементи?
Верифікація користувачів (KYC)
Регуляторні вимоги для P2P-площадок: хоча б базовий KYC (фото паспорта + selfie). На iOS — VisionKit документ-сканер, на Android — ML Kit Document Scanner. Перевірку документів віддаємо на SumSub, Veriff або Jumio через їхній мобільний SDK — самостійно реалізовувати liveness detection немає сенсу.
Ліміти за замовчуванням для неверифікованих користувачів — обмежуються базовим рівнем, підвищення після KYC.
Чат між трейдерами
Вбудований чат між покупцем і продавцем у рамках угоди — критична функція. Без неї не вирішити спірні ситуації. Реалізуємо через Firebase Realtime Database або Stream Chat SDK — останній дає готовий UI для iOS/Android, економить 2–3 дні розробки. Повідомлення шифруємо end-to-end через libsignal, якщо потрібна додаткова приватність.
Підтвердження оплати фіату — скріншот з банку, що завантажується в чат. Зберігається в Firebase Storage або S3 з presigned URL.
Що входить у розробку
Склад робіт за проектом
- Проектування escrow-механізму та архітектури додатка
- Розробка та аудит смарт-контракту (опціонально). Вартість аудиту у сторонніх фірм становить від $2 000 до $5 000.
- Серверна частина: API, ордербук, escrow-логіка
- Мобільні клієнти iOS + Android (Swift, Kotlin)
- Інтеграція KYC (SumSub/Veriff) та чату (Stream)
- Підключення WalletConnect для роботи із зовнішніми гаманцями
- Налаштування сповіщень (APNs, FCM)
- Документація, доступ до репозиторію, тестування на testnet/mainnet
- Навчання команди замовника та підтримка 1 місяць
Безпека
Rate limiting на ендпоінтах публікації ордерів — без нього конкуренти заллють ринок сміттєвими ордерами. Anti-scam перевірки: новий акаунт не може одразу публікувати великі ордери. 2FA через TOTP (Google Authenticator) — обов'язково для виведення коштів. Біометрична аутентифікація через LocalAuthentication (iOS) / BiometricPrompt (Android) для підтвердження угод.
Етапи роботи
| Етап | Термін |
|---|---|
| Проектування: escrow-механізм, архітектура | 1 тиждень |
| Смарт-контракт + аудит (опціонально) | 1–2 тижні |
| Серверна частина (API, ордербук, escrow) | 2–3 тижні |
| Мобільний клієнт iOS + Android | 3–4 тижні |
| KYC-інтеграція, чат | 1 тиждень |
| Тестування, testnet/mainnet деплой | 1 тиждень |
Разом: 8–12 тижнів залежно від типу escrow та набору функцій. Вартість розраховується індивідуально після аналізу вимог.
Зв'яжіться з нами для оцінки проекту та отримайте консультацію безкоштовно. Наш досвід — понад 50 успішних кейсів у сфері криптофінансових додатків. Команда має понад 5 років досвіду на ринку. Гарантуємо дотримання термінів і прозорий код без прихованих сюрпризів. Отримайте детальний розрахунок вартості та термінів у відповідь на ваш запит. Також замовте попередню оцінку — ми підготуємо пропозицію протягом 24 годин.







