UNPKG

@candy-swap/candy-sdk

Version:

Candy SDK for Solana

124 lines (123 loc) 4.99 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getTokenAccount = getTokenAccount; exports.getLiquidityPoolAddress = getLiquidityPoolAddress; exports.getCashierAddress = getCashierAddress; exports.createAddressLookupTable = createAddressLookupTable; exports.extendAddressLookupTable = extendAddressLookupTable; exports.getOrCreateSwapLookupTable = getOrCreateSwapLookupTable; const web3_js_1 = require("@solana/web3.js"); const spl_token_1 = require("@solana/spl-token"); const web3_js_2 = require("@solana/web3.js"); /** * Get token account address * @param mint Token mint address * @param owner Owner address * @returns Token account address */ async function getTokenAccount(mint, owner) { return await (0, spl_token_1.getAssociatedTokenAddress)(mint, owner); } /** * Get liquidity pool PDA address * @param programId Program ID * @param mint Token mint address * @returns Liquidity pool address */ async function getLiquidityPoolAddress(programId, mint) { return web3_js_1.PublicKey.findProgramAddressSync([Buffer.from("liquidity_pool"), mint.toBuffer()], programId); } /** * Get cashier PDA address * @param programId Program ID * @returns Cashier address */ async function getCashierAddress(programId) { return web3_js_1.PublicKey.findProgramAddressSync([Buffer.from("cashier")], programId); } /** * Create and initialize Address Lookup Table * @param connection Solana connection instance * @param payer Payer keypair * @param slot Current slot * @returns Address Lookup Table address */ async function createAddressLookupTable(connection, payer, slot) { // Create a new Address Lookup Table account const [createIx, lookupTableAddress] = web3_js_2.AddressLookupTableProgram.createLookupTable({ authority: payer.publicKey, payer: payer.publicKey, recentSlot: slot, }); // Create and send transaction const tx = new web3_js_2.Transaction().add(createIx); await (0, web3_js_2.sendAndConfirmTransaction)(connection, tx, [payer], { commitment: 'confirmed', preflightCommitment: 'confirmed', }); return lookupTableAddress; } /** * Add addresses to Address Lookup Table * @param connection Solana connection instance * @param payer Payer keypair * @param lookupTableAddress Address Lookup Table address * @param addresses Addresses to add */ async function extendAddressLookupTable(connection, payer, lookupTableAddress, addresses) { // Create extension instruction const extendIx = web3_js_2.AddressLookupTableProgram.extendLookupTable({ payer: payer.publicKey, authority: payer.publicKey, lookupTable: lookupTableAddress, addresses: addresses, }); // Create and send transaction const tx = new web3_js_2.Transaction().add(extendIx); await (0, web3_js_2.sendAndConfirmTransaction)(connection, tx, [payer], { commitment: 'confirmed', preflightCommitment: 'confirmed', }); } /** * Get or create Address Lookup Table for Swap operation * @param connection Solana connection instance * @param payer Payer keypair * @param programId Program ID * @param mint Token mint address * @returns Address Lookup Table address and whether it is newly created */ async function getOrCreateSwapLookupTable(connection, payer, programId, mint) { // Calculate lookup table seed const seed = `swap_${mint.toBase58()}`; const derivedAddress = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from(seed)], programId)[0]; // Try to get existing lookup table const existingTable = await connection.getAddressLookupTable(derivedAddress).then(res => res.value); if (existingTable) { return { address: derivedAddress, isNew: false }; } // If not found, create new lookup table const slot = await connection.getSlot(); const lookupTableAddress = await createAddressLookupTable(connection, payer, slot); // Get required account addresses const [dexCfgAccount] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from("CurveConfiguration")], programId); const [pool] = await getLiquidityPoolAddress(programId, mint); const [liquidityAccount] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from("liquidity_account"), mint.toBuffer()], programId); const [cashier] = await getCashierAddress(programId); const poolTokenAccount = await (0, spl_token_1.getAssociatedTokenAddress)(mint, pool, true); // Add addresses to lookup table const addresses = [ dexCfgAccount, pool, liquidityAccount, mint, poolTokenAccount, cashier, web3_js_2.SYSVAR_RENT_PUBKEY, web3_js_2.SystemProgram.programId, ]; await extendAddressLookupTable(connection, payer, lookupTableAddress, addresses); // Wait for lookup table to be ready await new Promise(resolve => setTimeout(resolve, 2000)); return { address: lookupTableAddress, isNew: true }; }