Dashboard

Next distribution in
--:--
MinSec
 
Buying this cycle
Waiting…
no stock selected yet
Up next
Creator fees claimed Spent on stocks Cycle Interval
Total Staked
 
Stocks Distributed
 
Value Shipped
 
Stakers
 
Value distributed
USD value of every stock paid to stakers
 
Platform holdings
Every xStock this platform has bought and paid out
  1. 1
    Get your deposit addressCreated for you the moment you sign in. It belongs to your account alone.
  2. 2
    Send $STOCKPILE to itFrom any wallet or exchange. Then press I've sent it — check now below.
  3. 3
    Stake itYour balance starts earning a slice of every stock bought from the next cycle on. No lockup.
Stake
Staked tokens earn a share of every stock bought from here on.
Available
Currently staked
Pool share
STOCKPILE
Unstake
No lockup. Unclaimed stock rewards are settled first.
Staked
Unclaimed value
STOCKPILE
Deposit
Send $STOCKPILE to this address. It is yours alone.
Your own deposit address — and its QR — are generated the moment you connect.
Only send $STOCKPILE to this address — the token on the contract address shown in the top bar. Any other token sent here may be unrecoverable.
Withdrawal address
Where claimed stocks and tokens get sent.
Changing this address starts a cooldown before it can be used, so a stolen session cannot instantly redirect a withdrawal.
Claimable now
across all stocks
Lifetime earned
since you started staking
Your pool share
of all staked $STOCKPILE
Stocks held
distinct tickers
Your basket
Claim credits the stock to your balance. Withdraw sends the real Token-2022 tokens to your wallet.
StockClaimableValueLifetime
Every stock here is priced before it is bought. Seconds before any purchase, a real Jupiter quote for that cycle's exact size has to come back under the impact cap — so you are only ever paid in stock the platform could buy at a fair price. Names sitting above the cap are held back until their market improves, and picked up automatically when it does. Nothing here is chosen by reputation.
Max tier Impact cap Buying now
What we refuse to buy
Household names whose markets could not support a fair buy — kept on record with the number
Recent cycles
Each row is one claim → buy → distribute loop
#StockBoughtValueSOLStakers
Live feed
Stakes, claims and withdrawals
Top stakers
Ranked by staked $STOCKPILE
#StakerStakedPool shareEarned
The mechanism

A memecoin's trading fees, converted into real equity, split by stake.

Every trade of $STOCKPILE pays creator fees in SOL. The engine claims them, measures the live liquidity of the tokenized equity it is about to buy, executes the swap on Jupiter, and credits the tokens pro-rata to everyone staking at that instant. You claim, then withdraw the actual Token-2022 shares to your own wallet. There is no emission schedule, no holder tax and no printed supply — the only input is volume that already happened.

Stocks distributed
 
Value shipped
 
Cycles run
 

The loop

Four steps, repeated on a fixed interval. Nothing in it waits on a human.

01

Fees arrive

Every trade of the pump.fun token pays creator fees in SOL to the treasury. The engine claims them and books the proceeds against a ledger that only ever grows by a measured balance delta — so it can spend what it provably earned and nothing else.

02

A stock is vetted

The candidate is quoted on Jupiter at this cycle's exact lamport size, seconds before the swap. Over the cap, no route, or no answer at all — it is skipped and the next name is quoted. The gate fails closed.

03

Split pro-rata

The fill is credited to everyone staking at that instant, strictly by pool share. Hold 3% of the stake, receive 3% of the shares. The arithmetic is BigInt base units, and the integer-division remainder is carried forward — no base unit is lost.

04

Withdraw for real

Claim settles the accrual into a withdrawable balance. Withdraw sends the actual Token-2022 xStock tokens to your wallet, routed through a single-use relay so a bubblemap cannot pin every holder to one payer.

What makes this different

Four decisions that separate this from a rewards bot with a ticker list.

The gate is a live quote, not a list

