import BN from 'bn.js'; import { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_PROGRAM_ID } from '@solana/spl-token'; import { PublicKey, SYSVAR_RENT_PUBKEY, TransactionInstruction, SystemProgram } from '@solana/web3.js'; import { ADDRESS_LOOKUP_TABLE_PROGRAM_ID, BASKETS_V3_PROGRAM_ID, METADATA_PROGRAM_ID, MINTS, PYTHNET_CUSTODY_PRICE_USDC_ACCOUNT, PYTHNET_CUSTODY_PRICE_WSOL_ACCOUNT, } from '../../constants'; import { Fraction } from '../../layouts/fraction'; import { getAta, getGlobalConfigPda, getLookupTableAccount, getMetadataAccount, getRentPayerPda, serializeString } from '../pda'; import { HostFees, HostFeesLayout, MetadataParams } from '../../layouts/config'; const CREATE_BASKET_STATE_ACCOUNT_DISCRIMINATOR = Buffer.from([119, 105, 241, 40, 193, 2, 32, 12]); const RESIZE_BASKET_STATE_DISCRIMINATOR = Uint8Array.from([103, 216, 111, 212, 45, 172, 125, 84]); const CREATE_BASKET_DISCRIMINATOR = Buffer.from([175, 138, 181, 18, 46, 58, 146, 159]); export function createBasketStateAccountIx(params: { creator: PublicKey; basket: PublicKey; }): TransactionInstruction { let { creator, basket } = params; let rentPayerPda = getRentPayerPda(); const data = Buffer.concat([ CREATE_BASKET_STATE_ACCOUNT_DISCRIMINATOR, ]); const keys = [ { pubkey: creator, isSigner: true, isWritable: true }, { pubkey: basket, isSigner: false, isWritable: true }, { pubkey: rentPayerPda, isSigner: false, isWritable: true }, { pubkey: getGlobalConfigPda(), isSigner: false, isWritable: false }, { pubkey: SYSVAR_RENT_PUBKEY, isSigner: false, isWritable: false }, { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, ]; return new TransactionInstruction({ keys, programId: BASKETS_V3_PROGRAM_ID, data, }); } export function resizeBasketStateIx(params: { basket: PublicKey; }): TransactionInstruction { let { basket } = params; const data = Buffer.concat([ RESIZE_BASKET_STATE_DISCRIMINATOR, ]); const keys = [ { pubkey: basket, isSigner: false, isWritable: true }, ]; return new TransactionInstruction({ keys, programId: BASKETS_V3_PROGRAM_ID, data, }); } export function createBasketIx(params: { basket: PublicKey, mint: PublicKey, slot: number, creator: PublicKey, host: PublicKey, startPrice: Fraction, hostFees: HostFees, // [u16; 4] metadataParams: MetadataParams, network: "devnet" | "mainnet", }): TransactionInstruction { let { basket, mint, slot, creator, host, startPrice, hostFees, metadataParams } = params; let metadataAccount = getMetadataAccount(mint); let lookupTable0 = getLookupTableAccount(basket, slot); let lookupTable1 = getLookupTableAccount(basket, slot - 1); let wsolBasketTokenAccount = getAta(basket, MINTS[params.network].WSOL); let usdcBasketTokenAccount = getAta(basket, MINTS[params.network].USDC); const hostFeesBuffer = Buffer.alloc(HostFeesLayout.span); HostFeesLayout.encode(hostFees, hostFeesBuffer); const data = Buffer.concat([ CREATE_BASKET_DISCRIMINATOR, Buffer.from(new BN(slot).toArray("le", 8)), host.toBuffer(), Buffer.from(startPrice.high.toArray("le", 8)), Buffer.from(startPrice.low.toArray("le", 8)), hostFeesBuffer, serializeString(metadataParams.name), serializeString(metadataParams.symbol), serializeString(metadataParams.uri), ]); const keys = [ { pubkey: creator, isSigner: true, isWritable: true }, { pubkey: basket, isSigner: false, isWritable: true }, { pubkey: mint, isSigner: false, isWritable: true }, { pubkey: metadataAccount, isSigner: false, isWritable: true }, { pubkey: lookupTable0, isSigner: false, isWritable: true }, { pubkey: lookupTable1, isSigner: false, isWritable: true }, { pubkey: wsolBasketTokenAccount, isSigner: false, isWritable: true }, { pubkey: MINTS[params.network].WSOL, isSigner: false, isWritable: true }, { pubkey: PYTHNET_CUSTODY_PRICE_WSOL_ACCOUNT, isSigner: false, isWritable: true }, { pubkey: usdcBasketTokenAccount, isSigner: false, isWritable: true }, { pubkey: MINTS[params.network].USDC, isSigner: false, isWritable: true }, { pubkey: PYTHNET_CUSTODY_PRICE_USDC_ACCOUNT, isSigner: false, isWritable: true }, { pubkey: getGlobalConfigPda(), isSigner: false, isWritable: true }, { pubkey: ADDRESS_LOOKUP_TABLE_PROGRAM_ID, isSigner: false, isWritable: false }, { pubkey: METADATA_PROGRAM_ID, isSigner: false, isWritable: false }, { pubkey: SYSVAR_RENT_PUBKEY, isSigner: false, isWritable: false }, { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, { pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, ]; return new TransactionInstruction({ keys, programId: BASKETS_V3_PROGRAM_ID, data, }); }