- Move app/domains/tokens/deployer.py -> app/domains/token/deployer.py. Delete app/domains/tokens/ (was a single-file shadow of the token domain). - Move app/domains/scanner/* into app/domains/scanners/core/. The 31 detector modules in app/domains/scanners/ + the core service are now a single coherent domain. - Update import paths in app/token_scanner.py and app/token_deployer.py. - Delete empty app/domain/ (singular, was a leftover scaffold). - Factory still loads 466 routes, mypy-gate clean.
51 lines
1.3 KiB
Python
51 lines
1.3 KiB
Python
"""Scanner data models and constants."""
|
|
|
|
from dataclasses import dataclass, field
|
|
from datetime import UTC, datetime
|
|
from typing import Any
|
|
|
|
|
|
@dataclass
|
|
class ScanResult:
|
|
"""Result of a token security scan."""
|
|
|
|
token_address: str
|
|
chain: str
|
|
symbol: str = ""
|
|
name: str = ""
|
|
scanned_at: str = field(default_factory=lambda: datetime.now(UTC).isoformat())
|
|
|
|
# FREE tier
|
|
free: dict[str, Any] = field(default_factory=dict)
|
|
# PRO tier
|
|
pro: dict[str, Any] = field(default_factory=dict)
|
|
# ELITE tier
|
|
elite: dict[str, Any] = field(default_factory=dict)
|
|
|
|
safety_score: int = 50 # 0-100, higher = safer (starts at 50 = unknown)
|
|
risk_flags: list[str] = field(default_factory=list)
|
|
tier_required: str = "free"
|
|
confidence: int = 0 # 0-100, how much data backs this score
|
|
modules_run: list[dict[str, Any]] = field(default_factory=list) # [{module, status, error?}]
|
|
|
|
|
|
CHAIN_IDS = {
|
|
"solana": "solana",
|
|
"ethereum": "1",
|
|
"base": "8453",
|
|
"bsc": "56",
|
|
"arbitrum": "42161",
|
|
"polygon": "137",
|
|
"avalanche": "43114",
|
|
"optimism": "10",
|
|
"fantom": "250",
|
|
"linea": "59144",
|
|
"zksync": "324",
|
|
"scroll": "534352",
|
|
"mantle": "5000",
|
|
}
|
|
|
|
SOLANA_RPC_ENDPOINTS = [
|
|
"https://api.mainnet-beta.solana.com",
|
|
"https://solana-api.syndica.io/access-token/free",
|
|
]
|