Skip to content
This repository was archived by the owner on Oct 1, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,11 @@ jobs:

- name: Import smoke check
run: |
python -c "import debank_checker.api.client, debank_checker.checker, debank_checker.export.csv_exporter, debank_checker.export.excel, debank_checker.export.json_exporter, debank_checker.proxy.manager, debank_checker.ui.menu"
python -c "import debank_checker.api.rabby_client, debank_checker.checker, debank_checker.export.csv_exporter, debank_checker.export.excel, debank_checker.export.json_exporter, debank_checker.proxy.manager, debank_checker.ui.menu"

- name: Run tests
run: |
python -m pytest tests/ -q

- name: Bytecode compile
run: |
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ env/
# Output
Results/
debug_log.txt
logs.txt

# Local inputs (do not commit)
wallets.txt
Expand Down
53 changes: 29 additions & 24 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -112,30 +112,35 @@ python main.py

---

## Источник балансов: Rabby (по умолчанию) / DeBank

Балансы можно получать через **Rabby API** (`api.rabby.io`) или через старый
**DeBank API**. Переключатель — `BALANCE_SOURCE` в `debank_checker/config.py`
(`"rabby"` по умолчанию, `"debank"` для отката).

**Почему Rabby.** DeBank-ветка считала итог кошелька ВРУЧНУЮ
(`total = tokens_usd + protocols_usd` из двух отдельных запросов). Под высокой
конкуренцией DeBank изредка отдаёт ответ от **чужого адреса**
(response contamination) — и на кошельке с $15 «появлялись» миллионы. Rabby
отдаёт готовый агрегированный итог одним запросом
(`/v1/user/total_balance?is_core=true`, `total_usd_value` уже включает токены и
DeFi), поэтому итоговая сумма **не зависит** от ручного суммирования потенциально
загрязнённых ответов — корневая причина фантомов устранена.

Схема подписи запросов у Rabby идентична DeBank (проверено воспроизведением
подписи из HAR веб-клиента байт-в-байт, см. `tests/test_rabby_client.py`);
`is_core=true` оставляет только проверенные (core) токены. Версия веб-клиента
Rabby — в `RABBY_CLIENT_VERSION`; при поломке подписи обнови её из свежего HAR.
## Источник балансов: Rabby API

Балансы получаются через **Rabby API** (`api.rabby.io`). Итог кошелька берётся
готовым агрегатом одним запросом (`/v1/user/total_balance?is_core=true`,
`total_usd_value` уже включает токены и DeFi), поэтому сумма не считается
вручную и не зависит от polluted-ответов. `is_core=true` оставляет только
проверенные (core) токены. Версия веб-клиента Rabby — в `RABBY_CLIENT_VERSION`
(`debank_checker/config.py`); при поломке подписи обнови её из свежего HAR.

### Заголовки должны точно повторять веб-клиент

Анти-бот Rabby на любое отклонение в заголовках идентификации отвечает
**фейковым 429 с пустым телом** (при полностью корректной подписи; проверено
на live-API). Требования (сверены с HAR веб-клиента, `tests/fixtures/`):

- все заголовки — в **нижнем регистре**: `x-api-key`, `x-api-time`, ...;
- `x-api-time` — **время выдачи текущего API-ключа**, а не время запроса
(для init-ключа — `RABBY_API_KEY_INIT_TIME` в конфиге);
- `x-api-ver` **не отправляется**.

Ротированный сервером ключ (`x-set-api-key`) читается из любого ответа,
включая ошибочные, и сохраняется в общем магазине ключей на процесс — новый
клиент на каждую попытку продолжает с последнего выданного ключа, а не
стартует заново с init-ключа.

## Защита от «фантомных» балансов (страховка)

Дополнительно сохранён механизм **корроборации**: баланс принимается, если
подтверждён `CORROBORATION_MIN_AGREE` независимыми выборками, сошедшимися по
сумме. Для Rabby итог авторитетен, поэтому по умолчанию `MIN_AGREE=1` (лишних
запросов нет), а механика остаётся как страховка. Для DeBank имеет смысл поднять
до `2`. Параметры — в `debank_checker/config.py` (`CORROBORATION_*`).
Сохранён механизм **корроборации**: баланс принимается, если подтверждён
`CORROBORATION_MIN_AGREE` независимыми выборками, сошедшимися по сумме.
Для Rabby итог авторитетен, поэтому по умолчанию `MIN_AGREE=1` (лишних
запросов нет), а механика остаётся как страховка. Параметры — в
`debank_checker/config.py` (`CORROBORATION_*`).
2 changes: 1 addition & 1 deletion debank_checker/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
"""
DeBank Balance Checker — массовая проверка балансов кошельков через DeBank API.
DeBank Checker — массовая проверка балансов кошельков через Rabby API.
"""

__version__ = "1.0.3"
6 changes: 3 additions & 3 deletions debank_checker/api/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
"""API: DeBank клиент."""
"""API: клиент Rabby (api.rabby.io)."""

from debank_checker.api.client import DeBankClient
from debank_checker.api.rabby_client import RabbyClient

__all__ = ["DeBankClient"]
__all__ = ["RabbyClient"]
182 changes: 0 additions & 182 deletions debank_checker/api/client.py

This file was deleted.

Loading
Loading