From 85fe2e8727170fb1d19c2aa10caf30bcb15744f9 Mon Sep 17 00:00:00 2001 From: XiZi <549384715@qq.com> Date: Fri, 4 Oct 2024 13:02:09 +0800 Subject: [PATCH] fix: Legacy Transaction Simulation ComputeUnits (getLegacySimulationComputeUnits) --- src/lib/transaction.ts | 59 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 57 insertions(+), 2 deletions(-) diff --git a/src/lib/transaction.ts b/src/lib/transaction.ts index 3fdd01c..6ec922c 100644 --- a/src/lib/transaction.ts +++ b/src/lib/transaction.ts @@ -1,4 +1,14 @@ -import { AddressLookupTableAccount, Commitment, ComputeBudgetProgram, Connection, PublicKey, TransactionInstruction, TransactionMessage, VersionedTransaction } from "@solana/web3.js"; +import { + AddressLookupTableAccount, + Commitment, + ComputeBudgetProgram, + Connection, + PublicKey, + TransactionInstruction, + TransactionMessage, + VersionedTransaction, + Signer, Transaction +} from "@solana/web3.js"; import { getErrorFromRPCResponse } from "./logs"; export const confirmTransaction = async ( @@ -54,4 +64,49 @@ export const getSimulationComputeUnits = async ( getErrorFromRPCResponse(rpcResponse); return rpcResponse.value.unitsConsumed || null; -}; \ No newline at end of file +}; + +export const getLegacySimulationComputeUnits = async ( + connection: Connection, + instructions: Array, + signers: Array | Array, + feePayer?: PublicKey | Signer +): Promise => { + const testInstructions = [ + // Set an arbitrarily high number in simulation + // so we can be sure the transaction will succeed + // and get the real compute units used + ComputeBudgetProgram.setComputeUnitLimit({units: 1_400_000}), + ...instructions, + ]; + signers = (signers as Signer[]).map(signer => signer?.publicKey ? signer.publicKey : signer) as Array + feePayer = ((feePayer as Signer)?.publicKey ? (feePayer as Signer).publicKey : feePayer || signers[0]) as PublicKey + + const transaction = new Transaction(); + transaction.instructions = testInstructions; + transaction.feePayer = feePayer; + transaction.recentBlockhash = '11111111111111111111111111111111'; + + // deprecated: + // transaction.setSigners(...signers.map(signer => signer.publicKey)) + transaction.signatures = signers.map(publicKey => ({ + signature: null, + publicKey + })) + + const args = [ + transaction.serialize({ verifySignatures: false }).toString('base64'), + { + encoding: 'base64', + replaceRecentBlockhash: true + } + ]; + + // deprecated: + // const rpcResponse = await connection.simulateTransaction(transaction, signers); + // @ts-ignore + const rpcResponse = (await connection._rpcRequest('simulateTransaction', args)).result + + getErrorFromRPCResponse(rpcResponse); + return rpcResponse.value.unitsConsumed || null; +};