pump-swap-core-v1
Version:
This is core SDK for pumpdotfun offical AMM pool - PumpSwap
282 lines (281 loc) • 13.8 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const anchor_1 = require("@coral-xyz/anchor");
const nodewallet_1 = __importDefault(require("@coral-xyz/anchor/dist/cjs/nodewallet"));
const web3_js_1 = require("@solana/web3.js");
const spl_token_1 = require("@solana/spl-token");
const pump_swap_json_1 = __importDefault(require("../src/idl/pump-swap.json"));
const constants_1 = require("./constants");
class PumpSwapSDK {
/**
*
* @param cluster "mainnet" | "devnet"
* @param commitment "processed" | "confirmed" | "finalized"
* @param customRPC string
*/
constructor(cluster, commitment, customRPC) {
/**
*
* @param lpFeeBasisPoints BN
* @param protocolFeeBasisPoints BN
* @param protocolFeeRecipients Array<PublicKey>
* @returns Promise<TransactionInstruction>
*/
this.getCreateConfigInstruction = (lpFeeBasisPoints, protocolFeeBasisPoints, protocolFeeRecipients) => __awaiter(this, void 0, void 0, function* () {
const ix = yield this.program.methods
.createConfig(lpFeeBasisPoints, protocolFeeBasisPoints, protocolFeeRecipients)
.accounts({
program: this.program.programId
})
.instruction();
return ix;
});
/**
*
* @param baseAmountOut BN
* @param maxQuoteAmountIn BN
* @param tradeParam TradeType
* @returns Promise<TransactionInstruction>
*/
this.getBuyInstruction = (baseAmountOut, maxQuoteAmountIn, tradeParam) => __awaiter(this, void 0, void 0, function* () {
const { baseMint, baseTokenProgram, pool, quoteMint, quoteTokenProgram, user } = tradeParam;
const [globalConfig] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from(constants_1.GLOBAL_CONFIG_SEED)], this.program.programId);
const userBaseTokenAccount = (0, spl_token_1.getAssociatedTokenAddressSync)(baseMint, user);
const userQuoteTokenAccount = (0, spl_token_1.getAssociatedTokenAddressSync)(quoteMint, user);
const ix = yield this.program.methods
.buy(baseAmountOut, maxQuoteAmountIn)
.accounts({
pool,
globalConfig: globalConfig,
protocolFeeRecipient: constants_1.PROTOCOL_FEE_RECIPIENT,
userBaseTokenAccount,
userQuoteTokenAccount,
baseTokenProgram,
quoteTokenProgram,
program: this.program.programId,
user: user
})
.instruction();
return ix;
});
/**
*
* @param baseAmountIn BN
* @param minQuoteAmountOut BN
* @param tradeParam TradeType
* @returns Promise<TransactionInstruction>
*/
this.getSellInstruction = (baseAmountIn, minQuoteAmountOut, tradeParam) => __awaiter(this, void 0, void 0, function* () {
const { baseMint, baseTokenProgram, pool, quoteMint, quoteTokenProgram, user } = tradeParam;
const [globalConfig] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from(constants_1.GLOBAL_CONFIG_SEED)], this.program.programId);
const userBaseTokenAccount = (0, spl_token_1.getAssociatedTokenAddressSync)(baseMint, user);
const userQuoteTokenAccount = (0, spl_token_1.getAssociatedTokenAddressSync)(quoteMint, user);
const ix = yield this.program.methods
.sell(baseAmountIn, minQuoteAmountOut)
.accounts({
pool,
globalConfig: globalConfig,
program: this.program.programId,
protocolFeeRecipient: constants_1.PROTOCOL_FEE_RECIPIENT,
baseTokenProgram,
quoteTokenProgram,
userBaseTokenAccount,
userQuoteTokenAccount,
user: user
})
.instruction();
return ix;
});
/**
*
* @param index number
* @param baseAmountIn BN
* @param quoteAmountIn BN
* @param createPoolParam CreatePoolType
* @param user PublicKey
* @returns Promise<TransactionInstruction>
*/
this.getCreatePoolInstruction = (index, baseAmountIn, quoteAmountIn, createPoolParam, user) => __awaiter(this, void 0, void 0, function* () {
const { creator, baseMint, quoteMint, baseTokenProgram, quoteTokenProgram } = createPoolParam;
const [globalConfig] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from(constants_1.GLOBAL_CONFIG_SEED)], this.program.programId);
const userBaseTokenAccount = (0, spl_token_1.getAssociatedTokenAddressSync)(baseMint, user);
const userQuoteTokenAccount = (0, spl_token_1.getAssociatedTokenAddressSync)(quoteMint, user);
const ix = yield this.program.methods.createPool(index, baseAmountIn, quoteAmountIn).accounts({
globalConfig: globalConfig,
baseMint,
quoteMint,
userBaseTokenAccount,
userQuoteTokenAccount,
baseTokenProgram,
quoteTokenProgram,
creator,
program: this.program.programId,
})
.instruction();
return ix;
});
/**
*
* @param lpTokenAmountOut BN
* @param maxBaseAmountIn BN
* @param maxQuoteAmountIn BN
* @param depositType DepositType
* @returns Promise<TransactionInstruction>
*/
this.getDepositInstruction = (lpTokenAmountOut, maxBaseAmountIn, maxQuoteAmountIn, depositType) => __awaiter(this, void 0, void 0, function* () {
const { baseMint, pool, quoteMint, user } = depositType;
const [globalConfig] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from(constants_1.GLOBAL_CONFIG_SEED)], this.program.programId);
const [lpMint] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from(constants_1.LP_MINT_SEED), pool.toBuffer()], this.program.programId);
const userBaseTokenAccount = (0, spl_token_1.getAssociatedTokenAddressSync)(baseMint, user);
const userQuoteTokenAccount = (0, spl_token_1.getAssociatedTokenAddressSync)(quoteMint, user);
const userPoolTokenAccount = (0, spl_token_1.getAssociatedTokenAddressSync)(lpMint, user);
const ix = yield this.program.methods.deposit(lpTokenAmountOut, maxBaseAmountIn, maxQuoteAmountIn).accounts({
globalConfig: globalConfig,
pool,
program: this.program.programId,
userPoolTokenAccount,
userBaseTokenAccount,
userQuoteTokenAccount,
user: user
})
.instruction();
return ix;
});
/**
*
* @param disableCreatePool boolean
* @param disableDeposit boolean
* @param disableWithdraw boolean
* @param disableBuy boolean
* @param disableSell boolean
* @returns Promise<TransactionInstruction>
*/
this.getDisableInstruction = (disableCreatePool, disableDeposit, disableWithdraw, disableBuy, disableSell) => __awaiter(this, void 0, void 0, function* () {
const [globalConfig] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from(constants_1.GLOBAL_CONFIG_SEED)], this.program.programId);
const ix = yield this.program.methods
.disable(disableCreatePool, disableDeposit, disableWithdraw, disableBuy, disableSell)
.accounts({
globalConfig: globalConfig,
program: this.program.programId
})
.instruction();
return ix;
});
/**
*
* @param account PublicKey
* @returns Promise<TransactionInstruction>
*/
this.getExtendAccountInstruction = (account) => __awaiter(this, void 0, void 0, function* () {
const ix = yield this.program.methods
.extendAccount()
.accounts({
account: account,
program: this.program.programId
})
.instruction();
return ix;
});
/**
*
* @param newAdmin PublicKey
* @returns Promise<TransactionInstruction>
*/
this.getUpdateAdminInstruction = (newAdmin) => __awaiter(this, void 0, void 0, function* () {
const [globalConfig] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from(constants_1.GLOBAL_CONFIG_SEED)], this.program.programId);
const ix = yield this.program.methods
.updateAdmin()
.accounts({
globalConfig: globalConfig,
program: this.program.programId,
newAdmin: newAdmin
})
.instruction();
return ix;
});
/**
*
* @param lpFeeBasisPoints BN
* @param protocolFeeBasisPoints BN
* @param protocolFeeRecipients Array<PublicKey>
* @returns Promise<TransactionInstruction>
*/
this.getUpdateFeeConfigInstruction = (lpFeeBasisPoints, protocolFeeBasisPoints, protocolFeeRecipients) => __awaiter(this, void 0, void 0, function* () {
const [globalConfig] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from(constants_1.GLOBAL_CONFIG_SEED)], this.program.programId);
const ix = yield this.program.methods
.updateFeeConfig(lpFeeBasisPoints, protocolFeeBasisPoints, protocolFeeRecipients)
.accounts({
globalConfig: globalConfig,
program: this.program.programId
})
.instruction();
return ix;
});
/**
*
* @param lpTokenAmountIn BN
* @param minBaseAmountOut BN
* @param minQuoteAmountOut BN
* @param withdrawParam WithdrawType
* @returns Promise<TransactionInstruction>
*/
this.getWithdrawInstruction = (lpTokenAmountIn, minBaseAmountOut, minQuoteAmountOut, withdrawParam) => __awaiter(this, void 0, void 0, function* () {
const { baseMint, creator, index, quoteMint, user } = withdrawParam;
const [pool] = web3_js_1.PublicKey.findProgramAddressSync([
Buffer.from(constants_1.POOL_SEED),
new anchor_1.BN(index).toArrayLike(Buffer, "le", 8),
creator.toBuffer(),
baseMint.toBuffer(),
quoteMint.toBuffer(),
], this.program.programId);
const [lpMint] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from(constants_1.LP_MINT_SEED), pool.toBuffer()], this.program.programId);
const [userPoolTokenAccount] = web3_js_1.PublicKey.findProgramAddressSync([creator.toBuffer(), spl_token_1.TOKEN_2022_PROGRAM_ID.toBuffer(), lpMint.toBuffer()], this.program.programId);
const [globalConfig] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from(constants_1.GLOBAL_CONFIG_SEED)], this.program.programId);
const userBaseTokenAccount = (0, spl_token_1.getAssociatedTokenAddressSync)(baseMint, user);
const userQuoteTokenAccount = (0, spl_token_1.getAssociatedTokenAddressSync)(quoteMint, user);
const ix = yield this.program.methods
.withdraw(lpTokenAmountIn, minBaseAmountOut, minQuoteAmountOut)
.accounts({
pool,
globalConfig: globalConfig,
userBaseTokenAccount,
userQuoteTokenAccount,
userPoolTokenAccount,
program: this.program.programId,
user: user
})
.instruction();
return ix;
});
const wallet = new nodewallet_1.default(web3_js_1.Keypair.generate());
const url = cluster == "mainnet" ? (0, web3_js_1.clusterApiUrl)("mainnet-beta") : (0, web3_js_1.clusterApiUrl)("devnet");
let connection;
if (customRPC) {
try {
connection = new web3_js_1.Connection(customRPC, { commitment: commitment });
}
catch (error) {
connection = new web3_js_1.Connection(url, { commitment: commitment });
}
}
else {
connection = new web3_js_1.Connection(url, { commitment: commitment });
}
const provider = new anchor_1.AnchorProvider(connection, wallet, { commitment: commitment });
const program = new anchor_1.Program(pump_swap_json_1.default, provider);
this.program = program;
}
}
exports.default = PumpSwapSDK;