Files
cryptowallet/docs/plans/2026-03-15-send-receive-design.md
2026-04-14 13:30:26 +03:00

83 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 |