@solsdk/relay_sdk
Version:
Pumpfun SDK — create, buy, sell tokens with support for Jito bundles and multiple relayer integrations. Rebuilt and fixed pumpdotfun-sdk.
140 lines (135 loc) • 3.75 kB
JavaScript
;
var searcher_js = require("jito-ts/dist/sdk/block-engine/searcher.js");
var web3_js = require("@solana/web3.js");
var pumpFun_consts = require("../pumpFun.consts.cjs");
var slippage = require("../slippage.cjs");
var tx = require("../tx.cjs");
var utils = require("./utils.cjs");
var types_js = require("jito-ts/dist/sdk/block-engine/types.js");
class JitoModule {
sdk;
client;
constructor(sdk, endpoint, authKeypair) {
this.sdk = sdk;
if (!endpoint) {
throw new Error("Jito endpoint is required");
}
this.client = searcher_js.searcherClient(endpoint, authKeypair);
}
async buyJito(
buyer,
mint,
buyAmountSol,
slippageBasisPoints = 500n,
jitoTip = 500000,
priorityFees,
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 buyAmount = bondingAccount.getBuyPrice(buyAmountSol);
const buyAmountWithSlippage = slippage.calculateWithSlippageBuy(
buyAmountSol,
slippageBasisPoints
);
const transaction = new web3_js.Transaction();
await this.sdk.trade.buildBuyIx(
buyer.publicKey,
mint,
buyAmount,
buyAmountWithSlippage,
transaction,
commitment,
false
);
this.addJitoTip(buyer, transaction, jitoTip);
const signedTx = await tx.buildSignedTx(
priorityFees,
transaction,
this.sdk.connection,
buyer.publicKey,
commitment,
[buyer]
);
return await this.sendJitoTx(signedTx);
}
async sellJito(
seller,
mint,
sellTokenAmount,
slippageBasisPoints = 500n,
jitoTip = 500000,
priorityFees,
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.sdk.trade.buildSellIx(
seller.publicKey,
mint,
sellTokenAmount,
sellAmountWithSlippage,
transaction,
commitment
);
this.addJitoTip(seller, transaction, jitoTip);
const signedTx = await tx.buildSignedTx(
priorityFees,
transaction,
this.sdk.connection,
seller.publicKey,
commitment,
[seller]
);
return await this.sendJitoTx(signedTx);
}
addJitoTip(buyer, transaction, jitoTip = 500000) {
if (jitoTip <= 0) {
return transaction;
}
const jitoTipAccount = utils.getRandomJitoTipAccount();
const jitoTipInstruction = web3_js.SystemProgram.transfer({
fromPubkey: buyer.publicKey,
toPubkey: jitoTipAccount,
lamports: jitoTip,
});
transaction.add(jitoTipInstruction);
return transaction;
}
async sendJitoTx(tx) {
const b = new types_js.Bundle([tx], 1);
const res = await this.client.sendBundle(b);
if (res.ok) {
return {
success: true,
bundleId: res.value,
};
}
return {
success: false,
error: res.error,
};
}
}
exports.JitoModule = JitoModule;
//# sourceMappingURL=JitoModule.cjs.map