Реализация AI-скоринга токенов/проектов в мобильном приложении
Каждую неделю запускаются десятки новых токенов. Большинство из них — мусор, часть — скам, единицы — реальные проекты. Скоринговая система помогает быстро отфильтровать очевидно плохие проекты и приоритизировать анализ оставшихся.
Что оцениваем: параметры скоринга
Хорошая скоринговая система охватывает несколько измерений:
Технология и разработка:
- GitHub активность: коммиты за последние 30/90 дней, контрибьюторы, open issues
- Качество кода: наличие тестов, audit reports
- Технологический стек: используемые блокчейны, стандарты токенов
Команда:
- Верифицированные личности vs анонимы (risk factor)
- LinkedIn профили, публичная история
- Предыдущие проекты и их судьба
Токеномика:
- Распределение токенов: % у команды, инвесторов, паблик
- Вестинг расписание: есть ли lock-up периоды
- Инфляционная/дефляционная модель
- Circulating vs total supply ratio
Рыночные метрики:
- Market cap / FDV ratio (Fully Diluted Valuation)
- Liquidity depth: объём в пулах DEX
- Holder distribution: топ-10 держателей и их % от supply
Community:
- Twitter followers и engagement rate (не накрученные)
- Telegram/Discord активность vs размер
Источники данных
class TokenDataAggregator:
def get_github_metrics(self, repo_url: str) -> dict:
# GitHub API v3
import requests
owner, repo = self._parse_repo_url(repo_url)
headers = {"Authorization": f"token {GITHUB_TOKEN}"}
commits_30d = requests.get(
f"https://api.github.com/repos/{owner}/{repo}/commits",
params={"since": (datetime.now() - timedelta(days=30)).isoformat()},
headers=headers
).json()
contributors = requests.get(
f"https://api.github.com/repos/{owner}/{repo}/contributors",
headers=headers
).json()
return {
"commits_30d": len(commits_30d) if isinstance(commits_30d, list) else 0,
"contributors_count": len(contributors) if isinstance(contributors, list) else 0,
"stars": self._get_repo_stars(owner, repo, headers)
}
def get_onchain_metrics(self, contract_address: str, chain: str) -> dict:
# Moralis API — поддерживает ETH, BSC, Polygon и другие
response = requests.get(
f"https://deep-index.moralis.io/api/v2.2/erc20/{contract_address}/owners",
params={"chain": chain, "limit": 10},
headers={"X-API-Key": MORALIS_API_KEY}
)
holders = response.json()
top10_concentration = sum(h["percentage_relative_to_total_supply"]
for h in holders.get("result", [])[:10])
return {"top10_holder_concentration": top10_concentration}
Moralis API — агрегирует on-chain данные по множеству EVM-совместимых сетей. Covalent API — альтернатива с историческими данными. Для Solana — Helius или Solana RPC напрямую.
Скоринговая модель
Rule-based scoring как основа
Начинаем с набора правил с весами. Это прозрачно и объяснимо — важно для пользователей, которые хотят понимать оценку:
class TokenScorer:
WEIGHTS = {
"github_activity": 0.15,
"team_transparency": 0.20,
"tokenomics_health": 0.25,
"liquidity_score": 0.20,
"community_quality": 0.10,
"audit_status": 0.10,
}
def score_github(self, metrics: dict) -> float:
score = 0.0
if metrics["commits_30d"] > 50:
score += 0.4
elif metrics["commits_30d"] > 10:
score += 0.2
if metrics["contributors_count"] > 5:
score += 0.3
elif metrics["contributors_count"] > 2:
score += 0.15
return min(score, 1.0)
def score_tokenomics(self, data: dict) -> float:
score = 1.0
# Штраф за высокую концентрацию у команды
if data["team_allocation_pct"] > 30:
score -= 0.3
# Штраф за отсутствие вестинга
if not data["has_vesting"]:
score -= 0.25
# Штраф за низкий circulating ratio (много токенов ещё будет выпущено)
if data["circulating_ratio"] < 0.2:
score -= 0.2
return max(score, 0.0)
ML поверх правил: аномалии и паттерны rug pull
ML-компонент помогает выявлять паттерны, характерные для скама. Обучаем на исторических данных: токены, которые сделали rug pull, и легитимные проекты.
Признаки rug pull в данных:
- Создатель контракта удалил liquidity pool в течение 30 дней
- Honeypot: нельзя продать токен (функция sell заблокирована в контракте)
- Proxy контракт с возможностью изменить логику без timelock
- 90%+ supply у одного адреса
from sklearn.ensemble import GradientBoostingClassifier
# Rug pull detector
features = [
"top1_holder_pct",
"lp_lock_days",
"is_proxy_contract",
"sell_function_exists",
"owner_renounced",
"audit_score",
"github_commits_30d",
"holder_count"
]
model = GradientBoostingClassifier(n_estimators=100, max_depth=4)
model.fit(X_train, y_train) # y: 1 = rug pull, 0 = legitimate
Датасет: токены с подтверждёнными rug pull из DeFiLlama Hacks dashboard, Token Sniffer исторические данные.
Honeypot детекция
Отдельная критическая проверка — можно ли продать токен. go-ethereum / ethers.js симуляция транзакции продажи до взаимодействия с контрактом:
from web3 import Web3
def check_honeypot(contract_address: str, router_address: str) -> bool:
w3 = Web3(Web3.HTTPProvider(RPC_URL))
# Симулируем продажу минимального количества токена
try:
router = w3.eth.contract(address=router_address, abi=ROUTER_ABI)
router.functions.swapExactTokensForETHSupportingFeeOnTransferTokens(
1, # 1 wei эквивалент токена
0,
[contract_address, WETH_ADDRESS],
ZERO_ADDRESS,
int(time.time()) + 60
).call({"from": TEST_WALLET})
return False # продажа прошла = не honeypot
except Exception:
return True # revert = honeypot
Это call, не send — газ не тратится, транзакция не пишется в блокчейн.
Мобильный UI
Финальный score — число от 0 до 100 с цветовой индикацией (красный < 40, жёлтый 40–70, зелёный > 70). Но score без объяснения — черный ящик. Рядом со score — breakdown по категориям: что снизило оценку.
struct TokenScore: Codable {
let overallScore: Double // 0-100
let riskLevel: RiskLevel // .low, .medium, .high, .critical
let breakdown: ScoreBreakdown
let warnings: [String] // ["Honeypot detected", "No audit report"]
let lastUpdated: Date
}
struct ScoreBreakdown: Codable {
let technology: Double
let team: Double
let tokenomics: Double
let liquidity: Double
let community: Double
}
Предупреждения приоритизируем: honeypot — красный баннер сразу, низкая ликвидность — жёлтый warning внизу.
Процесс работы
Определение параметров скоринга совместно с клиентом. Разработка data pipeline (GitHub API, on-chain данные, социальные метрики). Rule-based scoring engine. ML-модель детекции rug pull / honeypot. REST API с кешированием (данные по токену — раз в час). Мобильный UI: карточка токена с score и breakdown.
Ориентиры по срокам
Rule-based скоринг с базовым набором метрик — 1–2 недели. Полная система с ML rug pull детектором, honeypot проверкой и мобильным UI — 3–5 недель.







