83 lines
4.0 KiB
Markdown
83 lines
4.0 KiB
Markdown
# 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 |
|