Rewards
THD claims
Who may claim THD, when claiming opens, the 90-day vest, the 360-day deadline, and what happens to THD nobody claims.
Every THD reward ends as a claim. A person’s THD claim needs a passed claim gate, opens 24 hours after THD’s pool is seeded, vests over 90 days, and closes after 360. THD allocated and never claimed is burned with burn(), and the supply re-read proves it.
Status#
| Item | Status |
|---|---|
ClaimGateAttestor | Deployed |
THDMerkleDistributor × 4 (traders, creators, KOLs/referrers, settlers) · ThdRewardVest · ThdDayVest × 2 (battlepass, settlers) | Deployed |
| Claiming | Not openTHD's pool is not seeded (pre-TGE) |
Before TGE, rewards accrue and are shown; nothing a person can claim in THD is payable yet.
The claim gate#
passes = xConnected && ( earnedWei >= minEarnedWei || spentWei >= minSpentWei )| Item | Value |
|---|---|
minEarnedWei | 0.1 ETH lifetime earned — constructor immutable, from money.thdClaimGateMinEarnedWei |
minSpentWei | 0.01 ETH lifetime spent — from money.thdClaimGateMinSpentWei |
| X | An X account connected to the platform account. Required, not optional |
| How a pass is recorded | The app measures the figures to a mined block, the attestor key signs them (EIP-712, valid at most MAX_TTL, one hour), and anyone may submit pass(account, proof). The contract re-checks the rule against the signed figures |
| Permanence | A pass is permanent: passedAt(account) is never cleared |
| Re-derivable | ClaimGatePassed carries the earned and spent figures, both bars and the block they were measured to |
| Side | Legs |
|---|---|
| Earned | Referral credits · KOL allocations · creator fee shares · founding-crew credits — curve income only |
| Spent | Net curve buying per launch · prediction stakes · launch- and market-creation fees · promoted slots · item-mall and milestone-package purchases in ETH |
| Unpriced amounts | Excluded, never valued at face |
| Claim | Gated |
|---|---|
THDMerkleDistributor.claim — traders, creators, KOLs/referrers, settlers | Yes |
ThdRewardVest.claim — Fortune Wheel THD and accepted THD quest rewards | Yes |
Battlepass / ThdDayVest | Yes |
SeasonRewardsPool — THD half | Yes. The ETH and other-currency halves are not gated |
BandRewardsDistributor.claim | Yes |
ThdLpRewards.claim | Yes |
| Funding, crediting, sweeps and every burn | No — they pay contracts or burn, never a person |
An account that has not passed keeps its entitlement; the claim reverts ClaimGateNotPassed and can be retried once it passes. No address is exempt.
When claiming opens#
| Item | Value |
|---|---|
| TGE | ThdLiquidityManager.seededAt() — the moment THD’s pool is seeded |
| Claims open | seededAt + TGE_CLIFF (24 hours) — the same constant on every claim contract |
| Before it | ClaimingBlockedUntilTge · TgeCliffHasNotElapsed · ClaimsNotOpen |
Vesting and deadlines#
Production figures: time.thdRewardVestingSeconds = 7,776,000 (90 days) and time.thdMerkleClaimWindowSeconds = 31,104,000 (360 days). Both are constructor immutables.
| THD from | Vest | Deadline |
|---|---|---|
| Traders, creators, KOLs/referrers, settlers (pre-TGE leaves) | Linear over 90 days from seededAt + 24h. A claim pays what has vested; the rest is reserved and credited to the vest | seededAt + 24h + 360 days (burnDeadline()) |
Fortune Wheel THD and accepted quest THD — ThdRewardVest | One window, seededAt + 24h to +90 days. Credited before it: the whole window. Inside it: the days left. After it: claimable at once | Credited before the window: seededAt + 24h + 360 days. Later: 360 days after the end of the UTC month it was credited in |
Battlepass — ThdDayVest | Linear over 90 days from the UTC day each part was earned (pre-TGE parts: from TGE + 24h) | From the pass: season end + 30 days (75% paid, 25% burned after the season ends). In the vest: 360 days from the earned day |
Settlers after TGE — ThdDayVest | 90 days from the month’s close | 360 days from the month’s close |
Season THD pot — SeasonRewardsPool | Linear over 90 days from the season’s first publication (publishedAt) | publishedAt + 360 days |
Bands — BandRewardsDistributor | Linear over 90 days from the month’s first publication | publishedAt + 360 days |
LP rewards — ThdLpRewards | None | None |
| Season ETH and per-currency pots | None | None |
THD released to someone after a distributor’s first claim — a graduation after claims open — arrives through that distributor’s late-credit channel and runs on ThdRewardVest’s monthly clock; the settlers’ late credits run on ThdDayVest.
What nobody claims#
| Call | Burns | From |
|---|---|---|
THDMerkleDistributor.burnUnclaimed() | The distributor’s unreserved balance. Runs once, then claim is closed | burnDeadline(), after the never-graduated sweep or 30 days past the deadline |
ThdRewardVest.burnExpired(accounts) | Each credit past its deadline | The credit’s deadline |
ThdDayVest.burnExpired(account, days) | Each day’s credit past its deadline | start + claimWindow |
Battlepass.burnExpired(season) | The season’s residue after the back-claim | claimDeadline(season) |
SeasonRewardsPool.burnExpiredThd(season) | thdAllocated − thdClaimed | publishedAt + claimWindow |
BandRewardsDistributor.burnExpired(month) | The month’s allocated, unclaimed THD | claimDeadlineOf(month) |
Every one is permissionless, has no destination and no amount to choose, and reverts BurnDidNotReduceSupply unless totalSupply() fell by exactly the amount. Allocated THD that was never claimed is burned; THD that was never allocated rolls forward or goes to Spoils. LP THD never burns.
Projects that never graduate#
The traders’ and creators’ THD is held per launch until it graduates, or per market until it settles with both pools non-empty. A launch not graduated by the distributor’s burnDeadline() never releases it.
| Step | What happens |
|---|---|
sweepUngraduatedToSpoils | Permissionless. Moves the held THD for never-graduated projects to the immutable spoilsSink. Cumulative; a replay reverts. Refused before burnDeadline() |
| Bound | Never touches a frozen claim leaf (proved by a claim-total leaf) or a posted late credit, lateReserved |
burnUnclaimed | Waits for that sweep, or UNGRADUATED_SWEEP_WINDOW (30 days), then burns what was credited and never claimed |