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
22 changes: 11 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,19 +34,19 @@ npm install
npm start
```

## 🔀 Источник баланса (Rabby / DeBank)
## 🔀 Источник баланса (Rabby)

Балансы по умолчанию берутся из **Rabby API** (`api.rabby.io`): итог кошелька
приходит готовым агрегатом в одном запросе `total_balance`, поэтому ручного
Балансы берутся из **Rabby API** (`api.rabby.io`): итог кошелька приходит
готовым агрегатом в одном запросе `total_balance`, поэтому ручного
суммирования нет — это устраняет «фантомные» балансы (когда под нагрузкой
DeBank отдавал портфель чужого адреса и итог раздувался).

Переключить источник можно переменной окружения (без пересборки):

```bash
BALANCE_SOURCE=rabby npm start # по умолчанию — авторитетный агрегат
BALANCE_SOURCE=debank npm start # легаси-fallback (kill switch)
```
DeBank отдавал портфель чужого адреса и итог раздувался). Ветка DeBank
удалена (как в github.com/privatekey7/DeBankChecker, PR #5).

Заголовки запросов повторяют клиент Rabby байт-в-байт (сверено с HAR
расширения): lowercase-подписные заголовки, `x-api-time` = время выдачи
ключа, `x-version: 0.94.2`, браузерные `sec-fetch-*`/`accept-language`.
Отклонение карается фейковым 429 с пустым телом — разбор инцидента:
`docs/incident-429-antibot.md` в репозитории DeBankChecker.

Тесты бэкенда:
```bash
Expand Down
34 changes: 17 additions & 17 deletions backend/dist/config.d.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/**
* Конфигурация источников баланса.
* Конфигурация источника баланса.
*
* Исторически балансы брались из DeBank API, где итог считался ВРУЧНУЮ
* (`tokens + protocols` из двух отдельных запросов). Под нагрузкой DeBank-edge
Expand All @@ -8,16 +8,10 @@
* запросом `/v1/user/total_balance`, поэтому ручного суммирования нет и
* корневой сценарий фантома исчезает.
*
* Переключатель `BALANCE_SOURCE` позволяет мгновенно откатиться на DeBank
* (feature flag / kill switch), не трогая код — как `BALANCE_SOURCE` в
* github.com/privatekey7/DeBankChecker.
* Ветка DeBank удалена (как в github.com/privatekey7/DeBankChecker, PR #5):
* итог и раньше брался только из авторитетного агрегата, так что функционально
* ничего не потеряно.
*/
export type BalanceSource = 'rabby' | 'debank';
/**
* Активный источник баланса. Можно переопределить переменной окружения
* `BALANCE_SOURCE=debank` без пересборки.
*/
export declare const BALANCE_SOURCE: BalanceSource;
/** Настройки корроборации (защита от фантомных балансов). */
export type CorroborationConfig = {
/** Включена ли корроборация независимыми выборками. */
Expand All @@ -32,19 +26,25 @@ export type CorroborationConfig = {
absTol: number;
};
/**
* Для Rabby источник авторитетный (готовый агрегат в одном ответе), поэтому
* `minAgree = 1` — лишних запросов не делаем. Для DeBank оставляем прежнюю
* корроборацию (2 согласованных выборки), т.к. там итог собирается вручную.
* Источник (Rabby) авторитетный — готовый агрегат в одном ответе, поэтому
* `minAgree = 1`: лишних запросов корроборация не делает, но механика
* остаётся как страховка.
*/
export declare const CORROBORATION: Record<BalanceSource, CorroborationConfig>;
export declare const CORROBORATION: CorroborationConfig;
/** Константы Rabby API (проверены воспроизведением подписи из HAR веб-версии). */
export declare const RABBY: {
readonly apiBase: "https://api.rabby.io";
/** Начальный x-api-key из HAR; сервер ротирует через `x-set-api-key`. */
readonly apiKeyInit: "7cee6f31-6611-4821-beb8-6ca9e29ed965";
/** Версия клиента Rabby, под которую записан HAR. */
readonly clientVersion: "0.94.1";
/** Префикс строки подписи (у DeBank — `debank-api`). */
/**
* Время выдачи init-ключа (из HAR веб-клиента). Отправляется как x-api-time:
* сервер ожидает время ВЫДАЧИ ключа, а не время запроса — вместе с кейсингом
* заголовков это сверено с HAR (иначе анти-бот отвечает фейковым 429).
*/
readonly apiKeyInitTime: 1762656362;
/** Версия клиента Rabby (из HAR расширения), под которую записана схема. */
readonly clientVersion: "0.94.2";
/** Префикс строки подписи (у DeBank был `debank-api`). */
readonly signPrefix: "rabby-api";
/** Брать только проверенные (core) токены — как галка в UI Rabby. */
readonly isCore: true;
Expand Down
2 changes: 1 addition & 1 deletion backend/dist/config.d.ts.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

52 changes: 22 additions & 30 deletions backend/dist/config.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion backend/dist/config.js.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion backend/dist/server.d.ts.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

22 changes: 10 additions & 12 deletions backend/dist/server.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion backend/dist/server.js.map

Large diffs are not rendered by default.

17 changes: 8 additions & 9 deletions backend/dist/services/balanceService.d.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,16 @@
import { WalletData } from '../types';
import { BalanceSource } from '../config';
import { DeBankService } from './debankService';
import { RabbyService } from './rabbyService';
/**
* Публичный контракт источника баланса — общий для DeBank и Rabby. Сервер
* работает через этот интерфейс и не знает, какой источник активен.
* Публичный контракт источника баланса. Сервер работает через этот интерфейс
* и не знает деталей реализации.
*/
export interface BalanceService {
getWalletData(walletAddress: string): Promise<WalletData | null>;
getProxyStatus(): {
total: number;
working: number;
};
getProxyStats(): ReturnType<DeBankService['getProxyStats']>;
getProxyStats(): ReturnType<RabbyService['getProxyStats']>;
clearCache(): void;
getCacheStats(): {
totalEntries: number;
Expand All @@ -20,9 +19,9 @@ export interface BalanceService {
};
}
/**
* Фабрика источника баланса по флагу `BALANCE_SOURCE`.
* `rabby` (по умолчанию) — авторитетный агрегат, фантом-баг устранён.
* `debank` — легаси-fallback (kill switch).
* Источник баланса — Rabby API (авторитетный агрегат, фантом-баг устранён).
* Ветка DeBank удалена (как в github.com/privatekey7/DeBankChecker, PR #5):
* итог и раньше брался только из total_usd_value.
*/
export declare const createBalanceService: (source?: BalanceSource) => BalanceService;
export declare const createBalanceService: () => BalanceService;
//# sourceMappingURL=balanceService.d.ts.map
Loading