A hardcoded roster of famous tickers is how you buy a token at a markup nobody can sell out of. Fifty xStocks were measured on real Jupiter quotes: 23 are tradeable, 27 were rejected on impact — and each rejection is recorded in the source with the number that disqualified it, so nobody re-adds a household name without seeing what it would cost.

NFLXx 6.1% JNJx 96.7% HONx 99.97% CRMx no route

Depth is a property of the moment, not of the ticker. GMEx measured 0.302% one day and ~3.95% the next — a 13x move that a static tier table would have walked straight into. Against that, TSLAx, AAPLx and SPCXx all sit under 0.04%. That drift is the entire reason the gate re-quotes rather than trusting a table.

One accumulator per mint, O(1) per stock

The obvious implementation loops every staker on every cycle and rewrites the whole user table. Instead each stock carries a single accumulated-reward-per-share value scaled by 1018, and each staker carries the accumulator reading from their last interaction. Crediting a distribution is one addition, regardless of how many people are staking.

Everything is BigInt base units end to end — no float ever touches a balance. The remainder from integer division is carried into the next distribution instead of being handed to whoever sorts first, and a staker who joins after a stock has paid out is stamped at the current accumulator, so they cannot retroactively claim history.

Payouts that do not draw a bubblemap

Treasury-to-holder in a loop works, and it also renders as one bright hub in every explorer — the exact visual signature of a farmed token, even when every holder is real. So each batch is routed through a throwaway keypair that is funded, used and emptied inside one atomic transaction. The relay pays the rent for each recipient's token account, so the on-chain funder recorded against every holder is a wallet that no longer exists by the time the transaction confirms.

Atomicity is what makes it safe rather than clever: there is no state in which a relay is holding user funds. Either the whole batch lands or none of it did, and the retry starts from a fresh keypair.

7 recipients 1179 bytes 1232-byte limit

The batch size is a wire-format fact, not a preference — an eighth recipient overruns the packet and fails the whole run.

Measured by buying, not by reading a docs page

Existing in a token list tells you nothing about whether $500 of a name can be bought without moving its price. So every listed stock was bought for real on mainnet — 25 swaps, 0 failures, every fill reconciled against its token account to the base unit. Three filled above the impact cap: two were moved to the rejected list with the number that disqualified them, and GameStop was kept on purpose — so you can watch the gate refuse a name everybody recognises.

Pool depth is read live from Jupiter alongside the impact figure, because a 0.03% impact is consistent with both a deep book and a shallow one. SPY sits around $2.5M with roughly 26.6k holders; MCD around $69k. Both clear the cap. Only one of them is a book you would keep buying into.

What you are actually earning

xStocks are issued by Backed Finance as Token-2022 SPL tokens with 8 decimals and an Xs mint prefix. They track real equities and ETFs. When you withdraw, the tokens that land in your wallet are those tokens — not an IOU in this database, and not a synthetic balance that only exists here.

Hard limits in the engine

  • It can only spend what it claimed. The spendable pool is a decoupled ledger that grows only by measured balance deltas, so an operator top-up or a mis-sent transfer is not spendable by the bot.
  • A treasury floor is never crossed. A hard SOL reserve stays unspent so a transaction fee can always be paid even if accounting drifts.
  • An anomalous claim is quarantined. A single implausibly large fee claim is held for a human instead of distributed — balance-delta accounting cannot tell fee income from a mis-sent transfer.
  • Selection is re-verified every cycle. A ticker that was liquid last week does not get bought this week on reputation.
  • Withdrawal addresses cool down. Changing yours starts a delay before it can be used, so a stolen session cannot instantly redirect a withdrawal.
 

Risk disclosure

