Дашборд
💰 Баланси обмінників
available = deposits − in-flight − delivered.
Це скільки tenant може ще вивести через свій CMS API
(admin-side treasury withdraws не зачіпаються цією перевіркою).
| Tenant | USDT | USDC | ||||
|---|---|---|---|---|---|---|
| Жодного активного обмінника. Створи через Per-tenant tab. | ||||||
⏳ Очікують підтвердження в Telegram
/confirm <6-digit> у DM з @OFFPAYMENT_bot щоб підтвердити,
або /reject <id> щоб скасувати. Якщо TTL минув —
ініціюй заявку повторно (не правь рядок у БД напряму).
| тип | id | tenant | деталі | expires |
|---|---|---|---|---|
| withdraw aml-release | → order : | EXPIRED |
📊 Оборот
Розбивка по обмінках
| tenant | всього | оплачено | swept | провал | обʼєм USD |
|---|---|---|---|---|---|
Денний розріз
| день | заявок | обʼєм USD |
|---|---|---|
Швидкі дії
Заявки онлайн
Повне коло: видано адресу → AML → оплачено → виведено в cold. Авто-оновлення кожні 10 секунд.
| id | tenant | chain | примітка | валюта | expected | received | статус | AML | addr | створено | експ. |
|---|---|---|---|---|---|---|---|---|---|---|---|
Заявка # (CMS #)
- :
Таймлайн
Дії
Audit-log (заявка #)
Manual: видати адресу
Для тестування без Laravel — натисни кнопку, бот видасть адресу, зробить запис у DB, і почнеться повний цикл моніторингу. Той самий код-шлях що використовує addons.moneto4ka.com.
✓ Адреса видана
Логування (audit log)
Append-only журнал усіх подій бота. Фільтри:
Пошук
Клієнт скинув щось — пасте сюди. Шукаємо одночасно по: tx hash
(0x…, 66 chars), адресу (0x…, 42 chars),
cms_order_id (32 hex token), номеру з CMS
(cms_order_numeric_id, напр. 1265), нашому
внутрішньому id (orders.id, теж 1265) та
pay_token.
Якщо ввести просто число — шукаємо і там і там, в результатах буде
видно по якому полю співпало.
📋 Заявки
| збіг | наш id | cms id | cms token | tenant | currency | очікувано | отримано | статус | AML | tx | створено |
|---|---|---|---|---|---|---|---|---|---|---|---|
💸 Депозити
| id | tx | токен | сума | from → to | final? | order | виявлено |
|---|---|---|---|---|---|---|---|
| → |
🚚 Sweep транзакції
| id | deposit_id | tx | type | статус | gas (gwei) | gas USD | sent | confirmed |
|---|---|---|---|---|---|---|---|---|
🏷 Адреси
| id | tenant | address | hd_path | статус | order | expires |
|---|---|---|---|---|---|---|
🛟 Lost-deposits знайдені пошуком
Це збіги по tx_hash / адресу серед усіх lost-deposit записів (включно з recovered + ignored). Сповнений список відкритих — нижче.
| id | chain | token | сума | to | tx | recovery tx | статус | дії |
|---|---|---|---|---|---|---|---|---|
🛟 Відкриті lost-deposits
Депозити що прийшли на наші HD-адреси не на тому ланцюзі (наприклад
клієнт замовив USDTBEP20, а заплатив USDTERC20). Recovery scanner
ловить їх раз на добу. Дії: ack — побачили,
recovered — кошти повернули вручну, ignore —
dust / scam-токен.
| id | chain | token | amount | to | tx | статус | дії |
|---|---|---|---|---|---|---|---|
AML
📥 Inbox — заявки що чекають AML рішення
aml_pending (AmlBot ще не повернув результат) або
aml_rejected. Кнопка Release запросить Telegram-OTP
підтвердження; після /confirm у боті ордер повернеться у
paid.
| tenant | cms_order_id | status | decision | entity / risk | сума | created | |
|---|---|---|---|---|---|---|---|
| — | |||||||
| Inbox порожній — нічого не очікує операторського втручання. | |||||||
Глобальний AML
УВІМКНЕНО ВИМКНЕНОaml_pass — sweep продовжує.
Local seed (blacklist) не перевіряється — це повне вимкнення.
⚖️ Поріг ризику
≥ % env: %- has_blacklist_flag → REJECT
blacklisted - відправник в BLOCKED_ENTITIES (rapira, …) → REJECT
blocked_entity - відправник в TRUSTED_ENTITIES (binance, bybit, …) + type=exchange → SKIP
trusted_entity - riskscore × 100 ≥ % → REJECT
high_risk_score - інакше → PASS
aml_clean
= % — використовується коли override скинутий. Глобальний (не per-tenant).
📋 Останні рішення AML
| Час | Order | Рішення | Entity | Risk | Причина | Джерело |
|---|---|---|---|---|---|---|
aml_decision — ця секція тільки агрегує.
🏷️ Поточні мітки — seed + auto-extend
Webhook outbox
Dead-lettered (потребують уваги)
| id | tenant | cms_order | attempts | code | error | дії |
|---|---|---|---|---|---|---|
Tenants — карта клієнтів, налаштування, статистика
🪪 Карта клієнтів
order_status_changed + withdraw_status_changed
deposit_received + aml_decided.
Секрет ротується через «🔁 Rotate keys».
[expected − underpay%, expected + overpay%] —
заявка paid; поза — Telegram alert + CMS «Призупинено».
docs/exchanger-integration.md). Старий клієнт зламається —
переключай тільки коли клієнт підтвердив що готовий.
📊 Статистика
Замовлення
AML
Депозити, gas, addresses
Гаманці
🏦 Cold per-tenant — клієнтські treasuries
m/44'/60'/{hd_idx}'/0/0. Sweep'и автоматично йдуть
сюди — кошти ізольовані on-chain між tenant'ами. Master cold
(legacy) було повністю прибрано.
| Tenant | hd_idx | Адреса | USDT | USDC | BNB | |
|---|---|---|---|---|---|---|
| — | — | — | — |
⛽ BNB-донор (parent)
📊 Sweep-активність
💸 Виведення коштів
Для виведення потрібен фізичний другий фактор: YubiKey, Touch ID, Windows Hello або мобільний пристрій з біометрією.
scripts/disable_passkey.py --confirm.
Після «Вивести» — запит passkey, потім Telegram-OTP, де повна адреса й сума ще раз показані перед
/confirm.
Підтверджуй лише якщо адреса в Telegram збігається.
Очікую на
/confirm в Telegram (TTL ~5 хв).
Сума: →
Статус сервісу
⚙️ Процес
База даних
BSC RPC
RPC ліміт (QuickNode)
QUICKNODE_ADMIN_API_KEY не налаштовано).
BNB (parent резерв)
Фонові потоки /
Webhook outbox
AML pipeline
🔗 Зв'язок з обмінниками
| Tenant | Стан | CMS endpoint | cms-auto endpoint | dead-24h | in-flight | ||
|---|---|---|---|---|---|---|---|
|
|
|
||||||
| Жодного ENABLED обмінника. Постав галку «показати DISABLED» щоб побачити приховані. Жодного бізнес-обмінника не зареєстровано. | |||||||
💰 Витрати BNB
Потік BNB через parent
Розбивка за типом sweep
| Тип | Шт | Сума (BNB) | Gas (BNB) | Gas (USD) |
|---|---|---|---|---|
| $ | ||||
| Разом gas | $ |
🔐 Налаштування входу
Поточна сесія
Зареєстровані passkey-пристрої
scripts/disable_passkey.py.
| Label | Authenticator (AAGUID) | Зареєстровано | Останнє використання | |
|---|---|---|---|---|
| Жодного passkey не зареєстровано — натисни «+ Додати». | ||||
op_admin_session cookie живе 24 год — після цього треба
повторно увійти.