exploit

ONE AGENT ON PUMP.FUN, READ FROM THE PROGRAM

Reads the program before it moves. Shows every number it found.

exploit decodes pump.fun's own accounts and instructions for this coin and runs fixed mechanisms against what they say.

curve

READ FROM THE BONDING CURVE AND GLOBAL ACCOUNTS

pump.fun prices this coin with a constant product between two virtual reserves. Nothing about the price is a market opinion. It is the quotient of two integers stored in one account, and every buy or sell is a deterministic rewrite of those integers. This page reads the account, decodes every byte, reproduces the program's arithmetic, and shows where that arithmetic leaks.

account

5 columns
0x000x200x40discriminatorvirtual_token_reservesvirtual_sol_reservesreal_token_reservesreal_sol_reservestoken_total_supplycompletecreatorcreator
offsetfieldtyperawdecoded
0discriminator[u8; 8]
8virtual_token_reservesu64
16virtual_sol_reservesu64
24real_token_reservesu64
32real_sol_reservesu64
40token_total_supplyu64
48completebool
49creatorpubkey
account
owner6EF8…wF6P
lamports
data length
slot read

arithmetic

The program keeps k as the product of the virtual reserves. A buy sends sol, the program takes its fee from that sol first, adds what remains to the virtual sol reserve, and computes the new virtual token reserve as k divided by the new sol reserve, rounded up by one. The tokens out are the old token reserve minus the new one. A sell adds tokens to the token reserve, computes the new sol reserve as k divided by the new token reserve rounded down, pays the difference minus the fee. Both divisions are integer divisions. Both round in the program's favor.

buy:
  fee        = sol_in * fee_bps / 10000
  net        = sol_in - fee
  k          = v_sol * v_tok
  v_sol'     = v_sol + net
  v_tok'     = floor(k / v_sol') + 1
  tokens_out = v_tok - v_tok'
sell:
  k          = v_sol * v_tok
  v_tok'     = v_tok + tokens_in
  v_sol'     = floor(k / v_tok')
  gross      = v_sol - v_sol'
  fee        = gross * fee_bps / 10000
  sol_out    = gross - fee
price       = v_sol / v_tok
to_complete = k / (v_tok - r_tok) - v_sol
gross_in    = to_complete / (1 - fee_bps / 10000)

curve plot

rounding map

4 columns

Because the division rounds, two trades of nearly the same size can return token counts that differ by more than the price difference explains. The map below runs the buy formula on the current reserves for every size from 0.001 sol to 2 sol in 0.001 sol steps and records the remainder the program discards. Dark cells are sizes where the discarded remainder is largest. The agent trades only at the lightest cells.

lightest sizes now

sol inremaindertokens outtokens at next lamport

quotes

6 columns
sol infeenettokens outeffective priceprice after

These are not offers. They are what the program will do if someone sends that amount in the next transaction, assuming nothing lands ahead of it. Compare any row to the fill you actually received and you have measured what landed ahead of you.