This is not investment advice and nothing here is a licensed financial product recommendation. Read all of this before staking anything you cannot afford to lose.

  • Rewards are not guaranteed. They are funded entirely by pump.fun creator fees. If trading volume stops, distributions stop. There is no yield, no APY and no promise of a return.
  • $STOCKPILE is a volatile memecoin and can go to zero. Staking it does not protect its price.
  • xStocks carry issuer and liquidity risk. They are third-party tokenized products from Backed Finance. Their redeemability, pricing and on-chain liquidity are outside this platform's control, and thinly-traded names can be hard to exit.
  • Staked tokens are held custodially while staked. That is a single high-value target by design. Only stake what you accept could be lost to a compromise, a bug or an operator error.
  • Tokenized equities may be restricted where you live, and may not be available to US persons. Check your own jurisdiction — that is your responsibility, not this site's.
  • Smart contracts and RPC endpoints fail. A failed cycle carries over; it does not create a debt owed to you.
Technical paper

Distributing pump.fun creator fees as liquidity-gated tokenized equity

A staking mechanism in which a memecoin's only durable revenue is converted, every cycle, into an externally-priced asset that its own order book does not set the price of.

Protocol
STOCKPILE
Network
Solana mainnet
Reward asset
xStocks · Token-2022
Measurements
2026-08-06

Abstract

$STOCKPILE is a pump.fun token whose creator fees are converted into tokenized equities and paid to the people staking it. Every cycle the engine claims the token's accrued creator fees in SOL, selects an xStock that passes a live liquidity gate at that cycle's exact spend size, buys it on Jupiter, and credits it pro-rata to every wallet staking at that instant using accumulated-reward-per-share accounting with one accumulator per mint. Stakers claim, then withdraw the real Token-2022 tokens to a wallet they control. The engineering weight of this system is not in the distribution — that part is a solved problem — it is in knowing, at the moment of spending, which assets can actually be bought without handing a staker a position they cannot exit.

01The problem

Creator fees are the only durable revenue a pump.fun token has. Every trade in the token pays a fee to the creator wallet, and it keeps paying for as long as anyone trades. It needs no emission schedule, no treasury sale, no counterparty and no promise about the future. It is the one cash flow that exists whether or not the project ships anything else — and by default it accrues to exactly one wallet and stops there.

The obvious use for that revenue is to buy back and distribute the token itself. That is circular, and the circularity is not cosmetic. Paying holders in the asset whose price you are supporting means the reward and the thing being rewarded are the same instrument: every distribution dilutes the recipient's own position the moment they sell it, the "yield" is denominated in a unit whose price is set by the same order book you are buying into, and the number only goes up for as long as the buying continues. It is a mechanism that reads as revenue and behaves as reflexivity.

Paying in a different asset breaks the circle. The reward then carries a price this token's order book has no part in setting, a staker selling their reward does not press on the thing they are staking, and the distribution can be denominated in something with an external mark rather than in units of hope.

That is the whole premise. Everything after this section is what it costs to do it without hurting the people it is meant to pay.

02Why tokenized equities

The reward asset has to satisfy four constraints simultaneously:

  1. Externally priced. Its mark is set by a market that has nothing to do with $STOCKPILE.
  2. Genuinely transferable. A staker must be able to take custody of it, in their own wallet, and do whatever they like with it afterwards.
  3. A claim on something. Backed and redeemable through an issuer, rather than a wrapper around sentiment.
  4. Settleable on Solana inside one transaction, cheaply enough that paying hundreds of recipients is not itself the cost centre.

xStocks satisfy all four. They are Token-2022 SPL tokens issued by Backed Finance, 8 decimals, carrying an Xs vanity mint prefix, each tracking one share of a real equity or ETF and redeemable through the issuer. When a staker withdraws, what lands in their wallet is the Token-2022 token itself — not an IOU in this database, not a synthetic balance that only exists on this site.

They also introduce a problem that does not exist for SOL or USDC, and section 03 is entirely about it: the on-chain liquidity of a tokenized equity has no relationship to the size or fame of the underlying company.

03The liquidity gate

Recognisability and on-chain liquidity are uncorrelated. This is the single most important empirical fact in the system, and almost every naive version of this idea gets destroyed by it.

A token appearing in a token list tells you that it exists. It does not tell you that $500 of it can be bought without moving the price by 90%. To find out, you have to quote it. The tables below are measured price impact from live Jupiter ExactIn quotes (SOL → stock), recorded in src/stocks.js on 2026-08-06.

