How Nulucre scores wallet reputation
Every score is derived from on-chain signals fetched in real time. This page documents the exact signals, weight caps, and scoring formulas running in production — not an approximation.
What a score means
All chains use the same five bands. A score of 0 is reserved for sanctioned addresses; otherwise scores are bounded 1–100. Wallets with too few transactions to score reliably return a distinct INSUFFICIENT_DATA status with score: null — not a low score.
BLACKLISTED immediately, score 0, regardless of transaction history. (2) Data sufficiency — if the wallet clears sanctions but has too few transactions, returns INSUFFICIENT_DATA with score: null. (3) Behavioral score — only wallets that clear both checks receive a numeric score and a band label.INSUFFICIENT_DATA thresholds by chain: EVM — fewer than 5 Ethereum mainnet transactions; Stellar — fewer than 3 ledger transactions; XRPL — fewer than 3 ledger transactions; Solana — fewer than 5 transactions.
Response format when INSUFFICIENT_DATA:
{ "status": "INSUFFICIENT_DATA", "score": null, "reason": "transaction_count_below_threshold", "threshold": 5, "actual": 2 }
null — not a risk verdict, just no data.EVM Wallets
| Signal | Description | Formula | Max pts |
|---|---|---|---|
| walletAge | Days since first Ethereum transaction, scaled linearly to 1 year | min(age/365 × 30, 30) | 30 |
| txVolume | Total Ethereum transaction count (log-scaled to reduce whale dominance) | min(log₁₀(txCount+1) × 10, 40) | 40 |
| defiActivity | DeFi protocol interactions via DeBank or Moralis — protocols used, not TVL | min(protocols × 2, 20) | 20 |
| baseActivity | Transaction count on Base L2 (log-scaled) | min(log₁₀(baseTx+1) × 5, 10) | 10 |
| multiChain | Active chains (Polygon, Arbitrum, Optimism) — chains with any transaction count | min(chainCount × 2, 6) + min(log₁₀(alchTx+1) × 2, 4) | 10 |
| ankrCoverage | Chains with non-zero asset balance across 81 Ankr-indexed networks | min(chainCount × 1.5, 10) | 10 |
score: 0 and status: "BLACKLISTED" regardless of on-chain activity.
Stellar Wallets
| Signal | Description | Formula | Max pts |
|---|---|---|---|
| accountAge | Days since first transaction on Stellar pubnet | scaled to max | 25 |
| txVolume | Total transaction count fetched from Horizon (up to 200 sampled) | log₁₀(txCount + 1) × 8 | 25 |
| assetDiversity | Number of non-native (non-XLM) assets held — trustlines established and funded | assetCount × 4 | 20 |
| dexParticipation | DEX trades observed via StellarExpert API | trades × 1.5 | 15 |
| networkTrust | Active trustlines × 2, +5 if XLM balance > 10, +1 per subentry (account health) | (trustlines × 2) + (xlm > 10 ? 5 : 0) + subentries | 15 |
score: 0, status: "BLACKLISTED".
XRPL Wallets
| Signal | Description | Formula | Max pts |
|---|---|---|---|
| accountAge | Days since earliest transaction in account_tx history (Ripple epoch adjusted) | min(age/365 × 25, 25) | 25 |
| txVolume | Total transaction count (log-scaled) | min(log₁₀(tx+1) × 8, 20) | 20 |
| assetDiversity | Number of IOU trustlines — breadth of token exposure | min(assetCount × 4, 15) | 15 |
| dexParticipation | Open DEX offers (account_offers) — active market-making or trading | min(offerCount × 2, 10) | 10 |
| networkTrust | Trustline count + XRP reserve health (balance > 10 XRP +5, ownerCount > 0 +3) | min(tl×2 + bal + owner, 10) | 10 |
| paymentActivity | Outgoing Payment transactions (log-scaled) | min(log₁₀(payments+1) × 6, 10) | 10 |
| spamPenalty | Fraction of transactions under 1000 drops (0.001 XRP) — dust spam indicator | −min(round(spamRatio×10), 5) | −5 |
| sanctionsCheck | OFAC / international sanctions match | match → score: 0 | −100 |
Solana Wallets
| Signal | Description | Formula | Max pts |
|---|---|---|---|
| accountAge | Days since oldest block timestamp in recent signature history (200 signatures sampled) | min(age/365 × 25, 25) | 25 |
| txVolume | Confirmed transaction count (log-scaled) | min(log₁₀(tx+1) × 8, 20) | 20 |
| solBalance | SOL lamport balance converted to SOL (log-scaled — not raw SOL amount) | min(log₁₀(SOL+1) × 8, 15) | 15 |
| tokenDiversity | SPL token accounts owned (getTokenAccountsByOwner) | min(tokenCount × 2, 10) | 10 |
| recentActivity | Transactions in the last 30 days — measures active vs dormant wallets | min(recent × 0.5, 10) | 10 |
| executableBonus | Account is a deployed Solana program (executable flag) — signals developer activity | +5 if executable | 5 |
| errorPenalty | Ratio of failed transactions — high error rate indicates suspicious or scripted behavior | −min(round(errRatio×15), 15) | −15 |
| sanctionsCheck | OFAC / international sanctions match | match → score: 0 | −100 |
Where the data comes from
All data is fetched live at query time. No caching layer — every score reflects the chain state at that moment.
How signed scores work
The /signed/ endpoints return an ECDSA-P256 signature over the score payload, verifiable against the Nulucre public key.
wallet, score, status, and timestamp serialized to JSON, then base64-encoded.nulucre.com/.well-known/jwks.json. Signature is in the proof field of the response.What Nulucre is today — and what it will be
Nulucre is a deterministic, transparent, sanctions-screened signal. It is not yet a validated predictor of counterparty risk. The distinction matters.
Deterministic: The same wallet address returns the same score for the same on-chain state. The formula is public and auditable at this page.
Tamper-resistant inputs: Scores are computed from on-chain data — transaction history, wallet age, asset holdings — that cannot be altered retroactively.
Sanctions-screened: Every query runs real-time checks against OFAC SDN, OFAC Non-SDN, EU Financial Sanctions, and UN Security Council lists before a behavioral score is returned.
Agent-native: $0.001 USDC per query via x402 micropayments. No accounts, no API keys, no human provisioning required.
Honest about uncertainty: Wallets with too few transactions return
INSUFFICIENT_DATA rather than a misleading low score.
Determinism and transparency do not equal accuracy. A scoring formula can be public and still be a poor model of trustworthiness if the wrong signals are weighted. The only way to establish predictive validity is to compare scores against outcomes.
A prospective cohort was started on October 20, 2026. Every paid query is logged with wallet, chain, score, status, and signal breakdown. In 90 days — approximately January 18, 2027 — those initial scores will be compared against actual wallet behavior during the observation window.
The validation report will answer: did high-scoring wallets behave more reliably than low-scoring ones? Until that report is published with real outcome data, treat Nulucre scores as one useful, cheap, transparent input — not a proven predictor.
Wait for the validation report if: you need a proven predictor of counterparty reliability for high-stakes decisions. That document will exist in January 2027.