Fairness grade
How the Rulebook scores a token's rules from A to F.
Grades
Every token starts at 100 points and loses points on four checks. The grade comes from what's left. The Rulebook contract computes it from the sealed rules, so it can't be edited or faked, and anyone can recompute it.
The four checks
How high fees stay after Shield
The highest buy or sell fee once the Shield window ends. A sell fee that follows Hold Streak counts at its highest value at any streak.
| Value | Points |
|---|---|
| 0% | 0 |
| up to 1% | −5 |
| up to 3% | −10 |
| up to 5% | −15 |
| above 5% | −30 |
How fast fees ease
How long until both the buy and sell fee stay at 2% or less. For a Hold Streak sell fee, the streak needed.
| Value | Points |
|---|---|
| within 1 day | 0 |
| within 7 days | −5 |
| within 30 days | −10 |
| later or never | −20 |
How much can reach the creator
The largest share of any one fee that could be paid to the creator. Bot Tax is counted on its own.
| Value | Points |
|---|---|
| none | 0 |
| up to 20% | −5 |
| up to 40% | −10 |
| up to 60% | −20 |
| more | −25 |
Whether the creator's tokens are locked
Creators can keep up to 10% of the supply. How long it stays locked matters.
| Value | Points |
|---|---|
| kept none | 0 |
| locked 180 days or more | −5 |
| locked 30 days or more | −15 |
| locked less | −25 |
How the templates score
| Template | Grade | Why |
|---|---|---|
| Anti-Bot | A (100) | Bot Tax only, gone within the hour. No fees after Shield. |
| Steady Climb | B (80) | Sell fee of 5% after Shield (−15) that eases below 2% within 7 days (−5). |
| Diamond Hands | B (80) | Sell fee up to 4% at a short streak (−15), 2% or less from 7 days (−5). |
| Fair Launch | A (100) | No fees at all, just a 10-minute wallet cap. |
Check it on-chain
gradeOf(token) on the Rulebook recomputes any launched token's grade from its sealed rules. The Launcher also records the grade in its Launched event, and the token stores it as grade().
// With the client and CAST addresses from "Reading token state"
const rulebookAbi = parseAbi(["function gradeOf(address token) view returns (uint8 grade, uint256 score)"]);
const [grade, score] = await client.readContract({
address: CAST.rulebook,
abi: rulebookAbi,
functionName: "gradeOf",
args: [token],
});
// grade: 0 = A, 1 = B, 2 = C, 3 = D, 4 = F