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.

Chain 4663 Β· Robinhood Chain Solidity 0.8.26 Β· Foundry 179 tests, 0 admin sweep functions
Protocol

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.

Protocol

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.

WindowBuySell
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 capTeamHolder pool
Up to $200k0%4.00%
$200k – $500k0.75%3.25%
$500k – $2M0.40%3.60%
Above $2M0.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.
Nothing here is admin-adjustable

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.

Protocol

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:

  1. Creates the CLAY/USDG Uniswap V2 pair.
  2. Sends the launch liquidity (both CLAY and USDG) directly to the pair, then calls mint() β€” the standard V2 sequence, no positions or NFTs involved.
  3. Calls KilnToken.launch(), which flips tradingEnabled permanently and snapshots the anti-snipe caps and tier oracle in the same transaction.
  4. Routes every CLAY token and USDG unit that didn't go into the pool β€” the non-pooled launch endowment β€” to the Treasury.
Protocol

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
Buyback60%Parked as $CLAY, reserved for NFT buybacks (execution is Phase 3 β€” see Roadmap)
Yield30%Swapped CLAY→USDG on the Treasury's own pair, deposited into a Morpho ERC-4626 vault
Burn10%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.

Protocol

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

  1. Governance proposes a new root via the Timelock (48h delay) β€” the snapshot data is public the entire time.
  2. Once executed, a further 24-hour on-chain disclosure window must pass.
  3. 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:

  1. 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.
  2. 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.

Protocol

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

LayerExamples
Never changeable, by anyoneTotal fee cap, token supply, non-confiscation guarantees, once-set anti-snipe parameters
Add-only, Timelock-gatedNew taxed pair mappings, activating/deactivating a module, raising a module's sale quota, migrating the Morpho vault
Never, not even behind the SafeSweeping 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.

Protocol

Risk disclosures

Written plainly, not buried β€” these are accepted, documented trade-offs, not hidden gaps.

Keeper dependency for the swap oracle

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.

Redemption randomness is block-based, not a VRF

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.

Governance Safe is currently 1-of-1

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.

Reflexivity

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.

Protocol

Roadmap

PhaseScopeStatus
Phase 1Token, pair registry, governance wiringDeployed
Phase 2Treasury, yield, redemption, module registryDeployed
Phase 3Real Seaport buyback executor β€” automates what attestAcquisition currently bridges manuallyNot started
Integration

Network

ChainRobinhood Chain
Chain ID4663
Gas tokenNative ETH
RPChttps://rpc.mainnet.chain.robinhood.com
Explorerrobinhoodchain.blockscout.com
Quote assetUSDG β€” 0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168 (6 decimals)
Integration

Contracts

Live as of this writing β€” trading opens once KilnLauncher.execute() runs (see Launch mechanism above).

ContractAddressStatus
Governance Safe0x7dA22b6EF965d6d18f70d81946045D8092F2F875Live
TimelockController0x7838ae03565b063d28c8c345f99374E98db2143ELive
KilnPairRegistry0xF2E22627A2850596Dc11ba1f7B3be1cCbA249f2BLive
KilnModuleRegistry0xf5Afb3Ff6237793a67e98f707968B9C0afDd3c04Live
KilnTreasury0x012664d3735D7E7986EB51596d9C56DB969D1263Live
KilnToken0x32084801D00A683227315187F03F89D123b75F71Deployed, trading not yet live
KilnLauncher0x0c32b0159EA1B347F57959802A804dAe48dC0f56Live
Clay StonKz (CLAYZ)0xdE0ACefC89d4Cf5f4Ce45A4FB8A51Aa355091b44Pre-existing collection
Morpho vault (yield)0xBeEff033F34C046626B8D0A041844C5d1A5409ddSteakhouse USDG
Integration

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)
Integration

Events

EventEmitted byMeaning
LaunchedKilnTokenTrading flipped on β€” one-time, irreversible
SyncedKilnTreasuryA new fee delta was split 60/30/10
YieldProcessedKilnTreasuryCLAY→USDG swap executed, USDG deposited into Morpho
MorphoVaultMigratedKilnTreasuryYield position moved to a new vault (48h-timelocked)
RootProposed / RootActivatedKilnTreasuryA new epoch's claim/redemption root entered its disclosure window, then went live
RedemptionRequestedKilnTreasuryA holder committed to an NFT redemption β€” settles one block later
Integration

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.