Pump program
November 11, 2025 ยท View on GitHub
Pump program allows creating SPL coins that are instantly tradeable on a bonding curve without having to seed liquidity. When the coin hits a certain market cap the liquidity from the bonding curve is migrated to PumpSwap (an AMM on Solana). The LP tokens received from the PumpSwap pool are then burnt.
The bonding curve formula is based on Uniswap V2 and uses synthetic x and y reserves to ensure that there is liquidity for the coin.
Pump program is deployed at address 6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P on
both Mainnet
and Devnet.
State
Global
The global configuration of the program is stored in the only Global account, whose address is
4wTV1YmiEkRvAtNtsSGPtUrqRYQMe5SKy2uB4Jjaxnjf (PDA-derived from ["global"] seeds). The content of this account
can be examined
on Mainnet Solscan:
{
"initialized": {
"type": "bool",
"data": true
},
"authority": {
"type": "pubkey",
"data": "FFWtrEQ4B4PKQoVuHYzZq8FabGkVatYzDpEVHsK5rrhF"
},
"fee_recipient": {
"type": "pubkey",
"data": "62qc2CNXwrYqQScmEdiZFFAnJR262PxWEuNQtxfafNgV"
},
"initial_virtual_token_reserves": {
"type": "u64",
"data": "1073000000000000"
},
"initial_virtual_sol_reserves": {
"type": "u64",
"data": "30000000000"
},
"initial_real_token_reserves": {
"type": "u64",
"data": "793100000000000"
},
"token_total_supply": {
"type": "u64",
"data": "1000000000000000"
},
"fee_basis_points": {
"type": "u64",
"data": "100"
},
"withdraw_authority": {
"type": "pubkey",
"data": "39azUYFWPz3VHgKCf3VChUwbpURdCHRxjWVowf5jUJjg"
},
"enable_migrate": {
"type": "bool",
"data": true
},
"pool_migration_fee": {
"type": "u64",
"data": "15000001"
},
"creator_fee": {
"type": "u64",
"data": "0"
},
"fee_recipients": {
"type": {
"array": [
"pubkey",
7
]
},
"data": [
"7VtfL8fvgNfhz17qKRMjzQEXgbdpnHHHQRh54R9jP2RJ",
"7hTckgnGnLQR6sdH7YkqFTAA7VwTfYFaZ6EhEsU3saCX",
"9rPYyANsfQZw3DnDmKE3YCQF5E8oD89UXoHn9JFEhJUz",
"AVmoTthdrX6tKt4nDjco2D775W2YK3sDhxPcMmzUAmTY",
"CebN5WGQ4jvEPvsVU4EoHEpgzq1VV7AbicfhtW4xC9iM",
"FWsW1xNtWscwNmKv6wVsU1iTzRN6wmmk3MjxRP5tT7hz",
"G5UZAVbAf46s7cKWoyKu8kYTip9DGTpbLZ2qa9Aq69dP"
]
}
}
- The
initializedfield is set totrueand never used. - The
authoritypubkey is the authority which can update the global configuration. - The
fee_recipientpubkey is one of the 8 fee_recipients which can be used bybuy/sellinstructions, together with the other 7Global::fee_recipientspubkeys. - The
initial_virtual_token_reserves,initial_virtual_sol_reserves,initial_real_token_reservesandtoken_total_supplyfields are used as the initial parameters for the bonding curve of each newly created coin. - The
fee_basis_points == 100 bpsrepresents the fee in bps transferred to thefee_recipientaccount onbuy/sellinstructions. - The
withdraw_authoritypubkey is the authority which can call the deprecatedwithdrawinstruction. - The
enable_migrateflag is used to enable the newmigrateinstruction and disable the deprecatedwithdrawinstruction. Currently, it is set totrue. - The
pool_migration_feeare the minimum lamports necessary to pay for all accounts created duringmigrateinstruction. It is currently set the minimum of15000001, less thanMAX_MIGRATE_FEES == 15_000_000, which represents the maximum cost of all accounts created during amigrateinstruction. - The
creator_feeis set to0and is not used.
Bonding curve
Each coin has an associated bonding curve account, which is PDA-derived from ["bonding-curve", mint] seeds. An example
bonding curve account can be found
at https://solscan.io/account/EsmVk4MTsoT71JFaRM5DWFZboKpMQjfY6EYzAgUuksXw#accountData:
{
"virtual_token_reserves": {
"type": "u64",
"data": "1072999999992855"
},
"virtual_sol_reserves": {
"type": "u64",
"data": "30000000013"
},
"real_token_reserves": {
"type": "u64",
"data": "793099999992855"
},
"real_sol_reserves": {
"type": "u64",
"data": "13"
},
"token_total_supply": {
"type": "u64",
"data": "1000000000000000"
},
"complete": {
"type": "bool",
"data": false
}
}
- The
virtual_token_reserves,virtual_sol_reserves,real_token_reservesandtoken_total_supplyfields are initialized on coin creation to the corresponding values fromGlobalaccount. The initialreal_sol_reservesis set to0. - On each
buyoperation,virtual_sol_reservesandreal_sol_reversesincrease with the same lamports amount according to the bonding curve formula, whilevirtual_token_reservesandreal_token_reservesdecrease with the same coin amount. - On each
selloperation,virtual_sol_reservesandreal_sol_reversesdecrease with the same lamports amount according to the bonding curve formula, whilevirtual_token_reservesandreal_token_reservesincrease with the same coin amount. - The
completefield is initially set tofalse. It is set totrueat the end of abuyinstruction, whenreal_token_reserves == 0, so there are no more real tokens left in the bonding curve.
Instructions
-
create(user, name, symbol, uri, creator)allows auserto create a new coin with the givenname,symbolanduri. Thecreatorpubkey is the creator which will be added to the mint Metaplex metadatacreatorsarray, together with the providedname,symbolanduri.- In general,
userandcreatorare the same pubkey, but they can be different, for example, on thefree coin creationflow, when the first coin buyer also creates the coin on-chain. In this case,creatorpubkey is the original coin creator, whileuserpubkey is the first buyer. This is also the reason whycreatorpubkey is not required to be a signer for this instruction, as the original creator cannot sign the tx of the first coin buyer.
- In general,
-
buy(user, associated_user, mint, amount, max_sol_cost)allows auserto buy the exactamountof coins from the bonding curve of the givenmint, using at mostmax_sol_costlamports. -
sell(user, associated_user, mint, amount, min_sol_output)allows auserto sell the exactamountof coins to the bonding curve of the givenmint, receiving at leastmin_sol_outputlamports. -
withdraw(withdraw_authority, mint)is a now-disabled instruction which allowed thewithdraw_authoritypubkey to withdraw the liquidity of a completed bonding curve and migrate it to Raydium from an off-chain server. -
migrate(user, mint)allows anyuserto migrate the liquidity of a completed bonding curve of the givenmintto PumpSwap AMM. A completed bonding curve is a bonding curve withcomplete == trueandreal_token_reserves == 0. Themigrateinstruction is idempotent, meaning that running it on a completed and migrated bonding curve does nothing. It is also permisionless, so anyone can migrate a completed bonding curve. -
extend_account(user, account)allows anyone to extend the data size of any program-owned account (GlobalorBondingCurve) in order to allow adding new fields to the existing account types. -
initialize(user, global)initialized the soleGlobalaccount on Pump program deployment and can be executed by anyone. The first pubkey which successfully executesinitializeis the one which sets theGlobal::authorityfield. This instruction cannot be called more than once because the second time it is called, theGlobalaccount already exists. -
update_global_authority(global, authority, new_authority)allows the currentGlobal::authorityto update theGlobal::authorityfield to a new pubkey. -
set_params(global, authority)allows updating all theGlobalaccount fields, apart fromGlobal::authority, which is updated usingupdate_global_authorityinstruction.