Methodology · v1.0.0
No black-box scoring.
The Monarcy score is the sum of six components, each documented below with its input, normalisation, weight and limitations. The same code runs on every inspection — see src/lib/scoring/monarcy-score.ts. Unknown inputs score 0; the score never fills a gap with an estimate.
30
Liquidity
25
Depth
15
Volume
15
Price impact
10
Age
5
Data confidence
total 100 points
01
Liquidity · 30 points maximum
weight 30%
- Input
- USD liquidity of the primary market. Indexed figure (DexScreener → GeckoTerminal) when available, otherwise 2 × the quote-side reserve read on-chain, priced with a stablecoin (1.00) or the wrapped-native price from the deepest stable factory pool.
- Normalisation
- points = 30 × clamp((log10(L) − log10(1,000)) ÷ (log10(5,000,000) − log10(1,000)), 0, 1). $1k or less → 0, $5M or more → 30, linear in log space between.
- Weight
- 30 of 100
- Limitations
- Index liquidity for V3 pools counts whole-pool inventory, not only in-range liquidity. Unpriced quote assets yield no on-chain figure and the component scores 0.
02
Depth · 25 points maximum
weight 25%
- Input
- Simulated price impact of a $10,000 buy paid in the quote asset.
- Normalisation
- points = 25 × (1 − clamp((log10(impact) − log10(0.005)) ÷ (log10(0.25) − log10(0.005)), 0, 1)). ≤0.5 % → 25, ≥25 % → 0.
- Weight
- 25 of 100
- Limitations
- LP fee is stripped from the input first, so the figure is pure price movement. V2: exact x·y=k. V3: in-range approximation using the active liquidity L — understates impact when the trade crosses ticks. LIQUIDITY_ESTIMATE: constant-product identity on indexed liquidity when pool state could not be read.
03
Volume · 15 points maximum
weight 15%
- Input
- 24-hour USD volume of the primary market from an index.
- Normalisation
- points = 15 × clamp((log10(V) − 2) ÷ (6 − 2), 0, 1). $100 or less → 0, $1M or more → 15.
- Weight
- 15 of 100
- Limitations
- Volume only exists via an index; factory-discovered markets have none and score 0 here. Wash trading is not detected.
04
Price impact · 15 points maximum
weight 15%
- Input
- Simulated price impact of a $1,000 buy.
- Normalisation
- points = 15 × (1 − clamp((log10(impact) − log10(0.001)) ÷ (log10(0.10) − log10(0.001)), 0, 1)). ≤0.1 % → 15, ≥10 % → 0.
- Weight
- 15 of 100
- Limitations
- Same simulation caveats as Depth. Fee-on-transfer and rebasing tokens are not modelled.
05
Age · 10 points maximum
weight 10%
- Input
- Days since the pool was created, from the index pair-creation timestamp, measured against the head block time.
- Normalisation
- points = 10 × clamp((log10(days) − 0) ÷ (log10(180) − 0), 0, 1). Under 1 day → 0, 180 days or more → 10.
- Weight
- 10 of 100
- Limitations
- Only indexes report creation time; factory-only markets score 0. Age says nothing about the token contract’s deployment date.
06
Data confidence · 5 points maximum
weight 5%
- Input
- Which corroborating sources answered.
- Normalisation
- +2 pool state read on-chain at the pinned block · +1 indexed liquidity · +1 indexed volume · +1 pool age known. Maximum 5.
- Weight
- 5 of 100
- Limitations
- Confidence rewards agreement between sources; it does not verify that an index is correct.
07
Verdict bands
deterministic
A market with no measurable liquidity from any source is always UNVERIFIED (score capped at 24) regardless of other components.
08
Sources & order of precedence
per inspection
- JSON-RPC at one pinned head block: bytecode, ERC-20 selectors, token0/token1, getReserves, slot0, liquidity, fee, pool token balances.
- DexScreener token pairs / pair lookup — price, liquidity, volume, transactions, creation time.
- GeckoTerminal token pools / pool lookup — same fields; also the source for the Discover list.
- Factory reads: Uniswap V2 getPair and V3 getPool against the chain’s registered quote tokens, priced from reserves. Never overrides an index value; only fills gaps.
Structural market assessment only. Not investment advice.