diff --git a/packages/transaction-messages/src/__typetests__/fee-payer-typetest.ts b/packages/transaction-messages/src/__typetests__/fee-payer-typetest.ts index f6ad6317f..d10f0f9cc 100644 --- a/packages/transaction-messages/src/__typetests__/fee-payer-typetest.ts +++ b/packages/transaction-messages/src/__typetests__/fee-payer-typetest.ts @@ -100,4 +100,17 @@ type V0TransactionMessage = Extract; TransactionMessageWithDurableNonceLifetime & TransactionMessageWithFeePayer<'mockFeePayer'>; } + + // It can narrow the result by transaction version + { + type TransactionMessageNotLegacy = Exclude; + + const message = null as unknown as TransactionMessage; + const messageWithFeePayer = setTransactionMessageFeePayer(mockFeePayer, message); + // @ts-expect-error Could be legacy + messageWithFeePayer satisfies TransactionMessageNotLegacy; + if (messageWithFeePayer.version === 0) { + messageWithFeePayer satisfies TransactionMessageNotLegacy; + } + } } diff --git a/packages/transaction-messages/src/fee-payer.ts b/packages/transaction-messages/src/fee-payer.ts index 51f091441..0c33b07df 100644 --- a/packages/transaction-messages/src/fee-payer.ts +++ b/packages/transaction-messages/src/fee-payer.ts @@ -1,6 +1,6 @@ import { Address } from '@solana/addresses'; -import { BaseTransactionMessage } from './transaction-message'; +import { TransactionMessage } from './transaction-message'; /** * Represents a transaction message for which a fee payer has been declared. A transaction must @@ -13,10 +13,8 @@ export interface TransactionMessageWithFeePayer = Omit< - TTransactionMessage, - 'feePayer' ->; +type ExcludeTransactionMessageFeePayer = + TTransactionMessage extends unknown ? Omit : never; /** * Given a base58-encoded address of a system account, this method will return a new transaction @@ -34,7 +32,7 @@ type ExcludeTransactionMessageFeePayer, + TTransactionMessage extends Partial & TransactionMessage, >( feePayer: Address, transactionMessage: TTransactionMessage, @@ -44,7 +42,7 @@ export function setTransactionMessageFeePayer< feePayer === transactionMessage.feePayer?.address && isAddressOnlyFeePayer(transactionMessage.feePayer) ) { - return transactionMessage as unknown as Omit & + return transactionMessage as ExcludeTransactionMessageFeePayer & TransactionMessageWithFeePayer; } const out = { @@ -52,7 +50,8 @@ export function setTransactionMessageFeePayer< feePayer: Object.freeze({ address: feePayer }), }; Object.freeze(out); - return out; + return out as ExcludeTransactionMessageFeePayer & + TransactionMessageWithFeePayer; } function isAddressOnlyFeePayer(