UNPKG

@powrldgr/raydium-sdk-v2

Version:

An SDK for building applications on top of Raydium.

264 lines (248 loc) 8.53 kB
import { Connection, Keypair, PublicKey, SystemProgram, SYSVAR_RENT_PUBKEY, Transaction, TransactionInstruction, } from "@solana/web3.js"; import BN from "bn.js"; import { createInitializeAccountInstruction, TOKEN_PROGRAM_ID } from "@solana/spl-token"; import { InstructionType } from "@/common/txTool/txType"; import { struct, u16, u32, u64, u8 } from "../../marshmallow"; import { MARKET_STATE_LAYOUT_V2 } from "./layout"; type Transactions = { transaction: Transaction; signer?: Keypair[] | undefined; instructionTypes?: string[]; }[]; export function initializeMarket({ programId, marketInfo, }: { programId: PublicKey; marketInfo: { id: PublicKey; requestQueue: PublicKey; eventQueue: PublicKey; bids: PublicKey; asks: PublicKey; baseVault: PublicKey; quoteVault: PublicKey; baseMint: PublicKey; quoteMint: PublicKey; authority?: PublicKey; pruneAuthority?: PublicKey; baseLotSize: BN; quoteLotSize: BN; feeRateBps: number; vaultSignerNonce: BN; quoteDustThreshold: BN; }; }): TransactionInstruction { const dataLayout = struct([ u8("version"), u32("instruction"), u64("baseLotSize"), u64("quoteLotSize"), u16("feeRateBps"), u64("vaultSignerNonce"), u64("quoteDustThreshold"), ]); const keys = [ { pubkey: marketInfo.id, isSigner: false, isWritable: true }, { pubkey: marketInfo.requestQueue, isSigner: false, isWritable: true }, { pubkey: marketInfo.eventQueue, isSigner: false, isWritable: true }, { pubkey: marketInfo.bids, isSigner: false, isWritable: true }, { pubkey: marketInfo.asks, isSigner: false, isWritable: true }, { pubkey: marketInfo.baseVault, isSigner: false, isWritable: true }, { pubkey: marketInfo.quoteVault, isSigner: false, isWritable: true }, { pubkey: marketInfo.baseMint, isSigner: false, isWritable: false }, { pubkey: marketInfo.quoteMint, isSigner: false, isWritable: false }, // Use a dummy address if using the new dex upgrade to save tx space. { pubkey: marketInfo.authority ? marketInfo.quoteMint : SYSVAR_RENT_PUBKEY, isSigner: false, isWritable: false, }, ] .concat(marketInfo.authority ? { pubkey: marketInfo.authority, isSigner: false, isWritable: false } : []) .concat( marketInfo.authority && marketInfo.pruneAuthority ? { pubkey: marketInfo.pruneAuthority, isSigner: false, isWritable: false } : [], ); const data = Buffer.alloc(dataLayout.span); dataLayout.encode( { version: 0, instruction: 0, baseLotSize: marketInfo.baseLotSize, quoteLotSize: marketInfo.quoteLotSize, feeRateBps: marketInfo.feeRateBps, vaultSignerNonce: marketInfo.vaultSignerNonce, quoteDustThreshold: marketInfo.quoteDustThreshold, }, data, ); return new TransactionInstruction({ keys, programId, data, }); } export async function makeCreateMarketInstruction({ connection, wallet, marketInfo, }: { connection: Connection; wallet: PublicKey; marketInfo: { programId: PublicKey; id: { publicKey: PublicKey; seed: string }; baseMint: PublicKey; quoteMint: PublicKey; baseVault: { publicKey: PublicKey; seed: string }; quoteVault: { publicKey: PublicKey; seed: string }; vaultOwner: PublicKey; requestQueue: { publicKey: PublicKey; seed: string }; eventQueue: { publicKey: PublicKey; seed: string }; bids: { publicKey: PublicKey; seed: string }; asks: { publicKey: PublicKey; seed: string }; feeRateBps: number; vaultSignerNonce: BN; quoteDustThreshold: BN; baseLotSize: BN; quoteLotSize: BN; requestQueueSpace?: number; eventQueueSpace?: number; orderbookQueueSpace?: number; lowestFeeMarket?: boolean; }; }): Promise<Transactions> { const tx1 = new Transaction(); const accountLamports = await connection.getMinimumBalanceForRentExemption(165); tx1.add( SystemProgram.createAccountWithSeed({ fromPubkey: wallet, basePubkey: wallet, seed: marketInfo.baseVault.seed, newAccountPubkey: marketInfo.baseVault.publicKey, lamports: accountLamports, space: 165, programId: TOKEN_PROGRAM_ID, }), SystemProgram.createAccountWithSeed({ fromPubkey: wallet, basePubkey: wallet, seed: marketInfo.quoteVault.seed, newAccountPubkey: marketInfo.quoteVault.publicKey, lamports: accountLamports, space: 165, programId: TOKEN_PROGRAM_ID, }), createInitializeAccountInstruction(marketInfo.baseVault.publicKey, marketInfo.baseMint, marketInfo.vaultOwner), createInitializeAccountInstruction(marketInfo.quoteVault.publicKey, marketInfo.quoteMint, marketInfo.vaultOwner), SystemProgram.createAccountWithSeed({ fromPubkey: wallet, basePubkey: wallet, seed: marketInfo.id.seed, newAccountPubkey: marketInfo.id.publicKey, lamports: await connection.getMinimumBalanceForRentExemption(MARKET_STATE_LAYOUT_V2.span), space: MARKET_STATE_LAYOUT_V2.span, programId: marketInfo.programId, }), ); const tx2 = new Transaction(); tx2.add( SystemProgram.createAccountWithSeed({ fromPubkey: wallet, basePubkey: wallet, seed: marketInfo.requestQueue.seed, newAccountPubkey: marketInfo.requestQueue.publicKey, lamports: marketInfo.lowestFeeMarket ? 6208320 : await connection.getMinimumBalanceForRentExemption(marketInfo.requestQueueSpace ?? 5120 + 12), space: marketInfo.lowestFeeMarket ? 764 : marketInfo.requestQueueSpace ?? 5120 + 12, programId: marketInfo.programId, }), SystemProgram.createAccountWithSeed({ fromPubkey: wallet, basePubkey: wallet, seed: marketInfo.eventQueue.seed, newAccountPubkey: marketInfo.eventQueue.publicKey, lamports: marketInfo.lowestFeeMarket ? 79594560 : await connection.getMinimumBalanceForRentExemption(marketInfo.eventQueueSpace ?? 262144 + 12), space: marketInfo.lowestFeeMarket ? 11308 : marketInfo.eventQueueSpace ?? 262144 + 12, programId: marketInfo.programId, }), SystemProgram.createAccountWithSeed({ fromPubkey: wallet, basePubkey: wallet, seed: marketInfo.bids.seed, newAccountPubkey: marketInfo.bids.publicKey, lamports: marketInfo.lowestFeeMarket ? 101977920 : await connection.getMinimumBalanceForRentExemption(marketInfo.orderbookQueueSpace ?? 65536 + 12), space: marketInfo.lowestFeeMarket ? 14524 : marketInfo.orderbookQueueSpace ?? 65536 + 12, programId: marketInfo.programId, }), SystemProgram.createAccountWithSeed({ fromPubkey: wallet, basePubkey: wallet, seed: marketInfo.asks.seed, newAccountPubkey: marketInfo.asks.publicKey, lamports: marketInfo.lowestFeeMarket ? 101977920 : await connection.getMinimumBalanceForRentExemption(marketInfo.orderbookQueueSpace ?? 65536 + 12), space: marketInfo.lowestFeeMarket ? 14524 : marketInfo.orderbookQueueSpace ?? 65536 + 12, programId: marketInfo.programId, }), initializeMarket({ programId: marketInfo.programId, marketInfo: { id: marketInfo.id.publicKey, requestQueue: marketInfo.requestQueue.publicKey, eventQueue: marketInfo.eventQueue.publicKey, bids: marketInfo.bids.publicKey, asks: marketInfo.asks.publicKey, baseVault: marketInfo.baseVault.publicKey, quoteVault: marketInfo.quoteVault.publicKey, baseMint: marketInfo.baseMint, quoteMint: marketInfo.quoteMint, baseLotSize: marketInfo.baseLotSize, quoteLotSize: marketInfo.quoteLotSize, feeRateBps: marketInfo.feeRateBps, vaultSignerNonce: marketInfo.vaultSignerNonce, quoteDustThreshold: marketInfo.quoteDustThreshold, }, }), ); return [ { transaction: tx1, signer: [], instructionTypes: [ InstructionType.CreateAccount, InstructionType.CreateAccount, InstructionType.InitAccount, InstructionType.InitAccount, ], }, { transaction: tx2, signer: [], instructionTypes: [ InstructionType.CreateAccount, InstructionType.CreateAccount, InstructionType.CreateAccount, InstructionType.CreateAccount, InstructionType.CreateAccount, InstructionType.InitMarket, ], }, ]; }