sell-token
Execute token sales on the Pump.fun platform by specifying token address and amount. Manage slippage tolerance and select accounts for secure transaction processing.
Instructions
Sell a Pump.fun token
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| accountName | No | Name of the account to use | default |
| sellAmount | Yes | Amount of tokens to sell (0 for all) | |
| slippageBasisPoints | No | Slippage tolerance in basis points (1% = 100) | |
| tokenAddress | Yes | The token's mint address |
Implementation Reference
- src/sell-token.ts:15-141 (handler)The `sellToken` function implements the core logic for selling Pump.fun tokens. It handles account management, balance checks, executes the sell transaction via PumpFunSDK, calculates profits, and returns detailed results.export async function sellToken( tokenAddress: string, sellAmount: number = 0, accountName: string = "default", slippageBasisPoints: number = 100 ) { try { console.error("Starting sellToken function"); const { sdk, connection } = initializeSDK(); console.error("SDK initialized"); const keysFolder = path.resolve(rootDir, ".keys"); console.error(`Using keys folder path relative to script: ${keysFolder}`); console.error( `Checking if keys folder exists: ${fs.existsSync(keysFolder)}` ); if (!fs.existsSync(keysFolder)) { console.error(`Creating keys folder: ${keysFolder}`); try { fs.mkdirSync(keysFolder, { recursive: true }); console.error(`Keys folder created successfully`); } catch (mkdirError: any) { console.error(`Error creating keys folder:`, mkdirError); return { success: false, error: `Error creating keys folder: ${ mkdirError.message || JSON.stringify(mkdirError) }`, }; } } console.error(`Getting or creating keypair from folder: ${keysFolder}`); const account = getOrCreateKeypair(keysFolder, accountName); console.log(`Using account: ${account.publicKey.toString()}`); const mintPublicKey = new PublicKey(tokenAddress); console.log(`Token address: ${tokenAddress}`); const tokenBalance = await getSPLBalance( connection, mintPublicKey, account.publicKey ); console.log(`Current token balance: ${tokenBalance}`); if (!tokenBalance || tokenBalance === 0) { const errorMessage = `No tokens to sell. Account ${account.publicKey.toString()} has 0 tokens of ${tokenAddress}.`; console.error(errorMessage); return { success: false, error: errorMessage }; } const amountToSell = sellAmount === 0 ? tokenBalance : Math.min(sellAmount, tokenBalance); console.log(`Amount to sell: ${amountToSell}`); const initialSolBalance = await connection.getBalance(account.publicKey); console.log( `Initial SOL balance: ${initialSolBalance / LAMPORTS_PER_SOL} SOL` ); console.log(`Selling ${amountToSell} tokens...`); const result = await sdk.sell( account, mintPublicKey, BigInt(amountToSell * Math.pow(10, 6)), BigInt(slippageBasisPoints), DEFAULT_PRIORITY_FEES ); if (!result.success) { console.error(`Failed to sell token:`, result.error); return { success: false, error: result.error ? typeof result.error === "object" ? JSON.stringify(result.error) : result.error : "Unknown error", }; } console.log(`Transaction successful: ${result.signature}`); const newSolBalance = await connection.getBalance(account.publicKey); console.log(`New SOL balance: ${newSolBalance / LAMPORTS_PER_SOL} SOL`); const solReceived = (newSolBalance - initialSolBalance) / LAMPORTS_PER_SOL; console.log(`SOL received: ${solReceived} SOL`); const newTokenBalance = (await getSPLBalance(connection, mintPublicKey, account.publicKey)) || 0; console.log(`New token balance: ${newTokenBalance}`); return { success: true, tokenAddress, tokensSold: amountToSell, solReceived, newTokenBalance, signature: result.signature, pumpfunUrl: `https://pump.fun/${tokenAddress}`, }; } catch (error: any) { console.error("Error selling token:", error); console.error("Error stack:", error.stack); let errorMessage = "Unknown error"; if (error) { if (typeof error === "object") { if (error.message) { errorMessage = error.message; } else { try { errorMessage = JSON.stringify(error); } catch (e) { errorMessage = "Error object could not be stringified"; } } } else { errorMessage = String(error); } } return { success: false, error: errorMessage }; } }
- src/index.ts:198-212 (schema)Zod input schema for the sell-token tool, defining parameters: tokenAddress (string), sellAmount (number >=0), accountName (string, default 'default'), slippageBasisPoints (number, default 100).{ tokenAddress: z.string().describe("The token's mint address"), sellAmount: z .number() .min(0) .describe("Amount of tokens to sell (0 for all)"), accountName: z .string() .default("default") .describe("Name of the account to use"), slippageBasisPoints: z .number() .default(100) .describe("Slippage tolerance in basis points (1% = 100)"), },
- src/index.ts:195-243 (registration)MCP server tool registration for 'sell-token', including description, input schema, and handler that delegates to sellToken function, formats result, and handles errors.server.tool( "sell-token", "Sell a Pump.fun token", { tokenAddress: z.string().describe("The token's mint address"), sellAmount: z .number() .min(0) .describe("Amount of tokens to sell (0 for all)"), accountName: z .string() .default("default") .describe("Name of the account to use"), slippageBasisPoints: z .number() .default(100) .describe("Slippage tolerance in basis points (1% = 100)"), }, async ({ tokenAddress, sellAmount, accountName, slippageBasisPoints }) => { try { console.error( `Selling token: ${tokenAddress}, amount: ${ sellAmount === 0 ? "ALL" : sellAmount }` ); const result = await sellToken( tokenAddress, sellAmount, accountName, slippageBasisPoints ); const formattedResult = formatSellResult(result); return createMcpResponse(formattedResult); } catch (error: any) { console.error("Error selling token:", error); return { content: [ { type: "text" as const, text: `Error selling token: ${error?.message || "Unknown error"}`, }, ], }; } } );
- src/sell-token.ts:143-159 (helper)Helper function to format the sellToken result into a human-readable multi-line text summary.export function formatSellResult( result: ReturnType<typeof sellToken> extends Promise<infer T> ? T : never ) { if (!result.success) { return `Error selling token: ${result.error}`; } return [ `Successfully sold token!`, `Token Address: ${result.tokenAddress}`, `Tokens Sold: ${result.tokensSold}`, `SOL Received: ${result.solReceived} SOL`, `Remaining Token Balance: ${result.newTokenBalance}`, `Transaction Signature: ${result.signature}`, `Pump.fun URL: ${result.pumpfunUrl}`, ].join("\n"); }