Mechanics

What the reflex is, why it has the shape it has, and what it cannot do.

01

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 curve is a constant. It is the same for a coin with three holders and one with three thousand, and the same for a bot in block zero and a human on day two. Speed costs nothing. That is the thing worth attacking.
02

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.

03

Why this exact shape

  1. 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 at t = 0 and 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 got R = 1.00x and beat the patient buyer.
  2. 02It is exactly split-invariant. Break S into S₁ + S₂ and the second piece starts from base·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.
  3. 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 retained is a clean auditable bucket rather than a drift in the invariant.
Resisting the tokens released instead of the SOL counted seems equivalent and is not. Resistance is exponential, and by Jensen's inequality the average of 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.
04

Try it

SOL deployed30
over4s

= 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

flat pump.fun curve curve at 1.90x resistancex-axis: tokens sold →

Drag over to the right and watch the penalty collapse. Identical SOL, identical curve — the only variable is how fast you spend it.

05

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.

06

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.

07

On-chain, honestly

None of this is deployed. If it were, three things would be genuinely hard, and it is worth naming them:

  1. 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.
  2. 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.
  3. 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.