The pump bonding curve contracts were upgraded earlier today at: March 17, 2025 17:49:28 UTC. It was a routine upgrade with no breaking changes.
The pump bonding curve contract has just been upgraded at: March 18, 2025 17:17:14 UTC. It is also a routine upgrade with no breaking changes.
Hi! We started extending the bonding curve PDA accounts from 49 bytes to 256 bytes to support future protocol updates. We recommend not depending on the size of the bonding curve accounts for backend logic, but on the Anchor account discriminator.
We also suggest prepending extendAccount(bondingCurve) instructions before any Pump buy / sell tx if the bonding curve size is less than 256 bytes. In the future, buy / sell txs on not extended bonding curves will fail unless the bonding curve is extended first to 256 bytes.
We also suggest prepending extendAccount(bondingCurve) instructions before any Pump buy / sell tx if the bonding curve size is less than 256 bytes. In the future, buy / sell txs on not extended bonding curves will fail unless the bonding curve is extended first to 256 bytes.
Hi. Since there is some confusion around extending Pump
First of all, both programs and clients written using Anchor framework allow PDA accounts whose actual data size can be bigger than the expected size of the deserialized type.
You should not rely on the size of BondingCurve or Pool accounts on-chain or off-chain, because it can change in the future multiple times. You should only check the data buffer has a size big enough for the deserialized type.
For Pump (
-
-
We will announce when those accounts will have new fields BEFORE we update the programs, so you can update your integrations and avoid downtime.
In Rust, in particular, the code generated by Anchor framework looks like this:
The
We highly recommend using the Anchor
If you happen to use a native Rust Solana implementation, please do NOT use
because your code will start failing after the PDA accounts are extended. You should use
If you use Anchor Typenoscript clients generated from Anchor IDL files, the PDA accounts extension should not affect your integrations.
BondingCurve and PumpSwap Pool accounts data size, I will give some explanations.First of all, both programs and clients written using Anchor framework allow PDA accounts whose actual data size can be bigger than the expected size of the deserialized type.
You should not rely on the size of BondingCurve or Pool accounts on-chain or off-chain, because it can change in the future multiple times. You should only check the data buffer has a size big enough for the deserialized type.
For Pump (
6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P) and PumpSwap (pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA) programs currently deployed on Devnet and Mainnet, those sizes are:-
BondingCurve: 49 bytes-
Pool: 211 bytesWe will announce when those accounts will have new fields BEFORE we update the programs, so you can update your integrations and avoid downtime.
In Rust, in particular, the code generated by Anchor framework looks like this:
fn try_deserialize_unchecked(buf: &mut &[u8]) -> anchor_lang::Result<Self> {
let mut data: &[u8] = &buf[BondingCurve::DISCRIMINATOR.len()..];
BorshDeserialize::deserialize(&mut data)
.map_err(|_| anchor_lang::error::ErrorCode::AccountDidNotDeserialize.into())
}
}
#[automatically_derived]
impl anchor_lang::Discriminator for BondingCurve {
const DISCRIMINATOR: &'static [u8] = &[23, 183, 248, 55, 96, 216, 172, 96];
}
The
BorshDeserialize::deserialize(buf: &mut &[u8]) -> Result<Self> trait method does not require the buffer to have exactly the size of the deserialized type, only at least as big as the deserialized type.We highly recommend using the Anchor
declare_program! macro with the latest Pump and PumpSwap program IDLs from here: https://github.com/pump-fun/pump-public-docs/tree/main/idl in order to avoid low level issues like this.If you happen to use a native Rust Solana implementation, please do NOT use
BorshDeserialize::try_from_slice:/// Deserialize this instance from a slice of bytes.
fn try_from_slice(v: &[u8]) -> Result<Self> {
let mut v_mut = v;
let result = Self::deserialize(&mut v_mut)?;
if !v_mut.is_empty() {
return Err(Error::new(ErrorKind::InvalidData, ERROR_NOT_ALL_BYTES_READ));
}
Ok(result)
}
because your code will start failing after the PDA accounts are extended. You should use
BorshDeserialize::deserialize instead.If you use Anchor Typenoscript clients generated from Anchor IDL files, the PDA accounts extension should not affect your integrations.
GitHub
pump-public-docs/idl at main · pump-fun/pump-public-docs
Pump public docs. Contribute to pump-fun/pump-public-docs development by creating an account on GitHub.
Pump Developer Updates
Hi. Since there is some confusion around extending Pump BondingCurve and PumpSwap Pool accounts data size, I will give some explanations. First of all, both programs and clients written using Anchor framework allow PDA accounts whose actual data size can…
Hello. Tomorrow on April 23, at 09:00 UTC, we will start expanding PumpSwap (Pump AMM) Pool accounts from
If you followed the instructions above, your integrations should not be affected by this change.
211 bytes to 300 bytes.If you followed the instructions above, your integrations should not be affected by this change.
Hello. We will deploy a BREAKING CHANGE to both Pump and PumpSwap (Pump AMM) programs to add support for coin creator fees on Mainnet on Monday, May 12, 11:00 AM UTC.
On Devnet, both programs have already been updated to support coin creator fees.
Who will receive coin creator fees?
- all non-completed Pump bonding curves;
- all canonical PumpSwap pools will. Canonical PumpSwap pools are pools created by Pump program migrate instruction for completed bonding curves.
Who will NOT receive coin creator fees?
- coins already migrated to Raydium, as that program is not under our control.
- normal PumpSwap pools which are not created by Pump program migrate instruction.
You should start by using the latest IDL files for both programs from the idl directory here: https://github.com/pump-fun/pump-public-docs/tree/main/idl. They are backwards-compatible with current programs deployed on Mainnet, so you can start using them now.
If you implement and test the changes described in the public docs repo (https://github.com/pump-fun/pump-public-docs) on Devnet before the creator fee upgrade, you should not experience any downtime. Ideally, you should use exactly the same code for both Devnet and Mainnet, before we update the programs on Mainnet.
On Devnet, both programs have already been updated to support coin creator fees.
Who will receive coin creator fees?
- all non-completed Pump bonding curves;
- all canonical PumpSwap pools will. Canonical PumpSwap pools are pools created by Pump program migrate instruction for completed bonding curves.
Who will NOT receive coin creator fees?
- coins already migrated to Raydium, as that program is not under our control.
- normal PumpSwap pools which are not created by Pump program migrate instruction.
You should start by using the latest IDL files for both programs from the idl directory here: https://github.com/pump-fun/pump-public-docs/tree/main/idl. They are backwards-compatible with current programs deployed on Mainnet, so you can start using them now.
If you implement and test the changes described in the public docs repo (https://github.com/pump-fun/pump-public-docs) on Devnet before the creator fee upgrade, you should not experience any downtime. Ideally, you should use exactly the same code for both Devnet and Mainnet, before we update the programs on Mainnet.
GitHub
pump-public-docs/idl at main · pump-fun/pump-public-docs
Pump public docs. Contribute to pump-fun/pump-public-docs development by creating an account on GitHub.
Hello. We have released the Pump Program Typenoscript SDK, which will help you update your integrations for the creator fee update, together with the existing PumpSwap Typenoscript SDK.
- https://www.npmjs.com/package/@pump-fun/pump-sdk
- https://www.npmjs.com/package/@pump-fun/pump-swap-sdk
We will continue improving on these SDKs in future updates.
- https://www.npmjs.com/package/@pump-fun/pump-sdk
- https://www.npmjs.com/package/@pump-fun/pump-swap-sdk
We will continue improving on these SDKs in future updates.
Hello. We have deployed the creator fee update on Mainnet to both Pump and PumpSwap programs. We will assist you in updating your integrations to fix the failing txs.
You can ask for help with the creator fee update on this channel: https://news.1rj.ru/str/pump_developers
Hello. We deployed an update to Pump program (
6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P) to fix sell instructions failing with sum of account balances before and after instruction do not match error. You should see no other disruptions from this update.Hello. We will do a BREAKING update for both Pump and PumpSwap programs on August 1 at 10:00 AM UTC.
- Pump program (
- PumpSwap program (
Rust PDA logic for each program:
Typenoscript PDA logic for each program:
On Devnet, both programs have already been updated to require these 2 new writable accounts on
The latest IDLs for both programs can be found here: https://github.com/pump-fun/pump-public-docs/tree/main/idl and as part of the Typenoscript SDKs.
You can start appending these 2 new accounts to the programs from now already. Both our Typenoscript SDKs have been updated with the latest IDL changes:
- https://www.npmjs.com/package/@pump-fun/pump-sdk
- https://www.npmjs.com/package/@pump-fun/pump-swap-sdk
buy instructions on both programs will require 2 new additional writable accounts with the following PDA seeds:- Pump program (
6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P) buy instruction will require 2 new additional writable accounts at 0-based indexes 12 (global_volume_accumulator) and 13 (user_volume_accumulator).- PumpSwap program (
pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA) buy instruction will require 2 new additional writable accounts at 0-based indexes 19 (global_volume_accumulator) and 20 (user_volume_accumulator).Rust PDA logic for each program:
// Pump program
pub fn global_volume_accumulator_pda() -> Pubkey {
let (global_volume_accumulator, _bump) = Pubkey::find_program_address(
&[b"global_volume_accumulator"],
&Pubkey::from_str("6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P").unwrap(),
);
global_volume_accumulator
}
pub fn user_volume_accumulator_pda(user: &Pubkey) -> Pubkey {
let (user_volume_accumulator, _bump) = Pubkey::find_program_address(
&[b"user_volume_accumulator", user.as_ref()],
&Pubkey::from_str("6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P").unwrap(),
);
user_volume_accumulator
}
// PumpSwap program
pub fn global_volume_accumulator_pda() -> Pubkey {
let (global_volume_accumulator, _bump) = Pubkey::find_program_address(
&[b"global_volume_accumulator"],
&Pubkey::from_str("pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA").unwrap(),
);
global_volume_accumulator
}
pub fn user_volume_accumulator_pda(user: &Pubkey) -> Pubkey {
let (user_volume_accumulator, _bump) = Pubkey::find_program_address(
&[b"user_volume_accumulator", user.as_ref()],
&Pubkey::from_str("pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA").unwrap(),
);
user_volume_accumulator
}
Typenoscript PDA logic for each program:
// Pump program
const PUMP_PROGRAM_ID = "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P";
export function globalVolumeAccumulatorPda(
programId: PublicKey = PUMP_PROGRAM_ID,
): [PublicKey, number] {
return PublicKey.findProgramAddressSync(
[Buffer.from("global_volume_accumulator")],
programId,
);
}
export function userVolumeAccumulatorPda(
user: PublicKey,
programId: PublicKey = PUMP_PROGRAM_ID,
): [PublicKey, number] {
return PublicKey.findProgramAddressSync(
[Buffer.from("user_volume_accumulator"), user.toBuffer()],
programId,
);
}
// PumpSwap program
const PUMP_AMM_PROGRAM_ID = "pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA";
export function globalVolumeAccumulatorPda(
programId: PublicKey = PUMP_AMM_PROGRAM_ID,
): [PublicKey, number] {
return PublicKey.findProgramAddressSync(
[Buffer.from("global_volume_accumulator")],
programId,
);
}
export function userVolumeAccumulatorPda(
user: PublicKey,
programId: PublicKey = PUMP_AMM_PROGRAM_ID,
): [PublicKey, number] {
return PublicKey.findProgramAddressSync(
[Buffer.from("user_volume_accumulator"), user.toBuffer()],
programId,
);
}
On Devnet, both programs have already been updated to require these 2 new writable accounts on
buy. Please test your integrations on Devnet and Mainnet and make sure they both work after adding these 2 new accounts.The latest IDLs for both programs can be found here: https://github.com/pump-fun/pump-public-docs/tree/main/idl and as part of the Typenoscript SDKs.
You can start appending these 2 new accounts to the programs from now already. Both our Typenoscript SDKs have been updated with the latest IDL changes:
- https://www.npmjs.com/package/@pump-fun/pump-sdk
- https://www.npmjs.com/package/@pump-fun/pump-swap-sdk
GitHub
pump-public-docs/idl at main · pump-fun/pump-public-docs
Pump public docs. Contribute to pump-fun/pump-public-docs development by creating an account on GitHub.
Pump Developer Updates
Hello. We will do a BREAKING update for both Pump and PumpSwap programs on August 1 at 10:00 AM UTC. buy instructions on both programs will require 2 new additional writable accounts with the following PDA seeds: - Pump program (6EF8rrecthR5Dkzon8Nwu78h…
Hello. We updated both Pump and PumpSwap programs on Mainnet to require the 2 new additional accounts on
buy instructions. If you have any issues, please let us know on https://news.1rj.ru/str/pump_developers.Telegram
Pump Developers
Actual Devs, not creators. Shilling here will get you banned.
Hello. We added 2 new instructions to both Pump and PumpSwap programs:
-
-
The latest Anchor IDLs have been published at https://github.com/pump-fun/pump-public-docs/tree/main/idl, also on chain and in the latest Typenoscript SDK versions:
- https://www.npmjs.com/package/@pump-fun/pump-sdk?activeTab=versions
- https://www.npmjs.com/package/@pump-fun/pump-swap-sdk?activeTab=versions
-
init_user_volume_accumulator, which allows a payer to fund the user_volume_accumulator account rent-exemption lamports. payer can be any pubkey, not necessarily the user pubkey.-
close_user_volume_accumulator, which allows a signing user to close their user_volume_accumulator account and get their rent-exemption lamports back.buy instruction in each program still requires and re-creates the user_volume_accumulator if it does not exist already. But a user can now close and claim their rent-exemption lamports from user_volume_accumulator account if they want to by using close_user_volume_accumulator.The latest Anchor IDLs have been published at https://github.com/pump-fun/pump-public-docs/tree/main/idl, also on chain and in the latest Typenoscript SDK versions:
- https://www.npmjs.com/package/@pump-fun/pump-sdk?activeTab=versions
- https://www.npmjs.com/package/@pump-fun/pump-swap-sdk?activeTab=versions
GitHub
pump-public-docs/idl at main · pump-fun/pump-public-docs
Pump public docs. Contribute to pump-fun/pump-public-docs development by creating an account on GitHub.