Дашборд
💰 Баланси обмінників
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 : | прострочено |
📊 Оборот
Розбивка по обмінках
| tenant | всього | оплачено | swept | провал | обʼєм USD |
|---|---|---|---|---|---|
Денний розріз
| день | заявок | обʼєм USD |
|---|---|---|
Швидкі дії
Заявки онлайн
Повне коло: видано адресу → AML → оплачено → виведено в cold. Повернення: повертається → повернено. Авто-оновлення кожні 10 секунд.
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.
Якщо ввести просто число — шукаємо і там і там, в результатах буде
видно по якому полю співпало.
📋 Заявки
🚚 Sweep транзакції
🛟 Відкриті lost-deposits
Що таке lost-deposit і що з ним робити
Депозит прийшов на нашу HD-адресу, але не в тій мережі, у якій
видана заявка (наприклад, заявка на USDTBEP20, а гроші прийшли
в Ethereum), або це не той токен (не USDT/USDC — сторонній чи
scam-токен). ERC20 (Ethereum) тепер штатна мережа: оплата
ERC20-заявки в Ethereum сюди не потрапляє. Recovery scanner
ловить такі депозити раз на добу. Дії: ack — побачили,
recovered — кошти повернули вручну, ignore —
dust / scam-токен.
AML
📥 Inbox — заявки що чекають AML рішення
aml_pending (AmlBot ще не повернув результат) або
aml_rejected. Кнопка Release запросить Telegram-OTP
підтвердження; після /confirm у боті ордер повернеться у
paid.
| tenant | cms_order_id | status | decision | entity / risk | сума | created | |
|---|---|---|---|---|---|---|---|
| ⏳ Force в черзі | — |
|
|||||
| 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
↪ AML-перекид у CryptoCash
Тенанти
| slug | дозволено | на годину | на добу | max_redirect |
|---|---|---|---|---|
| Тенантів немає | ||||
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-гаманці обмінників
⛽ Газ-донор (parent)
m/44'/60'/9000'/0/0Що це?
📊 Sweep-активність
Що це?
Як влаштовані cold-гаманці
m/44'/60'/{hd_idx}'/0/0.
Ключ EVM спільний, тому та сама адреса тримає гроші в кожній EVM-мережі
() —
це різні гроші в різних мережах, тому вони показані окремо. Sweep-и автоматично йдуть сюди.
💸 Виведення коштів
Для виведення потрібен фізичний другий фактор: YubiKey, Touch ID, Windows Hello або мобільний пристрій з біометрією.
scripts/disable_passkey.py --confirm.
Після «Вивести» — запит passkey, потім Telegram-OTP, де повна адреса й сума ще раз показані перед
/confirm.
Підтверджуй лише якщо адреса в Telegram збігається.
Очікую на
/confirm в Telegram (TTL ~5 хв).
Сума: →
Статус сервісу
⚙️ Процес
База даних
networks) — оновіть сервіс.
Бюджет запитів — деталі
Газ — деталі
Фонові потоки /
Webhook outbox
AML pipeline
🔗 Зв'язок з обмінниками
| Tenant | Стан | CMS endpoint | cms-auto endpoint | dead-24h | in-flight | ||
|---|---|---|---|---|---|---|---|
|
|
|
||||||
| Жодного ENABLED обмінника. Постав галку «показати DISABLED» щоб побачити приховані. Жодного бізнес-обмінника не зареєстровано. | |||||||
⛽ Витрати на газ
| Тип операції | Шт | Газ $ | ||
|---|---|---|---|---|
| Разом газ |
Як рахується
sweeps, мережі з tx-engine (Ethereum) — з фактичної
комісії квитанцій evm_tx_operations. USD — за поточним курсом монети газу.
🔐 Налаштування входу
Поточна сесія
Зареєстровані passkey-пристрої
scripts/disable_passkey.py.
| Label | Authenticator (AAGUID) | Зареєстровано | Останнє використання | |
|---|---|---|---|---|
| Жодного passkey не зареєстровано — натисни «+ Додати». | ||||
op_admin_session cookie живе 24 год — після цього треба
повторно увійти.