/** * 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, getArrayDecoder, getArrayEncoder, getBytesDecoder, getBytesEncoder, getProgramDerivedAddress, getStructDecoder, getStructEncoder, getU16Decoder, getU16Encoder, SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, SolanaError, transformEncoder, type AccountMeta, type AccountSignerMeta, type Address, type Codec, type Decoder, type Encoder, type Instruction, type InstructionWithAccounts, type InstructionWithData, type ReadonlyAccount, type ReadonlySignerAccount, type ReadonlyUint8Array, type TransactionSigner, type WritableAccount, } from '@solana/kit'; import { getAccountMetaFactory, getAddressFromResolvedInstructionAccount, type ResolvedInstructionAccount, } from '@solana/program-client-core'; import { SAGE_PROGRAM_ADDRESS } from '../programs'; import { getCrewMigrateInputDecoder, getCrewMigrateInputEncoder, type CrewMigrateInput, type CrewMigrateInputArgs, } from '../types'; export const MIGRATE_CREW_MEMBER_DISCRIMINATOR = new Uint8Array([ 107, 249, 4, 55, 136, 207, 204, 154, ]); export function getMigrateCrewMemberDiscriminatorBytes() { return fixEncoderSize(getBytesEncoder(), 8).encode( MIGRATE_CREW_MEMBER_DISCRIMINATOR, ); } export type MigrateCrewMemberInstruction< TProgram extends string = typeof SAGE_PROGRAM_ADDRESS, TAccountProfileValidationSigner extends string | AccountMeta = string, TAccountProfileValidationProfile extends string | AccountMeta = string, TAccountProfileValidationCertificate extends string | AccountMeta = string, TAccountProfileValidationProgram extends string | AccountMeta = 'C4PRoFNroxxzdgeCoM31LJjYRg7kT6ymogSTAT99iD1u', TAccountGame extends string | AccountMeta = string, TAccountCharacter extends string | AccountMeta = string, TAccountCrewAuthority extends string | AccountMeta = string, TAccountSystemAndStarbasePlayerSystem extends string | AccountMeta = string, TAccountSystemAndStarbasePlayerStarbasePlayer extends | string | AccountMeta = string, TAccountSystemProgram extends string | AccountMeta = '11111111111111111111111111111111', TAccountRoster extends string | AccountMeta = string, TRemainingAccounts extends readonly AccountMeta[] = [], > = Instruction & InstructionWithData & InstructionWithAccounts< [ TAccountProfileValidationSigner extends string ? ReadonlySignerAccount & AccountSignerMeta : TAccountProfileValidationSigner, TAccountProfileValidationProfile extends string ? WritableAccount : TAccountProfileValidationProfile, TAccountProfileValidationCertificate extends string ? ReadonlyAccount : TAccountProfileValidationCertificate, TAccountProfileValidationProgram extends string ? ReadonlyAccount : TAccountProfileValidationProgram, TAccountGame extends string ? ReadonlyAccount : TAccountGame, TAccountCharacter extends string ? WritableAccount : TAccountCharacter, TAccountCrewAuthority extends string ? ReadonlySignerAccount & AccountSignerMeta : TAccountCrewAuthority, TAccountSystemAndStarbasePlayerSystem extends string ? ReadonlyAccount : TAccountSystemAndStarbasePlayerSystem, TAccountSystemAndStarbasePlayerStarbasePlayer extends string ? WritableAccount : TAccountSystemAndStarbasePlayerStarbasePlayer, TAccountSystemProgram extends string ? ReadonlyAccount : TAccountSystemProgram, TAccountRoster extends string ? WritableAccount : TAccountRoster, ...TRemainingAccounts, ] >; export type MigrateCrewMemberInstructionData = { discriminator: ReadonlyUint8Array; /** The crew to bind this call (DAS-attested rarities). */ items: Array; /** The page index the supplied roster account must be (paginated whales, master §5). */ pageIndex: number; /** The index of the key in the player profile. */ keyIndex: number; }; export type MigrateCrewMemberInstructionDataArgs = { /** The crew to bind this call (DAS-attested rarities). */ items: Array; /** The page index the supplied roster account must be (paginated whales, master §5). */ pageIndex: number; /** The index of the key in the player profile. */ keyIndex: number; }; export function getMigrateCrewMemberInstructionDataEncoder(): Encoder { return transformEncoder( getStructEncoder([ ['discriminator', fixEncoderSize(getBytesEncoder(), 8)], ['items', getArrayEncoder(getCrewMigrateInputEncoder())], ['pageIndex', getU16Encoder()], ['keyIndex', getU16Encoder()], ]), (value) => ({ ...value, discriminator: MIGRATE_CREW_MEMBER_DISCRIMINATOR }), ); } export function getMigrateCrewMemberInstructionDataDecoder(): Decoder { return getStructDecoder([ ['discriminator', fixDecoderSize(getBytesDecoder(), 8)], ['items', getArrayDecoder(getCrewMigrateInputDecoder())], ['pageIndex', getU16Decoder()], ['keyIndex', getU16Decoder()], ]); } export function getMigrateCrewMemberInstructionDataCodec(): Codec< MigrateCrewMemberInstructionDataArgs, MigrateCrewMemberInstructionData > { return combineCodec( getMigrateCrewMemberInstructionDataEncoder(), getMigrateCrewMemberInstructionDataDecoder(), ); } export type MigrateCrewMemberAsyncInput< TAccountProfileValidationSigner extends string = string, TAccountProfileValidationProfile extends string = string, TAccountProfileValidationCertificate extends string = string, TAccountProfileValidationProgram extends string = string, TAccountGame extends string = string, TAccountCharacter extends string = string, TAccountCrewAuthority extends string = string, TAccountSystemAndStarbasePlayerSystem extends string = string, TAccountSystemAndStarbasePlayerStarbasePlayer extends string = string, TAccountSystemProgram extends string = string, TAccountRoster extends string = string, > = { profileValidationSigner: TransactionSigner; profileValidationProfile: Address; profileValidationCertificate?: Address; profileValidationProgram?: Address; /** The game account (carries the `crew_config` off-switch in its packed header). */ game: Address; /** * The caller's `Character` — the crew-roster OWNER anchor (PR #732 second review). * Validated against the signer's profile + game; the roster below must then BE this * character's `(character, page_index)` PDA (`ensure_roster_is_characters_page`). */ character?: Address; /** * The crew **attestation authority** — must equal `Game.crew_config` and must SIGN. * TEMPORARY hard gate (PR #732 second review): until the Phase-2 DAS/escrow attestation * lands, crew-record creation is closed to the configured authority (ops / the future * attestation oracle), so caller-supplied DAS traits cannot be forged by players even * with the feature enabled. Phase 2 replaces this co-signature with on-chain * attestation verification. */ crewAuthority: TransactionSigner; /** The [`StarSystem`] account */ systemAndStarbasePlayerSystem: Address; /** The [`StarbasePlayer`] Account */ systemAndStarbasePlayerStarbasePlayer: Address; systemProgram?: Address; /** * The crew roster page to append onto (`page_index`-validated at the handler). The * append-last optional roster. `Mut` because we mutate the `List` tail + cached census. */ roster?: Address; items: MigrateCrewMemberInstructionDataArgs['items']; pageIndex: MigrateCrewMemberInstructionDataArgs['pageIndex']; keyIndex: MigrateCrewMemberInstructionDataArgs['keyIndex']; }; export async function getMigrateCrewMemberInstructionAsync< TAccountProfileValidationSigner extends string, TAccountProfileValidationProfile extends string, TAccountProfileValidationCertificate extends string, TAccountProfileValidationProgram extends string, TAccountGame extends string, TAccountCharacter extends string, TAccountCrewAuthority extends string, TAccountSystemAndStarbasePlayerSystem extends string, TAccountSystemAndStarbasePlayerStarbasePlayer extends string, TAccountSystemProgram extends string, TAccountRoster extends string, TProgramAddress extends Address = typeof SAGE_PROGRAM_ADDRESS, >( input: MigrateCrewMemberAsyncInput< TAccountProfileValidationSigner, TAccountProfileValidationProfile, TAccountProfileValidationCertificate, TAccountProfileValidationProgram, TAccountGame, TAccountCharacter, TAccountCrewAuthority, TAccountSystemAndStarbasePlayerSystem, TAccountSystemAndStarbasePlayerStarbasePlayer, TAccountSystemProgram, TAccountRoster >, config?: { programAddress?: TProgramAddress }, ): Promise< MigrateCrewMemberInstruction< TProgramAddress, TAccountProfileValidationSigner, TAccountProfileValidationProfile, TAccountProfileValidationCertificate, TAccountProfileValidationProgram, TAccountGame, TAccountCharacter, TAccountCrewAuthority, TAccountSystemAndStarbasePlayerSystem, TAccountSystemAndStarbasePlayerStarbasePlayer, TAccountSystemProgram, TAccountRoster > > { // Program address. const programAddress = config?.programAddress ?? SAGE_PROGRAM_ADDRESS; // Original accounts. const originalAccounts = { profileValidationSigner: { value: input.profileValidationSigner ?? null, isWritable: false, }, profileValidationProfile: { value: input.profileValidationProfile ?? null, isWritable: true, }, profileValidationCertificate: { value: input.profileValidationCertificate ?? null, isWritable: false, }, profileValidationProgram: { value: input.profileValidationProgram ?? null, isWritable: false, }, game: { value: input.game ?? null, isWritable: false }, character: { value: input.character ?? null, isWritable: true }, crewAuthority: { value: input.crewAuthority ?? null, isWritable: false }, systemAndStarbasePlayerSystem: { value: input.systemAndStarbasePlayerSystem ?? null, isWritable: false, }, systemAndStarbasePlayerStarbasePlayer: { value: input.systemAndStarbasePlayerStarbasePlayer ?? null, isWritable: true, }, systemProgram: { value: input.systemProgram ?? null, isWritable: false }, roster: { value: input.roster ?? null, isWritable: true }, }; const accounts = originalAccounts as Record< keyof typeof originalAccounts, ResolvedInstructionAccount >; // Original args. const args = { ...input }; // Resolve default values. if (!accounts.profileValidationProgram.value) { accounts.profileValidationProgram.value = 'C4PRoFNroxxzdgeCoM31LJjYRg7kT6ymogSTAT99iD1u' as Address<'C4PRoFNroxxzdgeCoM31LJjYRg7kT6ymogSTAT99iD1u'>; } if (!accounts.character.value) { accounts.character.value = await getProgramDerivedAddress({ programAddress, seeds: [ getBytesEncoder().encode( new Uint8Array([67, 104, 97, 114, 97, 99, 116, 101, 114]), ), getAddressEncoder().encode( getAddressFromResolvedInstructionAccount( 'profileValidationProfile', accounts.profileValidationProfile.value, ), ), getAddressEncoder().encode( getAddressFromResolvedInstructionAccount('game', accounts.game.value), ), ], }); } if (!accounts.systemProgram.value) { accounts.systemProgram.value = '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>; } const getAccountMeta = getAccountMetaFactory(programAddress, 'programId'); return Object.freeze({ accounts: [ getAccountMeta( 'profileValidationSigner', accounts.profileValidationSigner, ), getAccountMeta( 'profileValidationProfile', accounts.profileValidationProfile, ), getAccountMeta( 'profileValidationCertificate', accounts.profileValidationCertificate, ), getAccountMeta( 'profileValidationProgram', accounts.profileValidationProgram, ), getAccountMeta('game', accounts.game), getAccountMeta('character', accounts.character), getAccountMeta('crewAuthority', accounts.crewAuthority), getAccountMeta( 'systemAndStarbasePlayerSystem', accounts.systemAndStarbasePlayerSystem, ), getAccountMeta( 'systemAndStarbasePlayerStarbasePlayer', accounts.systemAndStarbasePlayerStarbasePlayer, ), getAccountMeta('systemProgram', accounts.systemProgram), getAccountMeta('roster', accounts.roster), ], data: getMigrateCrewMemberInstructionDataEncoder().encode( args as MigrateCrewMemberInstructionDataArgs, ), programAddress, } as MigrateCrewMemberInstruction< TProgramAddress, TAccountProfileValidationSigner, TAccountProfileValidationProfile, TAccountProfileValidationCertificate, TAccountProfileValidationProgram, TAccountGame, TAccountCharacter, TAccountCrewAuthority, TAccountSystemAndStarbasePlayerSystem, TAccountSystemAndStarbasePlayerStarbasePlayer, TAccountSystemProgram, TAccountRoster >); } export type MigrateCrewMemberInput< TAccountProfileValidationSigner extends string = string, TAccountProfileValidationProfile extends string = string, TAccountProfileValidationCertificate extends string = string, TAccountProfileValidationProgram extends string = string, TAccountGame extends string = string, TAccountCharacter extends string = string, TAccountCrewAuthority extends string = string, TAccountSystemAndStarbasePlayerSystem extends string = string, TAccountSystemAndStarbasePlayerStarbasePlayer extends string = string, TAccountSystemProgram extends string = string, TAccountRoster extends string = string, > = { profileValidationSigner: TransactionSigner; profileValidationProfile: Address; profileValidationCertificate?: Address; profileValidationProgram?: Address; /** The game account (carries the `crew_config` off-switch in its packed header). */ game: Address; /** * The caller's `Character` — the crew-roster OWNER anchor (PR #732 second review). * Validated against the signer's profile + game; the roster below must then BE this * character's `(character, page_index)` PDA (`ensure_roster_is_characters_page`). */ character: Address; /** * The crew **attestation authority** — must equal `Game.crew_config` and must SIGN. * TEMPORARY hard gate (PR #732 second review): until the Phase-2 DAS/escrow attestation * lands, crew-record creation is closed to the configured authority (ops / the future * attestation oracle), so caller-supplied DAS traits cannot be forged by players even * with the feature enabled. Phase 2 replaces this co-signature with on-chain * attestation verification. */ crewAuthority: TransactionSigner; /** The [`StarSystem`] account */ systemAndStarbasePlayerSystem: Address; /** The [`StarbasePlayer`] Account */ systemAndStarbasePlayerStarbasePlayer: Address; systemProgram?: Address; /** * The crew roster page to append onto (`page_index`-validated at the handler). The * append-last optional roster. `Mut` because we mutate the `List` tail + cached census. */ roster?: Address; items: MigrateCrewMemberInstructionDataArgs['items']; pageIndex: MigrateCrewMemberInstructionDataArgs['pageIndex']; keyIndex: MigrateCrewMemberInstructionDataArgs['keyIndex']; }; export function getMigrateCrewMemberInstruction< TAccountProfileValidationSigner extends string, TAccountProfileValidationProfile extends string, TAccountProfileValidationCertificate extends string, TAccountProfileValidationProgram extends string, TAccountGame extends string, TAccountCharacter extends string, TAccountCrewAuthority extends string, TAccountSystemAndStarbasePlayerSystem extends string, TAccountSystemAndStarbasePlayerStarbasePlayer extends string, TAccountSystemProgram extends string, TAccountRoster extends string, TProgramAddress extends Address = typeof SAGE_PROGRAM_ADDRESS, >( input: MigrateCrewMemberInput< TAccountProfileValidationSigner, TAccountProfileValidationProfile, TAccountProfileValidationCertificate, TAccountProfileValidationProgram, TAccountGame, TAccountCharacter, TAccountCrewAuthority, TAccountSystemAndStarbasePlayerSystem, TAccountSystemAndStarbasePlayerStarbasePlayer, TAccountSystemProgram, TAccountRoster >, config?: { programAddress?: TProgramAddress }, ): MigrateCrewMemberInstruction< TProgramAddress, TAccountProfileValidationSigner, TAccountProfileValidationProfile, TAccountProfileValidationCertificate, TAccountProfileValidationProgram, TAccountGame, TAccountCharacter, TAccountCrewAuthority, TAccountSystemAndStarbasePlayerSystem, TAccountSystemAndStarbasePlayerStarbasePlayer, TAccountSystemProgram, TAccountRoster > { // Program address. const programAddress = config?.programAddress ?? SAGE_PROGRAM_ADDRESS; // Original accounts. const originalAccounts = { profileValidationSigner: { value: input.profileValidationSigner ?? null, isWritable: false, }, profileValidationProfile: { value: input.profileValidationProfile ?? null, isWritable: true, }, profileValidationCertificate: { value: input.profileValidationCertificate ?? null, isWritable: false, }, profileValidationProgram: { value: input.profileValidationProgram ?? null, isWritable: false, }, game: { value: input.game ?? null, isWritable: false }, character: { value: input.character ?? null, isWritable: true }, crewAuthority: { value: input.crewAuthority ?? null, isWritable: false }, systemAndStarbasePlayerSystem: { value: input.systemAndStarbasePlayerSystem ?? null, isWritable: false, }, systemAndStarbasePlayerStarbasePlayer: { value: input.systemAndStarbasePlayerStarbasePlayer ?? null, isWritable: true, }, systemProgram: { value: input.systemProgram ?? null, isWritable: false }, roster: { value: input.roster ?? null, isWritable: true }, }; const accounts = originalAccounts as Record< keyof typeof originalAccounts, ResolvedInstructionAccount >; // Original args. const args = { ...input }; // Resolve default values. if (!accounts.profileValidationProgram.value) { accounts.profileValidationProgram.value = 'C4PRoFNroxxzdgeCoM31LJjYRg7kT6ymogSTAT99iD1u' as Address<'C4PRoFNroxxzdgeCoM31LJjYRg7kT6ymogSTAT99iD1u'>; } if (!accounts.systemProgram.value) { accounts.systemProgram.value = '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>; } const getAccountMeta = getAccountMetaFactory(programAddress, 'programId'); return Object.freeze({ accounts: [ getAccountMeta( 'profileValidationSigner', accounts.profileValidationSigner, ), getAccountMeta( 'profileValidationProfile', accounts.profileValidationProfile, ), getAccountMeta( 'profileValidationCertificate', accounts.profileValidationCertificate, ), getAccountMeta( 'profileValidationProgram', accounts.profileValidationProgram, ), getAccountMeta('game', accounts.game), getAccountMeta('character', accounts.character), getAccountMeta('crewAuthority', accounts.crewAuthority), getAccountMeta( 'systemAndStarbasePlayerSystem', accounts.systemAndStarbasePlayerSystem, ), getAccountMeta( 'systemAndStarbasePlayerStarbasePlayer', accounts.systemAndStarbasePlayerStarbasePlayer, ), getAccountMeta('systemProgram', accounts.systemProgram), getAccountMeta('roster', accounts.roster), ], data: getMigrateCrewMemberInstructionDataEncoder().encode( args as MigrateCrewMemberInstructionDataArgs, ), programAddress, } as MigrateCrewMemberInstruction< TProgramAddress, TAccountProfileValidationSigner, TAccountProfileValidationProfile, TAccountProfileValidationCertificate, TAccountProfileValidationProgram, TAccountGame, TAccountCharacter, TAccountCrewAuthority, TAccountSystemAndStarbasePlayerSystem, TAccountSystemAndStarbasePlayerStarbasePlayer, TAccountSystemProgram, TAccountRoster >); } export type ParsedMigrateCrewMemberInstruction< TProgram extends string = typeof SAGE_PROGRAM_ADDRESS, TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[], > = { programAddress: Address; accounts: { profileValidationSigner: TAccountMetas[0]; profileValidationProfile: TAccountMetas[1]; profileValidationCertificate?: TAccountMetas[2] | undefined; profileValidationProgram: TAccountMetas[3]; /** The game account (carries the `crew_config` off-switch in its packed header). */ game: TAccountMetas[4]; /** * The caller's `Character` — the crew-roster OWNER anchor (PR #732 second review). * Validated against the signer's profile + game; the roster below must then BE this * character's `(character, page_index)` PDA (`ensure_roster_is_characters_page`). */ character: TAccountMetas[5]; /** * The crew **attestation authority** — must equal `Game.crew_config` and must SIGN. * TEMPORARY hard gate (PR #732 second review): until the Phase-2 DAS/escrow attestation * lands, crew-record creation is closed to the configured authority (ops / the future * attestation oracle), so caller-supplied DAS traits cannot be forged by players even * with the feature enabled. Phase 2 replaces this co-signature with on-chain * attestation verification. */ crewAuthority: TAccountMetas[6]; /** The [`StarSystem`] account */ systemAndStarbasePlayerSystem: TAccountMetas[7]; /** The [`StarbasePlayer`] Account */ systemAndStarbasePlayerStarbasePlayer: TAccountMetas[8]; systemProgram: TAccountMetas[9]; /** * The crew roster page to append onto (`page_index`-validated at the handler). The * append-last optional roster. `Mut` because we mutate the `List` tail + cached census. */ roster?: TAccountMetas[10] | undefined; }; data: MigrateCrewMemberInstructionData; }; export function parseMigrateCrewMemberInstruction< TProgram extends string, TAccountMetas extends readonly AccountMeta[], >( instruction: Instruction & InstructionWithAccounts & InstructionWithData, ): ParsedMigrateCrewMemberInstruction { if (instruction.accounts.length < 11) { throw new SolanaError( SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, { actualAccountMetas: instruction.accounts.length, expectedAccountMetas: 11, }, ); } 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: { profileValidationSigner: getNextAccount(), profileValidationProfile: getNextAccount(), profileValidationCertificate: getNextOptionalAccount(), profileValidationProgram: getNextAccount(), game: getNextAccount(), character: getNextAccount(), crewAuthority: getNextAccount(), systemAndStarbasePlayerSystem: getNextAccount(), systemAndStarbasePlayerStarbasePlayer: getNextAccount(), systemProgram: getNextAccount(), roster: getNextOptionalAccount(), }, data: getMigrateCrewMemberInstructionDataDecoder().decode(instruction.data), }; }