# Phase 6: Send & Receive ## Context Кошелёк поддерживает ETH, SOL, TRX, BTC. Балансы работают для ETH/SOL/TRX. BTC имеет деривированный адрес, но нет RPC/балансов. Нужен полноценный Send/Receive с QR кодами. ## Receive — генерация QR **Формат QR**: стандартные URI схемы (совместимы с другими кошельками): - ETH: `ethereum:0xAddress` / `ethereum:0xAddress@1/transfer?address=0xTokenContract&uint256=amount` (EIP-681) - SOL: `solana:Address` / `solana:Address?spl-token=MintAddress&amount=1.5` - TRX: `tron:TAddress` / `tron:TAddress?token=TR7...&amount=100` - BTC: `bitcoin:bc1Address` / `bitcoin:bc1Address?amount=0.01` **UI flow**: Выбрал сеть → выбрал токен → опционально ввёл сумму → QR + адрес текстом + Copy. ## Send — отправка + сканер QR **UI flow**: Выбрал сеть → выбрал токен → ввёл адрес (или Scan QR) → ввёл сумму → Gas (ETH only) → Review → Confirm → tx. **QR сканер**: кнопка "Scan QR" → камера → распознаёт URI → заполняет chain/token/address/amount. **Отправка по сетям**: - **ETH**: `ethers.Wallet.sendTransaction()` для ETH, `contract.transfer()` для ERC20 - **SOL**: `SystemProgram.transfer()` для SOL, `createTransferInstruction()` для SPL tokens - **TRX**: TronGrid `createtransaction` для native TRX, `triggersmartcontract` для TRC20 - **BTC**: `bitcoinjs-lib` PSBT → broadcast через Blockstream/Mempool API ## Библиотеки - `qrcode.react` — генерация QR - `@yudiel/react-qr-scanner` — сканирование QR камерой ## Безопасность | Принцип | Реализация | |---------|-----------| | Address validation | Regex + checksum для каждого формата | | QR parsing validation | URI парсится → chain/address валидируются → token в whitelist | | Confirm before send | Review экран + checkbox | | Private keys | Подписание в браузере, ключи не покидают клиент | | Amount validation | Проверка баланса перед отправкой | ## Файлы ### Новые (8) | Файл | Назначение | |------|-----------| | `apps/web/src/app/send/page.tsx` | Send page | | `apps/web/src/app/receive/page.tsx` | Receive page | | `apps/web/src/lib/send/execute.ts` | Транзакции по 4 сетям | | `apps/web/src/lib/send/validate.ts` | Валидация адресов | | `apps/web/src/lib/send/constants.ts` | Токены, decimals, контракты | | `apps/web/src/lib/qr/generate.ts` | Генерация URI для QR | | `apps/web/src/lib/qr/parse.ts` | Парсинг URI из QR | | `apps/api/src/routes/btc-proxy.routes.ts` | Bitcoin RPC proxy | ### Изменяемые (3) | Файл | Изменение | |------|-----------| | `apps/web/src/app/dashboard/page.tsx` | Send/Receive кнопки | | `apps/web/package.json` | qrcode.react, @yudiel/react-qr-scanner | | `apps/api/src/app.ts` | Регистрация btc-proxy routes | ## Порядок выполнения | # | Задача | |---|--------| | 1 | install qrcode.react + @yudiel/react-qr-scanner | | 2 | send/constants.ts — токены, decimals, контракты для 4 сетей | | 3 | send/validate.ts — валидация адресов по сетям | | 4 | qr/generate.ts — URI генератор | | 5 | qr/parse.ts — URI парсер | | 6 | btc-proxy.routes.ts — Bitcoin UTXO + broadcast | | 7 | app.ts — регистрация btc routes | | 8 | send/execute.ts — отправка по 4 сетям | | 9 | receive/page.tsx — Receive page | | 10 | send/page.tsx — Send page + QR scanner | | 11 | dashboard/page.tsx — Send/Receive кнопки | | 12 | typecheck |