How it works
Every price is math. Here is the math.
Buy eggs. Burn 5 for a Chibi, then up to Adult and NSFW. New pictures every Tuesday. Below is the math, for people who check.
Four contracts run the hatchery: Hatchery, LevelAuction, LockVault and FeeRouter. Nobody types a price into any of them. The egg price comes from a curve. Every other price is that egg price × a fixed number of eggs, snapshotted once a week, by the contract itself.
Each section says what happens in plain words, then gives the exact rule and the function to call. You can check every line against the code on the explorer.
Prices from this week's snapshot
| Level | Eggs | This week | Next week, at least |
|---|---|---|---|
| Egg | 1 | reading… | live curve |
| Chibi | 5 | reading… | reading… |
| Adult | 13 | reading… | reading… |
| NSFW | 39 | auction start reading… | auction start reading… |
Auction starting price this week: reading….
1 · Hatchery: the egg curve
An Egg is bought on one price curve: each egg costs a little more than the one before. It never resets, and crafting (burning eggs) never lowers it.
At most 100,000 eggs exist at once. Crafting burns eggs and frees room under that cap; the price still counts every egg ever bought. A bulk buy pays every step of the climb, so buying 50 costs exactly what 50 single buys would.
Limits: 100 eggs per buy, 1,000 per wallet each week. Both only slow down a sweep of the curve: one person can still use many wallets.
price(n) = 0.0004 ETH + n × 0.000000996 ETH n = eggs ever bought (burns never lower it) cost(qty) = the sum of price(n) over the next qty eggs eggs alive = minted − burned ≤ 100,000
- buyEggs(qty, maxCost): pays the exact sum, refunds the rest, reverts above maxCost (your slippage guard), past the cap on eggs alive (CurveFull) or past your wallet’s shop week (WalletWeekCap). The eggs land in this week’s Egg edition.
- Views: eggPrice(), quoteEggs(qty), eggsMinted(), eggsAlive(), roomLeft(), boughtThisWeek(wallet).
2 · Hatchery: crafting
You build the levels yourself. A craft burns a fixed recipe from your wallet at once and starts an incubation. When the wait is over, you claim it and the level is minted to you. You get the picture of the week you claim in, not the week you burned. Claim before Tuesday 10:58 UTC to keep this week’s. No odds, no reveal, no speed-up, no cancel. Nobody, us included, can shorten or stop an incubation.
Incubating levels are not minted yet: they are not in your wallet and cannot rest in the nest until you claim them. Crafting needs no token and no lock. Buying a level in the weekly shop is instant.
- Chibi = 5 Eggs (5 eggs in all), incubates 3 hours
- Adult = 2 Chibi + 3 Eggs (13 eggs in all), incubates 12 hours
- NSFW = 2 Adult + 2 Chibi + 3 Eggs (39 eggs in all), incubates 2 days
- craft(level, times, ids, amounts): you choose the inputs, any editions of the right levels (any week); per level they must add up to the recipe × times exactly. Burns them now, returns the incubation id; it is ready at now + incubationSec(level).
- claimCraft(ids): after readyAt, mints your ready incubations (several at once) into the edition open at the claim. Views: incubationsOf(wallet) (level, times, readyAt, claimed; id = position), incubationCount(wallet), incubationSec(level).
- NFTs resting in the nest (the LockVault) are not in your wallet, so they cannot be crafted until you take them out.
3 · The weekly snapshot
The week runs 7 days from the moment sales open. At the start of each week the contract takes a snapshot of the egg price. Every level price for that week comes from that one number, so nothing moves mid-week, however many eggs sell.
Nobody triggers it and nobody can change it: the first purchase of a new week fixes it at the egg price before that purchase. If no egg sold during the week, the price simply holds.
Next week's price is public in advance. It is the live egg price put through the same formula. Eggs that sell before the week turns can only raise it, so the real price is that number or higher.
level price = weekEggPrice × eggs in the level × (1 + 10%) next week ≈ eggPrice() × eggs in the level × (1 + 10%)
- Views: weekEggPrice(), nextReprice() (when the week turns), priceWillHold() (true when no egg sold this week), shopPriceNextWeek(level).
4 · Hatchery: the weekly shop
If you would rather skip the craft, the shop sells levels directly at the week's price, 10% above the egg cost of the recipe. Weekly limits: Chibi 25 a week, Adult 5 a week. NSFW is never in the shop: it is auctioned (section 6).
Units left unsold in a week are not lost. They stay buyable, oldest first, until sold out, each at the price of the week it was first offered in. A buy takes those first, then this week’s units at this week’s price. Either way you get this week’s picture, like every other buy. The total cap counts every unit, carried or not.
- buyLevel(level, qty, maxCost): leftovers first, then this week’s allowance; refunds any excess ETH, reverts above maxCost.
- Views: quoteLevel(level, qty) (the exact cost right now), shopCarry(level) (leftover unit prices and counts, oldest first), shopPrice(level), shopPriceOfWeek(level, week), weekEggPriceOf(week), shopSoldThisWeek(level) (this week’s allowance only), shopSoldTotal(level).
5 · Hatchery: weekly editions
Every shop week has its own four editions, one token id per level: Egg, Chibi, Adult and NSFW, each with that week’s art. An edition is open during its week and closes for good when the week turns: nothing is minted into it again. The one exception is the week’s NSFW auction, which always delivers that week’s NSFW, even when it settles later.
An NFT’s level comes from its id, so the week never matters for crafting or for resting in the nest: eggs of any weeks craft together, and a craft lands in the edition open when you claim it. No edition has a cap of its own and nobody creates them: the ids are arithmetic.
edition id = week × 4 + level (1 Egg, 2 Chibi, 3 Adult, 4 NSFW) level = (id − 1) mod 4 + 1; week = (id − 1) div 4
- Views: editionId(week, level), levelOf(id), weekOf(id), openEdition(level), isOpen(id), balanceOfLevel(wallet, level) (every week of one level), aliveOfLevel(level), mintedOfLevel(level), burnedOfLevel(level), totalSupply(id), uri(id).
6 · LevelAuction: one NSFW a week
Exactly one NSFW is sold each week, by an open auction in ETH. It opens when the week starts and runs 6 days. Its starting price is the same snapshot formula: the week's egg price × 39 × (1 + 10%).
Each bid must beat the last by 5%. A bid in the last 10 minutes moves the end to 10 minutes from that bid, so nobody can snipe it. If you are outbid, your ETH is sent back to you automatically, in the same transaction as the higher bid; only if that transfer fails does it wait for you to withdraw it. Each bid also settles last week's auction once it has ended, so the winner gets the NSFW without anyone pressing a button. A week that ends with no bid is not lost: anyone may buy that week’s NSFW once, at that week’s price, with buyUnsold(week). The ETH goes to the project treasury.
reserve = max(floor, weekEggPrice × 39 × (1 + 10%)), fixed by the week's first bid no-bid week: unsoldPrice(week) = max(floor, that week's egg price × 39 × (1 + 10%)), paid exactly
- bid(week) (refunds the outbid bidder in the same transaction), withdraw() (only a refund that failed), settle(week) (anyone, after the end; a later bid or buyUnsold also does it), claim(week, to), buyUnsold(week) (a no-bid week, once). Views: currentAuction(), currentReserve(), unsoldPrice(week), unsoldTaken(week).
- No owner, no admin, no pause: every setting is fixed when the contract is deployed.
7 · LockVault: the lock and the pool
Lock $XEGI in a tier for a share of whatever the pool pays out. It can be nothing. Keeper = locked forever, counts 3x, never comes back. Longer tiers weigh more (the tier multiplier): 7 days 1.0x, 30 days 1.25x, 90 days 1.5x, 180 days 2.0x, Keeper (forever) 3.0x. Nobody can withdraw Keeper tokens, us included.
Breaking a lock early never takes tokens. Your tier multiplier and your pool share stop at once, and every token comes back after a 3-day cooldown.
Egg, Chibi, Adult or NSFW NFTs, of any week, resting in the nest raise your capacity: how many of your locked tokens count in the pool. Taking them out takes 3 days.
NFTs in the nest follow the recipe, one slot at a time: 5 resting Eggs open one Chibi slot, 2 resting Chibi open one Adult slot, 2 resting Adult open one NSFW slot. They come out from the top down: an NFT that holds a slot above it stays until that one is out.
The pool’s only automatic inflow is resale fees paid in $XEGI (section 8). Sales of eggs and levels never go into it.
0% inflation: this contract mints nothing, so lockers are paid only from real fees. Fees reaching the pool are held first. The project Safe sets the pay speed: setEmissionRate(tokensPerSecond). The pool pays lockers at that speed, by weight, until what it holds runs out; then it pauses until more fees arrive. The pay speed is 0 until we set it. It can stay 0. Setting the speed is its only power over the pool. It cannot send a single token anywhere else; the only way out is a locker's own claim(). Speed 0, or nobody locked: nothing is paid out.
Activation: the LockVault is deployed with the other contracts, before $XEGI exists, and starts with no coin set. NFTs can rest in the nest from day one. Locking $XEGI, the pool and claims start when the coin is switched on: one call, activate(token), allowed once, writes the coin’s address into the LockVault for good. Nobody can change it after, us included. The site and the API read that address from the contract, so it shows the moment it is set.
capacity = 1M + Σ resting NFT × its capacity resting Chibi ≤ resting Egg ÷ 5 resting Adult ≤ resting Chibi ÷ 2 resting NSFW ≤ resting Adult ÷ 2 weight = locked tokens (up to capacity) × tier multiplier your share per second = rate × your weight / total weight, while the pool holds tokens runway = held / rate
- lock(amount, tier), lockForever(amount), unlock(amount), breakLock(), withdraw(), stakeNFT, unstakeNFT, withdrawNFT, claim(). Views: slots(wallet) (resting and open slots per level), stakedOfLevel(wallet, level).
- Pay speed: setEmissionRate(tokensPerSecond) and setEmissionController(to), the pay-speed controller only (the deploy key, then the project Safe). Read emissionRatePerSecond(), poolHeld() (or held()) and runwaySeconds().
- Activation: activate(token), the pay-speed controller only, once. Read token() (zero until then) and activated(). Before it, lock, lockForever, withdraw, claim and setEmissionRate revert NotActivated(); stakeNFT, unstakeNFT, withdrawNFT and every view work.
- No owner. Nobody has power over anyone’s funds or the pool’s tokens. It mints nothing.
8 · FeeRouter: where the resale fee goes
When an NFT resells, a 5% fee (the ERC-2981 royalty) goes to the FeeRouter. Fees from our market are paid in $XEGI and go to the lockers' pool. Fees from third-party marketplaces, paid in ETH/WETH, go to the project treasury: they are ours, and we decide how to use them. Primary sales (eggs, the shop, the auction) go 100% to the project treasury in ETH.
The FeeRouter is wired when the contracts are deployed, before the coin exists, so it receives the royalty from the first sale: ETH fees go on to the project treasury from day one. It reads the coin from the LockVault, so $XEGI fees go to the pool from the coin’s activation on, with nothing to set up.
Anyone can push the fees on. Nothing is swapped. Marketplaces may not enforce royalties.
- flushToken(): every $XEGI fee held, into the pool (from activation; NotActivated() before). flushEth(): every ETH fee held, to the project treasury. token(): the coin, read from the LockVault.
- No owner, nothing to configure. It only ever sends to the pool or the treasury, both fixed at deploy.
What we can and cannot do
Three one-time setup calls on the Hatchery, each allowed once and never again: setLevelAuction (the NSFW auction, before sales open), openSales (opens every sale and starts week 0) and setVault (the LockVault and FeeRouter, wired at the deploy; it does not open sales). Before sales open, and never after, seed mints week-0 editions: openSales switches it off for good.
Our powers on the Hatchery, once sales are open: change the metadata address (setURI). And ownership itself: hand it on in two steps (transferOwnership, then the new owner accepts), or give it up for good (renounceOwnership). That is all.
We cannot change the curve, any price, the premium, a cap, the resale fee, the treasury or the auction. We cannot pause anything. Once sales are open we cannot mint an Egg, Chibi, Adult or NSFW, and we cannot create or reopen an edition. The LevelAuction and FeeRouter have no owner at all. The LockVault has no owner either; its one role, the pay-speed controller (our deploy key, handed to our Safe after the coin is switched on), can set how fast the pool pays lockers (setEmissionRate) and switch the coin on once (activate), nothing else, never user funds and never the pool’s tokens. We cannot speed up, cancel or skip a craft incubation.
For developers
Everything on this page is also a public JSON API: read-only, no key, no sign-up. Before the deploy it answers from the same config this page is built from; once the contracts are on the chain it reads them and says at which block.
The coin: /api/v1/contracts answers token, the $XEGI address read from LockVault.token() (null until activation), and activated (true once the coin is switched on). Read the address there or from the chain; it is typed into no file.
The same answers come as a remote MCP server, so Claude or any other agent can ask the hatchery directly.
- API
- https://xegi.sakura.exchange/api/v1/
- MCP
- https://xegi.sakura.exchange/api/v1/mcp
curl https://xegi.sakura.exchange/api/v1/contracts curl https://xegi.sakura.exchange/api/v1/prices curl "https://xegi.sakura.exchange/api/v1/quote?qty=10" curl "https://xegi.sakura.exchange/api/v1/explain?topic=snapshot"
- Claude Code
- claude mcp add --transport http xegi https://xegi.sakura.exchange/api/v1/mcp
- claude.ai
- Settings → Connectors → Add custom connector, then paste the MCP URL.
Contracts
- Evolve Me · $XEGI (the coin, read from LockVault.token())
- reading the chain…
- Hatchery (the NFTs and their weekly editions, the egg curve, crafting, the weekly shop)
- 0x44f4CB0bf59dB19cb062903353dd0a37943E0E9f0x44f4…0E9f(opens in a new tab)
- LevelAuction (one NSFW a week, by auction, no owner)
- 0x4cFDbF0B13919D1c7AA77Fd0735256930A09C3660x4cFD…C366(opens in a new tab)
- LockVault (locks, the nest, the pool)
- 0x0c44af6183FD56E96681dE3546aC291fB6eE3bFb0x0c44…3bFb(opens in a new tab)
- FeeRouter (resale fees: $XEGI to the pool, ETH to the treasury; no owner)
- 0x6558d3e73c507bA7553323D03eCDaf9115b466280x6558…6628(opens in a new tab)
deployed 2026-10-13 · block 87,366,370 · chain 4663
A price tag, not a promise. What you buy can be worth less than you paid, or nothing.
Every number on this page is one you can check.