diff --git a/packages/kit/package.json b/packages/kit/package.json index 9c3415368..09788e98c 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -81,17 +81,18 @@ "@solana/codecs": "workspace:*", "@solana/errors": "workspace:*", "@solana/functional": "workspace:*", - "@solana/instructions": "workspace:*", "@solana/instruction-plans": "workspace:*", + "@solana/instructions": "workspace:*", "@solana/keys": "workspace:*", "@solana/offchain-messages": "workspace:*", "@solana/plugin-core": "workspace:*", "@solana/programs": "workspace:*", "@solana/rpc": "workspace:*", + "@solana/rpc-api": "workspace:*", "@solana/rpc-parsed-types": "workspace:*", + "@solana/rpc-spec-types": "workspace:*", "@solana/rpc-subscriptions": "workspace:*", "@solana/rpc-types": "workspace:*", - "@solana/rpc-spec-types": "workspace:*", "@solana/signers": "workspace:*", "@solana/sysvars": "workspace:*", "@solana/transaction-confirmation": "workspace:*", diff --git a/packages/kit/src/__typetests__/decompile-transaction-message-fetching-lookup-tables-typetest.ts b/packages/kit/src/__typetests__/decompile-transaction-message-fetching-lookup-tables-typetest.ts new file mode 100644 index 000000000..9ce58f3e0 --- /dev/null +++ b/packages/kit/src/__typetests__/decompile-transaction-message-fetching-lookup-tables-typetest.ts @@ -0,0 +1,81 @@ +import { Rpc } from '@solana/rpc'; +import { GetMultipleAccountsApi } from '@solana/rpc-api'; +import { + CompiledTransactionMessage, + CompiledTransactionMessageWithLifetime, + isTransactionMessageWithBlockhashLifetime, + TransactionMessage, + TransactionMessageWithBlockhashLifetime, + TransactionMessageWithFeePayer, + TransactionMessageWithLifetime, +} from '@solana/transaction-messages'; + +import { decompileTransactionMessageFetchingLookupTables } from '../decompile-transaction-message-fetching-lookup-tables'; + +// [DESCRIBE] decompileTransactionMessageFetchingLookupTables +{ + const compiledTransactionMessage = null as unknown as CompiledTransactionMessage & + CompiledTransactionMessageWithLifetime; + + const rpc = null as unknown as Rpc; + + // Returns a TransactionMessage + void (async () => { + const transactionMessage = await decompileTransactionMessageFetchingLookupTables( + compiledTransactionMessage, + rpc, + ); + transactionMessage satisfies TransactionMessage; + })(); + + // Has a fee payer + void (async () => { + const transactionMessage = await decompileTransactionMessageFetchingLookupTables( + compiledTransactionMessage, + rpc, + ); + transactionMessage satisfies TransactionMessageWithFeePayer; + })(); + + // Has a lifetime + void (async () => { + const transactionMessage = await decompileTransactionMessageFetchingLookupTables( + compiledTransactionMessage, + rpc, + ); + transactionMessage satisfies TransactionMessageWithLifetime; + })(); + + // Lifetime can be narrowed + void (async () => { + // Given a function that only accepts a transaction message with a blockhash lifetime + function acceptsTransactionMessageWithBlockhashLifetime(_msg: TransactionMessageWithBlockhashLifetime) {} + + const transactionMessage = await decompileTransactionMessageFetchingLookupTables( + compiledTransactionMessage, + rpc, + ); + // @ts-expect-error Lifetime could be different + acceptsTransactionMessageWithBlockhashLifetime(transactionMessage); + if (isTransactionMessageWithBlockhashLifetime(transactionMessage)) { + acceptsTransactionMessageWithBlockhashLifetime(transactionMessage); + } + })(); + + // The version can be narrowed + void (async () => { + // Given a function that only accepts a non-legacy transaction message + type TransactionMessageNotLegacy = Exclude; + function acceptsNonLegacyTransactionMessage(_msg: TransactionMessageNotLegacy) {} + + const transactionMessage = await decompileTransactionMessageFetchingLookupTables( + compiledTransactionMessage, + rpc, + ); + // @ts-expect-error Version could be legacy + acceptsNonLegacyTransactionMessage(transactionMessage); + if (transactionMessage.version === 0) { + acceptsNonLegacyTransactionMessage(transactionMessage); + } + })(); +} diff --git a/packages/kit/src/decompile-transaction-message-fetching-lookup-tables.ts b/packages/kit/src/decompile-transaction-message-fetching-lookup-tables.ts index 42c2c0779..ee6df3389 100644 --- a/packages/kit/src/decompile-transaction-message-fetching-lookup-tables.ts +++ b/packages/kit/src/decompile-transaction-message-fetching-lookup-tables.ts @@ -1,10 +1,10 @@ import { type FetchAccountsConfig } from '@solana/accounts'; import type { GetMultipleAccountsApi, Rpc } from '@solana/rpc'; import { - BaseTransactionMessage, CompiledTransactionMessage, CompiledTransactionMessageWithLifetime, decompileTransactionMessage, + TransactionMessage, TransactionMessageWithFeePayer, TransactionMessageWithLifetime, } from '@solana/transaction-messages'; @@ -28,7 +28,7 @@ export async function decompileTransactionMessageFetchingLookupTables( compiledTransactionMessage: CompiledTransactionMessage & CompiledTransactionMessageWithLifetime, rpc: Rpc, config?: DecompileTransactionMessageFetchingLookupTablesConfig, -): Promise { +): Promise { const lookupTables = 'addressTableLookups' in compiledTransactionMessage && compiledTransactionMessage.addressTableLookups !== undefined && diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fedff4414..f9922c66d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -720,6 +720,9 @@ importers: '@solana/rpc': specifier: workspace:* version: link:../rpc + '@solana/rpc-api': + specifier: workspace:* + version: link:../rpc-api '@solana/rpc-parsed-types': specifier: workspace:* version: link:../rpc-parsed-types