From f12d786e4626607bfdead202131bfc666b81798b Mon Sep 17 00:00:00 2001 From: Ian Macalinao Date: Mon, 13 Oct 2025 17:23:56 +0800 Subject: [PATCH 1/2] Add discriminators for SPL governance account types --- clients/spl-governance/coda.config.mjs | 151 ++++++++++++ .../src/generated/accounts/governanceV1.ts | 33 +-- .../src/generated/accounts/governanceV2.ts | 34 +-- .../accounts/legacyTokenOwnerRecord.ts | 48 ++-- .../src/generated/accounts/programMetadata.ts | 34 +-- .../src/generated/accounts/proposalDeposit.ts | 31 ++- .../accounts/proposalInstructionV1.ts | 38 ++- .../accounts/proposalTransactionV2.ts | 42 ++-- .../src/generated/accounts/proposalV1.ts | 72 +++--- .../src/generated/accounts/proposalV2.ts | 80 ++++--- .../generated/accounts/realmConfigAccount.ts | 31 ++- .../src/generated/accounts/realmV1.ts | 37 +-- .../src/generated/accounts/realmV2.ts | 39 ++-- .../generated/accounts/requiredSignatory.ts | 31 ++- .../generated/accounts/signatoryRecordV1.ts | 31 ++- .../generated/accounts/signatoryRecordV2.ts | 33 ++- .../generated/accounts/tokenOwnerRecordV1.ts | 43 ++-- .../generated/accounts/tokenOwnerRecordV2.ts | 45 ++-- .../src/generated/accounts/voteRecordV1.ts | 33 +-- .../src/generated/accounts/voteRecordV2.ts | 37 +-- .../src/generated/programs/splGovernance.ts | 218 ++++++++++++++++++ clients/spl-governance/tsconfig.json | 5 +- 22 files changed, 840 insertions(+), 306 deletions(-) diff --git a/clients/spl-governance/coda.config.mjs b/clients/spl-governance/coda.config.mjs index fe1a7bef..1652bf41 100644 --- a/clients/spl-governance/coda.config.mjs +++ b/clients/spl-governance/coda.config.mjs @@ -3,12 +3,15 @@ import { addPdasVisitor, constantPdaSeedNodeFromString, defineConfig, + definedTypeLinkNode, + enumValueNode, numberTypeNode, pdaLinkNode, pdaSeedValueNode, pdaValueNode, publicKeyTypeNode, SYSTEM_PROGRAM_VALUE_NODE, + setAccountDiscriminatorFromFieldVisitor, setInstructionAccountDefaultValuesVisitor, stringTypeNode, updateAccountsVisitor, @@ -258,6 +261,154 @@ export default defineConfig({ ]), }, ]), + setAccountDiscriminatorFromFieldVisitor({ + // Realm accounts + realmV1: { + field: "accountType", + value: enumValueNode( + definedTypeLinkNode("governanceAccountType"), + "RealmV1", + ), + }, + realmV2: { + field: "accountType", + value: enumValueNode( + definedTypeLinkNode("governanceAccountType"), + "RealmV2", + ), + }, + realmConfigAccount: { + field: "accountType", + value: enumValueNode( + definedTypeLinkNode("governanceAccountType"), + "RealmConfig", + ), + }, + + // Governance accounts + governanceV1: { + field: "accountType", + value: enumValueNode( + definedTypeLinkNode("governanceAccountType"), + "GovernanceV1", + ), + }, + governanceV2: { + field: "accountType", + value: enumValueNode( + definedTypeLinkNode("governanceAccountType"), + "GovernanceV2", + ), + }, + + // Token Owner Record accounts + tokenOwnerRecordV1: { + field: "accountType", + value: enumValueNode( + definedTypeLinkNode("governanceAccountType"), + "TokenOwnerRecordV1", + ), + }, + tokenOwnerRecordV2: { + field: "accountType", + value: enumValueNode( + definedTypeLinkNode("governanceAccountType"), + "TokenOwnerRecordV2", + ), + }, + legacyTokenOwnerRecord: { + field: "accountType", + value: enumValueNode( + definedTypeLinkNode("governanceAccountType"), + "TokenOwnerRecordV1", + ), + }, + + // Proposal accounts + proposalV1: { + field: "accountType", + value: enumValueNode( + definedTypeLinkNode("governanceAccountType"), + "ProposalV1", + ), + }, + proposalV2: { + field: "accountType", + value: enumValueNode( + definedTypeLinkNode("governanceAccountType"), + "ProposalV2", + ), + }, + proposalDeposit: { + field: "accountType", + value: enumValueNode( + definedTypeLinkNode("governanceAccountType"), + "ProposalDeposit", + ), + }, + proposalInstructionV1: { + field: "accountType", + value: enumValueNode( + definedTypeLinkNode("governanceAccountType"), + "ProposalInstructionV1", + ), + }, + proposalTransactionV2: { + field: "accountType", + value: enumValueNode( + definedTypeLinkNode("governanceAccountType"), + "ProposalTransactionV2", + ), + }, + + // Signatory Record accounts + signatoryRecordV1: { + field: "accountType", + value: enumValueNode( + definedTypeLinkNode("governanceAccountType"), + "SignatoryRecordV1", + ), + }, + signatoryRecordV2: { + field: "accountType", + value: enumValueNode( + definedTypeLinkNode("governanceAccountType"), + "SignatoryRecordV2", + ), + }, + requiredSignatory: { + field: "accountType", + value: enumValueNode( + definedTypeLinkNode("governanceAccountType"), + "RequiredSignatory", + ), + }, + + // Vote Record accounts + voteRecordV1: { + field: "accountType", + value: enumValueNode( + definedTypeLinkNode("governanceAccountType"), + "VoteRecordV1", + ), + }, + voteRecordV2: { + field: "accountType", + value: enumValueNode( + definedTypeLinkNode("governanceAccountType"), + "VoteRecordV2", + ), + }, + + // Program Metadata + programMetadata: { + field: "accountType", + value: enumValueNode( + definedTypeLinkNode("governanceAccountType"), + "ProgramMetadata", + ), + }, + }), addCustomPDAsVisitor, ], }); diff --git a/clients/spl-governance/src/generated/accounts/governanceV1.ts b/clients/spl-governance/src/generated/accounts/governanceV1.ts index f9b05714..de6d2e47 100644 --- a/clients/spl-governance/src/generated/accounts/governanceV1.ts +++ b/clients/spl-governance/src/generated/accounts/governanceV1.ts @@ -19,12 +19,7 @@ import type { MaybeEncodedAccount, } from "@solana/kit"; import type { GovernanceSeeds } from "../pdas/index.js"; -import type { - GovernanceAccountType, - GovernanceAccountTypeArgs, - GovernanceConfig, - GovernanceConfigArgs, -} from "../types/index.js"; +import type { GovernanceConfig, GovernanceConfigArgs } from "../types/index.js"; import { assertAccountExists, assertAccountsExist, @@ -38,15 +33,23 @@ import { getStructEncoder, getU32Decoder, getU32Encoder, + transformEncoder, } from "@solana/kit"; import { findGovernancePda } from "../pdas/index.js"; import { + GovernanceAccountType, getGovernanceAccountTypeDecoder, getGovernanceAccountTypeEncoder, getGovernanceConfigDecoder, getGovernanceConfigEncoder, } from "../types/index.js"; +export const GOVERNANCE_V1_ACCOUNT_TYPE = GovernanceAccountType.GovernanceV1; + +export function getGovernanceV1AccountTypeBytes() { + return getGovernanceAccountTypeEncoder().encode(GOVERNANCE_V1_ACCOUNT_TYPE); +} + export interface GovernanceV1 { accountType: GovernanceAccountType; realm: Address; @@ -56,7 +59,6 @@ export interface GovernanceV1 { } export interface GovernanceV1Args { - accountType: GovernanceAccountTypeArgs; realm: Address; governedAccount: Address; proposalsCount: number; @@ -64,13 +66,16 @@ export interface GovernanceV1Args { } export function getGovernanceV1Encoder(): Encoder { - return getStructEncoder([ - ["accountType", getGovernanceAccountTypeEncoder()], - ["realm", getAddressEncoder()], - ["governedAccount", getAddressEncoder()], - ["proposalsCount", getU32Encoder()], - ["config", getGovernanceConfigEncoder()], - ]); + return transformEncoder( + getStructEncoder([ + ["accountType", getGovernanceAccountTypeEncoder()], + ["realm", getAddressEncoder()], + ["governedAccount", getAddressEncoder()], + ["proposalsCount", getU32Encoder()], + ["config", getGovernanceConfigEncoder()], + ]), + (value) => ({ ...value, accountType: GOVERNANCE_V1_ACCOUNT_TYPE }), + ); } export function getGovernanceV1Decoder(): Decoder { diff --git a/clients/spl-governance/src/generated/accounts/governanceV2.ts b/clients/spl-governance/src/generated/accounts/governanceV2.ts index 12a4c777..4037b633 100644 --- a/clients/spl-governance/src/generated/accounts/governanceV2.ts +++ b/clients/spl-governance/src/generated/accounts/governanceV2.ts @@ -20,8 +20,6 @@ import type { } from "@solana/kit"; import type { GovernanceSeeds } from "../pdas/index.js"; import type { - GovernanceAccountType, - GovernanceAccountTypeArgs, GovernanceConfig, GovernanceConfigArgs, Reserved119, @@ -44,9 +42,11 @@ import { getU32Encoder, getU64Decoder, getU64Encoder, + transformEncoder, } from "@solana/kit"; import { findGovernancePda } from "../pdas/index.js"; import { + GovernanceAccountType, getGovernanceAccountTypeDecoder, getGovernanceAccountTypeEncoder, getGovernanceConfigDecoder, @@ -55,6 +55,12 @@ import { getReserved119Encoder, } from "../types/index.js"; +export const GOVERNANCE_V2_ACCOUNT_TYPE = GovernanceAccountType.GovernanceV2; + +export function getGovernanceV2AccountTypeBytes() { + return getGovernanceAccountTypeEncoder().encode(GOVERNANCE_V2_ACCOUNT_TYPE); +} + export interface GovernanceV2 { accountType: GovernanceAccountType; realm: Address; @@ -67,7 +73,6 @@ export interface GovernanceV2 { } export interface GovernanceV2Args { - accountType: GovernanceAccountTypeArgs; realm: Address; governedAccount: Address; reserved1: number; @@ -78,16 +83,19 @@ export interface GovernanceV2Args { } export function getGovernanceV2Encoder(): Encoder { - return getStructEncoder([ - ["accountType", getGovernanceAccountTypeEncoder()], - ["realm", getAddressEncoder()], - ["governedAccount", getAddressEncoder()], - ["reserved1", getU32Encoder()], - ["config", getGovernanceConfigEncoder()], - ["reservedV2", getReserved119Encoder()], - ["requiredSignatoriesCount", getU8Encoder()], - ["activeProposalCount", getU64Encoder()], - ]); + return transformEncoder( + getStructEncoder([ + ["accountType", getGovernanceAccountTypeEncoder()], + ["realm", getAddressEncoder()], + ["governedAccount", getAddressEncoder()], + ["reserved1", getU32Encoder()], + ["config", getGovernanceConfigEncoder()], + ["reservedV2", getReserved119Encoder()], + ["requiredSignatoriesCount", getU8Encoder()], + ["activeProposalCount", getU64Encoder()], + ]), + (value) => ({ ...value, accountType: GOVERNANCE_V2_ACCOUNT_TYPE }), + ); } export function getGovernanceV2Decoder(): Decoder { diff --git a/clients/spl-governance/src/generated/accounts/legacyTokenOwnerRecord.ts b/clients/spl-governance/src/generated/accounts/legacyTokenOwnerRecord.ts index 162f1b5d..0a0107e8 100644 --- a/clients/spl-governance/src/generated/accounts/legacyTokenOwnerRecord.ts +++ b/clients/spl-governance/src/generated/accounts/legacyTokenOwnerRecord.ts @@ -21,10 +21,6 @@ import type { OptionOrNullable, } from "@solana/kit"; import type { TokenOwnerRecordSeeds } from "../pdas/index.js"; -import type { - GovernanceAccountType, - GovernanceAccountTypeArgs, -} from "../types/index.js"; import { assertAccountExists, assertAccountsExist, @@ -46,13 +42,24 @@ import { getU32Encoder, getU64Decoder, getU64Encoder, + transformEncoder, } from "@solana/kit"; import { findTokenOwnerRecordPda } from "../pdas/index.js"; import { + GovernanceAccountType, getGovernanceAccountTypeDecoder, getGovernanceAccountTypeEncoder, } from "../types/index.js"; +export const LEGACY_TOKEN_OWNER_RECORD_ACCOUNT_TYPE = + GovernanceAccountType.TokenOwnerRecordV1; + +export function getLegacyTokenOwnerRecordAccountTypeBytes() { + return getGovernanceAccountTypeEncoder().encode( + LEGACY_TOKEN_OWNER_RECORD_ACCOUNT_TYPE, + ); +} + export interface LegacyTokenOwnerRecord { accountType: GovernanceAccountType; realm: Address; @@ -68,7 +75,6 @@ export interface LegacyTokenOwnerRecord { } export interface LegacyTokenOwnerRecordArgs { - accountType: GovernanceAccountTypeArgs; realm: Address; governingTokenMint: Address; governingTokenOwner: Address; @@ -82,19 +88,25 @@ export interface LegacyTokenOwnerRecordArgs { } export function getLegacyTokenOwnerRecordEncoder(): Encoder { - return getStructEncoder([ - ["accountType", getGovernanceAccountTypeEncoder()], - ["realm", getAddressEncoder()], - ["governingTokenMint", getAddressEncoder()], - ["governingTokenOwner", getAddressEncoder()], - ["governingTokenDepositAmount", getU64Encoder()], - ["unrelinquishedVotesCount", getU32Encoder()], - ["totalVotesCount", getU32Encoder()], - ["outstandingProposalCount", getU8Encoder()], - ["reserved", getArrayEncoder(getU8Encoder(), { size: 7 })], - ["governanceDelegate", getOptionEncoder(getAddressEncoder())], - ["reservedV2", getArrayEncoder(getU8Encoder(), { size: 128 })], - ]); + return transformEncoder( + getStructEncoder([ + ["accountType", getGovernanceAccountTypeEncoder()], + ["realm", getAddressEncoder()], + ["governingTokenMint", getAddressEncoder()], + ["governingTokenOwner", getAddressEncoder()], + ["governingTokenDepositAmount", getU64Encoder()], + ["unrelinquishedVotesCount", getU32Encoder()], + ["totalVotesCount", getU32Encoder()], + ["outstandingProposalCount", getU8Encoder()], + ["reserved", getArrayEncoder(getU8Encoder(), { size: 7 })], + ["governanceDelegate", getOptionEncoder(getAddressEncoder())], + ["reservedV2", getArrayEncoder(getU8Encoder(), { size: 128 })], + ]), + (value) => ({ + ...value, + accountType: LEGACY_TOKEN_OWNER_RECORD_ACCOUNT_TYPE, + }), + ); } export function getLegacyTokenOwnerRecordDecoder(): Decoder { diff --git a/clients/spl-governance/src/generated/accounts/programMetadata.ts b/clients/spl-governance/src/generated/accounts/programMetadata.ts index eae907db..6e623625 100644 --- a/clients/spl-governance/src/generated/accounts/programMetadata.ts +++ b/clients/spl-governance/src/generated/accounts/programMetadata.ts @@ -18,12 +18,7 @@ import type { MaybeAccount, MaybeEncodedAccount, } from "@solana/kit"; -import type { - GovernanceAccountType, - GovernanceAccountTypeArgs, - Slot, - SlotArgs, -} from "../types/index.js"; +import type { Slot, SlotArgs } from "../types/index.js"; import { addDecoderSizePrefix, addEncoderSizePrefix, @@ -43,14 +38,25 @@ import { getU32Encoder, getUtf8Decoder, getUtf8Encoder, + transformEncoder, } from "@solana/kit"; import { + GovernanceAccountType, getGovernanceAccountTypeDecoder, getGovernanceAccountTypeEncoder, getSlotDecoder, getSlotEncoder, } from "../types/index.js"; +export const PROGRAM_METADATA_ACCOUNT_TYPE = + GovernanceAccountType.ProgramMetadata; + +export function getProgramMetadataAccountTypeBytes() { + return getGovernanceAccountTypeEncoder().encode( + PROGRAM_METADATA_ACCOUNT_TYPE, + ); +} + export interface ProgramMetadata { accountType: GovernanceAccountType; updatedAt: Slot; @@ -59,19 +65,21 @@ export interface ProgramMetadata { } export interface ProgramMetadataArgs { - accountType: GovernanceAccountTypeArgs; updatedAt: SlotArgs; version: string; reserved: number[]; } export function getProgramMetadataEncoder(): Encoder { - return getStructEncoder([ - ["accountType", getGovernanceAccountTypeEncoder()], - ["updatedAt", getSlotEncoder()], - ["version", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], - ["reserved", getArrayEncoder(getU8Encoder(), { size: 64 })], - ]); + return transformEncoder( + getStructEncoder([ + ["accountType", getGovernanceAccountTypeEncoder()], + ["updatedAt", getSlotEncoder()], + ["version", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], + ["reserved", getArrayEncoder(getU8Encoder(), { size: 64 })], + ]), + (value) => ({ ...value, accountType: PROGRAM_METADATA_ACCOUNT_TYPE }), + ); } export function getProgramMetadataDecoder(): Decoder { diff --git a/clients/spl-governance/src/generated/accounts/proposalDeposit.ts b/clients/spl-governance/src/generated/accounts/proposalDeposit.ts index f35d14fe..c7744f49 100644 --- a/clients/spl-governance/src/generated/accounts/proposalDeposit.ts +++ b/clients/spl-governance/src/generated/accounts/proposalDeposit.ts @@ -19,10 +19,6 @@ import type { MaybeEncodedAccount, } from "@solana/kit"; import type { ProposalDepositSeeds } from "../pdas/index.js"; -import type { - GovernanceAccountType, - GovernanceAccountTypeArgs, -} from "../types/index.js"; import { assertAccountExists, assertAccountsExist, @@ -38,13 +34,24 @@ import { getStructEncoder, getU8Decoder, getU8Encoder, + transformEncoder, } from "@solana/kit"; import { findProposalDepositPda } from "../pdas/index.js"; import { + GovernanceAccountType, getGovernanceAccountTypeDecoder, getGovernanceAccountTypeEncoder, } from "../types/index.js"; +export const PROPOSAL_DEPOSIT_ACCOUNT_TYPE = + GovernanceAccountType.ProposalDeposit; + +export function getProposalDepositAccountTypeBytes() { + return getGovernanceAccountTypeEncoder().encode( + PROPOSAL_DEPOSIT_ACCOUNT_TYPE, + ); +} + export interface ProposalDeposit { accountType: GovernanceAccountType; proposal: Address; @@ -53,19 +60,21 @@ export interface ProposalDeposit { } export interface ProposalDepositArgs { - accountType: GovernanceAccountTypeArgs; proposal: Address; depositPayer: Address; reserved: number[]; } export function getProposalDepositEncoder(): FixedSizeEncoder { - return getStructEncoder([ - ["accountType", getGovernanceAccountTypeEncoder()], - ["proposal", getAddressEncoder()], - ["depositPayer", getAddressEncoder()], - ["reserved", getArrayEncoder(getU8Encoder(), { size: 64 })], - ]); + return transformEncoder( + getStructEncoder([ + ["accountType", getGovernanceAccountTypeEncoder()], + ["proposal", getAddressEncoder()], + ["depositPayer", getAddressEncoder()], + ["reserved", getArrayEncoder(getU8Encoder(), { size: 64 })], + ]), + (value) => ({ ...value, accountType: PROPOSAL_DEPOSIT_ACCOUNT_TYPE }), + ); } export function getProposalDepositDecoder(): FixedSizeDecoder { diff --git a/clients/spl-governance/src/generated/accounts/proposalInstructionV1.ts b/clients/spl-governance/src/generated/accounts/proposalInstructionV1.ts index aedadead..49dafd18 100644 --- a/clients/spl-governance/src/generated/accounts/proposalInstructionV1.ts +++ b/clients/spl-governance/src/generated/accounts/proposalInstructionV1.ts @@ -22,8 +22,6 @@ import type { } from "@solana/kit"; import type { ProposalTransactionSeeds } from "../pdas/index.js"; import type { - GovernanceAccountType, - GovernanceAccountTypeArgs, InstructionData, InstructionDataArgs, TransactionExecutionStatus, @@ -48,9 +46,11 @@ import { getU16Encoder, getU32Decoder, getU32Encoder, + transformEncoder, } from "@solana/kit"; import { findProposalTransactionPda } from "../pdas/index.js"; import { + GovernanceAccountType, getGovernanceAccountTypeDecoder, getGovernanceAccountTypeEncoder, getInstructionDataDecoder, @@ -61,6 +61,15 @@ import { getUnixTimestampEncoder, } from "../types/index.js"; +export const PROPOSAL_INSTRUCTION_V1_ACCOUNT_TYPE = + GovernanceAccountType.ProposalInstructionV1; + +export function getProposalInstructionV1AccountTypeBytes() { + return getGovernanceAccountTypeEncoder().encode( + PROPOSAL_INSTRUCTION_V1_ACCOUNT_TYPE, + ); +} + export interface ProposalInstructionV1 { accountType: GovernanceAccountType; proposal: Address; @@ -72,7 +81,6 @@ export interface ProposalInstructionV1 { } export interface ProposalInstructionV1Args { - accountType: GovernanceAccountTypeArgs; proposal: Address; instructionIndex: number; holdUpTime: number; @@ -82,15 +90,21 @@ export interface ProposalInstructionV1Args { } export function getProposalInstructionV1Encoder(): Encoder { - return getStructEncoder([ - ["accountType", getGovernanceAccountTypeEncoder()], - ["proposal", getAddressEncoder()], - ["instructionIndex", getU16Encoder()], - ["holdUpTime", getU32Encoder()], - ["instruction", getInstructionDataEncoder()], - ["executedAt", getOptionEncoder(getUnixTimestampEncoder())], - ["executionStatus", getTransactionExecutionStatusEncoder()], - ]); + return transformEncoder( + getStructEncoder([ + ["accountType", getGovernanceAccountTypeEncoder()], + ["proposal", getAddressEncoder()], + ["instructionIndex", getU16Encoder()], + ["holdUpTime", getU32Encoder()], + ["instruction", getInstructionDataEncoder()], + ["executedAt", getOptionEncoder(getUnixTimestampEncoder())], + ["executionStatus", getTransactionExecutionStatusEncoder()], + ]), + (value) => ({ + ...value, + accountType: PROPOSAL_INSTRUCTION_V1_ACCOUNT_TYPE, + }), + ); } export function getProposalInstructionV1Decoder(): Decoder { diff --git a/clients/spl-governance/src/generated/accounts/proposalTransactionV2.ts b/clients/spl-governance/src/generated/accounts/proposalTransactionV2.ts index 8fa72f37..2e14f1fb 100644 --- a/clients/spl-governance/src/generated/accounts/proposalTransactionV2.ts +++ b/clients/spl-governance/src/generated/accounts/proposalTransactionV2.ts @@ -22,8 +22,6 @@ import type { } from "@solana/kit"; import type { ProposalTransactionSeeds } from "../pdas/index.js"; import type { - GovernanceAccountType, - GovernanceAccountTypeArgs, InstructionData, InstructionDataArgs, TransactionExecutionStatus, @@ -52,9 +50,11 @@ import { getU16Encoder, getU32Decoder, getU32Encoder, + transformEncoder, } from "@solana/kit"; import { findProposalTransactionPda } from "../pdas/index.js"; import { + GovernanceAccountType, getGovernanceAccountTypeDecoder, getGovernanceAccountTypeEncoder, getInstructionDataDecoder, @@ -65,6 +65,15 @@ import { getUnixTimestampEncoder, } from "../types/index.js"; +export const PROPOSAL_TRANSACTION_V2_ACCOUNT_TYPE = + GovernanceAccountType.ProposalTransactionV2; + +export function getProposalTransactionV2AccountTypeBytes() { + return getGovernanceAccountTypeEncoder().encode( + PROPOSAL_TRANSACTION_V2_ACCOUNT_TYPE, + ); +} + export interface ProposalTransactionV2 { accountType: GovernanceAccountType; proposal: Address; @@ -78,7 +87,6 @@ export interface ProposalTransactionV2 { } export interface ProposalTransactionV2Args { - accountType: GovernanceAccountTypeArgs; proposal: Address; optionIndex: number; transactionIndex: number; @@ -90,17 +98,23 @@ export interface ProposalTransactionV2Args { } export function getProposalTransactionV2Encoder(): Encoder { - return getStructEncoder([ - ["accountType", getGovernanceAccountTypeEncoder()], - ["proposal", getAddressEncoder()], - ["optionIndex", getU8Encoder()], - ["transactionIndex", getU16Encoder()], - ["holdUpTime", getU32Encoder()], - ["instructions", getArrayEncoder(getInstructionDataEncoder())], - ["executedAt", getOptionEncoder(getUnixTimestampEncoder())], - ["executionStatus", getTransactionExecutionStatusEncoder()], - ["reservedV2", getArrayEncoder(getU8Encoder(), { size: 8 })], - ]); + return transformEncoder( + getStructEncoder([ + ["accountType", getGovernanceAccountTypeEncoder()], + ["proposal", getAddressEncoder()], + ["optionIndex", getU8Encoder()], + ["transactionIndex", getU16Encoder()], + ["holdUpTime", getU32Encoder()], + ["instructions", getArrayEncoder(getInstructionDataEncoder())], + ["executedAt", getOptionEncoder(getUnixTimestampEncoder())], + ["executionStatus", getTransactionExecutionStatusEncoder()], + ["reservedV2", getArrayEncoder(getU8Encoder(), { size: 8 })], + ]), + (value) => ({ + ...value, + accountType: PROPOSAL_TRANSACTION_V2_ACCOUNT_TYPE, + }), + ); } export function getProposalTransactionV2Decoder(): Decoder { diff --git a/clients/spl-governance/src/generated/accounts/proposalV1.ts b/clients/spl-governance/src/generated/accounts/proposalV1.ts index a8dc1c99..b708446a 100644 --- a/clients/spl-governance/src/generated/accounts/proposalV1.ts +++ b/clients/spl-governance/src/generated/accounts/proposalV1.ts @@ -22,8 +22,6 @@ import type { } from "@solana/kit"; import type { ProposalSeeds } from "../pdas/index.js"; import type { - GovernanceAccountType, - GovernanceAccountTypeArgs, InstructionExecutionFlags, InstructionExecutionFlagsArgs, ProposalState, @@ -60,9 +58,11 @@ import { getU64Encoder, getUtf8Decoder, getUtf8Encoder, + transformEncoder, } from "@solana/kit"; import { findProposalPda } from "../pdas/index.js"; import { + GovernanceAccountType, getGovernanceAccountTypeDecoder, getGovernanceAccountTypeEncoder, getInstructionExecutionFlagsDecoder, @@ -77,6 +77,12 @@ import { getVoteThresholdEncoder, } from "../types/index.js"; +export const PROPOSAL_V1_ACCOUNT_TYPE = GovernanceAccountType.ProposalV1; + +export function getProposalV1AccountTypeBytes() { + return getGovernanceAccountTypeEncoder().encode(PROPOSAL_V1_ACCOUNT_TYPE); +} + export interface ProposalV1 { accountType: GovernanceAccountType; governance: Address; @@ -105,7 +111,6 @@ export interface ProposalV1 { } export interface ProposalV1Args { - accountType: GovernanceAccountTypeArgs; governance: Address; governingTokenMint: Address; state: ProposalStateArgs; @@ -132,35 +137,38 @@ export interface ProposalV1Args { } export function getProposalV1Encoder(): Encoder { - return getStructEncoder([ - ["accountType", getGovernanceAccountTypeEncoder()], - ["governance", getAddressEncoder()], - ["governingTokenMint", getAddressEncoder()], - ["state", getProposalStateEncoder()], - ["tokenOwnerRecord", getAddressEncoder()], - ["signatoriesCount", getU8Encoder()], - ["signatoriesSignedOffCount", getU8Encoder()], - ["yesVotesCount", getU64Encoder()], - ["noVotesCount", getU64Encoder()], - ["instructionsExecutedCount", getU16Encoder()], - ["instructionsCount", getU16Encoder()], - ["instructionsNextIndex", getU16Encoder()], - ["draftAt", getUnixTimestampEncoder()], - ["signingOffAt", getOptionEncoder(getUnixTimestampEncoder())], - ["votingAt", getOptionEncoder(getUnixTimestampEncoder())], - ["votingAtSlot", getOptionEncoder(getSlotEncoder())], - ["votingCompletedAt", getOptionEncoder(getUnixTimestampEncoder())], - ["executingAt", getOptionEncoder(getUnixTimestampEncoder())], - ["closedAt", getOptionEncoder(getUnixTimestampEncoder())], - ["executionFlags", getInstructionExecutionFlagsEncoder()], - ["maxVoteWeight", getOptionEncoder(getU64Encoder())], - ["voteThreshold", getOptionEncoder(getVoteThresholdEncoder())], - ["name", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], - [ - "descriptionLink", - addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder()), - ], - ]); + return transformEncoder( + getStructEncoder([ + ["accountType", getGovernanceAccountTypeEncoder()], + ["governance", getAddressEncoder()], + ["governingTokenMint", getAddressEncoder()], + ["state", getProposalStateEncoder()], + ["tokenOwnerRecord", getAddressEncoder()], + ["signatoriesCount", getU8Encoder()], + ["signatoriesSignedOffCount", getU8Encoder()], + ["yesVotesCount", getU64Encoder()], + ["noVotesCount", getU64Encoder()], + ["instructionsExecutedCount", getU16Encoder()], + ["instructionsCount", getU16Encoder()], + ["instructionsNextIndex", getU16Encoder()], + ["draftAt", getUnixTimestampEncoder()], + ["signingOffAt", getOptionEncoder(getUnixTimestampEncoder())], + ["votingAt", getOptionEncoder(getUnixTimestampEncoder())], + ["votingAtSlot", getOptionEncoder(getSlotEncoder())], + ["votingCompletedAt", getOptionEncoder(getUnixTimestampEncoder())], + ["executingAt", getOptionEncoder(getUnixTimestampEncoder())], + ["closedAt", getOptionEncoder(getUnixTimestampEncoder())], + ["executionFlags", getInstructionExecutionFlagsEncoder()], + ["maxVoteWeight", getOptionEncoder(getU64Encoder())], + ["voteThreshold", getOptionEncoder(getVoteThresholdEncoder())], + ["name", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], + [ + "descriptionLink", + addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder()), + ], + ]), + (value) => ({ ...value, accountType: PROPOSAL_V1_ACCOUNT_TYPE }), + ); } export function getProposalV1Decoder(): Decoder { diff --git a/clients/spl-governance/src/generated/accounts/proposalV2.ts b/clients/spl-governance/src/generated/accounts/proposalV2.ts index 2f9eaa7c..2ee5dd0a 100644 --- a/clients/spl-governance/src/generated/accounts/proposalV2.ts +++ b/clients/spl-governance/src/generated/accounts/proposalV2.ts @@ -22,8 +22,6 @@ import type { } from "@solana/kit"; import type { ProposalSeeds } from "../pdas/index.js"; import type { - GovernanceAccountType, - GovernanceAccountTypeArgs, InstructionExecutionFlags, InstructionExecutionFlagsArgs, ProposalOption, @@ -64,9 +62,11 @@ import { getU64Encoder, getUtf8Decoder, getUtf8Encoder, + transformEncoder, } from "@solana/kit"; import { findProposalPda } from "../pdas/index.js"; import { + GovernanceAccountType, getGovernanceAccountTypeDecoder, getGovernanceAccountTypeEncoder, getInstructionExecutionFlagsDecoder, @@ -85,6 +85,12 @@ import { getVoteTypeEncoder, } from "../types/index.js"; +export const PROPOSAL_V2_ACCOUNT_TYPE = GovernanceAccountType.ProposalV2; + +export function getProposalV2AccountTypeBytes() { + return getGovernanceAccountTypeEncoder().encode(PROPOSAL_V2_ACCOUNT_TYPE); +} + export interface ProposalV2 { accountType: GovernanceAccountType; governance: Address; @@ -117,7 +123,6 @@ export interface ProposalV2 { } export interface ProposalV2Args { - accountType: GovernanceAccountTypeArgs; governance: Address; governingTokenMint: Address; state: ProposalStateArgs; @@ -148,39 +153,42 @@ export interface ProposalV2Args { } export function getProposalV2Encoder(): Encoder { - return getStructEncoder([ - ["accountType", getGovernanceAccountTypeEncoder()], - ["governance", getAddressEncoder()], - ["governingTokenMint", getAddressEncoder()], - ["state", getProposalStateEncoder()], - ["tokenOwnerRecord", getAddressEncoder()], - ["signatoriesCount", getU8Encoder()], - ["signatoriesSignedOffCount", getU8Encoder()], - ["voteType", getVoteTypeEncoder()], - ["options", getArrayEncoder(getProposalOptionEncoder())], - ["denyVoteWeight", getOptionEncoder(getU64Encoder())], - ["reserved1", getU8Encoder()], - ["abstainVoteWeight", getOptionEncoder(getU64Encoder())], - ["startVotingAt", getOptionEncoder(getUnixTimestampEncoder())], - ["draftAt", getUnixTimestampEncoder()], - ["signingOffAt", getOptionEncoder(getUnixTimestampEncoder())], - ["votingAt", getOptionEncoder(getUnixTimestampEncoder())], - ["votingAtSlot", getOptionEncoder(getSlotEncoder())], - ["votingCompletedAt", getOptionEncoder(getUnixTimestampEncoder())], - ["executingAt", getOptionEncoder(getUnixTimestampEncoder())], - ["closedAt", getOptionEncoder(getUnixTimestampEncoder())], - ["executionFlags", getInstructionExecutionFlagsEncoder()], - ["maxVoteWeight", getOptionEncoder(getU64Encoder())], - ["maxVotingTime", getOptionEncoder(getU32Encoder())], - ["voteThreshold", getOptionEncoder(getVoteThresholdEncoder())], - ["reserved", getArrayEncoder(getU8Encoder(), { size: 64 })], - ["name", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], - [ - "descriptionLink", - addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder()), - ], - ["vetoVoteWeight", getU64Encoder()], - ]); + return transformEncoder( + getStructEncoder([ + ["accountType", getGovernanceAccountTypeEncoder()], + ["governance", getAddressEncoder()], + ["governingTokenMint", getAddressEncoder()], + ["state", getProposalStateEncoder()], + ["tokenOwnerRecord", getAddressEncoder()], + ["signatoriesCount", getU8Encoder()], + ["signatoriesSignedOffCount", getU8Encoder()], + ["voteType", getVoteTypeEncoder()], + ["options", getArrayEncoder(getProposalOptionEncoder())], + ["denyVoteWeight", getOptionEncoder(getU64Encoder())], + ["reserved1", getU8Encoder()], + ["abstainVoteWeight", getOptionEncoder(getU64Encoder())], + ["startVotingAt", getOptionEncoder(getUnixTimestampEncoder())], + ["draftAt", getUnixTimestampEncoder()], + ["signingOffAt", getOptionEncoder(getUnixTimestampEncoder())], + ["votingAt", getOptionEncoder(getUnixTimestampEncoder())], + ["votingAtSlot", getOptionEncoder(getSlotEncoder())], + ["votingCompletedAt", getOptionEncoder(getUnixTimestampEncoder())], + ["executingAt", getOptionEncoder(getUnixTimestampEncoder())], + ["closedAt", getOptionEncoder(getUnixTimestampEncoder())], + ["executionFlags", getInstructionExecutionFlagsEncoder()], + ["maxVoteWeight", getOptionEncoder(getU64Encoder())], + ["maxVotingTime", getOptionEncoder(getU32Encoder())], + ["voteThreshold", getOptionEncoder(getVoteThresholdEncoder())], + ["reserved", getArrayEncoder(getU8Encoder(), { size: 64 })], + ["name", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], + [ + "descriptionLink", + addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder()), + ], + ["vetoVoteWeight", getU64Encoder()], + ]), + (value) => ({ ...value, accountType: PROPOSAL_V2_ACCOUNT_TYPE }), + ); } export function getProposalV2Decoder(): Decoder { diff --git a/clients/spl-governance/src/generated/accounts/realmConfigAccount.ts b/clients/spl-governance/src/generated/accounts/realmConfigAccount.ts index 3ab6c093..4ae55394 100644 --- a/clients/spl-governance/src/generated/accounts/realmConfigAccount.ts +++ b/clients/spl-governance/src/generated/accounts/realmConfigAccount.ts @@ -20,8 +20,6 @@ import type { } from "@solana/kit"; import type { RealmConfigSeeds } from "../pdas/index.js"; import type { - GovernanceAccountType, - GovernanceAccountTypeArgs, GoverningTokenConfig, GoverningTokenConfigArgs, Reserved110, @@ -38,9 +36,11 @@ import { getAddressEncoder, getStructDecoder, getStructEncoder, + transformEncoder, } from "@solana/kit"; import { findRealmConfigPda } from "../pdas/index.js"; import { + GovernanceAccountType, getGovernanceAccountTypeDecoder, getGovernanceAccountTypeEncoder, getGoverningTokenConfigDecoder, @@ -49,6 +49,15 @@ import { getReserved110Encoder, } from "../types/index.js"; +export const REALM_CONFIG_ACCOUNT_ACCOUNT_TYPE = + GovernanceAccountType.RealmConfig; + +export function getRealmConfigAccountAccountTypeBytes() { + return getGovernanceAccountTypeEncoder().encode( + REALM_CONFIG_ACCOUNT_ACCOUNT_TYPE, + ); +} + export interface RealmConfigAccount { accountType: GovernanceAccountType; realm: Address; @@ -58,7 +67,6 @@ export interface RealmConfigAccount { } export interface RealmConfigAccountArgs { - accountType: GovernanceAccountTypeArgs; realm: Address; communityTokenConfig: GoverningTokenConfigArgs; councilTokenConfig: GoverningTokenConfigArgs; @@ -66,13 +74,16 @@ export interface RealmConfigAccountArgs { } export function getRealmConfigAccountEncoder(): Encoder { - return getStructEncoder([ - ["accountType", getGovernanceAccountTypeEncoder()], - ["realm", getAddressEncoder()], - ["communityTokenConfig", getGoverningTokenConfigEncoder()], - ["councilTokenConfig", getGoverningTokenConfigEncoder()], - ["reserved", getReserved110Encoder()], - ]); + return transformEncoder( + getStructEncoder([ + ["accountType", getGovernanceAccountTypeEncoder()], + ["realm", getAddressEncoder()], + ["communityTokenConfig", getGoverningTokenConfigEncoder()], + ["councilTokenConfig", getGoverningTokenConfigEncoder()], + ["reserved", getReserved110Encoder()], + ]), + (value) => ({ ...value, accountType: REALM_CONFIG_ACCOUNT_ACCOUNT_TYPE }), + ); } export function getRealmConfigAccountDecoder(): Decoder { diff --git a/clients/spl-governance/src/generated/accounts/realmV1.ts b/clients/spl-governance/src/generated/accounts/realmV1.ts index 5fb43f55..1539b311 100644 --- a/clients/spl-governance/src/generated/accounts/realmV1.ts +++ b/clients/spl-governance/src/generated/accounts/realmV1.ts @@ -21,12 +21,7 @@ import type { OptionOrNullable, } from "@solana/kit"; import type { RealmSeeds } from "../pdas/index.js"; -import type { - GovernanceAccountType, - GovernanceAccountTypeArgs, - RealmConfig, - RealmConfigArgs, -} from "../types/index.js"; +import type { RealmConfig, RealmConfigArgs } from "../types/index.js"; import { addDecoderSizePrefix, addEncoderSizePrefix, @@ -52,15 +47,23 @@ import { getU32Encoder, getUtf8Decoder, getUtf8Encoder, + transformEncoder, } from "@solana/kit"; import { findRealmPda } from "../pdas/index.js"; import { + GovernanceAccountType, getGovernanceAccountTypeDecoder, getGovernanceAccountTypeEncoder, getRealmConfigDecoder, getRealmConfigEncoder, } from "../types/index.js"; +export const REALM_V1_ACCOUNT_TYPE = GovernanceAccountType.RealmV1; + +export function getRealmV1AccountTypeBytes() { + return getGovernanceAccountTypeEncoder().encode(REALM_V1_ACCOUNT_TYPE); +} + export interface RealmV1 { accountType: GovernanceAccountType; communityMint: Address; @@ -72,7 +75,6 @@ export interface RealmV1 { } export interface RealmV1Args { - accountType: GovernanceAccountTypeArgs; communityMint: Address; config: RealmConfigArgs; reserved: number[]; @@ -82,15 +84,18 @@ export interface RealmV1Args { } export function getRealmV1Encoder(): Encoder { - return getStructEncoder([ - ["accountType", getGovernanceAccountTypeEncoder()], - ["communityMint", getAddressEncoder()], - ["config", getRealmConfigEncoder()], - ["reserved", getArrayEncoder(getU8Encoder(), { size: 6 })], - ["votingProposalCount", getU16Encoder()], - ["authority", getOptionEncoder(getAddressEncoder())], - ["name", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], - ]); + return transformEncoder( + getStructEncoder([ + ["accountType", getGovernanceAccountTypeEncoder()], + ["communityMint", getAddressEncoder()], + ["config", getRealmConfigEncoder()], + ["reserved", getArrayEncoder(getU8Encoder(), { size: 6 })], + ["votingProposalCount", getU16Encoder()], + ["authority", getOptionEncoder(getAddressEncoder())], + ["name", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], + ]), + (value) => ({ ...value, accountType: REALM_V1_ACCOUNT_TYPE }), + ); } export function getRealmV1Decoder(): Decoder { diff --git a/clients/spl-governance/src/generated/accounts/realmV2.ts b/clients/spl-governance/src/generated/accounts/realmV2.ts index 4a1c86ec..f7ed49fc 100644 --- a/clients/spl-governance/src/generated/accounts/realmV2.ts +++ b/clients/spl-governance/src/generated/accounts/realmV2.ts @@ -21,12 +21,7 @@ import type { OptionOrNullable, } from "@solana/kit"; import type { RealmSeeds } from "../pdas/index.js"; -import type { - GovernanceAccountType, - GovernanceAccountTypeArgs, - RealmConfig, - RealmConfigArgs, -} from "../types/index.js"; +import type { RealmConfig, RealmConfigArgs } from "../types/index.js"; import { addDecoderSizePrefix, addEncoderSizePrefix, @@ -52,15 +47,23 @@ import { getU32Encoder, getUtf8Decoder, getUtf8Encoder, + transformEncoder, } from "@solana/kit"; import { findRealmPda } from "../pdas/index.js"; import { + GovernanceAccountType, getGovernanceAccountTypeDecoder, getGovernanceAccountTypeEncoder, getRealmConfigDecoder, getRealmConfigEncoder, } from "../types/index.js"; +export const REALM_V2_ACCOUNT_TYPE = GovernanceAccountType.RealmV2; + +export function getRealmV2AccountTypeBytes() { + return getGovernanceAccountTypeEncoder().encode(REALM_V2_ACCOUNT_TYPE); +} + export interface RealmV2 { accountType: GovernanceAccountType; communityMint: Address; @@ -73,7 +76,6 @@ export interface RealmV2 { } export interface RealmV2Args { - accountType: GovernanceAccountTypeArgs; communityMint: Address; config: RealmConfigArgs; reserved: number[]; @@ -84,16 +86,19 @@ export interface RealmV2Args { } export function getRealmV2Encoder(): Encoder { - return getStructEncoder([ - ["accountType", getGovernanceAccountTypeEncoder()], - ["communityMint", getAddressEncoder()], - ["config", getRealmConfigEncoder()], - ["reserved", getArrayEncoder(getU8Encoder(), { size: 6 })], - ["legacy1", getU16Encoder()], - ["authority", getOptionEncoder(getAddressEncoder())], - ["name", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], - ["reservedV2", getArrayEncoder(getU8Encoder(), { size: 128 })], - ]); + return transformEncoder( + getStructEncoder([ + ["accountType", getGovernanceAccountTypeEncoder()], + ["communityMint", getAddressEncoder()], + ["config", getRealmConfigEncoder()], + ["reserved", getArrayEncoder(getU8Encoder(), { size: 6 })], + ["legacy1", getU16Encoder()], + ["authority", getOptionEncoder(getAddressEncoder())], + ["name", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], + ["reservedV2", getArrayEncoder(getU8Encoder(), { size: 128 })], + ]), + (value) => ({ ...value, accountType: REALM_V2_ACCOUNT_TYPE }), + ); } export function getRealmV2Decoder(): Decoder { diff --git a/clients/spl-governance/src/generated/accounts/requiredSignatory.ts b/clients/spl-governance/src/generated/accounts/requiredSignatory.ts index 893e87da..cea51dae 100644 --- a/clients/spl-governance/src/generated/accounts/requiredSignatory.ts +++ b/clients/spl-governance/src/generated/accounts/requiredSignatory.ts @@ -19,10 +19,6 @@ import type { MaybeEncodedAccount, } from "@solana/kit"; import type { RequiredSignatorySeeds } from "../pdas/index.js"; -import type { - GovernanceAccountType, - GovernanceAccountTypeArgs, -} from "../types/index.js"; import { assertAccountExists, assertAccountsExist, @@ -36,13 +32,24 @@ import { getStructEncoder, getU8Decoder, getU8Encoder, + transformEncoder, } from "@solana/kit"; import { findRequiredSignatoryPda } from "../pdas/index.js"; import { + GovernanceAccountType, getGovernanceAccountTypeDecoder, getGovernanceAccountTypeEncoder, } from "../types/index.js"; +export const REQUIRED_SIGNATORY_ACCOUNT_TYPE = + GovernanceAccountType.RequiredSignatory; + +export function getRequiredSignatoryAccountTypeBytes() { + return getGovernanceAccountTypeEncoder().encode( + REQUIRED_SIGNATORY_ACCOUNT_TYPE, + ); +} + export interface RequiredSignatory { accountType: GovernanceAccountType; accountVersion: number; @@ -51,19 +58,21 @@ export interface RequiredSignatory { } export interface RequiredSignatoryArgs { - accountType: GovernanceAccountTypeArgs; accountVersion: number; governance: Address; signatory: Address; } export function getRequiredSignatoryEncoder(): FixedSizeEncoder { - return getStructEncoder([ - ["accountType", getGovernanceAccountTypeEncoder()], - ["accountVersion", getU8Encoder()], - ["governance", getAddressEncoder()], - ["signatory", getAddressEncoder()], - ]); + return transformEncoder( + getStructEncoder([ + ["accountType", getGovernanceAccountTypeEncoder()], + ["accountVersion", getU8Encoder()], + ["governance", getAddressEncoder()], + ["signatory", getAddressEncoder()], + ]), + (value) => ({ ...value, accountType: REQUIRED_SIGNATORY_ACCOUNT_TYPE }), + ); } export function getRequiredSignatoryDecoder(): FixedSizeDecoder { diff --git a/clients/spl-governance/src/generated/accounts/signatoryRecordV1.ts b/clients/spl-governance/src/generated/accounts/signatoryRecordV1.ts index d8700233..1e1fc826 100644 --- a/clients/spl-governance/src/generated/accounts/signatoryRecordV1.ts +++ b/clients/spl-governance/src/generated/accounts/signatoryRecordV1.ts @@ -19,10 +19,6 @@ import type { MaybeEncodedAccount, } from "@solana/kit"; import type { SignatoryRecordSeeds } from "../pdas/index.js"; -import type { - GovernanceAccountType, - GovernanceAccountTypeArgs, -} from "../types/index.js"; import { assertAccountExists, assertAccountsExist, @@ -36,13 +32,24 @@ import { getBooleanEncoder, getStructDecoder, getStructEncoder, + transformEncoder, } from "@solana/kit"; import { findSignatoryRecordPda } from "../pdas/index.js"; import { + GovernanceAccountType, getGovernanceAccountTypeDecoder, getGovernanceAccountTypeEncoder, } from "../types/index.js"; +export const SIGNATORY_RECORD_V1_ACCOUNT_TYPE = + GovernanceAccountType.SignatoryRecordV1; + +export function getSignatoryRecordV1AccountTypeBytes() { + return getGovernanceAccountTypeEncoder().encode( + SIGNATORY_RECORD_V1_ACCOUNT_TYPE, + ); +} + export interface SignatoryRecordV1 { accountType: GovernanceAccountType; proposal: Address; @@ -51,19 +58,21 @@ export interface SignatoryRecordV1 { } export interface SignatoryRecordV1Args { - accountType: GovernanceAccountTypeArgs; proposal: Address; signatory: Address; signedOff: boolean; } export function getSignatoryRecordV1Encoder(): FixedSizeEncoder { - return getStructEncoder([ - ["accountType", getGovernanceAccountTypeEncoder()], - ["proposal", getAddressEncoder()], - ["signatory", getAddressEncoder()], - ["signedOff", getBooleanEncoder()], - ]); + return transformEncoder( + getStructEncoder([ + ["accountType", getGovernanceAccountTypeEncoder()], + ["proposal", getAddressEncoder()], + ["signatory", getAddressEncoder()], + ["signedOff", getBooleanEncoder()], + ]), + (value) => ({ ...value, accountType: SIGNATORY_RECORD_V1_ACCOUNT_TYPE }), + ); } export function getSignatoryRecordV1Decoder(): FixedSizeDecoder { diff --git a/clients/spl-governance/src/generated/accounts/signatoryRecordV2.ts b/clients/spl-governance/src/generated/accounts/signatoryRecordV2.ts index ace24f36..4c10ca41 100644 --- a/clients/spl-governance/src/generated/accounts/signatoryRecordV2.ts +++ b/clients/spl-governance/src/generated/accounts/signatoryRecordV2.ts @@ -19,10 +19,6 @@ import type { MaybeEncodedAccount, } from "@solana/kit"; import type { SignatoryRecordSeeds } from "../pdas/index.js"; -import type { - GovernanceAccountType, - GovernanceAccountTypeArgs, -} from "../types/index.js"; import { assertAccountExists, assertAccountsExist, @@ -40,13 +36,24 @@ import { getStructEncoder, getU8Decoder, getU8Encoder, + transformEncoder, } from "@solana/kit"; import { findSignatoryRecordPda } from "../pdas/index.js"; import { + GovernanceAccountType, getGovernanceAccountTypeDecoder, getGovernanceAccountTypeEncoder, } from "../types/index.js"; +export const SIGNATORY_RECORD_V2_ACCOUNT_TYPE = + GovernanceAccountType.SignatoryRecordV2; + +export function getSignatoryRecordV2AccountTypeBytes() { + return getGovernanceAccountTypeEncoder().encode( + SIGNATORY_RECORD_V2_ACCOUNT_TYPE, + ); +} + export interface SignatoryRecordV2 { accountType: GovernanceAccountType; proposal: Address; @@ -56,7 +63,6 @@ export interface SignatoryRecordV2 { } export interface SignatoryRecordV2Args { - accountType: GovernanceAccountTypeArgs; proposal: Address; signatory: Address; signedOff: boolean; @@ -64,13 +70,16 @@ export interface SignatoryRecordV2Args { } export function getSignatoryRecordV2Encoder(): FixedSizeEncoder { - return getStructEncoder([ - ["accountType", getGovernanceAccountTypeEncoder()], - ["proposal", getAddressEncoder()], - ["signatory", getAddressEncoder()], - ["signedOff", getBooleanEncoder()], - ["reservedV2", getArrayEncoder(getU8Encoder(), { size: 8 })], - ]); + return transformEncoder( + getStructEncoder([ + ["accountType", getGovernanceAccountTypeEncoder()], + ["proposal", getAddressEncoder()], + ["signatory", getAddressEncoder()], + ["signedOff", getBooleanEncoder()], + ["reservedV2", getArrayEncoder(getU8Encoder(), { size: 8 })], + ]), + (value) => ({ ...value, accountType: SIGNATORY_RECORD_V2_ACCOUNT_TYPE }), + ); } export function getSignatoryRecordV2Decoder(): FixedSizeDecoder { diff --git a/clients/spl-governance/src/generated/accounts/tokenOwnerRecordV1.ts b/clients/spl-governance/src/generated/accounts/tokenOwnerRecordV1.ts index 2bdf89b7..d07b68db 100644 --- a/clients/spl-governance/src/generated/accounts/tokenOwnerRecordV1.ts +++ b/clients/spl-governance/src/generated/accounts/tokenOwnerRecordV1.ts @@ -21,10 +21,6 @@ import type { OptionOrNullable, } from "@solana/kit"; import type { TokenOwnerRecordSeeds } from "../pdas/index.js"; -import type { - GovernanceAccountType, - GovernanceAccountTypeArgs, -} from "../types/index.js"; import { assertAccountExists, assertAccountsExist, @@ -44,13 +40,24 @@ import { getU8Encoder, getU64Decoder, getU64Encoder, + transformEncoder, } from "@solana/kit"; import { findTokenOwnerRecordPda } from "../pdas/index.js"; import { + GovernanceAccountType, getGovernanceAccountTypeDecoder, getGovernanceAccountTypeEncoder, } from "../types/index.js"; +export const TOKEN_OWNER_RECORD_V1_ACCOUNT_TYPE = + GovernanceAccountType.TokenOwnerRecordV1; + +export function getTokenOwnerRecordV1AccountTypeBytes() { + return getGovernanceAccountTypeEncoder().encode( + TOKEN_OWNER_RECORD_V1_ACCOUNT_TYPE, + ); +} + export interface TokenOwnerRecordV1 { accountType: GovernanceAccountType; realm: Address; @@ -65,7 +72,6 @@ export interface TokenOwnerRecordV1 { } export interface TokenOwnerRecordV1Args { - accountType: GovernanceAccountTypeArgs; realm: Address; governingTokenMint: Address; governingTokenOwner: Address; @@ -78,18 +84,21 @@ export interface TokenOwnerRecordV1Args { } export function getTokenOwnerRecordV1Encoder(): Encoder { - return getStructEncoder([ - ["accountType", getGovernanceAccountTypeEncoder()], - ["realm", getAddressEncoder()], - ["governingTokenMint", getAddressEncoder()], - ["governingTokenOwner", getAddressEncoder()], - ["governingTokenDepositAmount", getU64Encoder()], - ["unrelinquishedVotesCount", getU64Encoder()], - ["outstandingProposalCount", getU8Encoder()], - ["version", getU8Encoder()], - ["reserved", getArrayEncoder(getU8Encoder(), { size: 6 })], - ["governanceDelegate", getOptionEncoder(getAddressEncoder())], - ]); + return transformEncoder( + getStructEncoder([ + ["accountType", getGovernanceAccountTypeEncoder()], + ["realm", getAddressEncoder()], + ["governingTokenMint", getAddressEncoder()], + ["governingTokenOwner", getAddressEncoder()], + ["governingTokenDepositAmount", getU64Encoder()], + ["unrelinquishedVotesCount", getU64Encoder()], + ["outstandingProposalCount", getU8Encoder()], + ["version", getU8Encoder()], + ["reserved", getArrayEncoder(getU8Encoder(), { size: 6 })], + ["governanceDelegate", getOptionEncoder(getAddressEncoder())], + ]), + (value) => ({ ...value, accountType: TOKEN_OWNER_RECORD_V1_ACCOUNT_TYPE }), + ); } export function getTokenOwnerRecordV1Decoder(): Decoder { diff --git a/clients/spl-governance/src/generated/accounts/tokenOwnerRecordV2.ts b/clients/spl-governance/src/generated/accounts/tokenOwnerRecordV2.ts index 3ffca269..121b9470 100644 --- a/clients/spl-governance/src/generated/accounts/tokenOwnerRecordV2.ts +++ b/clients/spl-governance/src/generated/accounts/tokenOwnerRecordV2.ts @@ -21,10 +21,6 @@ import type { OptionOrNullable, } from "@solana/kit"; import type { TokenOwnerRecordSeeds } from "../pdas/index.js"; -import type { - GovernanceAccountType, - GovernanceAccountTypeArgs, -} from "../types/index.js"; import { assertAccountExists, assertAccountsExist, @@ -44,13 +40,24 @@ import { getU8Encoder, getU64Decoder, getU64Encoder, + transformEncoder, } from "@solana/kit"; import { findTokenOwnerRecordPda } from "../pdas/index.js"; import { + GovernanceAccountType, getGovernanceAccountTypeDecoder, getGovernanceAccountTypeEncoder, } from "../types/index.js"; +export const TOKEN_OWNER_RECORD_V2_ACCOUNT_TYPE = + GovernanceAccountType.TokenOwnerRecordV2; + +export function getTokenOwnerRecordV2AccountTypeBytes() { + return getGovernanceAccountTypeEncoder().encode( + TOKEN_OWNER_RECORD_V2_ACCOUNT_TYPE, + ); +} + export interface TokenOwnerRecordV2 { accountType: GovernanceAccountType; realm: Address; @@ -66,7 +73,6 @@ export interface TokenOwnerRecordV2 { } export interface TokenOwnerRecordV2Args { - accountType: GovernanceAccountTypeArgs; realm: Address; governingTokenMint: Address; governingTokenOwner: Address; @@ -80,19 +86,22 @@ export interface TokenOwnerRecordV2Args { } export function getTokenOwnerRecordV2Encoder(): Encoder { - return getStructEncoder([ - ["accountType", getGovernanceAccountTypeEncoder()], - ["realm", getAddressEncoder()], - ["governingTokenMint", getAddressEncoder()], - ["governingTokenOwner", getAddressEncoder()], - ["governingTokenDepositAmount", getU64Encoder()], - ["unrelinquishedVotesCount", getU64Encoder()], - ["outstandingProposalCount", getU8Encoder()], - ["version", getU8Encoder()], - ["reserved", getArrayEncoder(getU8Encoder(), { size: 6 })], - ["governanceDelegate", getOptionEncoder(getAddressEncoder())], - ["reservedV2", getArrayEncoder(getU8Encoder(), { size: 128 })], - ]); + return transformEncoder( + getStructEncoder([ + ["accountType", getGovernanceAccountTypeEncoder()], + ["realm", getAddressEncoder()], + ["governingTokenMint", getAddressEncoder()], + ["governingTokenOwner", getAddressEncoder()], + ["governingTokenDepositAmount", getU64Encoder()], + ["unrelinquishedVotesCount", getU64Encoder()], + ["outstandingProposalCount", getU8Encoder()], + ["version", getU8Encoder()], + ["reserved", getArrayEncoder(getU8Encoder(), { size: 6 })], + ["governanceDelegate", getOptionEncoder(getAddressEncoder())], + ["reservedV2", getArrayEncoder(getU8Encoder(), { size: 128 })], + ]), + (value) => ({ ...value, accountType: TOKEN_OWNER_RECORD_V2_ACCOUNT_TYPE }), + ); } export function getTokenOwnerRecordV2Decoder(): Decoder { diff --git a/clients/spl-governance/src/generated/accounts/voteRecordV1.ts b/clients/spl-governance/src/generated/accounts/voteRecordV1.ts index a4401ae9..7f7becb2 100644 --- a/clients/spl-governance/src/generated/accounts/voteRecordV1.ts +++ b/clients/spl-governance/src/generated/accounts/voteRecordV1.ts @@ -19,12 +19,7 @@ import type { MaybeEncodedAccount, } from "@solana/kit"; import type { VoteRecordSeeds } from "../pdas/index.js"; -import type { - GovernanceAccountType, - GovernanceAccountTypeArgs, - VoteWeightV1, - VoteWeightV1Args, -} from "../types/index.js"; +import type { VoteWeightV1, VoteWeightV1Args } from "../types/index.js"; import { assertAccountExists, assertAccountsExist, @@ -38,15 +33,23 @@ import { getBooleanEncoder, getStructDecoder, getStructEncoder, + transformEncoder, } from "@solana/kit"; import { findVoteRecordPda } from "../pdas/index.js"; import { + GovernanceAccountType, getGovernanceAccountTypeDecoder, getGovernanceAccountTypeEncoder, getVoteWeightV1Decoder, getVoteWeightV1Encoder, } from "../types/index.js"; +export const VOTE_RECORD_V1_ACCOUNT_TYPE = GovernanceAccountType.VoteRecordV1; + +export function getVoteRecordV1AccountTypeBytes() { + return getGovernanceAccountTypeEncoder().encode(VOTE_RECORD_V1_ACCOUNT_TYPE); +} + export interface VoteRecordV1 { accountType: GovernanceAccountType; proposal: Address; @@ -56,7 +59,6 @@ export interface VoteRecordV1 { } export interface VoteRecordV1Args { - accountType: GovernanceAccountTypeArgs; proposal: Address; governingTokenOwner: Address; isRelinquished: boolean; @@ -64,13 +66,16 @@ export interface VoteRecordV1Args { } export function getVoteRecordV1Encoder(): FixedSizeEncoder { - return getStructEncoder([ - ["accountType", getGovernanceAccountTypeEncoder()], - ["proposal", getAddressEncoder()], - ["governingTokenOwner", getAddressEncoder()], - ["isRelinquished", getBooleanEncoder()], - ["voteWeight", getVoteWeightV1Encoder()], - ]); + return transformEncoder( + getStructEncoder([ + ["accountType", getGovernanceAccountTypeEncoder()], + ["proposal", getAddressEncoder()], + ["governingTokenOwner", getAddressEncoder()], + ["isRelinquished", getBooleanEncoder()], + ["voteWeight", getVoteWeightV1Encoder()], + ]), + (value) => ({ ...value, accountType: VOTE_RECORD_V1_ACCOUNT_TYPE }), + ); } export function getVoteRecordV1Decoder(): FixedSizeDecoder { diff --git a/clients/spl-governance/src/generated/accounts/voteRecordV2.ts b/clients/spl-governance/src/generated/accounts/voteRecordV2.ts index 6453d5f4..08b06ec5 100644 --- a/clients/spl-governance/src/generated/accounts/voteRecordV2.ts +++ b/clients/spl-governance/src/generated/accounts/voteRecordV2.ts @@ -19,12 +19,7 @@ import type { MaybeEncodedAccount, } from "@solana/kit"; import type { VoteRecordSeeds } from "../pdas/index.js"; -import type { - GovernanceAccountType, - GovernanceAccountTypeArgs, - Vote, - VoteArgs, -} from "../types/index.js"; +import type { Vote, VoteArgs } from "../types/index.js"; import { assertAccountExists, assertAccountsExist, @@ -44,15 +39,23 @@ import { getU8Encoder, getU64Decoder, getU64Encoder, + transformEncoder, } from "@solana/kit"; import { findVoteRecordPda } from "../pdas/index.js"; import { + GovernanceAccountType, getGovernanceAccountTypeDecoder, getGovernanceAccountTypeEncoder, getVoteDecoder, getVoteEncoder, } from "../types/index.js"; +export const VOTE_RECORD_V2_ACCOUNT_TYPE = GovernanceAccountType.VoteRecordV2; + +export function getVoteRecordV2AccountTypeBytes() { + return getGovernanceAccountTypeEncoder().encode(VOTE_RECORD_V2_ACCOUNT_TYPE); +} + export interface VoteRecordV2 { accountType: GovernanceAccountType; proposal: Address; @@ -64,7 +67,6 @@ export interface VoteRecordV2 { } export interface VoteRecordV2Args { - accountType: GovernanceAccountTypeArgs; proposal: Address; governingTokenOwner: Address; isRelinquished: boolean; @@ -74,15 +76,18 @@ export interface VoteRecordV2Args { } export function getVoteRecordV2Encoder(): Encoder { - return getStructEncoder([ - ["accountType", getGovernanceAccountTypeEncoder()], - ["proposal", getAddressEncoder()], - ["governingTokenOwner", getAddressEncoder()], - ["isRelinquished", getBooleanEncoder()], - ["voterWeight", getU64Encoder()], - ["vote", getVoteEncoder()], - ["reservedV2", getArrayEncoder(getU8Encoder(), { size: 8 })], - ]); + return transformEncoder( + getStructEncoder([ + ["accountType", getGovernanceAccountTypeEncoder()], + ["proposal", getAddressEncoder()], + ["governingTokenOwner", getAddressEncoder()], + ["isRelinquished", getBooleanEncoder()], + ["voterWeight", getU64Encoder()], + ["vote", getVoteEncoder()], + ["reservedV2", getArrayEncoder(getU8Encoder(), { size: 8 })], + ]), + (value) => ({ ...value, accountType: VOTE_RECORD_V2_ACCOUNT_TYPE }), + ); } export function getVoteRecordV2Decoder(): Decoder { diff --git a/clients/spl-governance/src/generated/programs/splGovernance.ts b/clients/spl-governance/src/generated/programs/splGovernance.ts index 2248c953..8b52debb 100644 --- a/clients/spl-governance/src/generated/programs/splGovernance.ts +++ b/clients/spl-governance/src/generated/programs/splGovernance.ts @@ -41,6 +41,10 @@ import type { ParsedWithdrawGoverningTokensInstruction, } from "../instructions/index.js"; import { containsBytes, getU8Encoder } from "@solana/kit"; +import { + GovernanceAccountType, + getGovernanceAccountTypeEncoder, +} from "../types/index.js"; export const SPL_GOVERNANCE_PROGRAM_ADDRESS = "GovER5Lthms3bLBqWub97yVrMmEogzX7xNjdXpPPCVZw" as Address<"GovER5Lthms3bLBqWub97yVrMmEogzX7xNjdXpPPCVZw">; @@ -67,6 +71,220 @@ export enum SplGovernanceAccount { VoteRecordV2 = 18, } +export function identifySplGovernanceAccount( + account: { data: ReadonlyUint8Array } | ReadonlyUint8Array, +): SplGovernanceAccount { + const data = "data" in account ? account.data : account; + if ( + containsBytes( + data, + getGovernanceAccountTypeEncoder().encode( + GovernanceAccountType.GovernanceV2, + ), + 0, + ) + ) { + return SplGovernanceAccount.GovernanceV2; + } + if ( + containsBytes( + data, + getGovernanceAccountTypeEncoder().encode(GovernanceAccountType.RealmV1), + 0, + ) + ) { + return SplGovernanceAccount.RealmV1; + } + if ( + containsBytes( + data, + getGovernanceAccountTypeEncoder().encode( + GovernanceAccountType.TokenOwnerRecordV1, + ), + 0, + ) + ) { + return SplGovernanceAccount.TokenOwnerRecordV1; + } + if ( + containsBytes( + data, + getGovernanceAccountTypeEncoder().encode( + GovernanceAccountType.GovernanceV1, + ), + 0, + ) + ) { + return SplGovernanceAccount.GovernanceV1; + } + if ( + containsBytes( + data, + getGovernanceAccountTypeEncoder().encode( + GovernanceAccountType.ProposalV1, + ), + 0, + ) + ) { + return SplGovernanceAccount.ProposalV1; + } + if ( + containsBytes( + data, + getGovernanceAccountTypeEncoder().encode( + GovernanceAccountType.SignatoryRecordV1, + ), + 0, + ) + ) { + return SplGovernanceAccount.SignatoryRecordV1; + } + if ( + containsBytes( + data, + getGovernanceAccountTypeEncoder().encode( + GovernanceAccountType.ProposalInstructionV1, + ), + 0, + ) + ) { + return SplGovernanceAccount.ProposalInstructionV1; + } + if ( + containsBytes( + data, + getGovernanceAccountTypeEncoder().encode( + GovernanceAccountType.VoteRecordV1, + ), + 0, + ) + ) { + return SplGovernanceAccount.VoteRecordV1; + } + if ( + containsBytes( + data, + getGovernanceAccountTypeEncoder().encode( + GovernanceAccountType.ProgramMetadata, + ), + 0, + ) + ) { + return SplGovernanceAccount.ProgramMetadata; + } + if ( + containsBytes( + data, + getGovernanceAccountTypeEncoder().encode( + GovernanceAccountType.ProposalV2, + ), + 0, + ) + ) { + return SplGovernanceAccount.ProposalV2; + } + if ( + containsBytes( + data, + getGovernanceAccountTypeEncoder().encode( + GovernanceAccountType.ProposalDeposit, + ), + 0, + ) + ) { + return SplGovernanceAccount.ProposalDeposit; + } + if ( + containsBytes( + data, + getGovernanceAccountTypeEncoder().encode( + GovernanceAccountType.ProposalTransactionV2, + ), + 0, + ) + ) { + return SplGovernanceAccount.ProposalTransactionV2; + } + if ( + containsBytes( + data, + getGovernanceAccountTypeEncoder().encode(GovernanceAccountType.RealmV2), + 0, + ) + ) { + return SplGovernanceAccount.RealmV2; + } + if ( + containsBytes( + data, + getGovernanceAccountTypeEncoder().encode( + GovernanceAccountType.RealmConfig, + ), + 0, + ) + ) { + return SplGovernanceAccount.RealmConfigAccount; + } + if ( + containsBytes( + data, + getGovernanceAccountTypeEncoder().encode( + GovernanceAccountType.RequiredSignatory, + ), + 0, + ) + ) { + return SplGovernanceAccount.RequiredSignatory; + } + if ( + containsBytes( + data, + getGovernanceAccountTypeEncoder().encode( + GovernanceAccountType.SignatoryRecordV2, + ), + 0, + ) + ) { + return SplGovernanceAccount.SignatoryRecordV2; + } + if ( + containsBytes( + data, + getGovernanceAccountTypeEncoder().encode( + GovernanceAccountType.TokenOwnerRecordV2, + ), + 0, + ) + ) { + return SplGovernanceAccount.TokenOwnerRecordV2; + } + if ( + containsBytes( + data, + getGovernanceAccountTypeEncoder().encode( + GovernanceAccountType.TokenOwnerRecordV1, + ), + 0, + ) + ) { + return SplGovernanceAccount.LegacyTokenOwnerRecord; + } + if ( + containsBytes( + data, + getGovernanceAccountTypeEncoder().encode( + GovernanceAccountType.VoteRecordV2, + ), + 0, + ) + ) { + return SplGovernanceAccount.VoteRecordV2; + } + throw new Error( + "The provided account could not be identified as a splGovernance account.", + ); +} + export enum SplGovernanceInstruction { CreateRealm = 0, DepositGoverningTokens = 1, diff --git a/clients/spl-governance/tsconfig.json b/clients/spl-governance/tsconfig.json index e528d933..c9d54033 100644 --- a/clients/spl-governance/tsconfig.json +++ b/clients/spl-governance/tsconfig.json @@ -1,3 +1,6 @@ { - "extends": "@macalinao/tsconfig/tsconfig.base.json" + "extends": "@macalinao/tsconfig/tsconfig.base.json", + "compilerOptions": { + "isolatedDeclarations": false + } } From ef2b16c8ddc0a865e937a37ced762ae115fdfea2 Mon Sep 17 00:00:00 2001 From: Ian Macalinao Date: Mon, 13 Oct 2025 17:24:14 +0800 Subject: [PATCH 2/2] docs(changeset): Add discriminators for SPL governance account types --- .changeset/true-rules-kneel.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/true-rules-kneel.md diff --git a/.changeset/true-rules-kneel.md b/.changeset/true-rules-kneel.md new file mode 100644 index 00000000..26c6c33b --- /dev/null +++ b/.changeset/true-rules-kneel.md @@ -0,0 +1,5 @@ +--- +"@macalinao/clients-spl-governance": patch +--- + +Add discriminators for SPL governance account types