Mechanics
What the reflex is, why it has the shape it has, and what it cannot do.
The baseline it modifies
pump.fun is a constant-product AMM with virtual reserves. A coin opens at x₀ = 30 virtual SOL and y₀ = 1,073,000,000 virtual tokens, holding k = x·y fixed. Of the 1B supply, 793.10M sits on the curve. A buy returns Δsol · y / (x + Δsol).
Clearing the curve therefore takes 85.005 SOL — that's k/(y₀ − 793.10M) − 30, not a magic number — putting market cap at ~411 SOL, the familiar ~$69k. Then it migrates to PumpSwap. Fees are 1.25% on the curve, split 0.30% creator / 0.95% protocol.
The reflex
The curve discounts SOL that arrives too fast. Resistance rises with flow, and with how much of your own order has already landed:
R(u) = min( base · e^(a·u), maxR ) base = e^(α · F₀ / fTarget) a = α / (fTarget · τ)
F₀ is an EMA of SOL/sec already moving through the curve, decaying with time constant τ. u is how much SOL of your own order has landed so far. Only the integral solEff = ∫₀^S du/R(u) counts toward moving the price:
solEff(S) = (1/base) · (1 − e^(−a·S)) / a
The rest is set aside as retained. It is not a fee. Nobody can claim it — not the creator, not the protocol. It sits in the pool and migrates into the LP at graduation.
Why this exact shape
- 01It includes your own order. Resistance depends on
u, so the first trade into a fresh curve is already resisted. A reflex that only looked backwards would see zero flow att = 0and wave the sniper straight through — and the block-zero sniper is the entire population it exists to stop. This was a real bug in the first draft of the engine: the sniper gotR = 1.00xand beat the patient buyer. - 02It is exactly split-invariant. Break
SintoS₁ + S₂and the second piece starts frombase·e^(a·S₁), so the integrals telescope:(1−e^−ᵃˢ¹) + e^−ᵃˢ¹(1−e^−ᵃˢ²) = 1 − e^−ᵃ⁽ˢ¹⁺ˢ²⁾. Identical for any number of slices, any sizes, across any number of wallets. Chopping the order up buys you nothing — verified at 0.0000% gain across 1, 5, 25 and 100 slices. - 03It keeps x·y = k exact. The reflex only decides how much SOL is allowed to push the curve; the curve itself stays a pure CPMM. So
retainedis a clean auditable bucket rather than a drift in the invariant.
exp is not exp of the average — under that formulation slicing a 50◎ order into 100 pieces recovers ~27% of the penalty. The SOL-side integral is the version that actually closes the hole.Try it
= 7.50 ◎/sec · calm pace for STANDARD is 0.5 ◎/sec
tokens received
449.84M
flat curve: 533.13M
penalty
15.6%
1.90x resistance at the end
retained for LP
7.97◎
never claimable by anyone
Drag over to the right and watch the penalty collapse. Identical SOL, identical curve — the only variable is how fast you spend it.
Sells are damped, not blocked
A panic dump is velocity too. Sells are haircut by the same closed form — so dump-splitting is equally pointless — but with their own ceiling well below the buy ceiling: 1.25x to 2x depending on preset, against 2.5x to 8x for buys.
That gap is deliberate. A damper that ate 60% of an exit would be indistinguishable from a honeypot, whatever the intent. The worst case has to stay visible and survivable, and the haircut goes to the LP rather than to whoever sold fastest.
What it does not do
The reflex taxes speed, not earliness. A patient bot buying 0.05◎ every thirty seconds pays essentially no resistance and accumulates the same bag as it would on a flat curve. Nothing here prevents that.
What dies is the block-zero blitz — the 50◎ single-shot that front-runs an entire launch before a human can react. That is a narrower claim than "bot-proof," and it is the accurate one. Anyone promising bot-proof is selling something.
It also cannot stop a bot that simply waits. Slowing the fast money down is the mechanism; the reward is that a human refreshing the page has a real chance of buying near the same price as the machine.
On-chain, honestly
None of this is deployed. If it were, three things would be genuinely hard, and it is worth naming them:
- 01No exp() or ln() on Solana.The closed form needs both. They'd have to be fixed-point, and every rounding decision becomes a security question — the invariant being that rounding always favours the pool, never the trader.
- 02The EMA needs a trusted clock. Slot is the honest choice over timestamp. Multiple sniper transactions land in one slot with
dt = 0, which is exactly when the reflex matters most — the self-inclusion term is what saves you there. - 03Same-slot ordering is adversarial. Jito bundles let a sniper guarantee first position. Self-inclusion means being first stops helping much, but that wants verifying against real bundle behaviour on devnet, not assuming.