Goon Power
Goon Power is the weight by which an epoch's emission is divided. This page defines the scoring function exactly. It is integer arithmetic, so anyone recomputing it gets the same answer.
The scoring function#
RawGP = min(SessionGP, cap_session)
+ min(ChallengeGP, cap_challenge)
+ min(ContributionGP, cap_contribution)
+ min(IntegrationGP, cap_integration)
Diminished = RawGP if RawGP <= knee
= knee + (RawGP - knee) * aboveKneeRate otherwise
AdjustedGP = floor( floor(Diminished * (1 + streakBonus)) * trust )
FinalGP = min(globalCap, AdjustedGP)All quantities are integer milli-GP (1 GP = 1000). Multiplications by a rate are done in basis points with floor division, in the order shown. The reference implementation is computeDayScore in packages/shared/src/scoring.ts; the API and this site both call it.
Caps#
| Source | Cap per epoch | How it is earned |
|---|---|---|
| A · Goon Sessions | 45 GP | Eligible active time, on the session curve |
| B · Contributions | 40 GP | Reviewer score on approval |
| C · Daily challenges | 30 GP | 3 challenges × 10 GP |
| D · Integration proofs | 30 GP | Whole GP signed by an allowlisted issuer |
| Global cap | 100 GP | Applied last, after streak and trust |
API unreachable · showing compiled-in defaults
With every source maxed, raw GP is 145. The knee turns that into 102.5, the largest streak bonus lifts it to 112.75, and the global cap brings it back to 100. No wallet can exceed 100 GP in an epoch by any route.
Streaks#
An epoch is eligible when raw GP reaches the eligibility minimum. A streak is the count of consecutive eligible epochs ending with the current one. The bonus applies only on eligible epochs, takes the highest tier reached, and is recomputed from stored history, so it is deterministic.
| Consecutive eligible epochs | Bonus |
|---|---|
| fewer than 3 | none |
| 3+ | +2% |
| 7+ | +5% |
| 14+ | +8% |
| 30+ | +10% |
An epoch is eligible at 5 raw GP or more
Trust#
Trust is a multiplier between 0 and 1 applied before the global cap.
| Situation | Trust | Applied when |
|---|---|---|
| Default | 1.00 | Always, unless one of the rows below applies. |
| Excluded wallet | 0.00 | An admin excluded the wallet. Affects every epoch not yet settled. |
| Network cluster of n wallets, n > free | free / n | At settlement, when more wallets than the free allowance mined behind one network fingerprint. |
The fingerprint is a salted hash of the IP address used for sessions; raw addresses are never stored. The rule means a room of ten wallets on one connection earns what three would. It also means real people sharing a network beyond the allowance are diluted, which is a known cost of the rule.
Other parameters#
| Parameter | Value |
|---|---|
| Network GP floor (minimum denominator) | 10,000 GP |
| Most one GP can be worth in era 1 | ≈ 119.05 GOON |
| Backlog release | 1 / 210 of undistributed emission per epoch |
| Provisional GP carried into epoch 0 | 100% |
| Diminishing returns | raw GP above 60 counts at 50% |
| Cluster rule | more than 3 wallets on one network fingerprint share 3 wallets' GP |
Worked examples#
A casual epoch
30 minutes of eligible session time -> 25 GP 3 daily challenges -> 30 GP RawGP = 55 (below the knee, unchanged) streak day 1, trust 1.00 FinalGP = 55.0
A heavy epoch on a 14-epoch streak
2 hours of session time -> 45 GP (session cap) 3 daily challenges -> 30 GP 1 approved bug report scored 40 -> 40 GP (contribution cap) RawGP = 115 Diminished = 60 + (115 - 60) * 0.5 = 87.5 x 1.08 streak = 94.5 FinalGP = 94.5
Six wallets on one connection
each wallet: RawGP 15, trust = 3 / 6 = 0.50 each FinalGP = 7.5 six wallets together = 45 GP = three honest wallets
Changing parameters#
- Caps, tiers, the knee, streak tiers and the cluster allowance are balancing parameters held by the API. The active set is published at
GET /v1/protocolwith a version number, and that version is written into every distribution file. - They are not protocol constants and can be retuned between epochs. A change never affects an epoch that has already settled.
- The emission schedule and the reserve are different: those are fixed in the program at activation and cannot be changed by anyone.