diff --git a/web3.js/src/connection.ts b/web3.js/src/connection.ts index 6c2762bc2a84af..0cb3e11659a26e 100644 --- a/web3.js/src/connection.ts +++ b/web3.js/src/connection.ts @@ -4154,10 +4154,10 @@ export class Connection { * Fetch the fee for a message from the cluster, return with context */ async getFeeForMessage( - message: Message, + message: VersionedMessage, commitment?: Commitment, ): Promise> { - const wireMessage = message.serialize().toString('base64'); + const wireMessage = toBuffer(message.serialize()).toString('base64'); const args = this._buildArgs([wireMessage], commitment); const unsafeRes = await this._rpcRequest('getFeeForMessage', args); diff --git a/web3.js/test/connection.test.ts b/web3.js/test/connection.test.ts index 4d2e5b0b174e7a..1725628dc8c742 100644 --- a/web3.js/test/connection.test.ts +++ b/web3.js/test/connection.test.ts @@ -24,6 +24,7 @@ import { NONCE_ACCOUNT_LENGTH, } from '../src'; import invariant from '../src/utils/assert'; +import {toBuffer} from '../src/utils/to-buffer'; import {MOCK_PORT, url} from './url'; import { AccountInfo, @@ -60,6 +61,7 @@ import { TransactionExpiredBlockheightExceededError, TransactionExpiredNonceInvalidError, TransactionExpiredTimeoutError, + TransactionMessage, } from '../src/transaction'; import type { SignatureStatus, @@ -3673,7 +3675,7 @@ describe('Connection', function () { expect(feeCalculator.lamportsPerSignature).to.eq(5000); }); - it('get fee for message', async () => { + it('get fee for message (legacy)', async () => { const accountFrom = Keypair.generate(); const accountTo = Keypair.generate(); @@ -3705,6 +3707,41 @@ describe('Connection', function () { expect(fee).to.eq(5000); }); + it('get fee for message (v0)', async () => { + const accountFrom = Keypair.generate(); + const accountTo = Keypair.generate(); + + const recentBlockhash = (await helpers.latestBlockhash({connection})) + .blockhash; + const instructions = [ + SystemProgram.transfer({ + fromPubkey: accountFrom.publicKey, + toPubkey: accountTo.publicKey, + lamports: 10, + }), + ]; + + const messageV0 = new TransactionMessage({ + payerKey: accountFrom.publicKey, + recentBlockhash, + instructions, + }).compileToV0Message(); + + await mockRpcResponse({ + method: 'getFeeForMessage', + params: [ + toBuffer(messageV0.serialize()).toString('base64'), + {commitment: 'confirmed'}, + ], + value: 5000, + withContext: true, + }); + + const fee = (await connection.getFeeForMessage(messageV0, 'confirmed')) + .value; + expect(fee).to.eq(5000); + }); + it('get block time', async () => { await mockRpcResponse({ method: 'getBlockTime',