/** * 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 { assertAccountExists, assertAccountsExist, combineCodec, decodeAccount, fetchEncodedAccount, fetchEncodedAccounts, fixDecoderSize, fixEncoderSize, getAddressDecoder, getAddressEncoder, getBytesDecoder, getBytesEncoder, getStructDecoder, getStructEncoder, getU16Decoder, getU16Encoder, getU32Decoder, getU32Encoder, getU8Decoder, getU8Encoder, transformEncoder, type Account, type Address, type Codec, type Decoder, type EncodedAccount, type Encoder, type FetchAccountConfig, type FetchAccountsConfig, type MaybeAccount, type MaybeEncodedAccount, type ReadonlyUint8Array, } from '@solana/kit'; import { CharacterSyncSeeds, findCharacterSyncPda } from '../pdas'; import { getCharacterModifierDecoder, getCharacterModifierEncoder, type CharacterModifier, type CharacterModifierArgs, } from '../types'; export const CHARACTER_SYNC_DISCRIMINATOR = new Uint8Array([ 246, 5, 165, 117, 82, 166, 101, 6, ]); export function getCharacterSyncDiscriminatorBytes() { return fixEncoderSize(getBytesEncoder(), 8).encode( CHARACTER_SYNC_DISCRIMINATOR, ); } /** * Staging account for a bounded Character research-definition sync. * * The live Character modifiers remain untouched while this accumulator is * built. That matters because permissionless fleet settlement and combat may * legitimately read the Character between chunks. Only a complete accumulator * is committed to the Character. */ export type CharacterSync = { discriminator: ReadonlyUint8Array; /** Account layout version. Zero denotes a freshly created account. */ version: number; /** Character whose modifiers are being rebuilt. */ character: Address; /** Game whose definitions are authoritative. */ gameId: Address; /** Research-tree sequence captured for this rebuild. */ researchSeqId: number; /** Number of unlocked nodes captured for this rebuild. */ unlockedNodesLen: number; /** Index of the next unlocked node to replay. */ nextNodeIndex: number; /** Number of levels already replayed for `next_node_index`. */ nextNodeRepeat: number; /** PDA bump. */ bump: number; /** Complete modifier accumulator for nodes before `next_node_index`. */ modifiers: CharacterModifier; }; export type CharacterSyncArgs = { /** Account layout version. Zero denotes a freshly created account. */ version: number; /** Character whose modifiers are being rebuilt. */ character: Address; /** Game whose definitions are authoritative. */ gameId: Address; /** Research-tree sequence captured for this rebuild. */ researchSeqId: number; /** Number of unlocked nodes captured for this rebuild. */ unlockedNodesLen: number; /** Index of the next unlocked node to replay. */ nextNodeIndex: number; /** Number of levels already replayed for `next_node_index`. */ nextNodeRepeat: number; /** PDA bump. */ bump: number; /** Complete modifier accumulator for nodes before `next_node_index`. */ modifiers: CharacterModifierArgs; }; /** Gets the encoder for {@link CharacterSyncArgs} account data. */ export function getCharacterSyncEncoder(): Encoder { return transformEncoder( getStructEncoder([ ['discriminator', fixEncoderSize(getBytesEncoder(), 8)], ['version', getU8Encoder()], ['character', getAddressEncoder()], ['gameId', getAddressEncoder()], ['researchSeqId', getU32Encoder()], ['unlockedNodesLen', getU16Encoder()], ['nextNodeIndex', getU16Encoder()], ['nextNodeRepeat', getU32Encoder()], ['bump', getU8Encoder()], ['modifiers', getCharacterModifierEncoder()], ]), (value) => ({ ...value, discriminator: CHARACTER_SYNC_DISCRIMINATOR }), ); } /** Gets the decoder for {@link CharacterSync} account data. */ export function getCharacterSyncDecoder(): Decoder { return getStructDecoder([ ['discriminator', fixDecoderSize(getBytesDecoder(), 8)], ['version', getU8Decoder()], ['character', getAddressDecoder()], ['gameId', getAddressDecoder()], ['researchSeqId', getU32Decoder()], ['unlockedNodesLen', getU16Decoder()], ['nextNodeIndex', getU16Decoder()], ['nextNodeRepeat', getU32Decoder()], ['bump', getU8Decoder()], ['modifiers', getCharacterModifierDecoder()], ]); } /** Gets the codec for {@link CharacterSync} account data. */ export function getCharacterSyncCodec(): Codec< CharacterSyncArgs, CharacterSync > { return combineCodec(getCharacterSyncEncoder(), getCharacterSyncDecoder()); } export function decodeCharacterSync( encodedAccount: EncodedAccount, ): Account; export function decodeCharacterSync( encodedAccount: MaybeEncodedAccount, ): MaybeAccount; export function decodeCharacterSync( encodedAccount: EncodedAccount | MaybeEncodedAccount, ): Account | MaybeAccount { return decodeAccount( encodedAccount as MaybeEncodedAccount, getCharacterSyncDecoder(), ); } export async function fetchCharacterSync( rpc: Parameters[0], address: Address, config?: FetchAccountConfig, ): Promise> { const maybeAccount = await fetchMaybeCharacterSync(rpc, address, config); assertAccountExists(maybeAccount); return maybeAccount; } export async function fetchMaybeCharacterSync( rpc: Parameters[0], address: Address, config?: FetchAccountConfig, ): Promise> { const maybeAccount = await fetchEncodedAccount(rpc, address, config); return decodeCharacterSync(maybeAccount); } export async function fetchAllCharacterSync( rpc: Parameters[0], addresses: Array
, config?: FetchAccountsConfig, ): Promise[]> { const maybeAccounts = await fetchAllMaybeCharacterSync( rpc, addresses, config, ); assertAccountsExist(maybeAccounts); return maybeAccounts; } export async function fetchAllMaybeCharacterSync( rpc: Parameters[0], addresses: Array
, config?: FetchAccountsConfig, ): Promise[]> { const maybeAccounts = await fetchEncodedAccounts(rpc, addresses, config); return maybeAccounts.map((maybeAccount) => decodeCharacterSync(maybeAccount)); } export async function fetchCharacterSyncFromSeeds( rpc: Parameters[0], seeds: CharacterSyncSeeds, config: FetchAccountConfig & { programAddress?: Address } = {}, ): Promise> { const maybeAccount = await fetchMaybeCharacterSyncFromSeeds( rpc, seeds, config, ); assertAccountExists(maybeAccount); return maybeAccount; } export async function fetchMaybeCharacterSyncFromSeeds( rpc: Parameters[0], seeds: CharacterSyncSeeds, config: FetchAccountConfig & { programAddress?: Address } = {}, ): Promise> { const { programAddress, ...fetchConfig } = config; const [address] = await findCharacterSyncPda(seeds, { programAddress }); return await fetchMaybeCharacterSync(rpc, address, fetchConfig); }