Common issues and their solutions. Can't find your answer? Open a discussion.
Make sure you've installed both the SDK and its peer dependencies:
npm install @pump-fun/pump-sdk @solana/web3.js @coral-xyz/anchor @solana/spl-token bn.jsAnchor is a peer dependency. Install it explicitly:
npm install @coral-xyz/anchor@^0.31.1Ensure you have @types/bn.js if you're using strict TypeScript:
npm install -D @types/bn.jsThe SDK ships both ESM and CJS builds. If you're getting import errors:
// ESM (import)
import { PumpSdk, PUMP_SDK } from "@pump-fun/pump-sdk";
// CJS (require)
const { PumpSdk, PUMP_SDK } = require("@pump-fun/pump-sdk");If you're in a .mjs file or "type": "module" in package.json, use the ESM import.
The bonding curve account may not exist yet. This happens when:
- The token hasn't been created on this network (mainnet vs devnet)
- The mint address is wrong
- The token has been fully migrated and the account was closed
// Always check if the account exists
const bondingCurveAccountInfo = await connection.getAccountInfo(bondingCurvePda(mint));
if (!bondingCurveAccountInfo) {
console.log("Token not found on this network");
}You're hitting RPC rate limits. Solutions:
- Use a dedicated RPC provider (Helius, QuickNode, Triton)
- Add delays between requests
- Batch requests with
getMultipleAccountsInfo
// Instead of multiple individual fetches:
const [accountA, accountB] = await connection.getMultipleAccountsInfo([pdaA, pdaB]);Common causes:
- Insufficient SOL — Make sure the signer has enough SOL for the transaction + fees
- Slippage exceeded — The price moved more than your slippage tolerance. Increase slippage or retry
- Bonding curve completed — The token graduated. Use AMM methods instead
- Stale data — Re-fetch the bonding curve state before building the transaction
The bonding curve's virtualTokenReserves is 0, meaning the token has been fully migrated to AMM. Check:
const bc = await sdk.fetchBondingCurve(mint);
if (bc.complete) {
console.log("Token graduated — use AMM for trading");
}
if (bc.virtualTokenReserves.eq(new BN(0))) {
console.log("Bonding curve migrated — no tokens left");
}Remember:
- Slippage is in percentage, not basis points:
slippage: 1= 1%,slippage: 0.5= 0.5% - All amounts use
BN— never JavaScriptnumberfor financial math - SOL amounts are in lamports (1 SOL = 1,000,000,000 lamports)
const solAmount = new BN(0.1 * 1e9); // 0.1 SOL in lamports — correct
const solAmount = 0.1; // WRONG — don't use raw decimalsMarket cap is calculated from virtual reserves and mint supply:
If the bonding curve is in Mayhem mode (isMayhemMode: true), the actual mint supply is used instead of the standard 1 billion supply. This can significantly affect fee tier calculations.
Possible causes:
- No trades have occurred — Fees accumulate from trading activity
- Fees already claimed — Check if
collectCoinCreatorFeewas already called - Wrong creator address — The creator vault is derived from the creator who launched the token
- Graduated token — For graduated tokens, fees accumulate in the AMM vault. Use
getCreatorVaultBalanceBothProgramsto check both
// Check both programs
const balance = await sdk.getCreatorVaultBalanceBothPrograms(creator);
console.log("Total fees:", balance.toString());Common issues:
- Shares don't total 10,000 BPS — All shareholder percentages must sum to exactly 10,000 (100%)
- No distributable fees — Check with
getMinimumDistributableFeefirst - Admin revoked — If
adminRevokedis true, the sharing config can't be changed - Duplicate shareholders — Each address can only appear once
const result = await sdk.getMinimumDistributableFee(mint);
if (!result.canDistribute) {
console.log(`Need ${result.minimumRequired.toString()} lamports, have ${result.distributableFees.toString()}`);
}Make sure you have Rust 1.70+ installed:
rustup update stable
rustc --versionLong prefixes/suffixes take exponentially longer. Use --dry-run to estimate:
solana-vanity --prefix PUMP --dry-runConsider:
- Using
--ignore-caseto increase matches by ~32x for alphabetic patterns - Reducing pattern length
- Using more threads:
--threads 0(all CPUs)
Ensure the file permissions are correct and the format matches:
# Check permissions
ls -la my-vanity-key.json
# Verify with solana-keygen
solana-keygen verify <EXPECTED_ADDRESS> my-vanity-key.json
# Set as default keypair
solana config set --keypair my-vanity-key.json- Make sure the MCP server is built:
cd mcp-server && npm run build - Check your Claude Desktop config path matches the actual
dist/index.jslocation - Restart Claude Desktop after config changes
- Check stderr for startup logs
The MCP server communicates over stdio. Common causes:
- The server crashed — check stderr output
- Wrong path in config — use absolute paths
- Node.js not in PATH — use the full path to
node
Agent-spawned terminals in Codespaces may be hidden but still functional. If a terminal is stuck:
- Kill the terminal
- Create a new one
- Always use
isBackground: truefor commands
This is the zombie terminal problem. See auto-kill-terminal for the fix. The terminal management rules in this repo's AGENTS.md and CLAUDE.md already include the solution.
- Search existing issues
- Check Discussions
- Open a new issue with your error message, environment, and reproduction steps