Version v0.1 / Baa / Baa / 210,000,000,000 supply
Baa protocol whitepaper
Thesis
Baa is a fixed-supply Uniswap v4 hook meme protocol. The core loop is simple: trade the canonical Baa/ETH pool, use a reserve-backed launch curve for the first 40%, build a last-minter jackpot, and mine the 60% reward pool through real v4 liquidity.
Human Version
- You mint Baa with ETH. The more ETH comes in, the more expensive new Baa gets.
- You can sell Baa back to the mint contract, sell into the v4 pool, or sell anywhere else with liquidity. Sells do not become the prize wallet.
- The latest mint of at least 0.015 ETH is the current prize wallet. If 300 blocks pass with no newer eligible mint, anyone can call the prize button. The winner receives 40% of the prize pool.
- BaaBaa is a fee-funded draw, not an NFT sale. Fees first build a draw fund. Once the fund has 0.05 ETH, eligible mints get tickets. After 20 blocks, anyone can settle the draw with gas only. The contract burns Baa and awards one BaaBaa to a ticket wallet.
- Only 777 BaaBaa can ever be awarded. After that, the draw fund keeps buying and burning Baa, but no more BaaBaa are awarded.
- Baa/BTC is not a background bot. Fees first build a Baa/BTC fund. Once the fund has 0.1 ETH, anyone can call one transaction that buys Baa, buys Ethereum-mainnet WBTC, and locks both as Baa/WBTC liquidity.
- BaaBaa and Baa/BTC settlement buttons do not ask the clicker to fund the feature. The ETH already sits inside those contracts; the clicker only pays gas to settle the next chunk. There is no dev-only trigger and no off-chain backend.
- If the website disappears, the same actions can be called from a block explorer.
Supply
| Bucket | Amount | Share |
|---|---|---|
| Launch curve | 84,000,000,000 Baa | 40% |
| LP mining | 126,000,000,000 Baa | 60% |
| Dev allocation | 0 Baa | 0% |
The full supply is minted once at deployment. There is no owner mint, no pause, no blacklist, and no upgrade path.
Mainnet Contracts
| Contract | Address |
|---|---|
| Baa token (Baa) | 0xE49F1541d1f14Ef593Afb66e3D08A46342C4D232 |
| Launcher | 0x293B2D54482cBB194aE258D4507ad98b26364Eaf |
| V4 Hook | 0x2533dc1b8aD4C34563c99105AeDF2DD4c36405cc |
| Jackpot | 0xb03900b74a814A481BBa5Eae92Ba4e3aaD5b675E |
| BaaBaa Draw | 0x629017f3Dc0612Fc1C98365179deE44908F8EDa9 |
| Baa/BTC Vault | 0x8020188c836467075120B8b2E47228515a79D79D |
| Baa/WBTC Compounder | 0x6d78b42BAac34F3947341C52CD84C1dba8C9741A |
| Mining | 0x8f972e05dee49c362A770Ad5016c5cED48c76FE3 |
| V4 Router | 0x817f1a4bC1f63Ef5E6994b2E1AdD97852A57e6fD |
| Liquidity Manager | 0x69ecABb1F5e6C245D93f27Ee64C4A7e36D7C859e |
| Buyback Router | 0x3db7b3567Fb4125A252125C9DCD04Ea9E4Ca6CAC |
| Uniswap v4 PoolManager | 0x000000000004444c5dc75cB358380D2e3dE08A90 |
Launch Curve
- The launch curve sells the first 84,000,000,000 Baa on a continuous curve.
- Mints lift the marginal price and excess ETH is refunded.
- One curve state drives mint quotes, sell quotes, current price, and sellout.
- Sell-backs are available before and after sellout.
- Before sellout, a curve sell sends 0.7% ETH to protocol sinks, burns 0.2% of Baa input, returns the rest to launch inventory, and moves the same curve state down.
- After sellout, curve minting stays closed forever and every Baa sold back to the curve is burned.
- For the first 50 blocks after the first curve mint, curve mint fees build an automatic full-range v4 LP bucket.
- The startup LP helper uses the live pool price. If the ratio is off, it uses the limiting side, returns unused ETH to curve reserve, and burns unused Baa.
- If startup LP cannot be formed, the ETH is recycled into curve reserve and the Baa bucket burns, so minting does not get stuck.
- If startup LP is formed, the helper owns it with a dead salt and no remove path.
- After that, curve mints use the same 0.9% flow as v4 trades: 0.3% ETH to jackpot, 0.2% ETH to BaaBaa, 0.2% ETH to Baa/BTC, and 0.2% Baa burn.
- The launch bucket is tuned so the normal no-sellout close costs 77 ETH of user input; up to about 76.461 ETH becomes curve reserve depending on startup LP activity.
- After sellout, reserve ETH is not routed into a buyback. It stays in
SheepLauncherand can only pay curve sell-backs.
Mint/Sell Flow
| Flow | Rate | Destination |
|---|---|---|
| Mint | 0.3% of ETH input | Jackpot |
| Sell | 0.3% of ETH output | Jackpot |
| Mint/sell | 0.2% of ETH flow | BaaBaa draw fund |
| Mint/sell | 0.2% of ETH flow | Baa/BTC vault |
| Mint | 0.2% of Baa output | Automatic burn |
| V4 sell | 0.2% of Baa input | Automatic burn |
| Post-sellout curve sell | 100% of Baa input | Automatic burn |
Only mints with at least 0.015 ETH of input update the last minter. Smaller mints and all sells still execute normally. Launch-curve mints and v4 pool mints both compete for the same last-minter slot; whichever effective mint happens later wins. Sells do not update the last minter.
Last-Minter Jackpot
- A mint of at least 0.015 ETH updates the last-minter record.
- The mint can come from the launch curve or from the canonical v4 pool.
- The draw deadline becomes
block.number + 300. - A new effective mint moves the deadline forward.
- There is no fixed hourly payout. The round becomes drawable only after 300 blocks pass without a new effective mint.
- Once the deadline passes, anyone can call
draw(). draw()pays 40% of the current jackpot balance to the last minter and leaves the remaining 60% rolling into future rounds.- Sells add ETH to the jackpot but do not update the last-minter record.
LP Mining
The mining pool contains 126,000,000,000 Baa. Rewards are released by cumulative block accounting. The first reward era lasts 21,600 blocks, then rewards halve every 28,800 blocks. After era 60, the remaining dust continues at 1 wei per block until the fixed reward pool is exhausted.
Users do not need to move LP positions into a separate staking contract. The hook tracks full-range v4 liquidity changes. Non-full-range positions can still trade, but they do not earn Baa mining rewards.
The Baa Liquidity Manager passes the caller explicitly and generates a deterministic salt. Generic EOA-initiated v4 LP adds can also be credited because the hook falls back to the transaction origin when no beneficiary is passed. Smart-wallet or relayed paths should use the manager or pass a beneficiary in hook data, because the hook cannot infer an off-chain intended owner from an arbitrary contract call.
Automatic Burn
Mints burn 0.2% of Baa output. V4 sells and pre-sellout curve sells burn 0.2% of Baa input. Post-sellout curve sells burn all Baa sold back. No keeper, bounty, cron, manual fee button, or nested swap is required.
BaaBaa / Baa-BTC
0.2% of ETH flow funds the 777-piece BaaBaa draw. This is not a personal mint sale and the clicker does not send 0.05 ETH. Once the BaaBaa fund has at least 0.05 ETH, mints of at least 0.015 ETH can receive tickets for the active round. The target block is 20 blocks after the round starts. After that block, anyone can call forge(uint256) to settle the public draw with gas only; the vault spends its own 0.05 ETH buying and burning Baa, then awards one BaaBaa to the picked ticket holder. If nobody calls before the blockhash window expires, anyone can call rearm() to reopen the draw window. After 777 BaaBaa awards, burnOnly(uint256) keeps spending 0.05 ETH chunks buying and burning Baa without awarding more BaaBaa.
Another 0.2% of ETH flow goes to the Baa/BTC vault. This is not automatic on every trade and it is not a dev-only action. ETH waits in the vault until the balance reaches 0.1 ETH. Then anyone can call compound(uint256,uint256). The clicker only pays gas; the vault sends exactly 0.1 ETH already collected by fees to the production compounder, which buys Baa through the canonical Baa/ETH v4 pool, buys Ethereum-mainnet WBTC through the configured WETH/WBTC v3 route, and locks both into a full-range Baa/WBTC v4 position. If the ratio is not exact, unused Baa or WBTC remains in the compounder for a later call. This path is isolated, so a failed Baa/WBTC compound cannot block minting, selling, jackpot, burn, or LP rewards. The test stub is Sepolia-only.
Price Drift
The launch curve and the v4 pool are separate venues, so their prices can diverge. Inside the curve, mint, sell, and current price all derive from one state. Before sellout, sell-backs move that state down after the 0.2% burn fee, so later curve mints can refill returned inventory without a second ledger. After sellout, mints stay closed even if sells move the curve state down. V4 swaps depend on LP liquidity and should use minimum output fields for slippage protection.
Ownerless Boundary
- Fixed 210B supply.
- 0 dev allocation.
- 0.9% hard-coded game flow.
- 0.015 ETH minimum effective jackpot mint.
- 300 block jackpot timer.
- First 21,600 block mining era, then 28,800 block halvings.
- Public jackpot draw.
- Website: sheeplol.xyz.
- X post: reference post.
Explorer Fallback
The website is only a client. If the website disappears, the same protocol can be used from a block explorer through contract pages. Connect a wallet, open the target contract, use Write Contract, and pass values in wei-sized token units where required.
| Function | Use |
|---|---|
SheepLauncher.buyGenesis(address) | Mint from the launch curve; send ETH value and pass your wallet. |
SheepLauncher.sellGenesis(uint256,uint256) | Sell back to the curve. Before sellout, 0.7% ETH goes to protocol sinks and 0.2% Baa burns; after sellout, all Baa sold back burns. Approve Baa first. |
SheepLauncher.finalizeBootstrap() | After the startup window, settle the already-collected startup bucket into locked v4 LP. Caller pays gas only. |
SheepSwapRouter.buy(uint256) | Mint through the v4 pool; send ETH and set a minimum Baa output. |
SheepSwapRouter.sell(uint256,uint256) | Sell through the v4 pool; approve Baa first and set minimum ETH output. |
SheepLiquidityManager.addLiquidity(...) | Add v4 LP with mining credit; approve Baa and send required ETH. |
SheepMining.claim() | Claim LP mining rewards. |
SheepLiquidityManager.poolSlot0() | Read the live v4 pool price state used by the LP helper. |
SheepJackpot.draw() | Settle the prize after the deadline block. Caller pays gas only; the jackpot contract pays the winner. |
BaaBaaVault.forge(uint256) | Settle the next BaaBaa draw when ready. Caller pays gas only; the BaaBaa award goes to the picked ticket wallet, not automatically to the caller. |
BaaBaaVault.rearm() | Reset an expired NFT draw if the old target block hash expired before anyone settled it. Caller pays gas only. |
BaaBaaVault.burnOnly(uint256) | After all 777 BaaBaa awards exist, spend one chunk buying and burning Baa without awarding another BaaBaa. |
BaaBtcVault.compound(uint256,uint256) | Settle one Baa/BTC vault chunk when enough ETH is ready. Caller pays gas only; the vault spends its own fee ETH. |
- Mint curve Baa: call
SheepLauncher.buyGenesis(address), pass your wallet address, and send ETH value with the transaction. - Sell back to the curve: approve Baa to
SheepLauncher, then callsellGenesis(uint256,uint256). - Mint through the v4 pool: call the router ETH-to-Baa exact-input function with ETH value and a minimum Baa output.
- Sell through the v4 pool: approve Baa to
SheepSwapRouter, then callsell(uint256,uint256). - Draw the jackpot: after
deadlineBlockpasses, anyone can callSheepJackpot.draw(). The caller pays gas only. - Claim mining rewards: call
SheepMining.claim(). - Add LP with mining credit: call
SheepLiquidityManager.addLiquidity(int24,int24,uint128,uint96,bytes). The manager passes your wallet to the hook. - Remove LP: call
SheepLiquidityManager.removeLiquidity(int24,int24,uint128,uint96,bytes)with the same range and nonce.
Risk
Baa is a meme game, not a promise of price appreciation. Early emissions are intentionally aggressive. Fixed supply and no owner controls reduce admin risk; they do not remove market risk, contract risk, or liquidity risk.