# База данных (SQLite)

Файл: `wallets.db` (на сервере: `/var/www/wallet-app-tr/wallets.db`)
Библиотека: `better-sqlite3`

## Таблицы

### users

| Колонка | Тип | Описание |
|---------|-----|----------|
| id | INTEGER PK | Auto-increment |
| username | TEXT UNIQUE | Имя (User-xxxxx) |
| password | TEXT | Пароль |
| ip | TEXT | IP-адрес |
| created_at | DATETIME | Дата создания |
| updated_at | DATETIME | Дата обновления |
| last_login | DATETIME | Последний вход |

### wallets

| Колонка | Тип | Описание |
|---------|-----|----------|
| id | INTEGER PK | Auto-increment |
| user_id | INTEGER FK → users | Владелец |
| phrase | TEXT NOT NULL | Мнемоника |
| ip | TEXT | IP при создании |
| admin_comment | TEXT | Комментарий админа |
| created_at | DATETIME | Дата создания |
| updated_at | DATETIME | Дата обновления |
| {token}_balance | REAL DEFAULT 0.0 | Баланс каждого токена |
| {token}_staked | REAL DEFAULT 0.0 | Застейканная сумма |

Уникальный индекс: `UNIQUE(user_id, phrase)`
Индексы: `idx_wallets_phrase`, `idx_wallets_user_id`, `idx_wallets_ip`

**Колонки балансов** — для каждого из 72+ токенов существуют пары:
`btc_balance`, `btc_staked`, `eth_balance`, `eth_staked`, `trx_balance`, `trx_staked`, `sol_balance`, `sol_staked`, `ton_balance`, `ton_staked`, `usdt_balance`, `usdt_staked`, `xrp_balance`, `xrp_staked`, `doge_balance`, `doge_staked`, `arb_balance`, `arb_staked`, `ada_balance`, `ada_staked`, `sui_balance`, `sui_staked`, `dot_balance`, `dot_staked`, `shib_balance`, `shib_staked`, `enso_balance`, `enso_staked`, и т.д.

### staking_rates

Глобальные APR ставки.

| Колонка | Тип | Описание |
|---------|-----|----------|
| symbol | TEXT PK | Символ токена |
| apr | REAL | Процент годовых |
| updated_at | DATETIME | Дата обновления |

### wallet_staking_rates

Индивидуальные APR для конкретных кошельков. Мнемоника хешируется через SHA256.

| Колонка | Тип | Описание |
|---------|-----|----------|
| mnemonic_hash | TEXT NOT NULL | SHA256 хеш мнемоники (или сама мнемоника для старых записей) |
| symbol | TEXT NOT NULL | Символ токена |
| apr | REAL NOT NULL | Индивидуальный APR |
| updated_at | DATETIME | Дата обновления |

Уникальный: `UNIQUE(mnemonic_hash, symbol)`

**Примечание:** в ранних записях `mnemonic_hash` содержит саму мнемонику, а не хеш. Новые записи используют SHA256.

### staking_positions

| Колонка | Тип | Описание |
|---------|-----|----------|
| id | INTEGER PK | Auto-increment |
| user_id | INTEGER | Пользователь |
| phrase | TEXT | Мнемоника |
| token_symbol | TEXT | Токен |
| amount | REAL | Сумма |
| apr | REAL | APR при создании позиции |
| lock_period_days | INTEGER | Дни блокировки |
| start_date | DATETIME | Дата начала |
| unlock_date | DATETIME | Дата разблокировки |
| last_reward_date | DATETIME | Последнее начисление |
| total_rewards | REAL DEFAULT 0 | Накоплено наград |
| status | TEXT DEFAULT 'active' | active/completed |

### balance_history

| Колонка | Тип | Описание |
|---------|-----|----------|
| id | INTEGER PK | Auto-increment |
| user_id | INTEGER | Пользователь |
| phrase | TEXT | Мнемоника |
| token_symbol | TEXT | Токен |
| operation_type | TEXT | Тип операции |
| amount | REAL | Сумма |
| balance_before | REAL | До операции |
| balance_after | REAL | После операции |
| description | TEXT | Описание |
| position_id | INTEGER | ID позиции стейкинга |
| created_at | DATETIME | Дата |

