/** * 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 { combineCodec, fixDecoderSize, fixEncoderSize, getAddressEncoder, getBytesDecoder, getBytesEncoder, getProgramDerivedAddress, getStructDecoder, getStructEncoder, SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, SolanaError, transformEncoder, type AccountMeta, type AccountSignerMeta, type Address, type FixedSizeCodec, type FixedSizeDecoder, type FixedSizeEncoder, type Instruction, type InstructionWithAccounts, type InstructionWithData, type ReadonlyAccount, type ReadonlyUint8Array, type TransactionSigner, type WritableAccount, type WritableSignerAccount, } from '@solana/kit'; import { getAccountMetaFactory, getAddressFromResolvedInstructionAccount, type ResolvedInstructionAccount, } from '@solana/program-client-core'; import { SAGE_PROGRAM_ADDRESS } from '../programs'; export const PAY_CRAFTING_HAB_RENT_DISCRIMINATOR = new Uint8Array([ 196, 236, 61, 1, 49, 171, 234, 30, ]); export function getPayCraftingHabRentDiscriminatorBytes() { return fixEncoderSize(getBytesEncoder(), 8).encode( PAY_CRAFTING_HAB_RENT_DISCRIMINATOR, ); } export type PayCraftingHabRentInstruction< TProgram extends string = typeof SAGE_PROGRAM_ADDRESS, TAccountFunder extends string | AccountMeta = string, TAccountProfile extends string | AccountMeta = string, TAccountCraftingHabInstance extends string | AccountMeta = string, TAccountSystemAndStarbasePlayerSystem extends string | AccountMeta = string, TAccountSystemAndStarbasePlayerStarbasePlayer extends | string | AccountMeta = string, TAccountCurrencyCache extends string | AccountMeta = string, TAccountGame extends string | AccountMeta = string, TAccountXpAccrual extends string | AccountMeta = string, TRemainingAccounts extends readonly AccountMeta[] = [], > = Instruction & InstructionWithData & InstructionWithAccounts< [ TAccountFunder extends string ? WritableSignerAccount & AccountSignerMeta : TAccountFunder, TAccountProfile extends string ? ReadonlyAccount : TAccountProfile, TAccountCraftingHabInstance extends string ? WritableAccount : TAccountCraftingHabInstance, TAccountSystemAndStarbasePlayerSystem extends string ? ReadonlyAccount : TAccountSystemAndStarbasePlayerSystem, TAccountSystemAndStarbasePlayerStarbasePlayer extends string ? ReadonlyAccount : TAccountSystemAndStarbasePlayerStarbasePlayer, TAccountCurrencyCache extends string ? WritableAccount : TAccountCurrencyCache, TAccountGame extends string ? ReadonlyAccount : TAccountGame, TAccountXpAccrual extends string ? WritableAccount : TAccountXpAccrual, ...TRemainingAccounts, ] >; export type PayCraftingHabRentInstructionData = { discriminator: ReadonlyUint8Array; }; export type PayCraftingHabRentInstructionDataArgs = {}; export function getPayCraftingHabRentInstructionDataEncoder(): FixedSizeEncoder { return transformEncoder( getStructEncoder([['discriminator', fixEncoderSize(getBytesEncoder(), 8)]]), (value) => ({ ...value, discriminator: PAY_CRAFTING_HAB_RENT_DISCRIMINATOR, }), ); } export function getPayCraftingHabRentInstructionDataDecoder(): FixedSizeDecoder { return getStructDecoder([ ['discriminator', fixDecoderSize(getBytesDecoder(), 8)], ]); } export function getPayCraftingHabRentInstructionDataCodec(): FixedSizeCodec< PayCraftingHabRentInstructionDataArgs, PayCraftingHabRentInstructionData > { return combineCodec( getPayCraftingHabRentInstructionDataEncoder(), getPayCraftingHabRentInstructionDataDecoder(), ); } export type PayCraftingHabRentAsyncInput< TAccountFunder extends string = string, TAccountProfile extends string = string, TAccountCraftingHabInstance extends string = string, TAccountSystemAndStarbasePlayerSystem extends string = string, TAccountSystemAndStarbasePlayerStarbasePlayer extends string = string, TAccountCurrencyCache extends string = string, TAccountGame extends string = string, TAccountXpAccrual extends string = string, > = { /** The funder for any Solana rent payments. */ funder: TransactionSigner; /** The player profile */ profile: Address; /** The crafting hab instance */ craftingHabInstance: Address; /** The [`StarSystem`] account */ systemAndStarbasePlayerSystem: Address; /** The [`StarbasePlayer`] Account */ systemAndStarbasePlayerStarbasePlayer: Address; /** The currency config cache account */ currencyCache?: Address; /** The game account */ game: Address; /** * Building XP ledger (spec §5): REQUIRED by `Game.version == v1` (fail closed) and * rejected on legacy games. Appended after every pre-existing account so legacy * transactions keep their positional prefix. This instruction carries no System * program, so the ledger must already exist (any settle / place / finalize / * production call creates it). */ xpAccrual?: Address; }; export async function getPayCraftingHabRentInstructionAsync< TAccountFunder extends string, TAccountProfile extends string, TAccountCraftingHabInstance extends string, TAccountSystemAndStarbasePlayerSystem extends string, TAccountSystemAndStarbasePlayerStarbasePlayer extends string, TAccountCurrencyCache extends string, TAccountGame extends string, TAccountXpAccrual extends string, TProgramAddress extends Address = typeof SAGE_PROGRAM_ADDRESS, >( input: PayCraftingHabRentAsyncInput< TAccountFunder, TAccountProfile, TAccountCraftingHabInstance, TAccountSystemAndStarbasePlayerSystem, TAccountSystemAndStarbasePlayerStarbasePlayer, TAccountCurrencyCache, TAccountGame, TAccountXpAccrual >, config?: { programAddress?: TProgramAddress }, ): Promise< PayCraftingHabRentInstruction< TProgramAddress, TAccountFunder, TAccountProfile, TAccountCraftingHabInstance, TAccountSystemAndStarbasePlayerSystem, TAccountSystemAndStarbasePlayerStarbasePlayer, TAccountCurrencyCache, TAccountGame, TAccountXpAccrual > > { // Program address. const programAddress = config?.programAddress ?? SAGE_PROGRAM_ADDRESS; // Original accounts. const originalAccounts = { funder: { value: input.funder ?? null, isWritable: true }, profile: { value: input.profile ?? null, isWritable: false }, craftingHabInstance: { value: input.craftingHabInstance ?? null, isWritable: true, }, systemAndStarbasePlayerSystem: { value: input.systemAndStarbasePlayerSystem ?? null, isWritable: false, }, systemAndStarbasePlayerStarbasePlayer: { value: input.systemAndStarbasePlayerStarbasePlayer ?? null, isWritable: false, }, currencyCache: { value: input.currencyCache ?? null, isWritable: true }, game: { value: input.game ?? null, isWritable: false }, xpAccrual: { value: input.xpAccrual ?? null, isWritable: true }, }; const accounts = originalAccounts as Record< keyof typeof originalAccounts, ResolvedInstructionAccount >; // Resolve default values. if (!accounts.currencyCache.value) { accounts.currencyCache.value = await getProgramDerivedAddress({ programAddress, seeds: [ getBytesEncoder().encode( new Uint8Array([ 67, 117, 114, 114, 101, 110, 99, 121, 67, 111, 110, 102, 105, 103, ]), ), getAddressEncoder().encode( getAddressFromResolvedInstructionAccount('game', accounts.game.value), ), ], }); } const getAccountMeta = getAccountMetaFactory(programAddress, 'programId'); return Object.freeze({ accounts: [ getAccountMeta('funder', accounts.funder), getAccountMeta('profile', accounts.profile), getAccountMeta('craftingHabInstance', accounts.craftingHabInstance), getAccountMeta( 'systemAndStarbasePlayerSystem', accounts.systemAndStarbasePlayerSystem, ), getAccountMeta( 'systemAndStarbasePlayerStarbasePlayer', accounts.systemAndStarbasePlayerStarbasePlayer, ), getAccountMeta('currencyCache', accounts.currencyCache), getAccountMeta('game', accounts.game), getAccountMeta('xpAccrual', accounts.xpAccrual), ], data: getPayCraftingHabRentInstructionDataEncoder().encode({}), programAddress, } as PayCraftingHabRentInstruction< TProgramAddress, TAccountFunder, TAccountProfile, TAccountCraftingHabInstance, TAccountSystemAndStarbasePlayerSystem, TAccountSystemAndStarbasePlayerStarbasePlayer, TAccountCurrencyCache, TAccountGame, TAccountXpAccrual >); } export type PayCraftingHabRentInput< TAccountFunder extends string = string, TAccountProfile extends string = string, TAccountCraftingHabInstance extends string = string, TAccountSystemAndStarbasePlayerSystem extends string = string, TAccountSystemAndStarbasePlayerStarbasePlayer extends string = string, TAccountCurrencyCache extends string = string, TAccountGame extends string = string, TAccountXpAccrual extends string = string, > = { /** The funder for any Solana rent payments. */ funder: TransactionSigner; /** The player profile */ profile: Address; /** The crafting hab instance */ craftingHabInstance: Address; /** The [`StarSystem`] account */ systemAndStarbasePlayerSystem: Address; /** The [`StarbasePlayer`] Account */ systemAndStarbasePlayerStarbasePlayer: Address; /** The currency config cache account */ currencyCache: Address; /** The game account */ game: Address; /** * Building XP ledger (spec §5): REQUIRED by `Game.version == v1` (fail closed) and * rejected on legacy games. Appended after every pre-existing account so legacy * transactions keep their positional prefix. This instruction carries no System * program, so the ledger must already exist (any settle / place / finalize / * production call creates it). */ xpAccrual?: Address; }; export function getPayCraftingHabRentInstruction< TAccountFunder extends string, TAccountProfile extends string, TAccountCraftingHabInstance extends string, TAccountSystemAndStarbasePlayerSystem extends string, TAccountSystemAndStarbasePlayerStarbasePlayer extends string, TAccountCurrencyCache extends string, TAccountGame extends string, TAccountXpAccrual extends string, TProgramAddress extends Address = typeof SAGE_PROGRAM_ADDRESS, >( input: PayCraftingHabRentInput< TAccountFunder, TAccountProfile, TAccountCraftingHabInstance, TAccountSystemAndStarbasePlayerSystem, TAccountSystemAndStarbasePlayerStarbasePlayer, TAccountCurrencyCache, TAccountGame, TAccountXpAccrual >, config?: { programAddress?: TProgramAddress }, ): PayCraftingHabRentInstruction< TProgramAddress, TAccountFunder, TAccountProfile, TAccountCraftingHabInstance, TAccountSystemAndStarbasePlayerSystem, TAccountSystemAndStarbasePlayerStarbasePlayer, TAccountCurrencyCache, TAccountGame, TAccountXpAccrual > { // Program address. const programAddress = config?.programAddress ?? SAGE_PROGRAM_ADDRESS; // Original accounts. const originalAccounts = { funder: { value: input.funder ?? null, isWritable: true }, profile: { value: input.profile ?? null, isWritable: false }, craftingHabInstance: { value: input.craftingHabInstance ?? null, isWritable: true, }, systemAndStarbasePlayerSystem: { value: input.systemAndStarbasePlayerSystem ?? null, isWritable: false, }, systemAndStarbasePlayerStarbasePlayer: { value: input.systemAndStarbasePlayerStarbasePlayer ?? null, isWritable: false, }, currencyCache: { value: input.currencyCache ?? null, isWritable: true }, game: { value: input.game ?? null, isWritable: false }, xpAccrual: { value: input.xpAccrual ?? null, isWritable: true }, }; const accounts = originalAccounts as Record< keyof typeof originalAccounts, ResolvedInstructionAccount >; const getAccountMeta = getAccountMetaFactory(programAddress, 'programId'); return Object.freeze({ accounts: [ getAccountMeta('funder', accounts.funder), getAccountMeta('profile', accounts.profile), getAccountMeta('craftingHabInstance', accounts.craftingHabInstance), getAccountMeta( 'systemAndStarbasePlayerSystem', accounts.systemAndStarbasePlayerSystem, ), getAccountMeta( 'systemAndStarbasePlayerStarbasePlayer', accounts.systemAndStarbasePlayerStarbasePlayer, ), getAccountMeta('currencyCache', accounts.currencyCache), getAccountMeta('game', accounts.game), getAccountMeta('xpAccrual', accounts.xpAccrual), ], data: getPayCraftingHabRentInstructionDataEncoder().encode({}), programAddress, } as PayCraftingHabRentInstruction< TProgramAddress, TAccountFunder, TAccountProfile, TAccountCraftingHabInstance, TAccountSystemAndStarbasePlayerSystem, TAccountSystemAndStarbasePlayerStarbasePlayer, TAccountCurrencyCache, TAccountGame, TAccountXpAccrual >); } export type ParsedPayCraftingHabRentInstruction< TProgram extends string = typeof SAGE_PROGRAM_ADDRESS, TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[], > = { programAddress: Address; accounts: { /** The funder for any Solana rent payments. */ funder: TAccountMetas[0]; /** The player profile */ profile: TAccountMetas[1]; /** The crafting hab instance */ craftingHabInstance: TAccountMetas[2]; /** The [`StarSystem`] account */ systemAndStarbasePlayerSystem: TAccountMetas[3]; /** The [`StarbasePlayer`] Account */ systemAndStarbasePlayerStarbasePlayer: TAccountMetas[4]; /** The currency config cache account */ currencyCache: TAccountMetas[5]; /** The game account */ game: TAccountMetas[6]; /** * Building XP ledger (spec §5): REQUIRED by `Game.version == v1` (fail closed) and * rejected on legacy games. Appended after every pre-existing account so legacy * transactions keep their positional prefix. This instruction carries no System * program, so the ledger must already exist (any settle / place / finalize / * production call creates it). */ xpAccrual?: TAccountMetas[7] | undefined; }; data: PayCraftingHabRentInstructionData; }; export function parsePayCraftingHabRentInstruction< TProgram extends string, TAccountMetas extends readonly AccountMeta[], >( instruction: Instruction & InstructionWithAccounts & InstructionWithData, ): ParsedPayCraftingHabRentInstruction { if (instruction.accounts.length < 8) { throw new SolanaError( SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, { actualAccountMetas: instruction.accounts.length, expectedAccountMetas: 8, }, ); } let accountIndex = 0; const getNextAccount = () => { const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!; accountIndex += 1; return accountMeta; }; const getNextOptionalAccount = () => { const accountMeta = getNextAccount(); return accountMeta.address === SAGE_PROGRAM_ADDRESS ? undefined : accountMeta; }; return { programAddress: instruction.programAddress, accounts: { funder: getNextAccount(), profile: getNextAccount(), craftingHabInstance: getNextAccount(), systemAndStarbasePlayerSystem: getNextAccount(), systemAndStarbasePlayerStarbasePlayer: getNextAccount(), currencyCache: getNextAccount(), game: getNextAccount(), xpAccrual: getNextOptionalAccount(), }, data: getPayCraftingHabRentInstructionDataDecoder().decode( instruction.data, ), }; }