Documentation
Reference for bands, ledger updates, scan policy, and what $KEEPERS unlocks. If a fact is not measured, we say we do not know.
Overview
- KEEPERS measures how much of each equity token has not moved for 7, 30, and 90 days, plus the remainder that moved inside the last week.
- Age of a position is time since the wallet's last transfer of that token in either direction.
Bands
- deep: age >= 90 days of blocks
- kept: age >= 30 days
- settled: age >= 7 days
- churn: everything younger
- At ~0.102s per block, DAY_BLOCKS = 847,000.
Ledger rules
- applyTransfer resets lastMoveBlock for both sender and recipient.
- Excluded addresses (pools, routers) never enter the map.
- Zero address is skipped. Wallets that drain to ~0 leave the ledger.
- A uiMultiplier change recalculates share size without resetting lastMoveBlock.
Initial scan
- The first build is a resumable batch job chunked by block range.
- Until a scan completes for an asset, the UI prints not yet measured.
- Never publish partial band fractions for an unfinished asset.
Data surface
- Public: current cores by supply and by holders for every tracked asset.
- $KEEPERS unlocks weekly history, custom thresholds, and embeddable cores.
- Anti-pattern: projects cannot pay to highlight or rank a core.
Conduct
- Aggregates only. No wallet addresses. No top keepers lists.
- No labels that imply virtue or foolishness in holding or trading.
- These tokens are not registered in the US and are not offered to US residents.
Snippet
function band(lastMoveBlock, head) {
const age = head - lastMoveBlock;
if (age >= 90 * DAY_BLOCKS) return "deep";
if (age >= 30 * DAY_BLOCKS) return "kept";
if (age >= 7 * DAY_BLOCKS) return "settled";
return "churn";
}