SymbolCompanyImpactTier
AAPLxApple0.026%deep
TSLAxTesla0.034%deep
SPCXxSpaceX0.037%deep
SPYxS&P 5000.052%deep
NVDAxNVIDIA0.108%deep
QQQxNasdaq 1000.183%core
MSTRxMicroStrategy0.367%core
MSFTxMicrosoft0.534%core
PLTRxPalantir1.314%thin
Table 1 — a sample of the tradeable set. 23 names make up that set, each in src/stocks.js with the impact that admitted it, measured at a 1 SOL buy. How many are eligible is a different and smaller number, decided live: the tier ceiling narrows the shortlist, and the gate then judges every candidate again at the exact size about to be spent. The Rotation view shows that count in real time, and it moves.
SymbolCompanyImpactVerdict
NFLXxNetflix6.140%was in the previous rotation
VxVisa6.932%rejected
TQQQxTQQQ15.290%rejected
PEPxPepsiCo15.695%rejected
IBMxIBM25.373%rejected
GSxGoldman Sachs48.841%rejected
CSCOxCisco91.667%rejected
JNJxJohnson & Johnson96.712%rejected
HONxHoneywell99.968%pool is a rounding error
CMCSAxComcast99.983%rejected
CRMxSalesforceno routeno pool at all
Table 2 — measured and rejected. 27 names in total, each kept in the source with the figure that disqualified it, so nobody re-adds a famous ticker without seeing what buying it would cost a staker. A rotation built from household names would have bought every row here. These are quoted at a 5 SOL buy — a deliberately harder test than Table 1's 1 SOL, because a name that fails at size will fail a real cycle.

Depth is not impact

Price impact answers "what would this trade cost". It does not answer "how big is the book", and for something that has to keep buying every cycle those are different questions. Pooled liquidity is read separately, live, from Jupiter's market data:

SymbolPooled liquidityHoldersImpact @5 SOL
XOMx$4,9242,5370.4255%
MCDx$68,8703,9950.4174%
GLDx$150,2166,0090.0135%
SPYx$2,535,95126,6580.0250%
Table 3 — one probe cycle, 2026-08-06. Impact and depth are not the same measurement, and the first two rows prove it: XOMx and MCDx quote within 0.01 percentage points of each other across books that differ by 14×. The last two make the point harder still — GLDx reads a lower impact than SPYx on a book one-seventeenth the size. Impact tells you what this trade costs; depth tells you whether the venue survives the next hundred. STOCKPILE gates on the first and publishes the second.

A static list decays

The decisive argument against hardcoding a ticker list is not that a bad list exists — it is that a good list stops being good. GMEx measured 0.302% on one day and 3.961% the next: a 13× move in twenty-four hours, in a name that had already been tiered as comfortably tradeable on the first reading. Worse, the second reading was flat at ~3.95% across 0.05, 0.25 and 1 SOL, which is the signature of a fee-heavy pool rather than a shallow one — so trading smaller does not help.

NFLXx is the same lesson on a longer timescale. It was in the previous generation's rotation. Its pool has since drained to 6.14%, and nothing about the ticker changed to announce it.

Two layers, two different jobs

Depth is a property of the moment, not of the ticker. So the system measures continuously and splits the work in two, with deliberately different tolerances for being wrong:

Layer 1 · ranking
probeUniverse()

A periodic sweep of the whole universe at three sizes (0.25, 1 and 5 SOL), ascending so a size that fails to route ends the walk instead of paying for quotes that can only repeat the answer. Runs on boot and every LIQUIDITY_REFRESH_MINUTES, paced at 150 ms between requests with four retries on exponential backoff, because a 429 misread as "no liquidity" would delist a perfectly good stock. It powers the ordering and the Rotation dashboard. It cannot authorise anything.

Layer 2 · authorisation
gateForSpend()

One quote, for this stock, at this cycle's exact lamport size, taken seconds before the swap. It is the only thing in the system that can approve a buy, and it approves nothing it cannot verify.

