Last active
May 2, 2025 04:22
-
-
Save amilz/e1a31d04ffd9316517ca908bd455326c to your computer and use it in GitHub Desktop.
QuickNode Stream - Raydium Swap Parse
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /** | |
| * Major modifications from V1: | |
| * 1. Changed architecture to class-based | |
| * 2. Added support for multiple mints | |
| * 3. Added native SOL support | |
| * 4. Handled 0 pre-balance token accounts | |
| * 5. Handled optional accounts for Raydium's swap instructions | |
| */ | |
| class AmmInstructionProcessor { | |
| constructor(idl) { | |
| this.idl = idl; | |
| this.targetInstructions = ["swapBaseIn", "swapBaseOut"]; | |
| this.targetAccounts = ["userSourceTokenAccount", "userDestinationTokenAccount", "userSourceOwner"]; | |
| } | |
| processInstruction(ix, decodedData, preBalances, postBalances, preSolBalances, postSolBalances, accountKeys) { | |
| const idlInstruction = this.idl.instructions[decodedData[0]]; | |
| if (!idlInstruction?.name || !this.targetInstructions.includes(idlInstruction.name)) { | |
| return null; | |
| } | |
| const idlIxLength = idlInstruction.accounts.length; | |
| const ixLength = ix.accounts.length; | |
| let txAccountIndex = 0; | |
| const accounts = idlInstruction.accounts | |
| .map(account => { | |
| // This will skip all IDL accounts listed as optional | |
| // if the current instruction has more accounts than the IDL's account list | |
| // This requires manual addition of optional accounts to the IDL | |
| // Seems fine for Raydium's swap instructions, but | |
| // this means multiple optional accounts in an instruction could cause issues | |
| // instruction-specific may require additional modifications | |
| if (account.optional && idlIxLength > ixLength) { | |
| return null; | |
| } | |
| if (!this.targetAccounts.includes(account.name)) { | |
| txAccountIndex++; | |
| return null; | |
| } | |
| return { | |
| accountName: account.name, | |
| accountAddress: ix.accounts[txAccountIndex++] | |
| }; | |
| }) | |
| .filter(Boolean); | |
| const ownerAccount = accounts.find(account => | |
| account.accountName === "userSourceOwner" | |
| ); | |
| if (!ownerAccount) return null; | |
| const solBalanceChange = this.getSolBalanceChange(ownerAccount, accountKeys, preSolBalances, postSolBalances); | |
| const tokenBalanceChanges = this.getBalanceChanges(preBalances, postBalances, ownerAccount.accountAddress); | |
| const ownerBalanceChanges = [...tokenBalanceChanges, solBalanceChange]; | |
| return { ownerBalanceChanges }; | |
| } | |
| getSolBalanceChange(accountOwner, accountKeys, preBalances, postBalances) { | |
| const LAMPORTS_PER_SOL = 1_000_000_000; | |
| const accountIndex = accountKeys.findIndex(key => key.pubkey === accountOwner.accountAddress); | |
| const preSolBalance = preBalances[accountIndex] / LAMPORTS_PER_SOL; | |
| const postSolBalance = postBalances[accountIndex] / LAMPORTS_PER_SOL; | |
| return { | |
| mint: 'So11111111111111111111111111111111111111111', // Native | |
| owner: accountOwner.accountAddress, | |
| change: postSolBalance - preSolBalance, | |
| preBalance: preSolBalance, | |
| postBalance: postSolBalance | |
| } | |
| } | |
| getBalanceChanges(preBalances, postBalances, ownerAddress) { | |
| const filterByOwner = balances => balances.filter(balance => balance.owner === ownerAddress); | |
| const filtered = { | |
| pre: filterByOwner(preBalances), | |
| post: filterByOwner(postBalances) | |
| }; | |
| // Get all unique mints for this owner (across pre and post) | |
| const allMints = new Set([ | |
| ...filtered.pre.map(b => b.mint), | |
| ...filtered.post.map(b => b.mint) | |
| ]); | |
| return Array.from(allMints).map(mint => { | |
| const preMint = filtered.pre.find(b => b.mint === mint); | |
| const postMint = filtered.post.find(b => b.mint === mint); | |
| const preAmount = preMint?.uiTokenAmount.uiAmount ?? 0; | |
| const postAmount = postMint?.uiTokenAmount.uiAmount ?? 0; | |
| return { | |
| mint, | |
| owner: ownerAddress, | |
| change: postAmount - preAmount, | |
| preBalance: preAmount, | |
| postBalance: postAmount | |
| }; | |
| }); | |
| } | |
| } | |
| class TransactionValidator { | |
| constructor(targetMints, voteProgram, solMint, solDeductionThreshold) { | |
| this.targetMints = targetMints; | |
| this.voteProgram = voteProgram; | |
| this.solMint = solMint; | |
| this.solDeductionThreshold = solDeductionThreshold; | |
| } | |
| isValid(tx, idl) { | |
| return !this.hasError(tx) | |
| && !this.isVoteTransaction(tx) | |
| && this.invokesTargetProgram(tx, idl) | |
| && this.hasTargetMintActivity(tx); | |
| } | |
| hasError(tx) { | |
| return tx.meta?.err != null; | |
| } | |
| isVoteTransaction(tx) { | |
| return tx.transaction?.message?.instructions?.some(inst => | |
| inst.program === "vote" || inst.programId === this.voteProgram | |
| ); | |
| } | |
| invokesTargetProgram(tx, idl) { | |
| const { meta: { logMessages = [], innerInstructions = [] }, transaction: { message: { instructions = [] } } } = tx; | |
| return instructions.some(inst => inst.programId === idl.address) | |
| || innerInstructions.some(inst => inst.instructions.some(inner => inner.programId === idl.address)) | |
| || logMessages.some(log => log.includes(`Program ${idl.address} invoke [1]`)); | |
| } | |
| hasTargetMintActivity(tx) { | |
| const { meta: { preTokenBalances = [], postTokenBalances = [] } } = tx; | |
| const relevantBalances = [...preTokenBalances, ...postTokenBalances].filter( | |
| balance => this.targetMints.includes(balance.mint) | |
| ); | |
| return relevantBalances.length > 0; | |
| } | |
| validateSolDeduction(balanceChanges) { | |
| const solChange = balanceChanges.find(change => change.mint === this.solMint); | |
| if (!solChange || solChange.change >= 0) return false; | |
| return Math.abs(solChange.change) >= this.solDeductionThreshold; | |
| } | |
| } | |
| class StreamHandler { | |
| constructor(config) { | |
| this.validator = new TransactionValidator( | |
| config.targetMints, | |
| config.voteProgram, | |
| config.solMint, | |
| config.solDeductionThreshold | |
| ); | |
| this.processor = new AmmInstructionProcessor(config.idl); | |
| this.base58Decoder = config.base58Decoder; | |
| } | |
| processTransaction(tx) { | |
| const { transaction, meta: { | |
| preTokenBalances = [], | |
| postTokenBalances = [], | |
| preBalances = [], | |
| postBalances = [] | |
| } } = tx; | |
| const signature = transaction.signatures[0]; | |
| const { accountKeys } = transaction.message; | |
| const instructions = transaction.message.instructions | |
| .filter(ix => ix.programId === this.processor.idl.address) | |
| .map(ix => { | |
| try { | |
| const decodedData = this.base58Decoder(ix.data); | |
| return this.processor.processInstruction(ix, decodedData, preTokenBalances, postTokenBalances, preBalances, postBalances, accountKeys); | |
| } catch (e) { | |
| console.error('Instruction processing error:', e); | |
| return null; | |
| } | |
| }) | |
| .filter(Boolean); | |
| return instructions.length > 0 ? { signature, ...instructions[0] } : null; | |
| } | |
| handleStream(stream) { | |
| try { | |
| const data = stream[0]; | |
| if (!data?.transactions?.length) return null; | |
| const matchedTransactions = data.transactions | |
| .filter(tx => this.validator.isValid(tx, this.processor.idl)) | |
| .map(tx => this.processTransaction(tx)) | |
| .filter(Boolean); | |
| return matchedTransactions.length > 0 | |
| ? { numTx: matchedTransactions.length, transactions: matchedTransactions } | |
| : null; | |
| } catch (error) { | |
| return { error: error.message, stack: error.stack }; | |
| } | |
| } | |
| } | |
| const IDL = { | |
| "version": "0.3.0", | |
| "name": "raydium_amm", | |
| "address": "675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8", | |
| "instructions": [ | |
| { | |
| "name": "initialize", | |
| "accounts": [ | |
| { | |
| "name": "tokenProgram", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "systemProgram", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "rent", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "amm", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammAuthority", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammOpenOrders", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "lpMintAddress", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "coinMintAddress", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "pcMintAddress", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "poolCoinTokenAccount", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "poolPcTokenAccount", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "poolWithdrawQueue", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "poolTargetOrdersAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "userLpTokenAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "poolTempLpTokenAccount", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumProgram", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumMarket", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "userWallet", | |
| "isMut": true, | |
| "isSigner": true | |
| } | |
| ], | |
| "args": [ | |
| { | |
| "name": "nonce", | |
| "type": "u8" | |
| }, | |
| { | |
| "name": "openTime", | |
| "type": "u64" | |
| } | |
| ] | |
| }, | |
| { | |
| "name": "initialize2", | |
| "accounts": [ | |
| { | |
| "name": "tokenProgram", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "splAssociatedTokenAccount", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "systemProgram", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "rent", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "amm", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammAuthority", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammOpenOrders", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "lpMint", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "coinMint", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "pcMint", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "poolCoinTokenAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "poolPcTokenAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "poolWithdrawQueue", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammTargetOrders", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "poolTempLp", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumProgram", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumMarket", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "userWallet", | |
| "isMut": true, | |
| "isSigner": true | |
| }, | |
| { | |
| "name": "userTokenCoin", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "userTokenPc", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "userLpTokenAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| } | |
| ], | |
| "args": [ | |
| { | |
| "name": "nonce", | |
| "type": "u8" | |
| }, | |
| { | |
| "name": "openTime", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "initPcAmount", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "initCoinAmount", | |
| "type": "u64" | |
| } | |
| ] | |
| }, | |
| { | |
| "name": "monitorStep", | |
| "accounts": [ | |
| { | |
| "name": "tokenProgram", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "rent", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "clock", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "amm", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammAuthority", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammOpenOrders", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammTargetOrders", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "poolCoinTokenAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "poolPcTokenAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "poolWithdrawQueue", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumProgram", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumMarket", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumCoinVaultAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumPcVaultAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumVaultSigner", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumReqQ", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumEventQ", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumBids", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumAsks", | |
| "isMut": true, | |
| "isSigner": false | |
| } | |
| ], | |
| "args": [ | |
| { | |
| "name": "planOrderLimit", | |
| "type": "u16" | |
| }, | |
| { | |
| "name": "placeOrderLimit", | |
| "type": "u16" | |
| }, | |
| { | |
| "name": "cancelOrderLimit", | |
| "type": "u16" | |
| } | |
| ] | |
| }, | |
| { | |
| "name": "deposit", | |
| "accounts": [ | |
| { | |
| "name": "tokenProgram", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "amm", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammAuthority", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammOpenOrders", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammTargetOrders", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "lpMintAddress", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "poolCoinTokenAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "poolPcTokenAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumMarket", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "userCoinTokenAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "userPcTokenAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "userLpTokenAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "userOwner", | |
| "isMut": false, | |
| "isSigner": true | |
| }, | |
| { | |
| "name": "serumEventQueue", | |
| "isMut": false, | |
| "isSigner": false | |
| } | |
| ], | |
| "args": [ | |
| { | |
| "name": "maxCoinAmount", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "maxPcAmount", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "baseSide", | |
| "type": "u64" | |
| } | |
| ] | |
| }, | |
| { | |
| "name": "withdraw", | |
| "accounts": [ | |
| { | |
| "name": "tokenProgram", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "amm", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammAuthority", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammOpenOrders", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammTargetOrders", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "lpMintAddress", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "poolCoinTokenAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "poolPcTokenAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "poolWithdrawQueue", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "poolTempLpTokenAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumProgram", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumMarket", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumCoinVaultAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumPcVaultAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumVaultSigner", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "userLpTokenAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "uerCoinTokenAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "uerPcTokenAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "userOwner", | |
| "isMut": false, | |
| "isSigner": true | |
| }, | |
| { | |
| "name": "serumEventQ", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumBids", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumAsks", | |
| "isMut": true, | |
| "isSigner": false | |
| } | |
| ], | |
| "args": [ | |
| { | |
| "name": "amount", | |
| "type": "u64" | |
| } | |
| ] | |
| }, | |
| { | |
| "name": "migrateToOpenBook", | |
| "accounts": [ | |
| { | |
| "name": "tokenProgram", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "systemProgram", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "rent", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "amm", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammAuthority", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammOpenOrders", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammTokenCoin", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammTokenPc", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammTargetOrders", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumProgram", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumMarket", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumBids", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumAsks", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumEventQueue", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumCoinVault", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumPcVault", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumVaultSigner", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "newAmmOpenOrders", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "newSerumProgram", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "newSerumMarket", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "admin", | |
| "isMut": true, | |
| "isSigner": true | |
| } | |
| ], | |
| "args": [] | |
| }, | |
| { | |
| "name": "setParams", | |
| "accounts": [ | |
| { | |
| "name": "tokenProgram", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "amm", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammAuthority", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammOpenOrders", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammTargetOrders", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammCoinVault", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammPcVault", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumProgram", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumMarket", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumCoinVault", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumPcVault", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumVaultSigner", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumEventQueue", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumBids", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumAsks", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammAdminAccount", | |
| "isMut": false, | |
| "isSigner": true | |
| } | |
| ], | |
| "args": [ | |
| { | |
| "name": "param", | |
| "type": "u8" | |
| }, | |
| { | |
| "name": "value", | |
| "type": { | |
| "option": "u64" | |
| } | |
| }, | |
| { | |
| "name": "newPubkey", | |
| "type": { | |
| "option": "publicKey" | |
| } | |
| }, | |
| { | |
| "name": "fees", | |
| "type": { | |
| "option": { | |
| "defined": "Fees" | |
| } | |
| } | |
| }, | |
| { | |
| "name": "lastOrderDistance", | |
| "type": { | |
| "option": { | |
| "defined": "LastOrderDistance" | |
| } | |
| } | |
| }, | |
| { | |
| "name": "needTakeAmounts", | |
| "type": { | |
| "option": { | |
| "defined": "NeedTake" | |
| } | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "name": "withdrawPnl", | |
| "accounts": [ | |
| { | |
| "name": "tokenProgram", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "amm", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammConfig", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammAuthority", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammOpenOrders", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "poolCoinTokenAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "poolPcTokenAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "coinPnlTokenAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "pcPnlTokenAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "pnlOwnerAccount", | |
| "isMut": false, | |
| "isSigner": true | |
| }, | |
| { | |
| "name": "ammTargetOrders", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumProgram", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumMarket", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumEventQueue", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumCoinVaultAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumPcVaultAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumVaultSigner", | |
| "isMut": false, | |
| "isSigner": false | |
| } | |
| ], | |
| "args": [] | |
| }, | |
| { | |
| "name": "withdrawSrm", | |
| "accounts": [ | |
| { | |
| "name": "tokenProgram", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "amm", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammOwnerAccount", | |
| "isMut": false, | |
| "isSigner": true | |
| }, | |
| { | |
| "name": "ammAuthority", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "srmToken", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "destSrmToken", | |
| "isMut": true, | |
| "isSigner": false | |
| } | |
| ], | |
| "args": [ | |
| { | |
| "name": "amount", | |
| "type": "u64" | |
| } | |
| ] | |
| }, | |
| { | |
| "name": "swapBaseIn", | |
| "accounts": [ | |
| { | |
| "name": "tokenProgram", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "amm", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammAuthority", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammOpenOrders", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammTargetOrders", | |
| "isMut": true, | |
| "isSigner": false, | |
| "optional": true | |
| }, | |
| { | |
| "name": "poolCoinTokenAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "poolPcTokenAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumProgram", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumMarket", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumBids", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumAsks", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumEventQueue", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumCoinVaultAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumPcVaultAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumVaultSigner", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "userSourceTokenAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "userDestinationTokenAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "userSourceOwner", | |
| "isMut": false, | |
| "isSigner": true | |
| } | |
| ], | |
| "args": [ | |
| { | |
| "name": "amountIn", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "minimumAmountOut", | |
| "type": "u64" | |
| } | |
| ] | |
| }, | |
| { | |
| "name": "preInitialize", | |
| "accounts": [ | |
| { | |
| "name": "tokenProgram", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "systemProgram", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "rent", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammTargetOrders", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "poolWithdrawQueue", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammAuthority", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "lpMintAddress", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "coinMintAddress", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "pcMintAddress", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "poolCoinTokenAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "poolPcTokenAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "poolTempLpTokenAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumMarket", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "userWallet", | |
| "isMut": true, | |
| "isSigner": true | |
| } | |
| ], | |
| "args": [ | |
| { | |
| "name": "nonce", | |
| "type": "u8" | |
| } | |
| ] | |
| }, | |
| { | |
| "name": "swapBaseOut", | |
| "accounts": [ | |
| { | |
| "name": "tokenProgram", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "amm", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammAuthority", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammOpenOrders", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| // Optional (recommended not to use) | |
| { | |
| "name": "ammTargetOrders", | |
| "isMut": true, | |
| "isSigner": false, | |
| "optional": true | |
| }, | |
| { | |
| "name": "poolCoinTokenAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "poolPcTokenAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumProgram", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumMarket", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumBids", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumAsks", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumEventQueue", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumCoinVaultAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumPcVaultAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumVaultSigner", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "userSourceTokenAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "userDestinationTokenAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "userSourceOwner", | |
| "isMut": false, | |
| "isSigner": true | |
| } | |
| ], | |
| "args": [ | |
| { | |
| "name": "maxAmountIn", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "amountOut", | |
| "type": "u64" | |
| } | |
| ] | |
| }, | |
| { | |
| "name": "simulateInfo", | |
| "accounts": [ | |
| { | |
| "name": "amm", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammAuthority", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammOpenOrders", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "poolCoinTokenAccount", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "poolPcTokenAccount", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "lpMintAddress", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumMarket", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumEventQueue", | |
| "isMut": false, | |
| "isSigner": false | |
| } | |
| ], | |
| "args": [ | |
| { | |
| "name": "param", | |
| "type": "u8" | |
| }, | |
| { | |
| "name": "swapBaseInValue", | |
| "type": { | |
| "option": { | |
| "defined": "SwapInstructionBaseIn" | |
| } | |
| } | |
| }, | |
| { | |
| "name": "swapBaseOutValue", | |
| "type": { | |
| "option": { | |
| "defined": "SwapInstructionBaseOut" | |
| } | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "name": "adminCancelOrders", | |
| "accounts": [ | |
| { | |
| "name": "tokenProgram", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "amm", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammAuthority", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammOpenOrders", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammTargetOrders", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "poolCoinTokenAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "poolPcTokenAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "ammOwnerAccount", | |
| "isMut": false, | |
| "isSigner": true | |
| }, | |
| { | |
| "name": "ammConfig", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumProgram", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumMarket", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumCoinVaultAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumPcVaultAccount", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumVaultSigner", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumEventQ", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumBids", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "serumAsks", | |
| "isMut": true, | |
| "isSigner": false | |
| } | |
| ], | |
| "args": [ | |
| { | |
| "name": "limit", | |
| "type": "u16" | |
| } | |
| ] | |
| }, | |
| { | |
| "name": "createConfigAccount", | |
| "accounts": [ | |
| { | |
| "name": "admin", | |
| "isMut": true, | |
| "isSigner": true | |
| }, | |
| { | |
| "name": "ammConfig", | |
| "isMut": true, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "owner", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "systemProgram", | |
| "isMut": false, | |
| "isSigner": false | |
| }, | |
| { | |
| "name": "rent", | |
| "isMut": false, | |
| "isSigner": false | |
| } | |
| ], | |
| "args": [] | |
| }, | |
| { | |
| "name": "updateConfigAccount", | |
| "accounts": [ | |
| { | |
| "name": "admin", | |
| "isMut": false, | |
| "isSigner": true | |
| }, | |
| { | |
| "name": "ammConfig", | |
| "isMut": true, | |
| "isSigner": false | |
| } | |
| ], | |
| "args": [ | |
| { | |
| "name": "param", | |
| "type": "u8" | |
| }, | |
| { | |
| "name": "owner", | |
| "type": "publicKey" | |
| } | |
| ] | |
| } | |
| ], | |
| "accounts": [ | |
| { | |
| "name": "TargetOrders", | |
| "type": { | |
| "kind": "struct", | |
| "fields": [ | |
| { | |
| "name": "owner", | |
| "type": { | |
| "array": [ | |
| "u64", | |
| 4 | |
| ] | |
| } | |
| }, | |
| { | |
| "name": "buyOrders", | |
| "type": { | |
| "array": [ | |
| { | |
| "defined": "TargetOrder" | |
| }, | |
| 50 | |
| ] | |
| } | |
| }, | |
| { | |
| "name": "padding1", | |
| "type": { | |
| "array": [ | |
| "u64", | |
| 8 | |
| ] | |
| } | |
| }, | |
| { | |
| "name": "targetX", | |
| "type": "u128" | |
| }, | |
| { | |
| "name": "targetY", | |
| "type": "u128" | |
| }, | |
| { | |
| "name": "planXBuy", | |
| "type": "u128" | |
| }, | |
| { | |
| "name": "planYBuy", | |
| "type": "u128" | |
| }, | |
| { | |
| "name": "planXSell", | |
| "type": "u128" | |
| }, | |
| { | |
| "name": "planYSell", | |
| "type": "u128" | |
| }, | |
| { | |
| "name": "placedX", | |
| "type": "u128" | |
| }, | |
| { | |
| "name": "placedY", | |
| "type": "u128" | |
| }, | |
| { | |
| "name": "calcPnlX", | |
| "type": "u128" | |
| }, | |
| { | |
| "name": "calcPnlY", | |
| "type": "u128" | |
| }, | |
| { | |
| "name": "sellOrders", | |
| "type": { | |
| "array": [ | |
| { | |
| "defined": "TargetOrder" | |
| }, | |
| 50 | |
| ] | |
| } | |
| }, | |
| { | |
| "name": "padding2", | |
| "type": { | |
| "array": [ | |
| "u64", | |
| 6 | |
| ] | |
| } | |
| }, | |
| { | |
| "name": "replaceBuyClientId", | |
| "type": { | |
| "array": [ | |
| "u64", | |
| 10 | |
| ] | |
| } | |
| }, | |
| { | |
| "name": "replaceSellClientId", | |
| "type": { | |
| "array": [ | |
| "u64", | |
| 10 | |
| ] | |
| } | |
| }, | |
| { | |
| "name": "lastOrderNumerator", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "lastOrderDenominator", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "planOrdersCur", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "placeOrdersCur", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "validBuyOrderNum", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "validSellOrderNum", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "padding3", | |
| "type": { | |
| "array": [ | |
| "u64", | |
| 10 | |
| ] | |
| } | |
| }, | |
| { | |
| "name": "freeSlotBits", | |
| "type": "u128" | |
| } | |
| ] | |
| } | |
| }, | |
| { | |
| "name": "Fees", | |
| "type": { | |
| "kind": "struct", | |
| "fields": [ | |
| { | |
| "name": "minSeparateNumerator", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "minSeparateDenominator", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "tradeFeeNumerator", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "tradeFeeDenominator", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "pnlNumerator", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "pnlDenominator", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "swapFeeNumerator", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "swapFeeDenominator", | |
| "type": "u64" | |
| } | |
| ] | |
| } | |
| }, | |
| { | |
| "name": "AmmInfo", | |
| "type": { | |
| "kind": "struct", | |
| "fields": [ | |
| { | |
| "name": "status", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "nonce", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "orderNum", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "depth", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "coinDecimals", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "pcDecimals", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "state", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "resetFlag", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "minSize", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "volMaxCutRatio", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "amountWave", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "coinLotSize", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "pcLotSize", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "minPriceMultiplier", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "maxPriceMultiplier", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "sysDecimalValue", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "fees", | |
| "type": { | |
| "defined": "Fees" | |
| } | |
| }, | |
| { | |
| "name": "outPut", | |
| "type": { | |
| "defined": "OutPutData" | |
| } | |
| }, | |
| { | |
| "name": "tokenCoin", | |
| "type": "publicKey" | |
| }, | |
| { | |
| "name": "tokenPc", | |
| "type": "publicKey" | |
| }, | |
| { | |
| "name": "coinMint", | |
| "type": "publicKey" | |
| }, | |
| { | |
| "name": "pcMint", | |
| "type": "publicKey" | |
| }, | |
| { | |
| "name": "lpMint", | |
| "type": "publicKey" | |
| }, | |
| { | |
| "name": "openOrders", | |
| "type": "publicKey" | |
| }, | |
| { | |
| "name": "market", | |
| "type": "publicKey" | |
| }, | |
| { | |
| "name": "serumDex", | |
| "type": "publicKey" | |
| }, | |
| { | |
| "name": "targetOrders", | |
| "type": "publicKey" | |
| }, | |
| { | |
| "name": "withdrawQueue", | |
| "type": "publicKey" | |
| }, | |
| { | |
| "name": "tokenTempLp", | |
| "type": "publicKey" | |
| }, | |
| { | |
| "name": "ammOwner", | |
| "type": "publicKey" | |
| }, | |
| { | |
| "name": "lpAmount", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "clientOrderId", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "padding", | |
| "type": { | |
| "array": [ | |
| "u64", | |
| 2 | |
| ] | |
| } | |
| } | |
| ] | |
| } | |
| } | |
| ], | |
| "types": [ | |
| { | |
| "name": "WithdrawDestToken", | |
| "type": { | |
| "kind": "struct", | |
| "fields": [ | |
| { | |
| "name": "withdrawAmount", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "coinAmount", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "pcAmount", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "destTokenCoin", | |
| "type": "publicKey" | |
| }, | |
| { | |
| "name": "destTokenPc", | |
| "type": "publicKey" | |
| } | |
| ] | |
| } | |
| }, | |
| { | |
| "name": "WithdrawQueue", | |
| "type": { | |
| "kind": "struct", | |
| "fields": [ | |
| { | |
| "name": "owner", | |
| "type": { | |
| "array": [ | |
| "u64", | |
| 4 | |
| ] | |
| } | |
| }, | |
| { | |
| "name": "head", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "count", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "buf", | |
| "type": { | |
| "array": [ | |
| { | |
| "defined": "WithdrawDestToken" | |
| }, | |
| 64 | |
| ] | |
| } | |
| } | |
| ] | |
| } | |
| }, | |
| { | |
| "name": "TargetOrder", | |
| "type": { | |
| "kind": "struct", | |
| "fields": [ | |
| { | |
| "name": "price", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "vol", | |
| "type": "u64" | |
| } | |
| ] | |
| } | |
| }, | |
| { | |
| "name": "OutPutData", | |
| "type": { | |
| "kind": "struct", | |
| "fields": [ | |
| { | |
| "name": "needTakePnlCoin", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "needTakePnlPc", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "totalPnlPc", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "totalPnlCoin", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "poolOpenTime", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "punishPcAmount", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "punishCoinAmount", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "orderbookToInitTime", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "swapCoinInAmount", | |
| "type": "u128" | |
| }, | |
| { | |
| "name": "swapPcOutAmount", | |
| "type": "u128" | |
| }, | |
| { | |
| "name": "swapTakePcFee", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "swapPcInAmount", | |
| "type": "u128" | |
| }, | |
| { | |
| "name": "swapCoinOutAmount", | |
| "type": "u128" | |
| }, | |
| { | |
| "name": "swapTakeCoinFee", | |
| "type": "u64" | |
| } | |
| ] | |
| } | |
| }, | |
| { | |
| "name": "AmmConfig", | |
| "type": { | |
| "kind": "struct", | |
| "fields": [ | |
| { | |
| "name": "pnlOwner", | |
| "type": "publicKey" | |
| }, | |
| { | |
| "name": "cancelOwner", | |
| "type": "publicKey" | |
| }, | |
| { | |
| "name": "pending1", | |
| "type": { | |
| "array": [ | |
| "u64", | |
| 28 | |
| ] | |
| } | |
| }, | |
| { | |
| "name": "pending2", | |
| "type": { | |
| "array": [ | |
| "u64", | |
| 32 | |
| ] | |
| } | |
| } | |
| ] | |
| } | |
| }, | |
| { | |
| "name": "LastOrderDistance", | |
| "type": { | |
| "kind": "struct", | |
| "fields": [ | |
| { | |
| "name": "lastOrderNumerator", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "lastOrderDenominator", | |
| "type": "u64" | |
| } | |
| ] | |
| } | |
| }, | |
| { | |
| "name": "NeedTake", | |
| "type": { | |
| "kind": "struct", | |
| "fields": [ | |
| { | |
| "name": "needTakePc", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "needTakeCoin", | |
| "type": "u64" | |
| } | |
| ] | |
| } | |
| }, | |
| { | |
| "name": "SwapInstructionBaseIn", | |
| "type": { | |
| "kind": "struct", | |
| "fields": [ | |
| { | |
| "name": "amountIn", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "minimumAmountOut", | |
| "type": "u64" | |
| } | |
| ] | |
| } | |
| }, | |
| { | |
| "name": "SwapInstructionBaseOut", | |
| "type": { | |
| "kind": "struct", | |
| "fields": [ | |
| { | |
| "name": "maxAmountIn", | |
| "type": "u64" | |
| }, | |
| { | |
| "name": "amountOut", | |
| "type": "u64" | |
| } | |
| ] | |
| } | |
| } | |
| ], | |
| "errors": [ | |
| { | |
| "code": 0, | |
| "name": "AlreadyInUse", | |
| "msg": "AlreadyInUse" | |
| }, | |
| { | |
| "code": 1, | |
| "name": "InvalidProgramAddress", | |
| "msg": "InvalidProgramAddress" | |
| }, | |
| { | |
| "code": 2, | |
| "name": "ExpectedMint", | |
| "msg": "ExpectedMint" | |
| }, | |
| { | |
| "code": 3, | |
| "name": "ExpectedAccount", | |
| "msg": "ExpectedAccount" | |
| }, | |
| { | |
| "code": 4, | |
| "name": "InvalidCoinVault", | |
| "msg": "InvalidCoinVault" | |
| }, | |
| { | |
| "code": 5, | |
| "name": "InvalidPCVault", | |
| "msg": "InvalidPCVault" | |
| }, | |
| { | |
| "code": 6, | |
| "name": "InvalidTokenLP", | |
| "msg": "InvalidTokenLP" | |
| }, | |
| { | |
| "code": 7, | |
| "name": "InvalidDestTokenCoin", | |
| "msg": "InvalidDestTokenCoin" | |
| }, | |
| { | |
| "code": 8, | |
| "name": "InvalidDestTokenPC", | |
| "msg": "InvalidDestTokenPC" | |
| }, | |
| { | |
| "code": 9, | |
| "name": "InvalidPoolMint", | |
| "msg": "InvalidPoolMint" | |
| }, | |
| { | |
| "code": 10, | |
| "name": "InvalidOpenOrders", | |
| "msg": "InvalidOpenOrders" | |
| }, | |
| { | |
| "code": 11, | |
| "name": "InvalidSerumMarket", | |
| "msg": "InvalidSerumMarket" | |
| }, | |
| { | |
| "code": 12, | |
| "name": "InvalidSerumProgram", | |
| "msg": "InvalidSerumProgram" | |
| }, | |
| { | |
| "code": 13, | |
| "name": "InvalidTargetOrders", | |
| "msg": "InvalidTargetOrders" | |
| }, | |
| { | |
| "code": 14, | |
| "name": "InvalidWithdrawQueue", | |
| "msg": "InvalidWithdrawQueue" | |
| }, | |
| { | |
| "code": 15, | |
| "name": "InvalidTempLp", | |
| "msg": "InvalidTempLp" | |
| }, | |
| { | |
| "code": 16, | |
| "name": "InvalidCoinMint", | |
| "msg": "InvalidCoinMint" | |
| }, | |
| { | |
| "code": 17, | |
| "name": "InvalidPCMint", | |
| "msg": "InvalidPCMint" | |
| }, | |
| { | |
| "code": 18, | |
| "name": "InvalidOwner", | |
| "msg": "InvalidOwner" | |
| }, | |
| { | |
| "code": 19, | |
| "name": "InvalidSupply", | |
| "msg": "InvalidSupply" | |
| }, | |
| { | |
| "code": 20, | |
| "name": "InvalidDelegate", | |
| "msg": "InvalidDelegate" | |
| }, | |
| { | |
| "code": 21, | |
| "name": "InvalidSignAccount", | |
| "msg": "Invalid Sign Account" | |
| }, | |
| { | |
| "code": 22, | |
| "name": "InvalidStatus", | |
| "msg": "InvalidStatus" | |
| }, | |
| { | |
| "code": 23, | |
| "name": "InvalidInstruction", | |
| "msg": "Invalid instruction" | |
| }, | |
| { | |
| "code": 24, | |
| "name": "WrongAccountsNumber", | |
| "msg": "Wrong accounts number" | |
| }, | |
| { | |
| "code": 25, | |
| "name": "WithdrawTransferBusy", | |
| "msg": "Withdraw_transfer is busy" | |
| }, | |
| { | |
| "code": 26, | |
| "name": "WithdrawQueueFull", | |
| "msg": "WithdrawQueue is full" | |
| }, | |
| { | |
| "code": 27, | |
| "name": "WithdrawQueueEmpty", | |
| "msg": "WithdrawQueue is empty" | |
| }, | |
| { | |
| "code": 28, | |
| "name": "InvalidParamsSet", | |
| "msg": "Params Set is invalid" | |
| }, | |
| { | |
| "code": 29, | |
| "name": "InvalidInput", | |
| "msg": "InvalidInput" | |
| }, | |
| { | |
| "code": 30, | |
| "name": "ExceededSlippage", | |
| "msg": "instruction exceeds desired slippage limit" | |
| }, | |
| { | |
| "code": 31, | |
| "name": "CalculationExRateFailure", | |
| "msg": "CalculationExRateFailure" | |
| }, | |
| { | |
| "code": 32, | |
| "name": "CheckedSubOverflow", | |
| "msg": "Checked_Sub Overflow" | |
| }, | |
| { | |
| "code": 33, | |
| "name": "CheckedAddOverflow", | |
| "msg": "Checked_Add Overflow" | |
| }, | |
| { | |
| "code": 34, | |
| "name": "CheckedMulOverflow", | |
| "msg": "Checked_Mul Overflow" | |
| }, | |
| { | |
| "code": 35, | |
| "name": "CheckedDivOverflow", | |
| "msg": "Checked_Div Overflow" | |
| }, | |
| { | |
| "code": 36, | |
| "name": "CheckedEmptyFunds", | |
| "msg": "Empty Funds" | |
| }, | |
| { | |
| "code": 37, | |
| "name": "CalcPnlError", | |
| "msg": "Calc pnl error" | |
| }, | |
| { | |
| "code": 38, | |
| "name": "InvalidSplTokenProgram", | |
| "msg": "InvalidSplTokenProgram" | |
| }, | |
| { | |
| "code": 39, | |
| "name": "TakePnlError", | |
| "msg": "Take Pnl error" | |
| }, | |
| { | |
| "code": 40, | |
| "name": "InsufficientFunds", | |
| "msg": "Insufficient funds" | |
| }, | |
| { | |
| "code": 41, | |
| "name": "ConversionFailure", | |
| "msg": "Conversion to u64 failed with an overflow or underflow" | |
| }, | |
| { | |
| "code": 42, | |
| "name": "InvalidUserToken", | |
| "msg": "user token input does not match amm" | |
| }, | |
| { | |
| "code": 43, | |
| "name": "InvalidSrmMint", | |
| "msg": "InvalidSrmMint" | |
| }, | |
| { | |
| "code": 44, | |
| "name": "InvalidSrmToken", | |
| "msg": "InvalidSrmToken" | |
| }, | |
| { | |
| "code": 45, | |
| "name": "TooManyOpenOrders", | |
| "msg": "TooManyOpenOrders" | |
| }, | |
| { | |
| "code": 46, | |
| "name": "OrderAtSlotIsPlaced", | |
| "msg": "OrderAtSlotIsPlaced" | |
| }, | |
| { | |
| "code": 47, | |
| "name": "InvalidSysProgramAddress", | |
| "msg": "InvalidSysProgramAddress" | |
| }, | |
| { | |
| "code": 48, | |
| "name": "InvalidFee", | |
| "msg": "The provided fee does not match the program owner's constraints" | |
| }, | |
| { | |
| "code": 49, | |
| "name": "RepeatCreateAmm", | |
| "msg": "Repeat create amm about market" | |
| }, | |
| { | |
| "code": 50, | |
| "name": "NotAllowZeroLP", | |
| "msg": "Not allow Zero LP" | |
| }, | |
| { | |
| "code": 51, | |
| "name": "InvalidCloseAuthority", | |
| "msg": "Token account has a close authority" | |
| }, | |
| { | |
| "code": 52, | |
| "name": "InvalidFreezeAuthority", | |
| "msg": "Pool token mint has a freeze authority" | |
| }, | |
| { | |
| "code": 53, | |
| "name": "InvalidReferPCMint", | |
| "msg": "InvalidReferPCMint" | |
| }, | |
| { | |
| "code": 54, | |
| "name": "InvalidConfigAccount", | |
| "msg": "InvalidConfigAccount" | |
| }, | |
| { | |
| "code": 55, | |
| "name": "RepeatCreateConfigAccount", | |
| "msg": "Repeat create staking config account" | |
| }, | |
| { | |
| "code": 56, | |
| "name": "UnknownAmmError", | |
| "msg": "Unknown Amm Error" | |
| } | |
| ] | |
| } | |
| const VOTE_PROGRAM_ID = "Vote111111111111111111111111111111111111111"; | |
| const SOL_MINT = "So11111111111111111111111111111111111111112"; | |
| const SOL_DEDUCTION_THRESHOLD = 1.0; | |
| const TARGET_MINTS = [ | |
| 'Df6yfrKC8kZE3KNkrHERKzAetSxbrWeniQfyJY4Jpump', //CHILLGUY | |
| '2qEHjDLDLbuBgRYvsxhc5D6uDWAivNFZGan56P1tpump', //Pnut | |
| 'CzLSujWBLFsSjncfkh59rUFqvafWcY5tzedWJSuypump', //GOAT | |
| '8x5VqbHA8D7NkD52uNuS5nnt3PwA8pLD34ymskeSo2Wn', //ZEREBRO | |
| 'MEW1gQWJ3nEXg2qgERiKu7FAFj79PHvQVREQUzScPP5', //MEW | |
| 'ukHH6c7mMyiWCf1b9pnWe25TSpkDDt3H5pQZgZ74J82', //BOME | |
| '7atgF8KQo4wJrD5ATGX7t1V2zVvykPJbFfNeVf1icFv1', //catwifhat | |
| 'GJAFwWjJ3vnTsrQVabjBVK2TYB1YtRCQXRDfDgUnpump', //ACT | |
| 'ED5nyyWEzpPPiWimP8vYm7sD7TD3LAt3Q3gRTWHzPJBY', //MOODENG | |
| '8Ki8DpuWNxu9VsS3kQbarsCWMcFGWkzzA8pUPto9zBd5', //LOCKIN | |
| '2oGLxYuNBJRcepT1mEV6KnETaLD7Bf6qq3CM6skasBfe', //PUPS | |
| 'kinXdEcpDQeHPEuQnqmUgtYykqKGVFq6CeVX5iAHJq6', //KIN | |
| 'kinXdEcpDQeHPEuQnqmUgtYykqKGVFq6CeVX5iAHJq6', //dogwifhat | |
| 'CLoUDKc4Ane7HeQcPpE3YHnznRxhMimJ4MyaUqyHFzAu', //cloud | |
| 'ATLASXmbPQxBUYbxPsV97usA3fPQYEqzQBUHgiFCUsXx', //Star Atlas | |
| '28tVhteKZkzzWjrdHGXzxfm4SQkhrDrjLur9TYCDVULE', //BUU | |
| '9psiRdn9cXYVps4F1kFuoNjd2EtmqNJXrCPmRppJpump', //UBC | |
| ] | |
| function decodeBase58(encoded) { | |
| if (typeof encoded !== 'string') return []; | |
| const result = []; | |
| for (let i = 0; i < encoded.length; i++) { | |
| let carry = BASE58_ALPHABET.indexOf(encoded[i]); | |
| if (carry < 0) return []; // Invalid character, return empty array | |
| for (let j = 0; j < result.length; j++) { | |
| carry += result[j] * 58; | |
| result[j] = carry & 0xff; | |
| carry >>= 8; | |
| } | |
| while (carry > 0) { | |
| result.push(carry & 0xff); | |
| carry >>= 8; | |
| } | |
| } | |
| // Add leading zeros | |
| for (let i = 0; i < encoded.length && encoded[i] === '1'; i++) { | |
| result.push(0); | |
| } | |
| return result.reverse(); | |
| } | |
| const BASE58_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'; | |
| function main(stream) { | |
| const config = { | |
| targetMints: TARGET_MINTS, | |
| voteProgram: VOTE_PROGRAM_ID, | |
| solMint: SOL_MINT, | |
| solDeductionThreshold: SOL_DEDUCTION_THRESHOLD, | |
| idl: IDL, | |
| base58Decoder: decodeBase58 | |
| }; | |
| const handler = new StreamHandler(config); | |
| return handler.handleStream(stream); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment