Docs · 5 of 8
Running the steps
The public functions, their conditions and their rewards.
Nobody operates Pupate. Every step is a public function; the developer runs a keeper that calls them, and if it stops, anyone else can. Two of the steps pay the caller a share of what they spend, which is what keeps them running without anyone being asked to.
| Call | What it does | When it runs | What it pays |
|---|---|---|---|
PupateHook.flush() | Moves the collected tax from the hook into the vault, where it is split. | Whenever the hook holds claims. Reverts with NothingToFlush otherwise. | Nothing. |
Cocoon.buySeat(order, resolvers) | Fulfils a Seaport listing of one seat from the seat pot and lists the seat for sale. | Fresh report, price at most 105% of the reference, pot covers price plus reward, order well formed. | 0.5% of the ETH spent. |
Cocoon.settleSeat(tokenId) | Takes a sold seat off the books and cancels its other order. | After one of the seat's listings has filled. Reverts with StillHeld before that. | Nothing. |
Cocoon.adopt(tokenId) | Takes in a seat that was sent to the vault directly, at the reference price, and lists it. | The vault holds the seat but has it not on its books; a fresh report exists. | Nothing. |
Cocoon.burn() | Spends the burn pot on PUPATE in the launch pool and destroys it. | Pot not empty, at least 5 blocks since the last burn. One call moves the price at most 5%. | 0.5% of the ETH spent. |
Cocoon.startAuction(token) · takeAuction(token) | Sells the vault's balance of a token the seats earned, at a price that halves every 2 hours. | Start: a balance exists and no auction runs for that token. Take: pay at least auctionPrice(token). | The taker keeps the gap between the falling price and the lot's worth. The ETH goes to the seat pot. |
Cocoon.startImdAuction() · takeImdAuction() | Offers the IMD-burn ETH for IMD; the IMD asked falls over time, and what is delivered is destroyed. | Start: the IMD burn balance is not zero. Take: approve imdDemand() IMD first. | The taker keeps the gap between the ETH received and the IMD given. |
FloorFeed.report(attestation, signature) | Stores a new reference price from an IMD oracle attestation. | The attestation passes every check on the oracle page. | Nothing, and the attestation costs 0.5 IMD to request. |
PupateVesting.release() | Pays the developer whatever has vested. Always to the developer. | Any time something has vested and not been released. | Nothing. |
For agents
skill.md is the same information written for an agent: the calls, the reads to make first, the named errors, a sensible loop and the risks to the caller. Hand it to an IMD seat or to your own agent. No account, no allowlist.
What a caller cannot do
- Choose the price the vault pays above the tolerance, or route a purchase’s ETH to itself.
- Make the vault buy anything but one seat of the collection, for native ETH, in full.
- Move the vault’s ETH anywhere but a seat purchase, a burn or the bounded reward.
- Raise the tax, change a parameter, or transfer a seat.
Risks to a caller
- Another caller runs the same step first; the transaction reverts and the gas is spent.
- The reward is a share of what the step spends. On a small pot it can be less than the gas.
- Auction lots are tokens earned in IMD launches. They can be worth nothing.