The gate fails closed, and the failure modes are enumerated rather than collapsed: no route is a refusal; a quote that comes back without a price-impact figure is a refusal, not a zero sorted to the top of the list; an impact above the cap is a refusal with the number attached. The distinction the probe draws between ok === false (measured over the cap) and ok === null (never got a straight answer) matters for the same reason: those are different claims, and only the first removes a name from the rotation. An unanswered stock stays in, because the gate will still stop a bad buy — and being wrong there costs one skipped cycle instead of a delisting.

Layering is what buys that leniency. The probe is allowed to be approximate precisely because nothing it says can move money. And because pickStock() walks the rotation rather than failing on the first refusal, a temporarily thin name costs itself one turn instead of costing the platform a whole cycle.

GMEx is kept in the table on purpose, and it is the honest edge case. At the 1.5% cap the gate skips it on every cycle and the Rotation page says so with the live number next to it. Silently dropping a name people are looking for teaches nobody anything; showing GME sitting at 3.96% and being refused shows the gate working. If that pool tightens, it gets bought automatically, with no code change. That is the entire point of measuring instead of hardcoding.

04Reward accounting

Rewards use accumulated-reward-per-share — the Synthetix/MasterChef pattern — generalised from one reward asset to N, because here every cycle pays a different xStock and a staker accumulates a basket rather than a balance. There is one accumulator per mint.

on distribution:
  acc[mint] += distributed[mint] × 1e18 / totalStaked

pending(user, mint):
  staked × acc[mint] / 1e18  −  debt[user][mint]
ACC_PRECISION = 1e18. Every quantity is a BigInt in base units, held as a decimal string. No float touches an amount anywhere on this path.

The obvious implementation — loop over every staker each cycle and add their slice — is O(stakers) per cycle and rewrites the entire user table every five minutes. The accumulator makes a distribution write exactly one number per mint, so the cost of settling a cycle is O(1) per stock regardless of staker count. A user's unsettled reward is derived on read, touches no other user's row, and is exact.

Dust is carried, never dropped

Both operations are integer division and both floor. What the accumulator can actually pay out is inc × totalStaked / 1e18, which is less than or equal to the amount available; the shortfall is the rounding remainder and it is written into dust[mint] and added to the next distribution of that stock. No base unit is lost and none is silently gifted to whoever happens to sort first. With no stakers at all, the entire amount is carried rather than credited — otherwise the first person to stake afterwards would inherit every cycle that preceded them.

The two cases that make it correct

Case A

An existing staker earns a brand-new stock's first distribution

The first time a stock is ever bought, no staker has a reward-debt entry for it. debtOf returns 0n for a missing key, and the accumulator also started at zero, so their pending resolves to exactly their proportional share of that first distribution. Correct — they were staked for it.

Case B

A new staker earns none of the history

The mirror case is the one that bites. A user who stakes after a stock has already paid out must not receive a share of that history, so syncDebt iterates every mint the platform has ever credited — not just the ones this user already has an entry for — and stamps the current accumulator on all of them. Miss that and a fresh staker retroactively claims every past cycle.

Both stake and unstake settle before the weight changes, so a change in position size never rewrites what the previous position already earned. Rewards accrue right up to the instant of unstaking, and not one block past it.

05Payout architecture

The naive version of paying stakers is one line: treasury → holder, repeat. It works, and it also draws a picture. Every explorer and bubblemap tool renders "one wallet funded these 400 accounts" as a single bright hub, which is the exact visual signature of a farmed token. The holders are real, the payouts are real, and it still looks fake.

So every payment is routed through a relay: a keypair generated in memory, funded, used and emptied inside one atomic transaction.

  1. 1Treasury sends the relay exactly (1 + newAtaCount) × rent lamports.
  2. 2The relay opens its own Token-2022 associated token account for the stock, paying its own rent.
  3. 3Treasury sends the batch total into the relay's account in a single transferChecked.
  4. 4Per recipient: the relay opens their token account (idempotent, relay pays the rent) and transfers their slice.
  5. 5The relay closes its now-empty token account; that rent refunds to the relay.
  6. 6The relay returns exactly one rent to the treasury, leaving itself at zero.

