Nulucre Scoring Methodology
Scoring Methodology · v1.0

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.

Live — updated when scoring logic changes

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.

ℹ
Status resolution order Every query resolves in this order: (1) Sanctions screening — a match returns 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 }
80–100
Trusted
Long history, high activity, broad multi-chain or multi-asset footprint
60–79
Verified
Established wallet with meaningful on-chain history
40–59
Caution
Limited history or signals — newer wallet or low activity
20–39
Risky
Very new, inactive, or showing abnormal patterns
0–19
Blacklisted
Sanctioned address (score forced to 0) or near-zero on-chain activity
null
Insufficient Data
Fewer than 5 transactions (EVM/Solana) or 3 (Stellar/XRPL). Score is null — not a risk verdict, just no data.
EVM

EVM Wallets

Endpoint: GET /reputation/{wallet} Chains: Ethereum · Base · Polygon · Arbitrum · Optimism · 81 via Ankr
Max possible score
100 pts
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
⚠
Sanctions screening — OFAC / UN / EU EVM addresses are checked against OFAC SDN, UN Security Council, and EU consolidated sanctions lists before the score is returned. A match forces score: 0 and status: "BLACKLISTED" regardless of on-chain activity.
Stellar

Stellar Wallets

Endpoint: GET /reputation/stellar/{G-address} Data source: Horizon API + StellarExpert
Max possible score
100 pts
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
⚠
Sanctions screening Stellar G-addresses are screened against OFAC SDN and international sanctions lists. Match forces score: 0, status: "BLACKLISTED".
XRPL

XRPL Wallets

Endpoint: GET /reputation/xrpl/{r-address} Data source: xrplcluster.com
Max possible score (before spam penalty)
90 pts
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

Solana Wallets

Endpoint: GET /reputation/solana/{address} Data source: Solana Mainnet RPC
Max possible score (before error penalty)
85 pts
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.

Etherscan v2 API
Ethereum · Base
Transaction history, timestamps for age calculation
Alchemy
Polygon · Arbitrum · Optimism
eth_getTransactionCount per chain for multi-chain footprint
Ankr Multichain
81 EVM chains
ankr_getAccountBalance for cross-chain asset presence
DeBank / Moralis
DeFi protocols
Protocol interaction counts (DeBank preferred, Moralis fallback)
Stellar Horizon
Stellar pubnet
accounts, transactions, operations endpoints
StellarExpert API
Stellar pubnet
Supplementary account analytics
XRPL Cluster
XRPL mainnet
account_info, account_tx, account_offers, account_lines
Solana RPC
Solana mainnet
getAccountInfo, getSignaturesForAddress, getTokenAccountsByOwner

How signed scores work

The /signed/ endpoints return an ECDSA-P256 signature over the score payload, verifiable against the Nulucre public key.

01
Score computed
All signals fetched and weighted. Final score and status determined.
02
Payload assembled
wallet, score, status, and timestamp serialized to JSON, then base64-encoded.
03
ECDSA-P256 signed
SHA-256 digest signed with Nulucre's private key using IEEE P1363 encoding.
04
Verify
Public key available at 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.

✓
What Nulucre can claim today

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.
ℹ
What the validation report will establish

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.
→
Use Nulucre today if: you need a fast, cheap, sanctions-screened signal before a low-stakes agent transaction and want deterministic, auditable scoring.

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.