Sheaf is a launchpad on the pump.fun curve. Any creator can open a bundle with their own SOL; at launch the bundle buys the whole curve and holds the block under a disposal rate fixed when the bundle is created. Seven instructions, eight accounts, about 2,300 lines of Rust, and no audit. This document is the whole mechanism, the fee schedule it sits on with the account it was read from, and the list of what can go wrong, including the figures that do not flatter it.
Nothing described here is deployed. No program exists at any address, no bundle exists, and no bundle has launched a token. Every statement about Sheaf describes a specification. Every on-chain figure is read from accounts belonging to other parties, mostly pump.fun's, and each one carries the account and the date it was read. Two dates are scheduled: SHEAF, a plain pump.fun token, mints on Thursday, October 8, and the first Sheaf bundle, funded with the builder's own SOL under the same caps as any creator's, is scheduled for Thursday, October 15.
Nothing here is an offer, a recommendation, or advice. Any creator can open a bundle, and every bundle is its creator's own SOL: the program refuses to create one unless its creator deposits the whole cap, so no one else can ever deposit. A launch costs about 92 to 150 SOL. Sheaf takes a protocol fee of 10 percent of the creator fees other traders pay, compiled into the program.
A bundle is a large block of a new token's supply, bought cheap at the mint, before anyone else can bid. From outside, nothing tells you it exists, how big it is, or how fast it can be sold. A Sheaf bundle is one as well. The difference is that the block is declared when it is created, and the same program bounds how fast it can leave.
That bound is one number in one account, written once, and no instruction rewrites it. The program is specified to deploy with no upgrade authority, so the number cannot be raised afterward. Every bundle runs sell-only mode: the trading rule sells above a reference price and never buys. The reference ratchets up on sustained strength and has no path back down. The program contains a buy branch, refuses to create a bundle in any other mode, and records the mode in one byte anyone can read, so that branch never runs. What that gives a reader is a narrow claim: the selling rule is a published function, not a promise. This is not a commitment to hold, and no part of the design makes anyone better off for holding. It is a published rate, and the rate is not generous: at most a quarter of the declared block in any one window, a fixed span of at least one hour counted from launch, and at least four windows from launch to nothing. On every bundle, that is at least four hours.
Of about 2,300 lines, the trading engine is the highest-risk part: every swap, every price read, every oracle path and every signed call into a third-party program lives inside it. Three bounds used to make shipping it without a review survivable, and two of them are now gone. Every bundle that enables the engine runs it sell-only, so the provable no-trade property no longer exists, and the program is now open to every creator, so the one-bundle ceiling is gone too. The one that holds is that the exit path imports neither the engine, the oracle, nor the venue, which a test enforces rather than a paragraph. That trade was made deliberately and the reason is in § 02.
Seven instructions in order. Six of the seven can be called by anyone, which is the point: no account in this design holds a privilege, and there is no operator to compromise or to subpoena.
clear_tier the basis is frozen for the life of the bundle. Everything below that point reads it and none of it writes.docs/IMPLEMENTATION.md §5, handler bodies as ordered steps, and §1 for the compiled constants. The instruction count is stated identically in docs/ARCHITECTURE.md §0.1, §3 and docs/IMPLEMENTATION.md §5.| Instruction | Who can call it |
|---|---|
| initialize_bundle | any creator, once per slot, for their own bundle |
| deposit | anyone, and always refused: the cap is full at creation |
| execute_launch | anyone, once |
| clear_tier | anyone, one success |
| crank | anyone, in the mode the bundle declares |
| harvest_fees | anyone |
| redeem | the share holder |
initialize_bundle creates the bundle account and writes every immutable parameter in one transaction, taking the creator's first deposit through the same code path every later deposit uses. Fourteen ordered checks run and the handler fails on the first one that does not pass. A zero disposal cap is refused outright, because a zero outflow cap would trap the token leg forever.
deposit transfers quote in and mints exactly one share base unit per quote base unit. Never scaled. The cap is checked against a counter in the bundle account rather than against the vault's balance, because anyone can inflate a token account with a bare transfer, and a griefer who could close a raise with a one-unit donation would be a real defect rather than a theoretical one.
For every bundle the funding window is a formality: the program refuses to create a bundle unless its first deposit equals the cap, so initialize_bundle fills it with the creator's own capital in the same transaction that creates it. No later deposit can succeed, from anyone, because the cap is already full.
A bundle is full or it does not exist, and that is a required property rather than a preference. The reason is arithmetic: the three allocations are declared at creation and sum to the cap exactly, and a partial fill would leave a declared amount the vault does not hold. The program refuses a cap above 150 SOL and a tier-clearing allowance above 5 SOL. The worked example sits at both ceilings: 86.50 SOL of launch, up to 5 SOL of tier clearing and 58.50 SOL held as quote, 150 SOL in all; a creator's launch costs about 92 to 150 SOL, depending on the reserve they declare. Graduation itself measured 86.07 SOL, so the launch cap carries about 0.43 SOL of margin against a change in the curve fee, and because the launch buy is exact-out, the unused part stays in the vault. A proportionally allocated partial fill is a V2 problem and is not bolted onto this.
execute_launch creates the token on the pump.fun curve and buys it in one transaction, then measures what actually arrived and writes that measured amount as cap_basis_base, the fixed basis every later cap is computed against. It revokes the share mint authority in the same handler, so the share supply is fixed before anything trades. Every failure path leaves the bundle in its funding state, so the instruction is retryable and a creator's deposit is never stranded.
Atomicity here is composition rather than a special instruction: there is no combined create-and-buy on the venue, and Solana already treats one transaction as all or nothing. The measured cost of doing both in one transaction is in §07, and the one part of this that is still open is in §08.
clear_tier exists because of one sharp number in §03: the coin-creator fee steps at 420 SOL of notional market cap, and a token that has just graduated sits about 2.2 percent below it. The instruction makes a single capped purchase targeting 430 SOL, and it fails closed in every direction. The program refuses, on every bundle, a tier-clearing cap above 5 SOL or a target above 450 SOL of market cap, so no creator can size it into a large buy. If the required spend exceeds its cap, or the buy would land short of the target, the whole transaction reverts and the vault spends nothing. A failed attempt costs the caller a transaction fee and the vault nothing at all.
It cannot live inside execute_launch, because the curve caps at completion and migration is not atomic with it, so the pool it needs to trade does not exist in that transaction. It is the only instruction whose success is asserted against an outcome rather than an action, which is why tier_cleared reading true is evidence the threshold was crossed rather than a record that something ran.
crank is the trading step, and on every bundle that enables the engine it is live and sell-only. It sells when live spot is above the reference by more than the band and does nothing otherwise, which is most of the time. The buy branch is compiled into the same instruction, because the mode is one value of one immutable field rather than a separate code path, and the program accepts only 1, sell-only, in that field. So every buy evaluation on every bundle stops at gate 7 with BuyDisabled, error 6062. A creator who asks for 2, two-sided, is refused at creation. The crank never succeeds as a no-op, so a caller always learns which gate stopped it.
Two properties make the rule checkable rather than merely stated. The reference only ratchets up. It advances on sustained strength, after a set number of confirming observations and a minimum interval, and there is no path in the program that lowers it. So the level the vault sells above never falls, and no sequence of trades can lower it. And every parameter is written at creation and never again, the step is a pure function of on-chain state plus a price anyone can post, and the caller is anyone. At any price, from state at a given slot, a third party can compute whether the vault will sell and how much. Nobody decides it at the time, which is the difference between a published function and a promise.
The vault does not provide depth, liquidity, or market making, and this page will not say that it does. On a constant-product pool a swapping vault is a taker, not a maker: there is no order book and no resting quote, so a sale is an order that arrives after the price has moved rather than an offer resting on a book. The only action that genuinely creates a resting order is providing liquidity to the pool, which is a different instruction with a different risk, and it is not in this program. A competing product's own long-form reviewer, a disclosed holder of its token, measured roughly 10 thousand dollars of depth within 2 percent while its agents held roughly 20.5 million dollars of inventory, and named that number as the easiest way to check the claim. Swap-based strategies produce no resting depth by construction. This one works the same way.
harvest_fees sweeps the fee inbox into the vault, less the protocol fee. 10 percent of the creator fees other traders paid goes to the wSOL account of Sheaf's fee wallet, 636QyjGvmpZF7EdByzXdrLqzN4XKNKoeT3HPNTSYniv2, and the fees the vault's own trades paid come back whole. The rate and the wallet are compiled into the program, so no creator chooses them, and once the upgrade authority is revoked no one can change them. The venue's own fee collection requires no signature from anyone, which means a third party can trigger it directly. Pointing the venue's destination at a dedicated inbox account, rather than at a vault leg, is what makes harvest_fees the only path out of that inbox, and it is the reason the fee accounting is exact rather than approximate.
redeem burns shares and transfers a pro-rata slice of two balances. It is 92 lines of arithmetic with no external dependency: two multiplications, two divisions, two transfers and a burn. §06 is why it pays in kind rather than in cash, which is the single most consequential design decision in the document.
Both figures published in public circulation for the pump.fun creator fee were wrong, and the schedule turned out to matter more to this design than anything in it. It was read directly off the account.
| Tier | Market cap from, SOL | Liquidity | pump.fun | Coin creator | Total |
|---|---|---|---|---|---|
| 0 | 0 | 2 | 93 | 30 | 125 |
| 1 | 420 | 20 | 5 | 95 | 120 |
| 2 | 1,470 | 20 | 5 | 90 | 115 |
| 3 | 2,460 | 20 | 5 | 85 | 110 |
| 4 | 3,440 | 20 | 5 | 80 | 105 |
| 5 | 4,420 | 20 | 5 | 75 | 100 |
| 6 | 9,820 | 20 | 5 | 70 | 95 |
| 7 to 22 | not decoded | 20 | 5 | not decoded | not decoded |
| 23 | 93,330 | 20 | 5 | 8 | 33 |
| 24 | 98,240 | 20 | 5 | 5 | 30 |
Three readings fall out of it. The liquidity leg and pump.fun's own leg are constant above the bottom tier, at 20 and 5 basis points, so the coin-creator leg is the entire variable and the total runs from 120 basis points down to 30. The widely cited 0.30 percent is the bottom of the schedule, not the rate. And the bottom tier is not on that curve at all: below 420 SOL the split is 2, 93 and 30, which is a penalty band on small pools, and it is exactly where every freshly graduated token starts.
The account carries two 25-tier tables, one for ordinary pools and one for stable pools, and which one applies changes the creator leg by more than 3x in the window this design lives in. It was settled against live pools rather than by reading documentation, because there is none. Eight pools were sampled across four orders of magnitude of market cap, computed from their own pre-swap reserves, and six of the eight land on the predicted tier exactly.
One pool settles it alone. At 10,373 SOL of market cap and 453 SOL of liquidity it pays a 70 basis point creator leg. The ordinary table on a market-cap basis predicts exactly 70. The stable table predicts 30 on a market-cap basis and 90 on a liquidity basis. Neither is close, and both readings of the stable table are separately falsified by two other pools in the sample.
The schedule was then reconciled at the lamport level against one live sell. Two mechanical facts came out of it that appear in no documentation and that any adapter has to get right: the liquidity leg never leaves the pool, so it is invisible in the transfer list, and pump.fun's own leg arrives as two transfers rather than one. Code that counts fee transfers, or assumes a single protocol recipient, misparses every swap.
The bonding curve has its own fee account, and it carries no tiering at all: a flat 125 basis points, 95 to pump.fun and 30 to the creator. The 25-tier table applies only after graduation, on the pool. This also explains the bottom tier, which totals the same 125 basis points, so the fee does not jump at migration. It has one hard consequence for the build: the slippage floor on the launch buy is computed against the flat curve rate, not against the tiered table, and getting that wrong in either direction either fails every launch or accepts an unbounded one.
The fee account carries a mutable admin at byte 9, and the fee program exposes instructions to update the config, upsert tiers and change shares. pump.fun can set every creator tier to zero in one transaction. Nothing in this program can prevent that, detect it in advance, or route around it, and no amount of immutability on this side changes it. Watching the account and publishing the last-read rate is the entire response.
Because the liquidity and protocol legs are constant, a trade the vault makes into its own pool pays 25 basis points that come back to nobody. That leak is exactly 25 basis points and it is invariant across all 25 tiers, before priority fees, before tips and before any sandwich. Fee income, meanwhile, accrues from third-party volume whether or not the vault trades. Income depends only on other people's turnover and cost depends only on the vault's, with no term coupling them, so on fee arithmetic alone the optimal amount of vault trading is none.
The two-sided design this replaced paid that cost on purpose, for positioning rather than fee economics, and whether it served a funder reduced to one number: how often a token that has fallen below the reference comes back above it, given that the reference only ratchets up. A round trip that completes captures the band. One that does not leaves the vault holding a falling asset. That number was then measured, and it set the mode.
At the band this design runs, breakeven needs roughly 73 percent of round trips to complete. A backtest of the buy leg found it fires with p = 0.0008 against that 0.730 breakeven, and it executed zero buys across 143 tokens. So every bundle runs mode 1, sell-only, and the program refuses any other mode at creation. The buy branch stays compiled in, because removing it would mean respecifying and retesting the strategy account, and no bundle can select it. What the sell-only rule returns to a funder is unmeasured, so this document describes what the rule does and says nothing about what it returns.
Eight accounts, seven for a bundle with no strategy, and 0.02079 SOL of rent for the set. There is no global state account of any kind, and no field anywhere that names an account with a privilege.
| Account | Seeds | Bytes | What it is for |
|---|---|---|---|
| Bundle | ["bundle", creator, slot] | 480 | All config and state. Token authority for every vault leg, and share mint authority until launch |
| StrategyState | ["strategy", bundle] | 576 | The engine's working set, every parameter written once. Present when the engine is enabled, with the mode byte at offset 9: 1 for sell-only, the only value the program accepts |
| share_mint | ["shares", bundle] | 82 | The share mint. No freeze authority. Mint authority revoked at launch |
| vault_quote | ["quote", bundle] | 165 | Escrow, fee accretion and launch funding, in one account |
| vault_base | ["base", bundle] | 165 | The bundled token itself. Created during the launch, because the mint does not exist before it |
| shuttle_quote | ["sh_quote", bundle] | 165 | Bounds how far the program's signature propagates on a swap |
| shuttle_base | ["sh_base", bundle] | 165 | The same, on the token leg |
| fee_inbox | canonical, for Bundle | 165 | Receives the venue's fee collection. harvest_fees is the only path from here into the vault |
There is no refund, no transfer_position, no claim_fees, no close, no pause, no set_ anything, no instruction that lets anyone but a bundle's creator fund it, no vote, no stake, and no global state account. There is no buy in the trading rule on any bundle: the engine's buy branch is compiled in, and every bundle's mode, written at creation, is sell-only, so it never selects it. There are no position accounts, because the share is a plain fungible mint and the token program already tracks who holds it.
The refund path is the redeem path. A failed raise, or a funding deadline that passes, leaves the token leg nonexistent, so the pro-rata arithmetic pays quote back one for one through the same handler. One code path, one test set, and one fewer instruction to review.
The strongest sentence the design supports, and it is deliberately narrow: on every bundle, once the tier clears, nothing moves the vault's quote anywhere except to a redeeming holder, pro rata. The one other branch that spends quote is the engine's buy branch, and the field that would select it is immutable and set to sell-only. The protocol fee does not touch the vault's quote: it is split off in the fee inbox before the rest reaches the vault. That is checkable by inspecting a seven-instruction program with no upgrade authority and reading one byte of one account, which is the only reason it is worth writing down.
The error enum is complete at 71 codes, numbered from 6000, and the ordinals appear in client code and in explorer output, so they are not reordered.
Enforcement is the whole subject. A cap that a privileged account can raise is a promise, and a promise is what this design is trying not to make. Every bound below is a compiled constant, an arithmetic check that cannot overflow, an absent instruction, or a test that fails the build.
// state.rs, compiled into the artifact. A creator may configure under these
// and nobody can configure over them, because there is no instruction that writes them.
MAX_FLOW_CAP_BPS = 2_500 // 25% of the basis, per window, ceiling
MAX_TRADE_CAP_BPS = 100 // 1% per trade and per window, ceiling on all four rate caps
TIER_CLEAR_SPEND_CEILING = 5_000_000_000 // 5 SOL, the most any bundle's tier purchase can spend
TIER_CLEAR_MCAP_CEILING = 450_000_000_000 // 450 SOL of market cap, the highest tier target
PROTOCOL_FEE_BPS = 1_000 // 10% of organic creator fees, no other value accepted
PROTOCOL_FEE_OWNER = 636Qyj...niv2 // full key in § 02 /04
HARD_TVL_CEILING = 150_000_000_000 // 150 SOL per bundle
MIN_INITIAL_DEPOSIT = 5_000_000_000 // 5 SOL, the smallest cap a bundle
// can declare, since it must equal the cap
MAX_VENUE_FEE_BPS = 200 // above this the engine halts, it does not drain
MIN_WINDOW_LEN_SECS = 3_600 // one hour, both windows
MAX_WINDOW_LEN_SECS = 86_400
BPS_DEN = 10_000
// initialize_bundle also refuses every mode but 1, sell-only (check_strategy).
The cap is flow_cap_bps, a per-window allowance in basis points of cap_basis_base, at most 2,500, the compiled ceiling, against a window of at least 3,600 seconds and at most 86,400. Both are written at creation, and the worked example uses the fastest pair the program accepts, 2,500 over 3,600. It bounds all token outflow by any path: a sell the engine makes and a holder redeeming draw on the same allowance. On a bundle that enables the engine both paths are live, because the engine runs sell-only, and they draw on the same allowance. The engine's own selling is held separately, to at most 1 percent of the basis per trade and per window on every bundle, a twenty-fifth of this ceiling. The gate fails closed with no partial fill, so a request over the line does not receive part of what it asked for.
Three details in the gate are load-bearing, and each one exists because the naive version is wrong. The clock is clamped forward, because a clock that regresses would otherwise reopen a spent window. The allowance is computed through a 128-bit intermediate, and this is mandatory rather than stylistic: a token with a billion units of supply at six decimals is 1e15 base units, and the basis multiplied by anything above roughly 18 basis points overflows 64 bits for a realistic token. And the window carries part of the previous window forward on a sliding term, because a pure fixed window admits two full allowances in two seconds: spend the cap at 59:59, spend it again at 60:01. The sliding term refuses that second spend. It does not make the cap hold over any 60 minutes. It counts the previous window's outflow as if it had been spread evenly across that window, so a burst at the end of one window is under-weighted in the next. Measured in a VM test harness against the real program, with every over-ask refused, a sequence timed across a boundary moved 1.9994 allowances inside an interval just under one hour.
So the cap is stated as what the gate enforces, and nothing more.
cap_basis_base is set to the measured amount the launch actually received, amended exactly once by clear_tier, and frozen the moment tier_cleared is true. A test enforces both halves of that: textually, that the field is assigned in exactly two files, and behaviorally, that a sell and a redemption after the tier clears leave it unchanged.
The rejected alternative is the one most designs pick, which is to compute the allowance against the current balance. That reintroduces geometric decay: the allowance shrinks as the balance does, the vault can always keep selling, and the published unwind time becomes infinite. A fixed basis makes the drain linear and the unwind finite, and it is the only version of the cap that can be published as a number.
Full unwind is computed from chain, not printed as a constant.
clear_tier amends the basis, and anyone can send tokens to the vault with a bare transfer. Donated tokens sit outside the basis and extend the true unwind, and this cannot be fixed by tracking, because the program cannot refuse an incoming transfer. So the figure is read live from two on-chain numbers, and if it does not come to four at those settings, that is a defect to find before publishing anything that says four.The per-bundle ceiling is 150 SOL, compiled in, with the per-bundle field checked against it at creation. At runtime deposits are bounded by a counter in the bundle account rather than by the vault's balance, for the griefing reason in §02. 150 SOL is not a round number chosen for comfort: 25 SOL cannot buy graduation at any plausible threshold, 100 SOL works only at the low end and leaves almost no reserve, and 150 SOL buys graduation across the range. In the worked example it leaves 58.50 SOL declared as quote, which nothing spends except a redemption, since every bundle is sell-only.
Each bundle belongs, by its address, to the creator who signs for it. The bundle account is derived from the seeds ["bundle", creator, slot], and the creator signs initialize_bundle, so each creator has up to 256 slots and no one can open a bundle at another creator's address. The program then refuses the bundle unless the creator's first deposit equals the cap, so no one else can ever deposit into it. Both rules are arithmetic in the handler rather than a flag, so there is nothing to flip. A boolean flag would be a privileged operator and a claim a reader has to trust. Arithmetic in an immutable program is a claim a reader can check.
It covers deposits and stops there. Anyone can send tokens or SOL to a vault with a bare transfer, and the program cannot refuse one; a transfer mints no shares and gives the sender no claim. And each creator chooses parameters inside the compiled ceilings, so two bundles can carry different speed limits. Every one of them is at least as slow as the ceilings above: never more than a quarter per window, and never a window under an hour.
| Field | Value | Note |
|---|---|---|
| flow_cap_bps | 2,500 | 25 percent of the basis per window, a fixed hour counted from launch, which is also the compiled ceiling. Not a bound on any 60 minutes; see /10 |
| window_len_secs | 3,600 | One hour, the shortest the program accepts; the bounds are 3,600 and 86,400 |
| strategy_enabled | true | The engine is live, in the mode set below. A creator who sets false gets a vault that never trades |
| tvl_cap_quote | 150 SOL | Equal to the compiled ceiling |
| min_raise_quote | 150 SOL | Equal to the cap, so the atomic first deposit fills it |
| launch_spend_quote | 86.50 SOL | A cap set above the measured graduation cost of 86.068 SOL, flat 125 bps curve fee included, for about 0.43 SOL of margin against a fee change. The launch buy is exact-out, so it never spends more than graduation needs, and the unused cap stays in the vault |
| tier_clear_market_cap | 430 SOL | Above the 420 boundary, for headroom against the measurement gap. No bundle can target above 450 |
| tier_clear_max_spend | 5 SOL | A hard spend ceiling on an instruction measured on a mainnet fork at 0.96 SOL to clear 420 and 1.99 SOL to reach the 430 target, inside the cap, and the most the program accepts on any bundle. Raised from 3, because anyone can call the crank and each sale lowers market cap, which raises that cost before the tier clears |
| protocol_fee_bps | 1,000 | 10 percent of the creator fees other traders pay, to Sheaf's fee wallet. Compiled in: the program refuses any other value, so no creator chooses it |
| sleeve_quote | 58.50 SOL | Declared at creation, not inferred from a balance, and held as quote. 86.50 + 5 + 58.50 sums to the cap exactly |
| mode | 1 | Sell only, from 2026-09-30, replacing two-sided, and the only mode the program accepts. The buy branch is compiled in and never selected: every buy evaluation fails at gate 7 with BuyDisabled, 6062 |
| band_bps | 1,500 | Spot must clear the reference by 15 percent before a sale is legal. No bundle may run tighter than 500 |
| ratchet_step_bps | 250 | The reference moves up 2.5 percent per update, after 4 confirming observations, and never down |
| trade_cap_sell_bps_window | 100 | The vault's own selling, 1 percent of the basis per window, a twenty-fifth of the outflow ceiling and the most the program accepts |
| trade_cap_buy_bps_window | 100 | Inert in mode 1. The buy side's rate cap, measured against the quote sleeve rather than the block. It is written into the account, and under mode 1 it never binds |
| quote_sleeve_floor_bps | 2,000 | Inert in mode 1. The share of the sleeve the buy side may never spend, with a compiled minimum of 1,000. Under mode 1 nothing spends the sleeve, so it never binds |
BuyDisabled.A holder redeems for a fraction of two balances. No price is consulted, no oracle is read, and no net asset value is computed anywhere in the program. That is a deliberate refusal, and this section is the arithmetic that forces it.
// ix/redeem.rs, 92 lines. Eight accounts: no venue, no oracle, no strategy, no pool. // That account list is the specification. If it grows, something has gone wrong. supply = share_mint.supply // read live quote_out = floor( vault_quote × shares / supply ) base_out = floor( vault_base × shares / supply ) require( quote_out > 0 or base_out > 0 ) // else DustRedemption if launched and base_out > 0: gate_admit_flow( base_out ) // flow_cap_bps only burn( shares ); transfer( quote_out ); transfer( base_out )
Both legs floor, always against the redeemer, and the remainders accrete to whoever has not redeemed. The final redeemer holds the whole supply, so both expressions reduce to the full balance and the vault empties exactly. The token leg is gated by the disposal cap and nothing else. The engine's reserve floor binds the engine only and never a redemption, because a floor that can stop a holder reaching their own pro-rata assets has stopped being a constraint on the vault and become a constraint on the holder.
Selling tokens into a constant-product pool pays at most the pool's quote reserve scaled by the fraction of the combined token balance being sold. Written out, selling N tokens into a pool holding M tokens and R quote pays R × N / (N + M), so the share of the marked value that a sale realizes is M / (N + M), and it falls as the position grows relative to the pool. Splitting the order does not help, because price impact is path-independent in a static constant-product pool.
docs/ARCHITECTURE.md §4.5, evaluated at the pump.fun supply split derived in docs/ECONOMICS.md §2: 793.1M tokens bought on the curve against a 206.9M migration reserve, from a fixed supply of 1,000,000,000 and virtual reserves of 30 SOL against 1,073,000,000 tokens. docs/ARCHITECTURE.md rounds the same split to 800M against 200M and reads 20 percent.| Position sold, multiple of the pool reserve | Share of the mark realized |
|---|---|
| 0.25 | 80.0% |
| 0.5 | 66.7% |
| 1 | 50.0% |
| 2 | 33.3% |
| 3.83 | 20.7% |
| 5 | 16.7% |
Applied to the worked example's day-zero position, with 150 SOL deposited, that produces two numbers for the same holding. Both are published, at the same size, and that is a rule rather than a courtesy: a marked figure never appears on any surface without the realizable one beside it.
A redemption that paid out at the marked figure would let the first redeemer take 3.1x their fair share and leave the last one holding a tail nobody will buy. That is a run, by construction, on day one. Paying at a liquidation mark fails differently: redemption pressure becomes sell pressure, and the caps that exist to bound the vault's selling would then block redemptions instead.
In-kind payment is the only version in which the program never states a value it has to honor. It transfers a fraction of two balances. There is no mark to overstate, no oracle to consult, no sequencing advantage and no run. What a holder does with the tokens afterward is their decision and their price, and the program has no opinion about either.
One rule overrides local convenience anywhere in the codebase: the redeem handler must not import the venue, the oracle, or the strategy. Two tests enforce it. One parses the file and asserts none of those names appear. The other builds and submits a redemption in which the venue program, the price account and the strategy account are all absent from the transaction, and asserts that it succeeds. The behavioral test is the real one; the textual test catches the intent earlier.
What that buys is a single column in the design's own failure table. Pool drained, venue frozen, venue bricked, price feed stale, price feed offline, token worthless, nobody running the crank: the exit path is unaffected in every row, because it does not call any of them.
Shares are a plain fungible mint with no freeze authority, minted only inside a closed funding window at one share unit per quote unit, and never again. The mint authority is revoked during the launch, so the supply is fixed before anything trades, before any fee accrues and before there is a price. Share inflation is structurally impossible rather than merely prohibited, and there are regression tests for it anyway.
Harvested fees land in the quote vault, and every share's claim is its fraction of that balance. Supply is frozen, so every harvest raises every holder's claim pro rata, instantly, with no bookkeeping, no distribution instruction, no schedule, and nothing sent to anyone except the protocol fee, which is split off in the fee inbox before the rest reaches the vault. That costs nothing to build and it removes a privileged action, since posting a distribution root is a privilege and this design has none. It also has a cost worth stating plainly: a holder cannot take income without reducing their position.
Four calls settle every claim in this document that is about Sheaf. The offsets are published so the check works with curl and xxd rather than with our client, because a verification that requires running our software is not a verification.
// 1. the program getAccountInfo( [program id] ) executable → true its ProgramData upgrade authority → None // stop here if it is not // 2. the bundle derive PDA ["bundle", creator, 0] under the program id getAccountInfo( that PDA ) length → 480 bytes owner → the program id u8 at offset 10 strategy_enabled → 1 // the engine is live; step 3 reads its mode u8 at offset 11 slot_index → 0 u8 at offset 12 tier_cleared → informational u32 at offset 16 window_len_secs → 3600 to 86400 // never under an hour u16 at offset 20 flow_cap_bps → 1 to 2500 (little endian) u16 at offset 22 protocol_fee_bps → 1000 u64 at offset 392 cap_basis_base → the other half of the unwind figure // 3. the strategy account, and the one byte that fixes the mode derive PDA ["strategy", bundle] under the program id getAccountInfo( that PDA ) length → 576 bytes u8 at offset 9 mode → 1 // sell-only, the only value accepted // no instruction writes it, so every buy evaluation stops at gate 7, BuyDisabled // 4. nobody but the creator funded it, same bundle account 32 bytes at offset 24 creator → the key in the PDA seeds u64 at offset 312 tvl_cap_quote → the cap u64 at offset 376 escrowed_quote → equal to the cap // initialize_bundle refuses a first deposit below the cap, so every later deposit fails
A one at offset 10 means the engine is live, and the strategy account at the derived address holds every parameter it runs on, each written at creation and never again. A one at offset 9 of that account means the engine sells and never buys, for the life of the bundle. A nonzero value at offset 20 means the position is redeemable, because a zero outflow cap would trap the token leg. Equal values at offsets 312 and 376 mean the creator filled the cap at creation and nobody else could deposit. Dividing the vault's token balance by the basis multiplied by the rate, over a 10,000 bps denominator, gives the live unwind figure in windows, which is the number to read rather than any constant printed in a document.
This is the part with no equivalent elsewhere, and it is what makes the determinism argument true rather than decorative. A deterministic rule whose trades cannot be told apart from organic flow produces the same misleading tape as a discretionary bot, with a stronger claim attached to it. So every vault trade is attributable by anyone, from the program id and the bundle's address.
// Every vault swap ever, chronologically: one call, keeping the ones that succeeded and whose instruction // is this program's crank or clear_tier. Anyone can list the marker in an unrelated transaction, so the // second filter is required, not optional. No interface definition needed and no // cooperation from us. The marker is derived per bundle. getSignaturesForAddress( findProgramAddress( [b"vault_trade", bundle], PROGRAM_ID ) ) // Attribute an individual swap: the swap's own user token account is one of ours. swap.user_base_account == findProgramAddress( [b"sh_base", bundle], PROGRAM_ID ) swap.user_quote_account == findProgramAddress( [b"sh_quote", bundle], PROGRAM_ID ) // The figure this makes computable, and the only honest way to show volume: organic = pool_quote_volume − sum( VaultTrade.quote_amount ) // published as "24h volume X, of which Y was the vault's own"
The marker is an address and nothing else. It holds no data, needs no rent, and is never read or written; it is simply present in the trading instruction and in nothing else the program does, which is what makes filtering on it exact. A structured event carries the side, the measured amounts, the reference the trade fired against and the venue fee, and its discriminator is derivable without our interface definition. Gross pool volume is never published without the vault's share broken out, because a number that mixes the two is the one thing this design cannot afford to show.
Byte offsets are normative in the specification, not incidental. A test serializes a known struct and indexes the bytes, asserting that strategy_enabled is at 10, slot_index at 11, tier_cleared at 12 and flow_cap_bps at 20, so a field moving for aesthetic reasons fails the build rather than quietly invalidating this page. The mode byte at offset 9 of the strategy account comes from the specified layout and is not one of the offsets that test asserts. The bundle account is 480 bytes with 38 fields, of which 12 are mutable; everything else is written once and is then a public constant for the life of the bundle.
The mainnet artifact is built verifiably and its hash is recorded per commit. The step straight after the deploy is the one everything else depends on: the deploy script revokes the program's upgrade authority before any bundle exists, reads the ProgramData account back and asserts it is None. Nothing else proceeds until that assertion passes. After the revoke, any creator can still open a bundle, and nobody, the builder included, can change the program that governs it. Nothing else in this design survives an upgrade authority existing.
Before a launch, the launch script re-reads pump.fun's own constants account and confirms the graduation figures have not moved, recomputing and rebuilding the parameter set if they have. After it, the verification script runs against the new bundle and publishes its output, with the live unwind figure rather than a constant.
The design's own attack table runs to nineteen rows. These are the ones a reader outside the build should weigh, in the order they would cost the most, with the figure that sizes each one.
Two rules govern this section. The unfavorable number is never the smaller one on the page. And figures that are reconstructions rather than measurements are either labeled as such or left out, which is why some of the internal model's more interesting numbers are not here.
A pump.fun token graduates at about 85.0 SOL of buying, which is about 410.9 SOL of notional market cap, read from the venue's own constants account. On a fixed supply of a billion, that buying takes about 793.1M tokens off the curve and leaves about 206.9M as the migration reserve that seeds the pool.
Two consequences follow immediately and neither is a forecast. 420 SOL is the first fee tier, so a token that has just graduated is one tier below it and about 2.2 percent of price away, which is the sharpest parameter in the whole design and the reason clear_tier exists. And selling the entire position straight back into the pool it just seeded pays about 67.41 SOL against about 86.08 SOL spent, a 0.78x round trip that is fixed the moment the pool exists and is independent of everything that happens afterward. That 18.67 SOL is not a fee, a spread, or bad execution. It is the pool keeping the tokens it was seeded with.
In a measured cohort of 336 graduates, 22 reached a 500,000 dollar market cap within four hours and one reached it later, so 313 never did. The median current market cap of those 22 is now under 4,000 dollars. The base rate for graduation itself, measured over 118,229 launches on a comparable venue, is 1.70 percent, rising to 4.45 percent for launches carrying a real site and a real description. Every Sheaf bundle graduates inside its own launch transaction, so that rate describes the tokens around it, not these.
Against those base rates the modeled median funder outcome, before the protocol fee, is a loss of roughly a fifth, and the mean clears break-even only because of one row in 336. The favorable branches of the internal model are reconstructions built on tier boundaries that were never decoded and on a path assumption nothing measures, so no favorable multiple is published here. The direction that survives the reconstruction is enough on its own: operating income is not monotonic in success, because the creator leg steps down as the pool grows, so a larger token pays less per unit of volume. The exact turning point is a reconstruction output and is not published.
The builder plans to fund one bundle, the first, scheduled for Thursday, October 15, with his own SOL. It runs under the same program and floors as any creator's and has no power theirs lack, and his exposure on it is a creator's, below. Beyond it, what the builder puts at risk is the deploy, about 4.5 SOL of program rent. What the builder earns is the protocol fee: 10 percent of the creator fees other traders pay, on every bundle, his own included, sent to one wallet compiled into the program. That is a conflict worth naming. The fee pays on volume whether or not a bundle's creator comes out ahead.
A creator's exposure is the launch itself. The launch buy measured 86.07 SOL, capped at 86.50, and selling the whole position straight back into the pool it seeded returns about 0.78x, as /32 shows. The floor is a plausible outcome, not a tail: 313 of the 336 measured graduates never reached a 500,000 dollar market cap. Each bundle is one party's own capital, which is the posture the program was built on; pooling strangers' money into an unaudited vault was considered and rejected.
Earlier versions printed an exposure of about 11,394 dollars against a floor of about 8,224. Those were the builder's own figures, under the earlier plan in which the builder's bundle was the only one the program allowed. They are withdrawn. A creator's version, net of the protocol fee, is not computed yet, and no figure stands in for it here.
An earlier funding plan said the treasury never sells and also said token proceeds fund the audit. On these rails the treasury buying its own curve produces no proceeds, because the quote lands in a pool pump.fun owns. The only channels that return quote are selling vault tokens and the creator fee. Every bundle resolves it by running sell-only: the vault sells its tokens into strength, under the published speed limit, and never buys after launch except the one capped tier purchase. What it raises belongs to the bundle's share holders pro rata, and at launch that is the creator alone. No instruction routes any of it to an audit.
Every figure on both pages traces to a row here. Where two internal documents disagree, the disagreement is printed rather than reconciled quietly.
| Figure | Source | Read |
|---|---|---|
| The 25-tier fee table, the 420 and 98,240 SOL thresholds, the 20 and 5 basis point constant legs, the mutable admin at byte 9 | fee_config PDA 5PHirr8joyTMp9JMm6nW7hNDVyEYdkzDqazxPD7RaTjx, 4,097 bytes, owner pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ | 2026-09-28 |
| The flat 125 basis point pre-graduation fee, 95 to the venue and 30 to the creator | bonding curve FeeConfig PDA 8Wf5TiAheLUqBrKXeYg2JtAFFMWtKdG2BSFgqUcPVwTt, slot 451,497,515 | 2026-09-28 |
| The lamport-level reconciliation of the fee split, and the two mechanical facts about how the legs move | sell transaction on mint 8NN7516d3PCxDme3By3RKdi7ECB42WM4RMbnWbBfpump, slot 451,499,060 | 2026-09-28 |
| Graduation near 85.0 SOL of buying and 410.9 SOL of notional market cap; the 793.1M against 206.9M split | pump.fun Global account constants, virtual reserves of 30 SOL against 1,073,000,000 tokens | 2026-09-28 |
| A program address can hold and claim the coin-creator role: 701,113 such addresses, 12 of 25 pools off-curve, two live accruing balances | pool sampling at slot 451,504,240; the venue's own interface definition showing zero signers on the fee collection | 2026-09-28 |
| 174,308 compute units for create-and-buy in one transaction, 12.5 percent of the ceiling, on a 4.94 SOL buy | live mainnet transaction at slot 426,002,293, both instructions at top level from a wallet | 2026-09-28 |
| Seven instructions, eight accounts, the 480-byte bundle layout, every byte offset, the compiled constants, the reference parameter set, the ten build checks | docs/IMPLEMENTATION.md, normative for layouts, offsets and signatures | 2026-09-30 |
| 2,327 nSLOC after the two-sided decision and unchanged by the sell-only one, the nineteen-row attack table, the in-kind redemption argument, the fee decode and the eight-pool tier resolution | docs/ARCHITECTURE.md | 2026-09-30 |
| The 2.55x marked against 0.82x realizable pair, the 0.78x round trip, the cohort of 336, the 1.70 percent base rate over 118,229 launches | docs/ECONOMICS.md | 2026-09-29 |
| The flow cap as enforced: at most one allowance per fixed window counted from launch, at most A × (1 + T ÷ W) over any span, 1.9994 allowances inside an interval just under one hour, three windows and four seconds from first outflow to empty at the fastest, and empty no sooner than four windows after launch | VM test harness against the real program, every over-ask refused; the gate in programs/bundle-vault/src/flow_gate.rs; decision D-14 | 2026-09-30 |
| The clear_tier spend: 0.96 SOL to clear 420, 1.99 SOL to reach the 430 target | mainnet fork from the graduation state, docs/RAILS.md D12; decision D-15 | 2026-09-30 |
The launchpad: bundle seeds ["bundle", creator, slot], the self-funded rule (first deposit equals the cap), the per-bundle trade marker, the protocol fee of 1,000 bps to the wSOL account of 636QyjGvmpZF7EdByzXdrLqzN4XKNKoeT3HPNTSYniv2 on organic fees only, revoke before any bundle exists, about 4.5 SOL of builder deploy rent, 92 to 150 SOL per launch | decision D-19 and its protocol-fee addendum; programs/bundle-vault/src/state.rs, ix/initialize_bundle.rs, ix/harvest_fees.rs | 2026-10-01 |
| The buy-leg backtest behind the sell-only mode: p = 0.0008 against a 0.730 breakeven, zero buys across 143 tokens | docs/ECONOMICS.md s10A, and decision D-12 | 2026-09-30 |
Nothing described here is deployed, and every statement about Sheaf is a statement about a specification. No disclosure copy ships until the corresponding fact is readable on chain, which is also the only condition under which any of it is worth reading.