/** * This code was AUTOGENERATED using the codama library. * Please DO NOT EDIT THIS FILE, instead use visitors * to add features, then rerun codama to update it. * * @see https://github.com/codama-idl/codama */ import { getAddressEncoder, getProgramDerivedAddress, type Address, } from '@solana/addresses'; import { addDecoderSizePrefix, addEncoderSizePrefix, combineCodec, fixDecoderSize, fixEncoderSize, getBytesDecoder, getBytesEncoder, getStructDecoder, getStructEncoder, getU32Decoder, getU32Encoder, getU8Decoder, getU8Encoder, getUtf8Decoder, getUtf8Encoder, transformEncoder, type Codec, type Decoder, type Encoder, type ReadonlyUint8Array, } from '@solana/codecs'; import { IAccountMeta, IInstruction, IInstructionWithAccounts, IInstructionWithData, } from '../../utils/instruction-compat'; import { type IAccountSignerMeta, type TransactionSigner, } from '@solana/signers'; import { POD_COM_PROGRAM_ADDRESS } from '../programs'; import { expectAddress, expectSome, getAccountMetaFactory, type ResolvedAccount, } from '../shared'; // Define missing types for compatibility type ReadonlyAccount = T; type WritableAccount = T; type WritableSignerAccount = T; export const SEND_MESSAGE_DISCRIMINATOR = new Uint8Array([ 15, 40, 235, 178, 191, 96, 190, 12, ]); export function getSendMessageDiscriminatorBytes() { return fixEncoderSize(getBytesEncoder(), 8).encode( SEND_MESSAGE_DISCRIMINATOR ); } export type SendMessageInstruction< TProgram extends string = typeof POD_COM_PROGRAM_ADDRESS, TAccountMessageAccount extends string | IAccountMeta = string, TAccountSender extends string | IAccountMeta = string, TAccountRecipient extends string | IAccountMeta = string, TAccountSystemProgram extends | string | IAccountMeta = '11111111111111111111111111111111', TRemainingAccounts extends readonly IAccountMeta[] = [], > = IInstruction & IInstructionWithData & IInstructionWithAccounts< [ TAccountMessageAccount extends string ? WritableAccount : TAccountMessageAccount, TAccountSender extends string ? WritableSignerAccount & IAccountSignerMeta : TAccountSender, TAccountRecipient extends string ? ReadonlyAccount : TAccountRecipient, TAccountSystemProgram extends string ? ReadonlyAccount : TAccountSystemProgram, ...TRemainingAccounts, ] >; export type SendMessageInstructionData = { discriminator: Uint8Array; messageId: string; payload: string; messageType: number; expirationDays: number; }; export type SendMessageInstructionDataArgs = { messageId: string; payload: string; messageType: number; expirationDays: number; }; export function getSendMessageInstructionDataEncoder(): Encoder { return transformEncoder( getStructEncoder([ ['discriminator', fixEncoderSize(getBytesEncoder(), 8)], ['messageId', addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], ['payload', addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], ['messageType', getU8Encoder()], ['expirationDays', getU32Encoder()], ]), (value) => ({ ...value, discriminator: SEND_MESSAGE_DISCRIMINATOR }) ); } export function getSendMessageInstructionDataDecoder(): Decoder { return getStructDecoder([ ['discriminator', fixDecoderSize(getBytesDecoder(), 8)], ['messageId', addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())], ['payload', addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())], ['messageType', getU8Decoder()], ['expirationDays', getU32Decoder()], ]); } export function getSendMessageInstructionDataCodec(): Codec< SendMessageInstructionDataArgs, SendMessageInstructionData > { return combineCodec( getSendMessageInstructionDataEncoder(), getSendMessageInstructionDataDecoder() ); } export type SendMessageAsyncInput< TAccountMessageAccount extends string = string, TAccountSender extends string = string, TAccountRecipient extends string = string, TAccountSystemProgram extends string = string, > = { messageAccount?: Address; sender: TransactionSigner; recipient: Address; systemProgram?: Address; messageId: SendMessageInstructionDataArgs['messageId']; payload: SendMessageInstructionDataArgs['payload']; messageType: SendMessageInstructionDataArgs['messageType']; expirationDays: SendMessageInstructionDataArgs['expirationDays']; }; export async function getSendMessageInstructionAsync< TAccountMessageAccount extends string, TAccountSender extends string, TAccountRecipient extends string, TAccountSystemProgram extends string, TProgramAddress extends Address = typeof POD_COM_PROGRAM_ADDRESS, >( input: SendMessageAsyncInput< TAccountMessageAccount, TAccountSender, TAccountRecipient, TAccountSystemProgram >, config?: { programAddress?: TProgramAddress } ): Promise< SendMessageInstruction< TProgramAddress, TAccountMessageAccount, TAccountSender, TAccountRecipient, TAccountSystemProgram > > { // Program address. const programAddress = config?.programAddress ?? POD_COM_PROGRAM_ADDRESS; // Original accounts. const originalAccounts = { messageAccount: { value: input.messageAccount ?? null, isWritable: true }, sender: { value: input.sender ?? null, isWritable: true }, recipient: { value: input.recipient ?? null, isWritable: false }, systemProgram: { value: input.systemProgram ?? null, isWritable: false }, }; const accounts = originalAccounts as Record< keyof typeof originalAccounts, ResolvedAccount >; // Original args. const args = { ...input }; // Resolve default values. if (!accounts.messageAccount.value) { accounts.messageAccount.value = await getProgramDerivedAddress({ programAddress, seeds: [ getBytesEncoder().encode( new Uint8Array([109, 101, 115, 115, 97, 103, 101]) ), getAddressEncoder().encode(expectAddress(accounts.sender.value)), getAddressEncoder().encode(expectAddress(accounts.recipient.value)), addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder()).encode( expectSome(args.messageId) ), ], }); } if (!accounts.systemProgram.value) { accounts.systemProgram.value = '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>; } const getAccountMeta = getAccountMetaFactory(programAddress, 'programId'); const instruction = { accounts: [ getAccountMeta(accounts.messageAccount), getAccountMeta(accounts.sender), getAccountMeta(accounts.recipient), getAccountMeta(accounts.systemProgram), ], programAddress, data: getSendMessageInstructionDataEncoder().encode( args as SendMessageInstructionDataArgs ), } as any as SendMessageInstruction< TProgramAddress, TAccountMessageAccount, TAccountSender, TAccountRecipient, TAccountSystemProgram >; return instruction; } export type SendMessageInput< TAccountMessageAccount extends string = string, TAccountSender extends string = string, TAccountRecipient extends string = string, TAccountSystemProgram extends string = string, > = { messageAccount: Address; sender: TransactionSigner; recipient: Address; systemProgram?: Address; messageId: SendMessageInstructionDataArgs['messageId']; payload: SendMessageInstructionDataArgs['payload']; messageType: SendMessageInstructionDataArgs['messageType']; expirationDays: SendMessageInstructionDataArgs['expirationDays']; }; export function getSendMessageInstruction< TAccountMessageAccount extends string, TAccountSender extends string, TAccountRecipient extends string, TAccountSystemProgram extends string, TProgramAddress extends Address = typeof POD_COM_PROGRAM_ADDRESS, >( input: SendMessageInput< TAccountMessageAccount, TAccountSender, TAccountRecipient, TAccountSystemProgram >, config?: { programAddress?: TProgramAddress } ): SendMessageInstruction< TProgramAddress, TAccountMessageAccount, TAccountSender, TAccountRecipient, TAccountSystemProgram > { // Program address. const programAddress = config?.programAddress ?? POD_COM_PROGRAM_ADDRESS; // Original accounts. const originalAccounts = { messageAccount: { value: input.messageAccount ?? null, isWritable: true }, sender: { value: input.sender ?? null, isWritable: true }, recipient: { value: input.recipient ?? null, isWritable: false }, systemProgram: { value: input.systemProgram ?? null, isWritable: false }, }; const accounts = originalAccounts as Record< keyof typeof originalAccounts, ResolvedAccount >; // Original args. const args = { ...input }; // Resolve default values. if (!accounts.systemProgram.value) { accounts.systemProgram.value = '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>; } const getAccountMeta = getAccountMetaFactory(programAddress, 'programId'); const instruction = { accounts: [ getAccountMeta(accounts.messageAccount), getAccountMeta(accounts.sender), getAccountMeta(accounts.recipient), getAccountMeta(accounts.systemProgram), ], programAddress, data: getSendMessageInstructionDataEncoder().encode( args as SendMessageInstructionDataArgs ), } as any as SendMessageInstruction< TProgramAddress, TAccountMessageAccount, TAccountSender, TAccountRecipient, TAccountSystemProgram >; return instruction; } export type ParsedSendMessageInstruction< TProgram extends string = typeof POD_COM_PROGRAM_ADDRESS, TAccountMetas extends readonly IAccountMeta[] = readonly IAccountMeta[], > = { programAddress: Address; accounts: { messageAccount: TAccountMetas[0]; sender: TAccountMetas[1]; recipient: TAccountMetas[2]; systemProgram: TAccountMetas[3]; }; data: SendMessageInstructionData; }; export function parseSendMessageInstruction< TProgram extends string, TAccountMetas extends readonly IAccountMeta[], >( instruction: IInstruction & IInstructionWithAccounts & IInstructionWithData ): ParsedSendMessageInstruction { if (instruction.accounts.length < 4) { // Specific error for instruction validation throw new Error('Not enough accounts'); } let accountIndex = 0; const getNextAccount = () => { const accountMeta = instruction.accounts![accountIndex]!; accountIndex += 1; return accountMeta; }; return { programAddress: instruction.programAddress, accounts: { messageAccount: getNextAccount(), sender: getNextAccount(), recipient: getNextAccount(), systemProgram: getNextAccount(), }, data: getSendMessageInstructionDataDecoder().decode(instruction.data), }; }