On-chain credit intelligence dashboard for EVM wallets.
FastAPI backend + React frontend + explainable score diagnostics.
Traditional credit scoring systems rely on centralized data sources, which can be intrusive, biased, and vulnerable to data breaches. Many individuals, especially in the decentralized finance (DeFi) space, lack traditional credit histories, making it difficult to access financial services.
Our dApp provides a decentralized, privacy-preserving alternative to credit scoring by analyzing blockchain-based assets like USDT balances, NFT holdings, and ENS tokens. Users can leverage their digital assets for credit assessments without exposing personal financial information. This approach democratizes access to credit, eliminates bias, and enhances security by utilizing Nada AI’s blind computation for secure data processing.
- FastAPI backend (
v2) with OpenAPI docs and structured error responses. - Multi-chain-ready scoring engine (
ethereum,polygon,bsc,arbitrum) with partial-failure handling. - Model-based score generation using
credit_scoring_dataset.csvand weighted feature calibration. - Rate limiting + request tracing (
X-Request-ID,X-Process-Time-Ms) for production-style observability. - Modern UI diagnostics (speedometer, factor matrix, peer delta, percentile, risk regime, volatility).
The score is normalized into the 300–850 range using these weighted factors:
| Factor | Weight | Core Signal |
|---|---|---|
| Wallet Balance | 30% | Native + USDT value (USD) |
| Transaction History | 25% | Behavioral activity volume |
| NFT Holdings | 20% | NFT ownership depth |
| Account Age | 15% | Wallet longevity |
| Network Diversity | 10% | Cross-chain/token diversity |
Returned payloads also include score_band, trust_level, risk_regime, average_score, peer_delta, percentile, summary, factors, featured_collections, and meta telemetry.
frontend (React + Vite)
│ POST /api/score
▼
backend/main.py (FastAPI)
│ delegates scoring
▼
backend/data_processing.py
├─ RPC + explorer/NFT/price aggregation
├─ credit model inference
└─ explainable factor payload assembly
backend/
main.py # FastAPI app, middleware, endpoints, rate limit
data_processing.py # Multi-chain ingestion + model scoring
credit_scoring_dataset.csv # Training/reference dataset
tests/
test_api.py
test_data_processing.py
frontend/
src/
App.jsx
CreditScoreSpeedometer.jsx
ScoreBreakdown.jsx
ScoreAnalysis.jsx
WalletSummary.jsx
- Python 3.10+
- Node.js 18+
- npm
- MetaMask (or compatible injected wallet)
From repo root:
pip install -r backend/requirements.txt
python backend/main.py --host 127.0.0.1 --port 8000Health checks:
curl http://127.0.0.1:8000/api/health
curl "http://127.0.0.1:8000/api/chains?deep=true"Interactive API docs:
http://127.0.0.1:8000/docs
cd frontend
npm install
npm run devOpen:
http://localhost:5173
Base URL: http://127.0.0.1:8000
GET /api/healthGET /api/health?deep=trueGET /api/chainsGET /api/chains?deep=truePOST /api/scoreGET /api/score/{wallet_address}
{
"address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"
}{
"address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
"chains": ["ethereum", "polygon", "bsc", "arbitrum"]
}| Variable | Purpose |
|---|---|
ETHERSCORE_HOST |
API bind host (default 127.0.0.1) |
ETHERSCORE_PORT |
API bind port (default 8000) |
ETHERSCORE_CORS_ORIGINS |
Allowed CORS origins (comma-separated or *) |
ETHERSCORE_RATE_LIMIT_PER_MINUTE |
Rate limit quota (default 60) |
ETHERSCORE_RATE_LIMIT_WINDOW_SECONDS |
Rate limit window (default 60) |
Set at least one RPC endpoint:
ETHERSCORE_RPC_URL_ETHEREUMETHERSCORE_RPC_URL_POLYGONETHERSCORE_RPC_URL_BSCETHERSCORE_RPC_URL_ARBITRUM
Optional model/data tuning:
ETHERSCORE_CREDIT_MODEL_DATASET_PATHETHERSCORE_CACHE_TTL_SECONDSETHERSCORE_REQUEST_TIMEOUT_SECONDSETHERSCORE_UPSTREAM_RETRY_COUNT
| Variable | Purpose | Default |
|---|---|---|
VITE_API_BASE_URL |
Backend API base URL | http://127.0.0.1:8000 |
Backend tests:
pytest backend/tests -qFrontend scripts:
cd frontend
npm run dev
npm run build
npm run previewMIT — see LICENSE.
