The principle: fresh reads, never cached marks#
Every fill is priced from a fresh on-chain read of the token's market account at execution time — the bonding-curve account for curve-stage tokens, the pool vault balances for graduated tokens. Fills never come from a cached tick, a chart price, or a third-party API.
This is both the honesty guarantee and the anti-exploit guarantee: nobody — not you, not us — can trade against a price that no longer exists on-chain. If a fresh read cannot be obtained, the order is rejected rather than filled at the last known price. The engine fails closed.
What happens when you place an order#
The pipeline, in order (this is a real sequence, not marketing):
- Your order enters a per-account queue — one order at a time per account.
- Pre-trade checks: account active, token allowlisted and live, balance sufficient, impact pre-check.
- Fresh read of the curve or pool account from the chain.
- Exact venue quote math on that snapshot — the same formulas the venue's on-chain program uses, including its swap fee and your price impact.
- Bound checks: quoted impact ≤ 2.5% cap, and execution price within your slippage tolerance of your reference price. Either failing rejects the order.
- The fill is journaled and committed atomically — order, fill, position, cash, and equity in one transaction — then returned to you with the full breakdown.
The engine path runs in roughly 250 to 600 ms; end-to-end you should see fills confirm in under a second. If the engine, the RPC provider, or the database is down, orders reject with an error — nothing executes later at a price you never saw.
Where prices come from#
| Stage | Source | Price basis |
|---|---|---|
| Bonding curve | curve account (fresh read + live push) | curve reserve state |
| Graduated (AMM) | pool vault accounts | vault reserve ratio |
| Migrating | orders frozen | last curve price (mark only) |
Marks for your open-position equity come from the same accounts via live subscriptions, so the price you see is the price the risk engine sees. The SOL/USD rate used to express fills in USD is taken from independent sources and snapshotted onto every fill record. An external aggregator is used only as a divergence watchdog — never as a pricing source.
The fees, itemized#
Every fill charges exactly three visible components:
- Venue swap fee— the launchpad's own fee, computed by the venue's math at its current on-chain rate (about 1% on pump.fun curve trades), not a number we invent.
- Network fee — a fixed modeled base + priority fee per order, denominated in SOL and converted at the snapshotted SOL/USD rate. It is shown before you confirm.
- Price impact— not a separate charge, but the real cost of your size against the curve or pool depth, exactly as the venue's formula moves the price. Shown in percent on the preview and the receipt.
There are no spreads added on top, no per-trade commissions, and no funding or overnight charges.
What a fill receipt looks like#
- Cash debit
- $250.00
- Into swap
- $247.30
- Venue swap fee (1%)
- $2.47
- Network fee
- $0.23
- Price impact
- 0.31%
- SOL/USD at fill
- $171.25
- Price source
- curve (fresh read)
Sample values. Your receipts carry the same lines with the real numbers, plus the raw market snapshot behind the quote.
What we deliberately don't model#
Some on-chain realities cannot be simulated honestly, so we don't pretend:
- Your transaction landing.Real orders race for block inclusion; simulated orders don't. We charge a fixed priority fee instead of modeling leader schedules or bundle auctions.
- Sandwiches and MEV against you. No simulated attacker front-runs your order.
- The market reacting to your order.Your fill math includes your full price impact, but the real pool never sees your size — other traders don't react to an order that doesn't exist on-chain.
- Failed transactions and partial fills. Orders either fill completely against the snapshot or reject cleanly.
You cannot be sandwiched here — but you also cannot capture MEV, snipe a bundle position, or profit from mechanics that require your transaction to exist on-chain. The simulation charges you the full impact your size would cause and gives you none of the games around it.
Migration freezes#
When a curve token completes and migrates to its AMM pool, there is a window where no honest price exists. During it:
- New orders are rejected with TOKEN_MIGRATING.
- Open positions are marked at the last curve price for equity purposes.
- Trading resumes automatically when the canonical pool is live.
- If a pool hasn't appeared within 30 minutes, positions are force-closed at the last mark and the case goes to admin review — you will see it on the account timeline.
Stale prices and capacity#
Live subscriptions carry a budget. Tokens with open positions or resting orders hold the highest priority and are never evicted; a viewed token that loses its live subscription degrades to 2–5s polling and is badged as delayed pricing in the UI. A 1-minute divergence watchdog compares our marks against an external aggregator and freezes anything that drifts.
If the budget is fully saturated, orders on new tokens are rejected with PRICE_FEED_CAPACITY rather than silently filled on degraded data. We would rather reject your order than fill it at a price that no longer exists — that trade-off is the whole policy in one sentence.
Rejection codes#
| Code | Meaning |
|---|---|
| IMPACT_CAP | Order would move the simulated price > 2.5% |
| SLIPPAGE | Fresh-read price moved beyond your slippage bound |
| TOKEN_NOT_TRADEABLE | Mint is not from an allowlisted launchpad |
| TOKEN_MIGRATING | Curve → pool migration in progress |
| PRICE_UNAVAILABLE | No fresh on-chain read could be obtained |
| PRICE_FEED_CAPACITY | Live feed budget saturated |
| INSUFFICIENT_BALANCE | Notional + fees exceed available cash |
| ACCOUNT_NOT_ACTIVE | Account is breached, completed, or closed |
| RATE_LIMITED | Too many requests; retry shortly |
Records and disputes#
Every fill stores the raw market snapshot it was quoted against — the curve or pool reserve state — plus the SOL/USD rate used, permanently attached to the fill. Every breach stores the tick evidence that triggered it. Nothing about your account's history is reconstructed after the fact; it is recorded at the moment it happens.
If you believe a fill is wrong, contact support@fullportcapital.co with the fill id. We will reproduce the quote from the stored snapshot and show the math — the same math this page describes. See also the rulebook.