Docs
How the fees are routed, harvested and paid, what protects stakers and what can go wrong.
What Tithe is
pons.family pays a token's creator part of every trade: 2% of each curve trade as creator tax plus 70% of the 1% trading fee (pons keeps the other 30%). After a token graduates to Uniswap v4, pons keeps paying the creator from its hook. Tithe lets a creator send that payout to a vault, where holders who stake the token earn it in ETH.
Routing a token's fees
Only the token's current pons fee recipient can open its vault with TitheFactory.create(token, poolId, creatorPayout, creatorBps). Then it calls pons' transferCreatorFeeRecipient(token, vault), which takes effect immediately. The app does both.
The vault has no function that hands the recipient role back, so the routing is permanent. The creator's share (0 to 50%) and payout address are fixed when the vault opens.
Harvesting and streaming
Anyone can call harvest(). It asks pons to sweep the token's pending fees (curve, or the v4 pool after graduation), claims the vault's balance from pons' FeeEscrow, and splits the new ETH. pons also sweeps on its own schedule; harvest takes whatever has arrived.
The stakers' part streams evenly over the next 7 days, added to whatever is left of the current stream. A stake made just before a harvest earns only its share of the time it is staked. If nobody is staking, income waits in the vault and starts streaming with the first stake; if the last staker leaves mid-stream, the rest waits the same way.
income = vault ETH balance - liability - queued - creatorOwed creator = income * creatorBps / 10000 (0 to 5000, fixed at open) protocol = income * protocolBps / 10000 (500 now, 1000 max) stakers = income - creator - protocol (streamed over 7 days) rewardRate = (stakers + leftover of the running stream) / 7 days earned(you) = staked(you) * (rewardPerToken - paid(you)) + rewards(you)
Staking and claiming
stake(amount) and withdraw(amount) any time, no lock. getReward() pays your earned ETH; exit() does both. The creator collects its share with claimCreator(); it is held in the vault, not pushed, so a creator address that rejects ETH can never block harvests.
Safeguards and risks
- The factory owner can set the protocol fee (cap 10%) and the treasury. It has no function that moves stakes, rewards or the fee routing.
- ReentrancyGuard on every function that moves value; SafeERC20 for token transfers; a token that takes a fee on transfer is booked by what actually arrived.
- Unaudited. Unit tests over every path, a fuzz test for conservation, and a fork test on Robinhood Chain mainnet that routes a real pons token's fees into a vault, trades, harvests and pays a staker.
- Income depends on trading volume and on pons.family's contracts and sweeps. If pons changes how it pays creators, vault income can stop.
- Staked tokens keep their market risk. Fees do not protect the price.
Contracts
Robinhood Chain mainnet, chain id 4663. Unaudited.