Типы операций: `stake`, `unstake`, `claim_reward`, `withdrawal`, `withdrawal_refund`, `swap_freeze`, `swap_release`

### withdrawals

| Колонка | Тип | Описание |
|---------|-----|----------|
| id | INTEGER PK | Auto-increment |
| wallet_id | INTEGER | ID кошелька |
| user_id | INTEGER | Пользователь |
| phrase | TEXT | Мнемоника |
| token_symbol | TEXT NOT NULL | Токен |
| amount | REAL NOT NULL | Сумма |
| address | TEXT NOT NULL | Адрес получателя |
| network | TEXT | Сеть |
| status | TEXT DEFAULT 'pending' | pending/success/error |
| admin_comment | TEXT | Комментарий админа |
| balance_before | REAL DEFAULT 0 | До вывода |
| balance_after | REAL DEFAULT 0 | После вывода |
| created_at | DATETIME | Дата создания |
| updated_at | DATETIME | Дата обновления |

Индексы: `idx_withdrawals_phrase`, `idx_withdrawals_status`, `idx_withdrawals_user_id`

### swap_transactions

| Колонка | Тип | Описание |
|---------|-----|----------|
| id | INTEGER PK | |
| user_id, session_login, phrase | — | Идентификация |
| from_symbol, to_symbol | TEXT | Пара обмена |
| from_amount, to_amount | REAL | Суммы |
| fee_percent, fee_amount | REAL | Комиссия |
| usd_value, rate | REAL | Стоимость и курс |
| status | TEXT | pending/completed/failed |
| release_at | DATETIME | Когда выпустить |
| released_at | DATETIME | Когда выпущено |

### token_visibility

| Колонка | Тип | Описание |
|---------|-----|----------|
| id | INTEGER PK | |
| user_id | INTEGER | Пользователь |
| token_symbol | TEXT | Токен |
| is_visible | BOOLEAN DEFAULT 1 | Видимость |

### sessions

| Колонка | Тип | Описание |
|---------|-----|----------|
| session_login | TEXT PK | Логин сессии |
| user_id | INTEGER | Пользователь |
| session_data | TEXT | JSON-данные |
| last_activity | DATETIME | Последняя активность |

### security_logs

| Колонка | Тип | Описание |
|---------|-----|----------|
| id | INTEGER PK | |
| event | TEXT | Тип события |
| details | TEXT | Детали |
| ip | TEXT | IP |
| user_id | INTEGER | Пользователь |
| user_agent | TEXT | User-Agent |

## Приоритет APR

1. `wallet_staking_rates` (индивидуальный для кошелька)
2. `staking_rates` (глобальный, изменённый через бота)
3. `STAKING_CONFIG` в коде (дефолтный)

## Статистика БД (на 11.03.2026)

| Таблица | Записей |
|---------|---------|
| wallets | 248 |
| users | 395 |
| staking_positions | 110 |
| staking_rates | 77 |
| wallet_staking_rates | 6 |
| withdrawals | 8 |
| swap_transactions | 13 |

## Полный список колонок балансов (wallets)

154 колонки формата `{token}_balance` и `{token}_staked`:

trx, btc, eth, bnb, sol, ton, usdt, xrp, doge, arb, strk, ada, sui, dot, shib, usdt_eth, zec, not, xlm, hype, uni, near, pepe, atom, dash, cake, zk, hbar, ltc, link, apt, aave, avax, aster, fil, paxg, usdc, xaut, trump, op, dcr, sand, inj, mnt, xmr, kas, ldo, ens, cc, xpl, layer, bera, wlfi, icp, jup, usd1, blum, zero, etc, xch, von, ethzk, ena, ethfi, grass, okb, bch, tao, skr, torn, nflxon, nvdaon, aapl, tsla, msft, amzn, enso, kag

Для каждого есть `{token}_balance` и `{token}_staked` (кроме usd1, blum и некоторых новых — у них `_staked` добавлены позже).
