/** * 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, getU8Decoder, getU8Encoder, 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 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'; export const BIND_CREW_DISCRIMINATOR = new Uint8Array([ 181, 171, 118, 200, 150, 176, 160, 13, ]); export function getBindCrewDiscriminatorBytes() { return fixEncoderSize(getBytesEncoder(), 8).encode(BIND_CREW_DISCRIMINATOR); } export type BindCrewInstruction< 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 BindCrewInstructionData = { discriminator: ReadonlyUint8Array; /** The crew cNFT asset id to bind. */ crewAssetId: Array; /** DAS-attested rarity discriminant. */ rarity: number; /** Rarity-derived base aptitude seed (as `migrate`). */ baseStat: number; /** The roster page the supplied account must be. */ pageIndex: number; /** The index of the key in the player profile. */ keyIndex: number; }; export type BindCrewInstructionDataArgs = { /** The crew cNFT asset id to bind. */ crewAssetId: Array; /** DAS-attested rarity discriminant. */ rarity: number; /** Rarity-derived base aptitude seed (as `migrate`). */ baseStat: number; /** The roster page the supplied account must be. */ pageIndex: number; /** The index of the key in the player profile. */ keyIndex: number; }; export function getBindCrewInstructionDataEncoder(): FixedSizeEncoder { return transformEncoder( getStructEncoder([ ['discriminator', fixEncoderSize(getBytesEncoder(), 8)], ['crewAssetId', getArrayEncoder(getU8Encoder(), { size: 32 })], ['rarity', getU8Encoder()], ['baseStat', getU16Encoder()], ['pageIndex', getU16Encoder()], ['keyIndex', getU16Encoder()], ]), (value) => ({ ...value, discriminator: BIND_CREW_DISCRIMINATOR }), ); } export function getBindCrewInstructionDataDecoder(): FixedSizeDecoder { return getStructDecoder([ ['discriminator', fixDecoderSize(getBytesDecoder(), 8)], ['crewAssetId', getArrayDecoder(getU8Decoder(), { size: 32 })], ['rarity', getU8Decoder()], ['baseStat', getU16Decoder()], ['pageIndex', getU16Decoder()], ['keyIndex', getU16Decoder()], ]); } export function getBindCrewInstructionDataCodec(): FixedSizeCodec< BindCrewInstructionDataArgs, BindCrewInstructionData > { return combineCodec( getBindCrewInstructionDataEncoder(), getBindCrewInstructionDataDecoder(), ); } export type BindCrewAsyncInput< 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; 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 `rarity`/`base_stat` 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; roster?: Address; crewAssetId: BindCrewInstructionDataArgs['crewAssetId']; rarity: BindCrewInstructionDataArgs['rarity']; baseStat: BindCrewInstructionDataArgs['baseStat']; pageIndex: BindCrewInstructionDataArgs['pageIndex']; keyIndex: BindCrewInstructionDataArgs['keyIndex']; }; export async function getBindCrewInstructionAsync< 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: BindCrewAsyncInput< TAccountProfileValidationSigner, TAccountProfileValidationProfile, TAccountProfileValidationCertificate, TAccountProfileValidationProgram, TAccountGame, TAccountCharacter, TAccountCrewAuthority, TAccountSystemAndStarbasePlayerSystem, TAccountSystemAndStarbasePlayerStarbasePlayer, TAccountSystemProgram, TAccountRoster >, config?: { programAddress?: TProgramAddress }, ): Promise< BindCrewInstruction< 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: getBindCrewInstructionDataEncoder().encode( args as BindCrewInstructionDataArgs, ), programAddress, } as BindCrewInstruction< TProgramAddress, TAccountProfileValidationSigner, TAccountProfileValidationProfile, TAccountProfileValidationCertificate, TAccountProfileValidationProgram, TAccountGame, TAccountCharacter, TAccountCrewAuthority, TAccountSystemAndStarbasePlayerSystem, TAccountSystemAndStarbasePlayerStarbasePlayer, TAccountSystemProgram, TAccountRoster >); } export type BindCrewInput< 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; 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 `rarity`/`base_stat` 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; roster?: Address; crewAssetId: BindCrewInstructionDataArgs['crewAssetId']; rarity: BindCrewInstructionDataArgs['rarity']; baseStat: BindCrewInstructionDataArgs['baseStat']; pageIndex: BindCrewInstructionDataArgs['pageIndex']; keyIndex: BindCrewInstructionDataArgs['keyIndex']; }; export function getBindCrewInstruction< 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: BindCrewInput< TAccountProfileValidationSigner, TAccountProfileValidationProfile, TAccountProfileValidationCertificate, TAccountProfileValidationProgram, TAccountGame, TAccountCharacter, TAccountCrewAuthority, TAccountSystemAndStarbasePlayerSystem, TAccountSystemAndStarbasePlayerStarbasePlayer, TAccountSystemProgram, TAccountRoster >, config?: { programAddress?: TProgramAddress }, ): BindCrewInstruction< 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: getBindCrewInstructionDataEncoder().encode( args as BindCrewInstructionDataArgs, ), programAddress, } as BindCrewInstruction< TProgramAddress, TAccountProfileValidationSigner, TAccountProfileValidationProfile, TAccountProfileValidationCertificate, TAccountProfileValidationProgram, TAccountGame, TAccountCharacter, TAccountCrewAuthority, TAccountSystemAndStarbasePlayerSystem, TAccountSystemAndStarbasePlayerStarbasePlayer, TAccountSystemProgram, TAccountRoster >); } export type ParsedBindCrewInstruction< 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]; 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 `rarity`/`base_stat` 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]; roster?: TAccountMetas[10] | undefined; }; data: BindCrewInstructionData; }; export function parseBindCrewInstruction< TProgram extends string, TAccountMetas extends readonly AccountMeta[], >( instruction: Instruction & InstructionWithAccounts & InstructionWithData, ): ParsedBindCrewInstruction { 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: getBindCrewInstructionDataDecoder().decode(instruction.data), }; }