Using Holdfill
Before you start
- A Solana wallet such as Phantom, Solflare, or Backpack. The wallet only signs. Holdfill relays the transaction to devnet, so the wallet's own network setting doesn't matter.
- Orders use devnet replica tokens. Nothing on mainnet moves. Market prices shown in the app come from mainnet.
- PreStocks are unavailable in the U.S. and to U.S. persons. Read the issuer's terms.
Set an order
- Connect your wallet and open the app.
- If you hold no replica SPACEX, use the faucet. It sends 1 replica SPACEX (5 shares) and a little devnet SOL for fees if your wallet is low.
- Pick the amount, the largest gap you accept, a fallback date, and a fallback floor.
- Sign once. That transaction creates the order and approves the order program for that amount only.
Order terms
- Entitlement
- What the issuer says one raw SPACEX converts into: 5 SPCXx, one per share after the 5x split.
- Gap
- How far a payout falls below entitlement, fees included. A 29% gap pays 3.55 SPCXx per raw token.
- Limit
- The largest gap you accept, up to 60%. A 20% limit requires at least 4 SPCXx per raw token.
- Fallback date
- From this date the fallback floor replaces your limit. It must fall before the issuer deadline.
- Fallback floor
- The least you accept after the fallback date, as a share of entitlement: 40, 50, 60, or 70%.
- Issuer deadline
- 12 March 2027, 23:59 UTC. The program refuses every fill after it.
Other PreStocks: price orders and arming
Only SpaceX has an issuer conversion event today. For Anthropic and OpenAI, the app offers two order types on devnet replicas, against replica USDC.
- Sell at your price
- Set the least USDC per token and an expiry of 30 to 365 days. The program checks that the pool trades exactly this token against USDC, and never lets the order outlive an issuer deadline.
- Arm for the IPO
- Set the largest gap from the future entitlement, a fallback of 7 to 90 days before the future deadline, and a floor. Nothing sells until the issuer names a successor. The keeper then copies the issuer's terms into the order and fills at your limit. If no event comes, the order never fills.
Jupiter's trigger API refuses every PreStocks mint because of the transfer fee; the markets page checks this live. The demo shows a recorded arm, a simulated issuer event on a separate demo token, activation, and fill.
How a fill works
A keeper checks open orders every 10 seconds. When the pool quote meets your minimum, it calls the program's execute instruction. Anyone can call execute, and you can press Check now to run one pass yourself.
The program swaps through the Meteora DLMM pool as your approved delegate, measures what reached your SPCXx account, and reverts the whole transaction if it's below your minimum. Orders can fill in parts. The keeper sells the largest amount that still meets your terms.
Every fill also checks that the pool, mints, and token accounts match the order, the issuer hasn't paused the token or changed its transfer fee since you signed, your approval covers the amount, and the deadline hasn't passed.
One order per token
Each wallet has one order per token at a time. A token account can approve only one delegate for one amount, so a second order would silently replace the first order's approval.
To change your terms, revoke the open order and set a new one. After a full fill, close the order. Closing returns the order account's SOL deposit.
Revoke
Revoke closes the order and removes the approval in one transaction. Anything already filled stays in your wallet. After that, nothing can fill, and a fill attempt fails on chain. See the recorded example.
Faucet limits
- The faucet only tops up wallets holding less than 0.5 raw replica SPACEX (2.5 shares).
- Each token has its own faucet limit. A wallet with an open order or remaining tokens can request once per hour. A wallet that sold everything and closed its order can refill right away.
- The faucet sends at most 20 grants per hour across all wallets.
Devnet addresses
- Order program
- A6Uh...aSGV
- Lifecycle event
- GZ1k...MUsQ
- Replica SPACEX
- 5cY1...Ghsu
- Replica SPCXx
- 4gG3...HitZ
- SPACEX / SPCXx pool
- 5XhZ...jLzM
- Replica USDC
- BD2B...c88i
- Replica ANTHROPIC
- GNYx...oC2g
- ANTHROPIC / USDC pool
- BtUc...qYhr
- Replica OPENAI
- D5nC...P4tX
- OPENAI / USDC pool
- Gv78...gbPF
Public API
Read endpoints return JSON and need no key.
- GET /api/market
- Live mainnet quote, pool fee, transfer fee, and the issuer's conversion value.
- GET /api/markets
- Every PreStocks market: holders, value at mark, pool price, issuer fee, Jupiter Trigger result, and lifecycle events.
- GET /api/issuer
- Open Holdfill orders on devnet by market, with live approvals, coverage, and conversions.
- GET /api/history
- Daily close gap since listing, with dated unlocks.
- GET /api/backtest?limit=2000
- How many trading days a limit, in basis points, would have filled.
- GET /api/position?owner=&market=
- Mainnet balance (read only), devnet replica balances, the devnet quote, and the open order. market is SPACEX (default), ANTHROPIC, or OPENAI.
- GET /api/orders?owner=&market=
- Order history from on-chain events.
- GET /api/jupiter-check
- Live test that Jupiter's trigger API refuses the PreStocks mint.
- GET /api/program
- The order program's current upgrade authority.
Verify it yourself
The proof page links every recorded devnet transaction and the local fork proof, which runs the same program against cloned mainnet mint and pool state. The evidence page shows the market data behind the product.