UNPKG

@solsdk/relay_sdk

Version:

Pumpfun SDK — create, buy, sell tokens with support for Jito bundles and multiple relayer integrations. Rebuilt and fixed pumpdotfun-sdk.

350 lines (346 loc) 9.79 kB
"use strict"; var bn = require("../_virtual/bn.cjs"); var splToken = require("@solana/spl-token"); var web3_js = require("@solana/web3.js"); var globalAccount = require("../globalAccount.cjs"); var pumpFun_consts = require("../pumpFun.consts.cjs"); var slippage = require("../slippage.cjs"); var tx = require("../tx.cjs"); var utils = require("@nealireverse_dev/utils"); class TradeModule { sdk; constructor(sdk) { this.sdk = sdk; } async createAndBuy( creator, mint, metadata, buyAmountSol, slippageBasisPoints = 500n, priorityFees, commitment = pumpFun_consts.DEFAULT_COMMITMENT, finality = pumpFun_consts.DEFAULT_FINALITY ) { utils.Keypair.from({ keypair: creator }); const tokenMetadata = await this.sdk.token.createTokenMetadata(metadata); const createIx = await this.getCreateInstructions( creator.publicKey, metadata.name, metadata.symbol, tokenMetadata.metadataUri, mint ); const transaction = new web3_js.Transaction().add(createIx); if (buyAmountSol > 0n) { const globalAccount = await this.sdk.token.getGlobalAccount(commitment); const buyAmount = globalAccount.getInitialBuyPrice(buyAmountSol); const buyAmountWithSlippage = slippage.calculateWithSlippageBuy( buyAmountSol, slippageBasisPoints ); await this.buildBuyIx( creator.publicKey, mint.publicKey, buyAmount, buyAmountWithSlippage, transaction, commitment, true ); } return await tx.sendTx( this.sdk.connection, transaction, creator.publicKey, [creator, mint], priorityFees, commitment, finality ); } async buy( buyer, mint, buyAmountSol, slippageBasisPoints = 500n, priorityFees, commitment = pumpFun_consts.DEFAULT_COMMITMENT, finality = pumpFun_consts.DEFAULT_FINALITY ) { const bondingAccount = await this.sdk.token.getBondingCurveAccount( mint, commitment ); if (!bondingAccount) { throw new Error(`Bonding curve account not found: ${mint.toBase58()}`); } const buyAmount = bondingAccount.getBuyPrice(buyAmountSol); const buyAmountWithSlippage = slippage.calculateWithSlippageBuy( buyAmountSol, slippageBasisPoints ); const transaction = new web3_js.Transaction(); await this.buildBuyIx( buyer.publicKey, mint, buyAmount, buyAmountWithSlippage, transaction, commitment, false ); return await tx.sendTx( this.sdk.connection, transaction, buyer.publicKey, [buyer], priorityFees, commitment, finality ); } async getBuyInstructionsBySolAmount( buyer, mint, buyAmountSol, slippageBasisPoints = 500n, commitment = pumpFun_consts.DEFAULT_COMMITMENT ) { const bondingCurveAccount = await this.sdk.token.getBondingCurveAccount( mint, commitment ); if (!bondingCurveAccount) { throw new Error(`Bonding curve account not found: ${mint.toBase58()}`); } const buyAmount = bondingCurveAccount.getBuyPrice(buyAmountSol); const buyAmountWithSlippage = slippage.calculateWithSlippageBuy( buyAmountSol, slippageBasisPoints ); const transaction = new web3_js.Transaction(); await this.buildBuyIx( buyer, mint, buyAmount, buyAmountWithSlippage, transaction, commitment, false ); return transaction; } async buildBuyIx( buyer, mint, amount, maxSolCost, tx, commitment, shouldUseBuyerAsBonding ) { const bondingCurve = this.sdk.pda.getBondingCurvePDA(mint); const associatedBonding = await splToken.getAssociatedTokenAddress( mint, bondingCurve, true ); const associatedUser = await this.sdk.token.createAssociatedTokenAccountIfNeeded( buyer, buyer, mint, tx, commitment ); const globalPda = this.sdk.pda.getGlobalAccountPda(); const globalAccBuf = await this.sdk.connection.getAccountInfo( globalPda, commitment ); const feeRecipient = globalAccount.GlobalAccount.fromBuffer( globalAccBuf.data ).feeRecipient; const bondingCreator = shouldUseBuyerAsBonding ? this.sdk.pda.getCreatorVaultPda(buyer) : await this.sdk.token.getBondingCurveCreator(bondingCurve, commitment); const creatorVault = shouldUseBuyerAsBonding ? bondingCreator : this.sdk.pda.getCreatorVaultPda(bondingCreator); const eventAuthority = this.sdk.pda.getEventAuthorityPda(); const ix = await this.sdk.program.methods .buy( new bn.default(amount.toString()), new bn.default(maxSolCost.toString()) ) .accounts({ global: globalPda, feeRecipient, mint, bondingCurve, associatedBondingCurve: associatedBonding, associatedUser, user: buyer, creatorVault, eventAuthority, }) .instruction(); tx.add(ix); } //create token instructions async getCreateInstructions(creator, name, symbol, uri, mint) { const mintAuthority = this.sdk.pda.getMintAuthorityPDA(); const bondingCurve = this.sdk.pda.getBondingCurvePDA(mint.publicKey); const associatedBonding = await splToken.getAssociatedTokenAddress( mint.publicKey, bondingCurve, true ); const global = this.sdk.pda.getGlobalAccountPda(); const metadata = this.sdk.pda.getMetadataPDA(mint.publicKey); const eventAuthority = this.sdk.pda.getEventAuthorityPda(); const ix = await this.sdk.program.methods .create(name, symbol, uri, creator) .accounts({ mint: mint.publicKey, mintAuthority, bondingCurve, associatedBondingCurve: associatedBonding, global, metadata, user: creator, eventAuthority, }) .instruction(); return new web3_js.Transaction().add(ix); } async buildSellIx(seller, mint, tokenAmount, minSolOutput, tx, commitment) { const bondingCurve = this.sdk.pda.getBondingCurvePDA(mint); const associatedBonding = await splToken.getAssociatedTokenAddress( mint, bondingCurve, true ); const associatedUser = await this.sdk.token.createAssociatedTokenAccountIfNeeded( seller, seller, mint, tx, commitment ); const globalPda = this.sdk.pda.getGlobalAccountPda(); const globalBuf = await this.sdk.connection.getAccountInfo( globalPda, commitment ); const feeRecipient = globalAccount.GlobalAccount.fromBuffer( globalBuf.data ).feeRecipient; const bondingCreator = await this.sdk.token.getBondingCurveCreator( bondingCurve, commitment ); const creatorVault = this.sdk.pda.getCreatorVaultPda(bondingCreator); const eventAuthority = this.sdk.pda.getEventAuthorityPda(); const ix = await this.sdk.program.methods .sell( new bn.default(tokenAmount.toString()), new bn.default(minSolOutput.toString()) ) .accounts({ global: globalPda, feeRecipient, mint, bondingCurve, associatedBondingCurve: associatedBonding, associatedUser, user: seller, creatorVault, eventAuthority, }) .instruction(); tx.add(ix); } async sell( seller, mint, sellTokenAmount, slippageBasisPoints = 500n, priorityFees, commitment = pumpFun_consts.DEFAULT_COMMITMENT, finality = pumpFun_consts.DEFAULT_FINALITY ) { const bondingAccount = await this.sdk.token.getBondingCurveAccount( mint, commitment ); if (!bondingAccount) throw new Error(`Bonding curve account not found: ${mint.toBase58()}`); const globalAccount = await this.sdk.token.getGlobalAccount(commitment); const minSolOutput = bondingAccount.getSellPrice( sellTokenAmount, globalAccount.feeBasisPoints ); let sellAmountWithSlippage = slippage.calculateWithSlippageSell( minSolOutput, slippageBasisPoints ); if (sellAmountWithSlippage < 1n) sellAmountWithSlippage = 1n; const transaction = new web3_js.Transaction(); await this.buildSellIx( seller.publicKey, mint, sellTokenAmount, sellAmountWithSlippage, transaction, commitment ); return await tx.sendTx( this.sdk.connection, transaction, seller.publicKey, [seller], priorityFees, commitment, finality ); } async getSellInstructionsByTokenAmount( seller, mint, sellTokenAmount, slippageBasisPoints = 500n, commitment = pumpFun_consts.DEFAULT_COMMITMENT ) { const bondingAccount = await this.sdk.token.getBondingCurveAccount( mint, commitment ); if (!bondingAccount) throw new Error(`Bonding curve account not found: ${mint.toBase58()}`); const globalAccount = await this.sdk.token.getGlobalAccount(commitment); const minSolOutput = bondingAccount.getSellPrice( sellTokenAmount, globalAccount.feeBasisPoints ); let sellAmountWithSlippage = slippage.calculateWithSlippageSell( minSolOutput, slippageBasisPoints ); if (sellAmountWithSlippage < 1n) sellAmountWithSlippage = 1n; const transaction = new web3_js.Transaction(); await this.buildSellIx( seller, mint, sellTokenAmount, sellAmountWithSlippage, transaction, commitment ); return transaction; } } exports.TradeModule = TradeModule; //# sourceMappingURL=TradeModule.cjs.map