Розробка мобільного мультичейн-кошелька (Ethereum, BSC, Polygon, Solana, TON)
Мультичейн-кошелек — це не "кілька независимих кошельків в одній програмі". Це єдина мнемонічна фраза, з якої деривуються ключі для всіх підтримуваних блокчейнів. Користувач бачить одну seed-фразу з 12 слів, за якою стоять адреси в п'яти (або п'ятидесяти) різних мережах.
Деривація ключів для різних блокчейнів
Всі підтримувані мережи використовують один BIP39 seed, але різні шляхи деривації BIP44:
| Блокчейн | Coin Type | Шлях деривації | Алгоритм підпису |
|---|---|---|---|
| Ethereum | 60 | m/44'/60'/0'/0/0 |
secp256k1 (ECDSA) |
| BSC | 60 | m/44'/60'/0'/0/0 |
secp256k1 (ECDSA) |
| Polygon | 60 | m/44'/60'/0'/0/0 |
secp256k1 (ECDSA) |
| Solana | 501 | m/44'/501'/0'/0' |
ed25519 |
| TON | 607 | m/44'/607'/0' |
ed25519 |
Ethereum, BSC та Polygon використовують один і той же адрес (однакові coin type 60 та шлях) — різниця тільки в chainId при підписанні транзакцій та RPC endpoint. Зручно для користувача, але критично управляти: при відправці явно вказуйте мережу, інакше транзакція йде не туди (невернувна).
Solana та TON використовують ed25519 — інший еліптичний алгоритм, несумісний з secp256k1. WalletCore від Trust Wallet підтримує обидва алгоритми та всі перелічені мережи через єдиний інтерфейс.
EVM-мережі: Ethereum, BSC, Polygon
Один і той же адрес, сумісний з Ethereum, один і той же приватний ключ — але різні мережи, різні chainId:
- Ethereum Mainnet:
chainId = 1 - BSC:
chainId = 56 - Polygon:
chainId = 137
ChainId обов'язково включається в підпис транзакції (EIP-155) — захист від replay-атак між мережами. Транзакція, підписана для BSC, не пройде на Ethereum.
Для EVM мереж: Web3j (Android), web3.swift (iOS), або ethers.js через JavaScriptCore/WebView для максимальної кросс-платформенності JavaScript екосистеми. Для кожної мережі — власний RPC провайдер:
val ethWeb3 = Web3j.build(HttpService("https://mainnet.infura.io/v3/YOUR_KEY"))
val bscWeb3 = Web3j.build(HttpService("https://bsc-dataseed.binance.org/"))
val polygonWeb3 = Web3j.build(HttpService("https://polygon-rpc.com"))
ERC-20 токени, NFT (ERC-721/1155) — працюють однаково на всіх трьох мережах, різниця тільки в RPC endpoint та адресах контрактів.
Solana: інша парадигма
Solana принципово відрізняється від EVM-мереж архітектурно. Немає стандарту ERC-20 — є SPL Token Program. Адреси — base58-кодовані публічні ключі ed25519.
Підключення через Solana Mobile Adapter на Android або безпосередньо через JSON-RPC до ноди (mainnet-beta.solana.com). Для роботи з токенами розумійте концепцію Associated Token Accounts (ATA) — у кожного токена на кошельку є окремий аккаунт, який потрібно створити перед першим отриманням токена (rent-exempt lamports).
// Solana4J або сторонній Kotlin SDK
val connection = RpcClient("https://api.mainnet-beta.solana.com")
val balance = connection.getBalance(publicKey)
// Для SPL-токенів — знайти ATA та читати баланс через getTokenAccountBalance
val tokenAccounts = connection.getTokenAccountsByOwner(
owner = publicKey,
filter = TokenAccountsFilter.byProgramId(TOKEN_PROGRAM_ID)
)
Комісії в Solana фіксовані та крихітні (0.000005 SOL за базову транзакцію) — не потрібно вибирати gas price, що спрощує UX.
TON: JetBrains Kotlin + специфіка блокчейна
TON (The Open Network) — блокчейн з унікальною архітектурою: смарт-контракти у вигляді акторів з власним стеком, адреси в форматі 0:... (raw) або user-friendly (EQ..., UQ...). Jetton — стандарт для токенів (аналог ERC-20).
TON SDK для Kotlin: ton-kotlin від tonapps або офіційний ton-blockchain/ton-kotlin. Для iOS — swift-ton або робота через JavaScriptCore з ton.js.
Особливість: для сумісності з Telegram Mini Apps та TonConnect 2.0 потрібна інтеграція TonConnect протоколу — стандарт підключення dApps до TON кошельків, аналог WalletConnect для EVM.
// TonConnect Swift SDK
let connector = TonConnect(manifestUrl: URL(string: "https://your-app.com/tonconnect-manifest.json")!)
connector.connect { result in
// користувач підключився через TonConnect
}
Мультимережевий UI/UX: критичні рішення
Переключення мереж. Чіткий візуальний індикатор поточної мережи на головному екрані — обов'язково. Помилка "відправив USDT на BSC-адрес замість Ethereum" коштує користувачам реальних грошей. Confirmation dialog при відправці: "Ви відправляєте X USDT в мережі BSC на адрес 0x...".
EVM-мережи — один адрес. Користувачу не потрібно знати, що його ETH і BNB-адрес один. Але потрібно розуміти, що баланси різні: ETH на Ethereum-мережі ≠ ETH (якщо його там немає) на BSC.
Bridging. Переведення активів між мережами через мости (Stargate, Across, офіційний Polygon Bridge) — частий запит. Інтеграція через SDK або iframe WebView з дозволеними URL. Це складна та рискована область (мости регулярно взламують) — попередження користувачу обов'язково.
Ціни та обмінні курси
Баланси в нативних токенах малоінформативні без USD-конверсії. CoinGecko API — безплатний до певної межі, покриває основні токени. DeFiLlama — альтернатива. CoinMarketCap — платний, але надійніший для production.
Кешуйте ціни на сервері з TTL 60 секунд — не гонінте запити з кожного клієнта безпосередньо до зовнішнього API.
Безпека на рівні мультичейна
Основні загрози, специфічні для мультичейна:
Address Poisoning. Атака: зловмисник відправляє 0 токенів з адреси, схожої на часто використовуваний контакт (збігаються перші та останні 4 символи). Користувач копіює адрес з історії — і відправляє на мошенницький адрес. Захист: попередження при виборі адреси з історії, повне відображення адреси без скорочення у фінальному екрані підтвердження.
Contract Interaction. При взаємодії з dApps через WalletConnect програма повинна декодувати та відображати calldata зрозуміло: не 0xa9059cbb000000000..., а "Передача 100 USDC на адрес 0x1234...". Для стандартних ABI це рішуване через ABI декодування.
Нулові апруви ERC-20. Після взаємодії з DeFi протоколами у багатьох токенів залишаються approve з максимальною сумою (uint256.max). Функція "Управління апрувами" у кошельку — хороша практика.
Стек та інструменти
- Кросс-платформа: Trust WalletCore (C++ бібліотека, bindings для iOS/Android) — єдина реалізація криптографії
- EVM RPC: Web3j (Android), web3.swift (iOS), ethers.js через JSC
- Solana: sol4k (Kotlin), solana-swift (iOS)
- TON: ton-kotlin, swift-ton
- WalletConnect: офіційні iOS/Android SDK v2
- TonConnect: @tonconnect/sdk
Якщо проект на Flutter — wallet_core flutter bindings + web3dart + solana_dart + ton_dart. Екосистема менш зріла, ніж нативна, але покриває основні кейси.
Часова шкала
Базовий мультичейн кошелек з EVM (ETH/BSC/Polygon) + Solana + TON, балансами, відправкою/отриманням, історією транзакцій, WalletConnect та TonConnect — 2–4 місяці для нативного iOS+Android. Додавання swap через агрегатори (1inch для EVM, Jupiter для Solana) — ще 3–4 тижні. Вартість рассчітується після детальних вимог: які мережи, які DeFi інтеграції, потрібен ли fiat on/off-ramp.