The consequence is that the on-chain funder recorded against every holder's token account is a wallet which, by the time the transaction confirms, holds 0 lamports and 0 token accounts — and is therefore pruned by the runtime. The link exists for the length of one transaction, and then the account it pointed at no longer exists. A different relay handles every batch and every retry, so there is no second edge to join them back up.

The funding in step 1 has to be exact. A relay that ends with a balance is a relay that survives as a visible account, so the number of accounts it pays for must match the number it was funded for. Where that count cannot be read reliably, the code deliberately over-estimates: under-funding fails the batch outright, while over-funding strands one rent in a dead wallet, which is the cheap direction to be wrong in.

Atomicity is what makes this safe rather than clever. The funding, the transfers and the sweep are one transaction, so there is no state in which a relay is sitting on user funds. Either the whole batch lands or none of it did, and the retry starts again from a fresh keypair. Net SOL cost to the treasury is unchanged from paying holders directly — newAtaCount × rent plus the network fee. The relay is a detour, not a tax.

The wire format sets the batch size

A batch is a legacy transaction and it has to fit inside Solana's packet limit. Measured, at seven recipients:

1179
bytes serialized, 7 recipients
1232
Solana packet limit
~1270
bytes at 8 recipients — over

At eight recipients the message is roughly 1270 bytes (25 account keys × 32, two signatures, ~305 bytes of instructions), serialize() throws on every attempt, and the whole run reports everybody unpaid. The batch size is therefore hard-capped at 7 by the wire format rather than by preference, and the compute budget is raised to 400,000 units because the 200k default truncates the tail of a full batch and fails the transaction.

Retries must not double-pay

A transaction the client stopped waiting for can still land inside its blockhash window. Before signing any replacement, every already-submitted signature is re-checked; then the code waits for the previous attempt's blockhash to become permanently unlandable — polling block height against lastValidBlockHeight — while continuing to watch for a late landing. A blockhash stays valid for roughly 60–80 seconds while confirmation gives up at about 50, so without that wait a replacement can be signed while the original is still perfectly landable and both can execute. A duplicate payout is unrecoverable; a slow one is not.

For the same reason, "never left the building" and "on the wire but unconfirmable" are reported as different outcomes. A batch the RPC accepted but nobody could confirm comes back marked unconfirmed, with its signatures, and is explicitly not declared unpaid — a withdrawal refunds a user's balance on a definite failure and must never refund a transfer that lands a minute later.

06Treasury safety

The treasury wallet holds the operator's own SOL and receives creator fees into the same address. The bot must therefore be structurally incapable of spending the former. Its budget is not the wallet balance — it is a decoupled ledger, claimPoolLamports, which only grows by the measured balance delta across a claim, and only shrinks by SOL observed to have left.

Both figures come from on-chain reads taken immediately before and after the action, never from a quoted or requested number. This is not fastidiousness: pump.fun's fee API returns a signature and nothing else — no amount, no receipt, no breakdown — so the only trustworthy answer to "how much did we just earn" is the treasury's own balance. A hopeful parse of a field that stops meaning what it used to would otherwise inflate the pool and authorise spending SOL that never arrived.

Two consequences follow from measuring rather than trusting:

  • The delta is net of the fee just paid to claim. That is correct — the spendable pool should only grow by what actually landed.
  • A confirmed claim with a zero delta is a success, not a failure: it means there were no fees to collect. Escalating the priority fee and retrying would burn SOL to re-learn the same thing, so only a claim that never confirms is retried.

What the ledger cannot know

A balance delta cannot distinguish fee income from any other SOL that happens to arrive in the same window — a top-up, a sale, a mis-sent transfer would all read identically, and all of them would be spent on stock and become unrecoverable. That ambiguity is handled explicitly rather than hidden: a single-cycle claim above MAX_CLAIM_SOL is quarantined into a held balance, nothing is spent, and a human decides. If it really was fee income, release it; if it was a mistaken transfer, leave it. Fee wallets should only ever receive fees.

