@candy-swap/candy-sdk
Version:
Candy SDK for Solana
124 lines (123 loc) • 4.99 kB
JavaScript
"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 };
}