Kiln ($CLAY) Documentation
A fee-on-transfer token on Robinhood Chain whose trading fee funds an on-chain Treasury that buys back, holds, and redeems Clay StonKz (CLAYZ) NFTs β with a real yield leg and a permanent burn, and no admin key that can ever move the money.
Overview
Clay StonKz (CLAYZ) is an existing 6,969-supply ERC-721 collection on Robinhood Chain. Kiln ($CLAY) is a new token built to give that collection an on-chain revenue engine: every taxed trade of $CLAY feeds a Treasury that buys CLAYZ NFTs off the floor, holds them, generates yield on its idle stablecoin, and permanently burns a slice of supply β all without any wallet ever being able to sweep the money out.
The system is three contracts deep, each with a narrow job:
KilnToken β fixed-supply ERC-20, fee-on-transfer, no owner, ever
KilnLauncher β one-shot: seeds the Uniswap V2 pool, flips trading on
KilnTreasury β receives the fee, splits it 60/30/10, holds NFTs, runs redemption
Everything that can move funds is either fully permissionless (anyone can trigger the accounting) or gated behind a 48-hour Timelock controlled by a Gnosis Safe β never behind a single key that can act instantly.
Tokenomics
Fixed supply of 1,000,000,000 $CLAY, minted once, forever. There is no mint()
function anywhere in the contract β supply can only ever go down, via the Treasury's burn leg.
Trading fee
The fee applies only to trades against a registered AMM pair β never to a plain wallet-to-wallet transfer, staking, or moving tokens into the Treasury itself.
| Window | Buy | Sell |
|---|---|---|
| First 30 days (bootstrap) | 1.0% | 2.0% |
| Steady state (from day 30) | 3.0% | 5.0% |
Where the sell-side fee goes, by market-cap tier
The team's share (TEAM_WALLET, immutable) shrinks as the project succeeds β the
freed-up share always flows straight to the holder pool. Tiers are reversible in both directions, driven
by a rolling 30-day average market cap (not spot price) with a 30-day minimum dwell per tier, so a short
spike or dip can't flip the tier back and forth.
| Sustained market cap | Team | Holder pool |
|---|---|---|
| Up to $200k | 0% | 4.00% |
| $200k β $500k | 0.75% | 3.25% |
| $500k β $2M | 0.40% | 3.60% |
| Above $2M | 0.20% | 3.80% |
Below $200k, every basis point of the sell-side rebate goes straight to holders β the team takes nothing until the project is genuinely established. LP always keeps 0.6% (buy) / 1.0% (sell), unaffected by tier.
KilnToken also has a second, immutable wallet slot (BRRRBON_WALLET) in its
constructor, permanently unset (address(0)) β Solidity immutables can never be changed after
deployment, so it stays unset forever. Its tier percentage is already folded into the holder-pool numbers
above.
Anti-snipe protections
- Atomic launch β the pool is seeded and trading enabled in a single transaction; there is no window between "pool exists" and "trading is on."
- 48-hour anti-snipe window β wallet caps apply relative to the pool's own reserve at launch (5% max wallet, 5.5% max buy), not the total supply.
- 30-block buy β sell cooldown β blocks same-block or near-instant flip-and-dump bot patterns.
- Add-only pair registry β if a rival pool for CLAY/USDG ever appears to route around the fee, the Timelock can add it to the taxed-pair set. It can never remove or repoint an existing pair, only add new ones.
There is no setFee, no mint, no blacklist, no fee-exemption setter, no pause, no transferOwnership on the token contract. These selectors simply don't exist β enforced by a dedicated test suite, not just a promise.
Launch mechanism
$CLAY trades on a Uniswap V2 pool (CLAY/USDG) β deliberately not V3. $CLAY is a fee-on-transfer token: V3's strict post-swap balance check would revert every sell routed through a standard router (MetaMask, 1inch, Dexscreener), since the pool always receives less than it expects once the fee is taken. V2 computes the output from the actual balance delta after transfer, which is exactly the pattern fee-on-transfer tokens need β and the same pattern NET (the other FOT token on this chain) already uses in production.
A V4 hook-based fee (as PRINTER and INDEX use on this chain) was considered and rejected: the fee would live on one specific pool, and a rival pool without the same hook would bypass it entirely. A token-level fee plus an add-only pair registry closes that gap regardless of which pool a trade routes through.
KilnLauncher.execute() is a one-shot, atomic operation, callable only by the fixed deployer address:
- Creates the CLAY/USDG Uniswap V2 pair.
- Sends the launch liquidity (both CLAY and USDG) directly to the pair, then calls
mint()β the standard V2 sequence, no positions or NFTs involved. - Calls
KilnToken.launch(), which flipstradingEnabledpermanently and snapshots the anti-snipe caps and tier oracle in the same transaction. - Routes every CLAY token and USDG unit that didn't go into the pool β the non-pooled launch endowment β to the Treasury.
Treasury
Every taxed trade sends its fee share to KilnTreasury as plain $CLAY. Anyone can call
sync() to recognize a new balance delta and split it:
| Share | % | What happens to it |
|---|---|---|
| Buyback | 60% | Parked as $CLAY, reserved for NFT buybacks (execution is Phase 3 β see Roadmap) |
| Yield | 30% | Swapped CLAYβUSDG on the Treasury's own pair, deposited into a Morpho ERC-4626 vault |
| Burn | 10% | Sent directly to the dead address in the same transaction β no market step needed |
The one-time launch endowment (the non-pooled majority of supply, sent to the Treasury at launch) is
explicitly excluded from this split via a one-shot setEndowmentBaseline() call β it's capital,
not revenue, and never gets counted, burned, or swapped as if it were trading fees.
Yield leg β swap safety
processYieldLeg is permissionless, so a caller-supplied minimum-output alone isn't real slippage
protection (the same actor could manipulate the pool, then call with a minimum of zero). Instead, the
Treasury keeps its own TWAP checkpoint (TreasurySwapOracle, refreshed via permissionless
pokeSwapOracle(), valid only once at least 1 hour old) and requires the current spot price to sit
within Β±3% of it before any swap β checked against the pre-trade spot price, not the trade's
own output, so a large honest swap's own price impact never triggers a false reject.
The resulting USDG deposits into the Steakhouse USDG vault on Morpho β the same vault behind Robinhood Earn itself. Reported backing applies a flat 2% haircut to the Morpho-reported value only, never to the real, redeemable balance.
NFT custody & the module registry ("Kanal 2")
NFTs the Treasury acquires sit in a FIFO maturity queue for 45 days before becoming eligible
for redemption or module sale. A separate KilnModuleRegistry is the only path for a future
resale mechanism (e.g. a Seaport-based buyback executor) to pull NFTs out β add-only, Timelock-gated, and every
module starts with a sale quota of zero until governance explicitly raises it, capped at 20%
of the current eligible pool per 7-day window.
Vault migration β the one designed escape hatch
If the Morpho vault is ever deprecated or a better one appears, migrateMorphoVault(newVault) β
timelock-only, 48h delay β redeems the full position and redeposits it into a new vault. It's checked to share
the same USDG asset, but funds can only ever move between two ERC-4626 vaults, never to an arbitrary address.
The 48-hour public window before execution is the real safeguard: the destination is visible on-chain long
before anything happens.
Redemption
Holders can claim USDG dividends and, separately, redeem a random NFT from the Treasury's eligible pool β both gated by the same per-epoch Merkle root, so neither channel can double-spend against the other.
Epoch roots β proposal, then disclosure, then activation
- Governance proposes a new root via the Timelock (48h delay) β the snapshot data is public the entire time.
- Once executed, a further 24-hour on-chain disclosure window must pass.
- Anyone can then call the permissionless
activateRoot()β enforcing "data published, then root live," independent of how governance times its own announcements.
Unclaimed balances never expire β there is no forfeiture rule, ever.
NFT redemption β a deliberate two-step commit/settle
A single-transaction "simulate, only send if favorable" design would let a holder cherry-pick which NFT they get. Instead:
- Request: verify the Merkle proof, deduct the redemption price immediately (7-day rolling price anchor, β5%) β backing out costs the holder something, discouraging trial-and-error.
- Settle: callable by anyone, one block later β pulls a pseudo-random index (future blockhash +
prevrandao) over the mature pool, swap-and-pop, transfers the NFT.
Accepted, documented limitation: block-based pseudo-randomness is marginally influenceable by whoever proposes that block. For a low-value, largely fungible pick over a shared pool, this is treated as sufficient β a full VRF integration wasn't judged worth the added complexity.
Governance & security
KilnToken (ERC-20, never has an owner)
β reads pair-tax status from ββΆ KilnPairRegistry (add-only)
β reads price from ββΆ Uniswap V2 pair (CLAY/USDG, oracle only)
β fee shares routed to: LP / Team / Brrrbon / Treasury (all immutable)
KilnPairRegistry, KilnModuleRegistry, KilnTreasury
β owner =
βΌ
TimelockController (48h delay)
β controlled by
βΌ
Gnosis Safe (external, multisig)
What governance can and can't touch
| Layer | Examples |
|---|---|
| Never changeable, by anyone | Total fee cap, token supply, non-confiscation guarantees, once-set anti-snipe parameters |
| Add-only, Timelock-gated | New taxed pair mappings, activating/deactivating a module, raising a module's sale quota, migrating the Morpho vault |
| Never, not even behind the Safe | Sweeping treasury funds, exempting a wallet from tax or caps, transferring an NFT to an arbitrary address |
Guardian β fast to freeze, never to move
A separate, fast-acting Guardian address can pause the Treasury unilaterally. Only the Timelock can unpause. A compromised Guardian key can, at most, freeze the system temporarily β never redirect funds, never touch an NFT.
Independent verification
179 tests (unit + invariant fuzzing, 256 runs Γ 100 depth per invariant). Reviewed with two independent static analyzers (Slither, Aderyn) β no reentrancy with fund loss, no arbitrary-address fund path, no missing access control found. One genuinely dead error declaration removed as a result.
Risk disclosures
Written plainly, not buried β these are accepted, documented trade-offs, not hidden gaps.
If pokeSwapOracle() goes uncalled for an extended period and the price has organically moved by more than 3% in that time, processYieldLeg will revert until someone pokes the oracle and waits out the 1-hour freshness window again. Yield swaps pause; nothing is lost.
Pseudo-random via future blockhash + prevrandao. Marginally influenceable by a block proposer. Judged acceptable for a low-value pick over a largely fungible NFT pool.
The Timelock's proposer/executor is a single-signer Safe today. Every action still passes through the 48-hour public delay regardless, but the signing key itself is a single point of failure until more owners are added.
Buyback demand can attract speculation that runs ahead of real trading volume. The yield leg (real USDG interest, not tied to NFT price speculation) is the intended non-reflexive anchor, not the buyback itself.
Roadmap
| Phase | Scope | Status |
|---|---|---|
| Phase 1 | Token, pair registry, governance wiring | Deployed |
| Phase 2 | Treasury, yield, redemption, module registry | Deployed |
| Phase 3 | Real Seaport buyback executor β automates what attestAcquisition currently bridges manually | Not started |
Network
| Chain | Robinhood Chain |
| Chain ID | 4663 |
| Gas token | Native ETH |
| RPC | https://rpc.mainnet.chain.robinhood.com |
| Explorer | robinhoodchain.blockscout.com |
| Quote asset | USDG β 0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168 (6 decimals) |
Contracts
Live as of this writing β trading opens once KilnLauncher.execute() runs (see Launch mechanism above).
| Contract | Address | Status |
|---|---|---|
| Governance Safe | 0x7dA22b6EF965d6d18f70d81946045D8092F2F875 | Live |
| TimelockController | 0x7838ae03565b063d28c8c345f99374E98db2143E | Live |
| KilnPairRegistry | 0xF2E22627A2850596Dc11ba1f7B3be1cCbA249f2B | Live |
| KilnModuleRegistry | 0xf5Afb3Ff6237793a67e98f707968B9C0afDd3c04 | Live |
| KilnTreasury | 0x012664d3735D7E7986EB51596d9C56DB969D1263 | Live |
| KilnToken | 0x32084801D00A683227315187F03F89D123b75F71 | Deployed, trading not yet live |
| KilnLauncher | 0x0c32b0159EA1B347F57959802A804dAe48dC0f56 | Live |
| Clay StonKz (CLAYZ) | 0xdE0ACefC89d4Cf5f4Ce45A4FB8A51Aa355091b44 | Pre-existing collection |
| Morpho vault (yield) | 0xBeEff033F34C046626B8D0A041844C5d1A5409dd | Steakhouse USDG |
Reading on-chain state
Key view functions for building a dashboard or bot against Kiln:
// KilnToken
tradingEnabled() external view returns (bool)
launchPair() external view returns (address)
feeBreakdown(bool isBuy) external view returns (...) // current tier-adjusted split
antiSnipeActive() external view returns (bool)
// KilnTreasury
backingValueUsdg() external view returns (uint256) // haircut-adjusted USDG backing
pendingYieldClay() external view returns (uint256)
purchasePriceAnchor() external view returns (uint256) // 7-day rolling NFT price anchor
eligiblePoolLength() external view returns (uint256)
paused() external view returns (bool)
// KilnModuleRegistry
isActiveModule(address module) external view returns (bool)
Events
| Event | Emitted by | Meaning |
|---|---|---|
| Launched | KilnToken | Trading flipped on β one-time, irreversible |
| Synced | KilnTreasury | A new fee delta was split 60/30/10 |
| YieldProcessed | KilnTreasury | CLAYβUSDG swap executed, USDG deposited into Morpho |
| MorphoVaultMigrated | KilnTreasury | Yield position moved to a new vault (48h-timelocked) |
| RootProposed / RootActivated | KilnTreasury | A new epoch's claim/redemption root entered its disclosure window, then went live |
| RedemptionRequested | KilnTreasury | A holder committed to an NFT redemption β settles one block later |
Terms & attribution
Kiln is independent, unaffiliated software built for the Clay StonKz community. Nothing here is financial advice. Contract addresses and parameters on this page reflect the deployed state as of the date this page was last published β always verify against the explorer before relying on any address.
Built with Foundry, OpenZeppelin, and a Uniswap V2-pattern pool on Robinhood Chain.