The floor

spendable = min(
    pool × (100 − RESERVE_PERCENT) / 100,   // the ledger's permission
    balance − TREASURY_FLOOR_SOL            // the wallet's physical limit
)
The ledger says what may be spent; the wallet says what exists. Take the smaller.

The floor is never crossed, so a transaction fee can always be paid even if the accounting drifts. Above that, the rent for opening stakers' stock accounts is subtracted before the swap size is computed, so the buy cannot consume the SOL the payout still needs. A cycle whose spendable pool falls below MIN_CYCLE_SOL is carried over rather than executed thinly.

Signing discipline and custody

  • The claim path never blind-signs a transaction handed back by a remote service. It must require exactly one signature and that signer must be this treasury, or it is refused; the blockhash is replaced with a fresh one before signing, since the one baked in was minted before the round-trip.
  • The treasury keypair is a private class field, so serialising a claimer into a log line, an API response or an error dump cannot leak it.
  • Deposit-wallet private keys are AES-256-GCM encrypted at rest. Relay keypairs are generated at runtime and never stored at all.
  • Changing a withdrawal address starts a cooldown before it can be used, so a stolen session cannot instantly redirect funds.
  • Solvency is computed publicly: liabilities from the ledger, assets read from the chain. A liability that cannot be priced is counted in full in token units and never netted to zero, and an unreadable chain reports null — an unknown result is never rendered as a pass.
  • Boot refuses fatal misconfigurations outright: live mode with demo mode on, live mode without an encryption key or treasury key. Any value still matching a published .env.example placeholder is treated as unset, so an operator who pastes a real treasury key and overlooks the encryption key cannot boot live behind a master key every reader of the repository knows.

07Verification

On 2026-08-06 every one of the 25 xStocks then listed in the universe was bought for real on Solana mainnet, in one run, from one funded wallet.

25
swaps executed
0
failures
25 / 25
fills reconciled to the token account, to the base unit
Line itemSOLDetail
Token-account rent0.05394025 new accounts × 0.002158, one-time
Network fees~0.002625across 25 transactions
Swap size0.02000025 × 0.0008 SOL
Total spent0.076565from a 0.100000 SOL balance
Table 4 — the cost of proving the buy path end to end.

Three names filled above the 1.5% impact cap: GMEx at 3.956%, UNHx at 1.960% and AVGOx at 1.882%. The routes existed and the swaps landed — that run was a buy-path proof, not a production cycle, and the gate is what a production cycle consults. UNHx and AVGOx were then moved to the rejected set with the numbers that disqualified them, because a name the gate refuses on every cycle is not a candidate, it is noise in the rotation. GMEx was kept, for the reason given in section 03.

Re-running it

None of this asks to be taken on trust. Every claim above is reproducible from the repository against live mainnet, and the read-only checks cost nothing:

npm run probe          # re-measure the whole universe from live Jupiter quotes
npm run verify-chain   # transaction sizing, routing, ATA rent, relay-batch construction
npm run verify-buys    # simulate the real swap for every stock against current chain state
All three are read-only. verify-buys takes a live quote, asks Jupiter's swap endpoint for the actual transaction, deserializes it and simulates it against the RPC — the post-execution token balance is the proof, and nothing is broadcast. Executing for real is a separate, deliberately awkward flag (--execute --yes-spend-real-sol) that nothing in the repository runs for you.

Expect the probe to disagree with the tables in section 03. That is the thesis, not a defect: depth moves, and a paper that reproduced identically a month later would be describing a static list.

08Risks and limitations

