update project
This commit is contained in:
82
docs/plans/2026-03-15-send-receive-design.md
Normal file
82
docs/plans/2026-03-15-send-receive-design.md
Normal file
@@ -0,0 +1,82 @@
|
||||
# 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 |
|
||||
Reference in New Issue
Block a user