Реализация получения криптовалюты в мобильном кошельке
Экран получения выглядит простым: показать адрес, сгенерировать QR. На практике здесь несколько нетривиальных решений — поддержка нескольких сетей с одним seed, корректный URI-формат для QR, и UX, который не даст пользователю передать адрес не той сети.
Отображение адреса и поддержка нескольких сетей
HD-кошелёк деривирует разные адреса для разных сетей из одного мнемоника по BIP-44. Ethereum-адрес (m/44'/60'/0'/0/0) совпадёт для Ethereum, Polygon, BNB Chain — это один и тот же hex-адрес. Но для Bitcoin (m/44'/0'/0'/0/0) и Solana (m/44'/501'/0'/0') адреса будут другими.
Пользователь должен явно видеть, в какой сети он принимает: «Получить ETH / ERC-20 (Ethereum)», «Получить BNB (BNB Chain)». Одна визуальная ошибка — и средства могут попасть в неподдерживаемую сеть или вовсе сгореть.
QR-код: URI-форматы по стандартам
Для Bitcoin — BIP-21: bitcoin:1A2B3C...?amount=0.005
Для Ethereum — EIP-681: ethereum:0xAbCd...@1?value=1e18
Для Solana — solana:<address>?amount=0.1&spl-token=<mint>
QR с чистым адресом работает везде, URI-формат — только если принимающее приложение его поддерживает. Рекомендую генерировать URI по умолчанию, давать переключатель «только адрес» для совместимости.
// iOS — генерация QR через CoreImage
import CoreImage.CIFilterBuiltins
let filter = CIFilter.qrCodeGenerator()
filter.message = Data(uri.utf8)
filter.correctionLevel = "M"
let ciImage = filter.outputImage!
let scaled = ciImage.transformed(by: CGAffineTransform(scaleX: 10, y: 10))
let uiImage = UIImage(ciImage: scaled)
// Android — ZXing
import com.google.zxing.BarcodeFormat
import com.google.zxing.qrcode.QRCodeWriter
val writer = QRCodeWriter()
val bitMatrix = writer.encode(uri, BarcodeFormat.QR_CODE, 512, 512)
val bitmap = Bitmap.createBitmap(512, 512, Bitmap.Config.RGB_565)
// заполнить bitmap из bitMatrix
Размер QR-кода должен быть достаточным для сканирования с расстояния 30+ см. Минимум 200×200 dp, рекомендуется 280×280. Светлый фон, тёмные модули — не инвертировать, большинство сканеров плохо читают инверсию.
Копирование адреса и шаринг
Кнопка «Копировать» — обязательна. После копирования — краткий toast «Адрес скопирован» без блокирующего диалога. На iOS с iOS 16+ буфер обмена требует явного разрешения при вставке в другом приложении, поэтому визуальное подтверждение особенно важно.
Кнопка «Поделиться» открывает системный share sheet с текстом адреса или URI. Это удобно при передаче адреса через мессенджер.
Для сетей с memo/tag (XRP, XLM, ATOM) — обязательно отображать memo отдельным полем с предупреждением: «Без memo средства могут быть потеряны на бирже».
Сроки: 1–3 дня в зависимости от количества поддерживаемых сетей. Один адрес с QR — день. Мультисеть с переключателем и разными URI-форматами — 2–3 дня.







