Skip to content

Commit

Permalink
Widen returned transaction message type
Browse files Browse the repository at this point in the history
  • Loading branch information
mcintyre94 committed Jul 22, 2024
1 parent bc57fe6 commit ea2f95d
Showing 1 changed file with 21 additions and 3 deletions.
24 changes: 21 additions & 3 deletions packages/transaction-messages/src/compress-transaction-message.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { Address } from '@solana/addresses';
import { AccountRole, IAccountLookupMeta, IInstruction, isSignerRole } from '@solana/instructions';
import { AccountRole, IAccountLookupMeta, IAccountMeta, IInstruction, isSignerRole } from '@solana/instructions';

import { AddressesByLookupTableAddress } from './addresses-by-lookup-table-address';
import { TransactionMessage } from './transaction-message';
import { BaseTransactionMessage, TransactionMessage } from './transaction-message';

type Mutable<T> = {
-readonly [P in keyof T]: T[P];
Expand Down Expand Up @@ -30,12 +30,30 @@ function findAddressInLookupTables(

type TransactionMessageNotLegacy = Exclude<TransactionMessage, { version: 'legacy' }>;

// Each account can be IAccountLookupMeta | IAccountMeta
type WidenInstructionAccounts<TInstruction extends IInstruction> =
TInstruction extends IInstruction<infer TProgramAddress, infer TAccounts>
? IInstruction<
TProgramAddress,
{
[K in keyof TAccounts]: TAccounts[K] extends IAccountMeta<infer TAddress>
? IAccountLookupMeta<TAddress> | IAccountMeta<TAddress>
: TAccounts[K];
}
>
: TInstruction;

type WidenTransactionMessageInstructions<TTransactionMessage extends TransactionMessage> =
TTransactionMessage extends BaseTransactionMessage<infer TVersion, infer TInstruction>
? BaseTransactionMessage<TVersion, WidenInstructionAccounts<TInstruction>>
: TTransactionMessage;

export function compressTransactionMessageUsingAddressLookupTables<
TTransactionMessage extends TransactionMessageNotLegacy = TransactionMessageNotLegacy,
>(
transactionMessage: TTransactionMessage,
addressesByLookupTableAddress: AddressesByLookupTableAddress,
): TTransactionMessage {
): TTransactionMessage | WidenTransactionMessageInstructions<TTransactionMessage> {
const lookupTableAddresses = new Set(Object.values(addressesByLookupTableAddress).flatMap(a => a));

const newInstructions: IInstruction[] = [];
Expand Down

0 comments on commit ea2f95d

Please sign in to comment.