Platform › Rewards › LP rewards

Rewards

LP rewards

Daily THD for THD/ETH liquidity providers once the whole supply has unlocked: one pool of bucket and recycled sell-fee THD, a halving budget scaled by the public in-range share, and a cumulative root.

Version
1.0
Updated
2026-10-14
Source
THD contract sources · THD contracts — design reference, parts 1 and 2 · THD — Full Plan v3.45

ThdLpRewards pays THD every day to liquidity providers in the THD/ETH pool, on top of the swap fees their own positions earn. It holds one balance, pays it out on a halving schedule, and pays against a cumulative Merkle root.

Status#

On Robinhood Chain mainnet
ItemStatus
ThdLpRewards — the LP providers bucket’s beneficiaryDeployed
Daily roundsNot startedStart once the whole supply has unlocked
ClaimsNot openOpen 24 hours after THD's pool is seeded

Where the THD comes from#

One balance, two sources
SourceAmountArrives
LP providers bucket (bucket 4)1,000 bps of supply — 100,000,000 THD10% of every unlock, by THDEmissionControl.claim(4), while the fee meter runs
Recycled sell-fee THDThe THD leg of the platform’s locked position’s feesOnly while the monthly holder vote sets recycle, when ThdFeeRouter flushes it

The contract does not tell the two apart. Recycled THD lengthens the same schedule; it does not start a second one. There is no quest split on this allocation.

The daily round#

code
Remaining = THD held − (totalPromised − totalClaimed)          // ThdLpRewards.remaining()
Budget    = Remaining × (1 − 0.5^(elapsed ÷ 104 weeks))           // elapsed = exact seconds since the last round
Emitted   = Budget × min(1, s_t ÷ 50%)
LP i      = Emitted × (LP i's weight ÷ all public weight)          // named providers only
Terms
TermValue
CadenceOne round per UTC day, closed at the first run past midnight
Half-lifeHALF_LIFE = 104 weeks. At full emission, Remaining halves every 104 weeks
s_tPublic in-range liquidity-seconds ÷ all in-range liquidity-seconds in the pool that round
Target50%. Below it the emission scales down linearly
Not emittedStays in Remaining for later rounds. Never burned
StartsAfter 100% unlock (THDEmissionControl.isComplete()). Before it the bucket’s THD accrues here and no round runs

As the platform’s own liquidity grows, s_t falls and so does the daily emission: the reward rents outside depth only while it is needed.

Who is paid, and by what weight#

Weight is liquidity × time in range, from the pool’s own events. A position out of range accrues nothing. A round counts only what accrued since the previous round’s cutoff.

Positions
PositionIn s_t’s denominatorIn s_t’s numeratorPaid
The platform’s own (ThdLiquidityManager)YesNoNo
A provider on the platform exclusion listYesNoNo
A public position with a named providerYesYesYes, by weight
A public position whose provider the index cannot nameYesYesNo — its share stays in Remaining

Roots, the publisher and the veto#

Each round adds to every provider’s lifetime total. The root commits to keccak256(abi.encode(account, cumulative)) leaves and is published with totalPromised, the sum of its leaves.

Publishing
PublisherBoundActive afterVeto
publisher() — appointed by the owner Safe; publishes every dayMay only raise totalPromised, by at most publisherAllowance(): an on-chain upper bound on one elapsed period’s budgetPUBLISHER_ROOT_DELAY, 12 hoursOwner Safe or guardian Safe
Owner SafeNot bound by the allowanceOWNER_ROOT_DELAY, 48 hoursGuardian Safe only
Checks on every publication
CheckRefusal
Total below what has been paidPromiseBelowPaid
Unpaid part above the THD heldPromiseExceedsHeld
Publisher lowering the totalPublisherCannotLowerPromise
Publisher rise above the allowancePublisherRiseExceedsAllowance
Publisher staging over an immature rootPendingRootNotMatured

Claiming#

ThdLpRewards.claim(account, cumulative, proof)
RuleValueRefusal
Payscumulative − claimedOf[account], always to account. Anyone may submit itNothingToClaim
OpensseededAt + TGE_CLIFF, 24 hours after THD’s pool is seededClaimsNotOpen
Claim gatePassed once on ClaimGateAttestor — see THD claimsClaimGateNotPassed
Root went backwardsA lower figure can never claw back what was paidCumulativeWentBackwards
Stated totalLifetime payments never exceed the active root’s totalPromisedPromiseExceeded
Missed daysNever lost: the newest root carries every earlier round—
VestNone—
DeadlineNone. Nothing here expires or burns, and no owner path moves THD out—