Pump Developer Updates – Telegram
Pump Developer Updates
5.03K subscribers
1 file
13 links
Updates regarding all technical related changes that may affect integrations
Download Telegram
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.
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 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 bytes

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:
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.
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 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.
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.
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.

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
Hello. We added 2 new instructions to both Pump and PumpSwap programs:
- 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
Hello! Effective Monday, September 1st, both Pump and PumpSwap programs will require 2 additional readonly accounts for all buy and sell transactions.

Required Changes:

Pump program (6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P):
- Buy instruction: Add accounts at indexes 14 (fee_config) and 15 (fee_program)
- Sell instruction: Add accounts at indexes 12 (fee_config) and 13 (fee_program)

PumpSwap program (pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA):
- Buy instruction: Add accounts at indexes 21 (fee_config) and 22 (fee_program)
- Sell instruction: Add accounts at indexes 19 (fee_config) and 20 (fee_program)

PDA Logic and Fee Program PublicKey:

Typenoscript reference:

const PUMP_PROGRAM_ID = new PublicKey("6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P");
const PUMP_AMM_PROGRAM_ID = new PublicKey("pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA");
const feeProgram = new PublicKey("pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ");

export function pumpFeeConfigPda(): PublicKey {
return PublicKey.findProgramAddressSync(
[Buffer.from("fee_config"), PUMP_PROGRAM_ID.toBuffer()],
feeProgram,
)[0];
}

export function pumpAmmFeeConfigPda(): PublicKey {
return PublicKey.findProgramAddressSync(
[Buffer.from("fee_config"), PUMP_AMM_PROGRAM_ID.toBuffer()],
feeProgram,
)[0];
}


Rust reference:
let fee_program = pubkey!("pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ");
let pump_program = pubkey!("6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P");
let pump_amm_program = pubkey!("pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA");

let pump_fee_config_pda = Pubkey::find_program_address(
&[b"fee_config", &pump_program],
&fee_program,
).0;

let pump_amm_fee_config_pda = Pubkey::find_program_address(
&[b"fee_config", &pump_amm_program],
&fee_program,
).0;


Pump and Pump Swap Fee Logic:
export function calculateFeeTier({
feeTiers,
marketCap,
}: {
feeTiers: FeeTier[];
marketCap: BN;
}): Fees {
const firstTier = feeTiers[0];

if (marketCap.lt(firstTier.marketCapLamportsThreshold)) {
return firstTier.fees;
}

for (const tier of feeTiers.slice().reverse()) {
if (marketCap.gte(tier.marketCapLamportsThreshold)) {
return tier.fees;
}
}

return firstTier.fees;
}

function getFees({
feeConfig,
isPumpPool,
marketCap,
}: {
feeConfig: FeeConfig;
isPumpPool: boolean;
marketCap: BN;
tradeSize: BN;
}): Fees {
if (isPumpPool) {
return calculateFeeTier({
feeTiers: feeConfig.feeTiers,
marketCap,
});
} else {
return feeConfig.flatFees;
}
}

Where isPumpPool is defined as follow:
- For Pump, it means all coins
- For PumpSwap, it means pools who have graduated from Pump

The latest reference is public and can be found here:
- https://www.npmjs.com/package/@pump-fun/pump-sdk?activeTab=code
- https://www.npmjs.com/package/@pump-fun/pump-swap-sdk?activeTab=code

We have made FeeConfig and FeeProgram optional accounts for now and fallback on current fees configuration, but please add them today as it will be mandatory starting next week.

The current Fee rates can be found here, but the values will be updated on Monday, September 1st.
- Pump Fee Config: https://solscan.io/account/8Wf5TiAheLUqBrKXeYg2JtAFFMWtKdG2BSFgqUcPVwTt#anchorData
- Pump Swap Fee Config: https://solscan.io/account/5PHirr8joyTMp9JMm6nW7hNDVyEYdkzDqazxPD7RaTjx#anchorData

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
- https://github.com/pump-fun/pump-public-docs/tree/main/idl
We are in the process of reverting. ETA a few minutes.
Changes have been fully reverted.
Pump Developer Updates
Hello! Effective Monday, September 1st, both Pump and PumpSwap programs will require 2 additional readonly accounts for all buy and sell transactions. Required Changes: Pump program (6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P): - Buy instruction: Add accounts…
Hello. We reverted the program changes from the previous message, but we will re-apply the updates tomorrow at 20:00 UTC.

It's important to note the changes described in the message above still need to be implemented and can be done from now, as they only require appending 2 new accounts on buy / sell instructions in both programs.

The updated programs are already deployed on Devnet. You can check that the same integration code works on Devnet and Mainnet before we re-apply the update from the previous message.

The reason so many integrations had problems with this program update is that they have added unused input accounts to buy / sell instructions at the new indexes. You need to remove those accounts or replace them with the 2 new required ones from the update above. As they are currently not used, they will not break anything.

A common pitfall is that integrations added the accumulator accounts to both buy and sell transactions, even if we have specified adding them ONLY on buy instructions.

The latest IDL for both programs is deployed everywhere (including on chain) and as part of our SDKs:
- https://www.npmjs.com/package/@pump-fun/pump-sdk
- https://www.npmjs.com/package/@pump-fun/pump-swap-sdk
- https://github.com/pump-fun/pump-public-docs/tree/main/idl
Screenshot 2025-08-29 at 3.38.58 PM.png
165.1 KB
Hello. We pushed again the update to both Pump and PumpSwap programs which adds the 2 new additional accounts on buy / sell.

On Monday, September 1, 20:00 UTC, these 2 accounts will become mandatory and the programs fee structure will change from the existing one to a dynamic fee structure depending on the current coin market cap.

The new fee structure code is present in both our Typenoscript SDKs:
- https://www.npmjs.com/package/@pump-fun/pump-sdk?activeTab=code
- https://www.npmjs.com/package/@pump-fun/pump-swap-sdk?activeTab=code

All technical details about this update can be found here: https://github.com/pump-fun/pump-public-docs/blob/main/docs/FEE_PROGRAM_README.md

We will use the attached fee tiers structure starting from Monday.

In order to avoid possible issues created by the new fee structure, until you make sure it's implemented correctly, you can increase the slippage tolerance on buy / sell instructions as a temporary mitigation.
Pump Developer Updates
Screenshot 2025-08-29 at 3.38.58 PM.png
Hello. We already pushed on Devnet the update which makes the 2 new fee accounts on buy / sell required. This will be pushed to Mainnet on Monday too.
Hi all, today at 20:00 UTC we will deploy a change that makes the two additional accounts for the new fee structure mandatory — these accounts are currently optional. Shortly after verifying that this works we will deploy the fee schedule change outlined above. There will be 1 hour of notice before the fee schedule changes go live.
Pump Developer Updates
Screenshot 2025-08-29 at 3.38.58 PM.png
Hello. The new fee schedule from here has been deployed on Devnet already and can be tested there
The pump bonding curve contract and the pump swap contract were upgraded earlier today at: October 17, 2025 16:47:00 UTC. It was a routine upgrade with no breaking changes.