/** * 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, getArrayDecoder, getArrayEncoder, getBytesDecoder, getBytesEncoder, getI64Decoder, getI64Encoder, getMapDecoder, getMapEncoder, 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 { FactionRelationTrackerSeeds, findFactionRelationTrackerPda, } from '../pdas'; import { getFactionPairDecoder, getFactionPairEncoder, getRelationEntryDecoder, getRelationEntryEncoder, type FactionPair, type FactionPairArgs, type RelationEntry, type RelationEntryArgs, } from '../types'; export const FACTION_RELATION_TRACKER_DISCRIMINATOR = new Uint8Array([ 7, 233, 28, 0, 102, 208, 130, 252, ]); export function getFactionRelationTrackerDiscriminatorBytes() { return fixEncoderSize(getBytesEncoder(), 8).encode( FACTION_RELATION_TRACKER_DISCRIMINATOR, ); } /** * The diplomacy relation matrix + combat-gating config for one game. * * Sized 66-B header + a sparse `Map` tail. `combat_gating_enabled == 0` * (default) reproduces today's behavior. Future fields carve from `_reserved` (BEFORE `#[unsized_start]`). */ export type FactionRelationTracker = { discriminator: ReadonlyUint8Array; /** Layout/schema version (migration lever). */ version: number; /** PDA bump. */ bump: number; /** `0` = OFF (today's same-faction-only combat), `1` = relation-gated combat ON. */ combatGatingEnabled: number; /** `0` = OFF (own-faction docking only), `1` = relation/standing dock admission ON (P3 dock compose). */ territoryAccessEnabled: number; /** Game scoping key (also the sole seed). */ gameId: Address; /** P3.5 reserved: cross-faction warp economics master switch (OFF; warp is structurally foreclosed today). */ crossFactionEconomicsEnabled: number; /** Reserved. */ pad0: number; /** P3.5 reserved: allied cross-faction warp toll (bps). */ alliedTollBps: number; /** P3.5 reserved: neutral cross-faction warp toll (bps). */ neutralTollBps: number; /** Minimum ceasefire duration (secs) `SetFactionRelation` will accept. */ ceasefireMinDurationSecs: bigint; /** Cooldown (secs) after a ceasefire ends before the same pair may re-enter one. */ reCeasefireCooldownSecs: bigint; /** * P4 territory: dynamic-capture regime master switch. `0` = OFF (today's legacy starbase capture); * `1` = ON (`attack_starbase` requires the `FactionOwnership` sidecar + resolves the dynamic controller). */ dynamicCaptureEnabled: number; /** * P4 territory: base contested-window (secs) a capture stamps onto `FactionOwnership.contested_until` * (clamped UP to `MIN_CONTESTED_WINDOW_SECS`). Set via `SetFactionRelationConfig`. */ contestedWindowSecs: number; /** * P5b antagonist master switch. `0` = OFF (no NPC fleet minting/funding, dead COMBATANT capture path); * `1` = ON. The activation DOUBLE-GATE is `dynamic_capture_enabled == 1 && nemesis_active == 1`, both read * off this tracker (which both `attack_*` ix already load). Carved here — NOT on `Game.combat`, which has * no pad (any field there shifts `crew_config` + every `Game` decoder). Default 0 = flag-OFF byte-identical. */ nemesisActive: number; /** * Additive growth space (carve from the front, version-gated). ⚠ Only 2 B remain — single-byte flags only; * route any future multi-byte tracker dial to `FactionEconomicsConfig`. */ reserved: Array; /** Sparse relation matrix; Neutral pairs are absent. */ relations: Map; }; export type FactionRelationTrackerArgs = { /** Layout/schema version (migration lever). */ version: number; /** PDA bump. */ bump: number; /** `0` = OFF (today's same-faction-only combat), `1` = relation-gated combat ON. */ combatGatingEnabled: number; /** `0` = OFF (own-faction docking only), `1` = relation/standing dock admission ON (P3 dock compose). */ territoryAccessEnabled: number; /** Game scoping key (also the sole seed). */ gameId: Address; /** P3.5 reserved: cross-faction warp economics master switch (OFF; warp is structurally foreclosed today). */ crossFactionEconomicsEnabled: number; /** Reserved. */ pad0: number; /** P3.5 reserved: allied cross-faction warp toll (bps). */ alliedTollBps: number; /** P3.5 reserved: neutral cross-faction warp toll (bps). */ neutralTollBps: number; /** Minimum ceasefire duration (secs) `SetFactionRelation` will accept. */ ceasefireMinDurationSecs: number | bigint; /** Cooldown (secs) after a ceasefire ends before the same pair may re-enter one. */ reCeasefireCooldownSecs: number | bigint; /** * P4 territory: dynamic-capture regime master switch. `0` = OFF (today's legacy starbase capture); * `1` = ON (`attack_starbase` requires the `FactionOwnership` sidecar + resolves the dynamic controller). */ dynamicCaptureEnabled: number; /** * P4 territory: base contested-window (secs) a capture stamps onto `FactionOwnership.contested_until` * (clamped UP to `MIN_CONTESTED_WINDOW_SECS`). Set via `SetFactionRelationConfig`. */ contestedWindowSecs: number; /** * P5b antagonist master switch. `0` = OFF (no NPC fleet minting/funding, dead COMBATANT capture path); * `1` = ON. The activation DOUBLE-GATE is `dynamic_capture_enabled == 1 && nemesis_active == 1`, both read * off this tracker (which both `attack_*` ix already load). Carved here — NOT on `Game.combat`, which has * no pad (any field there shifts `crew_config` + every `Game` decoder). Default 0 = flag-OFF byte-identical. */ nemesisActive: number; /** * Additive growth space (carve from the front, version-gated). ⚠ Only 2 B remain — single-byte flags only; * route any future multi-byte tracker dial to `FactionEconomicsConfig`. */ reserved: Array; /** Sparse relation matrix; Neutral pairs are absent. */ relations: Map; }; /** Gets the encoder for {@link FactionRelationTrackerArgs} account data. */ export function getFactionRelationTrackerEncoder(): Encoder { return transformEncoder( getStructEncoder([ ['discriminator', fixEncoderSize(getBytesEncoder(), 8)], ['version', getU8Encoder()], ['bump', getU8Encoder()], ['combatGatingEnabled', getU8Encoder()], ['territoryAccessEnabled', getU8Encoder()], ['gameId', getAddressEncoder()], ['crossFactionEconomicsEnabled', getU8Encoder()], ['pad0', getU8Encoder()], ['alliedTollBps', getU16Encoder()], ['neutralTollBps', getU16Encoder()], ['ceasefireMinDurationSecs', getI64Encoder()], ['reCeasefireCooldownSecs', getI64Encoder()], ['dynamicCaptureEnabled', getU8Encoder()], ['contestedWindowSecs', getU32Encoder()], ['nemesisActive', getU8Encoder()], ['reserved', getArrayEncoder(getU8Encoder(), { size: 2 })], [ 'relations', getMapEncoder(getFactionPairEncoder(), getRelationEntryEncoder()), ], ]), (value) => ({ ...value, discriminator: FACTION_RELATION_TRACKER_DISCRIMINATOR, }), ); } /** Gets the decoder for {@link FactionRelationTracker} account data. */ export function getFactionRelationTrackerDecoder(): Decoder { return getStructDecoder([ ['discriminator', fixDecoderSize(getBytesDecoder(), 8)], ['version', getU8Decoder()], ['bump', getU8Decoder()], ['combatGatingEnabled', getU8Decoder()], ['territoryAccessEnabled', getU8Decoder()], ['gameId', getAddressDecoder()], ['crossFactionEconomicsEnabled', getU8Decoder()], ['pad0', getU8Decoder()], ['alliedTollBps', getU16Decoder()], ['neutralTollBps', getU16Decoder()], ['ceasefireMinDurationSecs', getI64Decoder()], ['reCeasefireCooldownSecs', getI64Decoder()], ['dynamicCaptureEnabled', getU8Decoder()], ['contestedWindowSecs', getU32Decoder()], ['nemesisActive', getU8Decoder()], ['reserved', getArrayDecoder(getU8Decoder(), { size: 2 })], [ 'relations', getMapDecoder(getFactionPairDecoder(), getRelationEntryDecoder()), ], ]); } /** Gets the codec for {@link FactionRelationTracker} account data. */ export function getFactionRelationTrackerCodec(): Codec< FactionRelationTrackerArgs, FactionRelationTracker > { return combineCodec( getFactionRelationTrackerEncoder(), getFactionRelationTrackerDecoder(), ); } export function decodeFactionRelationTracker( encodedAccount: EncodedAccount, ): Account; export function decodeFactionRelationTracker( encodedAccount: MaybeEncodedAccount, ): MaybeAccount; export function decodeFactionRelationTracker( encodedAccount: EncodedAccount | MaybeEncodedAccount, ): | Account | MaybeAccount { return decodeAccount( encodedAccount as MaybeEncodedAccount, getFactionRelationTrackerDecoder(), ); } export async function fetchFactionRelationTracker< TAddress extends string = string, >( rpc: Parameters[0], address: Address, config?: FetchAccountConfig, ): Promise> { const maybeAccount = await fetchMaybeFactionRelationTracker( rpc, address, config, ); assertAccountExists(maybeAccount); return maybeAccount; } export async function fetchMaybeFactionRelationTracker< TAddress extends string = string, >( rpc: Parameters[0], address: Address, config?: FetchAccountConfig, ): Promise> { const maybeAccount = await fetchEncodedAccount(rpc, address, config); return decodeFactionRelationTracker(maybeAccount); } export async function fetchAllFactionRelationTracker( rpc: Parameters[0], addresses: Array
, config?: FetchAccountsConfig, ): Promise[]> { const maybeAccounts = await fetchAllMaybeFactionRelationTracker( rpc, addresses, config, ); assertAccountsExist(maybeAccounts); return maybeAccounts; } export async function fetchAllMaybeFactionRelationTracker( rpc: Parameters[0], addresses: Array
, config?: FetchAccountsConfig, ): Promise[]> { const maybeAccounts = await fetchEncodedAccounts(rpc, addresses, config); return maybeAccounts.map((maybeAccount) => decodeFactionRelationTracker(maybeAccount), ); } export async function fetchFactionRelationTrackerFromSeeds( rpc: Parameters[0], seeds: FactionRelationTrackerSeeds, config: FetchAccountConfig & { programAddress?: Address } = {}, ): Promise> { const maybeAccount = await fetchMaybeFactionRelationTrackerFromSeeds( rpc, seeds, config, ); assertAccountExists(maybeAccount); return maybeAccount; } export async function fetchMaybeFactionRelationTrackerFromSeeds( rpc: Parameters[0], seeds: FactionRelationTrackerSeeds, config: FetchAccountConfig & { programAddress?: Address } = {}, ): Promise> { const { programAddress, ...fetchConfig } = config; const [address] = await findFactionRelationTrackerPda(seeds, { programAddress, }); return await fetchMaybeFactionRelationTracker(rpc, address, fetchConfig); }