This is not investment advice and nothing here is a licensed financial product recommendation. Read this section before staking anything you cannot afford to lose.

  • The design is custodial. Staked tokens and unwithdrawn rewards sit in one treasury address. That is a single high-value target, by construction. Encrypted deposit keys, the withdrawal cooldown and published solvency reduce the blast radius; none of them make it non-custodial. Only stake what you accept could be lost to a compromise, a bug or an operator error.
  • Rewards are fee-funded and therefore volume-dependent. There is no yield, no APY, no emission and no promise of a return. If trading volume stops, distributions stop. A cycle with nothing to claim distributes nothing and creates no debt owed to anyone.
  • $STOCKPILE is a volatile memecoin and can go to zero. Staking it does not protect its price.
  • xStocks carry issuer risk. They are third-party tokenized products. Their redeemability, pricing and continued on-chain liquidity are outside this platform's control.
  • The gate protects the entry, not the exit. It measures SOL → stock impact at buy time. A staker selling later faces whatever that pool has become — and section 03 is a catalogue of how fast that can change. NFLXx at 6.14% is what it looks like from the wrong side.
  • Balance-delta accounting is coarse. It cannot tell fee income from a mis-sent transfer. The claim cap is a backstop, not a classifier.
  • Tokenized equities may be restricted where you live and may not be available to US persons. Checking your own jurisdiction is your responsibility, not this site's.
  • Infrastructure fails. RPC endpoints, Jupiter routes and the creator-fee API all have bad days. A failed cycle carries over; it does not create a debt.
  • There has been no third-party audit, and there is no partnership, endorsement or guarantee of any outcome. Nothing on this page should be read as claiming otherwise. The source is the specification: read it.

09Parameters

Every knob is an environment variable with a default, and the defaults are the safe ones: out of the box the platform boots into a simulation that moves no funds, so the whole system is explorable before a single key exists.

ParameterDefaultControls
DRY_RUNtrueMaster switch. Nothing on-chain is signed or sent; reads only.
DEMO_MODEtrueSynthetic fees and seeded stakers. Only legal alongside DRY_RUN — the combination with live mode is a fatal boot error.
CYCLE_INTERVAL_SECONDS300Claim → gate → buy → distribute, once per interval.
MAX_PRICE_IMPACT_PCT1.5The gate. A live quote above this refuses the buy.
MAX_TIERcoreHow deep into the measured tiers the rotation reaches: deep, core or thin.
LIQUIDITY_REFRESH_MINUTES30How often the universe is re-measured, so ranking tracks reality rather than the seeded table.
SWAP_SLIPPAGE_BPS150Slippage tolerance on the Jupiter swap. Floored at 10.
RESERVE_PERCENT10Held back from every claim as the SOL gas and rent buffer.
MIN_CYCLE_SOL0.02Below this the cycle is skipped and carried over.
TREASURY_FLOOR_SOL0.05Hard floor. Never spent below, whatever the ledger says.
MAX_CLAIM_SOL25Single-cycle claims above this are quarantined for a human. 0 disables.
PLATFORM_FEE_BPS0Optional operator cut taken before stakers are credited. Capped at 2000.
PAYOUT_BATCH_SIZE6Recipients per relay transaction. Clamped to 7 by the packet limit.
MAX_RECIPIENTS_PER_CYCLE600Safety bound on a single distribution; largest weights are paid first.
PRIORITY_FEE_SOL0.0005First-attempt priority fee. Doubles on each retry.
ATA_RENT_ESTIMATE_SOL0.0023Fallback rent figure when the on-chain lookup fails, so one RPC hiccup cannot abort a run.
MIN_STAKE0Checked against the resulting position, not the increment, so topping up stays possible.
MIN_WITHDRAWAL_SOL0.001Floor on a SOL withdrawal.
WITHDRAWAL_CHANGE_COOLDOWN_MINUTES60Anti-drain delay after a withdrawal address changes.
SWEEP_EVERY_TICKS3How often deposit wallets are swept into the treasury.
MINT_WATCH_POLL_SECONDS20Poll interval when the mint is set to auto-detect from the treasury.
Table 5 — the live tunables, read from src/config.js.

The mechanism is small enough to hold in your head and every number in this document came out of the source or a mainnet transaction. If a claim here cannot be reproduced, it does not belong here.