@cascade-fyi/sati-sdk 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/dist/index.cjs +65 -51
- package/dist/index.d.cts +68 -49
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +68 -49
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +65 -51
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["address","config","address","config","address","config","isTransactionSigner","kitIsTransactionSigner","config","config","config","config","config","config","config","config","config","satiErrorMessages: Record<SatiError, string> | undefined","SCHEMA_CONFIGS: Record<string, Omit<SchemaConfig, \"sasSchema\">>","address","result: ContentSizeValidationResult","addressToBytes","address","zeroDataHash","address","schemaConfigPdas: Address[]","derivedAtas: Address[]","memcmpFilters: MemcmpFilter[]","attestations: ParsedAttestation[]","addressDecoder","attestation: CompressedAttestation","SAS_PROGRAM_ADDRESS: Address","addressEncoder","address","addressEncoder","ED25519_PROGRAM_ADDRESS: Address","address","OUTCOME_LABELS: Record<Outcome, string>","SOLANA_CHAIN_REFS: Record<SolanaNetwork, string>","address","feedbackHash","outcome","hexHash","text","MAX_CONTENT_SIZE","configs: Record<string, SATISASConfig | null>","(devnetJson as DeployedJson).config","(mainnetJson as DeployedJson).config","config","MIME_TYPES: Record<string, string>","address","fetchToken2022Mint","additionalMetadata: Record<string, string>","results: (AgentIdentity | null)[]","fetchToken2022Token","address","pdas: Address[]","agents: AgentIdentity[]","potentialMints: Address[]","ixList: UpdateInstruction[]","agentAta: Address | undefined","addressEncoder","proof: ValidityProofArgs","addressTreeInfo: PackedAddressTreeInfoArgs","ed25519Entries: { publicKey: Uint8Array; message: Uint8Array; signature: Uint8Array }[]","accountMeta: CompressedAccountMetaArgs","zeroDataHash","instructions: Array<Parameters<typeof appendTransactionMessageInstructions>[0][number]>","results: ReputationScoreData[]","agentValid","contentObj: Record<string, unknown>","filter: Partial<AttestationFilter>","feedbacks: ParsedFeedback[]","regFiles: (import(\"./registration\").RegistrationFile | null)[]","filtered: { identity: AgentIdentity; regFile: import(\"./registration\").RegistrationFile | null }[]","statsMap: Map<string, ReputationSummary> | null","code: SatiErrorCode","agentMint: string","schema: string"],"sources":["../src/generated/accounts/agentIndex.ts","../src/generated/accounts/registryConfig.ts","../src/generated/types/agentRegistered.ts","../src/generated/types/attestationClosed.ts","../src/generated/types/attestationCreated.ts","../src/generated/types/compressedAccountMeta.ts","../src/generated/types/compressedProof.ts","../src/generated/types/evmAddressLinked.ts","../src/generated/types/metadataEntry.ts","../src/generated/types/packedAddressTreeInfo.ts","../src/generated/types/packedStateTreeInfo.ts","../src/generated/types/registryAuthorityUpdated.ts","../src/generated/types/registryInitialized.ts","../src/generated/types/schemaConfigRegistered.ts","../src/generated/types/signatureMode.ts","../src/generated/types/storageType.ts","../src/generated/types/validityProof.ts","../src/generated/accounts/schemaConfig.ts","../src/generated/shared/index.ts","../src/generated/instructions/closeCompressedAttestation.ts","../src/generated/instructions/closeRegularAttestation.ts","../src/generated/instructions/createCompressedAttestation.ts","../src/generated/instructions/createRegularAttestation.ts","../src/generated/instructions/initialize.ts","../src/generated/instructions/linkEvmAddress.ts","../src/generated/instructions/registerAgent.ts","../src/generated/instructions/registerSchemaConfig.ts","../src/generated/instructions/updateRegistryAuthority.ts","../src/generated/programs/sati.ts","../src/generated/errors/sati.ts","../src/schemas.ts","../src/hashes.ts","../src/compression.ts","../src/sas-pdas.ts","../src/helpers.ts","../src/ed25519.ts","../src/offchain-signing.ts","../src/encryption.ts","../src/uploaders.ts","../src/deployed/devnet.json","../src/deployed/mainnet.json","../src/deployed/index.ts","../src/registration.ts","../src/cache.ts","../src/agent-builder.ts","../src/client.ts","../src/errors.ts","../src/client/messages.ts","../src/client/errors.ts"],"sourcesContent":["/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n assertAccountExists,\n assertAccountsExist,\n combineCodec,\n decodeAccount,\n fetchEncodedAccount,\n fetchEncodedAccounts,\n fixDecoderSize,\n fixEncoderSize,\n getAddressDecoder,\n getAddressEncoder,\n getBytesDecoder,\n getBytesEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type Account,\n type Address,\n type EncodedAccount,\n type FetchAccountConfig,\n type FetchAccountsConfig,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type MaybeAccount,\n type MaybeEncodedAccount,\n type ReadonlyUint8Array,\n} from \"@solana/kit\";\n\nexport const AGENT_INDEX_DISCRIMINATOR = new Uint8Array([\n 241, 154, 35, 103, 180, 141, 49, 179,\n]);\n\nexport function getAgentIndexDiscriminatorBytes() {\n return fixEncoderSize(getBytesEncoder(), 8).encode(AGENT_INDEX_DISCRIMINATOR);\n}\n\nexport type AgentIndex = {\n discriminator: ReadonlyUint8Array;\n /** Agent mint address */\n mint: Address;\n /** PDA bump seed */\n bump: number;\n};\n\nexport type AgentIndexArgs = {\n /** Agent mint address */\n mint: Address;\n /** PDA bump seed */\n bump: number;\n};\n\n/** Gets the encoder for {@link AgentIndexArgs} account data. */\nexport function getAgentIndexEncoder(): FixedSizeEncoder<AgentIndexArgs> {\n return transformEncoder(\n getStructEncoder([\n [\"discriminator\", fixEncoderSize(getBytesEncoder(), 8)],\n [\"mint\", getAddressEncoder()],\n [\"bump\", getU8Encoder()],\n ]),\n (value) => ({ ...value, discriminator: AGENT_INDEX_DISCRIMINATOR }),\n );\n}\n\n/** Gets the decoder for {@link AgentIndex} account data. */\nexport function getAgentIndexDecoder(): FixedSizeDecoder<AgentIndex> {\n return getStructDecoder([\n [\"discriminator\", fixDecoderSize(getBytesDecoder(), 8)],\n [\"mint\", getAddressDecoder()],\n [\"bump\", getU8Decoder()],\n ]);\n}\n\n/** Gets the codec for {@link AgentIndex} account data. */\nexport function getAgentIndexCodec(): FixedSizeCodec<\n AgentIndexArgs,\n AgentIndex\n> {\n return combineCodec(getAgentIndexEncoder(), getAgentIndexDecoder());\n}\n\nexport function decodeAgentIndex<TAddress extends string = string>(\n encodedAccount: EncodedAccount<TAddress>,\n): Account<AgentIndex, TAddress>;\nexport function decodeAgentIndex<TAddress extends string = string>(\n encodedAccount: MaybeEncodedAccount<TAddress>,\n): MaybeAccount<AgentIndex, TAddress>;\nexport function decodeAgentIndex<TAddress extends string = string>(\n encodedAccount: EncodedAccount<TAddress> | MaybeEncodedAccount<TAddress>,\n): Account<AgentIndex, TAddress> | MaybeAccount<AgentIndex, TAddress> {\n return decodeAccount(\n encodedAccount as MaybeEncodedAccount<TAddress>,\n getAgentIndexDecoder(),\n );\n}\n\nexport async function fetchAgentIndex<TAddress extends string = string>(\n rpc: Parameters<typeof fetchEncodedAccount>[0],\n address: Address<TAddress>,\n config?: FetchAccountConfig,\n): Promise<Account<AgentIndex, TAddress>> {\n const maybeAccount = await fetchMaybeAgentIndex(rpc, address, config);\n assertAccountExists(maybeAccount);\n return maybeAccount;\n}\n\nexport async function fetchMaybeAgentIndex<TAddress extends string = string>(\n rpc: Parameters<typeof fetchEncodedAccount>[0],\n address: Address<TAddress>,\n config?: FetchAccountConfig,\n): Promise<MaybeAccount<AgentIndex, TAddress>> {\n const maybeAccount = await fetchEncodedAccount(rpc, address, config);\n return decodeAgentIndex(maybeAccount);\n}\n\nexport async function fetchAllAgentIndex(\n rpc: Parameters<typeof fetchEncodedAccounts>[0],\n addresses: Array<Address>,\n config?: FetchAccountsConfig,\n): Promise<Account<AgentIndex>[]> {\n const maybeAccounts = await fetchAllMaybeAgentIndex(rpc, addresses, config);\n assertAccountsExist(maybeAccounts);\n return maybeAccounts;\n}\n\nexport async function fetchAllMaybeAgentIndex(\n rpc: Parameters<typeof fetchEncodedAccounts>[0],\n addresses: Array<Address>,\n config?: FetchAccountsConfig,\n): Promise<MaybeAccount<AgentIndex>[]> {\n const maybeAccounts = await fetchEncodedAccounts(rpc, addresses, config);\n return maybeAccounts.map((maybeAccount) => decodeAgentIndex(maybeAccount));\n}\n\nexport function getAgentIndexSize(): number {\n return 41;\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n assertAccountExists,\n assertAccountsExist,\n combineCodec,\n decodeAccount,\n fetchEncodedAccount,\n fetchEncodedAccounts,\n fixDecoderSize,\n fixEncoderSize,\n getAddressDecoder,\n getAddressEncoder,\n getBytesDecoder,\n getBytesEncoder,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type Account,\n type Address,\n type EncodedAccount,\n type FetchAccountConfig,\n type FetchAccountsConfig,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type MaybeAccount,\n type MaybeEncodedAccount,\n type ReadonlyUint8Array,\n} from \"@solana/kit\";\n\nexport const REGISTRY_CONFIG_DISCRIMINATOR = new Uint8Array([\n 23, 118, 10, 246, 173, 231, 243, 156,\n]);\n\nexport function getRegistryConfigDiscriminatorBytes() {\n return fixEncoderSize(getBytesEncoder(), 8).encode(\n REGISTRY_CONFIG_DISCRIMINATOR,\n );\n}\n\nexport type RegistryConfig = {\n discriminator: ReadonlyUint8Array;\n /** SATI TokenGroup mint address */\n groupMint: Address;\n /**\n * Authority that can update registry settings\n * Set to Pubkey::default() to make immutable\n */\n authority: Address;\n /** Total agents registered (counter) */\n totalAgents: bigint;\n /** PDA bump seed (stored for efficient CPI signing) */\n bump: number;\n};\n\nexport type RegistryConfigArgs = {\n /** SATI TokenGroup mint address */\n groupMint: Address;\n /**\n * Authority that can update registry settings\n * Set to Pubkey::default() to make immutable\n */\n authority: Address;\n /** Total agents registered (counter) */\n totalAgents: number | bigint;\n /** PDA bump seed (stored for efficient CPI signing) */\n bump: number;\n};\n\n/** Gets the encoder for {@link RegistryConfigArgs} account data. */\nexport function getRegistryConfigEncoder(): FixedSizeEncoder<RegistryConfigArgs> {\n return transformEncoder(\n getStructEncoder([\n [\"discriminator\", fixEncoderSize(getBytesEncoder(), 8)],\n [\"groupMint\", getAddressEncoder()],\n [\"authority\", getAddressEncoder()],\n [\"totalAgents\", getU64Encoder()],\n [\"bump\", getU8Encoder()],\n ]),\n (value) => ({ ...value, discriminator: REGISTRY_CONFIG_DISCRIMINATOR }),\n );\n}\n\n/** Gets the decoder for {@link RegistryConfig} account data. */\nexport function getRegistryConfigDecoder(): FixedSizeDecoder<RegistryConfig> {\n return getStructDecoder([\n [\"discriminator\", fixDecoderSize(getBytesDecoder(), 8)],\n [\"groupMint\", getAddressDecoder()],\n [\"authority\", getAddressDecoder()],\n [\"totalAgents\", getU64Decoder()],\n [\"bump\", getU8Decoder()],\n ]);\n}\n\n/** Gets the codec for {@link RegistryConfig} account data. */\nexport function getRegistryConfigCodec(): FixedSizeCodec<\n RegistryConfigArgs,\n RegistryConfig\n> {\n return combineCodec(getRegistryConfigEncoder(), getRegistryConfigDecoder());\n}\n\nexport function decodeRegistryConfig<TAddress extends string = string>(\n encodedAccount: EncodedAccount<TAddress>,\n): Account<RegistryConfig, TAddress>;\nexport function decodeRegistryConfig<TAddress extends string = string>(\n encodedAccount: MaybeEncodedAccount<TAddress>,\n): MaybeAccount<RegistryConfig, TAddress>;\nexport function decodeRegistryConfig<TAddress extends string = string>(\n encodedAccount: EncodedAccount<TAddress> | MaybeEncodedAccount<TAddress>,\n): Account<RegistryConfig, TAddress> | MaybeAccount<RegistryConfig, TAddress> {\n return decodeAccount(\n encodedAccount as MaybeEncodedAccount<TAddress>,\n getRegistryConfigDecoder(),\n );\n}\n\nexport async function fetchRegistryConfig<TAddress extends string = string>(\n rpc: Parameters<typeof fetchEncodedAccount>[0],\n address: Address<TAddress>,\n config?: FetchAccountConfig,\n): Promise<Account<RegistryConfig, TAddress>> {\n const maybeAccount = await fetchMaybeRegistryConfig(rpc, address, config);\n assertAccountExists(maybeAccount);\n return maybeAccount;\n}\n\nexport async function fetchMaybeRegistryConfig<\n TAddress extends string = string,\n>(\n rpc: Parameters<typeof fetchEncodedAccount>[0],\n address: Address<TAddress>,\n config?: FetchAccountConfig,\n): Promise<MaybeAccount<RegistryConfig, TAddress>> {\n const maybeAccount = await fetchEncodedAccount(rpc, address, config);\n return decodeRegistryConfig(maybeAccount);\n}\n\nexport async function fetchAllRegistryConfig(\n rpc: Parameters<typeof fetchEncodedAccounts>[0],\n addresses: Array<Address>,\n config?: FetchAccountsConfig,\n): Promise<Account<RegistryConfig>[]> {\n const maybeAccounts = await fetchAllMaybeRegistryConfig(\n rpc,\n addresses,\n config,\n );\n assertAccountsExist(maybeAccounts);\n return maybeAccounts;\n}\n\nexport async function fetchAllMaybeRegistryConfig(\n rpc: Parameters<typeof fetchEncodedAccounts>[0],\n addresses: Array<Address>,\n config?: FetchAccountsConfig,\n): Promise<MaybeAccount<RegistryConfig>[]> {\n const maybeAccounts = await fetchEncodedAccounts(rpc, addresses, config);\n return maybeAccounts.map((maybeAccount) =>\n decodeRegistryConfig(maybeAccount),\n );\n}\n\nexport function getRegistryConfigSize(): number {\n return 81;\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n addDecoderSizePrefix,\n addEncoderSizePrefix,\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getBooleanDecoder,\n getBooleanEncoder,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getU64Decoder,\n getU64Encoder,\n getUtf8Decoder,\n getUtf8Encoder,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n} from \"@solana/kit\";\n\nexport type AgentRegistered = {\n mint: Address;\n owner: Address;\n memberNumber: bigint;\n name: string;\n uri: string;\n nonTransferable: boolean;\n};\n\nexport type AgentRegisteredArgs = {\n mint: Address;\n owner: Address;\n memberNumber: number | bigint;\n name: string;\n uri: string;\n nonTransferable: boolean;\n};\n\nexport function getAgentRegisteredEncoder(): Encoder<AgentRegisteredArgs> {\n return getStructEncoder([\n [\"mint\", getAddressEncoder()],\n [\"owner\", getAddressEncoder()],\n [\"memberNumber\", getU64Encoder()],\n [\"name\", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n [\"uri\", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n [\"nonTransferable\", getBooleanEncoder()],\n ]);\n}\n\nexport function getAgentRegisteredDecoder(): Decoder<AgentRegistered> {\n return getStructDecoder([\n [\"mint\", getAddressDecoder()],\n [\"owner\", getAddressDecoder()],\n [\"memberNumber\", getU64Decoder()],\n [\"name\", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n [\"uri\", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n [\"nonTransferable\", getBooleanDecoder()],\n ]);\n}\n\nexport function getAgentRegisteredCodec(): Codec<\n AgentRegisteredArgs,\n AgentRegistered\n> {\n return combineCodec(getAgentRegisteredEncoder(), getAgentRegisteredDecoder());\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getStructDecoder,\n getStructEncoder,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n} from \"@solana/kit\";\n\n/** Emitted when an attestation is closed */\nexport type AttestationClosed = {\n /** SAS schema address */\n sasSchema: Address;\n /** Agent's MINT ADDRESS (Token-2022 NFT, stable identity) */\n agentMint: Address;\n /** Attestation address that was closed */\n address: Address;\n};\n\nexport type AttestationClosedArgs = AttestationClosed;\n\nexport function getAttestationClosedEncoder(): FixedSizeEncoder<AttestationClosedArgs> {\n return getStructEncoder([\n [\"sasSchema\", getAddressEncoder()],\n [\"agentMint\", getAddressEncoder()],\n [\"address\", getAddressEncoder()],\n ]);\n}\n\nexport function getAttestationClosedDecoder(): FixedSizeDecoder<AttestationClosed> {\n return getStructDecoder([\n [\"sasSchema\", getAddressDecoder()],\n [\"agentMint\", getAddressDecoder()],\n [\"address\", getAddressDecoder()],\n ]);\n}\n\nexport function getAttestationClosedCodec(): FixedSizeCodec<\n AttestationClosedArgs,\n AttestationClosed\n> {\n return combineCodec(\n getAttestationClosedEncoder(),\n getAttestationClosedDecoder(),\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getStructDecoder,\n getStructEncoder,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n} from \"@solana/kit\";\nimport {\n getStorageTypeDecoder,\n getStorageTypeEncoder,\n type StorageType,\n type StorageTypeArgs,\n} from \".\";\n\n/** Emitted when an attestation is created (compressed or regular) */\nexport type AttestationCreated = {\n /** SAS schema address */\n sasSchema: Address;\n /** Agent's MINT ADDRESS (Token-2022 NFT, stable identity) */\n agentMint: Address;\n /** Counterparty (client for Feedback, validator for Validation, provider for ReputationScore) */\n counterparty: Address;\n /** Storage type used */\n storageType: StorageType;\n /** Attestation address (Light address for compressed, PDA for regular) */\n address: Address;\n};\n\nexport type AttestationCreatedArgs = {\n /** SAS schema address */\n sasSchema: Address;\n /** Agent's MINT ADDRESS (Token-2022 NFT, stable identity) */\n agentMint: Address;\n /** Counterparty (client for Feedback, validator for Validation, provider for ReputationScore) */\n counterparty: Address;\n /** Storage type used */\n storageType: StorageTypeArgs;\n /** Attestation address (Light address for compressed, PDA for regular) */\n address: Address;\n};\n\nexport function getAttestationCreatedEncoder(): FixedSizeEncoder<AttestationCreatedArgs> {\n return getStructEncoder([\n [\"sasSchema\", getAddressEncoder()],\n [\"agentMint\", getAddressEncoder()],\n [\"counterparty\", getAddressEncoder()],\n [\"storageType\", getStorageTypeEncoder()],\n [\"address\", getAddressEncoder()],\n ]);\n}\n\nexport function getAttestationCreatedDecoder(): FixedSizeDecoder<AttestationCreated> {\n return getStructDecoder([\n [\"sasSchema\", getAddressDecoder()],\n [\"agentMint\", getAddressDecoder()],\n [\"counterparty\", getAddressDecoder()],\n [\"storageType\", getStorageTypeDecoder()],\n [\"address\", getAddressDecoder()],\n ]);\n}\n\nexport function getAttestationCreatedCodec(): FixedSizeCodec<\n AttestationCreatedArgs,\n AttestationCreated\n> {\n return combineCodec(\n getAttestationCreatedEncoder(),\n getAttestationCreatedDecoder(),\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n fixDecoderSize,\n fixEncoderSize,\n getBytesDecoder,\n getBytesEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type ReadonlyUint8Array,\n} from \"@solana/kit\";\nimport {\n getPackedStateTreeInfoDecoder,\n getPackedStateTreeInfoEncoder,\n type PackedStateTreeInfo,\n type PackedStateTreeInfoArgs,\n} from \".\";\n\nexport type CompressedAccountMeta = {\n /** Merkle tree context. */\n treeInfo: PackedStateTreeInfo;\n /** Address. */\n address: ReadonlyUint8Array;\n /** Output merkle tree index. */\n outputStateTreeIndex: number;\n};\n\nexport type CompressedAccountMetaArgs = {\n /** Merkle tree context. */\n treeInfo: PackedStateTreeInfoArgs;\n /** Address. */\n address: ReadonlyUint8Array;\n /** Output merkle tree index. */\n outputStateTreeIndex: number;\n};\n\nexport function getCompressedAccountMetaEncoder(): FixedSizeEncoder<CompressedAccountMetaArgs> {\n return getStructEncoder([\n [\"treeInfo\", getPackedStateTreeInfoEncoder()],\n [\"address\", fixEncoderSize(getBytesEncoder(), 32)],\n [\"outputStateTreeIndex\", getU8Encoder()],\n ]);\n}\n\nexport function getCompressedAccountMetaDecoder(): FixedSizeDecoder<CompressedAccountMeta> {\n return getStructDecoder([\n [\"treeInfo\", getPackedStateTreeInfoDecoder()],\n [\"address\", fixDecoderSize(getBytesDecoder(), 32)],\n [\"outputStateTreeIndex\", getU8Decoder()],\n ]);\n}\n\nexport function getCompressedAccountMetaCodec(): FixedSizeCodec<\n CompressedAccountMetaArgs,\n CompressedAccountMeta\n> {\n return combineCodec(\n getCompressedAccountMetaEncoder(),\n getCompressedAccountMetaDecoder(),\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n fixDecoderSize,\n fixEncoderSize,\n getBytesDecoder,\n getBytesEncoder,\n getStructDecoder,\n getStructEncoder,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type ReadonlyUint8Array,\n} from \"@solana/kit\";\n\nexport type CompressedProof = {\n a: ReadonlyUint8Array;\n b: ReadonlyUint8Array;\n c: ReadonlyUint8Array;\n};\n\nexport type CompressedProofArgs = CompressedProof;\n\nexport function getCompressedProofEncoder(): FixedSizeEncoder<CompressedProofArgs> {\n return getStructEncoder([\n [\"a\", fixEncoderSize(getBytesEncoder(), 32)],\n [\"b\", fixEncoderSize(getBytesEncoder(), 64)],\n [\"c\", fixEncoderSize(getBytesEncoder(), 32)],\n ]);\n}\n\nexport function getCompressedProofDecoder(): FixedSizeDecoder<CompressedProof> {\n return getStructDecoder([\n [\"a\", fixDecoderSize(getBytesDecoder(), 32)],\n [\"b\", fixDecoderSize(getBytesDecoder(), 64)],\n [\"c\", fixDecoderSize(getBytesDecoder(), 32)],\n ]);\n}\n\nexport function getCompressedProofCodec(): FixedSizeCodec<\n CompressedProofArgs,\n CompressedProof\n> {\n return combineCodec(getCompressedProofEncoder(), getCompressedProofDecoder());\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n addDecoderSizePrefix,\n addEncoderSizePrefix,\n combineCodec,\n fixDecoderSize,\n fixEncoderSize,\n getAddressDecoder,\n getAddressEncoder,\n getBytesDecoder,\n getBytesEncoder,\n getI64Decoder,\n getI64Encoder,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getUtf8Decoder,\n getUtf8Encoder,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type ReadonlyUint8Array,\n} from \"@solana/kit\";\n\n/** Emitted when an EVM address is linked to an agent */\nexport type EvmAddressLinked = {\n /** Agent mint address */\n agentMint: Address;\n /** EVM address (20 bytes) */\n evmAddress: ReadonlyUint8Array;\n /** CAIP-2 chain identifier (e.g., \"eip155:1\") */\n chainId: string;\n /** Unix timestamp when linked */\n linkedAt: bigint;\n};\n\nexport type EvmAddressLinkedArgs = {\n /** Agent mint address */\n agentMint: Address;\n /** EVM address (20 bytes) */\n evmAddress: ReadonlyUint8Array;\n /** CAIP-2 chain identifier (e.g., \"eip155:1\") */\n chainId: string;\n /** Unix timestamp when linked */\n linkedAt: number | bigint;\n};\n\nexport function getEvmAddressLinkedEncoder(): Encoder<EvmAddressLinkedArgs> {\n return getStructEncoder([\n [\"agentMint\", getAddressEncoder()],\n [\"evmAddress\", fixEncoderSize(getBytesEncoder(), 20)],\n [\"chainId\", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n [\"linkedAt\", getI64Encoder()],\n ]);\n}\n\nexport function getEvmAddressLinkedDecoder(): Decoder<EvmAddressLinked> {\n return getStructDecoder([\n [\"agentMint\", getAddressDecoder()],\n [\"evmAddress\", fixDecoderSize(getBytesDecoder(), 20)],\n [\"chainId\", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n [\"linkedAt\", getI64Decoder()],\n ]);\n}\n\nexport function getEvmAddressLinkedCodec(): Codec<\n EvmAddressLinkedArgs,\n EvmAddressLinked\n> {\n return combineCodec(\n getEvmAddressLinkedEncoder(),\n getEvmAddressLinkedDecoder(),\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n addDecoderSizePrefix,\n addEncoderSizePrefix,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getUtf8Decoder,\n getUtf8Encoder,\n type Codec,\n type Decoder,\n type Encoder,\n} from \"@solana/kit\";\n\n/**\n * Metadata key-value pair for agent registration\n * Used as instruction argument (Anchor-compatible)\n */\nexport type MetadataEntry = { key: string; value: string };\n\nexport type MetadataEntryArgs = MetadataEntry;\n\nexport function getMetadataEntryEncoder(): Encoder<MetadataEntryArgs> {\n return getStructEncoder([\n [\"key\", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n [\"value\", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n ]);\n}\n\nexport function getMetadataEntryDecoder(): Decoder<MetadataEntry> {\n return getStructDecoder([\n [\"key\", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n [\"value\", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n ]);\n}\n\nexport function getMetadataEntryCodec(): Codec<\n MetadataEntryArgs,\n MetadataEntry\n> {\n return combineCodec(getMetadataEntryEncoder(), getMetadataEntryDecoder());\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU16Decoder,\n getU16Encoder,\n getU8Decoder,\n getU8Encoder,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n} from \"@solana/kit\";\n\nexport type PackedAddressTreeInfo = {\n addressMerkleTreePubkeyIndex: number;\n addressQueuePubkeyIndex: number;\n rootIndex: number;\n};\n\nexport type PackedAddressTreeInfoArgs = PackedAddressTreeInfo;\n\nexport function getPackedAddressTreeInfoEncoder(): FixedSizeEncoder<PackedAddressTreeInfoArgs> {\n return getStructEncoder([\n [\"addressMerkleTreePubkeyIndex\", getU8Encoder()],\n [\"addressQueuePubkeyIndex\", getU8Encoder()],\n [\"rootIndex\", getU16Encoder()],\n ]);\n}\n\nexport function getPackedAddressTreeInfoDecoder(): FixedSizeDecoder<PackedAddressTreeInfo> {\n return getStructDecoder([\n [\"addressMerkleTreePubkeyIndex\", getU8Decoder()],\n [\"addressQueuePubkeyIndex\", getU8Decoder()],\n [\"rootIndex\", getU16Decoder()],\n ]);\n}\n\nexport function getPackedAddressTreeInfoCodec(): FixedSizeCodec<\n PackedAddressTreeInfoArgs,\n PackedAddressTreeInfo\n> {\n return combineCodec(\n getPackedAddressTreeInfoEncoder(),\n getPackedAddressTreeInfoDecoder(),\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getBooleanDecoder,\n getBooleanEncoder,\n getStructDecoder,\n getStructEncoder,\n getU16Decoder,\n getU16Encoder,\n getU32Decoder,\n getU32Encoder,\n getU8Decoder,\n getU8Encoder,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n} from \"@solana/kit\";\n\nexport type PackedStateTreeInfo = {\n rootIndex: number;\n proveByIndex: boolean;\n merkleTreePubkeyIndex: number;\n queuePubkeyIndex: number;\n leafIndex: number;\n};\n\nexport type PackedStateTreeInfoArgs = PackedStateTreeInfo;\n\nexport function getPackedStateTreeInfoEncoder(): FixedSizeEncoder<PackedStateTreeInfoArgs> {\n return getStructEncoder([\n [\"rootIndex\", getU16Encoder()],\n [\"proveByIndex\", getBooleanEncoder()],\n [\"merkleTreePubkeyIndex\", getU8Encoder()],\n [\"queuePubkeyIndex\", getU8Encoder()],\n [\"leafIndex\", getU32Encoder()],\n ]);\n}\n\nexport function getPackedStateTreeInfoDecoder(): FixedSizeDecoder<PackedStateTreeInfo> {\n return getStructDecoder([\n [\"rootIndex\", getU16Decoder()],\n [\"proveByIndex\", getBooleanDecoder()],\n [\"merkleTreePubkeyIndex\", getU8Decoder()],\n [\"queuePubkeyIndex\", getU8Decoder()],\n [\"leafIndex\", getU32Decoder()],\n ]);\n}\n\nexport function getPackedStateTreeInfoCodec(): FixedSizeCodec<\n PackedStateTreeInfoArgs,\n PackedStateTreeInfo\n> {\n return combineCodec(\n getPackedStateTreeInfoEncoder(),\n getPackedStateTreeInfoDecoder(),\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Option,\n type OptionOrNullable,\n} from \"@solana/kit\";\n\nexport type RegistryAuthorityUpdated = {\n oldAuthority: Address;\n newAuthority: Option<Address>;\n};\n\nexport type RegistryAuthorityUpdatedArgs = {\n oldAuthority: Address;\n newAuthority: OptionOrNullable<Address>;\n};\n\nexport function getRegistryAuthorityUpdatedEncoder(): Encoder<RegistryAuthorityUpdatedArgs> {\n return getStructEncoder([\n [\"oldAuthority\", getAddressEncoder()],\n [\"newAuthority\", getOptionEncoder(getAddressEncoder())],\n ]);\n}\n\nexport function getRegistryAuthorityUpdatedDecoder(): Decoder<RegistryAuthorityUpdated> {\n return getStructDecoder([\n [\"oldAuthority\", getAddressDecoder()],\n [\"newAuthority\", getOptionDecoder(getAddressDecoder())],\n ]);\n}\n\nexport function getRegistryAuthorityUpdatedCodec(): Codec<\n RegistryAuthorityUpdatedArgs,\n RegistryAuthorityUpdated\n> {\n return combineCodec(\n getRegistryAuthorityUpdatedEncoder(),\n getRegistryAuthorityUpdatedDecoder(),\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getStructDecoder,\n getStructEncoder,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n} from \"@solana/kit\";\n\nexport type RegistryInitialized = { authority: Address; groupMint: Address };\n\nexport type RegistryInitializedArgs = RegistryInitialized;\n\nexport function getRegistryInitializedEncoder(): FixedSizeEncoder<RegistryInitializedArgs> {\n return getStructEncoder([\n [\"authority\", getAddressEncoder()],\n [\"groupMint\", getAddressEncoder()],\n ]);\n}\n\nexport function getRegistryInitializedDecoder(): FixedSizeDecoder<RegistryInitialized> {\n return getStructDecoder([\n [\"authority\", getAddressDecoder()],\n [\"groupMint\", getAddressDecoder()],\n ]);\n}\n\nexport function getRegistryInitializedCodec(): FixedSizeCodec<\n RegistryInitializedArgs,\n RegistryInitialized\n> {\n return combineCodec(\n getRegistryInitializedEncoder(),\n getRegistryInitializedDecoder(),\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n addDecoderSizePrefix,\n addEncoderSizePrefix,\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getBooleanDecoder,\n getBooleanEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getUtf8Decoder,\n getUtf8Encoder,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Option,\n type OptionOrNullable,\n} from \"@solana/kit\";\nimport {\n getSignatureModeDecoder,\n getSignatureModeEncoder,\n getStorageTypeDecoder,\n getStorageTypeEncoder,\n type SignatureMode,\n type SignatureModeArgs,\n type StorageType,\n type StorageTypeArgs,\n} from \".\";\n\n/** Emitted when a schema config is registered */\nexport type SchemaConfigRegistered = {\n /** SAS schema address */\n schema: Address;\n /** Signature mode (DualSignature, CounterpartySigned, or AgentOwnerSigned) */\n signatureMode: SignatureMode;\n /** Storage type (Compressed or Regular) */\n storageType: StorageType;\n /** Schema for delegation verification (None = owner only) */\n delegationSchema: Option<Address>;\n /** Whether attestations can be closed */\n closeable: boolean;\n /** Human-readable schema name (max 32 chars) */\n name: string;\n};\n\nexport type SchemaConfigRegisteredArgs = {\n /** SAS schema address */\n schema: Address;\n /** Signature mode (DualSignature, CounterpartySigned, or AgentOwnerSigned) */\n signatureMode: SignatureModeArgs;\n /** Storage type (Compressed or Regular) */\n storageType: StorageTypeArgs;\n /** Schema for delegation verification (None = owner only) */\n delegationSchema: OptionOrNullable<Address>;\n /** Whether attestations can be closed */\n closeable: boolean;\n /** Human-readable schema name (max 32 chars) */\n name: string;\n};\n\nexport function getSchemaConfigRegisteredEncoder(): Encoder<SchemaConfigRegisteredArgs> {\n return getStructEncoder([\n [\"schema\", getAddressEncoder()],\n [\"signatureMode\", getSignatureModeEncoder()],\n [\"storageType\", getStorageTypeEncoder()],\n [\"delegationSchema\", getOptionEncoder(getAddressEncoder())],\n [\"closeable\", getBooleanEncoder()],\n [\"name\", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n ]);\n}\n\nexport function getSchemaConfigRegisteredDecoder(): Decoder<SchemaConfigRegistered> {\n return getStructDecoder([\n [\"schema\", getAddressDecoder()],\n [\"signatureMode\", getSignatureModeDecoder()],\n [\"storageType\", getStorageTypeDecoder()],\n [\"delegationSchema\", getOptionDecoder(getAddressDecoder())],\n [\"closeable\", getBooleanDecoder()],\n [\"name\", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n ]);\n}\n\nexport function getSchemaConfigRegisteredCodec(): Codec<\n SchemaConfigRegisteredArgs,\n SchemaConfigRegistered\n> {\n return combineCodec(\n getSchemaConfigRegisteredEncoder(),\n getSchemaConfigRegisteredDecoder(),\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getEnumDecoder,\n getEnumEncoder,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n} from \"@solana/kit\";\n\n/** Signature mode determines how many signatures are required and who signs */\nexport enum SignatureMode {\n DualSignature,\n CounterpartySigned,\n AgentOwnerSigned,\n}\n\nexport type SignatureModeArgs = SignatureMode;\n\nexport function getSignatureModeEncoder(): FixedSizeEncoder<SignatureModeArgs> {\n return getEnumEncoder(SignatureMode);\n}\n\nexport function getSignatureModeDecoder(): FixedSizeDecoder<SignatureMode> {\n return getEnumDecoder(SignatureMode);\n}\n\nexport function getSignatureModeCodec(): FixedSizeCodec<\n SignatureModeArgs,\n SignatureMode\n> {\n return combineCodec(getSignatureModeEncoder(), getSignatureModeDecoder());\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getEnumDecoder,\n getEnumEncoder,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n} from \"@solana/kit\";\n\n/** Storage type determines where attestations are stored */\nexport enum StorageType {\n Compressed,\n Regular,\n}\n\nexport type StorageTypeArgs = StorageType;\n\nexport function getStorageTypeEncoder(): FixedSizeEncoder<StorageTypeArgs> {\n return getEnumEncoder(StorageType);\n}\n\nexport function getStorageTypeDecoder(): FixedSizeDecoder<StorageType> {\n return getEnumDecoder(StorageType);\n}\n\nexport function getStorageTypeCodec(): FixedSizeCodec<\n StorageTypeArgs,\n StorageType\n> {\n return combineCodec(getStorageTypeEncoder(), getStorageTypeDecoder());\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getOptionDecoder,\n getOptionEncoder,\n getTupleDecoder,\n getTupleEncoder,\n type Codec,\n type Decoder,\n type Encoder,\n type Option,\n type OptionOrNullable,\n} from \"@solana/kit\";\nimport {\n getCompressedProofDecoder,\n getCompressedProofEncoder,\n type CompressedProof,\n type CompressedProofArgs,\n} from \".\";\n\nexport type ValidityProof = readonly [Option<CompressedProof>];\n\nexport type ValidityProofArgs = readonly [\n OptionOrNullable<CompressedProofArgs>,\n];\n\nexport function getValidityProofEncoder(): Encoder<ValidityProofArgs> {\n return getTupleEncoder([getOptionEncoder(getCompressedProofEncoder())]);\n}\n\nexport function getValidityProofDecoder(): Decoder<ValidityProof> {\n return getTupleDecoder([getOptionDecoder(getCompressedProofDecoder())]);\n}\n\nexport function getValidityProofCodec(): Codec<\n ValidityProofArgs,\n ValidityProof\n> {\n return combineCodec(getValidityProofEncoder(), getValidityProofDecoder());\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n addDecoderSizePrefix,\n addEncoderSizePrefix,\n assertAccountExists,\n assertAccountsExist,\n combineCodec,\n decodeAccount,\n fetchEncodedAccount,\n fetchEncodedAccounts,\n fixDecoderSize,\n fixEncoderSize,\n getAddressDecoder,\n getAddressEncoder,\n getBooleanDecoder,\n getBooleanEncoder,\n getBytesDecoder,\n getBytesEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getU8Decoder,\n getU8Encoder,\n getUtf8Decoder,\n getUtf8Encoder,\n transformEncoder,\n type Account,\n type Address,\n type Codec,\n type Decoder,\n type EncodedAccount,\n type Encoder,\n type FetchAccountConfig,\n type FetchAccountsConfig,\n type MaybeAccount,\n type MaybeEncodedAccount,\n type Option,\n type OptionOrNullable,\n type ReadonlyUint8Array,\n} from \"@solana/kit\";\nimport {\n getSignatureModeDecoder,\n getSignatureModeEncoder,\n getStorageTypeDecoder,\n getStorageTypeEncoder,\n type SignatureMode,\n type SignatureModeArgs,\n type StorageType,\n type StorageTypeArgs,\n} from \"../types\";\n\nexport const SCHEMA_CONFIG_DISCRIMINATOR = new Uint8Array([\n 211, 19, 105, 220, 186, 61, 182, 47,\n]);\n\nexport function getSchemaConfigDiscriminatorBytes() {\n return fixEncoderSize(getBytesEncoder(), 8).encode(\n SCHEMA_CONFIG_DISCRIMINATOR,\n );\n}\n\nexport type SchemaConfig = {\n discriminator: ReadonlyUint8Array;\n /** SAS schema address this config applies to */\n sasSchema: Address;\n /** Signature verification mode */\n signatureMode: SignatureMode;\n /** Storage backend type */\n storageType: StorageType;\n /**\n * Schema for delegation verification.\n * If Some: owner OR valid delegate can sign (AgentOwnerSigned mode).\n * If None: only owner can sign (or anyone for CounterpartySigned mode).\n */\n delegationSchema: Option<Address>;\n /** Whether attestations can be closed/nullified */\n closeable: boolean;\n /** Schema name for signing messages (max 32 chars) */\n name: string;\n /** PDA bump seed */\n bump: number;\n};\n\nexport type SchemaConfigArgs = {\n /** SAS schema address this config applies to */\n sasSchema: Address;\n /** Signature verification mode */\n signatureMode: SignatureModeArgs;\n /** Storage backend type */\n storageType: StorageTypeArgs;\n /**\n * Schema for delegation verification.\n * If Some: owner OR valid delegate can sign (AgentOwnerSigned mode).\n * If None: only owner can sign (or anyone for CounterpartySigned mode).\n */\n delegationSchema: OptionOrNullable<Address>;\n /** Whether attestations can be closed/nullified */\n closeable: boolean;\n /** Schema name for signing messages (max 32 chars) */\n name: string;\n /** PDA bump seed */\n bump: number;\n};\n\n/** Gets the encoder for {@link SchemaConfigArgs} account data. */\nexport function getSchemaConfigEncoder(): Encoder<SchemaConfigArgs> {\n return transformEncoder(\n getStructEncoder([\n [\"discriminator\", fixEncoderSize(getBytesEncoder(), 8)],\n [\"sasSchema\", getAddressEncoder()],\n [\"signatureMode\", getSignatureModeEncoder()],\n [\"storageType\", getStorageTypeEncoder()],\n [\"delegationSchema\", getOptionEncoder(getAddressEncoder())],\n [\"closeable\", getBooleanEncoder()],\n [\"name\", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n [\"bump\", getU8Encoder()],\n ]),\n (value) => ({ ...value, discriminator: SCHEMA_CONFIG_DISCRIMINATOR }),\n );\n}\n\n/** Gets the decoder for {@link SchemaConfig} account data. */\nexport function getSchemaConfigDecoder(): Decoder<SchemaConfig> {\n return getStructDecoder([\n [\"discriminator\", fixDecoderSize(getBytesDecoder(), 8)],\n [\"sasSchema\", getAddressDecoder()],\n [\"signatureMode\", getSignatureModeDecoder()],\n [\"storageType\", getStorageTypeDecoder()],\n [\"delegationSchema\", getOptionDecoder(getAddressDecoder())],\n [\"closeable\", getBooleanDecoder()],\n [\"name\", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n [\"bump\", getU8Decoder()],\n ]);\n}\n\n/** Gets the codec for {@link SchemaConfig} account data. */\nexport function getSchemaConfigCodec(): Codec<SchemaConfigArgs, SchemaConfig> {\n return combineCodec(getSchemaConfigEncoder(), getSchemaConfigDecoder());\n}\n\nexport function decodeSchemaConfig<TAddress extends string = string>(\n encodedAccount: EncodedAccount<TAddress>,\n): Account<SchemaConfig, TAddress>;\nexport function decodeSchemaConfig<TAddress extends string = string>(\n encodedAccount: MaybeEncodedAccount<TAddress>,\n): MaybeAccount<SchemaConfig, TAddress>;\nexport function decodeSchemaConfig<TAddress extends string = string>(\n encodedAccount: EncodedAccount<TAddress> | MaybeEncodedAccount<TAddress>,\n): Account<SchemaConfig, TAddress> | MaybeAccount<SchemaConfig, TAddress> {\n return decodeAccount(\n encodedAccount as MaybeEncodedAccount<TAddress>,\n getSchemaConfigDecoder(),\n );\n}\n\nexport async function fetchSchemaConfig<TAddress extends string = string>(\n rpc: Parameters<typeof fetchEncodedAccount>[0],\n address: Address<TAddress>,\n config?: FetchAccountConfig,\n): Promise<Account<SchemaConfig, TAddress>> {\n const maybeAccount = await fetchMaybeSchemaConfig(rpc, address, config);\n assertAccountExists(maybeAccount);\n return maybeAccount;\n}\n\nexport async function fetchMaybeSchemaConfig<TAddress extends string = string>(\n rpc: Parameters<typeof fetchEncodedAccount>[0],\n address: Address<TAddress>,\n config?: FetchAccountConfig,\n): Promise<MaybeAccount<SchemaConfig, TAddress>> {\n const maybeAccount = await fetchEncodedAccount(rpc, address, config);\n return decodeSchemaConfig(maybeAccount);\n}\n\nexport async function fetchAllSchemaConfig(\n rpc: Parameters<typeof fetchEncodedAccounts>[0],\n addresses: Array<Address>,\n config?: FetchAccountsConfig,\n): Promise<Account<SchemaConfig>[]> {\n const maybeAccounts = await fetchAllMaybeSchemaConfig(rpc, addresses, config);\n assertAccountsExist(maybeAccounts);\n return maybeAccounts;\n}\n\nexport async function fetchAllMaybeSchemaConfig(\n rpc: Parameters<typeof fetchEncodedAccounts>[0],\n addresses: Array<Address>,\n config?: FetchAccountsConfig,\n): Promise<MaybeAccount<SchemaConfig>[]> {\n const maybeAccounts = await fetchEncodedAccounts(rpc, addresses, config);\n return maybeAccounts.map((maybeAccount) => decodeSchemaConfig(maybeAccount));\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n isProgramDerivedAddress,\n isTransactionSigner as kitIsTransactionSigner,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type ProgramDerivedAddress,\n type TransactionSigner,\n upgradeRoleToSigner,\n} from \"@solana/kit\";\n\n/**\n * Asserts that the given value is not null or undefined.\n * @internal\n */\nexport function expectSome<T>(value: T | null | undefined): T {\n if (value === null || value === undefined) {\n throw new Error(\"Expected a value but received null or undefined.\");\n }\n return value;\n}\n\n/**\n * Asserts that the given value is a PublicKey.\n * @internal\n */\nexport function expectAddress<T extends string = string>(\n value:\n | Address<T>\n | ProgramDerivedAddress<T>\n | TransactionSigner<T>\n | null\n | undefined,\n): Address<T> {\n if (!value) {\n throw new Error(\"Expected a Address.\");\n }\n if (typeof value === \"object\" && \"address\" in value) {\n return value.address;\n }\n if (Array.isArray(value)) {\n return value[0] as Address<T>;\n }\n return value as Address<T>;\n}\n\n/**\n * Asserts that the given value is a PDA.\n * @internal\n */\nexport function expectProgramDerivedAddress<T extends string = string>(\n value:\n | Address<T>\n | ProgramDerivedAddress<T>\n | TransactionSigner<T>\n | null\n | undefined,\n): ProgramDerivedAddress<T> {\n if (!value || !Array.isArray(value) || !isProgramDerivedAddress(value)) {\n throw new Error(\"Expected a ProgramDerivedAddress.\");\n }\n return value;\n}\n\n/**\n * Asserts that the given value is a TransactionSigner.\n * @internal\n */\nexport function expectTransactionSigner<T extends string = string>(\n value:\n | Address<T>\n | ProgramDerivedAddress<T>\n | TransactionSigner<T>\n | null\n | undefined,\n): TransactionSigner<T> {\n if (!value || !isTransactionSigner(value)) {\n throw new Error(\"Expected a TransactionSigner.\");\n }\n return value;\n}\n\n/**\n * Defines an instruction account to resolve.\n * @internal\n */\nexport type ResolvedAccount<\n T extends string = string,\n U extends\n | Address<T>\n | ProgramDerivedAddress<T>\n | TransactionSigner<T>\n | null =\n | Address<T>\n | ProgramDerivedAddress<T>\n | TransactionSigner<T>\n | null,\n> = {\n isWritable: boolean;\n value: U;\n};\n\n/**\n * Defines an instruction that stores additional bytes on-chain.\n * @internal\n */\nexport type InstructionWithByteDelta = {\n byteDelta: number;\n};\n\n/**\n * Get account metas and signers from resolved accounts.\n * @internal\n */\nexport function getAccountMetaFactory(\n programAddress: Address,\n optionalAccountStrategy: \"omitted\" | \"programId\",\n) {\n return (\n account: ResolvedAccount,\n ): AccountMeta | AccountSignerMeta | undefined => {\n if (!account.value) {\n if (optionalAccountStrategy === \"omitted\") return;\n return Object.freeze({\n address: programAddress,\n role: AccountRole.READONLY,\n });\n }\n\n const writableRole = account.isWritable\n ? AccountRole.WRITABLE\n : AccountRole.READONLY;\n return Object.freeze({\n address: expectAddress(account.value),\n role: isTransactionSigner(account.value)\n ? upgradeRoleToSigner(writableRole)\n : writableRole,\n ...(isTransactionSigner(account.value) ? { signer: account.value } : {}),\n });\n };\n}\n\nexport function isTransactionSigner<TAddress extends string = string>(\n value:\n | Address<TAddress>\n | ProgramDerivedAddress<TAddress>\n | TransactionSigner<TAddress>,\n): value is TransactionSigner<TAddress> {\n return (\n !!value &&\n typeof value === \"object\" &&\n \"address\" in value &&\n kitIsTransactionSigner(value)\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n addDecoderSizePrefix,\n addEncoderSizePrefix,\n combineCodec,\n fixDecoderSize,\n fixEncoderSize,\n getAddressDecoder,\n getAddressEncoder,\n getBytesDecoder,\n getBytesEncoder,\n getProgramDerivedAddress,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableSignerAccount,\n} from \"@solana/kit\";\nimport { SATI_PROGRAM_ADDRESS } from \"../programs\";\nimport { getAccountMetaFactory, type ResolvedAccount } from \"../shared\";\nimport {\n getCompressedAccountMetaDecoder,\n getCompressedAccountMetaEncoder,\n getValidityProofDecoder,\n getValidityProofEncoder,\n type CompressedAccountMeta,\n type CompressedAccountMetaArgs,\n type ValidityProof,\n type ValidityProofArgs,\n} from \"../types\";\n\nexport const CLOSE_COMPRESSED_ATTESTATION_DISCRIMINATOR = new Uint8Array([\n 80, 7, 19, 206, 138, 158, 92, 24,\n]);\n\nexport function getCloseCompressedAttestationDiscriminatorBytes() {\n return fixEncoderSize(getBytesEncoder(), 8).encode(\n CLOSE_COMPRESSED_ATTESTATION_DISCRIMINATOR,\n );\n}\n\nexport type CloseCompressedAttestationInstruction<\n TProgram extends string = typeof SATI_PROGRAM_ADDRESS,\n TAccountSigner extends string | AccountMeta<string> = string,\n TAccountSchemaConfig extends string | AccountMeta<string> = string,\n TAccountAgentAta extends string | AccountMeta<string> = string,\n TAccountTokenProgram extends string | AccountMeta<string> = string,\n TAccountAgentMint extends string | AccountMeta<string> = string,\n TAccountEventAuthority extends string | AccountMeta<string> = string,\n TAccountProgram extends string | AccountMeta<string> = string,\n TRemainingAccounts extends readonly AccountMeta<string>[] = [],\n> = Instruction<TProgram> &\n InstructionWithData<ReadonlyUint8Array> &\n InstructionWithAccounts<\n [\n TAccountSigner extends string\n ? WritableSignerAccount<TAccountSigner> &\n AccountSignerMeta<TAccountSigner>\n : TAccountSigner,\n TAccountSchemaConfig extends string\n ? ReadonlyAccount<TAccountSchemaConfig>\n : TAccountSchemaConfig,\n TAccountAgentAta extends string\n ? ReadonlyAccount<TAccountAgentAta>\n : TAccountAgentAta,\n TAccountTokenProgram extends string\n ? ReadonlyAccount<TAccountTokenProgram>\n : TAccountTokenProgram,\n TAccountAgentMint extends string\n ? ReadonlyAccount<TAccountAgentMint>\n : TAccountAgentMint,\n TAccountEventAuthority extends string\n ? ReadonlyAccount<TAccountEventAuthority>\n : TAccountEventAuthority,\n TAccountProgram extends string\n ? ReadonlyAccount<TAccountProgram>\n : TAccountProgram,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type CloseCompressedAttestationInstructionData = {\n discriminator: ReadonlyUint8Array;\n /** Current attestation data (for hash verification) */\n currentData: ReadonlyUint8Array;\n /** Number of signatures in the attestation */\n numSignatures: number;\n /** First signature (required) */\n signature1: ReadonlyUint8Array;\n /** Second signature (zeroed for single-signature modes) */\n signature2: ReadonlyUint8Array;\n /** The compressed account address being closed (for event emission) */\n address: Address;\n /** Light Protocol validity proof */\n proof: ValidityProof;\n /** Light Protocol compressed account metadata */\n accountMeta: CompressedAccountMeta;\n};\n\nexport type CloseCompressedAttestationInstructionDataArgs = {\n /** Current attestation data (for hash verification) */\n currentData: ReadonlyUint8Array;\n /** Number of signatures in the attestation */\n numSignatures: number;\n /** First signature (required) */\n signature1: ReadonlyUint8Array;\n /** Second signature (zeroed for single-signature modes) */\n signature2: ReadonlyUint8Array;\n /** The compressed account address being closed (for event emission) */\n address: Address;\n /** Light Protocol validity proof */\n proof: ValidityProofArgs;\n /** Light Protocol compressed account metadata */\n accountMeta: CompressedAccountMetaArgs;\n};\n\nexport function getCloseCompressedAttestationInstructionDataEncoder(): Encoder<CloseCompressedAttestationInstructionDataArgs> {\n return transformEncoder(\n getStructEncoder([\n [\"discriminator\", fixEncoderSize(getBytesEncoder(), 8)],\n [\"currentData\", addEncoderSizePrefix(getBytesEncoder(), getU32Encoder())],\n [\"numSignatures\", getU8Encoder()],\n [\"signature1\", fixEncoderSize(getBytesEncoder(), 64)],\n [\"signature2\", fixEncoderSize(getBytesEncoder(), 64)],\n [\"address\", getAddressEncoder()],\n [\"proof\", getValidityProofEncoder()],\n [\"accountMeta\", getCompressedAccountMetaEncoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: CLOSE_COMPRESSED_ATTESTATION_DISCRIMINATOR,\n }),\n );\n}\n\nexport function getCloseCompressedAttestationInstructionDataDecoder(): Decoder<CloseCompressedAttestationInstructionData> {\n return getStructDecoder([\n [\"discriminator\", fixDecoderSize(getBytesDecoder(), 8)],\n [\"currentData\", addDecoderSizePrefix(getBytesDecoder(), getU32Decoder())],\n [\"numSignatures\", getU8Decoder()],\n [\"signature1\", fixDecoderSize(getBytesDecoder(), 64)],\n [\"signature2\", fixDecoderSize(getBytesDecoder(), 64)],\n [\"address\", getAddressDecoder()],\n [\"proof\", getValidityProofDecoder()],\n [\"accountMeta\", getCompressedAccountMetaDecoder()],\n ]);\n}\n\nexport function getCloseCompressedAttestationInstructionDataCodec(): Codec<\n CloseCompressedAttestationInstructionDataArgs,\n CloseCompressedAttestationInstructionData\n> {\n return combineCodec(\n getCloseCompressedAttestationInstructionDataEncoder(),\n getCloseCompressedAttestationInstructionDataDecoder(),\n );\n}\n\nexport type CloseCompressedAttestationAsyncInput<\n TAccountSigner extends string = string,\n TAccountSchemaConfig extends string = string,\n TAccountAgentAta extends string = string,\n TAccountTokenProgram extends string = string,\n TAccountAgentMint extends string = string,\n TAccountEventAuthority extends string = string,\n TAccountProgram extends string = string,\n> = {\n /** Signer must be either the agent (NFT owner via ATA) or the counterparty */\n signer: TransactionSigner<TAccountSigner>;\n /** Schema config PDA */\n schemaConfig: Address<TAccountSchemaConfig>;\n /**\n * Optional: Agent's ATA (required if signer is NFT owner, not counterparty).\n * If provided, must hold the agent NFT (mint matches agent_mint from data).\n */\n agentAta?: Address<TAccountAgentAta>;\n /** Token-2022 program for ATA verification (optional, required with agent_ata) */\n tokenProgram?: Address<TAccountTokenProgram>;\n /**\n * Agent mint (Token-2022 NFT) for Solscan indexing.\n * Must match agent_mint in attestation data (bytes 33-64).\n */\n agentMint: Address<TAccountAgentMint>;\n eventAuthority?: Address<TAccountEventAuthority>;\n program: Address<TAccountProgram>;\n currentData: CloseCompressedAttestationInstructionDataArgs[\"currentData\"];\n numSignatures: CloseCompressedAttestationInstructionDataArgs[\"numSignatures\"];\n signature1: CloseCompressedAttestationInstructionDataArgs[\"signature1\"];\n signature2: CloseCompressedAttestationInstructionDataArgs[\"signature2\"];\n address: CloseCompressedAttestationInstructionDataArgs[\"address\"];\n proof: CloseCompressedAttestationInstructionDataArgs[\"proof\"];\n accountMeta: CloseCompressedAttestationInstructionDataArgs[\"accountMeta\"];\n};\n\nexport async function getCloseCompressedAttestationInstructionAsync<\n TAccountSigner extends string,\n TAccountSchemaConfig extends string,\n TAccountAgentAta extends string,\n TAccountTokenProgram extends string,\n TAccountAgentMint extends string,\n TAccountEventAuthority extends string,\n TAccountProgram extends string,\n TProgramAddress extends Address = typeof SATI_PROGRAM_ADDRESS,\n>(\n input: CloseCompressedAttestationAsyncInput<\n TAccountSigner,\n TAccountSchemaConfig,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountEventAuthority,\n TAccountProgram\n >,\n config?: { programAddress?: TProgramAddress },\n): Promise<\n CloseCompressedAttestationInstruction<\n TProgramAddress,\n TAccountSigner,\n TAccountSchemaConfig,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountEventAuthority,\n TAccountProgram\n >\n> {\n // Program address.\n const programAddress = config?.programAddress ?? SATI_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n signer: { value: input.signer ?? null, isWritable: true },\n schemaConfig: { value: input.schemaConfig ?? null, isWritable: false },\n agentAta: { value: input.agentAta ?? null, isWritable: false },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n agentMint: { value: input.agentMint ?? null, isWritable: false },\n eventAuthority: { value: input.eventAuthority ?? null, isWritable: false },\n program: { value: input.program ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.eventAuthority.value) {\n accounts.eventAuthority.value = await getProgramDerivedAddress({\n programAddress,\n seeds: [\n getBytesEncoder().encode(\n new Uint8Array([\n 95, 95, 101, 118, 101, 110, 116, 95, 97, 117, 116, 104, 111, 114,\n 105, 116, 121,\n ]),\n ),\n ],\n });\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, \"programId\");\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.signer),\n getAccountMeta(accounts.schemaConfig),\n getAccountMeta(accounts.agentAta),\n getAccountMeta(accounts.tokenProgram),\n getAccountMeta(accounts.agentMint),\n getAccountMeta(accounts.eventAuthority),\n getAccountMeta(accounts.program),\n ],\n data: getCloseCompressedAttestationInstructionDataEncoder().encode(\n args as CloseCompressedAttestationInstructionDataArgs,\n ),\n programAddress,\n } as CloseCompressedAttestationInstruction<\n TProgramAddress,\n TAccountSigner,\n TAccountSchemaConfig,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountEventAuthority,\n TAccountProgram\n >);\n}\n\nexport type CloseCompressedAttestationInput<\n TAccountSigner extends string = string,\n TAccountSchemaConfig extends string = string,\n TAccountAgentAta extends string = string,\n TAccountTokenProgram extends string = string,\n TAccountAgentMint extends string = string,\n TAccountEventAuthority extends string = string,\n TAccountProgram extends string = string,\n> = {\n /** Signer must be either the agent (NFT owner via ATA) or the counterparty */\n signer: TransactionSigner<TAccountSigner>;\n /** Schema config PDA */\n schemaConfig: Address<TAccountSchemaConfig>;\n /**\n * Optional: Agent's ATA (required if signer is NFT owner, not counterparty).\n * If provided, must hold the agent NFT (mint matches agent_mint from data).\n */\n agentAta?: Address<TAccountAgentAta>;\n /** Token-2022 program for ATA verification (optional, required with agent_ata) */\n tokenProgram?: Address<TAccountTokenProgram>;\n /**\n * Agent mint (Token-2022 NFT) for Solscan indexing.\n * Must match agent_mint in attestation data (bytes 33-64).\n */\n agentMint: Address<TAccountAgentMint>;\n eventAuthority: Address<TAccountEventAuthority>;\n program: Address<TAccountProgram>;\n currentData: CloseCompressedAttestationInstructionDataArgs[\"currentData\"];\n numSignatures: CloseCompressedAttestationInstructionDataArgs[\"numSignatures\"];\n signature1: CloseCompressedAttestationInstructionDataArgs[\"signature1\"];\n signature2: CloseCompressedAttestationInstructionDataArgs[\"signature2\"];\n address: CloseCompressedAttestationInstructionDataArgs[\"address\"];\n proof: CloseCompressedAttestationInstructionDataArgs[\"proof\"];\n accountMeta: CloseCompressedAttestationInstructionDataArgs[\"accountMeta\"];\n};\n\nexport function getCloseCompressedAttestationInstruction<\n TAccountSigner extends string,\n TAccountSchemaConfig extends string,\n TAccountAgentAta extends string,\n TAccountTokenProgram extends string,\n TAccountAgentMint extends string,\n TAccountEventAuthority extends string,\n TAccountProgram extends string,\n TProgramAddress extends Address = typeof SATI_PROGRAM_ADDRESS,\n>(\n input: CloseCompressedAttestationInput<\n TAccountSigner,\n TAccountSchemaConfig,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountEventAuthority,\n TAccountProgram\n >,\n config?: { programAddress?: TProgramAddress },\n): CloseCompressedAttestationInstruction<\n TProgramAddress,\n TAccountSigner,\n TAccountSchemaConfig,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountEventAuthority,\n TAccountProgram\n> {\n // Program address.\n const programAddress = config?.programAddress ?? SATI_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n signer: { value: input.signer ?? null, isWritable: true },\n schemaConfig: { value: input.schemaConfig ?? null, isWritable: false },\n agentAta: { value: input.agentAta ?? null, isWritable: false },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n agentMint: { value: input.agentMint ?? null, isWritable: false },\n eventAuthority: { value: input.eventAuthority ?? null, isWritable: false },\n program: { value: input.program ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, \"programId\");\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.signer),\n getAccountMeta(accounts.schemaConfig),\n getAccountMeta(accounts.agentAta),\n getAccountMeta(accounts.tokenProgram),\n getAccountMeta(accounts.agentMint),\n getAccountMeta(accounts.eventAuthority),\n getAccountMeta(accounts.program),\n ],\n data: getCloseCompressedAttestationInstructionDataEncoder().encode(\n args as CloseCompressedAttestationInstructionDataArgs,\n ),\n programAddress,\n } as CloseCompressedAttestationInstruction<\n TProgramAddress,\n TAccountSigner,\n TAccountSchemaConfig,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountEventAuthority,\n TAccountProgram\n >);\n}\n\nexport type ParsedCloseCompressedAttestationInstruction<\n TProgram extends string = typeof SATI_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address<TProgram>;\n accounts: {\n /** Signer must be either the agent (NFT owner via ATA) or the counterparty */\n signer: TAccountMetas[0];\n /** Schema config PDA */\n schemaConfig: TAccountMetas[1];\n /**\n * Optional: Agent's ATA (required if signer is NFT owner, not counterparty).\n * If provided, must hold the agent NFT (mint matches agent_mint from data).\n */\n agentAta?: TAccountMetas[2] | undefined;\n /** Token-2022 program for ATA verification (optional, required with agent_ata) */\n tokenProgram?: TAccountMetas[3] | undefined;\n /**\n * Agent mint (Token-2022 NFT) for Solscan indexing.\n * Must match agent_mint in attestation data (bytes 33-64).\n */\n agentMint: TAccountMetas[4];\n eventAuthority: TAccountMetas[5];\n program: TAccountMetas[6];\n };\n data: CloseCompressedAttestationInstructionData;\n};\n\nexport function parseCloseCompressedAttestationInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction<TProgram> &\n InstructionWithAccounts<TAccountMetas> &\n InstructionWithData<ReadonlyUint8Array>,\n): ParsedCloseCompressedAttestationInstruction<TProgram, TAccountMetas> {\n if (instruction.accounts.length < 7) {\n // TODO: Coded error.\n throw new Error(\"Not enough accounts\");\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n const getNextOptionalAccount = () => {\n const accountMeta = getNextAccount();\n return accountMeta.address === SATI_PROGRAM_ADDRESS\n ? undefined\n : accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n signer: getNextAccount(),\n schemaConfig: getNextAccount(),\n agentAta: getNextOptionalAccount(),\n tokenProgram: getNextOptionalAccount(),\n agentMint: getNextAccount(),\n eventAuthority: getNextAccount(),\n program: getNextAccount(),\n },\n data: getCloseCompressedAttestationInstructionDataDecoder().decode(\n instruction.data,\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n fixDecoderSize,\n fixEncoderSize,\n getBytesDecoder,\n getBytesEncoder,\n getProgramDerivedAddress,\n getStructDecoder,\n getStructEncoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n type WritableSignerAccount,\n} from \"@solana/kit\";\nimport { SATI_PROGRAM_ADDRESS } from \"../programs\";\nimport { getAccountMetaFactory, type ResolvedAccount } from \"../shared\";\n\nexport const CLOSE_REGULAR_ATTESTATION_DISCRIMINATOR = new Uint8Array([\n 243, 10, 146, 163, 169, 75, 64, 28,\n]);\n\nexport function getCloseRegularAttestationDiscriminatorBytes() {\n return fixEncoderSize(getBytesEncoder(), 8).encode(\n CLOSE_REGULAR_ATTESTATION_DISCRIMINATOR,\n );\n}\n\nexport type CloseRegularAttestationInstruction<\n TProgram extends string = typeof SATI_PROGRAM_ADDRESS,\n TAccountPayer extends string | AccountMeta<string> = string,\n TAccountSigner extends string | AccountMeta<string> = string,\n TAccountSchemaConfig extends string | AccountMeta<string> = string,\n TAccountSatiPda extends string | AccountMeta<string> = string,\n TAccountSatiCredential extends string | AccountMeta<string> = string,\n TAccountAttestation extends string | AccountMeta<string> = string,\n TAccountSasProgram extends string | AccountMeta<string> =\n \"22zoJMtdu4tQc2PzL74ZUT7FrwgB1Udec8DdW4yw4BdG\",\n TAccountAgentAta extends string | AccountMeta<string> = string,\n TAccountTokenProgram extends string | AccountMeta<string> = string,\n TAccountAgentMint extends string | AccountMeta<string> = string,\n TAccountSasEventAuthority extends string | AccountMeta<string> = string,\n TAccountSystemProgram extends string | AccountMeta<string> =\n \"11111111111111111111111111111111\",\n TAccountEventAuthority extends string | AccountMeta<string> = string,\n TAccountProgram extends string | AccountMeta<string> = string,\n TRemainingAccounts extends readonly AccountMeta<string>[] = [],\n> = Instruction<TProgram> &\n InstructionWithData<ReadonlyUint8Array> &\n InstructionWithAccounts<\n [\n TAccountPayer extends string\n ? WritableSignerAccount<TAccountPayer> &\n AccountSignerMeta<TAccountPayer>\n : TAccountPayer,\n TAccountSigner extends string\n ? ReadonlySignerAccount<TAccountSigner> &\n AccountSignerMeta<TAccountSigner>\n : TAccountSigner,\n TAccountSchemaConfig extends string\n ? ReadonlyAccount<TAccountSchemaConfig>\n : TAccountSchemaConfig,\n TAccountSatiPda extends string\n ? ReadonlyAccount<TAccountSatiPda>\n : TAccountSatiPda,\n TAccountSatiCredential extends string\n ? ReadonlyAccount<TAccountSatiCredential>\n : TAccountSatiCredential,\n TAccountAttestation extends string\n ? WritableAccount<TAccountAttestation>\n : TAccountAttestation,\n TAccountSasProgram extends string\n ? ReadonlyAccount<TAccountSasProgram>\n : TAccountSasProgram,\n TAccountAgentAta extends string\n ? ReadonlyAccount<TAccountAgentAta>\n : TAccountAgentAta,\n TAccountTokenProgram extends string\n ? ReadonlyAccount<TAccountTokenProgram>\n : TAccountTokenProgram,\n TAccountAgentMint extends string\n ? ReadonlyAccount<TAccountAgentMint>\n : TAccountAgentMint,\n TAccountSasEventAuthority extends string\n ? ReadonlyAccount<TAccountSasEventAuthority>\n : TAccountSasEventAuthority,\n TAccountSystemProgram extends string\n ? ReadonlyAccount<TAccountSystemProgram>\n : TAccountSystemProgram,\n TAccountEventAuthority extends string\n ? ReadonlyAccount<TAccountEventAuthority>\n : TAccountEventAuthority,\n TAccountProgram extends string\n ? ReadonlyAccount<TAccountProgram>\n : TAccountProgram,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type CloseRegularAttestationInstructionData = {\n discriminator: ReadonlyUint8Array;\n};\n\nexport type CloseRegularAttestationInstructionDataArgs = {};\n\nexport function getCloseRegularAttestationInstructionDataEncoder(): FixedSizeEncoder<CloseRegularAttestationInstructionDataArgs> {\n return transformEncoder(\n getStructEncoder([[\"discriminator\", fixEncoderSize(getBytesEncoder(), 8)]]),\n (value) => ({\n ...value,\n discriminator: CLOSE_REGULAR_ATTESTATION_DISCRIMINATOR,\n }),\n );\n}\n\nexport function getCloseRegularAttestationInstructionDataDecoder(): FixedSizeDecoder<CloseRegularAttestationInstructionData> {\n return getStructDecoder([\n [\"discriminator\", fixDecoderSize(getBytesDecoder(), 8)],\n ]);\n}\n\nexport function getCloseRegularAttestationInstructionDataCodec(): FixedSizeCodec<\n CloseRegularAttestationInstructionDataArgs,\n CloseRegularAttestationInstructionData\n> {\n return combineCodec(\n getCloseRegularAttestationInstructionDataEncoder(),\n getCloseRegularAttestationInstructionDataDecoder(),\n );\n}\n\nexport type CloseRegularAttestationAsyncInput<\n TAccountPayer extends string = string,\n TAccountSigner extends string = string,\n TAccountSchemaConfig extends string = string,\n TAccountSatiPda extends string = string,\n TAccountSatiCredential extends string = string,\n TAccountAttestation extends string = string,\n TAccountSasProgram extends string = string,\n TAccountAgentAta extends string = string,\n TAccountTokenProgram extends string = string,\n TAccountAgentMint extends string = string,\n TAccountSasEventAuthority extends string = string,\n TAccountSystemProgram extends string = string,\n TAccountEventAuthority extends string = string,\n TAccountProgram extends string = string,\n> = {\n /** Payer receives rent back */\n payer: TransactionSigner<TAccountPayer>;\n /** Signer must be either the agent (NFT owner via ATA) or the counterparty */\n signer: TransactionSigner<TAccountSigner>;\n /** Schema config PDA */\n schemaConfig: Address<TAccountSchemaConfig>;\n /** SATI Attestation Program PDA - authorized signer on SAS credential */\n satiPda?: Address<TAccountSatiPda>;\n /** SATI SAS credential account */\n satiCredential: Address<TAccountSatiCredential>;\n /** Attestation account to be closed */\n attestation: Address<TAccountAttestation>;\n /** SAS program */\n sasProgram?: Address<TAccountSasProgram>;\n /**\n * Optional: Agent's ATA (required if signer is NFT owner, not counterparty).\n * If provided, must hold the agent NFT (mint matches agent_mint from data).\n */\n agentAta?: Address<TAccountAgentAta>;\n /** Token-2022 program for ATA verification (optional, required with agent_ata) */\n tokenProgram?: Address<TAccountTokenProgram>;\n /**\n * Agent mint (Token-2022 NFT) for Solscan indexing.\n * Must match agent_mint in attestation data (bytes 33-64).\n */\n agentMint: Address<TAccountAgentMint>;\n /** SAS event authority PDA (required for SAS close CPI event emission) */\n sasEventAuthority: Address<TAccountSasEventAuthority>;\n /** System program (required by SAS close instruction) */\n systemProgram?: Address<TAccountSystemProgram>;\n eventAuthority?: Address<TAccountEventAuthority>;\n program: Address<TAccountProgram>;\n};\n\nexport async function getCloseRegularAttestationInstructionAsync<\n TAccountPayer extends string,\n TAccountSigner extends string,\n TAccountSchemaConfig extends string,\n TAccountSatiPda extends string,\n TAccountSatiCredential extends string,\n TAccountAttestation extends string,\n TAccountSasProgram extends string,\n TAccountAgentAta extends string,\n TAccountTokenProgram extends string,\n TAccountAgentMint extends string,\n TAccountSasEventAuthority extends string,\n TAccountSystemProgram extends string,\n TAccountEventAuthority extends string,\n TAccountProgram extends string,\n TProgramAddress extends Address = typeof SATI_PROGRAM_ADDRESS,\n>(\n input: CloseRegularAttestationAsyncInput<\n TAccountPayer,\n TAccountSigner,\n TAccountSchemaConfig,\n TAccountSatiPda,\n TAccountSatiCredential,\n TAccountAttestation,\n TAccountSasProgram,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountSasEventAuthority,\n TAccountSystemProgram,\n TAccountEventAuthority,\n TAccountProgram\n >,\n config?: { programAddress?: TProgramAddress },\n): Promise<\n CloseRegularAttestationInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountSigner,\n TAccountSchemaConfig,\n TAccountSatiPda,\n TAccountSatiCredential,\n TAccountAttestation,\n TAccountSasProgram,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountSasEventAuthority,\n TAccountSystemProgram,\n TAccountEventAuthority,\n TAccountProgram\n >\n> {\n // Program address.\n const programAddress = config?.programAddress ?? SATI_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n signer: { value: input.signer ?? null, isWritable: false },\n schemaConfig: { value: input.schemaConfig ?? null, isWritable: false },\n satiPda: { value: input.satiPda ?? null, isWritable: false },\n satiCredential: { value: input.satiCredential ?? null, isWritable: false },\n attestation: { value: input.attestation ?? null, isWritable: true },\n sasProgram: { value: input.sasProgram ?? null, isWritable: false },\n agentAta: { value: input.agentAta ?? null, isWritable: false },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n agentMint: { value: input.agentMint ?? null, isWritable: false },\n sasEventAuthority: {\n value: input.sasEventAuthority ?? null,\n isWritable: false,\n },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n eventAuthority: { value: input.eventAuthority ?? null, isWritable: false },\n program: { value: input.program ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.satiPda.value) {\n accounts.satiPda.value = await getProgramDerivedAddress({\n programAddress,\n seeds: [\n getBytesEncoder().encode(\n new Uint8Array([\n 115, 97, 116, 105, 95, 97, 116, 116, 101, 115, 116, 97, 116, 105,\n 111, 110,\n ]),\n ),\n ],\n });\n }\n if (!accounts.sasProgram.value) {\n accounts.sasProgram.value =\n \"22zoJMtdu4tQc2PzL74ZUT7FrwgB1Udec8DdW4yw4BdG\" as Address<\"22zoJMtdu4tQc2PzL74ZUT7FrwgB1Udec8DdW4yw4BdG\">;\n }\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n \"11111111111111111111111111111111\" as Address<\"11111111111111111111111111111111\">;\n }\n if (!accounts.eventAuthority.value) {\n accounts.eventAuthority.value = await getProgramDerivedAddress({\n programAddress,\n seeds: [\n getBytesEncoder().encode(\n new Uint8Array([\n 95, 95, 101, 118, 101, 110, 116, 95, 97, 117, 116, 104, 111, 114,\n 105, 116, 121,\n ]),\n ),\n ],\n });\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, \"programId\");\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.signer),\n getAccountMeta(accounts.schemaConfig),\n getAccountMeta(accounts.satiPda),\n getAccountMeta(accounts.satiCredential),\n getAccountMeta(accounts.attestation),\n getAccountMeta(accounts.sasProgram),\n getAccountMeta(accounts.agentAta),\n getAccountMeta(accounts.tokenProgram),\n getAccountMeta(accounts.agentMint),\n getAccountMeta(accounts.sasEventAuthority),\n getAccountMeta(accounts.systemProgram),\n getAccountMeta(accounts.eventAuthority),\n getAccountMeta(accounts.program),\n ],\n data: getCloseRegularAttestationInstructionDataEncoder().encode({}),\n programAddress,\n } as CloseRegularAttestationInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountSigner,\n TAccountSchemaConfig,\n TAccountSatiPda,\n TAccountSatiCredential,\n TAccountAttestation,\n TAccountSasProgram,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountSasEventAuthority,\n TAccountSystemProgram,\n TAccountEventAuthority,\n TAccountProgram\n >);\n}\n\nexport type CloseRegularAttestationInput<\n TAccountPayer extends string = string,\n TAccountSigner extends string = string,\n TAccountSchemaConfig extends string = string,\n TAccountSatiPda extends string = string,\n TAccountSatiCredential extends string = string,\n TAccountAttestation extends string = string,\n TAccountSasProgram extends string = string,\n TAccountAgentAta extends string = string,\n TAccountTokenProgram extends string = string,\n TAccountAgentMint extends string = string,\n TAccountSasEventAuthority extends string = string,\n TAccountSystemProgram extends string = string,\n TAccountEventAuthority extends string = string,\n TAccountProgram extends string = string,\n> = {\n /** Payer receives rent back */\n payer: TransactionSigner<TAccountPayer>;\n /** Signer must be either the agent (NFT owner via ATA) or the counterparty */\n signer: TransactionSigner<TAccountSigner>;\n /** Schema config PDA */\n schemaConfig: Address<TAccountSchemaConfig>;\n /** SATI Attestation Program PDA - authorized signer on SAS credential */\n satiPda: Address<TAccountSatiPda>;\n /** SATI SAS credential account */\n satiCredential: Address<TAccountSatiCredential>;\n /** Attestation account to be closed */\n attestation: Address<TAccountAttestation>;\n /** SAS program */\n sasProgram?: Address<TAccountSasProgram>;\n /**\n * Optional: Agent's ATA (required if signer is NFT owner, not counterparty).\n * If provided, must hold the agent NFT (mint matches agent_mint from data).\n */\n agentAta?: Address<TAccountAgentAta>;\n /** Token-2022 program for ATA verification (optional, required with agent_ata) */\n tokenProgram?: Address<TAccountTokenProgram>;\n /**\n * Agent mint (Token-2022 NFT) for Solscan indexing.\n * Must match agent_mint in attestation data (bytes 33-64).\n */\n agentMint: Address<TAccountAgentMint>;\n /** SAS event authority PDA (required for SAS close CPI event emission) */\n sasEventAuthority: Address<TAccountSasEventAuthority>;\n /** System program (required by SAS close instruction) */\n systemProgram?: Address<TAccountSystemProgram>;\n eventAuthority: Address<TAccountEventAuthority>;\n program: Address<TAccountProgram>;\n};\n\nexport function getCloseRegularAttestationInstruction<\n TAccountPayer extends string,\n TAccountSigner extends string,\n TAccountSchemaConfig extends string,\n TAccountSatiPda extends string,\n TAccountSatiCredential extends string,\n TAccountAttestation extends string,\n TAccountSasProgram extends string,\n TAccountAgentAta extends string,\n TAccountTokenProgram extends string,\n TAccountAgentMint extends string,\n TAccountSasEventAuthority extends string,\n TAccountSystemProgram extends string,\n TAccountEventAuthority extends string,\n TAccountProgram extends string,\n TProgramAddress extends Address = typeof SATI_PROGRAM_ADDRESS,\n>(\n input: CloseRegularAttestationInput<\n TAccountPayer,\n TAccountSigner,\n TAccountSchemaConfig,\n TAccountSatiPda,\n TAccountSatiCredential,\n TAccountAttestation,\n TAccountSasProgram,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountSasEventAuthority,\n TAccountSystemProgram,\n TAccountEventAuthority,\n TAccountProgram\n >,\n config?: { programAddress?: TProgramAddress },\n): CloseRegularAttestationInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountSigner,\n TAccountSchemaConfig,\n TAccountSatiPda,\n TAccountSatiCredential,\n TAccountAttestation,\n TAccountSasProgram,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountSasEventAuthority,\n TAccountSystemProgram,\n TAccountEventAuthority,\n TAccountProgram\n> {\n // Program address.\n const programAddress = config?.programAddress ?? SATI_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n signer: { value: input.signer ?? null, isWritable: false },\n schemaConfig: { value: input.schemaConfig ?? null, isWritable: false },\n satiPda: { value: input.satiPda ?? null, isWritable: false },\n satiCredential: { value: input.satiCredential ?? null, isWritable: false },\n attestation: { value: input.attestation ?? null, isWritable: true },\n sasProgram: { value: input.sasProgram ?? null, isWritable: false },\n agentAta: { value: input.agentAta ?? null, isWritable: false },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n agentMint: { value: input.agentMint ?? null, isWritable: false },\n sasEventAuthority: {\n value: input.sasEventAuthority ?? null,\n isWritable: false,\n },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n eventAuthority: { value: input.eventAuthority ?? null, isWritable: false },\n program: { value: input.program ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.sasProgram.value) {\n accounts.sasProgram.value =\n \"22zoJMtdu4tQc2PzL74ZUT7FrwgB1Udec8DdW4yw4BdG\" as Address<\"22zoJMtdu4tQc2PzL74ZUT7FrwgB1Udec8DdW4yw4BdG\">;\n }\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n \"11111111111111111111111111111111\" as Address<\"11111111111111111111111111111111\">;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, \"programId\");\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.signer),\n getAccountMeta(accounts.schemaConfig),\n getAccountMeta(accounts.satiPda),\n getAccountMeta(accounts.satiCredential),\n getAccountMeta(accounts.attestation),\n getAccountMeta(accounts.sasProgram),\n getAccountMeta(accounts.agentAta),\n getAccountMeta(accounts.tokenProgram),\n getAccountMeta(accounts.agentMint),\n getAccountMeta(accounts.sasEventAuthority),\n getAccountMeta(accounts.systemProgram),\n getAccountMeta(accounts.eventAuthority),\n getAccountMeta(accounts.program),\n ],\n data: getCloseRegularAttestationInstructionDataEncoder().encode({}),\n programAddress,\n } as CloseRegularAttestationInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountSigner,\n TAccountSchemaConfig,\n TAccountSatiPda,\n TAccountSatiCredential,\n TAccountAttestation,\n TAccountSasProgram,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountSasEventAuthority,\n TAccountSystemProgram,\n TAccountEventAuthority,\n TAccountProgram\n >);\n}\n\nexport type ParsedCloseRegularAttestationInstruction<\n TProgram extends string = typeof SATI_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address<TProgram>;\n accounts: {\n /** Payer receives rent back */\n payer: TAccountMetas[0];\n /** Signer must be either the agent (NFT owner via ATA) or the counterparty */\n signer: TAccountMetas[1];\n /** Schema config PDA */\n schemaConfig: TAccountMetas[2];\n /** SATI Attestation Program PDA - authorized signer on SAS credential */\n satiPda: TAccountMetas[3];\n /** SATI SAS credential account */\n satiCredential: TAccountMetas[4];\n /** Attestation account to be closed */\n attestation: TAccountMetas[5];\n /** SAS program */\n sasProgram: TAccountMetas[6];\n /**\n * Optional: Agent's ATA (required if signer is NFT owner, not counterparty).\n * If provided, must hold the agent NFT (mint matches agent_mint from data).\n */\n agentAta?: TAccountMetas[7] | undefined;\n /** Token-2022 program for ATA verification (optional, required with agent_ata) */\n tokenProgram?: TAccountMetas[8] | undefined;\n /**\n * Agent mint (Token-2022 NFT) for Solscan indexing.\n * Must match agent_mint in attestation data (bytes 33-64).\n */\n agentMint: TAccountMetas[9];\n /** SAS event authority PDA (required for SAS close CPI event emission) */\n sasEventAuthority: TAccountMetas[10];\n /** System program (required by SAS close instruction) */\n systemProgram: TAccountMetas[11];\n eventAuthority: TAccountMetas[12];\n program: TAccountMetas[13];\n };\n data: CloseRegularAttestationInstructionData;\n};\n\nexport function parseCloseRegularAttestationInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction<TProgram> &\n InstructionWithAccounts<TAccountMetas> &\n InstructionWithData<ReadonlyUint8Array>,\n): ParsedCloseRegularAttestationInstruction<TProgram, TAccountMetas> {\n if (instruction.accounts.length < 14) {\n // TODO: Coded error.\n throw new Error(\"Not enough accounts\");\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n const getNextOptionalAccount = () => {\n const accountMeta = getNextAccount();\n return accountMeta.address === SATI_PROGRAM_ADDRESS\n ? undefined\n : accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n payer: getNextAccount(),\n signer: getNextAccount(),\n schemaConfig: getNextAccount(),\n satiPda: getNextAccount(),\n satiCredential: getNextAccount(),\n attestation: getNextAccount(),\n sasProgram: getNextAccount(),\n agentAta: getNextOptionalAccount(),\n tokenProgram: getNextOptionalAccount(),\n agentMint: getNextAccount(),\n sasEventAuthority: getNextAccount(),\n systemProgram: getNextAccount(),\n eventAuthority: getNextAccount(),\n program: getNextAccount(),\n },\n data: getCloseRegularAttestationInstructionDataDecoder().decode(\n instruction.data,\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n addDecoderSizePrefix,\n addEncoderSizePrefix,\n combineCodec,\n fixDecoderSize,\n fixEncoderSize,\n getBytesDecoder,\n getBytesEncoder,\n getProgramDerivedAddress,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableSignerAccount,\n} from \"@solana/kit\";\nimport { SATI_PROGRAM_ADDRESS } from \"../programs\";\nimport { getAccountMetaFactory, type ResolvedAccount } from \"../shared\";\nimport {\n getPackedAddressTreeInfoDecoder,\n getPackedAddressTreeInfoEncoder,\n getValidityProofDecoder,\n getValidityProofEncoder,\n type PackedAddressTreeInfo,\n type PackedAddressTreeInfoArgs,\n type ValidityProof,\n type ValidityProofArgs,\n} from \"../types\";\n\nexport const CREATE_COMPRESSED_ATTESTATION_DISCRIMINATOR = new Uint8Array([\n 204, 251, 61, 109, 25, 133, 237, 77,\n]);\n\nexport function getCreateCompressedAttestationDiscriminatorBytes() {\n return fixEncoderSize(getBytesEncoder(), 8).encode(\n CREATE_COMPRESSED_ATTESTATION_DISCRIMINATOR,\n );\n}\n\nexport type CreateCompressedAttestationInstruction<\n TProgram extends string = typeof SATI_PROGRAM_ADDRESS,\n TAccountPayer extends string | AccountMeta<string> = string,\n TAccountSchemaConfig extends string | AccountMeta<string> = string,\n TAccountInstructionsSysvar extends string | AccountMeta<string> =\n \"Sysvar1nstructions1111111111111111111111111\",\n TAccountAgentAta extends string | AccountMeta<string> = string,\n TAccountTokenProgram extends string | AccountMeta<string> = string,\n TAccountAgentMint extends string | AccountMeta<string> = string,\n TAccountDelegationAttestation extends string | AccountMeta<string> = string,\n TAccountSatiCredential extends string | AccountMeta<string> = string,\n TAccountClock extends string | AccountMeta<string> =\n \"SysvarC1ock11111111111111111111111111111111\",\n TAccountEventAuthority extends string | AccountMeta<string> = string,\n TAccountProgram extends string | AccountMeta<string> = string,\n TRemainingAccounts extends readonly AccountMeta<string>[] = [],\n> = Instruction<TProgram> &\n InstructionWithData<ReadonlyUint8Array> &\n InstructionWithAccounts<\n [\n TAccountPayer extends string\n ? WritableSignerAccount<TAccountPayer> &\n AccountSignerMeta<TAccountPayer>\n : TAccountPayer,\n TAccountSchemaConfig extends string\n ? ReadonlyAccount<TAccountSchemaConfig>\n : TAccountSchemaConfig,\n TAccountInstructionsSysvar extends string\n ? ReadonlyAccount<TAccountInstructionsSysvar>\n : TAccountInstructionsSysvar,\n TAccountAgentAta extends string\n ? ReadonlyAccount<TAccountAgentAta>\n : TAccountAgentAta,\n TAccountTokenProgram extends string\n ? ReadonlyAccount<TAccountTokenProgram>\n : TAccountTokenProgram,\n TAccountAgentMint extends string\n ? ReadonlyAccount<TAccountAgentMint>\n : TAccountAgentMint,\n TAccountDelegationAttestation extends string\n ? ReadonlyAccount<TAccountDelegationAttestation>\n : TAccountDelegationAttestation,\n TAccountSatiCredential extends string\n ? ReadonlyAccount<TAccountSatiCredential>\n : TAccountSatiCredential,\n TAccountClock extends string\n ? ReadonlyAccount<TAccountClock>\n : TAccountClock,\n TAccountEventAuthority extends string\n ? ReadonlyAccount<TAccountEventAuthority>\n : TAccountEventAuthority,\n TAccountProgram extends string\n ? ReadonlyAccount<TAccountProgram>\n : TAccountProgram,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type CreateCompressedAttestationInstructionData = {\n discriminator: ReadonlyUint8Array;\n /** Schema-conformant data bytes (130+ bytes, universal base layout) */\n data: ReadonlyUint8Array;\n /** Output state tree index for the new compressed account */\n outputStateTreeIndex: number;\n /** Light Protocol validity proof (None for new address creation) */\n proof: ValidityProof;\n /** Light Protocol address tree info */\n addressTreeInfo: PackedAddressTreeInfo;\n};\n\nexport type CreateCompressedAttestationInstructionDataArgs = {\n /** Schema-conformant data bytes (130+ bytes, universal base layout) */\n data: ReadonlyUint8Array;\n /** Output state tree index for the new compressed account */\n outputStateTreeIndex: number;\n /** Light Protocol validity proof (None for new address creation) */\n proof: ValidityProofArgs;\n /** Light Protocol address tree info */\n addressTreeInfo: PackedAddressTreeInfoArgs;\n};\n\nexport function getCreateCompressedAttestationInstructionDataEncoder(): Encoder<CreateCompressedAttestationInstructionDataArgs> {\n return transformEncoder(\n getStructEncoder([\n [\"discriminator\", fixEncoderSize(getBytesEncoder(), 8)],\n [\"data\", addEncoderSizePrefix(getBytesEncoder(), getU32Encoder())],\n [\"outputStateTreeIndex\", getU8Encoder()],\n [\"proof\", getValidityProofEncoder()],\n [\"addressTreeInfo\", getPackedAddressTreeInfoEncoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: CREATE_COMPRESSED_ATTESTATION_DISCRIMINATOR,\n }),\n );\n}\n\nexport function getCreateCompressedAttestationInstructionDataDecoder(): Decoder<CreateCompressedAttestationInstructionData> {\n return getStructDecoder([\n [\"discriminator\", fixDecoderSize(getBytesDecoder(), 8)],\n [\"data\", addDecoderSizePrefix(getBytesDecoder(), getU32Decoder())],\n [\"outputStateTreeIndex\", getU8Decoder()],\n [\"proof\", getValidityProofDecoder()],\n [\"addressTreeInfo\", getPackedAddressTreeInfoDecoder()],\n ]);\n}\n\nexport function getCreateCompressedAttestationInstructionDataCodec(): Codec<\n CreateCompressedAttestationInstructionDataArgs,\n CreateCompressedAttestationInstructionData\n> {\n return combineCodec(\n getCreateCompressedAttestationInstructionDataEncoder(),\n getCreateCompressedAttestationInstructionDataDecoder(),\n );\n}\n\nexport type CreateCompressedAttestationAsyncInput<\n TAccountPayer extends string = string,\n TAccountSchemaConfig extends string = string,\n TAccountInstructionsSysvar extends string = string,\n TAccountAgentAta extends string = string,\n TAccountTokenProgram extends string = string,\n TAccountAgentMint extends string = string,\n TAccountDelegationAttestation extends string = string,\n TAccountSatiCredential extends string = string,\n TAccountClock extends string = string,\n TAccountEventAuthority extends string = string,\n TAccountProgram extends string = string,\n> = {\n /** Payer for transaction fees */\n payer: TransactionSigner<TAccountPayer>;\n /** Schema config PDA */\n schemaConfig: Address<TAccountSchemaConfig>;\n /** Instructions sysvar for Ed25519 signature verification */\n instructionsSysvar?: Address<TAccountInstructionsSysvar>;\n /**\n * Agent's ATA that holds the NFT - proves signer owns the agent identity.\n * Required for DualSignature and AgentOwnerSigned modes.\n * Optional for CounterpartySigned mode (not validated).\n *\n * The mint must match agent_mint from attestation data,\n * amount must be >= 1, and owner must match signatures[0].pubkey.\n */\n agentAta?: Address<TAccountAgentAta>;\n /**\n * Token-2022 program for ATA verification.\n * Required when agent_ata is provided.\n */\n tokenProgram?: Address<TAccountTokenProgram>;\n /**\n * Agent mint (Token-2022 NFT) for Solscan indexing.\n * Must match agent_mint in attestation data (bytes 33-64).\n */\n agentMint: Address<TAccountAgentMint>;\n /**\n * Delegation attestation (optional).\n * Required when signer != agent ATA owner for AgentOwnerSigned mode.\n * Must be a valid DelegateV1 SAS attestation proving the signer's delegation.\n */\n delegationAttestation?: Address<TAccountDelegationAttestation>;\n /**\n * SATI SAS credential for delegation PDA derivation.\n * Required when delegation_attestation is provided.\n */\n satiCredential?: Address<TAccountSatiCredential>;\n /**\n * Clock sysvar for delegation expiry verification.\n * Required when delegation_attestation is provided.\n */\n clock?: Address<TAccountClock>;\n eventAuthority?: Address<TAccountEventAuthority>;\n program: Address<TAccountProgram>;\n data: CreateCompressedAttestationInstructionDataArgs[\"data\"];\n outputStateTreeIndex: CreateCompressedAttestationInstructionDataArgs[\"outputStateTreeIndex\"];\n proof: CreateCompressedAttestationInstructionDataArgs[\"proof\"];\n addressTreeInfo: CreateCompressedAttestationInstructionDataArgs[\"addressTreeInfo\"];\n};\n\nexport async function getCreateCompressedAttestationInstructionAsync<\n TAccountPayer extends string,\n TAccountSchemaConfig extends string,\n TAccountInstructionsSysvar extends string,\n TAccountAgentAta extends string,\n TAccountTokenProgram extends string,\n TAccountAgentMint extends string,\n TAccountDelegationAttestation extends string,\n TAccountSatiCredential extends string,\n TAccountClock extends string,\n TAccountEventAuthority extends string,\n TAccountProgram extends string,\n TProgramAddress extends Address = typeof SATI_PROGRAM_ADDRESS,\n>(\n input: CreateCompressedAttestationAsyncInput<\n TAccountPayer,\n TAccountSchemaConfig,\n TAccountInstructionsSysvar,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountDelegationAttestation,\n TAccountSatiCredential,\n TAccountClock,\n TAccountEventAuthority,\n TAccountProgram\n >,\n config?: { programAddress?: TProgramAddress },\n): Promise<\n CreateCompressedAttestationInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountSchemaConfig,\n TAccountInstructionsSysvar,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountDelegationAttestation,\n TAccountSatiCredential,\n TAccountClock,\n TAccountEventAuthority,\n TAccountProgram\n >\n> {\n // Program address.\n const programAddress = config?.programAddress ?? SATI_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n schemaConfig: { value: input.schemaConfig ?? null, isWritable: false },\n instructionsSysvar: {\n value: input.instructionsSysvar ?? null,\n isWritable: false,\n },\n agentAta: { value: input.agentAta ?? null, isWritable: false },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n agentMint: { value: input.agentMint ?? null, isWritable: false },\n delegationAttestation: {\n value: input.delegationAttestation ?? null,\n isWritable: false,\n },\n satiCredential: { value: input.satiCredential ?? null, isWritable: false },\n clock: { value: input.clock ?? null, isWritable: false },\n eventAuthority: { value: input.eventAuthority ?? null, isWritable: false },\n program: { value: input.program ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.instructionsSysvar.value) {\n accounts.instructionsSysvar.value =\n \"Sysvar1nstructions1111111111111111111111111\" as Address<\"Sysvar1nstructions1111111111111111111111111\">;\n }\n if (!accounts.clock.value) {\n accounts.clock.value =\n \"SysvarC1ock11111111111111111111111111111111\" as Address<\"SysvarC1ock11111111111111111111111111111111\">;\n }\n if (!accounts.eventAuthority.value) {\n accounts.eventAuthority.value = await getProgramDerivedAddress({\n programAddress,\n seeds: [\n getBytesEncoder().encode(\n new Uint8Array([\n 95, 95, 101, 118, 101, 110, 116, 95, 97, 117, 116, 104, 111, 114,\n 105, 116, 121,\n ]),\n ),\n ],\n });\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, \"programId\");\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.schemaConfig),\n getAccountMeta(accounts.instructionsSysvar),\n getAccountMeta(accounts.agentAta),\n getAccountMeta(accounts.tokenProgram),\n getAccountMeta(accounts.agentMint),\n getAccountMeta(accounts.delegationAttestation),\n getAccountMeta(accounts.satiCredential),\n getAccountMeta(accounts.clock),\n getAccountMeta(accounts.eventAuthority),\n getAccountMeta(accounts.program),\n ],\n data: getCreateCompressedAttestationInstructionDataEncoder().encode(\n args as CreateCompressedAttestationInstructionDataArgs,\n ),\n programAddress,\n } as CreateCompressedAttestationInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountSchemaConfig,\n TAccountInstructionsSysvar,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountDelegationAttestation,\n TAccountSatiCredential,\n TAccountClock,\n TAccountEventAuthority,\n TAccountProgram\n >);\n}\n\nexport type CreateCompressedAttestationInput<\n TAccountPayer extends string = string,\n TAccountSchemaConfig extends string = string,\n TAccountInstructionsSysvar extends string = string,\n TAccountAgentAta extends string = string,\n TAccountTokenProgram extends string = string,\n TAccountAgentMint extends string = string,\n TAccountDelegationAttestation extends string = string,\n TAccountSatiCredential extends string = string,\n TAccountClock extends string = string,\n TAccountEventAuthority extends string = string,\n TAccountProgram extends string = string,\n> = {\n /** Payer for transaction fees */\n payer: TransactionSigner<TAccountPayer>;\n /** Schema config PDA */\n schemaConfig: Address<TAccountSchemaConfig>;\n /** Instructions sysvar for Ed25519 signature verification */\n instructionsSysvar?: Address<TAccountInstructionsSysvar>;\n /**\n * Agent's ATA that holds the NFT - proves signer owns the agent identity.\n * Required for DualSignature and AgentOwnerSigned modes.\n * Optional for CounterpartySigned mode (not validated).\n *\n * The mint must match agent_mint from attestation data,\n * amount must be >= 1, and owner must match signatures[0].pubkey.\n */\n agentAta?: Address<TAccountAgentAta>;\n /**\n * Token-2022 program for ATA verification.\n * Required when agent_ata is provided.\n */\n tokenProgram?: Address<TAccountTokenProgram>;\n /**\n * Agent mint (Token-2022 NFT) for Solscan indexing.\n * Must match agent_mint in attestation data (bytes 33-64).\n */\n agentMint: Address<TAccountAgentMint>;\n /**\n * Delegation attestation (optional).\n * Required when signer != agent ATA owner for AgentOwnerSigned mode.\n * Must be a valid DelegateV1 SAS attestation proving the signer's delegation.\n */\n delegationAttestation?: Address<TAccountDelegationAttestation>;\n /**\n * SATI SAS credential for delegation PDA derivation.\n * Required when delegation_attestation is provided.\n */\n satiCredential?: Address<TAccountSatiCredential>;\n /**\n * Clock sysvar for delegation expiry verification.\n * Required when delegation_attestation is provided.\n */\n clock?: Address<TAccountClock>;\n eventAuthority: Address<TAccountEventAuthority>;\n program: Address<TAccountProgram>;\n data: CreateCompressedAttestationInstructionDataArgs[\"data\"];\n outputStateTreeIndex: CreateCompressedAttestationInstructionDataArgs[\"outputStateTreeIndex\"];\n proof: CreateCompressedAttestationInstructionDataArgs[\"proof\"];\n addressTreeInfo: CreateCompressedAttestationInstructionDataArgs[\"addressTreeInfo\"];\n};\n\nexport function getCreateCompressedAttestationInstruction<\n TAccountPayer extends string,\n TAccountSchemaConfig extends string,\n TAccountInstructionsSysvar extends string,\n TAccountAgentAta extends string,\n TAccountTokenProgram extends string,\n TAccountAgentMint extends string,\n TAccountDelegationAttestation extends string,\n TAccountSatiCredential extends string,\n TAccountClock extends string,\n TAccountEventAuthority extends string,\n TAccountProgram extends string,\n TProgramAddress extends Address = typeof SATI_PROGRAM_ADDRESS,\n>(\n input: CreateCompressedAttestationInput<\n TAccountPayer,\n TAccountSchemaConfig,\n TAccountInstructionsSysvar,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountDelegationAttestation,\n TAccountSatiCredential,\n TAccountClock,\n TAccountEventAuthority,\n TAccountProgram\n >,\n config?: { programAddress?: TProgramAddress },\n): CreateCompressedAttestationInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountSchemaConfig,\n TAccountInstructionsSysvar,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountDelegationAttestation,\n TAccountSatiCredential,\n TAccountClock,\n TAccountEventAuthority,\n TAccountProgram\n> {\n // Program address.\n const programAddress = config?.programAddress ?? SATI_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n schemaConfig: { value: input.schemaConfig ?? null, isWritable: false },\n instructionsSysvar: {\n value: input.instructionsSysvar ?? null,\n isWritable: false,\n },\n agentAta: { value: input.agentAta ?? null, isWritable: false },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n agentMint: { value: input.agentMint ?? null, isWritable: false },\n delegationAttestation: {\n value: input.delegationAttestation ?? null,\n isWritable: false,\n },\n satiCredential: { value: input.satiCredential ?? null, isWritable: false },\n clock: { value: input.clock ?? null, isWritable: false },\n eventAuthority: { value: input.eventAuthority ?? null, isWritable: false },\n program: { value: input.program ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.instructionsSysvar.value) {\n accounts.instructionsSysvar.value =\n \"Sysvar1nstructions1111111111111111111111111\" as Address<\"Sysvar1nstructions1111111111111111111111111\">;\n }\n if (!accounts.clock.value) {\n accounts.clock.value =\n \"SysvarC1ock11111111111111111111111111111111\" as Address<\"SysvarC1ock11111111111111111111111111111111\">;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, \"programId\");\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.schemaConfig),\n getAccountMeta(accounts.instructionsSysvar),\n getAccountMeta(accounts.agentAta),\n getAccountMeta(accounts.tokenProgram),\n getAccountMeta(accounts.agentMint),\n getAccountMeta(accounts.delegationAttestation),\n getAccountMeta(accounts.satiCredential),\n getAccountMeta(accounts.clock),\n getAccountMeta(accounts.eventAuthority),\n getAccountMeta(accounts.program),\n ],\n data: getCreateCompressedAttestationInstructionDataEncoder().encode(\n args as CreateCompressedAttestationInstructionDataArgs,\n ),\n programAddress,\n } as CreateCompressedAttestationInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountSchemaConfig,\n TAccountInstructionsSysvar,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountDelegationAttestation,\n TAccountSatiCredential,\n TAccountClock,\n TAccountEventAuthority,\n TAccountProgram\n >);\n}\n\nexport type ParsedCreateCompressedAttestationInstruction<\n TProgram extends string = typeof SATI_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address<TProgram>;\n accounts: {\n /** Payer for transaction fees */\n payer: TAccountMetas[0];\n /** Schema config PDA */\n schemaConfig: TAccountMetas[1];\n /** Instructions sysvar for Ed25519 signature verification */\n instructionsSysvar: TAccountMetas[2];\n /**\n * Agent's ATA that holds the NFT - proves signer owns the agent identity.\n * Required for DualSignature and AgentOwnerSigned modes.\n * Optional for CounterpartySigned mode (not validated).\n *\n * The mint must match agent_mint from attestation data,\n * amount must be >= 1, and owner must match signatures[0].pubkey.\n */\n agentAta?: TAccountMetas[3] | undefined;\n /**\n * Token-2022 program for ATA verification.\n * Required when agent_ata is provided.\n */\n tokenProgram?: TAccountMetas[4] | undefined;\n /**\n * Agent mint (Token-2022 NFT) for Solscan indexing.\n * Must match agent_mint in attestation data (bytes 33-64).\n */\n agentMint: TAccountMetas[5];\n /**\n * Delegation attestation (optional).\n * Required when signer != agent ATA owner for AgentOwnerSigned mode.\n * Must be a valid DelegateV1 SAS attestation proving the signer's delegation.\n */\n delegationAttestation?: TAccountMetas[6] | undefined;\n /**\n * SATI SAS credential for delegation PDA derivation.\n * Required when delegation_attestation is provided.\n */\n satiCredential?: TAccountMetas[7] | undefined;\n /**\n * Clock sysvar for delegation expiry verification.\n * Required when delegation_attestation is provided.\n */\n clock?: TAccountMetas[8] | undefined;\n eventAuthority: TAccountMetas[9];\n program: TAccountMetas[10];\n };\n data: CreateCompressedAttestationInstructionData;\n};\n\nexport function parseCreateCompressedAttestationInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction<TProgram> &\n InstructionWithAccounts<TAccountMetas> &\n InstructionWithData<ReadonlyUint8Array>,\n): ParsedCreateCompressedAttestationInstruction<TProgram, TAccountMetas> {\n if (instruction.accounts.length < 11) {\n // TODO: Coded error.\n throw new Error(\"Not enough accounts\");\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n const getNextOptionalAccount = () => {\n const accountMeta = getNextAccount();\n return accountMeta.address === SATI_PROGRAM_ADDRESS\n ? undefined\n : accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n payer: getNextAccount(),\n schemaConfig: getNextAccount(),\n instructionsSysvar: getNextAccount(),\n agentAta: getNextOptionalAccount(),\n tokenProgram: getNextOptionalAccount(),\n agentMint: getNextAccount(),\n delegationAttestation: getNextOptionalAccount(),\n satiCredential: getNextOptionalAccount(),\n clock: getNextOptionalAccount(),\n eventAuthority: getNextAccount(),\n program: getNextAccount(),\n },\n data: getCreateCompressedAttestationInstructionDataDecoder().decode(\n instruction.data,\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n addDecoderSizePrefix,\n addEncoderSizePrefix,\n combineCodec,\n fixDecoderSize,\n fixEncoderSize,\n getBytesDecoder,\n getBytesEncoder,\n getI64Decoder,\n getI64Encoder,\n getProgramDerivedAddress,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n type WritableSignerAccount,\n} from \"@solana/kit\";\nimport { SATI_PROGRAM_ADDRESS } from \"../programs\";\nimport { getAccountMetaFactory, type ResolvedAccount } from \"../shared\";\n\nexport const CREATE_REGULAR_ATTESTATION_DISCRIMINATOR = new Uint8Array([\n 69, 6, 28, 228, 190, 240, 142, 79,\n]);\n\nexport function getCreateRegularAttestationDiscriminatorBytes() {\n return fixEncoderSize(getBytesEncoder(), 8).encode(\n CREATE_REGULAR_ATTESTATION_DISCRIMINATOR,\n );\n}\n\nexport type CreateRegularAttestationInstruction<\n TProgram extends string = typeof SATI_PROGRAM_ADDRESS,\n TAccountPayer extends string | AccountMeta<string> = string,\n TAccountSchemaConfig extends string | AccountMeta<string> = string,\n TAccountSatiPda extends string | AccountMeta<string> = string,\n TAccountSatiCredential extends string | AccountMeta<string> = string,\n TAccountSasSchema extends string | AccountMeta<string> = string,\n TAccountAttestation extends string | AccountMeta<string> = string,\n TAccountInstructionsSysvar extends string | AccountMeta<string> =\n \"Sysvar1nstructions1111111111111111111111111\",\n TAccountAgentAta extends string | AccountMeta<string> = string,\n TAccountTokenProgram extends string | AccountMeta<string> = string,\n TAccountAgentMint extends string | AccountMeta<string> = string,\n TAccountDelegationAttestation extends string | AccountMeta<string> = string,\n TAccountClock extends string | AccountMeta<string> =\n \"SysvarC1ock11111111111111111111111111111111\",\n TAccountSasProgram extends string | AccountMeta<string> =\n \"22zoJMtdu4tQc2PzL74ZUT7FrwgB1Udec8DdW4yw4BdG\",\n TAccountSystemProgram extends string | AccountMeta<string> =\n \"11111111111111111111111111111111\",\n TAccountEventAuthority extends string | AccountMeta<string> = string,\n TAccountProgram extends string | AccountMeta<string> = string,\n TRemainingAccounts extends readonly AccountMeta<string>[] = [],\n> = Instruction<TProgram> &\n InstructionWithData<ReadonlyUint8Array> &\n InstructionWithAccounts<\n [\n TAccountPayer extends string\n ? WritableSignerAccount<TAccountPayer> &\n AccountSignerMeta<TAccountPayer>\n : TAccountPayer,\n TAccountSchemaConfig extends string\n ? ReadonlyAccount<TAccountSchemaConfig>\n : TAccountSchemaConfig,\n TAccountSatiPda extends string\n ? ReadonlyAccount<TAccountSatiPda>\n : TAccountSatiPda,\n TAccountSatiCredential extends string\n ? ReadonlyAccount<TAccountSatiCredential>\n : TAccountSatiCredential,\n TAccountSasSchema extends string\n ? ReadonlyAccount<TAccountSasSchema>\n : TAccountSasSchema,\n TAccountAttestation extends string\n ? WritableAccount<TAccountAttestation>\n : TAccountAttestation,\n TAccountInstructionsSysvar extends string\n ? ReadonlyAccount<TAccountInstructionsSysvar>\n : TAccountInstructionsSysvar,\n TAccountAgentAta extends string\n ? ReadonlyAccount<TAccountAgentAta>\n : TAccountAgentAta,\n TAccountTokenProgram extends string\n ? ReadonlyAccount<TAccountTokenProgram>\n : TAccountTokenProgram,\n TAccountAgentMint extends string\n ? ReadonlyAccount<TAccountAgentMint>\n : TAccountAgentMint,\n TAccountDelegationAttestation extends string\n ? ReadonlyAccount<TAccountDelegationAttestation>\n : TAccountDelegationAttestation,\n TAccountClock extends string\n ? ReadonlyAccount<TAccountClock>\n : TAccountClock,\n TAccountSasProgram extends string\n ? ReadonlyAccount<TAccountSasProgram>\n : TAccountSasProgram,\n TAccountSystemProgram extends string\n ? ReadonlyAccount<TAccountSystemProgram>\n : TAccountSystemProgram,\n TAccountEventAuthority extends string\n ? ReadonlyAccount<TAccountEventAuthority>\n : TAccountEventAuthority,\n TAccountProgram extends string\n ? ReadonlyAccount<TAccountProgram>\n : TAccountProgram,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type CreateRegularAttestationInstructionData = {\n discriminator: ReadonlyUint8Array;\n /** Schema-conformant data bytes (130+ bytes, universal base layout) */\n data: ReadonlyUint8Array;\n /** Expiry timestamp (0 = never expires) */\n expiry: bigint;\n};\n\nexport type CreateRegularAttestationInstructionDataArgs = {\n /** Schema-conformant data bytes (130+ bytes, universal base layout) */\n data: ReadonlyUint8Array;\n /** Expiry timestamp (0 = never expires) */\n expiry: number | bigint;\n};\n\nexport function getCreateRegularAttestationInstructionDataEncoder(): Encoder<CreateRegularAttestationInstructionDataArgs> {\n return transformEncoder(\n getStructEncoder([\n [\"discriminator\", fixEncoderSize(getBytesEncoder(), 8)],\n [\"data\", addEncoderSizePrefix(getBytesEncoder(), getU32Encoder())],\n [\"expiry\", getI64Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: CREATE_REGULAR_ATTESTATION_DISCRIMINATOR,\n }),\n );\n}\n\nexport function getCreateRegularAttestationInstructionDataDecoder(): Decoder<CreateRegularAttestationInstructionData> {\n return getStructDecoder([\n [\"discriminator\", fixDecoderSize(getBytesDecoder(), 8)],\n [\"data\", addDecoderSizePrefix(getBytesDecoder(), getU32Decoder())],\n [\"expiry\", getI64Decoder()],\n ]);\n}\n\nexport function getCreateRegularAttestationInstructionDataCodec(): Codec<\n CreateRegularAttestationInstructionDataArgs,\n CreateRegularAttestationInstructionData\n> {\n return combineCodec(\n getCreateRegularAttestationInstructionDataEncoder(),\n getCreateRegularAttestationInstructionDataDecoder(),\n );\n}\n\nexport type CreateRegularAttestationAsyncInput<\n TAccountPayer extends string = string,\n TAccountSchemaConfig extends string = string,\n TAccountSatiPda extends string = string,\n TAccountSatiCredential extends string = string,\n TAccountSasSchema extends string = string,\n TAccountAttestation extends string = string,\n TAccountInstructionsSysvar extends string = string,\n TAccountAgentAta extends string = string,\n TAccountTokenProgram extends string = string,\n TAccountAgentMint extends string = string,\n TAccountDelegationAttestation extends string = string,\n TAccountClock extends string = string,\n TAccountSasProgram extends string = string,\n TAccountSystemProgram extends string = string,\n TAccountEventAuthority extends string = string,\n TAccountProgram extends string = string,\n> = {\n /** Payer for account creation */\n payer: TransactionSigner<TAccountPayer>;\n /** Schema config PDA */\n schemaConfig: Address<TAccountSchemaConfig>;\n /** SATI Attestation Program PDA - authorized signer on SAS credential */\n satiPda?: Address<TAccountSatiPda>;\n /** SATI SAS credential account */\n satiCredential: Address<TAccountSatiCredential>;\n /** SAS schema account */\n sasSchema: Address<TAccountSasSchema>;\n /** Attestation PDA to be created */\n attestation: Address<TAccountAttestation>;\n /** Instructions sysvar for Ed25519 signature verification */\n instructionsSysvar?: Address<TAccountInstructionsSysvar>;\n /**\n * Agent's ATA that holds the NFT - proves signer owns the agent identity.\n * Required for AgentOwnerSigned mode (DelegateV1).\n * Optional for CounterpartySigned mode (ReputationScore).\n */\n agentAta?: Address<TAccountAgentAta>;\n /**\n * Token-2022 program for ATA verification.\n * Required when agent_ata is provided.\n */\n tokenProgram?: Address<TAccountTokenProgram>;\n /**\n * Agent mint (Token-2022 NFT) for Solscan indexing.\n * Must match agent_mint in attestation data (bytes 33-64).\n */\n agentMint: Address<TAccountAgentMint>;\n /**\n * Delegation attestation (optional).\n * Required when signer != agent ATA owner for AgentOwnerSigned mode.\n * Must be a valid DelegateV1 SAS attestation proving the signer's delegation.\n */\n delegationAttestation?: Address<TAccountDelegationAttestation>;\n /**\n * Clock sysvar for delegation expiry verification.\n * Required when delegation_attestation is provided.\n */\n clock?: Address<TAccountClock>;\n /** SAS program */\n sasProgram?: Address<TAccountSasProgram>;\n systemProgram?: Address<TAccountSystemProgram>;\n eventAuthority?: Address<TAccountEventAuthority>;\n program: Address<TAccountProgram>;\n data: CreateRegularAttestationInstructionDataArgs[\"data\"];\n expiry: CreateRegularAttestationInstructionDataArgs[\"expiry\"];\n};\n\nexport async function getCreateRegularAttestationInstructionAsync<\n TAccountPayer extends string,\n TAccountSchemaConfig extends string,\n TAccountSatiPda extends string,\n TAccountSatiCredential extends string,\n TAccountSasSchema extends string,\n TAccountAttestation extends string,\n TAccountInstructionsSysvar extends string,\n TAccountAgentAta extends string,\n TAccountTokenProgram extends string,\n TAccountAgentMint extends string,\n TAccountDelegationAttestation extends string,\n TAccountClock extends string,\n TAccountSasProgram extends string,\n TAccountSystemProgram extends string,\n TAccountEventAuthority extends string,\n TAccountProgram extends string,\n TProgramAddress extends Address = typeof SATI_PROGRAM_ADDRESS,\n>(\n input: CreateRegularAttestationAsyncInput<\n TAccountPayer,\n TAccountSchemaConfig,\n TAccountSatiPda,\n TAccountSatiCredential,\n TAccountSasSchema,\n TAccountAttestation,\n TAccountInstructionsSysvar,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountDelegationAttestation,\n TAccountClock,\n TAccountSasProgram,\n TAccountSystemProgram,\n TAccountEventAuthority,\n TAccountProgram\n >,\n config?: { programAddress?: TProgramAddress },\n): Promise<\n CreateRegularAttestationInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountSchemaConfig,\n TAccountSatiPda,\n TAccountSatiCredential,\n TAccountSasSchema,\n TAccountAttestation,\n TAccountInstructionsSysvar,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountDelegationAttestation,\n TAccountClock,\n TAccountSasProgram,\n TAccountSystemProgram,\n TAccountEventAuthority,\n TAccountProgram\n >\n> {\n // Program address.\n const programAddress = config?.programAddress ?? SATI_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n schemaConfig: { value: input.schemaConfig ?? null, isWritable: false },\n satiPda: { value: input.satiPda ?? null, isWritable: false },\n satiCredential: { value: input.satiCredential ?? null, isWritable: false },\n sasSchema: { value: input.sasSchema ?? null, isWritable: false },\n attestation: { value: input.attestation ?? null, isWritable: true },\n instructionsSysvar: {\n value: input.instructionsSysvar ?? null,\n isWritable: false,\n },\n agentAta: { value: input.agentAta ?? null, isWritable: false },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n agentMint: { value: input.agentMint ?? null, isWritable: false },\n delegationAttestation: {\n value: input.delegationAttestation ?? null,\n isWritable: false,\n },\n clock: { value: input.clock ?? null, isWritable: false },\n sasProgram: { value: input.sasProgram ?? null, isWritable: false },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n eventAuthority: { value: input.eventAuthority ?? null, isWritable: false },\n program: { value: input.program ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.satiPda.value) {\n accounts.satiPda.value = await getProgramDerivedAddress({\n programAddress,\n seeds: [\n getBytesEncoder().encode(\n new Uint8Array([\n 115, 97, 116, 105, 95, 97, 116, 116, 101, 115, 116, 97, 116, 105,\n 111, 110,\n ]),\n ),\n ],\n });\n }\n if (!accounts.instructionsSysvar.value) {\n accounts.instructionsSysvar.value =\n \"Sysvar1nstructions1111111111111111111111111\" as Address<\"Sysvar1nstructions1111111111111111111111111\">;\n }\n if (!accounts.clock.value) {\n accounts.clock.value =\n \"SysvarC1ock11111111111111111111111111111111\" as Address<\"SysvarC1ock11111111111111111111111111111111\">;\n }\n if (!accounts.sasProgram.value) {\n accounts.sasProgram.value =\n \"22zoJMtdu4tQc2PzL74ZUT7FrwgB1Udec8DdW4yw4BdG\" as Address<\"22zoJMtdu4tQc2PzL74ZUT7FrwgB1Udec8DdW4yw4BdG\">;\n }\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n \"11111111111111111111111111111111\" as Address<\"11111111111111111111111111111111\">;\n }\n if (!accounts.eventAuthority.value) {\n accounts.eventAuthority.value = await getProgramDerivedAddress({\n programAddress,\n seeds: [\n getBytesEncoder().encode(\n new Uint8Array([\n 95, 95, 101, 118, 101, 110, 116, 95, 97, 117, 116, 104, 111, 114,\n 105, 116, 121,\n ]),\n ),\n ],\n });\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, \"programId\");\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.schemaConfig),\n getAccountMeta(accounts.satiPda),\n getAccountMeta(accounts.satiCredential),\n getAccountMeta(accounts.sasSchema),\n getAccountMeta(accounts.attestation),\n getAccountMeta(accounts.instructionsSysvar),\n getAccountMeta(accounts.agentAta),\n getAccountMeta(accounts.tokenProgram),\n getAccountMeta(accounts.agentMint),\n getAccountMeta(accounts.delegationAttestation),\n getAccountMeta(accounts.clock),\n getAccountMeta(accounts.sasProgram),\n getAccountMeta(accounts.systemProgram),\n getAccountMeta(accounts.eventAuthority),\n getAccountMeta(accounts.program),\n ],\n data: getCreateRegularAttestationInstructionDataEncoder().encode(\n args as CreateRegularAttestationInstructionDataArgs,\n ),\n programAddress,\n } as CreateRegularAttestationInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountSchemaConfig,\n TAccountSatiPda,\n TAccountSatiCredential,\n TAccountSasSchema,\n TAccountAttestation,\n TAccountInstructionsSysvar,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountDelegationAttestation,\n TAccountClock,\n TAccountSasProgram,\n TAccountSystemProgram,\n TAccountEventAuthority,\n TAccountProgram\n >);\n}\n\nexport type CreateRegularAttestationInput<\n TAccountPayer extends string = string,\n TAccountSchemaConfig extends string = string,\n TAccountSatiPda extends string = string,\n TAccountSatiCredential extends string = string,\n TAccountSasSchema extends string = string,\n TAccountAttestation extends string = string,\n TAccountInstructionsSysvar extends string = string,\n TAccountAgentAta extends string = string,\n TAccountTokenProgram extends string = string,\n TAccountAgentMint extends string = string,\n TAccountDelegationAttestation extends string = string,\n TAccountClock extends string = string,\n TAccountSasProgram extends string = string,\n TAccountSystemProgram extends string = string,\n TAccountEventAuthority extends string = string,\n TAccountProgram extends string = string,\n> = {\n /** Payer for account creation */\n payer: TransactionSigner<TAccountPayer>;\n /** Schema config PDA */\n schemaConfig: Address<TAccountSchemaConfig>;\n /** SATI Attestation Program PDA - authorized signer on SAS credential */\n satiPda: Address<TAccountSatiPda>;\n /** SATI SAS credential account */\n satiCredential: Address<TAccountSatiCredential>;\n /** SAS schema account */\n sasSchema: Address<TAccountSasSchema>;\n /** Attestation PDA to be created */\n attestation: Address<TAccountAttestation>;\n /** Instructions sysvar for Ed25519 signature verification */\n instructionsSysvar?: Address<TAccountInstructionsSysvar>;\n /**\n * Agent's ATA that holds the NFT - proves signer owns the agent identity.\n * Required for AgentOwnerSigned mode (DelegateV1).\n * Optional for CounterpartySigned mode (ReputationScore).\n */\n agentAta?: Address<TAccountAgentAta>;\n /**\n * Token-2022 program for ATA verification.\n * Required when agent_ata is provided.\n */\n tokenProgram?: Address<TAccountTokenProgram>;\n /**\n * Agent mint (Token-2022 NFT) for Solscan indexing.\n * Must match agent_mint in attestation data (bytes 33-64).\n */\n agentMint: Address<TAccountAgentMint>;\n /**\n * Delegation attestation (optional).\n * Required when signer != agent ATA owner for AgentOwnerSigned mode.\n * Must be a valid DelegateV1 SAS attestation proving the signer's delegation.\n */\n delegationAttestation?: Address<TAccountDelegationAttestation>;\n /**\n * Clock sysvar for delegation expiry verification.\n * Required when delegation_attestation is provided.\n */\n clock?: Address<TAccountClock>;\n /** SAS program */\n sasProgram?: Address<TAccountSasProgram>;\n systemProgram?: Address<TAccountSystemProgram>;\n eventAuthority: Address<TAccountEventAuthority>;\n program: Address<TAccountProgram>;\n data: CreateRegularAttestationInstructionDataArgs[\"data\"];\n expiry: CreateRegularAttestationInstructionDataArgs[\"expiry\"];\n};\n\nexport function getCreateRegularAttestationInstruction<\n TAccountPayer extends string,\n TAccountSchemaConfig extends string,\n TAccountSatiPda extends string,\n TAccountSatiCredential extends string,\n TAccountSasSchema extends string,\n TAccountAttestation extends string,\n TAccountInstructionsSysvar extends string,\n TAccountAgentAta extends string,\n TAccountTokenProgram extends string,\n TAccountAgentMint extends string,\n TAccountDelegationAttestation extends string,\n TAccountClock extends string,\n TAccountSasProgram extends string,\n TAccountSystemProgram extends string,\n TAccountEventAuthority extends string,\n TAccountProgram extends string,\n TProgramAddress extends Address = typeof SATI_PROGRAM_ADDRESS,\n>(\n input: CreateRegularAttestationInput<\n TAccountPayer,\n TAccountSchemaConfig,\n TAccountSatiPda,\n TAccountSatiCredential,\n TAccountSasSchema,\n TAccountAttestation,\n TAccountInstructionsSysvar,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountDelegationAttestation,\n TAccountClock,\n TAccountSasProgram,\n TAccountSystemProgram,\n TAccountEventAuthority,\n TAccountProgram\n >,\n config?: { programAddress?: TProgramAddress },\n): CreateRegularAttestationInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountSchemaConfig,\n TAccountSatiPda,\n TAccountSatiCredential,\n TAccountSasSchema,\n TAccountAttestation,\n TAccountInstructionsSysvar,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountDelegationAttestation,\n TAccountClock,\n TAccountSasProgram,\n TAccountSystemProgram,\n TAccountEventAuthority,\n TAccountProgram\n> {\n // Program address.\n const programAddress = config?.programAddress ?? SATI_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n schemaConfig: { value: input.schemaConfig ?? null, isWritable: false },\n satiPda: { value: input.satiPda ?? null, isWritable: false },\n satiCredential: { value: input.satiCredential ?? null, isWritable: false },\n sasSchema: { value: input.sasSchema ?? null, isWritable: false },\n attestation: { value: input.attestation ?? null, isWritable: true },\n instructionsSysvar: {\n value: input.instructionsSysvar ?? null,\n isWritable: false,\n },\n agentAta: { value: input.agentAta ?? null, isWritable: false },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n agentMint: { value: input.agentMint ?? null, isWritable: false },\n delegationAttestation: {\n value: input.delegationAttestation ?? null,\n isWritable: false,\n },\n clock: { value: input.clock ?? null, isWritable: false },\n sasProgram: { value: input.sasProgram ?? null, isWritable: false },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n eventAuthority: { value: input.eventAuthority ?? null, isWritable: false },\n program: { value: input.program ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.instructionsSysvar.value) {\n accounts.instructionsSysvar.value =\n \"Sysvar1nstructions1111111111111111111111111\" as Address<\"Sysvar1nstructions1111111111111111111111111\">;\n }\n if (!accounts.clock.value) {\n accounts.clock.value =\n \"SysvarC1ock11111111111111111111111111111111\" as Address<\"SysvarC1ock11111111111111111111111111111111\">;\n }\n if (!accounts.sasProgram.value) {\n accounts.sasProgram.value =\n \"22zoJMtdu4tQc2PzL74ZUT7FrwgB1Udec8DdW4yw4BdG\" as Address<\"22zoJMtdu4tQc2PzL74ZUT7FrwgB1Udec8DdW4yw4BdG\">;\n }\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n \"11111111111111111111111111111111\" as Address<\"11111111111111111111111111111111\">;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, \"programId\");\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.schemaConfig),\n getAccountMeta(accounts.satiPda),\n getAccountMeta(accounts.satiCredential),\n getAccountMeta(accounts.sasSchema),\n getAccountMeta(accounts.attestation),\n getAccountMeta(accounts.instructionsSysvar),\n getAccountMeta(accounts.agentAta),\n getAccountMeta(accounts.tokenProgram),\n getAccountMeta(accounts.agentMint),\n getAccountMeta(accounts.delegationAttestation),\n getAccountMeta(accounts.clock),\n getAccountMeta(accounts.sasProgram),\n getAccountMeta(accounts.systemProgram),\n getAccountMeta(accounts.eventAuthority),\n getAccountMeta(accounts.program),\n ],\n data: getCreateRegularAttestationInstructionDataEncoder().encode(\n args as CreateRegularAttestationInstructionDataArgs,\n ),\n programAddress,\n } as CreateRegularAttestationInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountSchemaConfig,\n TAccountSatiPda,\n TAccountSatiCredential,\n TAccountSasSchema,\n TAccountAttestation,\n TAccountInstructionsSysvar,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountDelegationAttestation,\n TAccountClock,\n TAccountSasProgram,\n TAccountSystemProgram,\n TAccountEventAuthority,\n TAccountProgram\n >);\n}\n\nexport type ParsedCreateRegularAttestationInstruction<\n TProgram extends string = typeof SATI_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address<TProgram>;\n accounts: {\n /** Payer for account creation */\n payer: TAccountMetas[0];\n /** Schema config PDA */\n schemaConfig: TAccountMetas[1];\n /** SATI Attestation Program PDA - authorized signer on SAS credential */\n satiPda: TAccountMetas[2];\n /** SATI SAS credential account */\n satiCredential: TAccountMetas[3];\n /** SAS schema account */\n sasSchema: TAccountMetas[4];\n /** Attestation PDA to be created */\n attestation: TAccountMetas[5];\n /** Instructions sysvar for Ed25519 signature verification */\n instructionsSysvar: TAccountMetas[6];\n /**\n * Agent's ATA that holds the NFT - proves signer owns the agent identity.\n * Required for AgentOwnerSigned mode (DelegateV1).\n * Optional for CounterpartySigned mode (ReputationScore).\n */\n agentAta?: TAccountMetas[7] | undefined;\n /**\n * Token-2022 program for ATA verification.\n * Required when agent_ata is provided.\n */\n tokenProgram?: TAccountMetas[8] | undefined;\n /**\n * Agent mint (Token-2022 NFT) for Solscan indexing.\n * Must match agent_mint in attestation data (bytes 33-64).\n */\n agentMint: TAccountMetas[9];\n /**\n * Delegation attestation (optional).\n * Required when signer != agent ATA owner for AgentOwnerSigned mode.\n * Must be a valid DelegateV1 SAS attestation proving the signer's delegation.\n */\n delegationAttestation?: TAccountMetas[10] | undefined;\n /**\n * Clock sysvar for delegation expiry verification.\n * Required when delegation_attestation is provided.\n */\n clock?: TAccountMetas[11] | undefined;\n /** SAS program */\n sasProgram: TAccountMetas[12];\n systemProgram: TAccountMetas[13];\n eventAuthority: TAccountMetas[14];\n program: TAccountMetas[15];\n };\n data: CreateRegularAttestationInstructionData;\n};\n\nexport function parseCreateRegularAttestationInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction<TProgram> &\n InstructionWithAccounts<TAccountMetas> &\n InstructionWithData<ReadonlyUint8Array>,\n): ParsedCreateRegularAttestationInstruction<TProgram, TAccountMetas> {\n if (instruction.accounts.length < 16) {\n // TODO: Coded error.\n throw new Error(\"Not enough accounts\");\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n const getNextOptionalAccount = () => {\n const accountMeta = getNextAccount();\n return accountMeta.address === SATI_PROGRAM_ADDRESS\n ? undefined\n : accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n payer: getNextAccount(),\n schemaConfig: getNextAccount(),\n satiPda: getNextAccount(),\n satiCredential: getNextAccount(),\n sasSchema: getNextAccount(),\n attestation: getNextAccount(),\n instructionsSysvar: getNextAccount(),\n agentAta: getNextOptionalAccount(),\n tokenProgram: getNextOptionalAccount(),\n agentMint: getNextAccount(),\n delegationAttestation: getNextOptionalAccount(),\n clock: getNextOptionalAccount(),\n sasProgram: getNextAccount(),\n systemProgram: getNextAccount(),\n eventAuthority: getNextAccount(),\n program: getNextAccount(),\n },\n data: getCreateRegularAttestationInstructionDataDecoder().decode(\n instruction.data,\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n fixDecoderSize,\n fixEncoderSize,\n getBytesDecoder,\n getBytesEncoder,\n getProgramDerivedAddress,\n getStructDecoder,\n getStructEncoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n type WritableSignerAccount,\n} from \"@solana/kit\";\nimport { SATI_PROGRAM_ADDRESS } from \"../programs\";\nimport { getAccountMetaFactory, type ResolvedAccount } from \"../shared\";\n\nexport const INITIALIZE_DISCRIMINATOR = new Uint8Array([\n 175, 175, 109, 31, 13, 152, 155, 237,\n]);\n\nexport function getInitializeDiscriminatorBytes() {\n return fixEncoderSize(getBytesEncoder(), 8).encode(INITIALIZE_DISCRIMINATOR);\n}\n\nexport type InitializeInstruction<\n TProgram extends string = typeof SATI_PROGRAM_ADDRESS,\n TAccountAuthority extends string | AccountMeta<string> = string,\n TAccountRegistryConfig extends string | AccountMeta<string> = string,\n TAccountGroupMint extends string | AccountMeta<string> = string,\n TAccountSystemProgram extends string | AccountMeta<string> =\n \"11111111111111111111111111111111\",\n TRemainingAccounts extends readonly AccountMeta<string>[] = [],\n> = Instruction<TProgram> &\n InstructionWithData<ReadonlyUint8Array> &\n InstructionWithAccounts<\n [\n TAccountAuthority extends string\n ? WritableSignerAccount<TAccountAuthority> &\n AccountSignerMeta<TAccountAuthority>\n : TAccountAuthority,\n TAccountRegistryConfig extends string\n ? WritableAccount<TAccountRegistryConfig>\n : TAccountRegistryConfig,\n TAccountGroupMint extends string\n ? WritableAccount<TAccountGroupMint>\n : TAccountGroupMint,\n TAccountSystemProgram extends string\n ? ReadonlyAccount<TAccountSystemProgram>\n : TAccountSystemProgram,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeInstructionData = { discriminator: ReadonlyUint8Array };\n\nexport type InitializeInstructionDataArgs = {};\n\nexport function getInitializeInstructionDataEncoder(): FixedSizeEncoder<InitializeInstructionDataArgs> {\n return transformEncoder(\n getStructEncoder([[\"discriminator\", fixEncoderSize(getBytesEncoder(), 8)]]),\n (value) => ({ ...value, discriminator: INITIALIZE_DISCRIMINATOR }),\n );\n}\n\nexport function getInitializeInstructionDataDecoder(): FixedSizeDecoder<InitializeInstructionData> {\n return getStructDecoder([\n [\"discriminator\", fixDecoderSize(getBytesDecoder(), 8)],\n ]);\n}\n\nexport function getInitializeInstructionDataCodec(): FixedSizeCodec<\n InitializeInstructionDataArgs,\n InitializeInstructionData\n> {\n return combineCodec(\n getInitializeInstructionDataEncoder(),\n getInitializeInstructionDataDecoder(),\n );\n}\n\nexport type InitializeAsyncInput<\n TAccountAuthority extends string = string,\n TAccountRegistryConfig extends string = string,\n TAccountGroupMint extends string = string,\n TAccountSystemProgram extends string = string,\n> = {\n /** Initial registry authority (will be multisig in production) */\n authority: TransactionSigner<TAccountAuthority>;\n /** Registry configuration PDA */\n registryConfig?: Address<TAccountRegistryConfig>;\n /** TokenGroup mint - created and initialized by client, then finalized here */\n groupMint: Address<TAccountGroupMint>;\n systemProgram?: Address<TAccountSystemProgram>;\n};\n\nexport async function getInitializeInstructionAsync<\n TAccountAuthority extends string,\n TAccountRegistryConfig extends string,\n TAccountGroupMint extends string,\n TAccountSystemProgram extends string,\n TProgramAddress extends Address = typeof SATI_PROGRAM_ADDRESS,\n>(\n input: InitializeAsyncInput<\n TAccountAuthority,\n TAccountRegistryConfig,\n TAccountGroupMint,\n TAccountSystemProgram\n >,\n config?: { programAddress?: TProgramAddress },\n): Promise<\n InitializeInstruction<\n TProgramAddress,\n TAccountAuthority,\n TAccountRegistryConfig,\n TAccountGroupMint,\n TAccountSystemProgram\n >\n> {\n // Program address.\n const programAddress = config?.programAddress ?? SATI_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n authority: { value: input.authority ?? null, isWritable: true },\n registryConfig: { value: input.registryConfig ?? null, isWritable: true },\n groupMint: { value: input.groupMint ?? null, isWritable: true },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.registryConfig.value) {\n accounts.registryConfig.value = await getProgramDerivedAddress({\n programAddress,\n seeds: [\n getBytesEncoder().encode(\n new Uint8Array([114, 101, 103, 105, 115, 116, 114, 121]),\n ),\n ],\n });\n }\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n \"11111111111111111111111111111111\" as Address<\"11111111111111111111111111111111\">;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, \"programId\");\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.authority),\n getAccountMeta(accounts.registryConfig),\n getAccountMeta(accounts.groupMint),\n getAccountMeta(accounts.systemProgram),\n ],\n data: getInitializeInstructionDataEncoder().encode({}),\n programAddress,\n } as InitializeInstruction<\n TProgramAddress,\n TAccountAuthority,\n TAccountRegistryConfig,\n TAccountGroupMint,\n TAccountSystemProgram\n >);\n}\n\nexport type InitializeInput<\n TAccountAuthority extends string = string,\n TAccountRegistryConfig extends string = string,\n TAccountGroupMint extends string = string,\n TAccountSystemProgram extends string = string,\n> = {\n /** Initial registry authority (will be multisig in production) */\n authority: TransactionSigner<TAccountAuthority>;\n /** Registry configuration PDA */\n registryConfig: Address<TAccountRegistryConfig>;\n /** TokenGroup mint - created and initialized by client, then finalized here */\n groupMint: Address<TAccountGroupMint>;\n systemProgram?: Address<TAccountSystemProgram>;\n};\n\nexport function getInitializeInstruction<\n TAccountAuthority extends string,\n TAccountRegistryConfig extends string,\n TAccountGroupMint extends string,\n TAccountSystemProgram extends string,\n TProgramAddress extends Address = typeof SATI_PROGRAM_ADDRESS,\n>(\n input: InitializeInput<\n TAccountAuthority,\n TAccountRegistryConfig,\n TAccountGroupMint,\n TAccountSystemProgram\n >,\n config?: { programAddress?: TProgramAddress },\n): InitializeInstruction<\n TProgramAddress,\n TAccountAuthority,\n TAccountRegistryConfig,\n TAccountGroupMint,\n TAccountSystemProgram\n> {\n // Program address.\n const programAddress = config?.programAddress ?? SATI_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n authority: { value: input.authority ?? null, isWritable: true },\n registryConfig: { value: input.registryConfig ?? null, isWritable: true },\n groupMint: { value: input.groupMint ?? null, isWritable: true },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n \"11111111111111111111111111111111\" as Address<\"11111111111111111111111111111111\">;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, \"programId\");\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.authority),\n getAccountMeta(accounts.registryConfig),\n getAccountMeta(accounts.groupMint),\n getAccountMeta(accounts.systemProgram),\n ],\n data: getInitializeInstructionDataEncoder().encode({}),\n programAddress,\n } as InitializeInstruction<\n TProgramAddress,\n TAccountAuthority,\n TAccountRegistryConfig,\n TAccountGroupMint,\n TAccountSystemProgram\n >);\n}\n\nexport type ParsedInitializeInstruction<\n TProgram extends string = typeof SATI_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address<TProgram>;\n accounts: {\n /** Initial registry authority (will be multisig in production) */\n authority: TAccountMetas[0];\n /** Registry configuration PDA */\n registryConfig: TAccountMetas[1];\n /** TokenGroup mint - created and initialized by client, then finalized here */\n groupMint: TAccountMetas[2];\n systemProgram: TAccountMetas[3];\n };\n data: InitializeInstructionData;\n};\n\nexport function parseInitializeInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction<TProgram> &\n InstructionWithAccounts<TAccountMetas> &\n InstructionWithData<ReadonlyUint8Array>,\n): ParsedInitializeInstruction<TProgram, TAccountMetas> {\n if (instruction.accounts.length < 4) {\n // TODO: Coded error.\n throw new Error(\"Not enough accounts\");\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n authority: getNextAccount(),\n registryConfig: getNextAccount(),\n groupMint: getNextAccount(),\n systemProgram: getNextAccount(),\n },\n data: getInitializeInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n addDecoderSizePrefix,\n addEncoderSizePrefix,\n combineCodec,\n fixDecoderSize,\n fixEncoderSize,\n getAddressEncoder,\n getBytesDecoder,\n getBytesEncoder,\n getProgramDerivedAddress,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getU8Decoder,\n getU8Encoder,\n getUtf8Decoder,\n getUtf8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n} from \"@solana/kit\";\nimport { SATI_PROGRAM_ADDRESS } from \"../programs\";\nimport {\n expectAddress,\n getAccountMetaFactory,\n type ResolvedAccount,\n} from \"../shared\";\n\nexport const LINK_EVM_ADDRESS_DISCRIMINATOR = new Uint8Array([\n 156, 75, 131, 178, 64, 110, 236, 64,\n]);\n\nexport function getLinkEvmAddressDiscriminatorBytes() {\n return fixEncoderSize(getBytesEncoder(), 8).encode(\n LINK_EVM_ADDRESS_DISCRIMINATOR,\n );\n}\n\nexport type LinkEvmAddressInstruction<\n TProgram extends string = typeof SATI_PROGRAM_ADDRESS,\n TAccountOwner extends string | AccountMeta<string> = string,\n TAccountAgentMint extends string | AccountMeta<string> = string,\n TAccountAta extends string | AccountMeta<string> = string,\n TAccountTokenProgram extends string | AccountMeta<string> =\n \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n TRemainingAccounts extends readonly AccountMeta<string>[] = [],\n> = Instruction<TProgram> &\n InstructionWithData<ReadonlyUint8Array> &\n InstructionWithAccounts<\n [\n TAccountOwner extends string\n ? ReadonlySignerAccount<TAccountOwner> &\n AccountSignerMeta<TAccountOwner>\n : TAccountOwner,\n TAccountAgentMint extends string\n ? ReadonlyAccount<TAccountAgentMint>\n : TAccountAgentMint,\n TAccountAta extends string ? ReadonlyAccount<TAccountAta> : TAccountAta,\n TAccountTokenProgram extends string\n ? ReadonlyAccount<TAccountTokenProgram>\n : TAccountTokenProgram,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type LinkEvmAddressInstructionData = {\n discriminator: ReadonlyUint8Array;\n /** EVM address (20 bytes) */\n evmAddress: ReadonlyUint8Array;\n /** CAIP-2 chain identifier (e.g., \"eip155:1\", \"eip155:8453\") */\n chainId: string;\n /** secp256k1 signature (64 bytes: r || s) */\n signature: ReadonlyUint8Array;\n /** Recovery ID (0 or 1) */\n recoveryId: number;\n};\n\nexport type LinkEvmAddressInstructionDataArgs = {\n /** EVM address (20 bytes) */\n evmAddress: ReadonlyUint8Array;\n /** CAIP-2 chain identifier (e.g., \"eip155:1\", \"eip155:8453\") */\n chainId: string;\n /** secp256k1 signature (64 bytes: r || s) */\n signature: ReadonlyUint8Array;\n /** Recovery ID (0 or 1) */\n recoveryId: number;\n};\n\nexport function getLinkEvmAddressInstructionDataEncoder(): Encoder<LinkEvmAddressInstructionDataArgs> {\n return transformEncoder(\n getStructEncoder([\n [\"discriminator\", fixEncoderSize(getBytesEncoder(), 8)],\n [\"evmAddress\", fixEncoderSize(getBytesEncoder(), 20)],\n [\"chainId\", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n [\"signature\", fixEncoderSize(getBytesEncoder(), 64)],\n [\"recoveryId\", getU8Encoder()],\n ]),\n (value) => ({ ...value, discriminator: LINK_EVM_ADDRESS_DISCRIMINATOR }),\n );\n}\n\nexport function getLinkEvmAddressInstructionDataDecoder(): Decoder<LinkEvmAddressInstructionData> {\n return getStructDecoder([\n [\"discriminator\", fixDecoderSize(getBytesDecoder(), 8)],\n [\"evmAddress\", fixDecoderSize(getBytesDecoder(), 20)],\n [\"chainId\", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n [\"signature\", fixDecoderSize(getBytesDecoder(), 64)],\n [\"recoveryId\", getU8Decoder()],\n ]);\n}\n\nexport function getLinkEvmAddressInstructionDataCodec(): Codec<\n LinkEvmAddressInstructionDataArgs,\n LinkEvmAddressInstructionData\n> {\n return combineCodec(\n getLinkEvmAddressInstructionDataEncoder(),\n getLinkEvmAddressInstructionDataDecoder(),\n );\n}\n\nexport type LinkEvmAddressAsyncInput<\n TAccountOwner extends string = string,\n TAccountAgentMint extends string = string,\n TAccountAta extends string = string,\n TAccountTokenProgram extends string = string,\n> = {\n /** Agent owner (must sign) */\n owner: TransactionSigner<TAccountOwner>;\n /** Agent mint account */\n agentMint: Address<TAccountAgentMint>;\n /**\n * Owner's associated token account for this mint\n * Validated to be correct ATA for the agent_mint and have balance > 0\n */\n ata?: Address<TAccountAta>;\n /** Token-2022 program for ATA verification */\n tokenProgram?: Address<TAccountTokenProgram>;\n evmAddress: LinkEvmAddressInstructionDataArgs[\"evmAddress\"];\n chainId: LinkEvmAddressInstructionDataArgs[\"chainId\"];\n signature: LinkEvmAddressInstructionDataArgs[\"signature\"];\n recoveryId: LinkEvmAddressInstructionDataArgs[\"recoveryId\"];\n};\n\nexport async function getLinkEvmAddressInstructionAsync<\n TAccountOwner extends string,\n TAccountAgentMint extends string,\n TAccountAta extends string,\n TAccountTokenProgram extends string,\n TProgramAddress extends Address = typeof SATI_PROGRAM_ADDRESS,\n>(\n input: LinkEvmAddressAsyncInput<\n TAccountOwner,\n TAccountAgentMint,\n TAccountAta,\n TAccountTokenProgram\n >,\n config?: { programAddress?: TProgramAddress },\n): Promise<\n LinkEvmAddressInstruction<\n TProgramAddress,\n TAccountOwner,\n TAccountAgentMint,\n TAccountAta,\n TAccountTokenProgram\n >\n> {\n // Program address.\n const programAddress = config?.programAddress ?? SATI_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n owner: { value: input.owner ?? null, isWritable: false },\n agentMint: { value: input.agentMint ?? null, isWritable: false },\n ata: { value: input.ata ?? null, isWritable: false },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.tokenProgram.value) {\n accounts.tokenProgram.value =\n \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\" as Address<\"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\">;\n }\n if (!accounts.ata.value) {\n accounts.ata.value = await getProgramDerivedAddress({\n programAddress:\n \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\" as Address<\"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\">,\n seeds: [\n getAddressEncoder().encode(expectAddress(accounts.owner.value)),\n getAddressEncoder().encode(expectAddress(accounts.tokenProgram.value)),\n getAddressEncoder().encode(expectAddress(accounts.agentMint.value)),\n ],\n });\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, \"programId\");\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.owner),\n getAccountMeta(accounts.agentMint),\n getAccountMeta(accounts.ata),\n getAccountMeta(accounts.tokenProgram),\n ],\n data: getLinkEvmAddressInstructionDataEncoder().encode(\n args as LinkEvmAddressInstructionDataArgs,\n ),\n programAddress,\n } as LinkEvmAddressInstruction<\n TProgramAddress,\n TAccountOwner,\n TAccountAgentMint,\n TAccountAta,\n TAccountTokenProgram\n >);\n}\n\nexport type LinkEvmAddressInput<\n TAccountOwner extends string = string,\n TAccountAgentMint extends string = string,\n TAccountAta extends string = string,\n TAccountTokenProgram extends string = string,\n> = {\n /** Agent owner (must sign) */\n owner: TransactionSigner<TAccountOwner>;\n /** Agent mint account */\n agentMint: Address<TAccountAgentMint>;\n /**\n * Owner's associated token account for this mint\n * Validated to be correct ATA for the agent_mint and have balance > 0\n */\n ata: Address<TAccountAta>;\n /** Token-2022 program for ATA verification */\n tokenProgram?: Address<TAccountTokenProgram>;\n evmAddress: LinkEvmAddressInstructionDataArgs[\"evmAddress\"];\n chainId: LinkEvmAddressInstructionDataArgs[\"chainId\"];\n signature: LinkEvmAddressInstructionDataArgs[\"signature\"];\n recoveryId: LinkEvmAddressInstructionDataArgs[\"recoveryId\"];\n};\n\nexport function getLinkEvmAddressInstruction<\n TAccountOwner extends string,\n TAccountAgentMint extends string,\n TAccountAta extends string,\n TAccountTokenProgram extends string,\n TProgramAddress extends Address = typeof SATI_PROGRAM_ADDRESS,\n>(\n input: LinkEvmAddressInput<\n TAccountOwner,\n TAccountAgentMint,\n TAccountAta,\n TAccountTokenProgram\n >,\n config?: { programAddress?: TProgramAddress },\n): LinkEvmAddressInstruction<\n TProgramAddress,\n TAccountOwner,\n TAccountAgentMint,\n TAccountAta,\n TAccountTokenProgram\n> {\n // Program address.\n const programAddress = config?.programAddress ?? SATI_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n owner: { value: input.owner ?? null, isWritable: false },\n agentMint: { value: input.agentMint ?? null, isWritable: false },\n ata: { value: input.ata ?? null, isWritable: false },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.tokenProgram.value) {\n accounts.tokenProgram.value =\n \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\" as Address<\"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\">;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, \"programId\");\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.owner),\n getAccountMeta(accounts.agentMint),\n getAccountMeta(accounts.ata),\n getAccountMeta(accounts.tokenProgram),\n ],\n data: getLinkEvmAddressInstructionDataEncoder().encode(\n args as LinkEvmAddressInstructionDataArgs,\n ),\n programAddress,\n } as LinkEvmAddressInstruction<\n TProgramAddress,\n TAccountOwner,\n TAccountAgentMint,\n TAccountAta,\n TAccountTokenProgram\n >);\n}\n\nexport type ParsedLinkEvmAddressInstruction<\n TProgram extends string = typeof SATI_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address<TProgram>;\n accounts: {\n /** Agent owner (must sign) */\n owner: TAccountMetas[0];\n /** Agent mint account */\n agentMint: TAccountMetas[1];\n /**\n * Owner's associated token account for this mint\n * Validated to be correct ATA for the agent_mint and have balance > 0\n */\n ata: TAccountMetas[2];\n /** Token-2022 program for ATA verification */\n tokenProgram: TAccountMetas[3];\n };\n data: LinkEvmAddressInstructionData;\n};\n\nexport function parseLinkEvmAddressInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction<TProgram> &\n InstructionWithAccounts<TAccountMetas> &\n InstructionWithData<ReadonlyUint8Array>,\n): ParsedLinkEvmAddressInstruction<TProgram, TAccountMetas> {\n if (instruction.accounts.length < 4) {\n // TODO: Coded error.\n throw new Error(\"Not enough accounts\");\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n owner: getNextAccount(),\n agentMint: getNextAccount(),\n ata: getNextAccount(),\n tokenProgram: getNextAccount(),\n },\n data: getLinkEvmAddressInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n addDecoderSizePrefix,\n addEncoderSizePrefix,\n combineCodec,\n fixDecoderSize,\n fixEncoderSize,\n getArrayDecoder,\n getArrayEncoder,\n getBooleanDecoder,\n getBooleanEncoder,\n getBytesDecoder,\n getBytesEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getProgramDerivedAddress,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getUtf8Decoder,\n getUtf8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n type WritableSignerAccount,\n} from \"@solana/kit\";\nimport { SATI_PROGRAM_ADDRESS } from \"../programs\";\nimport { getAccountMetaFactory, type ResolvedAccount } from \"../shared\";\nimport {\n getMetadataEntryDecoder,\n getMetadataEntryEncoder,\n type MetadataEntry,\n type MetadataEntryArgs,\n} from \"../types\";\n\nexport const REGISTER_AGENT_DISCRIMINATOR = new Uint8Array([\n 135, 157, 66, 195, 2, 113, 175, 30,\n]);\n\nexport function getRegisterAgentDiscriminatorBytes() {\n return fixEncoderSize(getBytesEncoder(), 8).encode(\n REGISTER_AGENT_DISCRIMINATOR,\n );\n}\n\nexport type RegisterAgentInstruction<\n TProgram extends string = typeof SATI_PROGRAM_ADDRESS,\n TAccountPayer extends string | AccountMeta<string> = string,\n TAccountOwner extends string | AccountMeta<string> = string,\n TAccountRegistryConfig extends string | AccountMeta<string> = string,\n TAccountGroupMint extends string | AccountMeta<string> = string,\n TAccountAgentMint extends string | AccountMeta<string> = string,\n TAccountAgentTokenAccount extends string | AccountMeta<string> = string,\n TAccountToken2022Program extends string | AccountMeta<string> =\n \"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\",\n TAccountAgentIndex extends string | AccountMeta<string> = string,\n TAccountAssociatedTokenProgram extends string | AccountMeta<string> =\n \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\",\n TAccountSystemProgram extends string | AccountMeta<string> =\n \"11111111111111111111111111111111\",\n TRemainingAccounts extends readonly AccountMeta<string>[] = [],\n> = Instruction<TProgram> &\n InstructionWithData<ReadonlyUint8Array> &\n InstructionWithAccounts<\n [\n TAccountPayer extends string\n ? WritableSignerAccount<TAccountPayer> &\n AccountSignerMeta<TAccountPayer>\n : TAccountPayer,\n TAccountOwner extends string\n ? ReadonlyAccount<TAccountOwner>\n : TAccountOwner,\n TAccountRegistryConfig extends string\n ? WritableAccount<TAccountRegistryConfig>\n : TAccountRegistryConfig,\n TAccountGroupMint extends string\n ? WritableAccount<TAccountGroupMint>\n : TAccountGroupMint,\n TAccountAgentMint extends string\n ? WritableSignerAccount<TAccountAgentMint> &\n AccountSignerMeta<TAccountAgentMint>\n : TAccountAgentMint,\n TAccountAgentTokenAccount extends string\n ? WritableAccount<TAccountAgentTokenAccount>\n : TAccountAgentTokenAccount,\n TAccountToken2022Program extends string\n ? ReadonlyAccount<TAccountToken2022Program>\n : TAccountToken2022Program,\n TAccountAgentIndex extends string\n ? WritableAccount<TAccountAgentIndex>\n : TAccountAgentIndex,\n TAccountAssociatedTokenProgram extends string\n ? ReadonlyAccount<TAccountAssociatedTokenProgram>\n : TAccountAssociatedTokenProgram,\n TAccountSystemProgram extends string\n ? ReadonlyAccount<TAccountSystemProgram>\n : TAccountSystemProgram,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type RegisterAgentInstructionData = {\n discriminator: ReadonlyUint8Array;\n name: string;\n symbol: string;\n uri: string;\n additionalMetadata: Option<Array<MetadataEntry>>;\n nonTransferable: boolean;\n};\n\nexport type RegisterAgentInstructionDataArgs = {\n name: string;\n symbol: string;\n uri: string;\n additionalMetadata: OptionOrNullable<Array<MetadataEntryArgs>>;\n nonTransferable: boolean;\n};\n\nexport function getRegisterAgentInstructionDataEncoder(): Encoder<RegisterAgentInstructionDataArgs> {\n return transformEncoder(\n getStructEncoder([\n [\"discriminator\", fixEncoderSize(getBytesEncoder(), 8)],\n [\"name\", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n [\"symbol\", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n [\"uri\", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n [\n \"additionalMetadata\",\n getOptionEncoder(getArrayEncoder(getMetadataEntryEncoder())),\n ],\n [\"nonTransferable\", getBooleanEncoder()],\n ]),\n (value) => ({ ...value, discriminator: REGISTER_AGENT_DISCRIMINATOR }),\n );\n}\n\nexport function getRegisterAgentInstructionDataDecoder(): Decoder<RegisterAgentInstructionData> {\n return getStructDecoder([\n [\"discriminator\", fixDecoderSize(getBytesDecoder(), 8)],\n [\"name\", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n [\"symbol\", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n [\"uri\", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n [\n \"additionalMetadata\",\n getOptionDecoder(getArrayDecoder(getMetadataEntryDecoder())),\n ],\n [\"nonTransferable\", getBooleanDecoder()],\n ]);\n}\n\nexport function getRegisterAgentInstructionDataCodec(): Codec<\n RegisterAgentInstructionDataArgs,\n RegisterAgentInstructionData\n> {\n return combineCodec(\n getRegisterAgentInstructionDataEncoder(),\n getRegisterAgentInstructionDataDecoder(),\n );\n}\n\nexport type RegisterAgentAsyncInput<\n TAccountPayer extends string = string,\n TAccountOwner extends string = string,\n TAccountRegistryConfig extends string = string,\n TAccountGroupMint extends string = string,\n TAccountAgentMint extends string = string,\n TAccountAgentTokenAccount extends string = string,\n TAccountToken2022Program extends string = string,\n TAccountAgentIndex extends string = string,\n TAccountAssociatedTokenProgram extends string = string,\n TAccountSystemProgram extends string = string,\n> = {\n /** Pays for account creation */\n payer: TransactionSigner<TAccountPayer>;\n /** Agent NFT owner (default: payer) */\n owner: Address<TAccountOwner>;\n /** Registry configuration */\n registryConfig?: Address<TAccountRegistryConfig>;\n /** TokenGroup mint (for membership) */\n groupMint: Address<TAccountGroupMint>;\n /** New agent NFT mint (randomly generated keypair) */\n agentMint: TransactionSigner<TAccountAgentMint>;\n /** Owner's ATA for agent NFT */\n agentTokenAccount: Address<TAccountAgentTokenAccount>;\n token2022Program?: Address<TAccountToken2022Program>;\n /**\n * Agent index PDA for enumeration by member_number\n * NOTE: Uses (current_count + 1) which equals the new total_agents after increment\n */\n agentIndex: Address<TAccountAgentIndex>;\n associatedTokenProgram?: Address<TAccountAssociatedTokenProgram>;\n systemProgram?: Address<TAccountSystemProgram>;\n name: RegisterAgentInstructionDataArgs[\"name\"];\n symbol: RegisterAgentInstructionDataArgs[\"symbol\"];\n uri: RegisterAgentInstructionDataArgs[\"uri\"];\n additionalMetadata: RegisterAgentInstructionDataArgs[\"additionalMetadata\"];\n nonTransferable: RegisterAgentInstructionDataArgs[\"nonTransferable\"];\n};\n\nexport async function getRegisterAgentInstructionAsync<\n TAccountPayer extends string,\n TAccountOwner extends string,\n TAccountRegistryConfig extends string,\n TAccountGroupMint extends string,\n TAccountAgentMint extends string,\n TAccountAgentTokenAccount extends string,\n TAccountToken2022Program extends string,\n TAccountAgentIndex extends string,\n TAccountAssociatedTokenProgram extends string,\n TAccountSystemProgram extends string,\n TProgramAddress extends Address = typeof SATI_PROGRAM_ADDRESS,\n>(\n input: RegisterAgentAsyncInput<\n TAccountPayer,\n TAccountOwner,\n TAccountRegistryConfig,\n TAccountGroupMint,\n TAccountAgentMint,\n TAccountAgentTokenAccount,\n TAccountToken2022Program,\n TAccountAgentIndex,\n TAccountAssociatedTokenProgram,\n TAccountSystemProgram\n >,\n config?: { programAddress?: TProgramAddress },\n): Promise<\n RegisterAgentInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountOwner,\n TAccountRegistryConfig,\n TAccountGroupMint,\n TAccountAgentMint,\n TAccountAgentTokenAccount,\n TAccountToken2022Program,\n TAccountAgentIndex,\n TAccountAssociatedTokenProgram,\n TAccountSystemProgram\n >\n> {\n // Program address.\n const programAddress = config?.programAddress ?? SATI_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n registryConfig: { value: input.registryConfig ?? null, isWritable: true },\n groupMint: { value: input.groupMint ?? null, isWritable: true },\n agentMint: { value: input.agentMint ?? null, isWritable: true },\n agentTokenAccount: {\n value: input.agentTokenAccount ?? null,\n isWritable: true,\n },\n token2022Program: {\n value: input.token2022Program ?? null,\n isWritable: false,\n },\n agentIndex: { value: input.agentIndex ?? null, isWritable: true },\n associatedTokenProgram: {\n value: input.associatedTokenProgram ?? null,\n isWritable: false,\n },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.registryConfig.value) {\n accounts.registryConfig.value = await getProgramDerivedAddress({\n programAddress,\n seeds: [\n getBytesEncoder().encode(\n new Uint8Array([114, 101, 103, 105, 115, 116, 114, 121]),\n ),\n ],\n });\n }\n if (!accounts.token2022Program.value) {\n accounts.token2022Program.value =\n \"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\" as Address<\"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\">;\n }\n if (!accounts.associatedTokenProgram.value) {\n accounts.associatedTokenProgram.value =\n \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\" as Address<\"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\">;\n }\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n \"11111111111111111111111111111111\" as Address<\"11111111111111111111111111111111\">;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, \"programId\");\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.owner),\n getAccountMeta(accounts.registryConfig),\n getAccountMeta(accounts.groupMint),\n getAccountMeta(accounts.agentMint),\n getAccountMeta(accounts.agentTokenAccount),\n getAccountMeta(accounts.token2022Program),\n getAccountMeta(accounts.agentIndex),\n getAccountMeta(accounts.associatedTokenProgram),\n getAccountMeta(accounts.systemProgram),\n ],\n data: getRegisterAgentInstructionDataEncoder().encode(\n args as RegisterAgentInstructionDataArgs,\n ),\n programAddress,\n } as RegisterAgentInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountOwner,\n TAccountRegistryConfig,\n TAccountGroupMint,\n TAccountAgentMint,\n TAccountAgentTokenAccount,\n TAccountToken2022Program,\n TAccountAgentIndex,\n TAccountAssociatedTokenProgram,\n TAccountSystemProgram\n >);\n}\n\nexport type RegisterAgentInput<\n TAccountPayer extends string = string,\n TAccountOwner extends string = string,\n TAccountRegistryConfig extends string = string,\n TAccountGroupMint extends string = string,\n TAccountAgentMint extends string = string,\n TAccountAgentTokenAccount extends string = string,\n TAccountToken2022Program extends string = string,\n TAccountAgentIndex extends string = string,\n TAccountAssociatedTokenProgram extends string = string,\n TAccountSystemProgram extends string = string,\n> = {\n /** Pays for account creation */\n payer: TransactionSigner<TAccountPayer>;\n /** Agent NFT owner (default: payer) */\n owner: Address<TAccountOwner>;\n /** Registry configuration */\n registryConfig: Address<TAccountRegistryConfig>;\n /** TokenGroup mint (for membership) */\n groupMint: Address<TAccountGroupMint>;\n /** New agent NFT mint (randomly generated keypair) */\n agentMint: TransactionSigner<TAccountAgentMint>;\n /** Owner's ATA for agent NFT */\n agentTokenAccount: Address<TAccountAgentTokenAccount>;\n token2022Program?: Address<TAccountToken2022Program>;\n /**\n * Agent index PDA for enumeration by member_number\n * NOTE: Uses (current_count + 1) which equals the new total_agents after increment\n */\n agentIndex: Address<TAccountAgentIndex>;\n associatedTokenProgram?: Address<TAccountAssociatedTokenProgram>;\n systemProgram?: Address<TAccountSystemProgram>;\n name: RegisterAgentInstructionDataArgs[\"name\"];\n symbol: RegisterAgentInstructionDataArgs[\"symbol\"];\n uri: RegisterAgentInstructionDataArgs[\"uri\"];\n additionalMetadata: RegisterAgentInstructionDataArgs[\"additionalMetadata\"];\n nonTransferable: RegisterAgentInstructionDataArgs[\"nonTransferable\"];\n};\n\nexport function getRegisterAgentInstruction<\n TAccountPayer extends string,\n TAccountOwner extends string,\n TAccountRegistryConfig extends string,\n TAccountGroupMint extends string,\n TAccountAgentMint extends string,\n TAccountAgentTokenAccount extends string,\n TAccountToken2022Program extends string,\n TAccountAgentIndex extends string,\n TAccountAssociatedTokenProgram extends string,\n TAccountSystemProgram extends string,\n TProgramAddress extends Address = typeof SATI_PROGRAM_ADDRESS,\n>(\n input: RegisterAgentInput<\n TAccountPayer,\n TAccountOwner,\n TAccountRegistryConfig,\n TAccountGroupMint,\n TAccountAgentMint,\n TAccountAgentTokenAccount,\n TAccountToken2022Program,\n TAccountAgentIndex,\n TAccountAssociatedTokenProgram,\n TAccountSystemProgram\n >,\n config?: { programAddress?: TProgramAddress },\n): RegisterAgentInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountOwner,\n TAccountRegistryConfig,\n TAccountGroupMint,\n TAccountAgentMint,\n TAccountAgentTokenAccount,\n TAccountToken2022Program,\n TAccountAgentIndex,\n TAccountAssociatedTokenProgram,\n TAccountSystemProgram\n> {\n // Program address.\n const programAddress = config?.programAddress ?? SATI_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n registryConfig: { value: input.registryConfig ?? null, isWritable: true },\n groupMint: { value: input.groupMint ?? null, isWritable: true },\n agentMint: { value: input.agentMint ?? null, isWritable: true },\n agentTokenAccount: {\n value: input.agentTokenAccount ?? null,\n isWritable: true,\n },\n token2022Program: {\n value: input.token2022Program ?? null,\n isWritable: false,\n },\n agentIndex: { value: input.agentIndex ?? null, isWritable: true },\n associatedTokenProgram: {\n value: input.associatedTokenProgram ?? null,\n isWritable: false,\n },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.token2022Program.value) {\n accounts.token2022Program.value =\n \"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\" as Address<\"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\">;\n }\n if (!accounts.associatedTokenProgram.value) {\n accounts.associatedTokenProgram.value =\n \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\" as Address<\"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\">;\n }\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n \"11111111111111111111111111111111\" as Address<\"11111111111111111111111111111111\">;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, \"programId\");\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.owner),\n getAccountMeta(accounts.registryConfig),\n getAccountMeta(accounts.groupMint),\n getAccountMeta(accounts.agentMint),\n getAccountMeta(accounts.agentTokenAccount),\n getAccountMeta(accounts.token2022Program),\n getAccountMeta(accounts.agentIndex),\n getAccountMeta(accounts.associatedTokenProgram),\n getAccountMeta(accounts.systemProgram),\n ],\n data: getRegisterAgentInstructionDataEncoder().encode(\n args as RegisterAgentInstructionDataArgs,\n ),\n programAddress,\n } as RegisterAgentInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountOwner,\n TAccountRegistryConfig,\n TAccountGroupMint,\n TAccountAgentMint,\n TAccountAgentTokenAccount,\n TAccountToken2022Program,\n TAccountAgentIndex,\n TAccountAssociatedTokenProgram,\n TAccountSystemProgram\n >);\n}\n\nexport type ParsedRegisterAgentInstruction<\n TProgram extends string = typeof SATI_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address<TProgram>;\n accounts: {\n /** Pays for account creation */\n payer: TAccountMetas[0];\n /** Agent NFT owner (default: payer) */\n owner: TAccountMetas[1];\n /** Registry configuration */\n registryConfig: TAccountMetas[2];\n /** TokenGroup mint (for membership) */\n groupMint: TAccountMetas[3];\n /** New agent NFT mint (randomly generated keypair) */\n agentMint: TAccountMetas[4];\n /** Owner's ATA for agent NFT */\n agentTokenAccount: TAccountMetas[5];\n token2022Program: TAccountMetas[6];\n /**\n * Agent index PDA for enumeration by member_number\n * NOTE: Uses (current_count + 1) which equals the new total_agents after increment\n */\n agentIndex: TAccountMetas[7];\n associatedTokenProgram: TAccountMetas[8];\n systemProgram: TAccountMetas[9];\n };\n data: RegisterAgentInstructionData;\n};\n\nexport function parseRegisterAgentInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction<TProgram> &\n InstructionWithAccounts<TAccountMetas> &\n InstructionWithData<ReadonlyUint8Array>,\n): ParsedRegisterAgentInstruction<TProgram, TAccountMetas> {\n if (instruction.accounts.length < 10) {\n // TODO: Coded error.\n throw new Error(\"Not enough accounts\");\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n payer: getNextAccount(),\n owner: getNextAccount(),\n registryConfig: getNextAccount(),\n groupMint: getNextAccount(),\n agentMint: getNextAccount(),\n agentTokenAccount: getNextAccount(),\n token2022Program: getNextAccount(),\n agentIndex: getNextAccount(),\n associatedTokenProgram: getNextAccount(),\n systemProgram: getNextAccount(),\n },\n data: getRegisterAgentInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n addDecoderSizePrefix,\n addEncoderSizePrefix,\n combineCodec,\n fixDecoderSize,\n fixEncoderSize,\n getAddressDecoder,\n getAddressEncoder,\n getBooleanDecoder,\n getBooleanEncoder,\n getBytesDecoder,\n getBytesEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getProgramDerivedAddress,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getUtf8Decoder,\n getUtf8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n type WritableSignerAccount,\n} from \"@solana/kit\";\nimport { SATI_PROGRAM_ADDRESS } from \"../programs\";\nimport {\n expectSome,\n getAccountMetaFactory,\n type ResolvedAccount,\n} from \"../shared\";\nimport {\n getSignatureModeDecoder,\n getSignatureModeEncoder,\n getStorageTypeDecoder,\n getStorageTypeEncoder,\n type SignatureMode,\n type SignatureModeArgs,\n type StorageType,\n type StorageTypeArgs,\n} from \"../types\";\n\nexport const REGISTER_SCHEMA_CONFIG_DISCRIMINATOR = new Uint8Array([\n 21, 131, 188, 124, 189, 202, 70, 210,\n]);\n\nexport function getRegisterSchemaConfigDiscriminatorBytes() {\n return fixEncoderSize(getBytesEncoder(), 8).encode(\n REGISTER_SCHEMA_CONFIG_DISCRIMINATOR,\n );\n}\n\nexport type RegisterSchemaConfigInstruction<\n TProgram extends string = typeof SATI_PROGRAM_ADDRESS,\n TAccountPayer extends string | AccountMeta<string> = string,\n TAccountRegistryConfig extends string | AccountMeta<string> = string,\n TAccountAuthority extends string | AccountMeta<string> = string,\n TAccountSchemaConfig extends string | AccountMeta<string> = string,\n TAccountSystemProgram extends string | AccountMeta<string> =\n \"11111111111111111111111111111111\",\n TRemainingAccounts extends readonly AccountMeta<string>[] = [],\n> = Instruction<TProgram> &\n InstructionWithData<ReadonlyUint8Array> &\n InstructionWithAccounts<\n [\n TAccountPayer extends string\n ? WritableSignerAccount<TAccountPayer> &\n AccountSignerMeta<TAccountPayer>\n : TAccountPayer,\n TAccountRegistryConfig extends string\n ? ReadonlyAccount<TAccountRegistryConfig>\n : TAccountRegistryConfig,\n TAccountAuthority extends string\n ? ReadonlySignerAccount<TAccountAuthority> &\n AccountSignerMeta<TAccountAuthority>\n : TAccountAuthority,\n TAccountSchemaConfig extends string\n ? WritableAccount<TAccountSchemaConfig>\n : TAccountSchemaConfig,\n TAccountSystemProgram extends string\n ? ReadonlyAccount<TAccountSystemProgram>\n : TAccountSystemProgram,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type RegisterSchemaConfigInstructionData = {\n discriminator: ReadonlyUint8Array;\n sasSchema: Address;\n signatureMode: SignatureMode;\n storageType: StorageType;\n delegationSchema: Option<Address>;\n closeable: boolean;\n name: string;\n};\n\nexport type RegisterSchemaConfigInstructionDataArgs = {\n sasSchema: Address;\n signatureMode: SignatureModeArgs;\n storageType: StorageTypeArgs;\n delegationSchema: OptionOrNullable<Address>;\n closeable: boolean;\n name: string;\n};\n\nexport function getRegisterSchemaConfigInstructionDataEncoder(): Encoder<RegisterSchemaConfigInstructionDataArgs> {\n return transformEncoder(\n getStructEncoder([\n [\"discriminator\", fixEncoderSize(getBytesEncoder(), 8)],\n [\"sasSchema\", getAddressEncoder()],\n [\"signatureMode\", getSignatureModeEncoder()],\n [\"storageType\", getStorageTypeEncoder()],\n [\"delegationSchema\", getOptionEncoder(getAddressEncoder())],\n [\"closeable\", getBooleanEncoder()],\n [\"name\", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n ]),\n (value) => ({\n ...value,\n discriminator: REGISTER_SCHEMA_CONFIG_DISCRIMINATOR,\n }),\n );\n}\n\nexport function getRegisterSchemaConfigInstructionDataDecoder(): Decoder<RegisterSchemaConfigInstructionData> {\n return getStructDecoder([\n [\"discriminator\", fixDecoderSize(getBytesDecoder(), 8)],\n [\"sasSchema\", getAddressDecoder()],\n [\"signatureMode\", getSignatureModeDecoder()],\n [\"storageType\", getStorageTypeDecoder()],\n [\"delegationSchema\", getOptionDecoder(getAddressDecoder())],\n [\"closeable\", getBooleanDecoder()],\n [\"name\", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n ]);\n}\n\nexport function getRegisterSchemaConfigInstructionDataCodec(): Codec<\n RegisterSchemaConfigInstructionDataArgs,\n RegisterSchemaConfigInstructionData\n> {\n return combineCodec(\n getRegisterSchemaConfigInstructionDataEncoder(),\n getRegisterSchemaConfigInstructionDataDecoder(),\n );\n}\n\nexport type RegisterSchemaConfigAsyncInput<\n TAccountPayer extends string = string,\n TAccountRegistryConfig extends string = string,\n TAccountAuthority extends string = string,\n TAccountSchemaConfig extends string = string,\n TAccountSystemProgram extends string = string,\n> = {\n /** Payer for account creation */\n payer: TransactionSigner<TAccountPayer>;\n /** Registry config - validates authority and checks mutability */\n registryConfig?: Address<TAccountRegistryConfig>;\n /** Authority that can register schemas (validated against registry_config) */\n authority: TransactionSigner<TAccountAuthority>;\n /** Schema config PDA to be created */\n schemaConfig?: Address<TAccountSchemaConfig>;\n systemProgram?: Address<TAccountSystemProgram>;\n sasSchema: RegisterSchemaConfigInstructionDataArgs[\"sasSchema\"];\n signatureMode: RegisterSchemaConfigInstructionDataArgs[\"signatureMode\"];\n storageType: RegisterSchemaConfigInstructionDataArgs[\"storageType\"];\n delegationSchema: RegisterSchemaConfigInstructionDataArgs[\"delegationSchema\"];\n closeable: RegisterSchemaConfigInstructionDataArgs[\"closeable\"];\n name: RegisterSchemaConfigInstructionDataArgs[\"name\"];\n};\n\nexport async function getRegisterSchemaConfigInstructionAsync<\n TAccountPayer extends string,\n TAccountRegistryConfig extends string,\n TAccountAuthority extends string,\n TAccountSchemaConfig extends string,\n TAccountSystemProgram extends string,\n TProgramAddress extends Address = typeof SATI_PROGRAM_ADDRESS,\n>(\n input: RegisterSchemaConfigAsyncInput<\n TAccountPayer,\n TAccountRegistryConfig,\n TAccountAuthority,\n TAccountSchemaConfig,\n TAccountSystemProgram\n >,\n config?: { programAddress?: TProgramAddress },\n): Promise<\n RegisterSchemaConfigInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountRegistryConfig,\n TAccountAuthority,\n TAccountSchemaConfig,\n TAccountSystemProgram\n >\n> {\n // Program address.\n const programAddress = config?.programAddress ?? SATI_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n registryConfig: { value: input.registryConfig ?? null, isWritable: false },\n authority: { value: input.authority ?? null, isWritable: false },\n schemaConfig: { value: input.schemaConfig ?? null, isWritable: true },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.registryConfig.value) {\n accounts.registryConfig.value = await getProgramDerivedAddress({\n programAddress,\n seeds: [\n getBytesEncoder().encode(\n new Uint8Array([114, 101, 103, 105, 115, 116, 114, 121]),\n ),\n ],\n });\n }\n if (!accounts.schemaConfig.value) {\n accounts.schemaConfig.value = await getProgramDerivedAddress({\n programAddress,\n seeds: [\n getBytesEncoder().encode(\n new Uint8Array([\n 115, 99, 104, 101, 109, 97, 95, 99, 111, 110, 102, 105, 103,\n ]),\n ),\n getAddressEncoder().encode(expectSome(args.sasSchema)),\n ],\n });\n }\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n \"11111111111111111111111111111111\" as Address<\"11111111111111111111111111111111\">;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, \"programId\");\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.registryConfig),\n getAccountMeta(accounts.authority),\n getAccountMeta(accounts.schemaConfig),\n getAccountMeta(accounts.systemProgram),\n ],\n data: getRegisterSchemaConfigInstructionDataEncoder().encode(\n args as RegisterSchemaConfigInstructionDataArgs,\n ),\n programAddress,\n } as RegisterSchemaConfigInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountRegistryConfig,\n TAccountAuthority,\n TAccountSchemaConfig,\n TAccountSystemProgram\n >);\n}\n\nexport type RegisterSchemaConfigInput<\n TAccountPayer extends string = string,\n TAccountRegistryConfig extends string = string,\n TAccountAuthority extends string = string,\n TAccountSchemaConfig extends string = string,\n TAccountSystemProgram extends string = string,\n> = {\n /** Payer for account creation */\n payer: TransactionSigner<TAccountPayer>;\n /** Registry config - validates authority and checks mutability */\n registryConfig: Address<TAccountRegistryConfig>;\n /** Authority that can register schemas (validated against registry_config) */\n authority: TransactionSigner<TAccountAuthority>;\n /** Schema config PDA to be created */\n schemaConfig: Address<TAccountSchemaConfig>;\n systemProgram?: Address<TAccountSystemProgram>;\n sasSchema: RegisterSchemaConfigInstructionDataArgs[\"sasSchema\"];\n signatureMode: RegisterSchemaConfigInstructionDataArgs[\"signatureMode\"];\n storageType: RegisterSchemaConfigInstructionDataArgs[\"storageType\"];\n delegationSchema: RegisterSchemaConfigInstructionDataArgs[\"delegationSchema\"];\n closeable: RegisterSchemaConfigInstructionDataArgs[\"closeable\"];\n name: RegisterSchemaConfigInstructionDataArgs[\"name\"];\n};\n\nexport function getRegisterSchemaConfigInstruction<\n TAccountPayer extends string,\n TAccountRegistryConfig extends string,\n TAccountAuthority extends string,\n TAccountSchemaConfig extends string,\n TAccountSystemProgram extends string,\n TProgramAddress extends Address = typeof SATI_PROGRAM_ADDRESS,\n>(\n input: RegisterSchemaConfigInput<\n TAccountPayer,\n TAccountRegistryConfig,\n TAccountAuthority,\n TAccountSchemaConfig,\n TAccountSystemProgram\n >,\n config?: { programAddress?: TProgramAddress },\n): RegisterSchemaConfigInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountRegistryConfig,\n TAccountAuthority,\n TAccountSchemaConfig,\n TAccountSystemProgram\n> {\n // Program address.\n const programAddress = config?.programAddress ?? SATI_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n registryConfig: { value: input.registryConfig ?? null, isWritable: false },\n authority: { value: input.authority ?? null, isWritable: false },\n schemaConfig: { value: input.schemaConfig ?? null, isWritable: true },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n \"11111111111111111111111111111111\" as Address<\"11111111111111111111111111111111\">;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, \"programId\");\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.registryConfig),\n getAccountMeta(accounts.authority),\n getAccountMeta(accounts.schemaConfig),\n getAccountMeta(accounts.systemProgram),\n ],\n data: getRegisterSchemaConfigInstructionDataEncoder().encode(\n args as RegisterSchemaConfigInstructionDataArgs,\n ),\n programAddress,\n } as RegisterSchemaConfigInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountRegistryConfig,\n TAccountAuthority,\n TAccountSchemaConfig,\n TAccountSystemProgram\n >);\n}\n\nexport type ParsedRegisterSchemaConfigInstruction<\n TProgram extends string = typeof SATI_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address<TProgram>;\n accounts: {\n /** Payer for account creation */\n payer: TAccountMetas[0];\n /** Registry config - validates authority and checks mutability */\n registryConfig: TAccountMetas[1];\n /** Authority that can register schemas (validated against registry_config) */\n authority: TAccountMetas[2];\n /** Schema config PDA to be created */\n schemaConfig: TAccountMetas[3];\n systemProgram: TAccountMetas[4];\n };\n data: RegisterSchemaConfigInstructionData;\n};\n\nexport function parseRegisterSchemaConfigInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction<TProgram> &\n InstructionWithAccounts<TAccountMetas> &\n InstructionWithData<ReadonlyUint8Array>,\n): ParsedRegisterSchemaConfigInstruction<TProgram, TAccountMetas> {\n if (instruction.accounts.length < 5) {\n // TODO: Coded error.\n throw new Error(\"Not enough accounts\");\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n payer: getNextAccount(),\n registryConfig: getNextAccount(),\n authority: getNextAccount(),\n schemaConfig: getNextAccount(),\n systemProgram: getNextAccount(),\n },\n data: getRegisterSchemaConfigInstructionDataDecoder().decode(\n instruction.data,\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n fixDecoderSize,\n fixEncoderSize,\n getAddressDecoder,\n getAddressEncoder,\n getBytesDecoder,\n getBytesEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getProgramDerivedAddress,\n getStructDecoder,\n getStructEncoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from \"@solana/kit\";\nimport { SATI_PROGRAM_ADDRESS } from \"../programs\";\nimport { getAccountMetaFactory, type ResolvedAccount } from \"../shared\";\n\nexport const UPDATE_REGISTRY_AUTHORITY_DISCRIMINATOR = new Uint8Array([\n 36, 103, 15, 149, 117, 134, 26, 41,\n]);\n\nexport function getUpdateRegistryAuthorityDiscriminatorBytes() {\n return fixEncoderSize(getBytesEncoder(), 8).encode(\n UPDATE_REGISTRY_AUTHORITY_DISCRIMINATOR,\n );\n}\n\nexport type UpdateRegistryAuthorityInstruction<\n TProgram extends string = typeof SATI_PROGRAM_ADDRESS,\n TAccountAuthority extends string | AccountMeta<string> = string,\n TAccountRegistryConfig extends string | AccountMeta<string> = string,\n TRemainingAccounts extends readonly AccountMeta<string>[] = [],\n> = Instruction<TProgram> &\n InstructionWithData<ReadonlyUint8Array> &\n InstructionWithAccounts<\n [\n TAccountAuthority extends string\n ? ReadonlySignerAccount<TAccountAuthority> &\n AccountSignerMeta<TAccountAuthority>\n : TAccountAuthority,\n TAccountRegistryConfig extends string\n ? WritableAccount<TAccountRegistryConfig>\n : TAccountRegistryConfig,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type UpdateRegistryAuthorityInstructionData = {\n discriminator: ReadonlyUint8Array;\n newAuthority: Option<Address>;\n};\n\nexport type UpdateRegistryAuthorityInstructionDataArgs = {\n newAuthority: OptionOrNullable<Address>;\n};\n\nexport function getUpdateRegistryAuthorityInstructionDataEncoder(): Encoder<UpdateRegistryAuthorityInstructionDataArgs> {\n return transformEncoder(\n getStructEncoder([\n [\"discriminator\", fixEncoderSize(getBytesEncoder(), 8)],\n [\"newAuthority\", getOptionEncoder(getAddressEncoder())],\n ]),\n (value) => ({\n ...value,\n discriminator: UPDATE_REGISTRY_AUTHORITY_DISCRIMINATOR,\n }),\n );\n}\n\nexport function getUpdateRegistryAuthorityInstructionDataDecoder(): Decoder<UpdateRegistryAuthorityInstructionData> {\n return getStructDecoder([\n [\"discriminator\", fixDecoderSize(getBytesDecoder(), 8)],\n [\"newAuthority\", getOptionDecoder(getAddressDecoder())],\n ]);\n}\n\nexport function getUpdateRegistryAuthorityInstructionDataCodec(): Codec<\n UpdateRegistryAuthorityInstructionDataArgs,\n UpdateRegistryAuthorityInstructionData\n> {\n return combineCodec(\n getUpdateRegistryAuthorityInstructionDataEncoder(),\n getUpdateRegistryAuthorityInstructionDataDecoder(),\n );\n}\n\nexport type UpdateRegistryAuthorityAsyncInput<\n TAccountAuthority extends string = string,\n TAccountRegistryConfig extends string = string,\n> = {\n /** Current authority (must sign) */\n authority: TransactionSigner<TAccountAuthority>;\n /** Registry configuration */\n registryConfig?: Address<TAccountRegistryConfig>;\n newAuthority: UpdateRegistryAuthorityInstructionDataArgs[\"newAuthority\"];\n};\n\nexport async function getUpdateRegistryAuthorityInstructionAsync<\n TAccountAuthority extends string,\n TAccountRegistryConfig extends string,\n TProgramAddress extends Address = typeof SATI_PROGRAM_ADDRESS,\n>(\n input: UpdateRegistryAuthorityAsyncInput<\n TAccountAuthority,\n TAccountRegistryConfig\n >,\n config?: { programAddress?: TProgramAddress },\n): Promise<\n UpdateRegistryAuthorityInstruction<\n TProgramAddress,\n TAccountAuthority,\n TAccountRegistryConfig\n >\n> {\n // Program address.\n const programAddress = config?.programAddress ?? SATI_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n authority: { value: input.authority ?? null, isWritable: false },\n registryConfig: { value: input.registryConfig ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.registryConfig.value) {\n accounts.registryConfig.value = await getProgramDerivedAddress({\n programAddress,\n seeds: [\n getBytesEncoder().encode(\n new Uint8Array([114, 101, 103, 105, 115, 116, 114, 121]),\n ),\n ],\n });\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, \"programId\");\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.authority),\n getAccountMeta(accounts.registryConfig),\n ],\n data: getUpdateRegistryAuthorityInstructionDataEncoder().encode(\n args as UpdateRegistryAuthorityInstructionDataArgs,\n ),\n programAddress,\n } as UpdateRegistryAuthorityInstruction<\n TProgramAddress,\n TAccountAuthority,\n TAccountRegistryConfig\n >);\n}\n\nexport type UpdateRegistryAuthorityInput<\n TAccountAuthority extends string = string,\n TAccountRegistryConfig extends string = string,\n> = {\n /** Current authority (must sign) */\n authority: TransactionSigner<TAccountAuthority>;\n /** Registry configuration */\n registryConfig: Address<TAccountRegistryConfig>;\n newAuthority: UpdateRegistryAuthorityInstructionDataArgs[\"newAuthority\"];\n};\n\nexport function getUpdateRegistryAuthorityInstruction<\n TAccountAuthority extends string,\n TAccountRegistryConfig extends string,\n TProgramAddress extends Address = typeof SATI_PROGRAM_ADDRESS,\n>(\n input: UpdateRegistryAuthorityInput<\n TAccountAuthority,\n TAccountRegistryConfig\n >,\n config?: { programAddress?: TProgramAddress },\n): UpdateRegistryAuthorityInstruction<\n TProgramAddress,\n TAccountAuthority,\n TAccountRegistryConfig\n> {\n // Program address.\n const programAddress = config?.programAddress ?? SATI_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n authority: { value: input.authority ?? null, isWritable: false },\n registryConfig: { value: input.registryConfig ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, \"programId\");\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.authority),\n getAccountMeta(accounts.registryConfig),\n ],\n data: getUpdateRegistryAuthorityInstructionDataEncoder().encode(\n args as UpdateRegistryAuthorityInstructionDataArgs,\n ),\n programAddress,\n } as UpdateRegistryAuthorityInstruction<\n TProgramAddress,\n TAccountAuthority,\n TAccountRegistryConfig\n >);\n}\n\nexport type ParsedUpdateRegistryAuthorityInstruction<\n TProgram extends string = typeof SATI_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address<TProgram>;\n accounts: {\n /** Current authority (must sign) */\n authority: TAccountMetas[0];\n /** Registry configuration */\n registryConfig: TAccountMetas[1];\n };\n data: UpdateRegistryAuthorityInstructionData;\n};\n\nexport function parseUpdateRegistryAuthorityInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction<TProgram> &\n InstructionWithAccounts<TAccountMetas> &\n InstructionWithData<ReadonlyUint8Array>,\n): ParsedUpdateRegistryAuthorityInstruction<TProgram, TAccountMetas> {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error(\"Not enough accounts\");\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { authority: getNextAccount(), registryConfig: getNextAccount() },\n data: getUpdateRegistryAuthorityInstructionDataDecoder().decode(\n instruction.data,\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n containsBytes,\n fixEncoderSize,\n getBytesEncoder,\n type Address,\n type ReadonlyUint8Array,\n} from \"@solana/kit\";\nimport {\n type ParsedCloseCompressedAttestationInstruction,\n type ParsedCloseRegularAttestationInstruction,\n type ParsedCreateCompressedAttestationInstruction,\n type ParsedCreateRegularAttestationInstruction,\n type ParsedInitializeInstruction,\n type ParsedLinkEvmAddressInstruction,\n type ParsedRegisterAgentInstruction,\n type ParsedRegisterSchemaConfigInstruction,\n type ParsedUpdateRegistryAuthorityInstruction,\n} from \"../instructions\";\n\nexport const SATI_PROGRAM_ADDRESS =\n \"satiRkxEiwZ51cv8PRu8UMzuaqeaNU9jABo6oAFMsLe\" as Address<\"satiRkxEiwZ51cv8PRu8UMzuaqeaNU9jABo6oAFMsLe\">;\n\nexport enum SatiAccount {\n AgentIndex,\n RegistryConfig,\n SchemaConfig,\n}\n\nexport function identifySatiAccount(\n account: { data: ReadonlyUint8Array } | ReadonlyUint8Array,\n): SatiAccount {\n const data = \"data\" in account ? account.data : account;\n if (\n containsBytes(\n data,\n fixEncoderSize(getBytesEncoder(), 8).encode(\n new Uint8Array([241, 154, 35, 103, 180, 141, 49, 179]),\n ),\n 0,\n )\n ) {\n return SatiAccount.AgentIndex;\n }\n if (\n containsBytes(\n data,\n fixEncoderSize(getBytesEncoder(), 8).encode(\n new Uint8Array([23, 118, 10, 246, 173, 231, 243, 156]),\n ),\n 0,\n )\n ) {\n return SatiAccount.RegistryConfig;\n }\n if (\n containsBytes(\n data,\n fixEncoderSize(getBytesEncoder(), 8).encode(\n new Uint8Array([211, 19, 105, 220, 186, 61, 182, 47]),\n ),\n 0,\n )\n ) {\n return SatiAccount.SchemaConfig;\n }\n throw new Error(\n \"The provided account could not be identified as a sati account.\",\n );\n}\n\nexport enum SatiInstruction {\n CloseCompressedAttestation,\n CloseRegularAttestation,\n CreateCompressedAttestation,\n CreateRegularAttestation,\n Initialize,\n LinkEvmAddress,\n RegisterAgent,\n RegisterSchemaConfig,\n UpdateRegistryAuthority,\n}\n\nexport function identifySatiInstruction(\n instruction: { data: ReadonlyUint8Array } | ReadonlyUint8Array,\n): SatiInstruction {\n const data = \"data\" in instruction ? instruction.data : instruction;\n if (\n containsBytes(\n data,\n fixEncoderSize(getBytesEncoder(), 8).encode(\n new Uint8Array([80, 7, 19, 206, 138, 158, 92, 24]),\n ),\n 0,\n )\n ) {\n return SatiInstruction.CloseCompressedAttestation;\n }\n if (\n containsBytes(\n data,\n fixEncoderSize(getBytesEncoder(), 8).encode(\n new Uint8Array([243, 10, 146, 163, 169, 75, 64, 28]),\n ),\n 0,\n )\n ) {\n return SatiInstruction.CloseRegularAttestation;\n }\n if (\n containsBytes(\n data,\n fixEncoderSize(getBytesEncoder(), 8).encode(\n new Uint8Array([204, 251, 61, 109, 25, 133, 237, 77]),\n ),\n 0,\n )\n ) {\n return SatiInstruction.CreateCompressedAttestation;\n }\n if (\n containsBytes(\n data,\n fixEncoderSize(getBytesEncoder(), 8).encode(\n new Uint8Array([69, 6, 28, 228, 190, 240, 142, 79]),\n ),\n 0,\n )\n ) {\n return SatiInstruction.CreateRegularAttestation;\n }\n if (\n containsBytes(\n data,\n fixEncoderSize(getBytesEncoder(), 8).encode(\n new Uint8Array([175, 175, 109, 31, 13, 152, 155, 237]),\n ),\n 0,\n )\n ) {\n return SatiInstruction.Initialize;\n }\n if (\n containsBytes(\n data,\n fixEncoderSize(getBytesEncoder(), 8).encode(\n new Uint8Array([156, 75, 131, 178, 64, 110, 236, 64]),\n ),\n 0,\n )\n ) {\n return SatiInstruction.LinkEvmAddress;\n }\n if (\n containsBytes(\n data,\n fixEncoderSize(getBytesEncoder(), 8).encode(\n new Uint8Array([135, 157, 66, 195, 2, 113, 175, 30]),\n ),\n 0,\n )\n ) {\n return SatiInstruction.RegisterAgent;\n }\n if (\n containsBytes(\n data,\n fixEncoderSize(getBytesEncoder(), 8).encode(\n new Uint8Array([21, 131, 188, 124, 189, 202, 70, 210]),\n ),\n 0,\n )\n ) {\n return SatiInstruction.RegisterSchemaConfig;\n }\n if (\n containsBytes(\n data,\n fixEncoderSize(getBytesEncoder(), 8).encode(\n new Uint8Array([36, 103, 15, 149, 117, 134, 26, 41]),\n ),\n 0,\n )\n ) {\n return SatiInstruction.UpdateRegistryAuthority;\n }\n throw new Error(\n \"The provided instruction could not be identified as a sati instruction.\",\n );\n}\n\nexport type ParsedSatiInstruction<\n TProgram extends string = \"satiRkxEiwZ51cv8PRu8UMzuaqeaNU9jABo6oAFMsLe\",\n> =\n | ({\n instructionType: SatiInstruction.CloseCompressedAttestation;\n } & ParsedCloseCompressedAttestationInstruction<TProgram>)\n | ({\n instructionType: SatiInstruction.CloseRegularAttestation;\n } & ParsedCloseRegularAttestationInstruction<TProgram>)\n | ({\n instructionType: SatiInstruction.CreateCompressedAttestation;\n } & ParsedCreateCompressedAttestationInstruction<TProgram>)\n | ({\n instructionType: SatiInstruction.CreateRegularAttestation;\n } & ParsedCreateRegularAttestationInstruction<TProgram>)\n | ({\n instructionType: SatiInstruction.Initialize;\n } & ParsedInitializeInstruction<TProgram>)\n | ({\n instructionType: SatiInstruction.LinkEvmAddress;\n } & ParsedLinkEvmAddressInstruction<TProgram>)\n | ({\n instructionType: SatiInstruction.RegisterAgent;\n } & ParsedRegisterAgentInstruction<TProgram>)\n | ({\n instructionType: SatiInstruction.RegisterSchemaConfig;\n } & ParsedRegisterSchemaConfigInstruction<TProgram>)\n | ({\n instructionType: SatiInstruction.UpdateRegistryAuthority;\n } & ParsedUpdateRegistryAuthorityInstruction<TProgram>);\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n isProgramError,\n type Address,\n type SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM,\n type SolanaError,\n} from \"@solana/kit\";\nimport { SATI_PROGRAM_ADDRESS } from \"../programs\";\n\n/** InvalidGroupMint: Invalid group mint - must be owned by Token-2022 with TokenGroup extension */\nexport const SATI_ERROR__INVALID_GROUP_MINT = 0x1770; // 6000\n/** InvalidAuthority: Invalid authority */\nexport const SATI_ERROR__INVALID_AUTHORITY = 0x1771; // 6001\n/** ImmutableAuthority: Authority is immutable (renounced) */\nexport const SATI_ERROR__IMMUTABLE_AUTHORITY = 0x1772; // 6002\n/** NameTooLong: Name too long (max 32 bytes) */\nexport const SATI_ERROR__NAME_TOO_LONG = 0x1773; // 6003\n/** SymbolTooLong: Symbol too long (max 10 bytes) */\nexport const SATI_ERROR__SYMBOL_TOO_LONG = 0x1774; // 6004\n/** UriTooLong: URI too long (max 200 bytes) */\nexport const SATI_ERROR__URI_TOO_LONG = 0x1775; // 6005\n/** TooManyMetadataEntries: Too many metadata entries (max 10) */\nexport const SATI_ERROR__TOO_MANY_METADATA_ENTRIES = 0x1776; // 6006\n/** MetadataKeyTooLong: Metadata key too long (max 32 bytes) */\nexport const SATI_ERROR__METADATA_KEY_TOO_LONG = 0x1777; // 6007\n/** MetadataValueTooLong: Metadata value too long (max 200 bytes) */\nexport const SATI_ERROR__METADATA_VALUE_TOO_LONG = 0x1778; // 6008\n/** Overflow: Arithmetic overflow */\nexport const SATI_ERROR__OVERFLOW = 0x1779; // 6009\n/** MintAuthorityNotRenounced: Failed to renounce mint authority - supply guarantee violated */\nexport const SATI_ERROR__MINT_AUTHORITY_NOT_RENOUNCED = 0x177a; // 6010\n/** SchemaConfigNotFound: Schema config not found */\nexport const SATI_ERROR__SCHEMA_CONFIG_NOT_FOUND = 0x177b; // 6011\n/** InvalidSignatureCount: Invalid signature count for signature mode */\nexport const SATI_ERROR__INVALID_SIGNATURE_COUNT = 0x177c; // 6012\n/** InvalidSignature: Invalid Ed25519 signature */\nexport const SATI_ERROR__INVALID_SIGNATURE = 0x177d; // 6013\n/** StorageTypeNotSupported: Storage type not supported for this operation */\nexport const SATI_ERROR__STORAGE_TYPE_NOT_SUPPORTED = 0x177e; // 6014\n/** StorageTypeMismatch: Storage type mismatch */\nexport const SATI_ERROR__STORAGE_TYPE_MISMATCH = 0x177f; // 6015\n/** AttestationDataTooSmall: Attestation data too small (minimum 130 bytes for universal base layout) */\nexport const SATI_ERROR__ATTESTATION_DATA_TOO_SMALL = 0x1780; // 6016\n/** AttestationDataTooLarge: Attestation data exceeds maximum size */\nexport const SATI_ERROR__ATTESTATION_DATA_TOO_LARGE = 0x1781; // 6017\n/** ContentTooLarge: Content exceeds maximum size (512 bytes) */\nexport const SATI_ERROR__CONTENT_TOO_LARGE = 0x1782; // 6018\n/** SignatureMismatch: Signature pubkey does not match expected account */\nexport const SATI_ERROR__SIGNATURE_MISMATCH = 0x1783; // 6019\n/** SelfAttestationNotAllowed: Self-attestation is not allowed (agent_mint == counterparty) */\nexport const SATI_ERROR__SELF_ATTESTATION_NOT_ALLOWED = 0x1784; // 6020\n/** AgentAtaMintMismatch: Agent ATA mint does not match agent_mint in attestation data */\nexport const SATI_ERROR__AGENT_ATA_MINT_MISMATCH = 0x1785; // 6021\n/** AgentAtaEmpty: Agent ATA is empty - signer does not own the agent NFT */\nexport const SATI_ERROR__AGENT_ATA_EMPTY = 0x1786; // 6022\n/** AgentAtaRequired: Agent ATA required for this signature mode */\nexport const SATI_ERROR__AGENT_ATA_REQUIRED = 0x1787; // 6023\n/** UnauthorizedClose: Unauthorized to close attestation */\nexport const SATI_ERROR__UNAUTHORIZED_CLOSE = 0x1788; // 6024\n/** AttestationNotCloseable: Attestation cannot be closed for this schema */\nexport const SATI_ERROR__ATTESTATION_NOT_CLOSEABLE = 0x1789; // 6025\n/** InvalidOutcome: Invalid outcome value (must be 0, 1, or 2) */\nexport const SATI_ERROR__INVALID_OUTCOME = 0x178a; // 6026\n/** InvalidContentType: Invalid content type (must be 0-15) */\nexport const SATI_ERROR__INVALID_CONTENT_TYPE = 0x178b; // 6027\n/** UnsupportedLayoutVersion: Unsupported layout version */\nexport const SATI_ERROR__UNSUPPORTED_LAYOUT_VERSION = 0x178c; // 6028\n/** LightCpiInvocationFailed: Light Protocol CPI invocation failed */\nexport const SATI_ERROR__LIGHT_CPI_INVOCATION_FAILED = 0x178d; // 6029\n/** InvalidEd25519Instruction: Invalid Ed25519 instruction format */\nexport const SATI_ERROR__INVALID_ED25519_INSTRUCTION = 0x178e; // 6030\n/** MissingSignatures: Missing required Ed25519 signatures in transaction */\nexport const SATI_ERROR__MISSING_SIGNATURES = 0x178f; // 6031\n/** MessageMismatch: Message hash mismatch - signature was for different data */\nexport const SATI_ERROR__MESSAGE_MISMATCH = 0x1790; // 6032\n/** InvalidInstructionsSysvar: Invalid instructions sysvar */\nexport const SATI_ERROR__INVALID_INSTRUCTIONS_SYSVAR = 0x1791; // 6033\n/** DuplicateSigners: Duplicate signers not allowed for dual signature mode */\nexport const SATI_ERROR__DUPLICATE_SIGNERS = 0x1792; // 6034\n/** Ed25519InstructionNotFound: No Ed25519 instruction found in transaction */\nexport const SATI_ERROR__ED25519_INSTRUCTION_NOT_FOUND = 0x1793; // 6035\n/** AgentSignatureNotFound: Agent's Ed25519 signature not found (message content mismatch) */\nexport const SATI_ERROR__AGENT_SIGNATURE_NOT_FOUND = 0x1794; // 6036\n/** CounterpartySignatureNotFound: Counterparty's Ed25519 signature not found (message content mismatch) */\nexport const SATI_ERROR__COUNTERPARTY_SIGNATURE_NOT_FOUND = 0x1795; // 6037\n/** AgentMintAccountMismatch: Agent mint account does not match agent_mint in attestation data */\nexport const SATI_ERROR__AGENT_MINT_ACCOUNT_MISMATCH = 0x1796; // 6038\n/** OwnerOnly: Schema requires owner signature but delegate attempted */\nexport const SATI_ERROR__OWNER_ONLY = 0x1797; // 6039\n/** DelegationAttestationRequired: Delegate signed but no delegation attestation provided */\nexport const SATI_ERROR__DELEGATION_ATTESTATION_REQUIRED = 0x1798; // 6040\n/** InvalidDelegationPDA: Delegation attestation PDA doesn't match expected derivation */\nexport const SATI_ERROR__INVALID_DELEGATION_P_D_A = 0x1799; // 6041\n/** DelegateMismatch: Delegation attestation delegate doesn't match signer */\nexport const SATI_ERROR__DELEGATE_MISMATCH = 0x179a; // 6042\n/** AgentMintMismatch: Delegation attestation agent doesn't match target agent */\nexport const SATI_ERROR__AGENT_MINT_MISMATCH = 0x179b; // 6043\n/** DelegationOwnerMismatch: Delegation was created by different owner (NFT was transferred) */\nexport const SATI_ERROR__DELEGATION_OWNER_MISMATCH = 0x179c; // 6044\n/** DelegationExpired: Delegation attestation has expired */\nexport const SATI_ERROR__DELEGATION_EXPIRED = 0x179d; // 6045\n/** InvalidSecp256k1Signature: Invalid secp256k1 signature */\nexport const SATI_ERROR__INVALID_SECP256K1_SIGNATURE = 0x179e; // 6046\n/** Secp256k1RecoveryFailed: Secp256k1 recovery failed */\nexport const SATI_ERROR__SECP256K1_RECOVERY_FAILED = 0x179f; // 6047\n/** EvmAddressMismatch: EVM address mismatch - recovered address does not match expected */\nexport const SATI_ERROR__EVM_ADDRESS_MISMATCH = 0x17a0; // 6048\n/** InvalidEvmAddressRecovery: Failed to extract EVM address from secp256k1 key recovery */\nexport const SATI_ERROR__INVALID_EVM_ADDRESS_RECOVERY = 0x17a1; // 6049\n\nexport type SatiError =\n | typeof SATI_ERROR__AGENT_ATA_EMPTY\n | typeof SATI_ERROR__AGENT_ATA_MINT_MISMATCH\n | typeof SATI_ERROR__AGENT_ATA_REQUIRED\n | typeof SATI_ERROR__AGENT_MINT_ACCOUNT_MISMATCH\n | typeof SATI_ERROR__AGENT_MINT_MISMATCH\n | typeof SATI_ERROR__AGENT_SIGNATURE_NOT_FOUND\n | typeof SATI_ERROR__ATTESTATION_DATA_TOO_LARGE\n | typeof SATI_ERROR__ATTESTATION_DATA_TOO_SMALL\n | typeof SATI_ERROR__ATTESTATION_NOT_CLOSEABLE\n | typeof SATI_ERROR__CONTENT_TOO_LARGE\n | typeof SATI_ERROR__COUNTERPARTY_SIGNATURE_NOT_FOUND\n | typeof SATI_ERROR__DELEGATE_MISMATCH\n | typeof SATI_ERROR__DELEGATION_ATTESTATION_REQUIRED\n | typeof SATI_ERROR__DELEGATION_EXPIRED\n | typeof SATI_ERROR__DELEGATION_OWNER_MISMATCH\n | typeof SATI_ERROR__DUPLICATE_SIGNERS\n | typeof SATI_ERROR__ED25519_INSTRUCTION_NOT_FOUND\n | typeof SATI_ERROR__EVM_ADDRESS_MISMATCH\n | typeof SATI_ERROR__IMMUTABLE_AUTHORITY\n | typeof SATI_ERROR__INVALID_AUTHORITY\n | typeof SATI_ERROR__INVALID_CONTENT_TYPE\n | typeof SATI_ERROR__INVALID_DELEGATION_P_D_A\n | typeof SATI_ERROR__INVALID_ED25519_INSTRUCTION\n | typeof SATI_ERROR__INVALID_EVM_ADDRESS_RECOVERY\n | typeof SATI_ERROR__INVALID_GROUP_MINT\n | typeof SATI_ERROR__INVALID_INSTRUCTIONS_SYSVAR\n | typeof SATI_ERROR__INVALID_OUTCOME\n | typeof SATI_ERROR__INVALID_SECP256K1_SIGNATURE\n | typeof SATI_ERROR__INVALID_SIGNATURE\n | typeof SATI_ERROR__INVALID_SIGNATURE_COUNT\n | typeof SATI_ERROR__LIGHT_CPI_INVOCATION_FAILED\n | typeof SATI_ERROR__MESSAGE_MISMATCH\n | typeof SATI_ERROR__METADATA_KEY_TOO_LONG\n | typeof SATI_ERROR__METADATA_VALUE_TOO_LONG\n | typeof SATI_ERROR__MINT_AUTHORITY_NOT_RENOUNCED\n | typeof SATI_ERROR__MISSING_SIGNATURES\n | typeof SATI_ERROR__NAME_TOO_LONG\n | typeof SATI_ERROR__OVERFLOW\n | typeof SATI_ERROR__OWNER_ONLY\n | typeof SATI_ERROR__SCHEMA_CONFIG_NOT_FOUND\n | typeof SATI_ERROR__SECP256K1_RECOVERY_FAILED\n | typeof SATI_ERROR__SELF_ATTESTATION_NOT_ALLOWED\n | typeof SATI_ERROR__SIGNATURE_MISMATCH\n | typeof SATI_ERROR__STORAGE_TYPE_MISMATCH\n | typeof SATI_ERROR__STORAGE_TYPE_NOT_SUPPORTED\n | typeof SATI_ERROR__SYMBOL_TOO_LONG\n | typeof SATI_ERROR__TOO_MANY_METADATA_ENTRIES\n | typeof SATI_ERROR__UNAUTHORIZED_CLOSE\n | typeof SATI_ERROR__UNSUPPORTED_LAYOUT_VERSION\n | typeof SATI_ERROR__URI_TOO_LONG;\n\nlet satiErrorMessages: Record<SatiError, string> | undefined;\nif (process.env.NODE_ENV !== \"production\") {\n satiErrorMessages = {\n [SATI_ERROR__AGENT_ATA_EMPTY]: `Agent ATA is empty - signer does not own the agent NFT`,\n [SATI_ERROR__AGENT_ATA_MINT_MISMATCH]: `Agent ATA mint does not match agent_mint in attestation data`,\n [SATI_ERROR__AGENT_ATA_REQUIRED]: `Agent ATA required for this signature mode`,\n [SATI_ERROR__AGENT_MINT_ACCOUNT_MISMATCH]: `Agent mint account does not match agent_mint in attestation data`,\n [SATI_ERROR__AGENT_MINT_MISMATCH]: `Delegation attestation agent doesn't match target agent`,\n [SATI_ERROR__AGENT_SIGNATURE_NOT_FOUND]: `Agent's Ed25519 signature not found (message content mismatch)`,\n [SATI_ERROR__ATTESTATION_DATA_TOO_LARGE]: `Attestation data exceeds maximum size`,\n [SATI_ERROR__ATTESTATION_DATA_TOO_SMALL]: `Attestation data too small (minimum 130 bytes for universal base layout)`,\n [SATI_ERROR__ATTESTATION_NOT_CLOSEABLE]: `Attestation cannot be closed for this schema`,\n [SATI_ERROR__CONTENT_TOO_LARGE]: `Content exceeds maximum size (512 bytes)`,\n [SATI_ERROR__COUNTERPARTY_SIGNATURE_NOT_FOUND]: `Counterparty's Ed25519 signature not found (message content mismatch)`,\n [SATI_ERROR__DELEGATE_MISMATCH]: `Delegation attestation delegate doesn't match signer`,\n [SATI_ERROR__DELEGATION_ATTESTATION_REQUIRED]: `Delegate signed but no delegation attestation provided`,\n [SATI_ERROR__DELEGATION_EXPIRED]: `Delegation attestation has expired`,\n [SATI_ERROR__DELEGATION_OWNER_MISMATCH]: `Delegation was created by different owner (NFT was transferred)`,\n [SATI_ERROR__DUPLICATE_SIGNERS]: `Duplicate signers not allowed for dual signature mode`,\n [SATI_ERROR__ED25519_INSTRUCTION_NOT_FOUND]: `No Ed25519 instruction found in transaction`,\n [SATI_ERROR__EVM_ADDRESS_MISMATCH]: `EVM address mismatch - recovered address does not match expected`,\n [SATI_ERROR__IMMUTABLE_AUTHORITY]: `Authority is immutable (renounced)`,\n [SATI_ERROR__INVALID_AUTHORITY]: `Invalid authority`,\n [SATI_ERROR__INVALID_CONTENT_TYPE]: `Invalid content type (must be 0-15)`,\n [SATI_ERROR__INVALID_DELEGATION_P_D_A]: `Delegation attestation PDA doesn't match expected derivation`,\n [SATI_ERROR__INVALID_ED25519_INSTRUCTION]: `Invalid Ed25519 instruction format`,\n [SATI_ERROR__INVALID_EVM_ADDRESS_RECOVERY]: `Failed to extract EVM address from secp256k1 key recovery`,\n [SATI_ERROR__INVALID_GROUP_MINT]: `Invalid group mint - must be owned by Token-2022 with TokenGroup extension`,\n [SATI_ERROR__INVALID_INSTRUCTIONS_SYSVAR]: `Invalid instructions sysvar`,\n [SATI_ERROR__INVALID_OUTCOME]: `Invalid outcome value (must be 0, 1, or 2)`,\n [SATI_ERROR__INVALID_SECP256K1_SIGNATURE]: `Invalid secp256k1 signature`,\n [SATI_ERROR__INVALID_SIGNATURE]: `Invalid Ed25519 signature`,\n [SATI_ERROR__INVALID_SIGNATURE_COUNT]: `Invalid signature count for signature mode`,\n [SATI_ERROR__LIGHT_CPI_INVOCATION_FAILED]: `Light Protocol CPI invocation failed`,\n [SATI_ERROR__MESSAGE_MISMATCH]: `Message hash mismatch - signature was for different data`,\n [SATI_ERROR__METADATA_KEY_TOO_LONG]: `Metadata key too long (max 32 bytes)`,\n [SATI_ERROR__METADATA_VALUE_TOO_LONG]: `Metadata value too long (max 200 bytes)`,\n [SATI_ERROR__MINT_AUTHORITY_NOT_RENOUNCED]: `Failed to renounce mint authority - supply guarantee violated`,\n [SATI_ERROR__MISSING_SIGNATURES]: `Missing required Ed25519 signatures in transaction`,\n [SATI_ERROR__NAME_TOO_LONG]: `Name too long (max 32 bytes)`,\n [SATI_ERROR__OVERFLOW]: `Arithmetic overflow`,\n [SATI_ERROR__OWNER_ONLY]: `Schema requires owner signature but delegate attempted`,\n [SATI_ERROR__SCHEMA_CONFIG_NOT_FOUND]: `Schema config not found`,\n [SATI_ERROR__SECP256K1_RECOVERY_FAILED]: `Secp256k1 recovery failed`,\n [SATI_ERROR__SELF_ATTESTATION_NOT_ALLOWED]: `Self-attestation is not allowed (agent_mint == counterparty)`,\n [SATI_ERROR__SIGNATURE_MISMATCH]: `Signature pubkey does not match expected account`,\n [SATI_ERROR__STORAGE_TYPE_MISMATCH]: `Storage type mismatch`,\n [SATI_ERROR__STORAGE_TYPE_NOT_SUPPORTED]: `Storage type not supported for this operation`,\n [SATI_ERROR__SYMBOL_TOO_LONG]: `Symbol too long (max 10 bytes)`,\n [SATI_ERROR__TOO_MANY_METADATA_ENTRIES]: `Too many metadata entries (max 10)`,\n [SATI_ERROR__UNAUTHORIZED_CLOSE]: `Unauthorized to close attestation`,\n [SATI_ERROR__UNSUPPORTED_LAYOUT_VERSION]: `Unsupported layout version`,\n [SATI_ERROR__URI_TOO_LONG]: `URI too long (max 200 bytes)`,\n };\n}\n\nexport function getSatiErrorMessage(code: SatiError): string {\n if (process.env.NODE_ENV !== \"production\") {\n return (satiErrorMessages as Record<SatiError, string>)[code];\n }\n\n return \"Error message not available in production bundles.\";\n}\n\nexport function isSatiError<TProgramErrorCode extends SatiError>(\n error: unknown,\n transactionMessage: {\n instructions: Record<number, { programAddress: Address }>;\n },\n code?: TProgramErrorCode,\n): error is SolanaError<typeof SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM> &\n Readonly<{ context: Readonly<{ code: TProgramErrorCode }> }> {\n return isProgramError<TProgramErrorCode>(\n error,\n transactionMessage,\n SATI_PROGRAM_ADDRESS,\n code,\n );\n}\n","/**\n * SATI Schema Definitions\n *\n * Data layouts for SATI attestations with fixed offsets for memcmp filtering.\n * These schemas must match the on-chain program's expectations.\n *\n * ## Universal Base Layout (131 bytes)\n * All schemas share identical first 131 bytes:\n * - layout_version: 0 (1 byte) - version of the universal base layout\n * - task_ref: 1-32 (32 bytes) - CAIP-220 tx hash or task ID\n * - agent_mint: 33-64 (32 bytes) - agent's MINT ADDRESS (Token-2022 NFT identity)\n * - counterparty: 65-96 (32 bytes) - counterparty address\n * - outcome: 97 (1 byte) - 0=Negative, 1=Neutral, 2=Positive\n * - data_hash: 98-129 (32 bytes) - blind commitment (zeros for CounterpartySigned)\n * - content_type: 130 (1 byte) - format: 0=None, 1=JSON, 2=UTF-8, etc.\n * - content: 131+ (variable) - up to 512 bytes\n *\n * ## Identity Model\n * - `agentMint` = agent's **MINT ADDRESS** (stable Token-2022 NFT identity)\n * - NOT an Associated Token Account (ATA) - the ATA is used separately for ownership verification\n * - On-chain verification checks ATA ownership for authorization\n */\n\nimport { getAddressEncoder, getAddressDecoder, type Address } from \"@solana/kit\";\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Maximum content size in bytes (theoretical storage limit) */\nexport const MAX_CONTENT_SIZE = 512;\n\n/**\n * Maximum content size for DualSignature mode attestations.\n *\n * Due to Solana's 1232-byte transaction limit, content in DualSignature\n * mode is severely constrained because:\n * 1. Content appears TWICE: in data blob AND in SIWS message\n * 2. Agent ATA (32 bytes) can never be in lookup table (user-specific)\n * 3. SIWS message overhead is ~194 bytes\n *\n * Use ContentType.IPFS or ContentType.Arweave for larger content.\n */\nexport const MAX_DUAL_SIGNATURE_CONTENT_SIZE = 70;\n\n/**\n * Maximum content size for SingleSignature mode attestations.\n *\n * SingleSignature mode has more headroom because:\n * 1. Content appears only once (no SIWS message duplication)\n * 2. No counterparty signature verification overhead\n */\nexport const MAX_SINGLE_SIGNATURE_CONTENT_SIZE = 240;\n\n/**\n * Minimum universal base layout size.\n * All schemas share: layout_version(1) + task_ref(32) + agent_mint(32) + counterparty(32) +\n * outcome(1) + data_hash(32) + content_type(1) = 131 bytes.\n */\nexport const MIN_BASE_LAYOUT_SIZE = 131;\n\n/**\n * Current layout version for universal base layout.\n * Increment when making breaking changes to the layout structure.\n */\nexport const CURRENT_LAYOUT_VERSION = 1;\n\n/**\n * SAS attestation header size in bytes.\n *\n * Layout: discriminator(1) + nonce(32) + credential(32) + schema(32) + data_len(4)\n * Total: 101 bytes\n *\n * Must match programs/sati/src/constants.rs SAS_HEADER_SIZE\n */\nexport const SAS_HEADER_SIZE = 101;\n\n/**\n * Offset of the `data_len` field within the SAS attestation account.\n *\n * Layout: discriminator(1) + nonce(32) + credential(32) + schema(32) = 97\n * The 4-byte LE `data_len` field starts at offset 97.\n */\nexport const SAS_DATA_LEN_OFFSET = 97;\n\n// ============================================================================\n// Universal Offsets\n// ============================================================================\n\n/**\n * Universal base layout offsets (all schemas share these).\n * Must match programs/sati/src/constants.rs offsets module.\n */\nexport const OFFSETS = {\n /** Layout version (1 byte) - version of the universal base layout */\n LAYOUT_VERSION: 0,\n /** CAIP-220 tx hash or task identifier (32 bytes) */\n TASK_REF: 1,\n /** Agent's mint address (32 bytes) - Token-2022 NFT identity */\n AGENT_MINT: 33,\n /** Counterparty address (32 bytes) */\n COUNTERPARTY: 65,\n /** Outcome: 0=Negative, 1=Neutral, 2=Positive */\n OUTCOME: 97,\n /** Blind commitment hash (32 bytes, zeros for CounterpartySigned) */\n DATA_HASH: 98,\n /** Content format: 0=None, 1=JSON, 2=UTF-8, etc. */\n CONTENT_TYPE: 130,\n /** Variable-length content (up to 512 bytes) */\n CONTENT: 131,\n} as const;\n\n/** Alias for backward compatibility */\nexport const BASE_OFFSETS = OFFSETS;\n\n// ============================================================================\n// Enums\n// ============================================================================\n\n/**\n * Data type discriminator for attestations\n */\nexport enum DataType {\n /** Feedback attestation (compressed storage) */\n Feedback = 0,\n /** Validation attestation (compressed storage) */\n Validation = 1,\n /** ReputationScoreV3 attestation (regular storage) */\n ReputationScore = 2,\n}\n\n/**\n * Feedback outcome values (ERC-8004 compatible)\n *\n * For ERC-8004 score mapping:\n * - Negative(0) → 0\n * - Neutral(1) → 50\n * - Positive(2) → 100\n */\nexport enum Outcome {\n /** Negative feedback (score 0) */\n Negative = 0,\n /** Neutral feedback (score 50) */\n Neutral = 1,\n /** Positive feedback (score 100) */\n Positive = 2,\n}\n\n/**\n * Content type determines how to interpret the variable-length content field\n */\nexport enum ContentType {\n /** Empty content - just use outcome */\n None = 0,\n /** Inline JSON object */\n JSON = 1,\n /** Plain UTF-8 text */\n UTF8 = 2,\n /** IPFS CIDv1 (~36 bytes) */\n IPFS = 3,\n /** Arweave transaction ID (32 bytes) */\n Arweave = 4,\n /** End-to-end encrypted (X25519-XChaCha20-Poly1305) */\n Encrypted = 5,\n}\n\n/**\n * Validation method types.\n *\n * Note: In universal layout, this is stored in JSON content,\n * not as a binary field. Kept for SDK convenience.\n */\nexport enum ValidationType {\n /** Trusted Execution Environment */\n TEE = 0,\n /** Zero-knowledge Machine Learning */\n ZKML = 1,\n /** Re-execution verification */\n Reexecution = 2,\n /** Consensus-based validation */\n Consensus = 3,\n}\n\n// Import from generated (Codama is the source of truth)\n// Already exported via \"export * from ./generated\" in index.ts\nimport { SignatureMode } from \"./generated/types/signatureMode\";\nimport { StorageType } from \"./generated/types/storageType\";\n\n// ============================================================================\n// Base Layout\n// ============================================================================\n\n/**\n * Universal base data layout (131 bytes)\n *\n * All schemas MUST use this layout. Program parses this for signature\n * verification; schema-specific data goes in JSON content.\n */\nexport interface BaseLayout {\n /** CAIP-220 tx hash or arbitrary task ID (32 bytes) */\n taskRef: Uint8Array;\n /** Agent's mint address (32 bytes) - Token-2022 NFT identity */\n agentMint: Address;\n /** Counterparty address (32 bytes) */\n counterparty: Address;\n /** Outcome: 0=Negative, 1=Neutral, 2=Positive */\n outcome: Outcome;\n /** Hash of request/interaction data for agent's blind signature (32 bytes) */\n dataHash: Uint8Array;\n /** Content format (see ContentType) */\n contentType: ContentType;\n /** Variable-length content based on contentType */\n content: Uint8Array;\n}\n\n// ============================================================================\n// Feedback Schema (data_type = 0)\n// ============================================================================\n\n/**\n * Feedback schema - uses universal base layout\n *\n * Schema-specific fields (tags, score, message) go in JSON content:\n * { \"score\": 85, \"tags\": [\"fast\", \"accurate\"], \"m\": \"Great response!\" }\n */\nexport interface FeedbackData extends BaseLayout {}\n\n/**\n * Feedback JSON content structure (optional fields in content)\n */\nexport interface FeedbackContent {\n /** ERC-8004 compatible score: 0-100 */\n score?: number;\n /** Category tags (max 32 chars each) */\n tags?: string[];\n /** Feedback message */\n m?: string;\n}\n\n/**\n * Fixed offsets in Feedback schema (same as universal)\n */\nexport const FEEDBACK_OFFSETS = OFFSETS;\n\n/**\n * Serialize Feedback data to bytes\n */\nexport function serializeFeedback(data: FeedbackData): Uint8Array {\n return serializeUniversalLayout(data);\n}\n\n/**\n * Deserialize Feedback data from bytes\n */\nexport function deserializeFeedback(bytes: Uint8Array): FeedbackData {\n return deserializeUniversalLayout(bytes);\n}\n\n/**\n * Parse Feedback JSON content\n */\nexport function parseFeedbackContent(content: Uint8Array, contentType: ContentType): FeedbackContent | null {\n if (contentType !== ContentType.JSON || content.length === 0) {\n return null;\n }\n try {\n const text = new TextDecoder().decode(content);\n return JSON.parse(text) as FeedbackContent;\n } catch {\n return null;\n }\n}\n\n// ============================================================================\n// Validation Schema (data_type = 1)\n// ============================================================================\n\n/**\n * Validation schema - uses universal base layout\n *\n * Schema-specific fields (type, confidence) go in JSON content:\n * { \"type\": \"tee\", \"confidence\": 95, \"methodology\": \"...\" }\n */\nexport interface ValidationData extends BaseLayout {}\n\n/**\n * Validation JSON content structure (optional fields in content)\n */\nexport interface ValidationContent {\n /** Validation method: \"tee\", \"zkml\", \"reexecution\", \"consensus\" */\n type?: string;\n /** Confidence score: 0-100 */\n confidence?: number;\n /** Methodology description */\n methodology?: string;\n}\n\n/**\n * Fixed offsets in Validation schema (same as universal)\n */\nexport const VALIDATION_OFFSETS = OFFSETS;\n\n/**\n * Serialize Validation data to bytes\n */\nexport function serializeValidation(data: ValidationData): Uint8Array {\n return serializeUniversalLayout(data);\n}\n\n/**\n * Deserialize Validation data from bytes\n */\nexport function deserializeValidation(bytes: Uint8Array): ValidationData {\n return deserializeUniversalLayout(bytes);\n}\n\n/**\n * Parse Validation JSON content\n */\nexport function parseValidationContent(content: Uint8Array, contentType: ContentType): ValidationContent | null {\n if (contentType !== ContentType.JSON || content.length === 0) {\n return null;\n }\n try {\n const text = new TextDecoder().decode(content);\n return JSON.parse(text) as ValidationContent;\n } catch {\n return null;\n }\n}\n\n// ============================================================================\n// ReputationScoreV3 Schema (data_type = 2)\n// ============================================================================\n\n/**\n * ReputationScoreV3 schema - uses universal base layout (regular SAS storage)\n *\n * Provider-computed scores with direct on-chain queryability.\n * One ReputationScoreV3 per (provider, agent) pair - updates replace previous.\n *\n * Note: task_ref is deterministic: keccak256(counterparty, agent_mint)\n *\n * Schema-specific fields (score, methodology) go in JSON content:\n * { \"score\": 85, \"methodology\": \"weighted_average\", \"components\": {...} }\n */\nexport interface ReputationScoreData extends BaseLayout {}\n\n/**\n * ReputationScoreV3 JSON content structure (optional fields in content)\n */\nexport interface ReputationScoreContent {\n /** Normalized reputation score: 0-100 */\n score?: number;\n /** Scoring algorithm identifier (e.g., \"weighted_average\", \"bayesian\") */\n methodology?: string;\n /** Number of feedbacks analyzed */\n feedbackCount?: number;\n /** Number of validations analyzed */\n validationCount?: number;\n}\n\n/**\n * Fixed offsets in ReputationScoreV3 schema (same as universal)\n */\nexport const REPUTATION_SCORE_OFFSETS = OFFSETS;\n\n/**\n * Serialize ReputationScoreV3 data to bytes\n *\n * SAS schema uses VecU8 (type 13) for the content field, which requires\n * a 4-byte LE length prefix before the content bytes.\n *\n * Output: 131 base bytes + 4-byte LE content length + N content bytes\n */\nexport function serializeReputationScore(data: ReputationScoreData): Uint8Array {\n // Serialize base layout with empty content (131 bytes)\n const baseData = serializeUniversalLayout({ ...data, content: new Uint8Array(0) });\n\n const contentBytes = data.content.slice(0, MAX_CONTENT_SIZE);\n const contentLen = contentBytes.length;\n\n // Append VecU8: 4-byte LE length prefix + content bytes\n const buffer = new Uint8Array(baseData.length + 4 + contentLen);\n buffer.set(baseData, 0);\n new DataView(buffer.buffer).setUint32(baseData.length, contentLen, true);\n if (contentLen > 0) {\n buffer.set(contentBytes, baseData.length + 4);\n }\n return buffer;\n}\n\n/**\n * Deserialize ReputationScoreV3 data from bytes\n *\n * SAS schema uses VecU8 (type 13) for the content field. The data format is:\n * 131 base bytes + 4-byte LE content length + N content bytes.\n *\n * Reads the VecU8 length prefix to extract exact content bytes,\n * ignoring any trailing data (e.g., SAS tail bytes).\n */\nexport function deserializeReputationScore(bytes: Uint8Array): ReputationScoreData {\n const minSize = MIN_BASE_LAYOUT_SIZE + 4; // 131 base + 4 VecU8 prefix\n if (bytes.length < minSize) {\n throw new Error(`Data too small for ReputationScoreV3 (minimum ${minSize} bytes, got ${bytes.length})`);\n }\n\n // Parse base fields (layout_version through content_type, 131 bytes)\n const base = deserializeUniversalLayout(bytes.slice(0, MIN_BASE_LAYOUT_SIZE));\n\n // Read VecU8 length prefix at offset 131 (4-byte LE)\n const lenSlice = bytes.slice(MIN_BASE_LAYOUT_SIZE, MIN_BASE_LAYOUT_SIZE + 4);\n const contentLen = new DataView(lenSlice.buffer).getUint32(0, true);\n\n // Bounds check: contentLen must not exceed available bytes\n const contentStart = MIN_BASE_LAYOUT_SIZE + 4;\n const available = bytes.length - contentStart;\n if (contentLen > available) {\n throw new Error(`ReputationScoreV3 content length ${contentLen} exceeds available data (${available} bytes)`);\n }\n\n // Extract exact content bytes\n const content = bytes.slice(contentStart, contentStart + contentLen);\n\n return {\n ...base,\n content,\n };\n}\n\n/**\n * Parse ReputationScoreV3 JSON content\n */\nexport function parseReputationScoreContent(\n content: Uint8Array,\n contentType: ContentType,\n): ReputationScoreContent | null {\n if (contentType !== ContentType.JSON || content.length === 0) {\n return null;\n }\n try {\n const text = new TextDecoder().decode(content);\n return JSON.parse(text) as ReputationScoreContent;\n } catch {\n return null;\n }\n}\n\n/**\n * Validate ReputationScoreV3 JSON content structure.\n * Throws on invalid content.\n */\nexport function validateReputationScoreContent(content: ReputationScoreContent): void {\n if (content.score !== undefined) {\n if (typeof content.score !== \"number\" || content.score < 0 || content.score > 100) {\n throw new Error(\"score must be a number between 0 and 100\");\n }\n }\n if (content.methodology !== undefined && typeof content.methodology !== \"string\") {\n throw new Error(\"methodology must be a string\");\n }\n if (content.feedbackCount !== undefined) {\n if (\n typeof content.feedbackCount !== \"number\" ||\n content.feedbackCount < 0 ||\n !Number.isInteger(content.feedbackCount)\n ) {\n throw new Error(\"feedbackCount must be a non-negative integer\");\n }\n }\n if (content.validationCount !== undefined) {\n if (\n typeof content.validationCount !== \"number\" ||\n content.validationCount < 0 ||\n !Number.isInteger(content.validationCount)\n ) {\n throw new Error(\"validationCount must be a non-negative integer\");\n }\n }\n}\n\n// ============================================================================\n// Compressed Attestation Structure\n// ============================================================================\n\n/**\n * CompressedAttestation structure (Light Protocol storage)\n *\n * This represents the full compressed account structure with Light Protocol fields.\n * Public-facing fields use Address type for better API ergonomics.\n */\nexport interface CompressedAttestation {\n /** SAS schema address */\n sasSchema: Address;\n /** Agent's mint address (Token-2022 NFT identity) */\n agentMint: Address;\n /** Schema-conformant data bytes */\n data: Uint8Array;\n /** Number of signatures stored (1 or 2) */\n numSignatures: number;\n /** First signature (agent for DualSignature, counterparty for CounterpartySigned) */\n signature1: Uint8Array;\n /** Second signature (counterparty for DualSignature, zeroed for CounterpartySigned/AgentOwnerSigned) */\n signature2: Uint8Array;\n}\n\n/**\n * Fixed offsets in CompressedAttestation data for memcmp filters.\n *\n * Note: Light Protocol returns the discriminator as a separate field in the\n * response, NOT prefixed to the data bytes. The data bytes start directly\n * with the attestation fields:\n * - bytes 0-31: sasSchema (Pubkey)\n * - bytes 32-63: agentMint (Pubkey)\n * - bytes 64+: schemaData (Vec<u8>)\n */\nexport const COMPRESSED_OFFSETS = {\n /** SAS schema pubkey offset for memcmp */\n SAS_SCHEMA: 0,\n /** Agent mint address offset for memcmp */\n AGENT_MINT: 32,\n} as const;\n\n// ============================================================================\n// Schema Configuration\n// ============================================================================\n\n/**\n * Schema configuration for registered attestation types\n */\nexport interface SchemaConfig {\n /** SAS schema address */\n sasSchema: Address;\n /** Signature verification mode */\n signatureMode: SignatureMode;\n /** Storage backend type */\n storageType: StorageType;\n /**\n * Schema for delegation verification (only for AgentOwnerSigned mode).\n * If set, allows delegates (via Delegate attestations) to sign on behalf of agent owner.\n * If null, only the agent owner can sign.\n */\n delegationSchema: Address | null;\n /** Whether attestations can be closed/nullified */\n closeable: boolean;\n /** Human-readable schema name (max 32 chars) */\n name: string;\n}\n\n/**\n * Core SATI schema configurations.\n * Names are used in SIWS signing messages shown to users.\n *\n * Note: delegationSchema is null here and set at deployment time for schemas\n * that support delegation (Feedback, Validation). The Delegate schema address\n * is used to verify delegation attestations at runtime.\n */\nexport const SCHEMA_CONFIGS: Record<string, Omit<SchemaConfig, \"sasSchema\">> = {\n Feedback: {\n signatureMode: SignatureMode.DualSignature,\n storageType: StorageType.Compressed,\n delegationSchema: null, // Set at deployment to Delegate schema address\n closeable: false,\n name: \"FeedbackV1\",\n },\n FeedbackPublic: {\n signatureMode: SignatureMode.CounterpartySigned,\n storageType: StorageType.Compressed,\n delegationSchema: null, // No delegation for CounterpartySigned\n closeable: false,\n name: \"FeedbackPublicV1\",\n },\n Validation: {\n signatureMode: SignatureMode.DualSignature,\n storageType: StorageType.Compressed,\n delegationSchema: null, // Set at deployment to Delegate schema address\n closeable: false,\n name: \"ValidationV1\",\n },\n ReputationScore: {\n signatureMode: SignatureMode.CounterpartySigned,\n storageType: StorageType.Regular,\n delegationSchema: null, // Provider controls, no delegation\n closeable: true,\n name: \"ReputationScoreV3\",\n },\n Delegate: {\n signatureMode: SignatureMode.AgentOwnerSigned,\n storageType: StorageType.Regular,\n delegationSchema: null, // No delegation for delegation itself (no recursive delegation)\n closeable: true,\n name: \"DelegateV1\",\n },\n} as const;\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n// Address encoder/decoder singletons\nconst addressEncoder = getAddressEncoder();\nconst addressDecoder = getAddressDecoder();\n\n/**\n * Convert Address to 32-byte Uint8Array\n */\nexport function addressToBytes(address: Address): Uint8Array {\n return new Uint8Array(addressEncoder.encode(address));\n}\n\n/**\n * Convert 32-byte Uint8Array to Address\n */\nexport function bytesToAddress(bytes: Uint8Array): Address {\n return addressDecoder.decode(bytes);\n}\n\n/**\n * Serialize universal base layout data to bytes\n */\nexport function serializeUniversalLayout(data: BaseLayout): Uint8Array {\n const contentBytes = data.content.slice(0, MAX_CONTENT_SIZE);\n\n // Total size: 131 (base) + content\n const totalSize = MIN_BASE_LAYOUT_SIZE + contentBytes.length;\n const buffer = new Uint8Array(totalSize);\n let offset = 0;\n\n // layoutVersion (1 byte)\n buffer[offset++] = CURRENT_LAYOUT_VERSION;\n\n // taskRef (32 bytes)\n buffer.set(data.taskRef, offset);\n offset += 32;\n\n // agentMint (32 bytes)\n buffer.set(addressToBytes(data.agentMint), offset);\n offset += 32;\n\n // counterparty (32 bytes)\n buffer.set(addressToBytes(data.counterparty), offset);\n offset += 32;\n\n // outcome (1 byte)\n buffer[offset++] = data.outcome;\n\n // dataHash (32 bytes)\n buffer.set(data.dataHash, offset);\n offset += 32;\n\n // contentType (1 byte)\n buffer[offset++] = data.contentType;\n\n // content (variable, no length prefix - length derived from total size)\n buffer.set(contentBytes, offset);\n\n return buffer;\n}\n\n/**\n * Deserialize universal base layout data from bytes\n */\nexport function deserializeUniversalLayout(bytes: Uint8Array): BaseLayout {\n if (bytes.length < MIN_BASE_LAYOUT_SIZE) {\n throw new Error(`Data too small (minimum ${MIN_BASE_LAYOUT_SIZE} bytes, got ${bytes.length})`);\n }\n\n let offset = 0;\n\n // Skip layoutVersion (1 byte) - already validated on-chain\n offset += 1;\n\n // taskRef (32 bytes)\n const taskRef = bytes.slice(offset, offset + 32);\n offset += 32;\n\n // agentMint (32 bytes)\n const agentMint = bytesToAddress(bytes.slice(offset, offset + 32));\n offset += 32;\n\n // counterparty (32 bytes)\n const counterparty = bytesToAddress(bytes.slice(offset, offset + 32));\n offset += 32;\n\n // outcome (1 byte)\n const outcome = bytes[offset++] as Outcome;\n\n // dataHash (32 bytes)\n const dataHash = bytes.slice(offset, offset + 32);\n offset += 32;\n\n // contentType (1 byte)\n const contentType = bytes[offset++] as ContentType;\n\n // content (remaining bytes)\n const content = bytes.slice(offset);\n\n return {\n taskRef,\n agentMint,\n counterparty,\n outcome,\n dataHash,\n contentType,\n content,\n };\n}\n\n/**\n * Deserialize attestation data based on data type\n */\nexport function deserializeAttestationData(\n dataType: DataType,\n data: Uint8Array,\n): FeedbackData | ValidationData | ReputationScoreData {\n switch (dataType) {\n case DataType.Feedback:\n return deserializeFeedback(data);\n case DataType.Validation:\n return deserializeValidation(data);\n case DataType.ReputationScore:\n return deserializeReputationScore(data);\n default:\n throw new Error(`Unknown data type: ${dataType}`);\n }\n}\n\n/**\n * Get the outcome label string\n */\nexport function getOutcomeLabel(outcome: Outcome): string {\n switch (outcome) {\n case Outcome.Negative:\n return \"Negative\";\n case Outcome.Neutral:\n return \"Neutral\";\n case Outcome.Positive:\n return \"Positive\";\n default:\n return \"Unknown\";\n }\n}\n\n/**\n * Convert Outcome to ERC-8004 score (0-100)\n */\nexport function outcomeToScore(outcome: Outcome): number {\n switch (outcome) {\n case Outcome.Negative:\n return 0;\n case Outcome.Neutral:\n return 50;\n case Outcome.Positive:\n return 100;\n default:\n return 50;\n }\n}\n\n/**\n * Get the content type label string\n */\nexport function getContentTypeLabel(contentType: ContentType): string {\n switch (contentType) {\n case ContentType.None:\n return \"None\";\n case ContentType.JSON:\n return \"JSON\";\n case ContentType.UTF8:\n return \"UTF-8\";\n case ContentType.IPFS:\n return \"IPFS\";\n case ContentType.Arweave:\n return \"Arweave\";\n case ContentType.Encrypted:\n return \"Encrypted\";\n default:\n return \"Unknown\";\n }\n}\n\n/**\n * Create JSON content bytes from a content object\n */\nexport function createJsonContent<T>(content: T): Uint8Array {\n const json = JSON.stringify(content);\n return new TextEncoder().encode(json);\n}\n\n/**\n * Create zero-filled data hash (for CounterpartySigned/AgentOwnerSigned schemas)\n */\nexport function zeroDataHash(): Uint8Array {\n return new Uint8Array(32);\n}\n\n/**\n * Validate universal base layout\n */\nexport function validateBaseLayout(data: Uint8Array): void {\n if (data.length < MIN_BASE_LAYOUT_SIZE) {\n throw new Error(`Data too small (minimum ${MIN_BASE_LAYOUT_SIZE} bytes)`);\n }\n\n const version = data[OFFSETS.LAYOUT_VERSION];\n if (version !== CURRENT_LAYOUT_VERSION) {\n throw new Error(`Unsupported layout version: ${version} (expected ${CURRENT_LAYOUT_VERSION})`);\n }\n\n const outcome = data[OFFSETS.OUTCOME];\n if (outcome > 2) {\n throw new Error(`Invalid outcome value: ${outcome} (must be 0, 1, or 2)`);\n }\n\n const contentType = data[OFFSETS.CONTENT_TYPE];\n if (contentType > 15) {\n throw new Error(`Invalid content type: ${contentType} (must be 0-15)`);\n }\n\n const contentLen = data.length - OFFSETS.CONTENT;\n if (contentLen > MAX_CONTENT_SIZE) {\n throw new Error(`Content too large: ${contentLen} bytes (max ${MAX_CONTENT_SIZE})`);\n }\n}\n\n// ============================================================================\n// Content Size Validation\n// ============================================================================\n\n/**\n * Content size validation options\n */\nexport interface ContentSizeValidationOptions {\n /** Throw error if content exceeds limit (default: true) */\n throwOnError?: boolean;\n}\n\n/**\n * Content size validation result\n */\nexport interface ContentSizeValidationResult {\n /** Whether content size is valid */\n valid: boolean;\n /** Maximum allowed size for this mode */\n maxSize: number;\n /** Actual content size */\n actualSize: number;\n /** Error message if invalid */\n error?: string;\n}\n\n/**\n * Get maximum content size for a signature mode.\n *\n * @param signatureMode - DualSignature, CounterpartySigned, or AgentOwnerSigned\n * @returns Maximum content size in bytes\n *\n * @example\n * ```typescript\n * const maxSize = getMaxContentSize(SignatureMode.DualSignature);\n * // => 70\n * ```\n */\nexport function getMaxContentSize(signatureMode: SignatureMode): number {\n return signatureMode === SignatureMode.DualSignature\n ? MAX_DUAL_SIGNATURE_CONTENT_SIZE\n : MAX_SINGLE_SIGNATURE_CONTENT_SIZE; // CounterpartySigned and AgentOwnerSigned both use single signature\n}\n\n/**\n * Validate content size for a given signature mode.\n *\n * @param content - Content bytes to validate\n * @param signatureMode - DualSignature, CounterpartySigned, or AgentOwnerSigned\n * @param options - Validation options\n * @returns Validation result\n * @throws Error if content exceeds limit and throwOnError is true (default)\n *\n * @example\n * ```typescript\n * // Check before building transaction\n * const result = validateContentSize(myContent, SignatureMode.DualSignature, { throwOnError: false });\n * if (!result.valid) {\n * console.log(`Content too large: ${result.actualSize}/${result.maxSize} bytes`);\n * }\n *\n * // Or throw on error (default behavior)\n * validateContentSize(myContent, SignatureMode.DualSignature); // throws if too large\n * ```\n */\nexport function validateContentSize(\n content: Uint8Array,\n signatureMode: SignatureMode,\n options: ContentSizeValidationOptions = {},\n): ContentSizeValidationResult {\n const { throwOnError = true } = options;\n const maxSize = getMaxContentSize(signatureMode);\n const actualSize = content.length;\n const valid = actualSize <= maxSize;\n\n const result: ContentSizeValidationResult = {\n valid,\n maxSize,\n actualSize,\n };\n\n if (!valid) {\n const modeName = signatureMode === SignatureMode.DualSignature ? \"DualSignature\" : \"SingleSignature\";\n result.error = `Content too large for ${modeName} mode: ${actualSize} bytes exceeds maximum ${maxSize} bytes. Use ContentType.IPFS or ContentType.Arweave for larger content.`;\n\n if (throwOnError) {\n throw new Error(result.error);\n }\n }\n\n return result;\n}\n","/**\n * Domain-separated hash functions for SATI attestations.\n *\n * These functions must produce identical hashes to the Rust implementations\n * in programs/sati/src/signature.rs. Uses keccak256 from @noble/hashes.\n *\n * ## Universal Base Layout (130 bytes)\n * All schemas share identical first 130 bytes. Hash computation uses:\n * - task_ref (32 bytes)\n * - data_hash (32 bytes) at offset 97\n *\n * ## Signature Model\n * - Agent signs: interaction_hash = keccak256(domain, schema, task_ref, data_hash)\n * - Counterparty signs: SIWS human-readable message (built in offchain-signing.ts)\n *\n * ## Identity Model\n * - `agentMint` = agent's **MINT ADDRESS** (stable identity)\n * - The agent NFT **OWNER** signs (verified via ATA ownership on-chain)\n */\n\nimport { keccak_256 } from \"@noble/hashes/sha3.js\";\nimport { type Address, getAddressEncoder } from \"@solana/kit\";\n\n// Domain separators - must match programs/sati/src/constants.rs\nconst DOMAIN_INTERACTION = new TextEncoder().encode(\"SATI:interaction:v1\");\nconst DOMAIN_EVM_LINK = new TextEncoder().encode(\"SATI:evm_link:v1\");\n\n/**\n * Helper to convert Address to 32-byte Uint8Array\n */\nfunction addressToBytes(address: Address): Uint8Array {\n const encoder = getAddressEncoder();\n // Convert ReadonlyUint8Array to mutable Uint8Array\n return new Uint8Array(encoder.encode(address));\n}\n\n/**\n * Compute the interaction hash that the agent signs (blind to outcome).\n * Domain: SATI:interaction:v1\n *\n * The agent signs this hash as a blind commitment to the interaction.\n * Note: token_account is NOT included in the hash (removed in v2 layout).\n *\n * @param sasSchema - SAS schema address\n * @param taskRef - 32-byte task reference (e.g., CAIP-220 tx hash)\n * @param dataHash - 32-byte hash of the request/interaction data\n * @returns 32-byte keccak256 hash\n */\nexport function computeInteractionHash(sasSchema: Address, taskRef: Uint8Array, dataHash: Uint8Array): Uint8Array {\n if (taskRef.length !== 32) {\n throw new Error(\"taskRef must be 32 bytes\");\n }\n if (dataHash.length !== 32) {\n throw new Error(\"dataHash must be 32 bytes\");\n }\n\n const data = new Uint8Array(\n DOMAIN_INTERACTION.length + 32 + 32 + 32, // domain + schema + taskRef + dataHash\n );\n\n let offset = 0;\n data.set(DOMAIN_INTERACTION, offset);\n offset += DOMAIN_INTERACTION.length;\n data.set(addressToBytes(sasSchema), offset);\n offset += 32;\n data.set(taskRef, offset);\n offset += 32;\n data.set(dataHash, offset);\n\n return keccak_256(data);\n}\n\n/**\n * Compute the deterministic nonce for compressed attestation address derivation.\n * Includes counterparty to ensure unique addresses per (task, agent, counterparty) tuple.\n *\n * @param taskRef - 32-byte task reference\n * @param sasSchema - SAS schema address\n * @param agentMint - Agent's mint address\n * @param counterparty - Counterparty's address\n * @returns 32-byte keccak256 nonce\n */\nexport function computeAttestationNonce(\n taskRef: Uint8Array,\n sasSchema: Address,\n agentMint: Address,\n counterparty: Address,\n): Uint8Array {\n if (taskRef.length !== 32) {\n throw new Error(\"taskRef must be 32 bytes\");\n }\n\n const data = new Uint8Array(32 + 32 + 32 + 32); // taskRef + schema + agentMint + counterparty\n\n let offset = 0;\n data.set(taskRef, offset);\n offset += 32;\n data.set(addressToBytes(sasSchema), offset);\n offset += 32;\n data.set(addressToBytes(agentMint), offset);\n offset += 32;\n data.set(addressToBytes(counterparty), offset);\n\n return keccak_256(data);\n}\n\n/**\n * Compute the deterministic nonce for regular (SAS) ReputationScoreV3 attestation.\n * One ReputationScoreV3 per (provider, agent) pair.\n *\n * Also serves as the deterministic task_ref stored in the attestation data,\n * since both are keccak256(provider || agentMint) per the spec.\n *\n * @param provider - Reputation provider's address\n * @param agentMint - Agent's mint address\n * @returns 32-byte keccak256 nonce\n */\nexport function computeReputationNonce(provider: Address, agentMint: Address): Uint8Array {\n const data = new Uint8Array(32 + 32); // provider + agentMint\n\n data.set(addressToBytes(provider), 0);\n data.set(addressToBytes(agentMint), 32);\n\n return keccak_256(data);\n}\n\n/**\n * Compute the hash for EVM address linking.\n * Domain: SATI:evm_link:v1\n *\n * @param agentMint - Agent's mint address\n * @param evmAddress - 20-byte EVM address (without 0x prefix)\n * @param chainId - CAIP-2 chain identifier (e.g., \"eip155:1\")\n * @returns 32-byte keccak256 hash\n */\nexport function computeEvmLinkHash(agentMint: Address, evmAddress: Uint8Array, chainId: string): Uint8Array {\n if (evmAddress.length !== 20) {\n throw new Error(\"evmAddress must be 20 bytes\");\n }\n\n const chainIdBytes = new TextEncoder().encode(chainId);\n const data = new Uint8Array(DOMAIN_EVM_LINK.length + 32 + 20 + chainIdBytes.length);\n\n let offset = 0;\n data.set(DOMAIN_EVM_LINK, offset);\n offset += DOMAIN_EVM_LINK.length;\n data.set(addressToBytes(agentMint), offset);\n offset += 32;\n data.set(evmAddress, offset);\n offset += 20;\n data.set(chainIdBytes, offset);\n\n return keccak_256(data);\n}\n\n// =============================================================================\n// Data Hash Helpers\n// =============================================================================\n// These helpers compute the `data_hash` field for attestations - the agent's\n// cryptographic commitment to the interaction content.\n\n/**\n * Compute data_hash from raw request and response content.\n *\n * This is the agent's blind commitment to the interaction.\n * Use this when you have the full request/response content available.\n *\n * @param request - Raw request content (e.g., JSON body, prompt text)\n * @param response - Raw response content (e.g., API response, completion)\n * @returns 32-byte keccak256 hash\n *\n * @example\n * ```typescript\n * const request = new TextEncoder().encode(JSON.stringify({ prompt: \"Hello\" }));\n * const response = new TextEncoder().encode(JSON.stringify({ text: \"Hi there!\" }));\n * const dataHash = computeDataHash(request, response);\n * ```\n */\nexport function computeDataHash(request: Uint8Array, response: Uint8Array): Uint8Array {\n const data = new Uint8Array(request.length + response.length);\n data.set(request, 0);\n data.set(response, request.length);\n return keccak_256(data);\n}\n\n/**\n * Compute data_hash from pre-computed request and response hashes.\n *\n * Use this for large content or streaming scenarios where you want to\n * hash incrementally rather than buffering the entire content.\n *\n * @param requestHash - 32-byte hash of request content\n * @param responseHash - 32-byte hash of response content\n * @returns 32-byte keccak256 hash\n *\n * @example\n * ```typescript\n * // For large content, hash each part separately\n * const requestHash = keccak_256(largeRequestBuffer);\n * const responseHash = keccak_256(largeResponseBuffer);\n * const dataHash = computeDataHashFromHashes(requestHash, responseHash);\n * ```\n */\nexport function computeDataHashFromHashes(requestHash: Uint8Array, responseHash: Uint8Array): Uint8Array {\n if (requestHash.length !== 32) {\n throw new Error(\"requestHash must be 32 bytes\");\n }\n if (responseHash.length !== 32) {\n throw new Error(\"responseHash must be 32 bytes\");\n }\n\n const data = new Uint8Array(64);\n data.set(requestHash, 0);\n data.set(responseHash, 32);\n return keccak_256(data);\n}\n\n/**\n * Compute data_hash from string request and response.\n *\n * Convenience wrapper for the common case of string content.\n *\n * @param request - Request string (will be UTF-8 encoded)\n * @param response - Response string (will be UTF-8 encoded)\n * @returns 32-byte keccak256 hash\n *\n * @example\n * ```typescript\n * const dataHash = computeDataHashFromStrings(\n * '{\"prompt\": \"What is 2+2?\"}',\n * '{\"answer\": \"4\"}'\n * );\n * ```\n */\nexport function computeDataHashFromStrings(request: string, response: string): Uint8Array {\n const encoder = new TextEncoder();\n return computeDataHash(encoder.encode(request), encoder.encode(response));\n}\n\n/**\n * Create a zero-filled data_hash for SingleSigner schemas.\n *\n * SingleSigner schemas (like ReputationScoreV3) don't use blind commitments,\n * so data_hash should be zeros.\n *\n * @returns 32-byte zero-filled Uint8Array\n */\nexport function zeroDataHash(): Uint8Array {\n return new Uint8Array(32);\n}\n\n// Re-export Outcome from schemas (single source of truth)\nexport { Outcome } from \"./schemas\";\n\n/**\n * Export domain separators for reference\n */\nexport const DOMAINS = {\n INTERACTION: DOMAIN_INTERACTION,\n EVM_LINK: DOMAIN_EVM_LINK,\n} as const;\n","/**\n * SATI Light Client\n *\n * SATI-specific Light Protocol client that uses compression-kit as the underlying\n * RPC layer. This provides SATI-specific query and proof methods for compressed\n * attestations.\n *\n * ## Identity Model\n * - `agentMint` = agent's **MINT ADDRESS** (stable identity)\n */\n\nimport {\n address,\n type Address,\n getAddressEncoder,\n getAddressDecoder,\n getProgramDerivedAddress,\n getUtf8Encoder,\n} from \"@solana/kit\";\nimport {\n createPhotonRpc,\n type PhotonRpc,\n type CompressedAccount,\n type ValidityProofWithContext,\n type TreeInfo,\n type MemcmpFilter,\n deriveAddress,\n deriveAddressSeed,\n PackedAccounts,\n createSystemAccountConfig,\n LIGHT_SYSTEM_PROGRAM,\n ACCOUNT_COMPRESSION_PROGRAM,\n NOOP_PROGRAM,\n REGISTERED_PROGRAM_PDA,\n ADDRESS_TREE,\n ADDRESS_QUEUE,\n MERKLE_TREE_PUBKEY,\n NULLIFIER_QUEUE_PUBKEY,\n createBN254,\n} from \"@cascade-fyi/compression-kit\";\n\nimport { SATI_PROGRAM_ADDRESS } from \"./generated/programs/sati.js\";\nimport type { CompressedAttestation, FeedbackData, ValidationData, Outcome } from \"./schemas\";\nimport { deserializeFeedback, deserializeValidation } from \"./schemas\";\n\n// Offsets for parsing compressed attestation data (Borsh serialization)\n// Note: The `data` field is a Vec<u8> which has a 4-byte length prefix\nconst BORSH_OFFSETS = {\n SAS_SCHEMA: 0,\n AGENT_MINT: 32,\n DATA_LEN: 64, // 4-byte u32 LE length prefix for Vec<u8>\n DATA_START: 68, // Actual data bytes start after length prefix\n} as const;\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * PublicKey-like object (browser-compatible)\n */\nexport interface PublicKeyLike {\n toBase58(): string;\n toBytes(): Uint8Array;\n}\n\n/**\n * Filter options for querying compressed attestations.\n */\nexport interface AttestationFilter {\n sasSchema?: Address;\n /** Agent's mint address to filter by */\n agentMint?: Address;\n counterparty?: Address;\n outcome?: Outcome;\n responseMin?: number;\n responseMax?: number;\n /** Maximum number of results to return per page (default: all) */\n limit?: number;\n /** Pagination cursor from previous response (for fetching next page) */\n cursor?: string;\n}\n\n/**\n * Paginated result for attestation queries.\n * Matches Photon RPC cursor-based pagination model.\n */\nexport interface PaginatedAttestations<T> {\n /** Attestations matching the filter */\n items: T[];\n /** Cursor for next page, null if no more results */\n cursor: string | null;\n}\n\n/**\n * Parsed compressed attestation with decoded data\n */\nexport interface ParsedAttestation {\n address: Uint8Array;\n raw: CompressedAccount;\n attestation: CompressedAttestation;\n data: FeedbackData | ValidationData;\n}\n\n/**\n * Parsed feedback attestation with FeedbackData\n */\nexport interface ParsedFeedbackAttestation {\n address: Uint8Array;\n raw: CompressedAccount;\n attestation: CompressedAttestation;\n data: FeedbackData;\n}\n\n/**\n * Parsed validation attestation with ValidationData\n */\nexport interface ParsedValidationAttestation {\n address: Uint8Array;\n raw: CompressedAccount;\n attestation: CompressedAttestation;\n data: ValidationData;\n}\n\n/**\n * Validity proof result for instruction building\n */\nexport interface ValidityProofResult {\n compressedProof: {\n a: number[];\n b: number[];\n c: number[];\n };\n rootIndices: number[];\n leafIndices: number[];\n}\n\n/**\n * Packed address tree info for instruction data\n */\nexport interface PackedAddressTreeInfo {\n rootIndex: number;\n addressMerkleTreePubkeyIndex: number;\n addressQueuePubkeyIndex: number;\n}\n\n/**\n * Packed state tree info for instruction data\n */\nexport interface PackedStateTreeInfo {\n merkleTreePubkeyIndex: number;\n queuePubkeyIndex: number;\n leafIndex: number;\n rootIndex: number;\n}\n\n/**\n * Account meta for remaining accounts\n */\nexport interface AccountMeta {\n pubkey: PublicKeyLike;\n isSigner: boolean;\n isWritable: boolean;\n}\n\n/**\n * Creation proof result with all necessary data for creating compressed accounts\n */\nexport interface CreationProofResult {\n proof: ValidityProofResult;\n addressTreeInfo: PackedAddressTreeInfo;\n outputStateTreeIndex: number;\n remainingAccounts: AccountMeta[];\n}\n\n/**\n * Mutation proof result for closing/updating attestations\n */\nexport interface MutationProofResult {\n proof: ValidityProofResult;\n stateTreeInfo: PackedStateTreeInfo;\n outputStateTreeIndex: number;\n remainingAccounts: AccountMeta[];\n}\n\n// =============================================================================\n// Simple PublicKey Implementation\n// =============================================================================\n\n/**\n * Simple PublicKey implementation that satisfies the PublicKeyLike interface.\n */\nclass SimplePublicKey implements PublicKeyLike {\n private readonly bytes: Uint8Array;\n private cachedBase58: string | null = null;\n\n constructor(value: Uint8Array | string) {\n if (typeof value === \"string\") {\n this.bytes = new Uint8Array(getAddressEncoder().encode(address(value)));\n this.cachedBase58 = value;\n } else {\n if (value.length !== 32) {\n throw new Error(`Invalid public key length: ${value.length}, expected 32`);\n }\n this.bytes = new Uint8Array(value);\n }\n }\n\n toBase58(): string {\n if (this.cachedBase58 === null) {\n this.cachedBase58 = getAddressDecoder().decode(this.bytes) as string;\n }\n return this.cachedBase58;\n }\n\n toBytes(): Uint8Array {\n return this.bytes;\n }\n}\n\n// =============================================================================\n// SATI Light Client Interface\n// =============================================================================\n\n/**\n * SATI Light Client interface for compressed attestation operations.\n */\nexport interface SATILightClient {\n /** Get the underlying Photon RPC client */\n getRpc(): PhotonRpc;\n\n /** Derive attestation address from seeds */\n deriveAttestationAddress(seeds: Uint8Array[]): Promise<{\n address: PublicKeyLike;\n addressTree: PublicKeyLike;\n addressQueue: PublicKeyLike;\n }>;\n\n /** Get attestation by address */\n getAttestationByAddress(addr: Address): Promise<ParsedAttestation | null>;\n\n /** List feedback attestations with pagination */\n listFeedbacks(filter: Partial<AttestationFilter>): Promise<PaginatedAttestations<ParsedFeedbackAttestation>>;\n\n /** List validation attestations with pagination */\n listValidations(filter: Partial<AttestationFilter>): Promise<PaginatedAttestations<ParsedValidationAttestation>>;\n\n /** Get creation proof for a new compressed account */\n getCreationProof(addr: PublicKeyLike): Promise<CreationProofResult>;\n\n /** Get mutation proof for closing/updating an attestation */\n getMutationProof(compressedAccount: CompressedAccount): Promise<MutationProofResult>;\n\n /** Prepare everything needed to create a new compressed account */\n prepareCreate(seeds: Uint8Array[]): Promise<{\n address: PublicKeyLike;\n proof: ValidityProofResult;\n addressTreeInfo: PackedAddressTreeInfo;\n outputStateTreeIndex: number;\n remainingAccounts: AccountMeta[];\n }>;\n\n /** Get lookup table addresses for transaction compression */\n getLookupTableAddresses(\n schemaAddresses?: Address[],\n agentAtas?: { mint: Address; owner: Address }[],\n ): Promise<Address[]>;\n}\n\n// =============================================================================\n// SATI Light Client Implementation\n// =============================================================================\n\n/**\n * SATI Light Client implementation using compression-kit.\n */\nexport class SATILightClientImpl implements SATILightClient {\n private readonly rpc: PhotonRpc;\n private readonly programId: Address;\n\n constructor(photonRpcUrl: string, programId: Address = SATI_PROGRAM_ADDRESS) {\n this.rpc = createPhotonRpc(photonRpcUrl);\n this.programId = programId;\n }\n\n getRpc(): PhotonRpc {\n return this.rpc;\n }\n\n async deriveAttestationAddress(seeds: Uint8Array[]): Promise<{\n address: PublicKeyLike;\n addressTree: PublicKeyLike;\n addressQueue: PublicKeyLike;\n }> {\n const addressTree = ADDRESS_TREE;\n const addressQueue = ADDRESS_QUEUE;\n\n const seed = deriveAddressSeed(seeds, this.programId);\n const derivedAddress = deriveAddress(seed, addressTree);\n\n return {\n address: new SimplePublicKey(derivedAddress),\n addressTree: new SimplePublicKey(addressTree),\n addressQueue: new SimplePublicKey(addressQueue),\n };\n }\n\n async getAttestationByAddress(addr: Address): Promise<ParsedAttestation | null> {\n const account = await this.rpc.getCompressedAccount({ address: addr });\n if (!account || !account.data) return null;\n\n // Try feedback deserializer first (most common), fall back to validation\n try {\n return this.parseAttestation(account, deserializeFeedback);\n } catch {\n try {\n return this.parseAttestation(account, deserializeValidation);\n } catch {\n return null;\n }\n }\n }\n\n async listFeedbacks(\n filter: AttestationFilter & { sasSchema: Address },\n ): Promise<PaginatedAttestations<ParsedFeedbackAttestation>> {\n // Query compressed accounts owned by SATI program with sasSchema filter\n const result = await this.queryAttestations(filter, deserializeFeedback);\n return {\n items: result.items as ParsedFeedbackAttestation[],\n cursor: result.cursor,\n };\n }\n\n async listValidations(\n filter: AttestationFilter & { sasSchema: Address },\n ): Promise<PaginatedAttestations<ParsedValidationAttestation>> {\n // Query compressed accounts owned by SATI program with sasSchema filter\n const result = await this.queryAttestations(filter, deserializeValidation);\n return {\n items: result.items as ParsedValidationAttestation[],\n cursor: result.cursor,\n };\n }\n\n async getCreationProof(addr: PublicKeyLike): Promise<CreationProofResult> {\n const addressBytes = addr.toBytes();\n const addressBN254 = createBN254(addressBytes);\n\n const proofResult = await this.rpc.getValidityProof(\n [],\n [\n {\n address: addressBN254,\n addressTreeInfo: {\n tree: ADDRESS_TREE,\n queue: ADDRESS_QUEUE,\n treeType: 2, // AddressV1\n nextTreeInfo: null,\n },\n },\n ],\n );\n\n const packedAccounts = await PackedAccounts.newWithSystemAccounts(createSystemAccountConfig(this.programId));\n\n const addressTreeIndex = packedAccounts.insertOrGet(ADDRESS_TREE);\n const addressQueueIndex = packedAccounts.insertOrGet(ADDRESS_QUEUE);\n const outputStateTreeIndex = packedAccounts.insertOrGet(MERKLE_TREE_PUBKEY);\n\n const { remainingAccounts } = packedAccounts.toAccountMetas();\n\n return {\n proof: this.convertProof(proofResult),\n addressTreeInfo: {\n rootIndex: proofResult.rootIndices[0] ?? 0,\n addressMerkleTreePubkeyIndex: addressTreeIndex,\n addressQueuePubkeyIndex: addressQueueIndex,\n },\n outputStateTreeIndex,\n remainingAccounts: remainingAccounts.map((m: { address: Address; role: number }) => ({\n pubkey: new SimplePublicKey(m.address),\n isSigner: m.role === 2 || m.role === 3,\n isWritable: m.role === 1 || m.role === 3,\n })),\n };\n }\n\n async getMutationProof(compressedAccount: CompressedAccount): Promise<MutationProofResult> {\n const hash = compressedAccount.hash;\n const hashBN254 = typeof hash === \"bigint\" ? hash : createBN254(hash as Uint8Array);\n\n const proofResult = await this.rpc.getValidityProof(\n [\n {\n hash: hashBN254,\n stateTreeInfo: compressedAccount.treeInfo as TreeInfo,\n },\n ],\n [],\n );\n\n const packedAccounts = await PackedAccounts.newWithSystemAccounts(createSystemAccountConfig(this.programId));\n\n const treeInfo = compressedAccount.treeInfo as TreeInfo;\n const merkleTreeIndex = packedAccounts.insertOrGet(treeInfo.tree);\n const queueIndex = packedAccounts.insertOrGet(treeInfo.queue);\n const outputStateTreeIndex = packedAccounts.insertOrGet(MERKLE_TREE_PUBKEY);\n\n const { remainingAccounts } = packedAccounts.toAccountMetas();\n\n return {\n proof: this.convertProof(proofResult),\n stateTreeInfo: {\n merkleTreePubkeyIndex: merkleTreeIndex,\n queuePubkeyIndex: queueIndex,\n leafIndex: compressedAccount.leafIndex as number,\n rootIndex: proofResult.rootIndices[0] ?? 0,\n },\n outputStateTreeIndex,\n remainingAccounts: remainingAccounts.map((m: { address: Address; role: number }) => ({\n pubkey: new SimplePublicKey(m.address),\n isSigner: m.role === 2 || m.role === 3,\n isWritable: m.role === 1 || m.role === 3,\n })),\n };\n }\n\n async prepareCreate(seeds: Uint8Array[]): Promise<{\n address: PublicKeyLike;\n proof: ValidityProofResult;\n addressTreeInfo: PackedAddressTreeInfo;\n outputStateTreeIndex: number;\n remainingAccounts: AccountMeta[];\n }> {\n const { address: derivedAddress, addressTree, addressQueue } = await this.deriveAttestationAddress(seeds);\n\n const addressBN254 = createBN254(derivedAddress.toBytes());\n\n const proofResult = await this.rpc.getValidityProof(\n [],\n [\n {\n address: addressBN254,\n addressTreeInfo: {\n tree: addressTree.toBase58() as Address,\n queue: addressQueue.toBase58() as Address,\n treeType: 2, // AddressV1\n nextTreeInfo: null,\n },\n },\n ],\n );\n\n const packedAccounts = await PackedAccounts.newWithSystemAccounts(createSystemAccountConfig(this.programId));\n\n const addressTreeIndex = packedAccounts.insertOrGet(addressTree.toBase58() as Address);\n const addressQueueIndex = packedAccounts.insertOrGet(addressQueue.toBase58() as Address);\n const outputStateTreeIndex = packedAccounts.insertOrGet(MERKLE_TREE_PUBKEY);\n\n const { remainingAccounts } = packedAccounts.toAccountMetas();\n\n return {\n address: derivedAddress,\n proof: this.convertProof(proofResult),\n addressTreeInfo: {\n rootIndex: proofResult.rootIndices[0] ?? 0,\n addressMerkleTreePubkeyIndex: addressTreeIndex,\n addressQueuePubkeyIndex: addressQueueIndex,\n },\n outputStateTreeIndex,\n remainingAccounts: remainingAccounts.map((m: { address: Address; role: number }) => ({\n pubkey: new SimplePublicKey(m.address),\n isSigner: m.role === 2 || m.role === 3,\n isWritable: m.role === 1 || m.role === 3,\n })),\n };\n }\n\n /**\n * Get addresses that should be included in the lookup table for transaction compression.\n *\n * @param schemaAddresses - Optional schema addresses to include their schemaConfigPdas\n * (use deployed schema addresses for maximum compression)\n * @param agentAtas - Optional agent ATA info to include derived ATAs\n * (use known agents for maximum compression)\n */\n async getLookupTableAddresses(\n schemaAddresses?: Address[],\n agentAtas?: { mint: Address; owner: Address }[],\n ): Promise<Address[]> {\n // Solana system programs\n const SYSTEM_PROGRAM = address(\"11111111111111111111111111111111\");\n const ED25519_PROGRAM = address(\"Ed25519SigVerify111111111111111111111111111\");\n const INSTRUCTIONS_SYSVAR = address(\"Sysvar1nstructions1111111111111111111111111\");\n const COMPUTE_BUDGET_PROGRAM = address(\"ComputeBudget111111111111111111111111111111\");\n const TOKEN_2022_PROGRAM = address(\"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\");\n\n // Derive event authority PDA: PDA(SATI_PROGRAM, [\"__event_authority\"])\n const [eventAuthority] = await getProgramDerivedAddress({\n programAddress: this.programId,\n seeds: [getUtf8Encoder().encode(\"__event_authority\")],\n });\n\n // Derive CPI signer PDA: PDA(SATI_PROGRAM, [\"cpi_authority\"])\n // This is used by Light Protocol for CPI calls from our program\n const [cpiSigner] = await getProgramDerivedAddress({\n programAddress: this.programId,\n seeds: [getUtf8Encoder().encode(\"cpi_authority\")],\n });\n\n // Derive account compression authority PDA: PDA(LIGHT_SYSTEM_PROGRAM, [\"cpi_authority\"])\n // This is used by Light Protocol for account compression operations\n const [compressionAuthority] = await getProgramDerivedAddress({\n programAddress: LIGHT_SYSTEM_PROGRAM,\n seeds: [getUtf8Encoder().encode(\"cpi_authority\")],\n });\n\n // Derive schemaConfigPdas for provided schemas\n // Each schemaConfigPda in ALT saves 32 bytes per transaction\n const schemaConfigPdas: Address[] = [];\n if (schemaAddresses) {\n for (const sasSchema of schemaAddresses) {\n const [schemaConfigPda] = await getProgramDerivedAddress({\n programAddress: this.programId,\n seeds: [getUtf8Encoder().encode(\"schema_config\"), getAddressEncoder().encode(sasSchema)],\n });\n schemaConfigPdas.push(schemaConfigPda);\n }\n }\n\n // Derive ATAs for provided agent info\n // Each agentAta in ALT saves 32 bytes per transaction\n const ASSOCIATED_TOKEN_PROGRAM = address(\"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\");\n const derivedAtas: Address[] = [];\n if (agentAtas) {\n for (const ataInfo of agentAtas) {\n const [ata] = await getProgramDerivedAddress({\n programAddress: ASSOCIATED_TOKEN_PROGRAM,\n seeds: [\n getAddressEncoder().encode(ataInfo.owner),\n getAddressEncoder().encode(TOKEN_2022_PROGRAM),\n getAddressEncoder().encode(ataInfo.mint),\n ],\n });\n derivedAtas.push(ata);\n }\n }\n\n return [\n // Light Protocol core\n LIGHT_SYSTEM_PROGRAM,\n ACCOUNT_COMPRESSION_PROGRAM,\n NOOP_PROGRAM,\n REGISTERED_PROGRAM_PDA,\n\n // Light Protocol state trees\n ADDRESS_TREE,\n ADDRESS_QUEUE,\n MERKLE_TREE_PUBKEY,\n NULLIFIER_QUEUE_PUBKEY,\n\n // Light Protocol CPI authorities (CRITICAL for transaction size!)\n cpiSigner,\n compressionAuthority,\n\n // SATI program and PDAs\n this.programId,\n eventAuthority,\n\n // Schema config PDAs (saves 32 bytes per schema used)\n ...schemaConfigPdas,\n\n // Agent ATAs (saves 32 bytes per agent used)\n ...derivedAtas,\n\n // Solana system programs\n SYSTEM_PROGRAM,\n ED25519_PROGRAM,\n INSTRUCTIONS_SYSVAR,\n COMPUTE_BUDGET_PROGRAM,\n TOKEN_2022_PROGRAM,\n ];\n }\n\n // ===========================================================================\n // Private Helpers\n // ===========================================================================\n\n private convertProof(proofResult: ValidityProofWithContext): ValidityProofResult {\n return {\n compressedProof: proofResult.compressedProof\n ? {\n a: Array.from(proofResult.compressedProof.a),\n b: Array.from(proofResult.compressedProof.b),\n c: Array.from(proofResult.compressedProof.c),\n }\n : { a: [], b: [], c: [] },\n rootIndices: proofResult.rootIndices,\n leafIndices: proofResult.leafIndices,\n };\n }\n\n private async queryAttestations<T extends FeedbackData | ValidationData>(\n filter: AttestationFilter & { sasSchema: Address },\n deserializer: (data: Uint8Array) => T,\n ): Promise<PaginatedAttestations<ParsedAttestation>> {\n // Build memcmp filters for server-side filtering (Photon RPC)\n const memcmpFilters: MemcmpFilter[] = [];\n memcmpFilters.push({ offset: BORSH_OFFSETS.SAS_SCHEMA, bytes: filter.sasSchema });\n if (filter.agentMint) {\n memcmpFilters.push({ offset: BORSH_OFFSETS.AGENT_MINT, bytes: filter.agentMint });\n }\n\n const result = await this.rpc.getCompressedAccountsByOwner(this.programId, {\n cursor: filter.cursor,\n limit: filter.limit,\n filters: memcmpFilters,\n });\n const attestations: ParsedAttestation[] = [];\n\n for (const account of result.items) {\n if (!account.data) continue;\n\n try {\n const parsed = this.parseAttestation(account, deserializer);\n if (!parsed) continue;\n\n // Server-side memcmp handles sasSchema and agentMint;\n // client-side filtering for fields at variable offsets\n if (filter.counterparty && parsed.data.counterparty !== filter.counterparty) continue;\n if (filter.outcome !== undefined && parsed.data.outcome !== filter.outcome) continue;\n\n attestations.push(parsed);\n } catch {\n // Skip invalid attestations\n }\n }\n\n return {\n items: attestations,\n cursor: result.cursor,\n };\n }\n\n private parseAttestation<T extends FeedbackData | ValidationData>(\n account: CompressedAccount,\n deserializer: (data: Uint8Array) => T,\n ): ParsedAttestation | null {\n if (!account.data) return null;\n\n const rawData = account.data.data;\n const data = rawData instanceof Uint8Array ? new Uint8Array(rawData) : new Uint8Array(rawData as ArrayLike<number>);\n\n // Minimum: sasSchema(32) + agentMint(32) + dataLen(4) = 68 bytes\n if (data.length < BORSH_OFFSETS.DATA_START) return null;\n\n // Parse fixed fields and convert to Address\n const addressDecoder = getAddressDecoder();\n const sasSchemaBytes = data.slice(BORSH_OFFSETS.SAS_SCHEMA, BORSH_OFFSETS.SAS_SCHEMA + 32);\n const agentMintBytes = data.slice(BORSH_OFFSETS.AGENT_MINT, BORSH_OFFSETS.AGENT_MINT + 32);\n const sasSchema = addressDecoder.decode(sasSchemaBytes);\n const agentMint = addressDecoder.decode(agentMintBytes);\n\n // Parse Vec length (4-byte u32 LE at offset 64)\n const dataLen =\n data[BORSH_OFFSETS.DATA_LEN] |\n (data[BORSH_OFFSETS.DATA_LEN + 1] << 8) |\n (data[BORSH_OFFSETS.DATA_LEN + 2] << 16) |\n (data[BORSH_OFFSETS.DATA_LEN + 3] << 24);\n const schemaDataEnd = BORSH_OFFSETS.DATA_START + dataLen;\n\n // Validate we have enough bytes for: schemaData + numSignatures(1) + sig1(64) + sig2(64)\n if (data.length < schemaDataEnd + 129) return null;\n\n const schemaData = data.slice(BORSH_OFFSETS.DATA_START, schemaDataEnd);\n const numSignatures = data[schemaDataEnd];\n const signature1 = data.slice(schemaDataEnd + 1, schemaDataEnd + 65);\n const signature2 = numSignatures > 1 ? data.slice(schemaDataEnd + 65, schemaDataEnd + 129) : new Uint8Array(64);\n\n const attestation: CompressedAttestation = {\n sasSchema,\n agentMint,\n numSignatures,\n data: schemaData,\n signature1,\n signature2,\n };\n\n // Deserialize schema-specific data using provided deserializer\n const parsedData = deserializer(schemaData);\n\n return {\n address: account.address ?? new Uint8Array(32),\n raw: account,\n attestation,\n data: parsedData,\n };\n }\n}\n\n// =============================================================================\n// Factory Function\n// =============================================================================\n\n/**\n * Create a SATI Light Client.\n *\n * @param photonRpcUrl - Photon indexer URL\n * @param programId - Optional SATI program ID (defaults to deployed address)\n */\nexport function createSATILightClient(photonRpcUrl: string, programId?: Address): SATILightClient {\n return new SATILightClientImpl(photonRpcUrl, programId);\n}\n","/**\n * SAS PDA Derivation Helpers\n *\n * Functions for deriving Program Derived Addresses for the\n * Solana Attestation Service (SAS) integration with SATI.\n */\n\nimport { type Address, type ProgramDerivedAddressBump, getProgramDerivedAddress, getAddressEncoder } from \"@solana/kit\";\n\nimport { SATI_PROGRAM_ADDRESS } from \"./generated\";\n\n// SATI credential name (duplicated here to avoid importing sas.ts which pulls in sas-lib)\nconst SATI_CREDENTIAL_NAME = \"SATI\";\n\n// SAS Program Address (mainnet/devnet)\nexport const SAS_PROGRAM_ADDRESS: Address = \"22zoJMtdu4tQc2PzL74ZUT7FrwgB1Udec8DdW4yw4BdG\" as Address;\n\n// Seeds for SAS PDA derivation\nexport const CREDENTIAL_SEED = \"credential\";\nexport const SCHEMA_SEED = \"schema\";\nexport const ATTESTATION_SEED = \"attestation\";\nexport const SATI_ATTESTATION_SEED = \"sati_attestation\";\n\n// SATI-specific constants (SATI_CREDENTIAL_NAME imported from sas.ts)\nexport const REPUTATION_SCHEMA_NAME = \"ReputationScore\";\nexport const REPUTATION_SCHEMA_VERSION = 1;\n\n/**\n * Derive the SATI authority PDA.\n *\n * This PDA is used as the authority for the SATI credential in SAS.\n * Seeds: [\"sati_attestation\"]\n *\n * @returns [address, bump] tuple\n */\nexport async function deriveSatiPda(): Promise<readonly [Address, ProgramDerivedAddressBump]> {\n return getProgramDerivedAddress({\n programAddress: SATI_PROGRAM_ADDRESS,\n seeds: [SATI_ATTESTATION_SEED],\n });\n}\n\n/**\n * Derive the SATI credential PDA in SAS using SATI program PDA as authority.\n *\n * This is SATI-specific: authority is always the SATI program PDA.\n * For generic credential derivation with custom authority, use\n * `deriveSatiCredentialPda(authority)` from sas.ts.\n *\n * Seeds: [\"credential\", sati_pda, \"SATI\"]\n *\n * @returns [address, bump] tuple\n */\nexport async function deriveSatiProgramCredentialPda(): Promise<readonly [Address, ProgramDerivedAddressBump]> {\n const [satiPda] = await deriveSatiPda();\n const addressEncoder = getAddressEncoder();\n\n return getProgramDerivedAddress({\n programAddress: SAS_PROGRAM_ADDRESS,\n seeds: [CREDENTIAL_SEED, new Uint8Array(addressEncoder.encode(satiPda)), SATI_CREDENTIAL_NAME],\n });\n}\n\n/**\n * Derive the ReputationScoreV3 schema PDA in SAS.\n *\n * Seeds: [\"schema\", credential, \"ReputationScore\", version]\n *\n * @returns [address, bump] tuple\n */\nexport async function deriveReputationSchemaPda(): Promise<readonly [Address, ProgramDerivedAddressBump]> {\n const [credential] = await deriveSatiProgramCredentialPda();\n const addressEncoder = getAddressEncoder();\n const versionSeed = Uint8Array.from([REPUTATION_SCHEMA_VERSION]);\n\n return getProgramDerivedAddress({\n programAddress: SAS_PROGRAM_ADDRESS,\n seeds: [SCHEMA_SEED, new Uint8Array(addressEncoder.encode(credential)), REPUTATION_SCHEMA_NAME, versionSeed],\n });\n}\n\n/**\n * Derive a ReputationScoreV3 attestation PDA in SAS.\n *\n * The nonce is computed from (provider, agentMint) to ensure\n * one score per (provider, agent) pair.\n *\n * Seeds: [\"attestation\", credential, schema, nonce_as_address]\n *\n * @param credential - The SAS credential address (from deployed config)\n * @param schema - The SAS ReputationScoreV3 schema address (from deployed config)\n * @param nonce - 32-byte nonce (computed via computeReputationNonce)\n * @returns [address, bump] tuple\n */\nexport async function deriveReputationAttestationPda(\n credential: Address,\n schema: Address,\n nonce: Uint8Array,\n): Promise<readonly [Address, ProgramDerivedAddressBump]> {\n if (nonce.length !== 32) {\n throw new Error(\"Nonce must be 32 bytes\");\n }\n\n const addressEncoder = getAddressEncoder();\n\n return getProgramDerivedAddress({\n programAddress: SAS_PROGRAM_ADDRESS,\n seeds: [\n ATTESTATION_SEED,\n new Uint8Array(addressEncoder.encode(credential)),\n new Uint8Array(addressEncoder.encode(schema)),\n nonce,\n ],\n });\n}\n\n/**\n * Derive the SAS event authority PDA.\n *\n * Required for CPI calls to SAS that emit events (e.g., close attestation).\n * Seeds: [\"__event_authority\"] (derived from SAS program, not SATI program)\n *\n * @returns [address, bump] tuple\n */\nexport async function deriveSasEventAuthorityPda(): Promise<readonly [Address, ProgramDerivedAddressBump]> {\n return getProgramDerivedAddress({\n programAddress: SAS_PROGRAM_ADDRESS,\n seeds: [\"__event_authority\"],\n });\n}\n\n// NOTE: Generic SAS PDA derivation functions (deriveCredentialPda, deriveSchemaPda,\n// deriveAttestationPda) are available via the re-exports in sas.ts from sas-lib.\n// This file only contains SATI-specific derivation helpers.\n","/**\n * SATI SDK Helpers\n *\n * Browser-compatible utility functions for PDA derivation and constants.\n */\n\nimport { address, type Address, getProgramDerivedAddress, getAddressEncoder } from \"@solana/kit\";\nimport { SATI_PROGRAM_ADDRESS } from \"./generated\";\n\n// Token-2022 and Associated Token Program addresses\nexport const TOKEN_2022_PROGRAM_ADDRESS = address(\"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\");\nexport const ASSOCIATED_TOKEN_PROGRAM_ADDRESS = address(\"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\");\n\n// ============================================================\n// PDA Derivation Helpers\n// ============================================================\n\n/**\n * Derive the Registry Config PDA\n *\n * Seeds: [\"registry\"]\n */\nexport async function findRegistryConfigPda(): Promise<readonly [Address, number]> {\n const encoder = new TextEncoder();\n return getProgramDerivedAddress({\n programAddress: SATI_PROGRAM_ADDRESS,\n seeds: [encoder.encode(\"registry\")],\n });\n}\n\n/**\n * Derive the Schema Config PDA for a SAS schema\n *\n * Seeds: [\"schema_config\", sas_schema]\n *\n * @param sasSchema - The SAS (Solana Attestation Service) schema address\n */\nexport async function findSchemaConfigPda(sasSchema: Address): Promise<readonly [Address, number]> {\n const encoder = new TextEncoder();\n const addressEncoder = getAddressEncoder();\n return getProgramDerivedAddress({\n programAddress: SATI_PROGRAM_ADDRESS,\n seeds: [encoder.encode(\"schema_config\"), addressEncoder.encode(sasSchema)],\n });\n}\n\n// NOTE: There is intentionally NO findGroupMintPda() function.\n//\n// The group_mint in SATI is NOT a PDA - it's a pre-created Token-2022 mint\n// with GroupPointer extension that gets stored in the registry_config account\n// during initialization.\n//\n// To get the actual group_mint address, you MUST fetch the registry_config:\n//\n// const [registryConfigAddress] = await findRegistryConfigPda();\n// const registryConfig = await fetchRegistryConfig(rpc, registryConfigAddress);\n// const groupMint = registryConfig.data.groupMint;\n\n/**\n * Derive Associated Token Account address for Token-2022\n *\n * @param mint - Token mint address\n * @param owner - Token account owner\n */\nexport async function findAssociatedTokenAddress(mint: Address, owner: Address): Promise<readonly [Address, number]> {\n const addressEncoder = getAddressEncoder();\n return getProgramDerivedAddress({\n programAddress: ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n seeds: [\n addressEncoder.encode(owner),\n addressEncoder.encode(TOKEN_2022_PROGRAM_ADDRESS),\n addressEncoder.encode(mint),\n ],\n });\n}\n\n/**\n * Derive the Agent Index PDA for enumeration\n *\n * Seeds: [\"agent_index\", member_number.to_le_bytes()]\n *\n * Agent Index PDAs allow enumeration of all registered agents.\n * Each agent has a sequential member_number assigned at registration.\n *\n * @param memberNumber - The agent's member number (1-indexed)\n * @returns PDA address and bump\n */\nexport async function findAgentIndexPda(memberNumber: bigint): Promise<readonly [Address, number]> {\n const encoder = new TextEncoder();\n // Convert memberNumber to little-endian u64 bytes\n const memberBytes = new Uint8Array(8);\n const view = new DataView(memberBytes.buffer);\n view.setBigUint64(0, memberNumber, true); // true = little-endian\n\n return getProgramDerivedAddress({\n programAddress: SATI_PROGRAM_ADDRESS,\n seeds: [encoder.encode(\"agent_index\"), memberBytes],\n });\n}\n","/**\n * Ed25519 Precompile Instruction Builder\n *\n * Creates Ed25519 signature verification instructions for Solana's\n * native Ed25519SigVerify precompile program.\n *\n * Uses @solana/kit primitives - no legacy web3.js dependency.\n *\n * @see https://solana.com/docs/core/programs#ed25519-program\n */\n\nimport { address, type Address, type Instruction, type ReadonlyUint8Array } from \"@solana/kit\";\n\n/**\n * Ed25519 instruction with guaranteed data field.\n * The Ed25519 precompile always requires instruction data.\n */\nexport interface Ed25519Instruction extends Instruction {\n readonly data: ReadonlyUint8Array;\n}\n\n// Ed25519 precompile program address\nexport const ED25519_PROGRAM_ADDRESS: Address = address(\"Ed25519SigVerify111111111111111111111111111\");\n\n/**\n * Parameters for creating an Ed25519 verification instruction\n */\nexport interface Ed25519SignatureParams {\n /** 32-byte Ed25519 public key */\n publicKey: Uint8Array;\n /** Message that was signed */\n message: Uint8Array;\n /** 64-byte Ed25519 signature */\n signature: Uint8Array;\n}\n\n/**\n * Ed25519SignatureOffsets struct layout (14 bytes per signature)\n *\n * Layout:\n * - signature_offset: u16\n * - signature_instruction_index: u16\n * - public_key_offset: u16\n * - public_key_instruction_index: u16\n * - message_data_offset: u16\n * - message_data_size: u16\n * - message_instruction_index: u16\n */\nconst OFFSETS_SIZE = 14; // 7 x u16\n\n/**\n * Create an Ed25519 signature verification instruction.\n *\n * This instruction must be included in the transaction before any\n * instruction that requires Ed25519 signature verification via\n * instruction introspection.\n *\n * @param params - Signature verification parameters\n * @returns Instruction for Ed25519SigVerify program\n */\nexport function createEd25519Instruction(params: Ed25519SignatureParams): Ed25519Instruction {\n const { publicKey, message, signature } = params;\n\n if (publicKey.length !== 32) {\n throw new Error(\"Ed25519 public key must be 32 bytes\");\n }\n if (signature.length !== 64) {\n throw new Error(\"Ed25519 signature must be 64 bytes\");\n }\n\n // Instruction data layout:\n // - num_signatures: u8\n // - padding: u8\n // - offsets: Ed25519SignatureOffsets (14 bytes)\n // - public_key: 32 bytes\n // - signature: 64 bytes\n // - message: variable bytes\n\n const numSignatures = 1;\n const headerSize = 2; // num_signatures + padding\n const offsetsStart = headerSize;\n const dataStart = headerSize + OFFSETS_SIZE;\n\n // Data layout after header + offsets\n const publicKeyOffset = dataStart;\n const signatureOffset = publicKeyOffset + 32;\n const messageOffset = signatureOffset + 64;\n\n const totalSize = messageOffset + message.length;\n const data = new Uint8Array(totalSize);\n\n // Header\n data[0] = numSignatures;\n data[1] = 0; // padding\n\n // Write offsets (little-endian u16 values)\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n let offset = offsetsStart;\n\n // signature_offset\n view.setUint16(offset, signatureOffset, true);\n offset += 2;\n // signature_instruction_index (0xFFFF = same instruction)\n view.setUint16(offset, 0xffff, true);\n offset += 2;\n // public_key_offset\n view.setUint16(offset, publicKeyOffset, true);\n offset += 2;\n // public_key_instruction_index (0xFFFF = same instruction)\n view.setUint16(offset, 0xffff, true);\n offset += 2;\n // message_data_offset\n view.setUint16(offset, messageOffset, true);\n offset += 2;\n // message_data_size\n view.setUint16(offset, message.length, true);\n offset += 2;\n // message_instruction_index (0xFFFF = same instruction)\n view.setUint16(offset, 0xffff, true);\n\n // Write actual data\n data.set(publicKey, publicKeyOffset);\n data.set(signature, signatureOffset);\n data.set(message, messageOffset);\n\n return {\n programAddress: ED25519_PROGRAM_ADDRESS,\n accounts: [],\n data,\n };\n}\n\n/**\n * Create a single Ed25519 instruction that verifies multiple signatures.\n *\n * This is more efficient than creating separate instructions as it:\n * - Saves ~100 bytes per additional signature (no duplicate program address)\n * - Reduces transaction size for Light Protocol integration\n *\n * @param signatures - Array of signature verification parameters\n * @returns Single Ed25519 instruction verifying all signatures\n */\nexport function createBatchEd25519Instruction(signatures: Ed25519SignatureParams[]): Ed25519Instruction {\n if (signatures.length === 0) {\n throw new Error(\"At least one signature is required\");\n }\n\n // Validate all inputs\n for (const sig of signatures) {\n if (sig.publicKey.length !== 32) {\n throw new Error(\"Ed25519 public key must be 32 bytes\");\n }\n if (sig.signature.length !== 64) {\n throw new Error(\"Ed25519 signature must be 64 bytes\");\n }\n }\n\n const numSignatures = signatures.length;\n const headerSize = 2; // num_signatures + padding\n\n // Calculate total size for all signatures and their offsets\n // Each signature needs: 14 bytes for offsets, 32 bytes pubkey, 64 bytes sig, variable message\n let totalDataSize = headerSize;\n totalDataSize += numSignatures * OFFSETS_SIZE; // All offsets\n\n // Calculate data offset (after header and all offsets)\n const dataStart = totalDataSize;\n\n // Now add space for actual data (pubkeys, signatures, messages)\n for (const sig of signatures) {\n totalDataSize += 32 + 64 + sig.message.length;\n }\n\n const data = new Uint8Array(totalDataSize);\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n\n // Header\n data[0] = numSignatures;\n data[1] = 0; // padding\n\n // Track current data write position\n let currentDataOffset = dataStart;\n let offsetWritePos = headerSize;\n\n // Write each signature's offsets and data\n for (const sig of signatures) {\n const publicKeyOffset = currentDataOffset;\n const signatureOffset = publicKeyOffset + 32;\n const messageOffset = signatureOffset + 64;\n\n // Write offsets (little-endian u16 values)\n view.setUint16(offsetWritePos, signatureOffset, true);\n offsetWritePos += 2;\n view.setUint16(offsetWritePos, 0xffff, true); // signature_instruction_index\n offsetWritePos += 2;\n view.setUint16(offsetWritePos, publicKeyOffset, true);\n offsetWritePos += 2;\n view.setUint16(offsetWritePos, 0xffff, true); // public_key_instruction_index\n offsetWritePos += 2;\n view.setUint16(offsetWritePos, messageOffset, true);\n offsetWritePos += 2;\n view.setUint16(offsetWritePos, sig.message.length, true);\n offsetWritePos += 2;\n view.setUint16(offsetWritePos, 0xffff, true); // message_instruction_index\n offsetWritePos += 2;\n\n // Write actual data\n data.set(sig.publicKey, publicKeyOffset);\n data.set(sig.signature, signatureOffset);\n data.set(sig.message, messageOffset);\n\n currentDataOffset = messageOffset + sig.message.length;\n }\n\n return {\n programAddress: ED25519_PROGRAM_ADDRESS,\n accounts: [],\n data,\n };\n}\n","/**\n * Off-chain message signing utilities for SATI attestations.\n *\n * Creates human-readable messages for wallet signing that work with\n * Phantom, Backpack, and other Solana wallets.\n *\n * The signature is over the UTF-8 encoded message text, which is then\n * verified on-chain via Ed25519 precompile.\n *\n * ## Signature Model (v2 Universal Layout)\n * - Agent signs: 32-byte interaction_hash (blind commitment)\n * - Counterparty signs: Human-readable SIWS message (~300 bytes)\n *\n * ## Message Format (SIWS-Inspired)\n * Counterparty messages follow Sign-In With Solana (SIWS) patterns:\n * ```\n * SATI {schema_name}\n *\n * Agent: {agent_mint}\n * Task: {task_ref}\n * Outcome: {Negative|Neutral|Positive}\n * Details: {content}\n *\n * Sign to create this attestation.\n * ```\n */\n\nimport type { Address } from \"@solana/kit\";\nimport { type Outcome, OFFSETS, ContentType, getOutcomeLabel } from \"./schemas\";\n\n/**\n * Outcome labels for human-readable message display.\n */\nconst OUTCOME_LABELS: Record<Outcome, string> = {\n 0: \"Negative\",\n 1: \"Neutral\",\n 2: \"Positive\",\n};\n\n/**\n * Solana network type for CAIP-2 chain references.\n */\nexport type SolanaNetwork = \"mainnet\" | \"devnet\" | \"localnet\";\n\n/**\n * CAIP-2 chain references for Solana networks.\n * These are the first 32 characters of each network's genesis block hash (base58).\n *\n * @see https://namespaces.chainagnostic.org/solana/caip2\n */\nexport const SOLANA_CHAIN_REFS: Record<SolanaNetwork, string> = {\n mainnet: \"5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\",\n devnet: \"EtWTRABZaYq6iMfeYKouRu166VU2xqa1\",\n localnet: \"localnet\",\n} as const;\n\n/**\n * Default domain for SATI attestation messages.\n */\nconst SATI_DOMAIN = \"sati.fyi\";\n\n// Base58 alphabet for encoding\nconst BASE58_ALPHABET = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\";\n\n/**\n * Encode bytes to base58 string.\n */\nfunction bytesToBase58(bytes: Uint8Array): string {\n if (bytes.length === 0) return \"\";\n\n // Count leading zeros\n let leadingZeros = 0;\n for (const b of bytes) {\n if (b === 0) leadingZeros++;\n else break;\n }\n\n // Convert to big integer\n let num = BigInt(0);\n for (const b of bytes) {\n num = num * BigInt(256) + BigInt(b);\n }\n\n // Convert to base58\n let result = \"\";\n while (num > 0) {\n const remainder = Number(num % BigInt(58));\n result = BASE58_ALPHABET[remainder] + result;\n num = num / BigInt(58);\n }\n\n // Add leading '1's for each leading zero byte\n return \"1\".repeat(leadingZeros) + result;\n}\n\n/**\n * Format an address as CAIP-10 identifier.\n *\n * @param address - Solana address (base58)\n * @param network - Solana network (defaults to mainnet)\n * @returns CAIP-10 formatted string: `solana:{chain_ref}:{address}`\n *\n * @example\n * ```typescript\n * formatCaip10(\"7S3P4HxJpyy...\", \"mainnet\")\n * // => \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp:7S3P4HxJpyy...\"\n * ```\n */\nexport function formatCaip10(address: Address, network: SolanaNetwork = \"mainnet\"): string {\n return `solana:${SOLANA_CHAIN_REFS[network]}:${address}`;\n}\n\n/**\n * Convert bytes to hex string.\n */\nfunction bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\n/**\n * Result of building a signing message.\n */\nexport interface SigningMessage {\n /** The UTF-8 encoded message bytes to be signed */\n messageBytes: Uint8Array;\n /** The human-readable message text */\n text: string;\n}\n\n/**\n * @deprecated Use SigningMessage instead\n */\nexport type FeedbackSigningMessage = SigningMessage;\n\n// ============================================================================\n// Counterparty Message Builder (v2 Universal Layout)\n// ============================================================================\n\n/**\n * Parameters for building a counterparty signing message.\n */\nexport interface CounterpartyMessageParams {\n /** Schema name (e.g., \"Feedback\", \"Validation\") */\n schemaName: string;\n /** The universal layout data bytes (130+ bytes) */\n data: Uint8Array;\n}\n\n/**\n * Build a human-readable SIWS message for counterparty signing.\n *\n * Creates a UTF-8 encoded message (~300 bytes) that Phantom and other wallets\n * will display and allow signing. The signature can be verified on-chain\n * via Ed25519 precompile against the same message bytes.\n *\n * ## Message Format\n * ```\n * SATI {schema_name}\n *\n * Agent: {token_account}\n * Task: {task_ref}\n * Outcome: {Negative|Neutral|Positive}\n * Details: {content}\n *\n * Sign to create this attestation.\n * ```\n *\n * @param params - Parameters containing schema name and data bytes\n * @returns SigningMessage with messageBytes and human-readable text\n *\n * @example\n * ```typescript\n * import { buildCounterpartyMessage, serializeFeedback } from \"@cascade-fyi/sati-sdk\";\n *\n * // Build attestation data\n * const data = serializeFeedback({\n * taskRef: new Uint8Array(32),\n * agentMint: agentMintAddress,\n * counterparty: clientAddress,\n * outcome: Outcome.Positive,\n * dataHash: dataHash,\n * contentType: ContentType.JSON,\n * content: new TextEncoder().encode('{\"score\": 95, \"tags\": [\"fast\"]}'),\n * });\n *\n * // Build counterparty message\n * const { messageBytes, text } = buildCounterpartyMessage({\n * schemaName: \"Feedback\",\n * data,\n * });\n *\n * // Sign with wallet (Phantom will display the human-readable text)\n * const signature = await wallet.signMessage(messageBytes);\n *\n * // Pass messageBytes to the createAttestation instruction as counterparty_message\n * ```\n */\nexport function buildCounterpartyMessage(params: CounterpartyMessageParams): SigningMessage {\n const { schemaName, data } = params;\n\n if (data.length < OFFSETS.CONTENT) {\n throw new Error(`Data too small (minimum ${OFFSETS.CONTENT} bytes, got ${data.length})`);\n }\n\n // Extract fields from universal layout\n const taskRef = data.slice(OFFSETS.TASK_REF, OFFSETS.AGENT_MINT);\n const agentMint = data.slice(OFFSETS.AGENT_MINT, OFFSETS.COUNTERPARTY);\n const outcome = data[OFFSETS.OUTCOME] as Outcome;\n const contentType = data[OFFSETS.CONTENT_TYPE] as ContentType;\n const content = data.slice(OFFSETS.CONTENT);\n\n // Validate outcome\n if (outcome > 2) {\n throw new Error(`Invalid outcome value: ${outcome} (must be 0, 1, or 2)`);\n }\n\n // Format addresses as base58\n const agentMintB58 = bytesToBase58(agentMint);\n const taskRefB58 = bytesToBase58(taskRef);\n\n // Decode content for display\n const outcomeLabel = getOutcomeLabel(outcome);\n const detailsText = decodeContentForDisplay(content, contentType);\n\n // Build SIWS-style message\n const text = `SATI ${schemaName}\n\nAgent: ${agentMintB58}\nTask: ${taskRefB58}\nOutcome: ${outcomeLabel}\nDetails: ${detailsText}\n\nSign to create this attestation.`;\n\n return {\n messageBytes: new TextEncoder().encode(text),\n text,\n };\n}\n\n/**\n * Decode content bytes for human-readable display.\n */\nfunction decodeContentForDisplay(content: Uint8Array, contentType: ContentType): string {\n if (content.length === 0) {\n return \"(none)\";\n }\n\n switch (contentType) {\n case ContentType.None:\n return \"(none)\";\n case ContentType.JSON:\n case ContentType.UTF8:\n try {\n return new TextDecoder().decode(content);\n } catch {\n return `(${content.length} bytes)`;\n }\n case ContentType.IPFS:\n return `ipfs://${bytesToBase58(content)}`;\n case ContentType.Arweave:\n return `ar://${bytesToBase58(content)}`;\n case ContentType.Encrypted:\n return \"(encrypted)\";\n default:\n return `(${content.length} bytes)`;\n }\n}\n\n// ============================================================================\n// Legacy Message Builders (deprecated, but kept for backward compatibility)\n// ============================================================================\n\n/**\n * Parameters for building a feedback signing message (SIWS-style).\n * @deprecated Use buildCounterpartyMessage instead\n */\nexport interface FeedbackSigningParams {\n /** The 32-byte feedback hash computed by computeFeedbackHash */\n feedbackHash: Uint8Array;\n /** The feedback outcome (Negative=0, Neutral=1, Positive=2) */\n outcome: Outcome;\n /** The signer's wallet address (NFT owner) */\n ownerAddress: Address;\n /** The agent's mint address (for CAIP-10 identifier) */\n agentMint: Address;\n /** Solana network for CAIP-2 chain reference (defaults to mainnet) */\n network?: SolanaNetwork;\n}\n\n/**\n * Build a human-readable message for feedback attestation signing.\n *\n * @deprecated Use buildCounterpartyMessage instead. This function uses the legacy\n * hash-based signing format which has been replaced by SIWS messages in v2.\n *\n * Creates a UTF-8 encoded message that Phantom and other wallets will\n * display and allow signing. The signature can be verified on-chain\n * via Ed25519 precompile against the same message bytes.\n *\n * ## SIWS-Style Format (recommended)\n * Pass a FeedbackSigningParams object to get the full SIWS-style message\n * with CAIP-10 agent identifier:\n *\n * ```\n * sati.fyi wants you to attest with your Solana account:\n * {owner_address}\n *\n * Attestation: Feedback\n * Agent: solana:{chain_ref}:{agent_mint}\n * Outcome: Positive\n * Hash: 0x{hash}\n * ```\n *\n * ## Legacy Format (deprecated)\n * Pass (feedbackHash, outcome) directly for the compact format:\n *\n * ```\n * SATI:feedback:v1\n * Outcome: Positive\n * 0x{hash}\n * ```\n *\n * @example\n * ```typescript\n * import { buildFeedbackSigningMessage, computeFeedbackHash } from \"@cascade-fyi/sati-sdk\";\n *\n * // Compute the feedback hash\n * const feedbackHash = computeFeedbackHash(sasSchema, taskRef, agentMint, outcome);\n *\n * // SIWS-style (recommended)\n * const { messageBytes } = buildFeedbackSigningMessage({\n * feedbackHash,\n * outcome,\n * ownerAddress: wallet.publicKey,\n * agentMint,\n * network: \"mainnet\",\n * });\n *\n * // Sign with wallet (Phantom will display the human-readable text)\n * const signature = await wallet.signMessage(messageBytes);\n * ```\n */\nexport function buildFeedbackSigningMessage(params: FeedbackSigningParams): SigningMessage;\n/**\n * @deprecated Use the params object signature instead for SIWS-style messages\n */\nexport function buildFeedbackSigningMessage(feedbackHash: Uint8Array, outcome: Outcome): SigningMessage;\nexport function buildFeedbackSigningMessage(\n paramsOrHash: FeedbackSigningParams | Uint8Array,\n outcomeArg?: Outcome,\n): SigningMessage {\n // Handle legacy signature: (feedbackHash, outcome)\n if (paramsOrHash instanceof Uint8Array) {\n const feedbackHash = paramsOrHash;\n const outcome = outcomeArg as Outcome;\n\n if (feedbackHash.length !== 32) {\n throw new Error(\"feedbackHash must be 32 bytes\");\n }\n if (outcome < 0 || outcome > 2) {\n throw new Error(\"outcome must be 0, 1, or 2\");\n }\n\n const hexHash = bytesToHex(feedbackHash);\n const outcomeLabel = OUTCOME_LABELS[outcome];\n\n // Legacy compact format\n const text = `SATI:feedback:v1\nOutcome: ${outcomeLabel}\n0x${hexHash}`;\n\n return {\n messageBytes: new TextEncoder().encode(text),\n text,\n };\n }\n\n // SIWS-style params signature\n const { feedbackHash, outcome, ownerAddress, agentMint, network = \"mainnet\" } = paramsOrHash;\n\n if (feedbackHash.length !== 32) {\n throw new Error(\"feedbackHash must be 32 bytes\");\n }\n if (outcome < 0 || outcome > 2) {\n throw new Error(\"outcome must be 0, 1, or 2\");\n }\n\n const hexHash = bytesToHex(feedbackHash);\n const outcomeLabel = OUTCOME_LABELS[outcome];\n const agentCaip10 = formatCaip10(agentMint, network);\n\n // SIWS-inspired human-readable message\n const text = `${SATI_DOMAIN} wants you to attest with your Solana account:\n${ownerAddress}\n\nAttestation: Feedback\nAgent: ${agentCaip10}\nOutcome: ${outcomeLabel}\nHash: 0x${hexHash}`;\n\n return {\n messageBytes: new TextEncoder().encode(text),\n text,\n };\n}\n","/**\n * SATI Content Encryption Module\n *\n * End-to-end encrypted content using X25519-XChaCha20-Poly1305.\n *\n * ## Overview\n * - X25519 key exchange with ephemeral keypair (forward secrecy)\n * - XChaCha20-Poly1305 authenticated encryption (24-byte nonce)\n * - HKDF-SHA256 for key derivation\n * - Ed25519 → X25519 key conversion for Solana wallet compatibility\n *\n * ## Wire Format\n * | Offset | Size | Field |\n * |--------|------|-------|\n * | 0 | 1 | Version (0x01) |\n * | 1 | 32 | Ephemeral X25519 public key |\n * | 33 | 24 | XChaCha20 nonce |\n * | 57 | variable | Ciphertext + Poly1305 tag (16 bytes) |\n *\n * @packageDocumentation\n */\n\nimport { xchacha20poly1305 } from \"@noble/ciphers/chacha.js\";\nimport { randomBytes } from \"@noble/ciphers/utils.js\";\nimport { x25519, ed25519 } from \"@noble/curves/ed25519.js\";\nimport { hkdf } from \"@noble/hashes/hkdf.js\";\nimport { sha256 } from \"@noble/hashes/sha2.js\";\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Current encryption protocol version */\nexport const ENCRYPTION_VERSION = 1;\n\n/** XChaCha20 nonce size in bytes */\nexport const NONCE_SIZE = 24;\n\n/** X25519 public key size in bytes */\nexport const PUBKEY_SIZE = 32;\n\n/** Poly1305 authentication tag size in bytes */\nexport const TAG_SIZE = 16;\n\n/** X25519 private key size in bytes */\nexport const PRIVKEY_SIZE = 32;\n\n/**\n * Minimum encrypted payload size in bytes.\n * version (1) + ephemeral pubkey (32) + nonce (24) + tag (16) = 73 bytes\n */\nexport const MIN_ENCRYPTED_SIZE = 1 + PUBKEY_SIZE + NONCE_SIZE + TAG_SIZE;\n\n/** Maximum content size (from schemas.ts) */\nconst MAX_CONTENT_SIZE = 512;\n\n/** Maximum plaintext size after accounting for encryption overhead */\nexport const MAX_PLAINTEXT_SIZE = MAX_CONTENT_SIZE - MIN_ENCRYPTED_SIZE;\n\n/** HKDF info string for domain separation */\nconst HKDF_INFO = new TextEncoder().encode(\"sati-v1\");\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Encrypted payload structure.\n *\n * Contains all components needed for decryption:\n * - version: Protocol version for future upgrades\n * - ephemeralPubkey: Sender's X25519 public key for ECDH\n * - nonce: XChaCha20 nonce (24 bytes)\n * - ciphertext: Encrypted data + 16-byte Poly1305 tag\n */\nexport interface EncryptedPayload {\n /** Protocol version (currently 1) */\n version: number;\n /** Ephemeral X25519 public key (32 bytes) */\n ephemeralPubkey: Uint8Array;\n /** XChaCha20 nonce (24 bytes) */\n nonce: Uint8Array;\n /** Ciphertext including 16-byte Poly1305 authentication tag */\n ciphertext: Uint8Array;\n}\n\n/**\n * X25519 keypair for encryption operations.\n */\nexport interface EncryptionKeypair {\n /** X25519 public key (32 bytes) */\n publicKey: Uint8Array;\n /** X25519 private key (32 bytes) */\n privateKey: Uint8Array;\n}\n\n// ============================================================================\n// Key Derivation\n// ============================================================================\n\n/**\n * Derive an X25519 encryption keypair from an Ed25519 private key.\n *\n * This allows using existing Solana wallet keys for encryption.\n * The conversion is deterministic - same Ed25519 key always produces\n * the same X25519 keypair.\n *\n * @param ed25519PrivateKey - Ed25519 private key (32 or 64 bytes)\n * @returns X25519 keypair for encryption operations\n *\n * @example\n * ```typescript\n * // From Solana wallet secret key (64 bytes = 32 private + 32 public)\n * const { publicKey, privateKey } = deriveEncryptionKeypair(wallet.secretKey.slice(0, 32));\n *\n * // Use publicKey to receive encrypted content\n * // Use privateKey to decrypt received content\n * ```\n */\nexport function deriveEncryptionKeypair(ed25519PrivateKey: Uint8Array): EncryptionKeypair {\n // Handle both 32-byte seed and 64-byte full key\n const seed = ed25519PrivateKey.length === 64 ? ed25519PrivateKey.slice(0, 32) : ed25519PrivateKey;\n\n if (seed.length !== 32) {\n throw new Error(\"Ed25519 private key must be 32 or 64 bytes\");\n }\n\n // Get Ed25519 public key from seed\n const ed25519Public = ed25519.getPublicKey(seed);\n\n // Convert Ed25519 public key to X25519 (using v2 API)\n const x25519Public = ed25519.utils.toMontgomery(ed25519Public);\n\n // Convert Ed25519 private key to X25519 (using v2 API)\n const x25519Private = ed25519.utils.toMontgomerySecret(seed);\n\n return {\n publicKey: x25519Public,\n privateKey: x25519Private,\n };\n}\n\n/**\n * Derive X25519 public key from Ed25519 public key.\n *\n * Use this when you only have the recipient's Ed25519 public key\n * (e.g., from their Solana address).\n *\n * @param ed25519PublicKey - Ed25519 public key (32 bytes)\n * @returns X25519 public key for encryption\n *\n * @example\n * ```typescript\n * // Encrypt content for a Solana address\n * const x25519Pubkey = deriveEncryptionPublicKey(recipientEd25519Pubkey);\n * const encrypted = encryptContent(plaintext, x25519Pubkey);\n * ```\n */\nexport function deriveEncryptionPublicKey(ed25519PublicKey: Uint8Array): Uint8Array {\n if (ed25519PublicKey.length !== 32) {\n throw new Error(\"Ed25519 public key must be 32 bytes\");\n }\n // Convert Ed25519 public key to X25519 (using v2 API)\n return ed25519.utils.toMontgomery(ed25519PublicKey);\n}\n\n// ============================================================================\n// Encryption / Decryption\n// ============================================================================\n\n/**\n * Encrypt content for a recipient.\n *\n * Uses ephemeral X25519 keypair for forward secrecy - each encryption\n * generates a new keypair, so compromising a single ciphertext doesn't\n * reveal past or future messages.\n *\n * @param plaintext - Content to encrypt (max 439 bytes)\n * @param recipientPubkey - Recipient's X25519 public key (32 bytes)\n * @returns Encrypted payload with all components needed for decryption\n * @throws If plaintext exceeds maximum size or recipient key is invalid\n *\n * @example\n * ```typescript\n * const plaintext = new TextEncoder().encode(\"Great service!\");\n * const encrypted = encryptContent(plaintext, recipientX25519Pubkey);\n * const bytes = serializeEncryptedPayload(encrypted);\n * ```\n */\nexport function encryptContent(plaintext: Uint8Array, recipientPubkey: Uint8Array): EncryptedPayload {\n if (plaintext.length > MAX_PLAINTEXT_SIZE) {\n throw new Error(`Plaintext too large: ${plaintext.length} bytes (max ${MAX_PLAINTEXT_SIZE})`);\n }\n\n if (recipientPubkey.length !== PUBKEY_SIZE) {\n throw new Error(`Recipient public key must be ${PUBKEY_SIZE} bytes`);\n }\n\n // Generate ephemeral X25519 keypair\n const ephemeralPrivate = randomBytes(PRIVKEY_SIZE);\n const ephemeralPublic = x25519.getPublicKey(ephemeralPrivate);\n\n // Perform X25519 key exchange\n const sharedSecret = x25519.getSharedSecret(ephemeralPrivate, recipientPubkey);\n\n // Derive encryption key using HKDF with ephemeral public key as salt\n const encryptionKey = hkdf(sha256, sharedSecret, ephemeralPublic, HKDF_INFO, 32);\n\n // Generate random nonce\n const nonce = randomBytes(NONCE_SIZE);\n\n // Encrypt with XChaCha20-Poly1305\n const cipher = xchacha20poly1305(encryptionKey, nonce);\n const ciphertext = cipher.encrypt(plaintext);\n\n // Zero out sensitive material\n ephemeralPrivate.fill(0);\n sharedSecret.fill(0);\n encryptionKey.fill(0);\n\n return {\n version: ENCRYPTION_VERSION,\n ephemeralPubkey: ephemeralPublic,\n nonce,\n ciphertext,\n };\n}\n\n/**\n * Decrypt content using recipient's private key.\n *\n * @param payload - Encrypted payload from encryptContent\n * @param privateKey - Recipient's X25519 private key (32 bytes)\n * @returns Decrypted plaintext\n * @throws If decryption fails (wrong key, corrupted data, or tampered ciphertext)\n *\n * @example\n * ```typescript\n * const payload = deserializeEncryptedPayload(encryptedBytes);\n * const plaintext = decryptContent(payload, myX25519PrivateKey);\n * const text = new TextDecoder().decode(plaintext);\n * ```\n */\nexport function decryptContent(payload: EncryptedPayload, privateKey: Uint8Array): Uint8Array {\n if (payload.version !== ENCRYPTION_VERSION) {\n throw new Error(`Unsupported encryption version: ${payload.version}`);\n }\n\n if (privateKey.length !== PRIVKEY_SIZE) {\n throw new Error(`Private key must be ${PRIVKEY_SIZE} bytes`);\n }\n\n if (payload.ephemeralPubkey.length !== PUBKEY_SIZE) {\n throw new Error(`Ephemeral public key must be ${PUBKEY_SIZE} bytes`);\n }\n\n if (payload.nonce.length !== NONCE_SIZE) {\n throw new Error(`Nonce must be ${NONCE_SIZE} bytes`);\n }\n\n // Perform X25519 key exchange\n const sharedSecret = x25519.getSharedSecret(privateKey, payload.ephemeralPubkey);\n\n // Derive encryption key using HKDF with ephemeral public key as salt\n const encryptionKey = hkdf(sha256, sharedSecret, payload.ephemeralPubkey, HKDF_INFO, 32);\n\n // Decrypt with XChaCha20-Poly1305\n const cipher = xchacha20poly1305(encryptionKey, payload.nonce);\n const plaintext = cipher.decrypt(payload.ciphertext);\n\n // Zero out sensitive material\n sharedSecret.fill(0);\n encryptionKey.fill(0);\n\n return plaintext;\n}\n\n// ============================================================================\n// Serialization\n// ============================================================================\n\n/**\n * Serialize encrypted payload to bytes for on-chain storage.\n *\n * Wire format:\n * - byte 0: version\n * - bytes 1-32: ephemeral public key\n * - bytes 33-56: nonce\n * - bytes 57+: ciphertext (includes 16-byte auth tag)\n *\n * @param payload - Encrypted payload to serialize\n * @returns Serialized bytes suitable for storage in content field\n *\n * @example\n * ```typescript\n * const encrypted = encryptContent(plaintext, recipientPubkey);\n * const bytes = serializeEncryptedPayload(encrypted);\n *\n * const feedback: FeedbackData = {\n * contentType: ContentType.Encrypted,\n * content: bytes,\n * // ... other fields\n * };\n * ```\n */\nexport function serializeEncryptedPayload(payload: EncryptedPayload): Uint8Array {\n const totalSize = 1 + PUBKEY_SIZE + NONCE_SIZE + payload.ciphertext.length;\n const buffer = new Uint8Array(totalSize);\n\n let offset = 0;\n\n // Version (1 byte)\n buffer[offset++] = payload.version;\n\n // Ephemeral public key (32 bytes)\n buffer.set(payload.ephemeralPubkey, offset);\n offset += PUBKEY_SIZE;\n\n // Nonce (24 bytes)\n buffer.set(payload.nonce, offset);\n offset += NONCE_SIZE;\n\n // Ciphertext (variable length, includes auth tag)\n buffer.set(payload.ciphertext, offset);\n\n return buffer;\n}\n\n/**\n * Deserialize encrypted payload from bytes.\n *\n * @param bytes - Serialized encrypted payload\n * @returns Deserialized EncryptedPayload\n * @throws If bytes are too small or malformed\n *\n * @example\n * ```typescript\n * if (feedback.contentType === ContentType.Encrypted) {\n * const payload = deserializeEncryptedPayload(feedback.content);\n * const plaintext = decryptContent(payload, myPrivateKey);\n * }\n * ```\n */\nexport function deserializeEncryptedPayload(bytes: Uint8Array): EncryptedPayload {\n if (bytes.length < MIN_ENCRYPTED_SIZE) {\n throw new Error(`Encrypted payload too small: ${bytes.length} bytes (minimum ${MIN_ENCRYPTED_SIZE})`);\n }\n\n let offset = 0;\n\n // Version (1 byte)\n const version = bytes[offset++];\n\n if (version !== ENCRYPTION_VERSION) {\n throw new Error(`Unsupported encryption version: ${version} (supported: ${ENCRYPTION_VERSION})`);\n }\n\n // Ephemeral public key (32 bytes)\n const ephemeralPubkey = bytes.slice(offset, offset + PUBKEY_SIZE);\n offset += PUBKEY_SIZE;\n\n // Nonce (24 bytes)\n const nonce = bytes.slice(offset, offset + NONCE_SIZE);\n offset += NONCE_SIZE;\n\n // Ciphertext (remaining bytes, includes auth tag)\n const ciphertext = bytes.slice(offset);\n\n if (ciphertext.length < TAG_SIZE) {\n throw new Error(`Ciphertext too small: must include ${TAG_SIZE}-byte auth tag`);\n }\n\n return {\n version,\n ephemeralPubkey,\n nonce,\n ciphertext,\n };\n}\n","/**\n * Metadata upload abstractions for decentralized storage.\n *\n * Provides a pluggable `MetadataUploader` interface so consumers can\n * bring their own storage provider (Pinata, Arweave, local IPFS node, etc.).\n * A built-in Pinata implementation is included for convenience.\n *\n * @example\n * ```typescript\n * import { createPinataUploader, buildRegistrationFile } from \"@cascade-fyi/sati-sdk\";\n *\n * const uploader = createPinataUploader(process.env.PINATA_JWT!);\n * const regFile = buildRegistrationFile({ name: \"MyAgent\", description: \"...\", image: \"https://...\" });\n * const uri = await uploader.upload(regFile);\n * ```\n */\n\n/**\n * Provider-agnostic interface for uploading metadata JSON to decentralized storage.\n *\n * Implement this interface to use a custom storage provider with SATI.\n */\nexport interface MetadataUploader {\n /** Upload JSON-serializable data and return a URI (e.g. `ipfs://Qm...`, `ar://...`). */\n upload(data: unknown): Promise<string>;\n}\n\nconst SATI_UPLOAD_URL = \"https://sati.cascade.fyi/api/upload-metadata\";\n\n/**\n * Create a hosted SATI metadata uploader.\n *\n * Uploads JSON to the SATI Identity Service which pins it to IPFS via Pinata.\n * No API keys needed - zero-config alternative to `createPinataUploader()`.\n *\n * @returns MetadataUploader that uploads via sati.cascade.fyi\n *\n * @example\n * ```typescript\n * const uploader = createSatiUploader();\n * const uri = await uploader.upload({ name: \"MyAgent\" });\n * // \"ipfs://QmXyz...\"\n * ```\n */\nexport function createSatiUploader(): MetadataUploader {\n return {\n async upload(data: unknown): Promise<string> {\n const response = await fetch(SATI_UPLOAD_URL, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Metadata upload failed (${response.status}): ${text}`);\n }\n\n const result = (await response.json()) as { uri: string };\n return result.uri;\n },\n };\n}\n\ninterface PinataV3Response {\n data: {\n id: string;\n name: string;\n cid: string;\n created_at: string;\n size: number;\n number_of_files: number;\n mime_type: string;\n user_id: string;\n group_id: string | null;\n is_duplicate: boolean;\n };\n}\n\n/**\n * Create a Pinata IPFS uploader using the v3 Files API.\n *\n * @param jwt - Pinata API JWT token (requires `files:write` permission)\n * @returns MetadataUploader that pins JSON to public IPFS via Pinata\n *\n * @example\n * ```typescript\n * const uploader = createPinataUploader(process.env.PINATA_JWT!);\n * const uri = await uploader.upload({ name: \"MyAgent\" });\n * // \"ipfs://QmXyz...\"\n * ```\n */\nexport function createPinataUploader(jwt: string): MetadataUploader {\n return {\n async upload(data: unknown): Promise<string> {\n const jsonStr = JSON.stringify(data, null, 2);\n const blob = new Blob([jsonStr], { type: \"application/json\" });\n\n const formData = new FormData();\n formData.append(\"file\", blob, \"registration.json\");\n formData.append(\"network\", \"public\");\n\n const response = await fetch(\"https://uploads.pinata.cloud/v3/files\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${jwt}`,\n },\n body: formData,\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`IPFS upload failed (${response.status}): ${text}`);\n }\n\n const result = (await response.json()) as PinataV3Response;\n const cid = result.data?.cid;\n\n if (!cid) {\n throw new Error(`No CID returned from Pinata. Response: ${JSON.stringify(result)}`);\n }\n\n // Verify content is accessible on gateway (catches silent upload failures)\n try {\n const verifyResponse = await fetch(`https://gateway.pinata.cloud/ipfs/${cid}`, {\n signal: AbortSignal.timeout(5000),\n });\n if (!verifyResponse.ok && verifyResponse.status !== 429) {\n throw new Error(\n `Pinata returned CID ${cid} but content not accessible on gateway (HTTP ${verifyResponse.status})`,\n );\n }\n } catch (verifyError) {\n // Timeouts and rate limits are non-fatal - content may propagate with delay\n // Re-throw only genuine accessibility failures\n if (verifyError instanceof Error && verifyError.message.includes(\"not accessible\")) {\n throw verifyError;\n }\n }\n\n return `ipfs://${cid}`;\n },\n };\n}\n","{\n \"network\": \"devnet\",\n \"authority\": \"SQ2xxkJ6uEDHprYMNXPxS2AwyEtGGToZ7YC94icKH3Z\",\n \"deployedAt\": \"2026-02-10T13:55:02.691Z\",\n \"config\": {\n \"credential\": \"DQHW6fAhPfGAENuwJVYfzEvUN12DakZgaaGtPPRfGei1\",\n \"schemas\": {\n \"feedback\": \"CPSr2kXADrhfAykcLwr7mxaLtuG4EBkzei9xQCaEmRJS\",\n \"feedbackPublic\": \"7SvB6udRrxTsKLYyoMwCvrm2jiNLUCcWBnhzwDVCebss\",\n \"validation\": \"Ho7nAWqwrxi3AzasoVST2FTKfAbVopk9S6G5cb3Z3DMi\",\n \"reputationScore\": \"7MoXgvrFhMxmB84AfAtp8LGfC4sEXUHD6JCQJpfj2jTj\",\n \"delegate\": \"93wrAiBtCWgfVzToT6kU4zkPSvZpWbKDG3XUQEEHXBrk\"\n },\n \"lookupTable\": \"HGTEPmkGs2sWAzMw1CjBFKD2nVWBCAdHJeM8osoTibVQ\"\n }\n}\n","{\n \"network\": \"mainnet\",\n \"authority\": \"SQ2xxkJ6uEDHprYMNXPxS2AwyEtGGToZ7YC94icKH3Z\",\n \"deployedAt\": \"2026-02-10T14:20:59.279Z\",\n \"config\": {\n \"credential\": \"DQHW6fAhPfGAENuwJVYfzEvUN12DakZgaaGtPPRfGei1\",\n \"schemas\": {\n \"feedback\": \"CPSr2kXADrhfAykcLwr7mxaLtuG4EBkzei9xQCaEmRJS\",\n \"feedbackPublic\": \"7SvB6udRrxTsKLYyoMwCvrm2jiNLUCcWBnhzwDVCebss\",\n \"validation\": \"Ho7nAWqwrxi3AzasoVST2FTKfAbVopk9S6G5cb3Z3DMi\",\n \"reputationScore\": \"7MoXgvrFhMxmB84AfAtp8LGfC4sEXUHD6JCQJpfj2jTj\",\n \"delegate\": \"93wrAiBtCWgfVzToT6kU4zkPSvZpWbKDG3XUQEEHXBrk\"\n },\n \"lookupTable\": \"4XgHCijEGjWBch2wvs35XGBNLBdioQbVxLJhbr9AifAn\"\n }\n}\n","/**\n * Deployed SAS Configuration Loader\n *\n * Loads pre-deployed credential and schema addresses for each network.\n * This makes the SDK the source of truth - users just specify network\n * and schemas are automatically available.\n */\n\nimport type { SATISASConfig } from \"../types\";\n\n// Static imports for bundler compatibility (no require())\nimport devnetJson from \"./devnet.json\";\nimport mainnetJson from \"./mainnet.json\";\n\n// Extract config (handles placeholder files with null config)\ntype DeployedJson = {\n network: string;\n authority: string | null;\n deployedAt: string | null;\n config: SATISASConfig | null;\n};\n\nconst devnetConfig: SATISASConfig | null = (devnetJson as DeployedJson).config;\nconst mainnetConfig: SATISASConfig | null = (mainnetJson as DeployedJson).config;\n\nconst configs: Record<string, SATISASConfig | null> = {\n devnet: devnetConfig,\n mainnet: mainnetConfig,\n localnet: null, // Users must deploy locally\n};\n\n/**\n * Load deployed SAS configuration for a network\n *\n * @param network - Network identifier (\"devnet\", \"mainnet\", \"localnet\")\n * @returns SAS config if deployed, null otherwise\n */\nexport function loadDeployedConfig(network: string): SATISASConfig | null {\n return configs[network] ?? null;\n}\n\n/**\n * Check if a network has deployed SAS configuration\n *\n * @param network - Network identifier\n * @returns true if config exists for network\n */\nexport function hasDeployedConfig(network: string): boolean {\n return configs[network] !== null;\n}\n\n/**\n * Get list of networks with deployed configurations\n *\n * @returns Array of network names with deployed configs\n */\nexport function getDeployedNetworks(): string[] {\n return Object.entries(configs)\n .filter(([_, config]) => config !== null)\n .map(([network]) => network);\n}\n","/**\n * SATI Registration File\n *\n * Helpers for building, fetching, and working with ERC-8004 + Phantom\n * compatible registration files.\n *\n * @example\n * ```typescript\n * import {\n * buildRegistrationFile,\n * fetchRegistrationFile,\n * getImageUrl,\n * } from \"@cascade-fyi/sati-sdk\";\n *\n * // Build a registration file\n * const file = buildRegistrationFile({\n * name: \"MyAgent\",\n * description: \"AI assistant\",\n * image: \"https://example.com/avatar.png\",\n * });\n *\n * // Fetch from URI\n * const metadata = await fetchRegistrationFile(uri);\n * const imageUrl = getImageUrl(metadata);\n * ```\n */\n\nimport * as z from \"zod\";\n\n// ============================================================================\n// INTERNAL: Zod Schemas (not exported)\n// ============================================================================\n\nconst PropertyFileSchema = z.object({\n uri: z.url(),\n type: z.string(),\n});\n\nconst PropertiesSchema = z.object({\n files: z.array(PropertyFileSchema).min(1),\n category: z.enum([\"image\", \"video\", \"audio\"]).optional(),\n});\n\nconst EndpointSchema = z.object({\n name: z.string(),\n endpoint: z.string(),\n version: z.string().optional(),\n mcpTools: z.array(z.string()).optional(),\n mcpPrompts: z.array(z.string()).optional(),\n mcpResources: z.array(z.string()).optional(),\n a2aSkills: z.array(z.string()).optional(),\n skills: z.array(z.string()).optional(),\n domains: z.array(z.string()).optional(),\n});\n\nconst RegistrationEntrySchema = z.object({\n agentId: z.union([z.string(), z.number()]),\n agentRegistry: z.string(),\n});\n\nconst TrustMechanismSchema = z.enum([\"reputation\", \"crypto-economic\", \"tee-attestation\"]);\n\nconst RegistrationFileSchema = z.object({\n type: z.literal(\"https://eips.ethereum.org/EIPS/eip-8004#registration-v1\"),\n name: z.string().min(1),\n description: z.string().min(1),\n image: z.url(),\n properties: PropertiesSchema,\n external_url: z.url().optional(),\n endpoints: z.array(EndpointSchema).optional(),\n registrations: z.array(RegistrationEntrySchema).optional(),\n supportedTrust: z.array(TrustMechanismSchema).optional(),\n active: z.boolean().optional().default(true),\n x402support: z.boolean().optional(),\n});\n\n// ============================================================================\n// PUBLIC: TypeScript Types\n// ============================================================================\n\n/** File entry for Phantom/Metaplex wallet display */\nexport interface PropertyFile {\n uri: string;\n type: string;\n}\n\n/** Properties object for wallet compatibility */\nexport interface Properties {\n files: PropertyFile[];\n category?: \"image\" | \"video\" | \"audio\";\n}\n\n/** Service endpoint (ERC-8004) */\nexport interface Endpoint {\n name: string;\n endpoint: string;\n version?: string;\n mcpTools?: string[];\n mcpPrompts?: string[];\n mcpResources?: string[];\n a2aSkills?: string[];\n skills?: string[];\n domains?: string[];\n}\n\n/** Cross-chain registration entry (ERC-8004) */\nexport interface RegistrationEntry {\n agentId: string | number;\n agentRegistry: string;\n}\n\n/** Trust mechanism type */\nexport type TrustMechanism = \"reputation\" | \"crypto-economic\" | \"tee-attestation\";\n\n/**\n * Registration file schema (ERC-8004 + Phantom compatible)\n *\n * This is the off-chain JSON document referenced by the on-chain `uri` field.\n */\nexport interface RegistrationFile {\n /** Schema type identifier */\n type: \"https://eips.ethereum.org/EIPS/eip-8004#registration-v1\";\n /** Agent name */\n name: string;\n /** Agent description */\n description: string;\n /** Primary image URL */\n image: string;\n /** Properties for wallet display (required for Phantom) */\n properties: Properties;\n /** Project website URL */\n external_url?: string;\n /** Service endpoints (A2A, MCP, agentWallet) */\n endpoints?: Endpoint[];\n /** Cross-chain registration entries */\n registrations?: RegistrationEntry[];\n /** Supported trust mechanisms */\n supportedTrust?: TrustMechanism[];\n /** Agent operational status */\n active?: boolean;\n /** Accepts x402 payments */\n x402support?: boolean;\n}\n\n/** Input parameters for buildRegistrationFile */\nexport interface RegistrationFileParams {\n name: string;\n description: string;\n image: string;\n imageMimeType?: string;\n externalUrl?: string;\n endpoints?: Endpoint[];\n registrations?: RegistrationEntry[];\n supportedTrust?: TrustMechanism[];\n active?: boolean;\n x402support?: boolean;\n}\n\n// ============================================================================\n// PUBLIC: Helper Functions\n// ============================================================================\n\nconst MIME_TYPES: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n svg: \"image/svg+xml\",\n};\n\n/**\n * Infer MIME type from image URL extension.\n * Returns \"image/png\" as default if unrecognized.\n */\nexport function inferMimeType(url: string): string {\n const ext = url.split(\".\").pop()?.toLowerCase().split(\"?\")[0];\n return MIME_TYPES[ext ?? \"\"] ?? \"image/png\";\n}\n\n/**\n * Build a registration file from parameters.\n *\n * Automatically:\n * - Sets the ERC-8004 type identifier\n * - Generates properties.files from image URL\n * - Infers MIME type from extension\n * - Sets active to true by default\n *\n * @throws Error if required fields are missing or invalid\n */\nexport function buildRegistrationFile(params: RegistrationFileParams): RegistrationFile {\n const mimeType = params.imageMimeType ?? inferMimeType(params.image);\n\n const file = {\n type: \"https://eips.ethereum.org/EIPS/eip-8004#registration-v1\" as const,\n name: params.name,\n description: params.description,\n image: params.image,\n properties: {\n files: [{ uri: params.image, type: mimeType }],\n category: \"image\" as const,\n },\n ...(params.externalUrl && { external_url: params.externalUrl }),\n ...(params.endpoints?.length && { endpoints: params.endpoints }),\n ...(params.registrations?.length && {\n registrations: params.registrations,\n }),\n ...(params.supportedTrust?.length && {\n supportedTrust: params.supportedTrust,\n }),\n active: params.active ?? true,\n ...(params.x402support !== undefined && {\n x402support: params.x402support,\n }),\n };\n\n // Validate with Zod (throws on error)\n return RegistrationFileSchema.parse(file);\n}\n\n/**\n * Fetch and parse a registration file from URI.\n *\n * - Returns null on network errors or invalid URIs\n * - Validates structure, returns raw data for non-conforming files\n * - Never throws, never logs to console\n */\nexport async function fetchRegistrationFile(uri: string): Promise<RegistrationFile | null> {\n if (!uri) return null;\n\n // Convert IPFS/Arweave URIs to gateway URLs\n let url = uri;\n if (uri.startsWith(\"ipfs://\")) {\n url = `https://ipfs.io/ipfs/${uri.slice(7)}`;\n } else if (uri.startsWith(\"ar://\")) {\n url = `https://arweave.net/${uri.slice(5)}`;\n } else if (!uri.startsWith(\"http://\") && !uri.startsWith(\"https://\")) {\n return null;\n }\n\n try {\n const response = await fetch(url);\n if (!response.ok) {\n return null;\n }\n\n const data = await response.json();\n const result = RegistrationFileSchema.safeParse(data);\n\n if (!result.success) {\n // Return raw data for backwards compatibility with non-conforming files\n return data as RegistrationFile;\n }\n\n return result.data;\n } catch {\n return null;\n }\n}\n\n/**\n * Extract image URL from a registration file.\n *\n * Prefers properties.files (Phantom format), falls back to image field.\n * Handles IPFS/Arweave URI conversion.\n */\nexport function getImageUrl(file: RegistrationFile | null | undefined): string | null {\n if (!file) return null;\n\n // Prefer properties.files (Phantom format)\n const fileUri = file.properties?.files?.[0]?.uri;\n const uri = fileUri ?? file.image;\n\n if (!uri) return null;\n\n // Convert protocol URIs to gateway URLs\n if (uri.startsWith(\"ipfs://\")) {\n return `https://ipfs.io/ipfs/${uri.slice(7)}`;\n }\n if (uri.startsWith(\"ar://\")) {\n return `https://arweave.net/${uri.slice(5)}`;\n }\n if (uri.startsWith(\"http://\") || uri.startsWith(\"https://\")) {\n return uri;\n }\n\n return null;\n}\n\n/**\n * Serialize a registration file to JSON string.\n */\nexport function stringifyRegistrationFile(file: RegistrationFile, space = 2): string {\n return JSON.stringify(file, null, space);\n}\n\n// ============================================================================\n// SATI Registration Helpers\n// ============================================================================\n\n/** CAIP-2 chain identifier for Solana mainnet */\nexport const SATI_CHAIN_ID = \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\";\n\n/** SATI program ID */\nexport const SATI_PROGRAM_ID = \"satiRkxEiwZ51cv8PRu8UMzuaqeaNU9jABo6oAFMsLe\";\n\n/**\n * Build a registrations[] entry for linking a SATI agent to an off-chain registration file.\n *\n * @param agentMint - SATI agent mint address\n * @returns RegistrationEntry for the registrations[] array\n *\n * @example\n * ```typescript\n * const entry = buildSatiRegistrationEntry(\"AgentMint...\");\n * // { agentId: \"AgentMint...\", agentRegistry: \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp:satiR3q7...\" }\n * ```\n */\nexport function buildSatiRegistrationEntry(agentMint: string): RegistrationEntry {\n return {\n agentId: agentMint,\n agentRegistry: `${SATI_CHAIN_ID}:${SATI_PROGRAM_ID}`,\n };\n}\n\n/**\n * Check if a registration file contains a SATI registration.\n *\n * @param file - Registration file to check\n * @returns true if file contains at least one SATI registration\n */\nexport function hasSatiRegistration(file: RegistrationFile): boolean {\n return (\n file.registrations?.some((r) => typeof r.agentRegistry === \"string\" && r.agentRegistry.startsWith(SATI_CHAIN_ID)) ??\n false\n );\n}\n\n/**\n * Find SATI agent IDs from a registration file.\n *\n * @param file - Registration file to search\n * @returns Array of SATI agent mint addresses\n */\nexport function getSatiAgentIds(file: RegistrationFile): string[] {\n return (\n file.registrations\n ?.filter((r) => typeof r.agentRegistry === \"string\" && r.agentRegistry.startsWith(SATI_CHAIN_ID))\n .map((r) => String(r.agentId)) ?? []\n );\n}\n","/**\n * Simple TTL cache for feedback query results.\n *\n * Reduces redundant RPC calls when the same feedback data is queried\n * multiple times in quick succession (e.g. listing then revoking,\n * or dashboard re-renders).\n *\n * Automatically invalidated after write operations (giveFeedback,\n * revokeFeedback, submitPreparedFeedback).\n */\n\ninterface CacheEntry<T> {\n data: T;\n expires: number;\n}\n\nexport class FeedbackCache {\n private cache = new Map<string, CacheEntry<unknown>>();\n\n constructor(private readonly ttlMs = 30_000) {}\n\n /** Get cached data or null if expired/missing. */\n get<T>(key: string): T | null {\n const entry = this.cache.get(key);\n if (!entry || Date.now() > entry.expires) {\n if (entry) this.cache.delete(key);\n return null;\n }\n return entry.data as T;\n }\n\n /** Store data with TTL. */\n set<T>(key: string, data: T): void {\n this.cache.set(key, { data, expires: Date.now() + this.ttlMs });\n }\n\n /** Invalidate a specific key, or all entries if no key given. */\n invalidate(key?: string): void {\n if (key) {\n this.cache.delete(key);\n } else {\n this.cache.clear();\n }\n }\n\n /** Build a cache key from schema and optional agent mint. */\n static cacheKey(sasSchema: string, agentMint?: string): string {\n return `${sasSchema}:${agentMint ?? \"*\"}`;\n }\n}\n","/**\n * Fluent builder for SATI agent registration and management.\n *\n * Uses sati-sdk native types (no agent0-sdk dependency).\n *\n * @example\n * ```typescript\n * const builder = sati.createAgentBuilder(\"MyAgent\", \"AI assistant\", \"https://example.com/avatar.png\");\n * builder\n * .setMCP(\"https://mcp.example.com\", \"2025-06-18\", { tools: [\"search\", \"summarize\"] })\n * .setA2A(\"https://a2a.example.com/.well-known/agent-card.json\")\n * .setActive(true)\n * .setX402Support(true);\n *\n * const result = await builder.register({\n * payer,\n * uploader: createSatiUploader(),\n * });\n * ```\n */\n\nimport type { Address, KeyPairSigner } from \"@solana/kit\";\nimport type { AgentIdentity, RegisterAgentResult } from \"./types\";\nimport type { Endpoint, RegistrationFileParams, TrustMechanism } from \"./registration\";\nimport type { MetadataUploader } from \"./uploaders\";\nimport type { Sati } from \"./client\";\n\nexport class SatiAgentBuilder {\n private _params: RegistrationFileParams;\n private _identity: AgentIdentity | undefined;\n private readonly _sati: Sati;\n\n constructor(sati: Sati, name: string, description: string, image: string) {\n this._sati = sati;\n this._params = {\n name,\n description,\n image,\n endpoints: [],\n active: true,\n };\n }\n\n // =========================================================================\n // Read-only accessors\n // =========================================================================\n\n /** Current registration file parameters. */\n get params(): RegistrationFileParams {\n return this._params;\n }\n\n /** On-chain identity (available after register/load). */\n get identity(): AgentIdentity | undefined {\n return this._identity;\n }\n\n // =========================================================================\n // Fluent setters\n // =========================================================================\n\n /** Set a generic endpoint. */\n setEndpoint(endpoint: Endpoint): this {\n if (!this._params.endpoints) this._params.endpoints = [];\n this._params.endpoints = this._params.endpoints.filter((ep) => ep.name !== endpoint.name);\n this._params.endpoints.push(endpoint);\n return this;\n }\n\n /**\n * Set MCP endpoint.\n *\n * Unlike agent0-sdk's `SatiAgent.setMCP()`, this does NOT auto-fetch capabilities.\n * Pass tools/prompts/resources explicitly via the `meta` parameter.\n */\n setMCP(url: string, version?: string, meta?: { tools?: string[]; prompts?: string[]; resources?: string[] }): this {\n return this.setEndpoint({\n name: \"MCP\",\n endpoint: url,\n ...(version && { version }),\n ...(meta?.tools?.length && { mcpTools: meta.tools }),\n ...(meta?.prompts?.length && { mcpPrompts: meta.prompts }),\n ...(meta?.resources?.length && { mcpResources: meta.resources }),\n });\n }\n\n /** Set A2A endpoint. */\n setA2A(url: string, version?: string, meta?: { skills?: string[] }): this {\n return this.setEndpoint({\n name: \"A2A\",\n endpoint: url,\n ...(version && { version }),\n ...(meta?.skills?.length && { a2aSkills: meta.skills }),\n });\n }\n\n /** Set wallet endpoint. */\n setWallet(address: string): this {\n return this.setEndpoint({\n name: \"agentWallet\",\n endpoint: address,\n });\n }\n\n /** Remove an endpoint by name. */\n removeEndpoint(name: string): this {\n if (this._params.endpoints) {\n this._params.endpoints = this._params.endpoints.filter((ep) => ep.name !== name);\n }\n return this;\n }\n\n /** Set agent active status. */\n setActive(active: boolean): this {\n this._params.active = active;\n return this;\n }\n\n /** Set x402 payment support. */\n setX402Support(x402: boolean): this {\n this._params.x402support = x402;\n return this;\n }\n\n /** Set supported trust mechanisms. */\n setSupportedTrust(trusts: TrustMechanism[]): this {\n this._params.supportedTrust = trusts;\n return this;\n }\n\n /** Set external URL. */\n setExternalUrl(url: string): this {\n this._params.externalUrl = url;\n return this;\n }\n\n /** Update basic info. */\n updateInfo(opts: { name?: string; description?: string; image?: string }): this {\n if (opts.name !== undefined) this._params.name = opts.name;\n if (opts.description !== undefined) this._params.description = opts.description;\n if (opts.image !== undefined) this._params.image = opts.image;\n return this;\n }\n\n // =========================================================================\n // On-chain operations\n // =========================================================================\n\n /**\n * Upload registration file and register agent on-chain.\n *\n * @returns Registration result with mint address, member number, and signature\n */\n async register(opts: {\n payer: KeyPairSigner;\n uploader: MetadataUploader;\n nonTransferable?: boolean;\n owner?: Address;\n }): Promise<RegisterAgentResult> {\n const uri = await this._sati.uploadRegistrationFile(this._params, opts.uploader);\n return this._registerWithUri(uri, opts);\n }\n\n /**\n * Register agent on-chain with a pre-existing URI.\n *\n * Use when you already have a hosted registration file.\n */\n async registerWithUri(opts: {\n payer: KeyPairSigner;\n uri: string;\n nonTransferable?: boolean;\n owner?: Address;\n }): Promise<RegisterAgentResult> {\n return this._registerWithUri(opts.uri, opts);\n }\n\n /**\n * Re-upload registration file and update the on-chain URI.\n *\n * Use after modifying the builder via fluent setters.\n */\n async update(opts: {\n payer: KeyPairSigner;\n owner: KeyPairSigner;\n uploader: MetadataUploader;\n }): Promise<{ signature: string }> {\n if (!this._identity) {\n throw new Error(\"Agent not registered on-chain. Call register() first.\");\n }\n const uri = await this._sati.uploadRegistrationFile(this._params, opts.uploader);\n return this._updateUri(uri, opts);\n }\n\n /**\n * Update the on-chain URI to point to a new registration file.\n */\n async updateUri(opts: { payer: KeyPairSigner; owner: KeyPairSigner; uri: string }): Promise<{ signature: string }> {\n if (!this._identity) {\n throw new Error(\"Agent not registered on-chain. Call register() first.\");\n }\n return this._updateUri(opts.uri, opts);\n }\n\n /**\n * Load existing on-chain identity into this builder.\n * Useful for wrapping an already-registered agent.\n */\n setIdentity(identity: AgentIdentity): this {\n this._identity = identity;\n return this;\n }\n\n // =========================================================================\n // Private helpers\n // =========================================================================\n\n private async _registerWithUri(\n uri: string,\n opts: { payer: KeyPairSigner; nonTransferable?: boolean; owner?: Address },\n ): Promise<RegisterAgentResult> {\n if (this._identity) {\n throw new Error(\"Agent is already registered on-chain. Use update() instead.\");\n }\n\n const result = await this._sati.registerAgent({\n payer: opts.payer,\n name: this._params.name,\n uri,\n nonTransferable: opts.nonTransferable,\n owner: opts.owner,\n });\n\n this._identity = {\n mint: result.mint,\n owner: opts.owner ?? opts.payer.address,\n name: this._params.name,\n uri,\n memberNumber: result.memberNumber,\n additionalMetadata: {},\n nonTransferable: opts.nonTransferable ?? false,\n };\n\n return result;\n }\n\n private async _updateUri(\n uri: string,\n opts: { payer: KeyPairSigner; owner: KeyPairSigner },\n ): Promise<{ signature: string }> {\n const identity = this._identity;\n if (!identity) {\n throw new Error(\"Agent not registered on-chain. Call register() first.\");\n }\n\n const result = await this._sati.updateAgentMetadata({\n payer: opts.payer,\n owner: opts.owner,\n mint: identity.mint,\n updates: { uri },\n });\n\n identity.uri = uri;\n return { signature: result.signature };\n }\n}\n","/**\n * SATI Client - High-Level SDK Interface\n *\n * Provides a convenient wrapper around the generated Codama client\n * for the Solana Agent Trust Infrastructure.\n *\n * Features:\n * - Agent registration via Token-2022 NFT minting\n * - Compressed attestations via Light Protocol (Feedback, Validation)\n * - Regular attestations via SAS (ReputationScoreV3)\n * - Ed25519 signature building for blind feedback model\n *\n * @see https://github.com/cascade-protocol/sati\n */\n\nimport {\n pipe,\n generateKeyPairSigner,\n signTransactionMessageWithSigners,\n createTransactionMessage,\n setTransactionMessageFeePayer,\n setTransactionMessageLifetimeUsingBlockhash,\n appendTransactionMessageInstruction,\n appendTransactionMessageInstructions,\n addSignersToTransactionMessage,\n compressTransactionMessageUsingAddressLookupTables,\n compileTransaction,\n getSignatureFromTransaction,\n getAddressEncoder,\n getAddressDecoder,\n createSolanaRpc,\n createSolanaRpcSubscriptions,\n sendAndConfirmTransactionFactory,\n address,\n verifySignature,\n signatureBytes,\n signBytes,\n type Address,\n type KeyPairSigner,\n type AddressesByLookupTableAddress,\n type Base58EncodedBytes,\n} from \"@solana/kit\";\n\nimport {\n fetchMint as fetchToken2022Mint,\n fetchToken as fetchToken2022Token,\n getTransferInstruction,\n getUpdateTokenMetadataUpdateAuthorityInstruction,\n getUpdateTokenMetadataFieldInstruction,\n tokenMetadataField,\n getCreateAssociatedTokenIdempotentInstruction,\n type Extension,\n} from \"@solana-program/token-2022\";\n\nimport { fetchAddressLookupTable } from \"@solana-program/address-lookup-table\";\nimport { getSetComputeUnitLimitInstruction } from \"@solana-program/compute-budget\";\n\nimport {\n getRegisterAgentInstructionAsync,\n getRegisterSchemaConfigInstructionAsync,\n getCreateCompressedAttestationInstructionAsync,\n getCloseCompressedAttestationInstructionAsync,\n getCloseRegularAttestationInstructionAsync,\n getCreateRegularAttestationInstructionAsync,\n getLinkEvmAddressInstruction,\n fetchRegistryConfig,\n fetchSchemaConfig,\n fetchMaybeAgentIndex,\n fetchAllMaybeAgentIndex,\n SATI_PROGRAM_ADDRESS,\n type ValidityProofArgs,\n type PackedAddressTreeInfoArgs,\n type CompressedAccountMetaArgs,\n} from \"./generated\";\n\nimport {\n findAssociatedTokenAddress,\n findRegistryConfigPda,\n findSchemaConfigPda,\n findAgentIndexPda,\n TOKEN_2022_PROGRAM_ADDRESS,\n} from \"./helpers\";\n\nimport {\n computeInteractionHash,\n computeAttestationNonce,\n computeReputationNonce,\n computeEvmLinkHash,\n zeroDataHash,\n Outcome,\n} from \"./hashes\";\n\nimport { buildCounterpartyMessage } from \"./offchain-signing\";\n\nimport {\n ContentType,\n getContentTypeLabel,\n serializeFeedback,\n serializeValidation,\n serializeReputationScore,\n deserializeReputationScore,\n SAS_HEADER_SIZE,\n SAS_DATA_LEN_OFFSET,\n validateContentSize,\n type FeedbackData,\n type ValidationData,\n type ReputationScoreData,\n} from \"./schemas\";\n\nimport { SignatureMode, type StorageType } from \"./generated\";\n\nimport {\n type SATILightClient as LightClient,\n createSATILightClient,\n type ParsedAttestation,\n type ParsedFeedbackAttestation,\n type ParsedValidationAttestation,\n type AttestationFilter,\n type PaginatedAttestations,\n} from \"./compression\";\n\nimport { importEd25519PublicKey } from \"@cascade-fyi/compression-kit\";\n\n// Note: SAS schema setup is available via setupSASSchemas() from \"@cascade-fyi/sati-sdk/sas\"\n\nimport { deriveReputationAttestationPda, deriveSasEventAuthorityPda, SAS_PROGRAM_ADDRESS } from \"./sas-pdas\";\n\nimport { createBatchEd25519Instruction } from \"./ed25519\";\n\nimport { buildRegistrationFile, fetchRegistrationFile, type RegistrationFileParams } from \"./registration\";\n\nimport type { MetadataUploader } from \"./uploaders\";\n\nimport type {\n SATIClientOptions,\n SatiWarning,\n SATISASConfig,\n AgentIdentity,\n RegisterAgentResult,\n UpdateAgentMetadataParams,\n UpdateAgentMetadataResult,\n CloseCompressedAttestationParams,\n CloseRegularAttestationParams,\n CloseAttestationResult,\n SignatureVerificationResult,\n LinkEvmAddressResult,\n} from \"./types\";\n\nimport { loadDeployedConfig } from \"./deployed\";\nimport { FeedbackCache } from \"./cache\";\nimport { SatiAgentBuilder } from \"./agent-builder\";\n\nimport type {\n GiveFeedbackParams,\n GiveFeedbackResult,\n PreparedFeedbackData,\n FeedbackSearchOptions,\n ParsedFeedback,\n ReputationSummary,\n AgentSearchOptions,\n AgentSearchResult,\n ParsedValidation,\n} from \"./convenience\";\n\n// Re-export enums and types\nexport { Outcome } from \"./hashes\";\nexport { DataType, ContentType, ValidationType } from \"./schemas\";\nexport { SignatureMode, StorageType } from \"./generated\";\n\n// Default RPC URLs\nconst RPC_URLS = {\n mainnet: \"https://api.mainnet-beta.solana.com\",\n devnet: \"https://api.devnet.solana.com\",\n localnet: \"http://127.0.0.1:8899\",\n} as const;\n\n// Default WebSocket URLs\nconst WS_URLS = {\n mainnet: \"wss://api.mainnet-beta.solana.com\",\n devnet: \"wss://api.devnet.solana.com\",\n localnet: \"ws://127.0.0.1:8900\",\n} as const;\n\n// Default Photon RPC URLs (hosted proxy for zero-config experience)\nconst PHOTON_URLS = {\n mainnet: \"https://sati.cascade.fyi/api/photon/mainnet\",\n devnet: \"https://sati.cascade.fyi/api/photon/devnet\",\n localnet: \"http://127.0.0.1:8899\",\n} as const;\n\n// ============================================================\n// TYPES\n// ============================================================\n\n/**\n * Type for a 64-byte Ed25519 signature\n */\ntype Signature64 = Uint8Array & { length: 64 };\n\n/**\n * Type helper for signed transactions with blockhash lifetime.\n */\ntype SignedBlockhashTransaction = Awaited<ReturnType<typeof signTransactionMessageWithSigners>> & {\n lifetimeConstraint: { lastValidBlockHeight: bigint; blockhash: string };\n};\n\n/**\n * Attestation creation result\n */\nexport interface AttestationResult {\n /** Attestation address (compressed account address or SAS PDA) */\n address: Address;\n /** Transaction signature */\n signature: string;\n}\n\n/**\n * Built transaction ready for signing\n */\nexport interface BuiltTransaction {\n /** Attestation address that will be created */\n attestationAddress: Address;\n /** Base64-encoded transaction message bytes */\n messageBytes: string;\n /** Addresses that need to sign (first one is fee payer) */\n signers: Address[];\n /** Blockhash used for the transaction */\n blockhash: string;\n /** Last valid block height for the transaction */\n lastValidBlockHeight: bigint;\n}\n\n/**\n * Signature data with pubkey for attestation creation\n */\nexport interface SignatureInput {\n /** Public key that signed */\n pubkey: Address;\n /** 64-byte Ed25519 signature */\n signature: Uint8Array;\n}\n\n/**\n * Parameters for creating a Feedback attestation\n *\n * Uses universal base layout (131 bytes):\n * - task_ref(32) + agent_mint(32) + counterparty(32) +\n * - outcome(1) + data_hash(32) + content_type(1) + content(variable)\n */\nexport interface CreateFeedbackParams {\n /** Payer for transaction fees */\n payer: KeyPairSigner;\n /** SAS schema address for this feedback type */\n sasSchema: Address;\n /** Task reference (CAIP-220 tx hash or arbitrary ID) */\n taskRef: Uint8Array;\n /** Agent's mint address (Token-2022 NFT identity) */\n agentMint: Address;\n /** Client (feedback giver) */\n counterparty: Address;\n /** Hash of request/interaction data for agent's blind signature */\n dataHash: Uint8Array;\n /** Feedback outcome */\n outcome: Outcome;\n /** Content format */\n contentType?: ContentType;\n /**\n * Variable-length content (optional).\n *\n * **Size Limits (enforced at runtime):**\n * - DualSignature mode (with counterpartySignature): max ~70 bytes\n * - SingleSignature mode (FeedbackPublic): max ~240 bytes\n *\n * For larger content, use ContentType.IPFS or ContentType.Arweave\n * and store only the reference hash (32-36 bytes).\n *\n * @example\n * ```typescript\n * // Small content (fits in DualSignature)\n * content: new TextEncoder().encode('{\"score\":85,\"tags\":[\"fast\"]}')\n *\n * // Large content (use IPFS reference)\n * contentType: ContentType.IPFS,\n * content: ipfsCidBytes // 36-byte CIDv1\n * ```\n */\n content?: Uint8Array;\n /** Agent's signature (signs interaction_hash) */\n agentSignature: SignatureInput;\n /** Counterparty's signature (signs SIWS message) - optional for CounterpartySigned schemas */\n counterpartySignature?: SignatureInput;\n /** SIWS message bytes that counterparty signed - required for DualSignature schemas */\n counterpartyMessage?: Uint8Array;\n /** Optional address lookup table for transaction compression */\n lookupTableAddress?: Address;\n /**\n * Skip WebSocket-based transaction confirmation.\n * Use this in serverless environments (e.g., Cloudflare Workers) that don't support\n * outbound WebSocket connections. When true, returns immediately after sending the\n * transaction without waiting for confirmation.\n */\n skipConfirmation?: boolean;\n}\n\n/**\n * Parameters for building a Feedback transaction (without signing/sending)\n *\n * Uses universal base layout (131 bytes):\n * - task_ref(32) + agent_mint(32) + counterparty(32) +\n * - outcome(1) + data_hash(32) + content_type(1) + content(variable)\n */\nexport interface BuildFeedbackParams {\n /** Fee payer address (will sign in browser) */\n payer: Address;\n /** SAS schema address for this feedback type */\n sasSchema: Address;\n /** Task reference (CAIP-220 tx hash or arbitrary ID) */\n taskRef: Uint8Array;\n /** Agent's mint address (Token-2022 NFT identity) */\n agentMint: Address;\n /** Client (feedback giver) */\n counterparty: Address;\n /** Hash of request/interaction data for agent's blind signature */\n dataHash: Uint8Array;\n /** Feedback outcome */\n outcome: Outcome;\n /** Content format */\n contentType?: ContentType;\n /**\n * Variable-length content (optional).\n *\n * **Size Limits (enforced at runtime):**\n * - DualSignature mode (with counterpartySignature): max ~70 bytes\n * - SingleSignature mode (FeedbackPublic): max ~240 bytes\n *\n * For larger content, use ContentType.IPFS or ContentType.Arweave\n * and store only the reference hash (32-36 bytes).\n */\n content?: Uint8Array;\n /** Agent's signature (signs interaction_hash) */\n agentSignature: SignatureInput;\n /** Counterparty's signature (signs SIWS message) - optional for CounterpartySigned schemas */\n counterpartySignature?: SignatureInput;\n /** SIWS message bytes that counterparty signed - required for DualSignature schemas */\n counterpartyMessage?: Uint8Array;\n /** Optional address lookup table for transaction compression */\n lookupTableAddress?: Address;\n}\n\n/**\n * Parameters for creating a Validation attestation\n */\nexport interface CreateValidationParams {\n /** Payer for transaction fees */\n payer: KeyPairSigner;\n /** SAS schema address */\n sasSchema: Address;\n /** Task reference */\n taskRef: Uint8Array;\n /** Agent's mint address (Token-2022 NFT identity) */\n agentMint: Address;\n /** Validator address */\n counterparty: Address;\n /** Hash of work being validated */\n dataHash: Uint8Array;\n /** Outcome: Positive (2) for pass, Negative (0) for fail, Neutral (1) for inconclusive */\n outcome: Outcome;\n /** Content format */\n contentType?: ContentType;\n /**\n * Variable-length content (JSON with validation details).\n *\n * **Size Limit (enforced at runtime):** max ~70 bytes\n *\n * Validation attestations always use DualSignature mode (agent + validator),\n * so content is limited due to SIWS message duplication.\n *\n * For larger content, use ContentType.IPFS or ContentType.Arweave\n * and store only the reference hash (32-36 bytes).\n */\n content?: Uint8Array;\n /** Agent's signature (blind) */\n agentSignature: SignatureInput;\n /** Validator's signature (SIWS message) */\n validatorSignature: SignatureInput;\n /** SIWS message bytes signed by validator */\n counterpartyMessage?: Uint8Array;\n /** Optional address lookup table for transaction compression */\n lookupTableAddress?: Address;\n}\n\n/**\n * Parameters for creating a ReputationScoreV3 attestation\n */\nexport interface CreateReputationScoreParams {\n /** Payer for transaction fees */\n payer: KeyPairSigner;\n /** Provider (reputation scorer) address */\n provider: Address;\n /** Provider's signature over the interaction hash */\n providerSignature: Uint8Array;\n /** SAS schema address */\n sasSchema: Address;\n /** SATI credential address in SAS */\n satiCredential: Address;\n /** Agent's mint address (Token-2022 NFT identity) being scored */\n agentMint: Address;\n /** Task reference (e.g., hash of provider identity or scoring context) */\n taskRef: Uint8Array;\n /** Hash of methodology/data used for scoring */\n dataHash: Uint8Array;\n /** Outcome: typically Positive for good score */\n outcome: Outcome;\n /** Content format */\n contentType?: ContentType;\n /**\n * Methodology/details content (JSON with score, components, etc.).\n *\n * **Size Limit:** max ~240 bytes\n *\n * ReputationScoreV3 uses SingleSignature mode, so has more headroom than\n * DualSignature schemas (Feedback, Validation).\n */\n content?: Uint8Array;\n /** Expiry timestamp (0 = never expires) */\n expiry?: number;\n}\n\n/**\n * Parameters for updating a ReputationScoreV3 attestation.\n *\n * High-level convenience method: auto-computes deterministic taskRef and\n * zero dataHash per spec. If a score already exists for this (provider, agent)\n * pair, it is closed first and a new one is created at the same PDA.\n *\n * Provider must be a KeyPairSigner because it signs both the close transaction\n * and the Ed25519 precompile instruction for create.\n */\nexport interface UpdateReputationScoreParams {\n /** Payer for transaction fees */\n payer: KeyPairSigner;\n /** Provider (reputation scorer) - must be KeyPairSigner to sign close + Ed25519 */\n provider: KeyPairSigner;\n /** SAS schema address */\n sasSchema: Address;\n /** SATI credential address in SAS */\n satiCredential: Address;\n /** Agent's mint address (Token-2022 NFT identity) being scored */\n agentMint: Address;\n /** Outcome: 0=Poor, 1=Average, 2=Good */\n outcome: Outcome;\n /** Content format (defaults to ContentType.None) */\n contentType?: ContentType;\n /** JSON content bytes (score, methodology, feedbackCount, validationCount). Required when contentType is not None. */\n content?: Uint8Array;\n /** Expiry timestamp (0 = never expires) */\n expiry?: number;\n}\n\n// ============================================================\n// HELPERS\n// ============================================================\n\n/**\n * Convert an Address to Base58EncodedBytes for RPC memcmp filters.\n */\nfunction addressToBase58Bytes(addr: Address): Base58EncodedBytes {\n return addr as unknown as Base58EncodedBytes;\n}\n\n/**\n * Validate and cast a signature to the expected 64-byte type.\n */\nfunction assertSignature64(sig: Uint8Array): Signature64 {\n if (sig.length !== 64) {\n throw new Error(`Invalid signature length: expected 64 bytes, got ${sig.length}`);\n }\n return sig as Signature64;\n}\n\n/**\n * Helper to unwrap Option type from @solana/kit\n */\nfunction unwrapOption<T>(option: { __option: \"Some\"; value: T } | { __option: \"None\" }): T | null {\n if (option.__option === \"Some\") {\n return option.value;\n }\n return null;\n}\n\n// ============================================================\n// SATI CLIENT\n// ============================================================\n\n/**\n * Sati Client\n *\n * High-level interface for interacting with SATI protocol.\n *\n * @example\n * ```typescript\n * const sati = new Sati({ network: \"devnet\", photonRpcUrl: \"...\" });\n *\n * // Register an agent\n * const { mint, memberNumber } = await sati.registerAgent({\n * payer,\n * name: \"MyAgent\",\n * uri: \"ipfs://QmRegistrationFile\",\n * });\n *\n * // Load an agent\n * const agent = await sati.loadAgent(mint);\n *\n * // Create feedback attestation\n * const result = await sati.createFeedback({\n * payer,\n * sasSchema,\n * taskRef,\n * agentMint,\n * counterparty,\n * outcome: Outcome.Positive,\n * agentSignature,\n * counterpartySignature,\n * });\n *\n * // List feedbacks\n * const feedbacks = await sati.listFeedbacks({ agentMint });\n * ```\n */\nexport class Sati {\n // Internal state\n private rpc: ReturnType<typeof createSolanaRpc>;\n private rpcSubscriptions: ReturnType<typeof createSolanaRpcSubscriptions>;\n private sendAndConfirm: ReturnType<typeof sendAndConfirmTransactionFactory>;\n private lightClient: LightClient;\n\n // Convenience layer state\n private readonly _deployedConfig: SATISASConfig | null;\n private readonly _feedbackCache = new FeedbackCache();\n private readonly _onWarning?: (warning: SatiWarning) => void;\n\n /** Network configuration */\n readonly network: \"mainnet\" | \"devnet\" | \"localnet\";\n\n constructor(options: SATIClientOptions) {\n this.network = options.network;\n const rpcUrl = options.rpcUrl ?? RPC_URLS[options.network];\n const wsUrl = options.wsUrl ?? WS_URLS[options.network];\n\n this.rpc = createSolanaRpc(rpcUrl);\n this.rpcSubscriptions = createSolanaRpcSubscriptions(wsUrl);\n this.sendAndConfirm = sendAndConfirmTransactionFactory({\n rpc: this.rpc,\n rpcSubscriptions: this.rpcSubscriptions,\n });\n\n // Use hosted Photon proxy by default (zero-config), override with photonRpcUrl\n const photonUrl = options.photonRpcUrl ?? PHOTON_URLS[options.network];\n this.lightClient = createSATILightClient(photonUrl);\n\n // Convenience layer\n this._deployedConfig = loadDeployedConfig(options.network);\n this._onWarning = options.onWarning;\n }\n\n // ============================================================\n // INTERNAL ACCESSORS\n // ============================================================\n\n /** @internal */\n getRpc(): ReturnType<typeof createSolanaRpc> {\n return this.rpc;\n }\n\n /** @internal */\n getSendAndConfirm(): ReturnType<typeof sendAndConfirmTransactionFactory> {\n return this.sendAndConfirm;\n }\n\n /** @internal */\n getLightClient(): LightClient {\n return this.lightClient;\n }\n\n // ============================================================\n // REGISTRY (Agent Management)\n // ============================================================\n\n /**\n * Register a new agent identity\n *\n * Creates a Token-2022 NFT with metadata and group membership atomically.\n */\n async registerAgent(params: {\n /** Payer for transaction and rent */\n payer: KeyPairSigner;\n /** Agent name (max 32 bytes) */\n name: string;\n /** Registration file URI (max 200 bytes) */\n uri: string;\n /** Additional metadata key-value pairs (max 10 entries) */\n additionalMetadata?: Array<{ key: string; value: string }>;\n /** Make agent non-transferable (soulbound) */\n nonTransferable?: boolean;\n /** Owner of the agent NFT (default: payer) */\n owner?: Address;\n /** Optional mint keypair - use to get a consistent mint address across networks */\n mintKeypair?: KeyPairSigner;\n }): Promise<RegisterAgentResult> {\n const { payer, name, uri, additionalMetadata, nonTransferable = false, owner, mintKeypair } = params;\n\n // Use provided mint keypair or generate a new one\n const agentMint = mintKeypair ?? (await generateKeyPairSigner());\n\n // Fetch registry config to get the actual group mint and agent count\n const [registryConfigAddress] = await findRegistryConfigPda();\n const registryConfig = await fetchRegistryConfig(this.rpc, registryConfigAddress);\n const groupMint = registryConfig.data.groupMint;\n const ownerAddress = owner ?? payer.address;\n const [agentTokenAccount] = await findAssociatedTokenAddress(agentMint.address, ownerAddress);\n\n // Derive agent index PDA (member_number = totalAgents + 1)\n const memberNumber = registryConfig.data.totalAgents + 1n;\n const [agentIndex] = await findAgentIndexPda(memberNumber);\n\n // Build instruction\n const registerIx = await getRegisterAgentInstructionAsync({\n payer,\n owner: ownerAddress,\n groupMint,\n agentMint,\n agentTokenAccount,\n agentIndex,\n name,\n symbol: \"\", // Empty - vestigial field from fungible tokens\n uri,\n additionalMetadata: additionalMetadata ?? null,\n nonTransferable,\n });\n\n // Build and send transaction\n const { value: latestBlockhash } = await this.rpc.getLatestBlockhash().send();\n\n const tx = pipe(\n createTransactionMessage({ version: 0 }),\n (msg) => setTransactionMessageFeePayer(payer.address, msg),\n (msg) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, msg),\n (msg) => appendTransactionMessageInstruction(registerIx, msg),\n );\n\n const signedTx = await signTransactionMessageWithSigners(tx);\n await this.sendAndConfirm(signedTx as SignedBlockhashTransaction, {\n commitment: \"confirmed\",\n });\n\n // Re-fetch registry config to verify the updated member number\n const updatedRegistryConfig = await fetchRegistryConfig(this.rpc, registryConfigAddress);\n const finalMemberNumber = updatedRegistryConfig.data.totalAgents;\n\n const signature = getSignatureFromTransaction(signedTx);\n\n return {\n mint: agentMint.address,\n memberNumber: finalMemberNumber,\n signature: signature.toString(),\n };\n }\n\n /**\n * Build a registration file from params, upload it via the provided uploader,\n * and return the resulting URI.\n *\n * @example\n * ```typescript\n * import { createPinataUploader } from \"@cascade-fyi/sati-sdk\";\n *\n * const uploader = createPinataUploader(process.env.PINATA_JWT!);\n * const uri = await sati.uploadRegistrationFile(\n * { name: \"MyAgent\", description: \"AI assistant\", image: \"https://example.com/img.png\" },\n * uploader,\n * );\n * ```\n */\n async uploadRegistrationFile(params: RegistrationFileParams, uploader: MetadataUploader): Promise<string> {\n const regFile = buildRegistrationFile(params);\n return uploader.upload(regFile);\n }\n\n /**\n * Load agent identity from mint address\n */\n async loadAgent(mint: Address): Promise<AgentIdentity | null> {\n try {\n const mintAccount = await fetchToken2022Mint(this.rpc, mint);\n\n const extensions = unwrapOption(\n mintAccount.data.extensions as { __option: \"Some\"; value: Extension[] } | { __option: \"None\" },\n );\n\n if (!extensions) {\n return null;\n }\n\n const metadataExt = extensions.find(\n (ext: Extension): ext is Extension & { __kind: \"TokenMetadata\" } => ext.__kind === \"TokenMetadata\",\n );\n\n if (!metadataExt) {\n return null;\n }\n\n const groupMemberExt = extensions.find(\n (ext: Extension): ext is Extension & { __kind: \"TokenGroupMember\" } => ext.__kind === \"TokenGroupMember\",\n );\n\n const nonTransferableExt = extensions.find((ext: Extension) => ext.__kind === \"NonTransferable\");\n\n const owner = await this.getAgentOwner(mint);\n\n const additionalMetadata: Record<string, string> = {};\n if (metadataExt.additionalMetadata) {\n for (const [key, value] of metadataExt.additionalMetadata) {\n additionalMetadata[key] = value;\n }\n }\n\n return {\n mint,\n owner,\n name: metadataExt.name,\n uri: metadataExt.uri,\n memberNumber: groupMemberExt?.memberNumber ?? 0n,\n additionalMetadata,\n nonTransferable: !!nonTransferableExt,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes(\"could not find account\") || message.includes(\"Account not found\")) {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Load multiple agent identities by mint addresses (batch operation).\n *\n * More efficient than calling loadAgent() multiple times as it batches\n * RPC calls where possible.\n *\n * @param mints - Array of agent NFT mint addresses\n * @returns Array of AgentIdentity or null for each mint (preserves order)\n *\n * @example\n * ```typescript\n * const agents = await sati.loadAgents([mint1, mint2, mint3]);\n * // agents[0] corresponds to mint1, etc.\n * ```\n */\n async loadAgents(mints: Address[]): Promise<(AgentIdentity | null)[]> {\n if (mints.length === 0) {\n return [];\n }\n\n // Batch fetch all mint accounts using getMultipleAccounts\n const mintAccountsResult = await this.rpc.getMultipleAccounts(mints, { encoding: \"jsonParsed\" }).send();\n\n // Process each mint account\n const results: (AgentIdentity | null)[] = [];\n\n for (let i = 0; i < mints.length; i++) {\n const mint = mints[i];\n const mintAccount = mintAccountsResult.value[i];\n\n if (!mintAccount) {\n results.push(null);\n continue;\n }\n\n try {\n const parsed = mintAccount.data as {\n parsed?: {\n info?: {\n extensions?: Array<{\n extension: string;\n state: Record<string, unknown>;\n }>;\n };\n };\n };\n\n const extensions = parsed.parsed?.info?.extensions;\n if (!extensions) {\n results.push(null);\n continue;\n }\n\n const metadataExt = extensions.find((ext) => ext.extension === \"tokenMetadata\");\n if (!metadataExt) {\n results.push(null);\n continue;\n }\n\n const metadata = metadataExt.state as {\n name?: string;\n uri?: string;\n additionalMetadata?: Array<[string, string]>;\n };\n\n const groupMemberExt = extensions.find((ext) => ext.extension === \"tokenGroupMember\");\n const memberState = groupMemberExt?.state as { memberNumber?: number } | undefined;\n\n const nonTransferableExt = extensions.find((ext) => ext.extension === \"nonTransferable\");\n\n // Get owner (still needs individual call due to ATA lookup)\n const owner = await this.getAgentOwner(mint);\n\n const additionalMetadata: Record<string, string> = {};\n if (metadata.additionalMetadata) {\n for (const [key, value] of metadata.additionalMetadata) {\n additionalMetadata[key] = value;\n }\n }\n\n results.push({\n mint,\n owner,\n name: metadata.name ?? \"\",\n uri: metadata.uri ?? \"\",\n memberNumber: BigInt(memberState?.memberNumber ?? 0),\n additionalMetadata,\n nonTransferable: !!nonTransferableExt,\n });\n } catch {\n results.push(null);\n }\n }\n\n return results;\n }\n\n /**\n * Transfer agent to new owner\n */\n async transferAgent(params: {\n payer: KeyPairSigner;\n owner: KeyPairSigner;\n mint: Address;\n newOwner: Address;\n }): Promise<{ signature: string }> {\n const { payer, owner, mint, newOwner } = params;\n\n const [sourceAta] = await findAssociatedTokenAddress(mint, owner.address);\n const [destAta] = await findAssociatedTokenAddress(mint, newOwner);\n\n // Create destination ATA if it doesn't exist (idempotent - won't fail if exists)\n const createAtaIx = getCreateAssociatedTokenIdempotentInstruction({\n payer,\n owner: newOwner,\n mint,\n ata: destAta,\n tokenProgram: TOKEN_2022_PROGRAM_ADDRESS,\n });\n\n const transferIx = getTransferInstruction({\n source: sourceAta,\n destination: destAta,\n authority: owner,\n amount: 1n,\n });\n\n const { value: latestBlockhash } = await this.rpc.getLatestBlockhash().send();\n\n const tx = pipe(\n createTransactionMessage({ version: 0 }),\n (msg) => setTransactionMessageFeePayer(payer.address, msg),\n (msg) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, msg),\n (msg) => appendTransactionMessageInstructions([createAtaIx, transferIx], msg),\n // Attach payer signer to fee payer (needed when payer !== owner)\n (msg) => addSignersToTransactionMessage([payer, owner], msg),\n );\n\n const signedTx = await signTransactionMessageWithSigners(tx);\n await this.sendAndConfirm(signedTx as SignedBlockhashTransaction, {\n commitment: \"confirmed\",\n });\n\n const signature = getSignatureFromTransaction(signedTx);\n return { signature: signature.toString() };\n }\n\n /**\n * Transfer agent with metadata update authority\n */\n async transferAgentWithAuthority(params: {\n payer: KeyPairSigner;\n owner: KeyPairSigner;\n mint: Address;\n newOwner: Address;\n }): Promise<{ signature: string }> {\n const { payer, owner, mint, newOwner } = params;\n\n const [sourceAta] = await findAssociatedTokenAddress(mint, owner.address);\n const [destAta] = await findAssociatedTokenAddress(mint, newOwner);\n\n const transferIx = getTransferInstruction({\n source: sourceAta,\n destination: destAta,\n authority: owner,\n amount: 1n,\n });\n\n const updateAuthorityIx = getUpdateTokenMetadataUpdateAuthorityInstruction({\n metadata: mint,\n updateAuthority: owner,\n newUpdateAuthority: newOwner,\n });\n\n const { value: latestBlockhash } = await this.rpc.getLatestBlockhash().send();\n\n const tx = pipe(\n createTransactionMessage({ version: 0 }),\n (msg) => setTransactionMessageFeePayer(payer.address, msg),\n (msg) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, msg),\n (msg) => appendTransactionMessageInstructions([transferIx, updateAuthorityIx], msg),\n // Attach payer signer to fee payer (needed when payer !== owner)\n (msg) => addSignersToTransactionMessage([payer, owner], msg),\n );\n\n const signedTx = await signTransactionMessageWithSigners(tx);\n await this.sendAndConfirm(signedTx as SignedBlockhashTransaction, {\n commitment: \"confirmed\",\n });\n\n const signature = getSignatureFromTransaction(signedTx);\n return { signature: signature.toString() };\n }\n\n /**\n * Get current owner of an agent\n */\n async getAgentOwner(mint: Address): Promise<Address> {\n const response = await this.rpc.getTokenLargestAccounts(mint, { commitment: \"confirmed\" }).send();\n\n if (!response.value || response.value.length === 0) {\n throw new Error(`No token accounts found for mint ${mint}`);\n }\n\n const holderAccount = response.value.find((acc: { address: string; amount: string }) => BigInt(acc.amount) > 0n);\n\n if (!holderAccount) {\n throw new Error(`No holder found for agent ${mint}`);\n }\n\n const tokenAccount = await fetchToken2022Token(this.rpc, address(holderAccount.address));\n\n return tokenAccount.data.owner;\n }\n\n /**\n * Get registry statistics\n */\n async getRegistryStats(): Promise<{\n groupMint: Address;\n authority: Address;\n totalAgents: bigint;\n isImmutable: boolean;\n }> {\n const [registryConfigAddress] = await findRegistryConfigPda();\n const registryConfig = await fetchRegistryConfig(this.rpc, registryConfigAddress);\n\n const isImmutable = registryConfig.data.authority === \"11111111111111111111111111111111\";\n\n return {\n groupMint: registryConfig.data.groupMint,\n authority: registryConfig.data.authority,\n totalAgents: registryConfig.data.totalAgents,\n isImmutable,\n };\n }\n\n /**\n * Get an agent by its member number (1-indexed).\n *\n * Uses the AgentIndex PDA which maps member numbers to agent mints,\n * enabling enumeration without external indexing.\n *\n * @param memberNumber - The agent's member number (1 to totalAgents)\n * @returns AgentIdentity or null if member number doesn't exist\n *\n * @example\n * ```typescript\n * const agent = await sati.getAgentByMemberNumber(1n);\n * if (agent) {\n * console.log(`First agent: ${agent.name}`);\n * }\n * ```\n */\n async getAgentByMemberNumber(memberNumber: bigint): Promise<AgentIdentity | null> {\n if (memberNumber < 1n) {\n return null;\n }\n\n const [indexPda] = await findAgentIndexPda(memberNumber);\n const maybeIndex = await fetchMaybeAgentIndex(this.rpc, indexPda);\n\n if (!maybeIndex.exists) {\n return null;\n }\n\n return this.loadAgent(maybeIndex.data.mint);\n }\n\n /**\n * List all registered agents with pagination.\n *\n * Uses AgentIndex PDAs for efficient enumeration without external indexing.\n * Member numbers are 1-indexed and sequential.\n *\n * @param options.limit - Maximum agents to return (default: 100)\n * @param options.offset - Starting member number, 1-indexed (default: 1)\n * @returns Array of AgentIdentity objects\n *\n * @example\n * ```typescript\n * // Get first 10 agents\n * const agents = await sati.listAllAgents({ limit: 10 });\n *\n * // Get next page\n * const page2 = await sati.listAllAgents({ limit: 10, offset: 11n });\n * ```\n */\n async listAllAgents(options?: { limit?: number; offset?: bigint }): Promise<AgentIdentity[]> {\n const limit = options?.limit ?? 100;\n const offset = options?.offset ?? 1n;\n\n if (offset < 1n) {\n return [];\n }\n\n const stats = await this.getRegistryStats();\n const totalAgents = stats.totalAgents;\n\n if (totalAgents === 0n || offset > totalAgents) {\n return [];\n }\n\n // Calculate end member number (inclusive)\n const end = offset + BigInt(limit) - 1n > totalAgents ? totalAgents : offset + BigInt(limit) - 1n;\n\n // Derive all AgentIndex PDAs for the range\n const pdas: Address[] = [];\n for (let i = offset; i <= end; i++) {\n const [pda] = await findAgentIndexPda(i);\n pdas.push(pda);\n }\n\n // Batch fetch all AgentIndex accounts\n const indexes = await fetchAllMaybeAgentIndex(this.rpc, pdas);\n\n // Load agent identities for existing indexes\n const agents: AgentIdentity[] = [];\n for (const index of indexes) {\n if (index.exists) {\n const agent = await this.loadAgent(index.data.mint);\n if (agent) {\n agents.push(agent);\n }\n }\n }\n\n return agents;\n }\n\n /**\n * List agents owned by a specific wallet\n */\n async listAgentsByOwner(owner: Address): Promise<AgentIdentity[]> {\n const stats = await this.getRegistryStats();\n const groupMint = stats.groupMint;\n\n const tokenAccountsResult = await this.rpc\n .getTokenAccountsByOwner(\n owner,\n { programId: address(\"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\") },\n { encoding: \"jsonParsed\" },\n )\n .send();\n\n const potentialMints: Address[] = [];\n\n for (const { account } of tokenAccountsResult.value) {\n const parsed = account.data as {\n parsed?: {\n info?: {\n mint?: string;\n tokenAmount?: { amount: string; decimals: number };\n };\n };\n };\n\n const info = parsed.parsed?.info;\n if (!info?.mint || !info?.tokenAmount) continue;\n\n if (info.tokenAmount.amount !== \"1\" || info.tokenAmount.decimals !== 0) {\n continue;\n }\n\n potentialMints.push(info.mint as Address);\n }\n\n if (potentialMints.length === 0) {\n return [];\n }\n\n const mintAccountsResult = await this.rpc.getMultipleAccounts(potentialMints, { encoding: \"jsonParsed\" }).send();\n\n const agents: AgentIdentity[] = [];\n\n for (let i = 0; i < potentialMints.length; i++) {\n const mintAccount = mintAccountsResult.value[i];\n if (!mintAccount) continue;\n\n const parsed = mintAccount.data as {\n parsed?: {\n info?: {\n extensions?: Array<{\n extension: string;\n state: Record<string, unknown>;\n }>;\n };\n };\n };\n\n const extensions = parsed.parsed?.info?.extensions;\n if (!extensions) continue;\n\n const groupMemberExt = extensions.find((ext) => ext.extension === \"tokenGroupMember\");\n if (!groupMemberExt) continue;\n\n const memberState = groupMemberExt.state as {\n group?: string;\n memberNumber?: number;\n };\n if (memberState.group !== groupMint) continue;\n\n const metadataExt = extensions.find((ext) => ext.extension === \"tokenMetadata\");\n if (!metadataExt) continue;\n\n const metadataState = metadataExt.state as {\n name?: string;\n symbol?: string;\n uri?: string;\n additionalMetadata?: Array<[string, string]>;\n };\n\n const nonTransferableExt = extensions.find((ext) => ext.extension === \"nonTransferable\");\n\n const additionalMetadata: Record<string, string> = {};\n if (metadataState.additionalMetadata) {\n for (const [key, value] of metadataState.additionalMetadata) {\n additionalMetadata[key] = value;\n }\n }\n\n agents.push({\n mint: potentialMints[i],\n owner,\n name: metadataState.name ?? \"Unknown\",\n uri: metadataState.uri ?? \"\",\n memberNumber: BigInt(memberState.memberNumber ?? 0),\n additionalMetadata,\n nonTransferable: !!nonTransferableExt,\n });\n }\n\n return agents;\n }\n\n /**\n * Update agent metadata\n */\n async updateAgentMetadata(params: UpdateAgentMetadataParams): Promise<UpdateAgentMetadataResult> {\n const { payer, owner, mint, updates } = params;\n\n type UpdateInstruction = ReturnType<typeof getUpdateTokenMetadataFieldInstruction>;\n const ixList: UpdateInstruction[] = [];\n\n if (updates.name !== undefined) {\n ixList.push(\n getUpdateTokenMetadataFieldInstruction({\n metadata: mint,\n updateAuthority: owner,\n field: tokenMetadataField(\"Name\"),\n value: updates.name,\n }),\n );\n }\n\n if (updates.uri !== undefined) {\n ixList.push(\n getUpdateTokenMetadataFieldInstruction({\n metadata: mint,\n updateAuthority: owner,\n field: tokenMetadataField(\"Uri\"),\n value: updates.uri,\n }),\n );\n }\n\n if (updates.additionalMetadata) {\n for (const [key, value] of updates.additionalMetadata) {\n ixList.push(\n getUpdateTokenMetadataFieldInstruction({\n metadata: mint,\n updateAuthority: owner,\n field: tokenMetadataField(\"Key\", [key]),\n value,\n }),\n );\n }\n }\n\n if (ixList.length === 0) {\n throw new Error(\"No updates specified\");\n }\n\n const { value: latestBlockhash } = await this.rpc.getLatestBlockhash().send();\n\n const tx = pipe(\n createTransactionMessage({ version: 0 }),\n (msg) => setTransactionMessageFeePayer(payer.address, msg),\n (msg) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, msg),\n (msg) => appendTransactionMessageInstructions(ixList, msg),\n // Attach payer signer to fee payer (needed when payer !== owner)\n (msg) => addSignersToTransactionMessage([payer, owner], msg),\n );\n\n const signedTx = await signTransactionMessageWithSigners(tx);\n await this.sendAndConfirm(signedTx as SignedBlockhashTransaction, {\n commitment: \"confirmed\",\n });\n\n const signature = getSignatureFromTransaction(signedTx);\n return { signature: signature.toString() };\n }\n\n /**\n * Link an EVM address to a SATI agent via secp256k1 signature verification.\n * Proves the agent owner controls the specified EVM address.\n *\n * Use cases:\n * - Link ERC-8004 registered agents (Ethereum) to SATI identity\n * - Prove ownership of any EVM EOA for cross-chain identity\n *\n * @example\n * ```typescript\n * // 1. Build the message hash\n * const evmAddressBytes = hexToBytes(\"742d35Cc6634C0532925a3b844Bc9e7595f0bEb7\");\n * const messageHash = computeEvmLinkHash(agentMint, evmAddressBytes, \"eip155:1\");\n *\n * // 2. Sign with Ethereum wallet (e.g., using ethers.js or viem)\n * const signature = await wallet.signMessage(messageHash);\n *\n * // 3. Link on SATI\n * await sati.linkEvmAddress({\n * payer: keypair,\n * agentMint: \"AgentMint...\",\n * evmAddress: \"0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb7\",\n * chainId: \"eip155:1\",\n * signature: signatureBytes,\n * recoveryId: 0,\n * });\n * ```\n */\n async linkEvmAddress(params: {\n /** Payer for transaction fees */\n payer: KeyPairSigner;\n /** Agent NFT mint address */\n agentMint: Address;\n /** EVM address (0x-prefixed hex string) */\n evmAddress: string;\n /** CAIP-2 chain identifier (e.g., \"eip155:1\", \"eip155:8453\") */\n chainId: string;\n /** secp256k1 signature (64 bytes: r || s) */\n signature: Uint8Array;\n /** Recovery ID (0 or 1) */\n recoveryId: number;\n }): Promise<LinkEvmAddressResult> {\n const { payer, agentMint, evmAddress, chainId, signature, recoveryId } = params;\n\n // Parse EVM address (remove 0x prefix if present)\n const evmAddressClean = evmAddress.startsWith(\"0x\") ? evmAddress.slice(2) : evmAddress;\n const hexPairs = evmAddressClean.match(/.{2}/g);\n if (!hexPairs || hexPairs.length !== 20) {\n throw new Error(\"Invalid EVM address format or length\");\n }\n const evmAddressBytes = new Uint8Array(hexPairs.map((byte) => parseInt(byte, 16)));\n if (signature.length !== 64) {\n throw new Error(\"Signature must be 64 bytes\");\n }\n if (recoveryId !== 0 && recoveryId !== 1) {\n throw new Error(\"Recovery ID must be 0 or 1\");\n }\n\n // Find owner's ATA\n const [ata] = await findAssociatedTokenAddress(agentMint, payer.address);\n\n // Build instruction\n const ix = getLinkEvmAddressInstruction({\n owner: payer,\n agentMint,\n ata,\n evmAddress: evmAddressBytes,\n chainId,\n signature,\n recoveryId,\n });\n\n // Send transaction\n const txSig = await this.sendSingleTransaction([ix], payer);\n return { signature: txSig };\n }\n\n /**\n * Build the EVM link hash that the EVM wallet should sign.\n * This is a convenience wrapper around computeEvmLinkHash.\n */\n buildEvmLinkHash(agentMint: Address, evmAddress: Uint8Array, chainId: string): Uint8Array {\n return computeEvmLinkHash(agentMint, evmAddress, chainId);\n }\n\n // ============================================================\n // SCHEMAS\n // ============================================================\n\n /**\n * Register a schema configuration\n */\n async registerSchemaConfig(params: {\n payer: KeyPairSigner;\n authority: KeyPairSigner;\n sasSchema: Address;\n signatureMode: SignatureMode;\n storageType: StorageType;\n closeable: boolean;\n /** Schema name for SIWS messages (e.g., \"Feedback\", \"Validation\") */\n name: string;\n /** Schema for delegation verification (null = owner only) */\n delegationSchema?: Address | null;\n }): Promise<{ signature: string }> {\n const { payer, authority, sasSchema, signatureMode, storageType, closeable, name, delegationSchema } = params;\n\n const [schemaConfigPda] = await findSchemaConfigPda(sasSchema);\n\n const registerIx = await getRegisterSchemaConfigInstructionAsync({\n payer,\n authority,\n sasSchema,\n schemaConfig: schemaConfigPda,\n signatureMode,\n storageType,\n delegationSchema: delegationSchema ?? null,\n closeable,\n name,\n });\n\n const { value: latestBlockhash } = await this.rpc.getLatestBlockhash().send();\n\n const tx = pipe(\n createTransactionMessage({ version: 0 }),\n (msg) => setTransactionMessageFeePayer(payer.address, msg),\n (msg) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, msg),\n (msg) => appendTransactionMessageInstruction(registerIx, msg),\n );\n\n const signedTx = await signTransactionMessageWithSigners(tx);\n await this.sendAndConfirm(signedTx as SignedBlockhashTransaction, {\n commitment: \"confirmed\",\n });\n\n const signature = getSignatureFromTransaction(signedTx);\n return { signature: signature.toString() };\n }\n\n /**\n * Get schema configuration\n */\n async getSchemaConfig(sasSchema: Address): Promise<{\n signatureMode: SignatureMode;\n storageType: StorageType;\n closeable: boolean;\n } | null> {\n const [schemaConfigPda] = await findSchemaConfigPda(sasSchema);\n\n try {\n const schemaConfig = await fetchSchemaConfig(this.rpc, schemaConfigPda);\n\n const signatureMode = schemaConfig.data.signatureMode as unknown as SignatureMode;\n const storageType = schemaConfig.data.storageType as unknown as StorageType;\n\n return {\n signatureMode,\n storageType,\n closeable: schemaConfig.data.closeable,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes(\"could not find account\") || message.includes(\"Account not found\")) {\n return null;\n }\n throw error;\n }\n }\n\n // ============================================================\n // COMPRESSED ATTESTATIONS (Light Protocol)\n // ============================================================\n\n /**\n * Create a Feedback attestation (compressed storage)\n *\n * Note: agentMint is the agent's MINT address (stable Token-2022 NFT identity).\n * The agentSignature.pubkey should be the NFT owner who signed.\n * On-chain verification ensures the owner holds the NFT via ATA.\n *\n * @throws Error if agentMint is not a registered SATI agent mint\n * @throws Error if content exceeds size limit for the signature mode\n * @throws Error if counterpartySignature is provided without counterpartyMessage\n */\n async createFeedback(params: CreateFeedbackParams): Promise<AttestationResult> {\n const {\n payer,\n sasSchema,\n taskRef,\n agentMint,\n counterparty,\n dataHash,\n contentType = ContentType.None,\n outcome,\n content = new Uint8Array(0),\n agentSignature,\n counterpartySignature,\n counterpartyMessage,\n lookupTableAddress,\n } = params;\n\n // Validate counterpartyMessage is provided when counterpartySignature is provided\n if (counterpartySignature && !counterpartyMessage) {\n throw new Error(\n \"counterpartyMessage is required when counterpartySignature is provided. \" +\n \"Use buildCounterpartyMessage() to generate the SIWS message bytes.\",\n );\n }\n\n // Validate content size based on signature mode\n // If counterpartySignature is provided, it's DualSignature mode\n const signatureMode = counterpartySignature ? SignatureMode.DualSignature : SignatureMode.CounterpartySigned;\n validateContentSize(content, signatureMode);\n\n // Validate agentMint is a registered agent mint\n await this.validateAgentMintIsRegisteredAgent(agentMint);\n\n const feedbackData: FeedbackData = {\n taskRef,\n agentMint,\n counterparty,\n dataHash,\n contentType,\n outcome,\n content,\n };\n const data = serializeFeedback(feedbackData);\n\n // Signatures for Ed25519 instruction (extracted by program, not passed as params)\n const signaturesForEd25519 = [\n {\n pubkey: agentSignature.pubkey,\n sig: assertSignature64(agentSignature.signature),\n },\n ];\n\n if (counterpartySignature) {\n signaturesForEd25519.push({\n pubkey: counterpartySignature.pubkey,\n sig: assertSignature64(counterpartySignature.signature),\n });\n }\n\n const [schemaConfigPda] = await findSchemaConfigPda(sasSchema);\n\n // Detect CounterpartySigned mode: counterpartyMessage provided but no counterpartySignature\n // In this mode, the \"agentSignature\" actually contains the counterparty's SIWS signature,\n // and we don't need to verify agent NFT ownership (counterparty doesn't own the agent)\n const isCounterpartySigned = counterpartyMessage && !counterpartySignature;\n\n // Derive agent's ATA only for modes that require agent ownership verification\n // (DualSignature and AgentOwnerSigned modes)\n let agentAta: Address | undefined;\n if (!isCounterpartySigned) {\n // agentMint is the agent's MINT address (identity), NOT a wallet address\n [agentAta] = await findAssociatedTokenAddress(\n agentMint, // mint address (agent identity)\n agentSignature.pubkey, // owner who signed\n );\n }\n\n const light = this.getLightClient();\n\n const addressEncoder = getAddressEncoder();\n const nonce = computeAttestationNonce(taskRef, sasSchema, agentMint, counterparty);\n const sasSchemaBytes = new Uint8Array(addressEncoder.encode(sasSchema));\n const agentMintBytesForSeed = new Uint8Array(addressEncoder.encode(agentMint));\n const seeds = [new TextEncoder().encode(\"attestation\"), sasSchemaBytes, agentMintBytesForSeed, nonce];\n\n const {\n address: derivedAddress,\n proof: proofResult,\n addressTreeInfo: packedAddressTreeInfo,\n outputStateTreeIndex,\n remainingAccounts,\n } = await light.prepareCreate(seeds);\n\n const proof: ValidityProofArgs = proofResult.compressedProof\n ? [\n {\n a: new Uint8Array(proofResult.compressedProof.a),\n b: new Uint8Array(proofResult.compressedProof.b),\n c: new Uint8Array(proofResult.compressedProof.c),\n },\n ]\n : [null];\n\n const addressTreeInfo: PackedAddressTreeInfoArgs = {\n addressMerkleTreePubkeyIndex: packedAddressTreeInfo.addressMerkleTreePubkeyIndex,\n addressQueuePubkeyIndex: packedAddressTreeInfo.addressQueuePubkeyIndex,\n rootIndex: packedAddressTreeInfo.rootIndex,\n };\n\n const baseCreateIx = await getCreateCompressedAttestationInstructionAsync({\n payer,\n schemaConfig: schemaConfigPda,\n agentAta, // undefined for CounterpartySigned mode, required for other modes\n tokenProgram: agentAta ? TOKEN_2022_PROGRAM_ADDRESS : undefined, // Only needed when verifying ATA\n agentMint, // Required for Solscan visibility\n program: SATI_PROGRAM_ADDRESS,\n data,\n outputStateTreeIndex,\n proof,\n addressTreeInfo,\n });\n\n const createIx = {\n ...baseCreateIx,\n accounts: [\n ...baseCreateIx.accounts,\n ...remainingAccounts.map((acc) => ({\n address: address(acc.pubkey.toBase58()),\n role: acc.isWritable ? (acc.isSigner ? 3 : 1) : acc.isSigner ? 2 : 0,\n })),\n ],\n };\n\n // Build Ed25519 entries based on signature mode\n const interactionHash = computeInteractionHash(sasSchema, taskRef, dataHash);\n const ed25519Entries: { publicKey: Uint8Array; message: Uint8Array; signature: Uint8Array }[] = [];\n\n if (counterpartySignature && counterpartyMessage) {\n // DualSignature mode: agent signs interaction hash, counterparty signs SIWS\n ed25519Entries.push({\n publicKey: new Uint8Array(addressEncoder.encode(agentSignature.pubkey)),\n message: interactionHash,\n signature: agentSignature.signature,\n });\n ed25519Entries.push({\n publicKey: new Uint8Array(addressEncoder.encode(counterpartySignature.pubkey)),\n message: counterpartyMessage,\n signature: counterpartySignature.signature,\n });\n } else if (counterpartyMessage && !counterpartySignature) {\n // CounterpartySigned mode: counterparty signs SIWS message (passed as agentSignature)\n ed25519Entries.push({\n publicKey: new Uint8Array(addressEncoder.encode(agentSignature.pubkey)),\n message: counterpartyMessage,\n signature: agentSignature.signature,\n });\n } else {\n // AgentOwnerSigned mode: agent owner signs interaction hash\n ed25519Entries.push({\n publicKey: new Uint8Array(addressEncoder.encode(agentSignature.pubkey)),\n message: interactionHash,\n signature: agentSignature.signature,\n });\n }\n\n const ed25519Ix = createBatchEd25519Instruction(ed25519Entries);\n\n const signature = await this.buildAndSendTransaction([ed25519Ix, createIx], payer, lookupTableAddress);\n\n return {\n address: address(derivedAddress.toBase58()),\n signature,\n };\n }\n\n /**\n * Build a Feedback transaction without signing or sending\n *\n * Note: agentMint is the agent's MINT address (stable Token-2022 NFT identity).\n * The agentSignature.pubkey should be the NFT owner who signed.\n * On-chain verification ensures the owner holds the NFT via ATA.\n *\n * @throws Error if agentMint is not a registered SATI agent mint\n * @throws Error if content exceeds size limit for the signature mode\n * @throws Error if counterpartySignature is provided without counterpartyMessage\n */\n async buildFeedbackTransaction(params: BuildFeedbackParams): Promise<BuiltTransaction> {\n const {\n payer,\n sasSchema,\n taskRef,\n agentMint,\n counterparty,\n dataHash,\n contentType = ContentType.None,\n outcome,\n content = new Uint8Array(0),\n agentSignature,\n counterpartySignature,\n counterpartyMessage,\n lookupTableAddress,\n } = params;\n\n // Validate counterpartyMessage is provided when counterpartySignature is provided\n if (counterpartySignature && !counterpartyMessage) {\n throw new Error(\n \"counterpartyMessage is required when counterpartySignature is provided. \" +\n \"Use buildCounterpartyMessage() to generate the SIWS message bytes.\",\n );\n }\n\n // Validate content size based on signature mode\n // If counterpartySignature is provided, it's DualSignature mode\n const signatureMode = counterpartySignature ? SignatureMode.DualSignature : SignatureMode.CounterpartySigned;\n validateContentSize(content, signatureMode);\n\n // Validate agentMint is a registered agent mint\n await this.validateAgentMintIsRegisteredAgent(agentMint);\n\n const feedbackData: FeedbackData = {\n taskRef,\n agentMint,\n counterparty,\n dataHash,\n contentType,\n outcome,\n content,\n };\n const data = serializeFeedback(feedbackData);\n\n // Signatures for Ed25519 instruction (extracted by program, not passed as params)\n const signaturesForEd25519 = [\n {\n pubkey: agentSignature.pubkey,\n sig: assertSignature64(agentSignature.signature),\n },\n ];\n\n if (counterpartySignature) {\n signaturesForEd25519.push({\n pubkey: counterpartySignature.pubkey,\n sig: assertSignature64(counterpartySignature.signature),\n });\n }\n\n const [schemaConfigPda] = await findSchemaConfigPda(sasSchema);\n\n // Detect CounterpartySigned mode: counterpartyMessage provided but no counterpartySignature\n // In this mode, the \"agentSignature\" actually contains the counterparty's SIWS signature,\n // and we don't need to verify agent NFT ownership (counterparty doesn't own the agent)\n const isCounterpartySigned = counterpartyMessage && !counterpartySignature;\n\n // Derive agent's ATA only for modes that require agent ownership verification\n // (DualSignature and AgentOwnerSigned modes)\n let agentAta: Address | undefined;\n if (!isCounterpartySigned) {\n // agentMint is the agent's MINT address (identity), NOT a wallet address\n [agentAta] = await findAssociatedTokenAddress(\n agentMint, // mint address (agent identity)\n agentSignature.pubkey, // owner who signed\n );\n }\n\n const light = this.getLightClient();\n\n const addressEncoder = getAddressEncoder();\n const nonce = computeAttestationNonce(taskRef, sasSchema, agentMint, counterparty);\n const sasSchemaBytes = new Uint8Array(addressEncoder.encode(sasSchema));\n const agentMintBytesForSeed = new Uint8Array(addressEncoder.encode(agentMint));\n const seeds = [new TextEncoder().encode(\"attestation\"), sasSchemaBytes, agentMintBytesForSeed, nonce];\n\n const {\n address: derivedAddress,\n proof: proofResult,\n addressTreeInfo: packedAddressTreeInfo,\n outputStateTreeIndex,\n remainingAccounts,\n } = await light.prepareCreate(seeds);\n\n const proof: ValidityProofArgs = proofResult.compressedProof\n ? [\n {\n a: new Uint8Array(proofResult.compressedProof.a),\n b: new Uint8Array(proofResult.compressedProof.b),\n c: new Uint8Array(proofResult.compressedProof.c),\n },\n ]\n : [null];\n\n const addressTreeInfo: PackedAddressTreeInfoArgs = {\n addressMerkleTreePubkeyIndex: packedAddressTreeInfo.addressMerkleTreePubkeyIndex,\n addressQueuePubkeyIndex: packedAddressTreeInfo.addressQueuePubkeyIndex,\n rootIndex: packedAddressTreeInfo.rootIndex,\n };\n\n const baseCreateIx = await getCreateCompressedAttestationInstructionAsync({\n payer: { address: payer } as KeyPairSigner,\n schemaConfig: schemaConfigPda,\n agentAta, // undefined for CounterpartySigned mode, required for other modes\n tokenProgram: agentAta ? TOKEN_2022_PROGRAM_ADDRESS : undefined, // Only needed when verifying ATA\n agentMint, // Required for Solscan visibility\n program: SATI_PROGRAM_ADDRESS,\n data,\n outputStateTreeIndex,\n proof,\n addressTreeInfo,\n });\n\n const createIx = {\n ...baseCreateIx,\n accounts: [\n ...baseCreateIx.accounts,\n ...remainingAccounts.map((acc) => ({\n address: address(acc.pubkey.toBase58()),\n role: acc.isWritable ? (acc.isSigner ? 3 : 1) : acc.isSigner ? 2 : 0,\n })),\n ],\n };\n\n // Build Ed25519 entries based on signature mode\n const interactionHash = computeInteractionHash(sasSchema, taskRef, dataHash);\n const ed25519Entries: { publicKey: Uint8Array; message: Uint8Array; signature: Uint8Array }[] = [];\n\n if (counterpartySignature && counterpartyMessage) {\n // DualSignature mode: agent signs interaction hash, counterparty signs SIWS\n ed25519Entries.push({\n publicKey: new Uint8Array(addressEncoder.encode(agentSignature.pubkey)),\n message: interactionHash,\n signature: agentSignature.signature,\n });\n ed25519Entries.push({\n publicKey: new Uint8Array(addressEncoder.encode(counterpartySignature.pubkey)),\n message: counterpartyMessage,\n signature: counterpartySignature.signature,\n });\n } else if (counterpartyMessage && !counterpartySignature) {\n // CounterpartySigned mode: counterparty signs SIWS message (passed as agentSignature)\n ed25519Entries.push({\n publicKey: new Uint8Array(addressEncoder.encode(agentSignature.pubkey)),\n message: counterpartyMessage,\n signature: agentSignature.signature,\n });\n } else {\n // AgentOwnerSigned mode: agent owner signs interaction hash\n ed25519Entries.push({\n publicKey: new Uint8Array(addressEncoder.encode(agentSignature.pubkey)),\n message: interactionHash,\n signature: agentSignature.signature,\n });\n }\n\n const ed25519Ix = createBatchEd25519Instruction(ed25519Entries);\n\n const { value: latestBlockhash } = await this.rpc.getLatestBlockhash().send();\n\n const computeBudgetIx = getSetComputeUnitLimitInstruction({\n units: 400_000,\n });\n\n const baseTxMessage = pipe(\n createTransactionMessage({ version: 0 }),\n (msg) => setTransactionMessageFeePayer(payer, msg),\n (msg) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, msg),\n (msg) => appendTransactionMessageInstruction(computeBudgetIx, msg),\n (msg) => appendTransactionMessageInstructions([ed25519Ix, createIx], msg),\n );\n\n const finalTxMessage = await (async () => {\n if (!lookupTableAddress) {\n return baseTxMessage;\n }\n const lookupTableAccount = await fetchAddressLookupTable(this.rpc, lookupTableAddress);\n const addressesByLookupTable: AddressesByLookupTableAddress = {\n [lookupTableAddress]: lookupTableAccount.data.addresses,\n };\n return compressTransactionMessageUsingAddressLookupTables(baseTxMessage, addressesByLookupTable);\n })();\n\n const compiledTx = compileTransaction(finalTxMessage);\n\n const messageBytes = compiledTx.messageBytes as unknown as Uint8Array;\n const binaryString = Array.from(messageBytes)\n .map((byte) => String.fromCharCode(byte))\n .join(\"\");\n const messageBase64 = btoa(binaryString);\n\n return {\n attestationAddress: address(derivedAddress.toBase58()),\n messageBytes: messageBase64,\n signers: Object.keys(compiledTx.signatures) as Address[],\n blockhash: latestBlockhash.blockhash,\n lastValidBlockHeight: latestBlockhash.lastValidBlockHeight,\n };\n }\n\n /**\n * Create a Validation attestation (compressed storage)\n *\n * Note: agentMint is the agent's MINT address (stable identity).\n * The agentSignature.pubkey should be the NFT owner who signed.\n * On-chain verification ensures the owner holds the NFT via ATA.\n *\n * @throws Error if agentMint is not a registered SATI agent mint\n * @throws Error if content exceeds size limit for DualSignature mode (~70 bytes)\n * @throws Error if counterpartyMessage is not provided\n */\n async createValidation(params: CreateValidationParams): Promise<AttestationResult> {\n const {\n payer,\n sasSchema,\n taskRef,\n agentMint,\n counterparty,\n dataHash,\n outcome,\n contentType = ContentType.None,\n content = new Uint8Array(0),\n agentSignature,\n validatorSignature,\n counterpartyMessage,\n lookupTableAddress,\n } = params;\n\n // Validation attestations are always DualSignature, so counterpartyMessage is required\n if (!counterpartyMessage) {\n throw new Error(\n \"counterpartyMessage is required for Validation attestations. \" +\n \"Use buildCounterpartyMessage() to generate the SIWS message bytes.\",\n );\n }\n\n // Validation attestations are always DualSignature (agent + validator)\n validateContentSize(content, SignatureMode.DualSignature);\n\n // Validate agentMint is a registered agent mint\n await this.validateAgentMintIsRegisteredAgent(agentMint);\n\n const validationData: ValidationData = {\n taskRef,\n agentMint,\n counterparty,\n dataHash,\n outcome,\n contentType,\n content,\n };\n const data = serializeValidation(validationData);\n\n const [schemaConfigPda] = await findSchemaConfigPda(sasSchema);\n\n // Derive agent's ATA - verifies signer (agentSignature.pubkey) owns the agent NFT (agentMint)\n // agentMint is the agent's MINT address (identity), NOT a wallet address\n const [agentAta] = await findAssociatedTokenAddress(\n agentMint, // mint address (agent identity)\n agentSignature.pubkey, // owner who signed\n );\n\n const light = this.getLightClient();\n\n const addressEncoder = getAddressEncoder();\n const nonce = computeAttestationNonce(taskRef, sasSchema, agentMint, counterparty);\n const seeds = [\n new TextEncoder().encode(\"attestation\"),\n new Uint8Array(addressEncoder.encode(sasSchema)),\n new Uint8Array(addressEncoder.encode(agentMint)),\n nonce,\n ];\n\n const {\n address: derivedAddress,\n proof: proofResult,\n addressTreeInfo: packedAddressTreeInfo,\n outputStateTreeIndex,\n remainingAccounts,\n } = await light.prepareCreate(seeds);\n\n const proof: ValidityProofArgs = proofResult.compressedProof\n ? [\n {\n a: new Uint8Array(proofResult.compressedProof.a),\n b: new Uint8Array(proofResult.compressedProof.b),\n c: new Uint8Array(proofResult.compressedProof.c),\n },\n ]\n : [null];\n\n const addressTreeInfo: PackedAddressTreeInfoArgs = {\n addressMerkleTreePubkeyIndex: packedAddressTreeInfo.addressMerkleTreePubkeyIndex,\n addressQueuePubkeyIndex: packedAddressTreeInfo.addressQueuePubkeyIndex,\n rootIndex: packedAddressTreeInfo.rootIndex,\n };\n\n const baseCreateIx = await getCreateCompressedAttestationInstructionAsync({\n payer,\n schemaConfig: schemaConfigPda,\n agentAta, // Proves signer owns the agent NFT\n tokenProgram: TOKEN_2022_PROGRAM_ADDRESS, // Agent NFTs use Token-2022\n agentMint, // Required for Solscan visibility\n program: SATI_PROGRAM_ADDRESS,\n data,\n outputStateTreeIndex,\n proof,\n addressTreeInfo,\n });\n\n const createIx = {\n ...baseCreateIx,\n accounts: [\n ...baseCreateIx.accounts,\n ...remainingAccounts.map((acc) => ({\n address: address(acc.pubkey.toBase58()),\n role: acc.isWritable ? (acc.isSigner ? 3 : 1) : acc.isSigner ? 2 : 0,\n })),\n ],\n };\n\n // Agent signs interaction hash (blind commitment to task + data)\n const interactionHash = computeInteractionHash(sasSchema, taskRef, dataHash);\n\n const ed25519Entries = [\n {\n publicKey: new Uint8Array(addressEncoder.encode(agentSignature.pubkey)),\n message: interactionHash,\n signature: agentSignature.signature,\n },\n ];\n\n // Validator signs human-readable SIWS message\n if (counterpartyMessage) {\n ed25519Entries.push({\n publicKey: new Uint8Array(addressEncoder.encode(validatorSignature.pubkey)),\n message: counterpartyMessage,\n signature: validatorSignature.signature,\n });\n }\n\n const ed25519Ix = createBatchEd25519Instruction(ed25519Entries);\n\n const signature = await this.buildAndSendTransaction([ed25519Ix, createIx], payer, lookupTableAddress);\n\n return {\n address: address(derivedAddress.toBase58()),\n signature,\n };\n }\n\n /**\n * Close a compressed attestation (Light Protocol)\n */\n async closeCompressedAttestation(params: CloseCompressedAttestationParams): Promise<CloseAttestationResult> {\n const { payer, counterparty, sasSchema, attestationAddress, lookupTableAddress } = params;\n\n const light = this.getLightClient();\n const parsedAttestation = await light.getAttestationByAddress(attestationAddress);\n\n if (!parsedAttestation) {\n throw new Error(`Attestation not found at address ${attestationAddress}`);\n }\n\n const addressEncoder = getAddressEncoder();\n const counterpartyBytes = parsedAttestation.attestation.data.slice(64, 96);\n const expectedCounterpartyBytes = new Uint8Array(addressEncoder.encode(counterparty.address));\n\n const isCounterparty =\n counterpartyBytes.length === expectedCounterpartyBytes.length &&\n counterpartyBytes.every((byte, i) => byte === expectedCounterpartyBytes[i]);\n\n if (!isCounterparty) {\n throw new Error(\"Signer must be the counterparty from the original attestation\");\n }\n\n const mutationResult = await light.getMutationProof(parsedAttestation.raw);\n\n const accountMeta: CompressedAccountMetaArgs = {\n treeInfo: {\n rootIndex: mutationResult.stateTreeInfo.rootIndex,\n proveByIndex: true,\n merkleTreePubkeyIndex: mutationResult.stateTreeInfo.merkleTreePubkeyIndex,\n queuePubkeyIndex: mutationResult.stateTreeInfo.queuePubkeyIndex,\n leafIndex: mutationResult.stateTreeInfo.leafIndex,\n },\n address: parsedAttestation.address,\n outputStateTreeIndex: mutationResult.outputStateTreeIndex,\n };\n\n const proof: ValidityProofArgs = mutationResult.proof.compressedProof\n ? [\n {\n a: new Uint8Array(mutationResult.proof.compressedProof.a),\n b: new Uint8Array(mutationResult.proof.compressedProof.b),\n c: new Uint8Array(mutationResult.proof.compressedProof.c),\n },\n ]\n : [null];\n\n const [schemaConfigPda] = await findSchemaConfigPda(sasSchema);\n\n const baseCloseIx = await getCloseCompressedAttestationInstructionAsync({\n signer: counterparty,\n schemaConfig: schemaConfigPda,\n agentMint: parsedAttestation.attestation.agentMint,\n program: SATI_PROGRAM_ADDRESS,\n currentData: parsedAttestation.attestation.data,\n numSignatures: parsedAttestation.attestation.numSignatures,\n signature1: parsedAttestation.attestation.signature1,\n signature2: parsedAttestation.attestation.signature2,\n address: attestationAddress,\n proof,\n accountMeta,\n });\n\n const closeIx = {\n ...baseCloseIx,\n accounts: [\n ...baseCloseIx.accounts,\n ...mutationResult.remainingAccounts.map((acc) => ({\n address: address(acc.pubkey.toBase58()),\n role: acc.isWritable ? (acc.isSigner ? 3 : 1) : acc.isSigner ? 2 : 0,\n })),\n ],\n };\n\n const signature = await this.buildAndSendTransaction([closeIx], payer, lookupTableAddress);\n\n return { signature };\n }\n\n // ============================================================\n // REGULAR ATTESTATIONS (SAS)\n // ============================================================\n\n /**\n * Create a ReputationScoreV3 attestation (regular SAS storage)\n *\n * @throws Error if agentMint is not a registered SATI agent mint\n */\n async createReputationScore(params: CreateReputationScoreParams): Promise<AttestationResult> {\n const {\n payer,\n provider,\n providerSignature,\n sasSchema,\n satiCredential,\n agentMint,\n taskRef,\n dataHash,\n outcome,\n contentType = ContentType.None,\n content = new Uint8Array(0),\n expiry = 0,\n } = params;\n\n if (providerSignature.length !== 64) {\n throw new Error(\"Provider signature must be 64 bytes\");\n }\n\n if (contentType !== ContentType.None && content.length === 0) {\n throw new Error(`content is required when contentType is ${getContentTypeLabel(contentType)}`);\n }\n\n // Validate agentMint is a registered agent mint\n await this.validateAgentMintIsRegisteredAgent(agentMint);\n\n const nonce = computeReputationNonce(provider, agentMint);\n\n const reputationData: ReputationScoreData = {\n taskRef,\n agentMint,\n counterparty: provider,\n dataHash,\n outcome,\n contentType,\n content,\n };\n const data = serializeReputationScore(reputationData);\n\n // Provider signs interaction hash (same as agent signature in dual-sig)\n const messageHash = computeInteractionHash(sasSchema, taskRef, dataHash);\n\n const [attestationPda] = await deriveReputationAttestationPda(satiCredential, sasSchema, nonce);\n\n const [schemaConfigPda] = await findSchemaConfigPda(sasSchema);\n\n const addressEncoder = getAddressEncoder();\n const ed25519Ix = createBatchEd25519Instruction([\n {\n publicKey: new Uint8Array(addressEncoder.encode(provider)),\n message: messageHash,\n signature: providerSignature,\n },\n ]);\n\n const createIx = await getCreateRegularAttestationInstructionAsync({\n payer,\n schemaConfig: schemaConfigPda,\n agentMint,\n satiCredential,\n sasSchema,\n attestation: attestationPda,\n program: SATI_PROGRAM_ADDRESS,\n data,\n expiry: BigInt(expiry),\n });\n\n const signature = await this.buildAndSendTransaction([ed25519Ix, createIx], payer);\n\n return {\n address: attestationPda,\n signature,\n };\n }\n\n /**\n * Update (or create) a ReputationScoreV3 attestation.\n *\n * High-level method that auto-computes deterministic taskRef and zero dataHash\n * per the spec. If a score already exists for this (provider, agent) pair,\n * closes it first and creates a new one at the same PDA in a single transaction.\n */\n async updateReputationScore(params: UpdateReputationScoreParams): Promise<AttestationResult> {\n const {\n payer,\n provider,\n sasSchema,\n satiCredential,\n agentMint,\n outcome,\n contentType = ContentType.None,\n content = new Uint8Array(0),\n expiry = 0,\n } = params;\n\n if (contentType !== ContentType.None && content.length === 0) {\n throw new Error(`content is required when contentType is ${getContentTypeLabel(contentType)}`);\n }\n\n await this.validateAgentMintIsRegisteredAgent(agentMint);\n\n const nonce = computeReputationNonce(provider.address, agentMint);\n const taskRef = computeReputationNonce(provider.address, agentMint); // same as nonce per spec\n const dataHash = zeroDataHash();\n\n const [attestationPda] = await deriveReputationAttestationPda(satiCredential, sasSchema, nonce);\n const [schemaConfigPda] = await findSchemaConfigPda(sasSchema);\n\n const instructions: Array<Parameters<typeof appendTransactionMessageInstructions>[0][number]> = [];\n\n // If attestation already exists, close it first\n const existingAccount = await this.rpc.getAccountInfo(attestationPda, { encoding: \"base64\" }).send();\n if (existingAccount.value) {\n const [sasEventAuthority] = await deriveSasEventAuthorityPda();\n const closeIx = await getCloseRegularAttestationInstructionAsync({\n payer,\n signer: provider,\n schemaConfig: schemaConfigPda,\n agentMint,\n satiCredential,\n attestation: attestationPda,\n sasEventAuthority,\n program: SATI_PROGRAM_ADDRESS,\n });\n instructions.push(closeIx);\n }\n\n // Build create instructions\n const reputationData: ReputationScoreData = {\n taskRef,\n agentMint,\n counterparty: provider.address,\n dataHash,\n outcome,\n contentType,\n content,\n };\n const data = serializeReputationScore(reputationData);\n\n const messageHash = computeInteractionHash(sasSchema, taskRef, dataHash);\n const providerSig = new Uint8Array(await signBytes(provider.keyPair.privateKey, messageHash));\n\n const addressEncoder = getAddressEncoder();\n const ed25519Ix = createBatchEd25519Instruction([\n {\n publicKey: new Uint8Array(addressEncoder.encode(provider.address)),\n message: messageHash,\n signature: providerSig,\n },\n ]);\n\n const createIx = await getCreateRegularAttestationInstructionAsync({\n payer,\n schemaConfig: schemaConfigPda,\n agentMint,\n satiCredential,\n sasSchema,\n attestation: attestationPda,\n program: SATI_PROGRAM_ADDRESS,\n data,\n expiry: BigInt(expiry),\n });\n\n instructions.push(ed25519Ix, createIx);\n\n const signature = await this.buildAndSendTransaction(instructions, payer);\n\n return {\n address: attestationPda,\n signature,\n };\n }\n\n /**\n * Close a regular SAS attestation (ReputationScoreV3)\n */\n async closeRegularAttestation(params: CloseRegularAttestationParams): Promise<CloseAttestationResult> {\n const { payer, provider, sasSchema, satiCredential, agentMint, attestation } = params;\n\n const [schemaConfigPda] = await findSchemaConfigPda(sasSchema);\n const [sasEventAuthority] = await deriveSasEventAuthorityPda();\n\n const closeIx = await getCloseRegularAttestationInstructionAsync({\n payer,\n signer: provider,\n schemaConfig: schemaConfigPda,\n agentMint,\n satiCredential,\n attestation,\n sasEventAuthority,\n program: SATI_PROGRAM_ADDRESS,\n });\n\n const signature = await this.buildAndSendTransaction([closeIx], payer);\n\n return { signature };\n }\n\n // ============================================================\n // QUERY METHODS\n // ============================================================\n\n /**\n * List Feedback attestations with pagination\n */\n async listFeedbacks(filter: Partial<AttestationFilter>): Promise<PaginatedAttestations<ParsedFeedbackAttestation>> {\n const light = this.getLightClient();\n return light.listFeedbacks(filter);\n }\n\n /**\n * List Validation attestations with pagination\n */\n async listValidations(\n filter: Partial<AttestationFilter>,\n ): Promise<PaginatedAttestations<ParsedValidationAttestation>> {\n const light = this.getLightClient();\n return light.listValidations(filter);\n }\n\n /**\n * Get a ReputationScoreV3 for an agent from a specific provider\n */\n async getReputationScore(\n provider: Address,\n agentMint: Address,\n satiCredential: Address,\n sasSchema: Address,\n ): Promise<ReputationScoreData | null> {\n const nonce = computeReputationNonce(provider, agentMint);\n\n const [attestationPda] = await deriveReputationAttestationPda(satiCredential, sasSchema, nonce);\n\n const accountInfo = await this.rpc.getAccountInfo(attestationPda, { encoding: \"base64\" }).send();\n\n if (!accountInfo.value) {\n return null;\n }\n\n const base64Data = accountInfo.value.data[0];\n const binaryString = atob(base64Data);\n const data = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n data[i] = binaryString.charCodeAt(i);\n }\n\n if (data.length < SAS_HEADER_SIZE) {\n return null;\n }\n\n // Read data_len from SAS header (4-byte LE at SAS_DATA_LEN_OFFSET) to exclude SAS tail\n const dataLenSlice = data.slice(SAS_DATA_LEN_OFFSET, SAS_DATA_LEN_OFFSET + 4);\n const dataLen = new DataView(dataLenSlice.buffer).getUint32(0, true);\n const satiData = data.slice(SAS_HEADER_SIZE, SAS_HEADER_SIZE + dataLen);\n\n return deserializeReputationScore(satiData);\n }\n\n /**\n * List ReputationScoreV3 attestations for an agent\n */\n async listReputationScores(agentMint: Address, sasSchema: Address): Promise<ReputationScoreData[]> {\n // SAS attestation account layout:\n // discriminator(1) + nonce(32) + credential(32) + schema(32) + data_len(4) + data...\n // Schema is at offset 65 in the SAS header.\n // AgentMint is in SATI data at: SAS_HEADER_SIZE(101) + layoutVersion(1) + taskRef(32) = 134\n const accounts = await this.rpc\n .getProgramAccounts(SAS_PROGRAM_ADDRESS, {\n encoding: \"base64\",\n filters: [\n {\n memcmp: {\n offset: BigInt(65),\n bytes: addressToBase58Bytes(sasSchema),\n encoding: \"base58\",\n },\n },\n {\n memcmp: {\n offset: BigInt(SAS_HEADER_SIZE + 33),\n bytes: addressToBase58Bytes(agentMint),\n encoding: \"base58\",\n },\n },\n ],\n })\n .send();\n\n const results: ReputationScoreData[] = [];\n for (const { account } of accounts) {\n try {\n const [base64Data] = account.data as [string, string];\n const bytes = Uint8Array.from(atob(base64Data), (c) => c.charCodeAt(0));\n // Read data_len from SAS header (4-byte LE at SAS_DATA_LEN_OFFSET) to exclude SAS tail\n const dataLenSlice = bytes.slice(SAS_DATA_LEN_OFFSET, SAS_DATA_LEN_OFFSET + 4);\n const dataLen = new DataView(dataLenSlice.buffer).getUint32(0, true);\n const attestationData = bytes.slice(SAS_HEADER_SIZE, SAS_HEADER_SIZE + dataLen);\n results.push(deserializeReputationScore(attestationData));\n } catch {\n // Skip malformed accounts\n }\n }\n\n return results;\n }\n\n // ============================================================\n // SIGNATURE HELPERS\n // ============================================================\n\n /**\n * Build the interaction hash that the agent should sign (blind to outcome)\n *\n * The agent signs this hash before knowing the outcome, binding them to the\n * task and data without committing to a specific result.\n */\n buildInteractionHash(sasSchema: Address, taskRef: Uint8Array, dataHash: Uint8Array): Uint8Array {\n return computeInteractionHash(sasSchema, taskRef, dataHash);\n }\n\n /**\n * Build the counterparty message for signing (SIWS-style human-readable message)\n *\n * @param schemaName - The schema name (e.g., \"Feedback\", \"Validation\")\n * @param data - Serialized attestation data (universal layout)\n */\n buildCounterpartySigningMessage(schemaName: string, data: Uint8Array): Uint8Array {\n return buildCounterpartyMessage({ schemaName, data }).messageBytes;\n }\n\n // ============================================================\n // SIGNATURE VERIFICATION\n // ============================================================\n\n /**\n * Verify signatures on a parsed attestation\n *\n * For dual-signature attestations (Feedback, Validation), the counterparty signature\n * is verified against the SIWS-style human-readable message. This requires the schema\n * name to reconstruct the message.\n *\n * @param attestation - The parsed attestation to verify\n * @param schemaName - Schema name for counterparty message reconstruction (e.g., \"Feedback\")\n */\n async verifySignatures(attestation: ParsedAttestation, schemaName?: string): Promise<SignatureVerificationResult> {\n const { attestation: compressed, data } = attestation;\n const addressEncoder = getAddressEncoder();\n\n // sasSchema and agentMint are now Address strings\n const sasSchema = compressed.sasSchema;\n\n const signature1 = compressed.signature1;\n const signature2 = compressed.signature2;\n\n // All schemas share the same base layout, so we can use FeedbackData for common fields\n const baseData = data as FeedbackData;\n\n // Determine signature mode from numSignatures\n const isDualSignature = compressed.numSignatures === 2;\n\n if (isDualSignature) {\n // DualSignature mode (Feedback, Validation): agent + counterparty\n\n // Agent signs interaction hash (blind commitment to task + data)\n const interactionHash = computeInteractionHash(sasSchema, baseData.taskRef, baseData.dataHash);\n\n // For counterparty verification, we need the schema name to build the SIWS message\n if (!schemaName) {\n // Without schema name, we can only verify agent signature\n const agentPubkeyBytes = new Uint8Array(addressEncoder.encode(baseData.agentMint));\n const agentKey = await importEd25519PublicKey(agentPubkeyBytes);\n const agentValid = await verifySignature(agentKey, signatureBytes(signature1), interactionHash);\n\n return {\n valid: agentValid,\n agentValid,\n counterpartyValid: undefined,\n };\n }\n\n // Serialize the data to build counterparty message\n // Use the raw compressed data directly since it's already in universal layout\n const counterpartyMessageObj = buildCounterpartyMessage({ schemaName, data: compressed.data });\n\n const agentPubkeyBytes = new Uint8Array(addressEncoder.encode(baseData.agentMint));\n const agentKey = await importEd25519PublicKey(agentPubkeyBytes);\n\n const counterpartyPubkeyBytes = new Uint8Array(addressEncoder.encode(baseData.counterparty));\n const counterpartyKey = await importEd25519PublicKey(counterpartyPubkeyBytes);\n\n const agentValid = await verifySignature(agentKey, signatureBytes(signature1), interactionHash);\n const counterpartyValid = await verifySignature(\n counterpartyKey,\n signatureBytes(signature2),\n counterpartyMessageObj.messageBytes,\n );\n\n return {\n valid: agentValid && counterpartyValid,\n agentValid,\n counterpartyValid,\n };\n } else {\n // Single signature mode (CounterpartySigned or AgentOwnerSigned)\n const interactionHash = computeInteractionHash(sasSchema, baseData.taskRef, baseData.dataHash);\n\n // For single signature, signature1 is the only signature\n // The signer could be either the agent owner or the counterparty depending on the schema\n // We verify that signature1 is valid for the interaction hash\n const signerPubkeyBytes = new Uint8Array(addressEncoder.encode(baseData.counterparty));\n const signerKey = await importEd25519PublicKey(signerPubkeyBytes);\n const signerValid = await verifySignature(signerKey, signatureBytes(signature1), interactionHash);\n\n return {\n valid: signerValid,\n agentValid: undefined,\n counterpartyValid: signerValid,\n };\n }\n }\n\n // ============================================================\n // PRIVATE HELPERS\n // ============================================================\n\n /**\n * Validate that agentMint is a registered SATI agent mint.\n *\n * This validation runs at SDK level to fail fast with clear errors\n * before attempting on-chain operations.\n *\n * @param agentMint - Address to validate as a registered agent mint\n * @throws Error if agentMint is not a registered SATI agent\n */\n private async validateAgentMintIsRegisteredAgent(agentMint: Address): Promise<void> {\n try {\n const agent = await this.loadAgent(agentMint);\n if (!agent) {\n throw new Error(`agentMint ${agentMint} is not a registered SATI agent mint`);\n }\n } catch (error) {\n // Re-throw with consistent error message for any lookup failure\n const message = error instanceof Error ? error.message : String(error);\n // Already has our message format\n if (message.includes(\"is not a registered SATI agent mint\")) {\n throw error;\n }\n // Wrap other errors (account not found, decode errors, etc.)\n throw new Error(`agentMint ${agentMint} is not a registered SATI agent mint`);\n }\n }\n\n /**\n * Build, optionally compress, sign, and send a transaction.\n */\n private async buildAndSendTransaction(\n instructions: Parameters<typeof appendTransactionMessageInstructions>[0],\n payer: KeyPairSigner,\n lookupTableAddress?: Address,\n computeUnits: number = 400_000,\n ): Promise<string> {\n const { value: latestBlockhash } = await this.rpc.getLatestBlockhash().send();\n\n const computeBudgetIx = getSetComputeUnitLimitInstruction({\n units: computeUnits,\n });\n\n const baseTx = pipe(\n createTransactionMessage({ version: 0 }),\n (msg) => setTransactionMessageFeePayer(payer.address, msg),\n (msg) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, msg),\n (msg) => appendTransactionMessageInstruction(computeBudgetIx, msg),\n (msg) => appendTransactionMessageInstructions(instructions, msg),\n );\n\n const finalTx = await (async () => {\n if (!lookupTableAddress) {\n return baseTx;\n }\n const lookupTableAccount = await fetchAddressLookupTable(this.rpc, lookupTableAddress);\n const addressesByLookupTable: AddressesByLookupTableAddress = {\n [lookupTableAddress]: lookupTableAccount.data.addresses,\n };\n return compressTransactionMessageUsingAddressLookupTables(baseTx, addressesByLookupTable);\n })();\n\n const signedTx = await signTransactionMessageWithSigners(finalTx);\n await this.sendAndConfirm(signedTx as SignedBlockhashTransaction, {\n commitment: \"confirmed\",\n });\n\n return getSignatureFromTransaction(signedTx).toString();\n }\n\n /**\n * Send a single transaction without address lookup table.\n */\n private async sendSingleTransaction(\n instructions: Parameters<typeof appendTransactionMessageInstructions>[0],\n payer: KeyPairSigner,\n ): Promise<string> {\n const { value: latestBlockhash } = await this.rpc.getLatestBlockhash().send();\n\n const txMessage = pipe(\n createTransactionMessage({ version: 0 }),\n (msg) => setTransactionMessageFeePayer(payer.address, msg),\n (msg) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, msg),\n (msg) => appendTransactionMessageInstructions(instructions, msg),\n );\n\n const signedTx = await signTransactionMessageWithSigners(txMessage);\n const signature = getSignatureFromTransaction(signedTx);\n\n await this.sendAndConfirm(signedTx as SignedBlockhashTransaction, {\n commitment: \"confirmed\",\n });\n\n return signature;\n }\n\n // ============================================================\n // CONVENIENCE: Config Accessors\n // ============================================================\n\n /** Deployed SAS configuration for this network (null for localnet unless deployed). */\n get deployedConfig(): SATISASConfig | null {\n return this._deployedConfig;\n }\n\n /** FeedbackPublic schema address (CounterpartySigned mode). */\n get feedbackPublicSchema(): Address | undefined {\n return this._deployedConfig?.schemas.feedbackPublic;\n }\n\n /** Feedback schema address (DualSignature mode). */\n get feedbackSchema(): Address | undefined {\n return this._deployedConfig?.schemas.feedback;\n }\n\n /** Validation schema address. */\n get validationSchema(): Address | undefined {\n return this._deployedConfig?.schemas.validation;\n }\n\n /** Address Lookup Table for transaction compression. */\n get lookupTable(): Address | undefined {\n return this._deployedConfig?.lookupTable;\n }\n\n // ============================================================\n // CONVENIENCE: Simplified Feedback\n // ============================================================\n\n /**\n * Give feedback to an agent (simplified).\n *\n * Uses FeedbackPublicV1 schema (CounterpartySigned mode).\n * Automatically handles SIWS message construction and signing.\n *\n * @example\n * ```typescript\n * const result = await sati.giveFeedback({\n * payer: myKeypair,\n * agentMint: address(\"Agent...\"),\n * score: 85,\n * tags: [\"quality\", \"speed\"],\n * message: \"Great response time\",\n * });\n * ```\n */\n async giveFeedback(params: GiveFeedbackParams): Promise<GiveFeedbackResult> {\n const schema = this._requireFeedbackPublicSchema();\n const payer = params.payer;\n\n // Validate score\n if (params.score !== undefined && (!Number.isFinite(params.score) || params.score < 0 || params.score > 100)) {\n throw new Error(`Feedback score must be a finite number between 0 and 100, got: ${params.score}`);\n }\n\n // Build content JSON\n const contentObj: Record<string, unknown> = {};\n if (params.score !== undefined) contentObj.score = params.score;\n if (params.tags?.length) contentObj.tags = params.tags;\n if (params.endpoint) contentObj.endpoint = params.endpoint;\n if (params.message) contentObj.m = params.message;\n\n const content =\n Object.keys(contentObj).length > 0 ? new TextEncoder().encode(JSON.stringify(contentObj)) : new Uint8Array(0);\n const contentType = content.length > 0 ? ContentType.JSON : ContentType.None;\n\n const taskRef = params.taskRef ?? globalThis.crypto.getRandomValues(new Uint8Array(32));\n const outcome = params.outcome ?? Outcome.Neutral;\n\n // Serialize and build SIWS message\n const feedbackData: FeedbackData = {\n taskRef,\n agentMint: params.agentMint,\n counterparty: payer.address,\n dataHash: zeroDataHash(),\n outcome,\n contentType,\n content,\n };\n const serializedData = serializeFeedback(feedbackData);\n const { messageBytes } = buildCounterpartyMessage({\n schemaName: \"FeedbackPublicV1\",\n data: serializedData,\n });\n const sig = await signBytes(payer.keyPair.privateKey, messageBytes);\n\n const result = await this.createFeedback({\n payer,\n sasSchema: schema,\n taskRef,\n agentMint: params.agentMint,\n counterparty: payer.address,\n dataHash: zeroDataHash(),\n outcome,\n contentType,\n content,\n agentSignature: {\n pubkey: payer.address,\n signature: new Uint8Array(sig),\n },\n counterpartyMessage: messageBytes,\n lookupTableAddress: this._deployedConfig?.lookupTable,\n });\n\n this._feedbackCache.invalidate();\n\n return {\n signature: result.signature,\n attestationAddress: result.address,\n };\n }\n\n /**\n * Prepare feedback for browser wallet signing.\n *\n * Returns SIWS message bytes that the counterparty must sign externally.\n * Pass the result + signature to `submitPreparedFeedback()`.\n */\n async prepareFeedback(\n params: Omit<GiveFeedbackParams, \"payer\"> & { counterparty: Address },\n ): Promise<PreparedFeedbackData> {\n const schema = this._requireFeedbackPublicSchema();\n\n if (params.score !== undefined && (!Number.isFinite(params.score) || params.score < 0 || params.score > 100)) {\n throw new Error(`Feedback score must be a finite number between 0 and 100, got: ${params.score}`);\n }\n\n // Build content JSON\n const contentObj: Record<string, unknown> = {};\n if (params.score !== undefined) contentObj.score = params.score;\n if (params.tags?.length) contentObj.tags = params.tags;\n if (params.endpoint) contentObj.endpoint = params.endpoint;\n if (params.message) contentObj.m = params.message;\n\n const content =\n Object.keys(contentObj).length > 0 ? new TextEncoder().encode(JSON.stringify(contentObj)) : new Uint8Array(0);\n const contentType = content.length > 0 ? ContentType.JSON : ContentType.None;\n\n const taskRef = params.taskRef ?? globalThis.crypto.getRandomValues(new Uint8Array(32));\n const outcome = params.outcome ?? Outcome.Neutral;\n\n const feedbackData: FeedbackData = {\n taskRef,\n agentMint: params.agentMint,\n counterparty: params.counterparty,\n dataHash: zeroDataHash(),\n outcome,\n contentType,\n content,\n };\n const serializedData = serializeFeedback(feedbackData);\n const { messageBytes } = buildCounterpartyMessage({\n schemaName: \"FeedbackPublicV1\",\n data: serializedData,\n });\n\n return {\n messageBytes,\n agentMint: params.agentMint,\n counterparty: params.counterparty,\n taskRef,\n dataHash: zeroDataHash(),\n outcome,\n contentType,\n content,\n sasSchema: schema,\n lookupTable: this._deployedConfig?.lookupTable,\n meta: {\n score: params.score,\n tags: params.tags ? [...params.tags] : undefined,\n message: params.message,\n endpoint: params.endpoint,\n },\n };\n }\n\n /**\n * Submit prepared feedback with an externally-obtained wallet signature.\n *\n * The payer signs the transaction and pays gas. The counterparty's SIWS\n * signature (from wallet) proves consent.\n */\n async submitPreparedFeedback(params: {\n payer: KeyPairSigner;\n prepared: PreparedFeedbackData;\n counterpartySignature: Uint8Array;\n }): Promise<GiveFeedbackResult> {\n const { payer, prepared, counterpartySignature } = params;\n\n const result = await this.createFeedback({\n payer,\n sasSchema: prepared.sasSchema,\n taskRef: prepared.taskRef,\n agentMint: prepared.agentMint,\n counterparty: prepared.counterparty,\n dataHash: prepared.dataHash,\n outcome: prepared.outcome,\n contentType: prepared.contentType,\n content: prepared.content,\n agentSignature: {\n pubkey: prepared.counterparty,\n signature: new Uint8Array(counterpartySignature),\n },\n counterpartyMessage: prepared.messageBytes,\n lookupTableAddress: prepared.lookupTable,\n });\n\n this._feedbackCache.invalidate();\n\n return {\n signature: result.signature,\n attestationAddress: result.address,\n };\n }\n\n /**\n * Revoke (close) a feedback attestation by its compressed account address.\n *\n * The payer must be the counterparty who originally submitted the feedback.\n * Closed attestations are permanently deleted.\n */\n async revokeFeedback(params: { payer: KeyPairSigner; attestationAddress: Address }): Promise<{ signature: string }> {\n const schema = this._deployedConfig?.schemas.feedbackPublic ?? this._deployedConfig?.schemas.feedback;\n if (!schema) {\n throw new Error(`No feedback schema deployed for network \"${this.network}\"`);\n }\n\n const result = await this.closeCompressedAttestation({\n payer: params.payer,\n counterparty: params.payer,\n sasSchema: schema,\n attestationAddress: params.attestationAddress,\n lookupTableAddress: this._deployedConfig?.lookupTable,\n });\n\n this._feedbackCache.invalidate();\n return { signature: result.signature };\n }\n\n // ============================================================\n // CONVENIENCE: Search & Query\n // ============================================================\n\n /**\n * Search feedback attestations with client-side filtering.\n *\n * Note: `createdAt` timestamps are approximate - derived from Solana slot\n * numbers using ~400ms/slot estimate.\n *\n * @example\n * ```typescript\n * const feedbacks = await sati.searchFeedback({\n * agentMint: address(\"Agent...\"),\n * tags: [\"quality\"],\n * minScore: 70,\n * });\n * ```\n */\n async searchFeedback(options?: FeedbackSearchOptions): Promise<ParsedFeedback[]> {\n const schema = this._deployedConfig?.schemas.feedbackPublic ?? this._deployedConfig?.schemas.feedback;\n if (!schema) {\n throw new Error(`No feedback schema deployed for network \"${this.network}\"`);\n }\n\n // Build RPC filter\n const filter: Partial<AttestationFilter> = { sasSchema: schema };\n if (options?.agentMint) filter.agentMint = options.agentMint;\n if (options?.counterparty) filter.counterparty = options.counterparty;\n\n // Check cache\n const cacheKey = FeedbackCache.cacheKey(schema, options?.agentMint);\n const cached = this._feedbackCache.get<PaginatedAttestations<ParsedFeedbackAttestation>>(cacheKey);\n const result = cached ?? (await this.listFeedbacks(filter));\n if (!cached) this._feedbackCache.set(cacheKey, result);\n\n // Fetch current slot for timestamp conversion\n const currentSlot = await this.rpc.getSlot({ commitment: \"confirmed\" }).send();\n const nowSec = Math.floor(Date.now() / 1000);\n\n const feedbacks: ParsedFeedback[] = [];\n for (const item of result.items) {\n const rawContent = this._parseContentJson(item.data.content, item.data.contentType);\n\n const score = rawContent?.score as number | undefined;\n const tags = (rawContent?.tags as string[]) ?? [];\n const message = rawContent?.m as string | undefined;\n const endpoint = rawContent?.endpoint as string | undefined;\n\n // Client-side tag filtering\n if (options?.tags?.length) {\n const hasAll = options.tags.every((t) => tags.includes(t));\n if (!hasAll) continue;\n }\n\n // Client-side score filtering\n if (options?.minScore !== undefined && (score === undefined || score < options.minScore)) continue;\n if (options?.maxScore !== undefined && (score === undefined || score > options.maxScore)) continue;\n\n // Compute createdAt from slotCreated (~400ms per slot)\n const slotDiff = Number(BigInt(currentSlot) - item.raw.slotCreated);\n const createdAt = nowSec - Math.floor(slotDiff * 0.4);\n\n const [compressedAddress] = getAddressDecoder().read(item.address, 0);\n\n feedbacks.push({\n compressedAddress,\n agentMint: item.data.agentMint as Address,\n counterparty: item.data.counterparty as Address,\n outcome: item.data.outcome,\n score,\n tags,\n message,\n endpoint,\n createdAt,\n });\n }\n\n // Optionally populate txHash\n if (options?.includeTxHash) {\n const photon = this.getLightClient().getRpc();\n await Promise.all(\n feedbacks.map(async (fb) => {\n try {\n const sigs = await photon.getCompressionSignaturesForAddress(fb.compressedAddress, { limit: 1 });\n fb.txSignature = sigs.items[0]?.signature;\n } catch (error) {\n this._warn({\n code: \"SIGNATURE_LOOKUP_FAILED\",\n message: \"Failed to fetch tx signature\",\n context: fb.compressedAddress,\n cause: error,\n });\n }\n }),\n );\n }\n\n return feedbacks;\n }\n\n /**\n * Get reputation summary for an agent.\n *\n * Aggregates feedback scores, optionally filtered by tags.\n *\n * @example\n * ```typescript\n * const summary = await sati.getReputationSummary(address(\"Agent...\"));\n * console.log(`${summary.count} reviews, avg ${summary.averageScore}`);\n * ```\n */\n async getReputationSummary(agentMint: Address, tags?: string[]): Promise<ReputationSummary> {\n const schema = this._deployedConfig?.schemas.feedbackPublic ?? this._deployedConfig?.schemas.feedback;\n if (!schema) {\n throw new Error(`No feedback schema deployed for network \"${this.network}\"`);\n }\n\n const cacheKey = FeedbackCache.cacheKey(schema, agentMint);\n const cached = this._feedbackCache.get<PaginatedAttestations<ParsedFeedbackAttestation>>(cacheKey);\n const result = cached ?? (await this.listFeedbacks({ sasSchema: schema, agentMint }));\n if (!cached) this._feedbackCache.set(cacheKey, result);\n\n if (result.items.length === 0) {\n return { count: 0, averageScore: 0 };\n }\n\n let sum = 0;\n let count = 0;\n\n for (const item of result.items) {\n const rawContent = this._parseContentJson(item.data.content, item.data.contentType);\n const score = rawContent?.score as number | undefined;\n const itemTags = (rawContent?.tags as string[]) ?? [];\n\n // Apply tag filters\n if (tags?.length && !tags.every((t) => itemTags.includes(t))) continue;\n\n if (score !== undefined) {\n sum += score;\n count++;\n }\n }\n\n return {\n count,\n averageScore: count > 0 ? sum / count : 0,\n };\n }\n\n /**\n * Search validation attestations for an agent.\n *\n * Note: `createdAt` timestamps are approximate.\n */\n async searchValidations(agentMint: Address): Promise<ParsedValidation[]> {\n const validationSchema = this._deployedConfig?.schemas.validation;\n if (!validationSchema) {\n throw new Error(`No validation schema deployed for network \"${this.network}\"`);\n }\n\n const result = await this.listValidations({\n sasSchema: validationSchema,\n agentMint,\n });\n\n const currentSlot = await this.rpc.getSlot({ commitment: \"confirmed\" }).send();\n const nowSec = Math.floor(Date.now() / 1000);\n\n return result.items.map((item) => {\n const slotDiff = Number(BigInt(currentSlot) - item.raw.slotCreated);\n const createdAt = nowSec - Math.floor(slotDiff * 0.4);\n const [compressedAddress] = getAddressDecoder().read(item.address, 0);\n\n return {\n compressedAddress,\n agentMint: item.data.agentMint as Address,\n counterparty: item.data.counterparty as Address,\n outcome: item.data.outcome,\n createdAt,\n };\n });\n }\n\n /**\n * Search registered agents with filtering and optional feedback stats.\n *\n * @example\n * ```typescript\n * const agents = await sati.searchAgents({\n * endpointTypes: [\"MCP\"],\n * active: true,\n * includeFeedbackStats: true,\n * });\n * ```\n */\n async searchAgents(options?: AgentSearchOptions): Promise<AgentSearchResult[]> {\n const limit = options?.limit ?? 100;\n const offset = options?.offset;\n\n // Fetch agents\n let agents: AgentIdentity[];\n if (options?.owner) {\n agents = await this.listAgentsByOwner(options.owner);\n } else {\n agents = await this.listAllAgents({ limit, offset });\n }\n\n // Apply name filter\n if (options?.name) {\n const lower = options.name.toLowerCase();\n agents = agents.filter((a) => a.name.toLowerCase().includes(lower));\n }\n\n // Determine if we need registration files\n const needsRegFile = !!(options?.active !== undefined || options?.endpointTypes?.length);\n\n // Fetch registration files in parallel\n const regFiles: (import(\"./registration\").RegistrationFile | null)[] =\n needsRegFile || options?.includeFeedbackStats\n ? await Promise.all(\n agents.map(async (a) => {\n try {\n return await fetchRegistrationFile(a.uri);\n } catch {\n return null;\n }\n }),\n )\n : agents.map(() => null);\n\n // Apply filters\n const filtered: { identity: AgentIdentity; regFile: import(\"./registration\").RegistrationFile | null }[] = [];\n for (let i = 0; i < agents.length; i++) {\n const identity = agents[i];\n const regFile = regFiles[i];\n const endpoints = regFile?.endpoints ?? [];\n\n if (options?.active !== undefined && (regFile?.active ?? true) !== options.active) continue;\n if (options?.endpointTypes?.length) {\n const hasAllTypes = options.endpointTypes.every((type) =>\n endpoints.some((e) => e.name.toUpperCase() === type.toUpperCase()),\n );\n if (!hasAllTypes) continue;\n }\n\n filtered.push({ identity, regFile });\n }\n\n // Optionally fetch feedback stats\n let statsMap: Map<string, ReputationSummary> | null = null;\n if (options?.includeFeedbackStats && this._deployedConfig && filtered.length > 0) {\n statsMap = new Map();\n await Promise.all(\n filtered.map(async ({ identity }) => {\n try {\n const summary = await this.getReputationSummary(identity.mint);\n statsMap?.set(identity.mint, summary);\n } catch (error) {\n this._warn({\n code: \"RPC_ERROR\",\n message: \"Failed to fetch feedback stats\",\n context: identity.mint,\n cause: error,\n });\n }\n }),\n );\n }\n\n return filtered.map(({ identity, regFile }) => ({\n identity,\n registrationFile: regFile,\n ...(statsMap && { feedbackStats: statsMap.get(identity.mint) }),\n }));\n }\n\n // ============================================================\n // CONVENIENCE: Agent Builder\n // ============================================================\n\n /**\n * Create a fluent builder for agent registration.\n *\n * @example\n * ```typescript\n * const builder = sati.createAgentBuilder(\"MyAgent\", \"AI assistant\", \"https://example.com/avatar.png\");\n * builder.setMCP(\"https://mcp.example.com\").setActive(true);\n * const result = await builder.register({ payer, uploader: createSatiUploader() });\n * ```\n */\n createAgentBuilder(name: string, description: string, image: string): SatiAgentBuilder {\n return new SatiAgentBuilder(this, name, description, image);\n }\n\n // ============================================================\n // CONVENIENCE: Private Helpers\n // ============================================================\n\n /** Safely parse JSON content from an attestation. */\n private _parseContentJson(content: Uint8Array, contentType: number): Record<string, unknown> | null {\n if (contentType !== ContentType.JSON || content.length === 0) return null;\n try {\n return JSON.parse(new TextDecoder().decode(content)) as Record<string, unknown>;\n } catch {\n return null;\n }\n }\n\n /** Fire a non-fatal warning. */\n private _warn(warning: SatiWarning): void {\n this._onWarning?.(warning);\n }\n\n /** Get the FeedbackPublic schema address or throw. */\n private _requireFeedbackPublicSchema(): Address {\n const schema = this._deployedConfig?.schemas.feedbackPublic;\n if (!schema) {\n throw new Error(\n `No FeedbackPublic schema deployed for network \"${this.network}\". ` +\n \"Pass sasSchema explicitly via the low-level createFeedback() method.\",\n );\n }\n return schema;\n }\n}\n","/**\n * SATI SDK Error Types\n *\n * Follows the same pattern as cascade-splits/splits-sdk for consistency.\n */\n\n/** All possible SDK error codes */\nexport type SatiErrorCode =\n | \"DUPLICATE_ATTESTATION\"\n | \"AGENT_NOT_FOUND\"\n | \"SCHEMA_NOT_FOUND\"\n | \"INVALID_SIGNATURE\"\n | \"TRANSACTION_FAILED\"\n | \"WALLET_REJECTED\"\n | \"WALLET_DISCONNECTED\"\n | \"NETWORK_ERROR\"\n | \"TRANSACTION_EXPIRED\";\n\n/** Base class for all SATI SDK errors */\nexport class SatiError extends Error {\n constructor(\n message: string,\n public readonly code: SatiErrorCode,\n options?: ErrorOptions,\n ) {\n super(message, options);\n this.name = \"SatiError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Thrown when attempting to create an attestation that already exists.\n * This occurs when the same (schema, agent, taskRef, dataHash) combination\n * is submitted twice.\n *\n * Light Protocol error: 9002 (0x232a)\n */\nexport class DuplicateAttestationError extends SatiError {\n constructor(options?: ErrorOptions) {\n super(\"An attestation with these parameters already exists\", \"DUPLICATE_ATTESTATION\", options);\n this.name = \"DuplicateAttestationError\";\n }\n}\n\n/** Agent mint is not a registered SATI agent */\nexport class AgentNotFoundError extends SatiError {\n constructor(\n public readonly agentMint: string,\n options?: ErrorOptions,\n ) {\n super(`Agent not found: ${agentMint}`, \"AGENT_NOT_FOUND\", options);\n this.name = \"AgentNotFoundError\";\n }\n}\n\n/** Schema not found or not initialized */\nexport class SchemaNotFoundError extends SatiError {\n constructor(\n public readonly schema: string,\n options?: ErrorOptions,\n ) {\n super(`Schema not found: ${schema}`, \"SCHEMA_NOT_FOUND\", options);\n this.name = \"SchemaNotFoundError\";\n }\n}\n\n// Light Protocol error codes\nexport const LIGHT_ERROR_CODES = {\n DUPLICATE_LEAF: 9002, // 0x232a\n} as const;\n","/**\n * User-facing error messages.\n *\n * Separated for reusability and potential i18n.\n * Follows the same pattern as cascade-splits/splits-sdk.\n */\n\nexport function duplicateAttestationMessage(): string {\n return \"You've already submitted feedback for this interaction. Each interaction can only be attested once.\";\n}\n\nexport function walletRejectedMessage(): string {\n return \"Transaction was rejected by your wallet.\";\n}\n\nexport function walletDisconnectedMessage(): string {\n return \"Wallet disconnected. Please reconnect and try again.\";\n}\n\nexport function networkErrorMessage(): string {\n return \"Network error. Please check your connection and try again.\";\n}\n\nexport function transactionExpiredMessage(): string {\n return \"Transaction expired. Please try again.\";\n}\n\nexport function transactionFailedMessage(detail?: string): string {\n return detail ? `Transaction failed: ${detail}` : \"Transaction failed. Please try again.\";\n}\n","/**\n * Transaction error handling utilities.\n *\n * Converts raw Solana/Light Protocol errors into structured results\n * with user-friendly messages.\n *\n * Follows the same pattern as cascade-splits/splits-sdk.\n */\n\nimport {\n duplicateAttestationMessage,\n walletRejectedMessage,\n walletDisconnectedMessage,\n networkErrorMessage,\n transactionExpiredMessage,\n transactionFailedMessage,\n} from \"./messages.js\";\n\n/** Reason why a transaction failed */\nexport type FailedReason =\n | \"duplicate_attestation\"\n | \"wallet_rejected\"\n | \"wallet_disconnected\"\n | \"network_error\"\n | \"transaction_expired\"\n | \"program_error\";\n\n/** Result when a transaction fails */\nexport interface FailedResult {\n status: \"failed\";\n reason: FailedReason;\n message: string;\n error?: Error;\n}\n\n/** Check if error is Light Protocol duplicate leaf (9002 / 0x232a) */\nfunction isDuplicateLeafError(error: unknown): boolean {\n const str = String(error);\n return str.includes(\"9002\") || str.includes(\"0x232a\");\n}\n\n/** Check if error is wallet rejection */\nfunction isWalletRejectedError(error: unknown): boolean {\n const str = String(error);\n return str.includes(\"User rejected\") || str.includes(\"user rejected\") || str.includes(\"rejected the request\");\n}\n\n/** Check if error is wallet disconnected */\nfunction isWalletDisconnectedError(error: unknown): boolean {\n const str = String(error);\n return str.includes(\"disconnected\") || str.includes(\"not connected\");\n}\n\n/** Check if error is network related */\nfunction isNetworkError(error: unknown): boolean {\n const str = String(error);\n return (\n str.includes(\"network\") || str.includes(\"fetch\") || str.includes(\"ECONNREFUSED\") || str.includes(\"Failed to fetch\")\n );\n}\n\n/** Check if error is transaction expiration */\nfunction isTransactionExpiredError(error: unknown): boolean {\n const str = String(error);\n return str.includes(\"expired\") || str.includes(\"blockhash not found\");\n}\n\n/**\n * Convert a raw transaction error into a structured FailedResult.\n *\n * Use this when catching errors from transaction submission or RPC calls.\n * Returns a result object with a user-friendly message and typed reason.\n *\n * @example\n * ```typescript\n * try {\n * await sati.createFeedback(...);\n * } catch (error) {\n * const result = handleTransactionError(error);\n * if (result.reason === \"duplicate_attestation\") {\n * // Show \"already submitted\" message\n * }\n * toast.error(result.message);\n * }\n * ```\n */\nexport function handleTransactionError(error: unknown): FailedResult {\n const wrappedError = error instanceof Error ? error : new Error(String(error));\n\n // Check specific error types in order of likelihood\n if (isDuplicateLeafError(error)) {\n return {\n status: \"failed\",\n reason: \"duplicate_attestation\",\n message: duplicateAttestationMessage(),\n error: wrappedError,\n };\n }\n\n if (isWalletRejectedError(error)) {\n return {\n status: \"failed\",\n reason: \"wallet_rejected\",\n message: walletRejectedMessage(),\n error: wrappedError,\n };\n }\n\n if (isWalletDisconnectedError(error)) {\n return {\n status: \"failed\",\n reason: \"wallet_disconnected\",\n message: walletDisconnectedMessage(),\n error: wrappedError,\n };\n }\n\n if (isNetworkError(error)) {\n return {\n status: \"failed\",\n reason: \"network_error\",\n message: networkErrorMessage(),\n error: wrappedError,\n };\n }\n\n if (isTransactionExpiredError(error)) {\n return {\n status: \"failed\",\n reason: \"transaction_expired\",\n message: transactionExpiredMessage(),\n error: wrappedError,\n };\n }\n\n // Default: generic program error\n return {\n status: \"failed\",\n reason: \"program_error\",\n message: transactionFailedMessage(wrappedError.message),\n error: wrappedError,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["address","config","address","config","address","config","isTransactionSigner","kitIsTransactionSigner","config","config","config","config","config","config","config","config","config","satiErrorMessages: Record<SatiError, string> | undefined","SCHEMA_CONFIGS: Record<string, Omit<SchemaConfig, \"sasSchema\">>","address","result: ContentSizeValidationResult","addressToBytes","address","zeroDataHash","address","schemaConfigPdas: Address[]","derivedAtas: Address[]","memcmpFilters: MemcmpFilter[]","attestations: ParsedAttestation[]","addressDecoder","attestation: CompressedAttestation","SAS_PROGRAM_ADDRESS: Address","addressEncoder","address","addressEncoder","ED25519_PROGRAM_ADDRESS: Address","address","OUTCOME_LABELS: Record<Outcome, string>","SOLANA_CHAIN_REFS: Record<SolanaNetwork, string>","address","feedbackHash","outcome","hexHash","text","MAX_CONTENT_SIZE","configs: Record<string, SATISASConfig | null>","(devnetJson as DeployedJson).config","(mainnetJson as DeployedJson).config","config","MIME_TYPES: Record<string, string>","address","fetchToken2022Mint","additionalMetadata: Record<string, string>","results: (AgentIdentity | null)[]","fetchToken2022Token","address","pdas: Address[]","agents: AgentIdentity[]","potentialMints: Address[]","ixList: UpdateInstruction[]","agentAta: Address | undefined","addressEncoder","proof: ValidityProofArgs","addressTreeInfo: PackedAddressTreeInfoArgs","ed25519Entries: { publicKey: Uint8Array; message: Uint8Array; signature: Uint8Array }[]","accountMeta: CompressedAccountMetaArgs","zeroDataHash","instructions: Array<Parameters<typeof appendTransactionMessageInstructions>[0][number]>","results: ReputationScoreData[]","agentValid","contentObj: Record<string, unknown>","filter: Partial<AttestationFilter>","feedbacks: ParsedFeedback[]","regFiles: (import(\"./registration\").RegistrationFile | null)[]","filtered: { identity: AgentIdentity; regFile: import(\"./registration\").RegistrationFile | null }[]","statsMap: Map<string, ReputationSummary> | null","code: SatiErrorCode","agentMint: string","schema: string"],"sources":["../src/generated/accounts/agentIndex.ts","../src/generated/accounts/registryConfig.ts","../src/generated/types/agentRegistered.ts","../src/generated/types/attestationClosed.ts","../src/generated/types/attestationCreated.ts","../src/generated/types/compressedAccountMeta.ts","../src/generated/types/compressedProof.ts","../src/generated/types/evmAddressLinked.ts","../src/generated/types/metadataEntry.ts","../src/generated/types/packedAddressTreeInfo.ts","../src/generated/types/packedStateTreeInfo.ts","../src/generated/types/registryAuthorityUpdated.ts","../src/generated/types/registryInitialized.ts","../src/generated/types/schemaConfigRegistered.ts","../src/generated/types/signatureMode.ts","../src/generated/types/storageType.ts","../src/generated/types/validityProof.ts","../src/generated/accounts/schemaConfig.ts","../src/generated/shared/index.ts","../src/generated/instructions/closeCompressedAttestation.ts","../src/generated/instructions/closeRegularAttestation.ts","../src/generated/instructions/createCompressedAttestation.ts","../src/generated/instructions/createRegularAttestation.ts","../src/generated/instructions/initialize.ts","../src/generated/instructions/linkEvmAddress.ts","../src/generated/instructions/registerAgent.ts","../src/generated/instructions/registerSchemaConfig.ts","../src/generated/instructions/updateRegistryAuthority.ts","../src/generated/programs/sati.ts","../src/generated/errors/sati.ts","../src/schemas.ts","../src/hashes.ts","../src/compression.ts","../src/sas-pdas.ts","../src/helpers.ts","../src/ed25519.ts","../src/offchain-signing.ts","../src/encryption.ts","../src/uploaders.ts","../src/deployed/devnet.json","../src/deployed/mainnet.json","../src/deployed/index.ts","../src/registration.ts","../src/cache.ts","../src/agent-builder.ts","../src/client.ts","../src/errors.ts","../src/client/messages.ts","../src/client/errors.ts"],"sourcesContent":["/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n assertAccountExists,\n assertAccountsExist,\n combineCodec,\n decodeAccount,\n fetchEncodedAccount,\n fetchEncodedAccounts,\n fixDecoderSize,\n fixEncoderSize,\n getAddressDecoder,\n getAddressEncoder,\n getBytesDecoder,\n getBytesEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type Account,\n type Address,\n type EncodedAccount,\n type FetchAccountConfig,\n type FetchAccountsConfig,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type MaybeAccount,\n type MaybeEncodedAccount,\n type ReadonlyUint8Array,\n} from \"@solana/kit\";\n\nexport const AGENT_INDEX_DISCRIMINATOR = new Uint8Array([\n 241, 154, 35, 103, 180, 141, 49, 179,\n]);\n\nexport function getAgentIndexDiscriminatorBytes() {\n return fixEncoderSize(getBytesEncoder(), 8).encode(AGENT_INDEX_DISCRIMINATOR);\n}\n\nexport type AgentIndex = {\n discriminator: ReadonlyUint8Array;\n /** Agent mint address */\n mint: Address;\n /** PDA bump seed */\n bump: number;\n};\n\nexport type AgentIndexArgs = {\n /** Agent mint address */\n mint: Address;\n /** PDA bump seed */\n bump: number;\n};\n\n/** Gets the encoder for {@link AgentIndexArgs} account data. */\nexport function getAgentIndexEncoder(): FixedSizeEncoder<AgentIndexArgs> {\n return transformEncoder(\n getStructEncoder([\n [\"discriminator\", fixEncoderSize(getBytesEncoder(), 8)],\n [\"mint\", getAddressEncoder()],\n [\"bump\", getU8Encoder()],\n ]),\n (value) => ({ ...value, discriminator: AGENT_INDEX_DISCRIMINATOR }),\n );\n}\n\n/** Gets the decoder for {@link AgentIndex} account data. */\nexport function getAgentIndexDecoder(): FixedSizeDecoder<AgentIndex> {\n return getStructDecoder([\n [\"discriminator\", fixDecoderSize(getBytesDecoder(), 8)],\n [\"mint\", getAddressDecoder()],\n [\"bump\", getU8Decoder()],\n ]);\n}\n\n/** Gets the codec for {@link AgentIndex} account data. */\nexport function getAgentIndexCodec(): FixedSizeCodec<\n AgentIndexArgs,\n AgentIndex\n> {\n return combineCodec(getAgentIndexEncoder(), getAgentIndexDecoder());\n}\n\nexport function decodeAgentIndex<TAddress extends string = string>(\n encodedAccount: EncodedAccount<TAddress>,\n): Account<AgentIndex, TAddress>;\nexport function decodeAgentIndex<TAddress extends string = string>(\n encodedAccount: MaybeEncodedAccount<TAddress>,\n): MaybeAccount<AgentIndex, TAddress>;\nexport function decodeAgentIndex<TAddress extends string = string>(\n encodedAccount: EncodedAccount<TAddress> | MaybeEncodedAccount<TAddress>,\n): Account<AgentIndex, TAddress> | MaybeAccount<AgentIndex, TAddress> {\n return decodeAccount(\n encodedAccount as MaybeEncodedAccount<TAddress>,\n getAgentIndexDecoder(),\n );\n}\n\nexport async function fetchAgentIndex<TAddress extends string = string>(\n rpc: Parameters<typeof fetchEncodedAccount>[0],\n address: Address<TAddress>,\n config?: FetchAccountConfig,\n): Promise<Account<AgentIndex, TAddress>> {\n const maybeAccount = await fetchMaybeAgentIndex(rpc, address, config);\n assertAccountExists(maybeAccount);\n return maybeAccount;\n}\n\nexport async function fetchMaybeAgentIndex<TAddress extends string = string>(\n rpc: Parameters<typeof fetchEncodedAccount>[0],\n address: Address<TAddress>,\n config?: FetchAccountConfig,\n): Promise<MaybeAccount<AgentIndex, TAddress>> {\n const maybeAccount = await fetchEncodedAccount(rpc, address, config);\n return decodeAgentIndex(maybeAccount);\n}\n\nexport async function fetchAllAgentIndex(\n rpc: Parameters<typeof fetchEncodedAccounts>[0],\n addresses: Array<Address>,\n config?: FetchAccountsConfig,\n): Promise<Account<AgentIndex>[]> {\n const maybeAccounts = await fetchAllMaybeAgentIndex(rpc, addresses, config);\n assertAccountsExist(maybeAccounts);\n return maybeAccounts;\n}\n\nexport async function fetchAllMaybeAgentIndex(\n rpc: Parameters<typeof fetchEncodedAccounts>[0],\n addresses: Array<Address>,\n config?: FetchAccountsConfig,\n): Promise<MaybeAccount<AgentIndex>[]> {\n const maybeAccounts = await fetchEncodedAccounts(rpc, addresses, config);\n return maybeAccounts.map((maybeAccount) => decodeAgentIndex(maybeAccount));\n}\n\nexport function getAgentIndexSize(): number {\n return 41;\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n assertAccountExists,\n assertAccountsExist,\n combineCodec,\n decodeAccount,\n fetchEncodedAccount,\n fetchEncodedAccounts,\n fixDecoderSize,\n fixEncoderSize,\n getAddressDecoder,\n getAddressEncoder,\n getBytesDecoder,\n getBytesEncoder,\n getStructDecoder,\n getStructEncoder,\n getU64Decoder,\n getU64Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type Account,\n type Address,\n type EncodedAccount,\n type FetchAccountConfig,\n type FetchAccountsConfig,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type MaybeAccount,\n type MaybeEncodedAccount,\n type ReadonlyUint8Array,\n} from \"@solana/kit\";\n\nexport const REGISTRY_CONFIG_DISCRIMINATOR = new Uint8Array([\n 23, 118, 10, 246, 173, 231, 243, 156,\n]);\n\nexport function getRegistryConfigDiscriminatorBytes() {\n return fixEncoderSize(getBytesEncoder(), 8).encode(\n REGISTRY_CONFIG_DISCRIMINATOR,\n );\n}\n\nexport type RegistryConfig = {\n discriminator: ReadonlyUint8Array;\n /** SATI TokenGroup mint address */\n groupMint: Address;\n /**\n * Authority that can update registry settings\n * Set to Pubkey::default() to make immutable\n */\n authority: Address;\n /** Total agents registered (counter) */\n totalAgents: bigint;\n /** PDA bump seed (stored for efficient CPI signing) */\n bump: number;\n};\n\nexport type RegistryConfigArgs = {\n /** SATI TokenGroup mint address */\n groupMint: Address;\n /**\n * Authority that can update registry settings\n * Set to Pubkey::default() to make immutable\n */\n authority: Address;\n /** Total agents registered (counter) */\n totalAgents: number | bigint;\n /** PDA bump seed (stored for efficient CPI signing) */\n bump: number;\n};\n\n/** Gets the encoder for {@link RegistryConfigArgs} account data. */\nexport function getRegistryConfigEncoder(): FixedSizeEncoder<RegistryConfigArgs> {\n return transformEncoder(\n getStructEncoder([\n [\"discriminator\", fixEncoderSize(getBytesEncoder(), 8)],\n [\"groupMint\", getAddressEncoder()],\n [\"authority\", getAddressEncoder()],\n [\"totalAgents\", getU64Encoder()],\n [\"bump\", getU8Encoder()],\n ]),\n (value) => ({ ...value, discriminator: REGISTRY_CONFIG_DISCRIMINATOR }),\n );\n}\n\n/** Gets the decoder for {@link RegistryConfig} account data. */\nexport function getRegistryConfigDecoder(): FixedSizeDecoder<RegistryConfig> {\n return getStructDecoder([\n [\"discriminator\", fixDecoderSize(getBytesDecoder(), 8)],\n [\"groupMint\", getAddressDecoder()],\n [\"authority\", getAddressDecoder()],\n [\"totalAgents\", getU64Decoder()],\n [\"bump\", getU8Decoder()],\n ]);\n}\n\n/** Gets the codec for {@link RegistryConfig} account data. */\nexport function getRegistryConfigCodec(): FixedSizeCodec<\n RegistryConfigArgs,\n RegistryConfig\n> {\n return combineCodec(getRegistryConfigEncoder(), getRegistryConfigDecoder());\n}\n\nexport function decodeRegistryConfig<TAddress extends string = string>(\n encodedAccount: EncodedAccount<TAddress>,\n): Account<RegistryConfig, TAddress>;\nexport function decodeRegistryConfig<TAddress extends string = string>(\n encodedAccount: MaybeEncodedAccount<TAddress>,\n): MaybeAccount<RegistryConfig, TAddress>;\nexport function decodeRegistryConfig<TAddress extends string = string>(\n encodedAccount: EncodedAccount<TAddress> | MaybeEncodedAccount<TAddress>,\n): Account<RegistryConfig, TAddress> | MaybeAccount<RegistryConfig, TAddress> {\n return decodeAccount(\n encodedAccount as MaybeEncodedAccount<TAddress>,\n getRegistryConfigDecoder(),\n );\n}\n\nexport async function fetchRegistryConfig<TAddress extends string = string>(\n rpc: Parameters<typeof fetchEncodedAccount>[0],\n address: Address<TAddress>,\n config?: FetchAccountConfig,\n): Promise<Account<RegistryConfig, TAddress>> {\n const maybeAccount = await fetchMaybeRegistryConfig(rpc, address, config);\n assertAccountExists(maybeAccount);\n return maybeAccount;\n}\n\nexport async function fetchMaybeRegistryConfig<\n TAddress extends string = string,\n>(\n rpc: Parameters<typeof fetchEncodedAccount>[0],\n address: Address<TAddress>,\n config?: FetchAccountConfig,\n): Promise<MaybeAccount<RegistryConfig, TAddress>> {\n const maybeAccount = await fetchEncodedAccount(rpc, address, config);\n return decodeRegistryConfig(maybeAccount);\n}\n\nexport async function fetchAllRegistryConfig(\n rpc: Parameters<typeof fetchEncodedAccounts>[0],\n addresses: Array<Address>,\n config?: FetchAccountsConfig,\n): Promise<Account<RegistryConfig>[]> {\n const maybeAccounts = await fetchAllMaybeRegistryConfig(\n rpc,\n addresses,\n config,\n );\n assertAccountsExist(maybeAccounts);\n return maybeAccounts;\n}\n\nexport async function fetchAllMaybeRegistryConfig(\n rpc: Parameters<typeof fetchEncodedAccounts>[0],\n addresses: Array<Address>,\n config?: FetchAccountsConfig,\n): Promise<MaybeAccount<RegistryConfig>[]> {\n const maybeAccounts = await fetchEncodedAccounts(rpc, addresses, config);\n return maybeAccounts.map((maybeAccount) =>\n decodeRegistryConfig(maybeAccount),\n );\n}\n\nexport function getRegistryConfigSize(): number {\n return 81;\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n addDecoderSizePrefix,\n addEncoderSizePrefix,\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getBooleanDecoder,\n getBooleanEncoder,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getU64Decoder,\n getU64Encoder,\n getUtf8Decoder,\n getUtf8Encoder,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n} from \"@solana/kit\";\n\nexport type AgentRegistered = {\n mint: Address;\n owner: Address;\n memberNumber: bigint;\n name: string;\n uri: string;\n nonTransferable: boolean;\n};\n\nexport type AgentRegisteredArgs = {\n mint: Address;\n owner: Address;\n memberNumber: number | bigint;\n name: string;\n uri: string;\n nonTransferable: boolean;\n};\n\nexport function getAgentRegisteredEncoder(): Encoder<AgentRegisteredArgs> {\n return getStructEncoder([\n [\"mint\", getAddressEncoder()],\n [\"owner\", getAddressEncoder()],\n [\"memberNumber\", getU64Encoder()],\n [\"name\", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n [\"uri\", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n [\"nonTransferable\", getBooleanEncoder()],\n ]);\n}\n\nexport function getAgentRegisteredDecoder(): Decoder<AgentRegistered> {\n return getStructDecoder([\n [\"mint\", getAddressDecoder()],\n [\"owner\", getAddressDecoder()],\n [\"memberNumber\", getU64Decoder()],\n [\"name\", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n [\"uri\", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n [\"nonTransferable\", getBooleanDecoder()],\n ]);\n}\n\nexport function getAgentRegisteredCodec(): Codec<\n AgentRegisteredArgs,\n AgentRegistered\n> {\n return combineCodec(getAgentRegisteredEncoder(), getAgentRegisteredDecoder());\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getStructDecoder,\n getStructEncoder,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n} from \"@solana/kit\";\n\n/** Emitted when an attestation is closed */\nexport type AttestationClosed = {\n /** SAS schema address */\n sasSchema: Address;\n /** Agent's MINT ADDRESS (Token-2022 NFT, stable identity) */\n agentMint: Address;\n /** Attestation address that was closed */\n address: Address;\n};\n\nexport type AttestationClosedArgs = AttestationClosed;\n\nexport function getAttestationClosedEncoder(): FixedSizeEncoder<AttestationClosedArgs> {\n return getStructEncoder([\n [\"sasSchema\", getAddressEncoder()],\n [\"agentMint\", getAddressEncoder()],\n [\"address\", getAddressEncoder()],\n ]);\n}\n\nexport function getAttestationClosedDecoder(): FixedSizeDecoder<AttestationClosed> {\n return getStructDecoder([\n [\"sasSchema\", getAddressDecoder()],\n [\"agentMint\", getAddressDecoder()],\n [\"address\", getAddressDecoder()],\n ]);\n}\n\nexport function getAttestationClosedCodec(): FixedSizeCodec<\n AttestationClosedArgs,\n AttestationClosed\n> {\n return combineCodec(\n getAttestationClosedEncoder(),\n getAttestationClosedDecoder(),\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getStructDecoder,\n getStructEncoder,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n} from \"@solana/kit\";\nimport {\n getStorageTypeDecoder,\n getStorageTypeEncoder,\n type StorageType,\n type StorageTypeArgs,\n} from \".\";\n\n/** Emitted when an attestation is created (compressed or regular) */\nexport type AttestationCreated = {\n /** SAS schema address */\n sasSchema: Address;\n /** Agent's MINT ADDRESS (Token-2022 NFT, stable identity) */\n agentMint: Address;\n /** Counterparty (client for Feedback, validator for Validation, provider for ReputationScore) */\n counterparty: Address;\n /** Storage type used */\n storageType: StorageType;\n /** Attestation address (Light address for compressed, PDA for regular) */\n address: Address;\n};\n\nexport type AttestationCreatedArgs = {\n /** SAS schema address */\n sasSchema: Address;\n /** Agent's MINT ADDRESS (Token-2022 NFT, stable identity) */\n agentMint: Address;\n /** Counterparty (client for Feedback, validator for Validation, provider for ReputationScore) */\n counterparty: Address;\n /** Storage type used */\n storageType: StorageTypeArgs;\n /** Attestation address (Light address for compressed, PDA for regular) */\n address: Address;\n};\n\nexport function getAttestationCreatedEncoder(): FixedSizeEncoder<AttestationCreatedArgs> {\n return getStructEncoder([\n [\"sasSchema\", getAddressEncoder()],\n [\"agentMint\", getAddressEncoder()],\n [\"counterparty\", getAddressEncoder()],\n [\"storageType\", getStorageTypeEncoder()],\n [\"address\", getAddressEncoder()],\n ]);\n}\n\nexport function getAttestationCreatedDecoder(): FixedSizeDecoder<AttestationCreated> {\n return getStructDecoder([\n [\"sasSchema\", getAddressDecoder()],\n [\"agentMint\", getAddressDecoder()],\n [\"counterparty\", getAddressDecoder()],\n [\"storageType\", getStorageTypeDecoder()],\n [\"address\", getAddressDecoder()],\n ]);\n}\n\nexport function getAttestationCreatedCodec(): FixedSizeCodec<\n AttestationCreatedArgs,\n AttestationCreated\n> {\n return combineCodec(\n getAttestationCreatedEncoder(),\n getAttestationCreatedDecoder(),\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n fixDecoderSize,\n fixEncoderSize,\n getBytesDecoder,\n getBytesEncoder,\n getStructDecoder,\n getStructEncoder,\n getU8Decoder,\n getU8Encoder,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type ReadonlyUint8Array,\n} from \"@solana/kit\";\nimport {\n getPackedStateTreeInfoDecoder,\n getPackedStateTreeInfoEncoder,\n type PackedStateTreeInfo,\n type PackedStateTreeInfoArgs,\n} from \".\";\n\nexport type CompressedAccountMeta = {\n /** Merkle tree context. */\n treeInfo: PackedStateTreeInfo;\n /** Address. */\n address: ReadonlyUint8Array;\n /** Output merkle tree index. */\n outputStateTreeIndex: number;\n};\n\nexport type CompressedAccountMetaArgs = {\n /** Merkle tree context. */\n treeInfo: PackedStateTreeInfoArgs;\n /** Address. */\n address: ReadonlyUint8Array;\n /** Output merkle tree index. */\n outputStateTreeIndex: number;\n};\n\nexport function getCompressedAccountMetaEncoder(): FixedSizeEncoder<CompressedAccountMetaArgs> {\n return getStructEncoder([\n [\"treeInfo\", getPackedStateTreeInfoEncoder()],\n [\"address\", fixEncoderSize(getBytesEncoder(), 32)],\n [\"outputStateTreeIndex\", getU8Encoder()],\n ]);\n}\n\nexport function getCompressedAccountMetaDecoder(): FixedSizeDecoder<CompressedAccountMeta> {\n return getStructDecoder([\n [\"treeInfo\", getPackedStateTreeInfoDecoder()],\n [\"address\", fixDecoderSize(getBytesDecoder(), 32)],\n [\"outputStateTreeIndex\", getU8Decoder()],\n ]);\n}\n\nexport function getCompressedAccountMetaCodec(): FixedSizeCodec<\n CompressedAccountMetaArgs,\n CompressedAccountMeta\n> {\n return combineCodec(\n getCompressedAccountMetaEncoder(),\n getCompressedAccountMetaDecoder(),\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n fixDecoderSize,\n fixEncoderSize,\n getBytesDecoder,\n getBytesEncoder,\n getStructDecoder,\n getStructEncoder,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type ReadonlyUint8Array,\n} from \"@solana/kit\";\n\nexport type CompressedProof = {\n a: ReadonlyUint8Array;\n b: ReadonlyUint8Array;\n c: ReadonlyUint8Array;\n};\n\nexport type CompressedProofArgs = CompressedProof;\n\nexport function getCompressedProofEncoder(): FixedSizeEncoder<CompressedProofArgs> {\n return getStructEncoder([\n [\"a\", fixEncoderSize(getBytesEncoder(), 32)],\n [\"b\", fixEncoderSize(getBytesEncoder(), 64)],\n [\"c\", fixEncoderSize(getBytesEncoder(), 32)],\n ]);\n}\n\nexport function getCompressedProofDecoder(): FixedSizeDecoder<CompressedProof> {\n return getStructDecoder([\n [\"a\", fixDecoderSize(getBytesDecoder(), 32)],\n [\"b\", fixDecoderSize(getBytesDecoder(), 64)],\n [\"c\", fixDecoderSize(getBytesDecoder(), 32)],\n ]);\n}\n\nexport function getCompressedProofCodec(): FixedSizeCodec<\n CompressedProofArgs,\n CompressedProof\n> {\n return combineCodec(getCompressedProofEncoder(), getCompressedProofDecoder());\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n addDecoderSizePrefix,\n addEncoderSizePrefix,\n combineCodec,\n fixDecoderSize,\n fixEncoderSize,\n getAddressDecoder,\n getAddressEncoder,\n getBytesDecoder,\n getBytesEncoder,\n getI64Decoder,\n getI64Encoder,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getUtf8Decoder,\n getUtf8Encoder,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type ReadonlyUint8Array,\n} from \"@solana/kit\";\n\n/** Emitted when an EVM address is linked to an agent */\nexport type EvmAddressLinked = {\n /** Agent mint address */\n agentMint: Address;\n /** EVM address (20 bytes) */\n evmAddress: ReadonlyUint8Array;\n /** CAIP-2 chain identifier (e.g., \"eip155:1\") */\n chainId: string;\n /** Unix timestamp when linked */\n linkedAt: bigint;\n};\n\nexport type EvmAddressLinkedArgs = {\n /** Agent mint address */\n agentMint: Address;\n /** EVM address (20 bytes) */\n evmAddress: ReadonlyUint8Array;\n /** CAIP-2 chain identifier (e.g., \"eip155:1\") */\n chainId: string;\n /** Unix timestamp when linked */\n linkedAt: number | bigint;\n};\n\nexport function getEvmAddressLinkedEncoder(): Encoder<EvmAddressLinkedArgs> {\n return getStructEncoder([\n [\"agentMint\", getAddressEncoder()],\n [\"evmAddress\", fixEncoderSize(getBytesEncoder(), 20)],\n [\"chainId\", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n [\"linkedAt\", getI64Encoder()],\n ]);\n}\n\nexport function getEvmAddressLinkedDecoder(): Decoder<EvmAddressLinked> {\n return getStructDecoder([\n [\"agentMint\", getAddressDecoder()],\n [\"evmAddress\", fixDecoderSize(getBytesDecoder(), 20)],\n [\"chainId\", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n [\"linkedAt\", getI64Decoder()],\n ]);\n}\n\nexport function getEvmAddressLinkedCodec(): Codec<\n EvmAddressLinkedArgs,\n EvmAddressLinked\n> {\n return combineCodec(\n getEvmAddressLinkedEncoder(),\n getEvmAddressLinkedDecoder(),\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n addDecoderSizePrefix,\n addEncoderSizePrefix,\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getUtf8Decoder,\n getUtf8Encoder,\n type Codec,\n type Decoder,\n type Encoder,\n} from \"@solana/kit\";\n\n/**\n * Metadata key-value pair for agent registration\n * Used as instruction argument (Anchor-compatible)\n */\nexport type MetadataEntry = { key: string; value: string };\n\nexport type MetadataEntryArgs = MetadataEntry;\n\nexport function getMetadataEntryEncoder(): Encoder<MetadataEntryArgs> {\n return getStructEncoder([\n [\"key\", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n [\"value\", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n ]);\n}\n\nexport function getMetadataEntryDecoder(): Decoder<MetadataEntry> {\n return getStructDecoder([\n [\"key\", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n [\"value\", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n ]);\n}\n\nexport function getMetadataEntryCodec(): Codec<\n MetadataEntryArgs,\n MetadataEntry\n> {\n return combineCodec(getMetadataEntryEncoder(), getMetadataEntryDecoder());\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getStructDecoder,\n getStructEncoder,\n getU16Decoder,\n getU16Encoder,\n getU8Decoder,\n getU8Encoder,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n} from \"@solana/kit\";\n\nexport type PackedAddressTreeInfo = {\n addressMerkleTreePubkeyIndex: number;\n addressQueuePubkeyIndex: number;\n rootIndex: number;\n};\n\nexport type PackedAddressTreeInfoArgs = PackedAddressTreeInfo;\n\nexport function getPackedAddressTreeInfoEncoder(): FixedSizeEncoder<PackedAddressTreeInfoArgs> {\n return getStructEncoder([\n [\"addressMerkleTreePubkeyIndex\", getU8Encoder()],\n [\"addressQueuePubkeyIndex\", getU8Encoder()],\n [\"rootIndex\", getU16Encoder()],\n ]);\n}\n\nexport function getPackedAddressTreeInfoDecoder(): FixedSizeDecoder<PackedAddressTreeInfo> {\n return getStructDecoder([\n [\"addressMerkleTreePubkeyIndex\", getU8Decoder()],\n [\"addressQueuePubkeyIndex\", getU8Decoder()],\n [\"rootIndex\", getU16Decoder()],\n ]);\n}\n\nexport function getPackedAddressTreeInfoCodec(): FixedSizeCodec<\n PackedAddressTreeInfoArgs,\n PackedAddressTreeInfo\n> {\n return combineCodec(\n getPackedAddressTreeInfoEncoder(),\n getPackedAddressTreeInfoDecoder(),\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getBooleanDecoder,\n getBooleanEncoder,\n getStructDecoder,\n getStructEncoder,\n getU16Decoder,\n getU16Encoder,\n getU32Decoder,\n getU32Encoder,\n getU8Decoder,\n getU8Encoder,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n} from \"@solana/kit\";\n\nexport type PackedStateTreeInfo = {\n rootIndex: number;\n proveByIndex: boolean;\n merkleTreePubkeyIndex: number;\n queuePubkeyIndex: number;\n leafIndex: number;\n};\n\nexport type PackedStateTreeInfoArgs = PackedStateTreeInfo;\n\nexport function getPackedStateTreeInfoEncoder(): FixedSizeEncoder<PackedStateTreeInfoArgs> {\n return getStructEncoder([\n [\"rootIndex\", getU16Encoder()],\n [\"proveByIndex\", getBooleanEncoder()],\n [\"merkleTreePubkeyIndex\", getU8Encoder()],\n [\"queuePubkeyIndex\", getU8Encoder()],\n [\"leafIndex\", getU32Encoder()],\n ]);\n}\n\nexport function getPackedStateTreeInfoDecoder(): FixedSizeDecoder<PackedStateTreeInfo> {\n return getStructDecoder([\n [\"rootIndex\", getU16Decoder()],\n [\"proveByIndex\", getBooleanDecoder()],\n [\"merkleTreePubkeyIndex\", getU8Decoder()],\n [\"queuePubkeyIndex\", getU8Decoder()],\n [\"leafIndex\", getU32Decoder()],\n ]);\n}\n\nexport function getPackedStateTreeInfoCodec(): FixedSizeCodec<\n PackedStateTreeInfoArgs,\n PackedStateTreeInfo\n> {\n return combineCodec(\n getPackedStateTreeInfoEncoder(),\n getPackedStateTreeInfoDecoder(),\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Option,\n type OptionOrNullable,\n} from \"@solana/kit\";\n\nexport type RegistryAuthorityUpdated = {\n oldAuthority: Address;\n newAuthority: Option<Address>;\n};\n\nexport type RegistryAuthorityUpdatedArgs = {\n oldAuthority: Address;\n newAuthority: OptionOrNullable<Address>;\n};\n\nexport function getRegistryAuthorityUpdatedEncoder(): Encoder<RegistryAuthorityUpdatedArgs> {\n return getStructEncoder([\n [\"oldAuthority\", getAddressEncoder()],\n [\"newAuthority\", getOptionEncoder(getAddressEncoder())],\n ]);\n}\n\nexport function getRegistryAuthorityUpdatedDecoder(): Decoder<RegistryAuthorityUpdated> {\n return getStructDecoder([\n [\"oldAuthority\", getAddressDecoder()],\n [\"newAuthority\", getOptionDecoder(getAddressDecoder())],\n ]);\n}\n\nexport function getRegistryAuthorityUpdatedCodec(): Codec<\n RegistryAuthorityUpdatedArgs,\n RegistryAuthorityUpdated\n> {\n return combineCodec(\n getRegistryAuthorityUpdatedEncoder(),\n getRegistryAuthorityUpdatedDecoder(),\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getStructDecoder,\n getStructEncoder,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n} from \"@solana/kit\";\n\nexport type RegistryInitialized = { authority: Address; groupMint: Address };\n\nexport type RegistryInitializedArgs = RegistryInitialized;\n\nexport function getRegistryInitializedEncoder(): FixedSizeEncoder<RegistryInitializedArgs> {\n return getStructEncoder([\n [\"authority\", getAddressEncoder()],\n [\"groupMint\", getAddressEncoder()],\n ]);\n}\n\nexport function getRegistryInitializedDecoder(): FixedSizeDecoder<RegistryInitialized> {\n return getStructDecoder([\n [\"authority\", getAddressDecoder()],\n [\"groupMint\", getAddressDecoder()],\n ]);\n}\n\nexport function getRegistryInitializedCodec(): FixedSizeCodec<\n RegistryInitializedArgs,\n RegistryInitialized\n> {\n return combineCodec(\n getRegistryInitializedEncoder(),\n getRegistryInitializedDecoder(),\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n addDecoderSizePrefix,\n addEncoderSizePrefix,\n combineCodec,\n getAddressDecoder,\n getAddressEncoder,\n getBooleanDecoder,\n getBooleanEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getUtf8Decoder,\n getUtf8Encoder,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Option,\n type OptionOrNullable,\n} from \"@solana/kit\";\nimport {\n getSignatureModeDecoder,\n getSignatureModeEncoder,\n getStorageTypeDecoder,\n getStorageTypeEncoder,\n type SignatureMode,\n type SignatureModeArgs,\n type StorageType,\n type StorageTypeArgs,\n} from \".\";\n\n/** Emitted when a schema config is registered */\nexport type SchemaConfigRegistered = {\n /** SAS schema address */\n schema: Address;\n /** Signature mode (DualSignature, CounterpartySigned, or AgentOwnerSigned) */\n signatureMode: SignatureMode;\n /** Storage type (Compressed or Regular) */\n storageType: StorageType;\n /** Schema for delegation verification (None = owner only) */\n delegationSchema: Option<Address>;\n /** Whether attestations can be closed */\n closeable: boolean;\n /** Human-readable schema name (max 32 chars) */\n name: string;\n};\n\nexport type SchemaConfigRegisteredArgs = {\n /** SAS schema address */\n schema: Address;\n /** Signature mode (DualSignature, CounterpartySigned, or AgentOwnerSigned) */\n signatureMode: SignatureModeArgs;\n /** Storage type (Compressed or Regular) */\n storageType: StorageTypeArgs;\n /** Schema for delegation verification (None = owner only) */\n delegationSchema: OptionOrNullable<Address>;\n /** Whether attestations can be closed */\n closeable: boolean;\n /** Human-readable schema name (max 32 chars) */\n name: string;\n};\n\nexport function getSchemaConfigRegisteredEncoder(): Encoder<SchemaConfigRegisteredArgs> {\n return getStructEncoder([\n [\"schema\", getAddressEncoder()],\n [\"signatureMode\", getSignatureModeEncoder()],\n [\"storageType\", getStorageTypeEncoder()],\n [\"delegationSchema\", getOptionEncoder(getAddressEncoder())],\n [\"closeable\", getBooleanEncoder()],\n [\"name\", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n ]);\n}\n\nexport function getSchemaConfigRegisteredDecoder(): Decoder<SchemaConfigRegistered> {\n return getStructDecoder([\n [\"schema\", getAddressDecoder()],\n [\"signatureMode\", getSignatureModeDecoder()],\n [\"storageType\", getStorageTypeDecoder()],\n [\"delegationSchema\", getOptionDecoder(getAddressDecoder())],\n [\"closeable\", getBooleanDecoder()],\n [\"name\", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n ]);\n}\n\nexport function getSchemaConfigRegisteredCodec(): Codec<\n SchemaConfigRegisteredArgs,\n SchemaConfigRegistered\n> {\n return combineCodec(\n getSchemaConfigRegisteredEncoder(),\n getSchemaConfigRegisteredDecoder(),\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getEnumDecoder,\n getEnumEncoder,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n} from \"@solana/kit\";\n\n/** Signature mode determines how many signatures are required and who signs */\nexport enum SignatureMode {\n DualSignature,\n CounterpartySigned,\n AgentOwnerSigned,\n}\n\nexport type SignatureModeArgs = SignatureMode;\n\nexport function getSignatureModeEncoder(): FixedSizeEncoder<SignatureModeArgs> {\n return getEnumEncoder(SignatureMode);\n}\n\nexport function getSignatureModeDecoder(): FixedSizeDecoder<SignatureMode> {\n return getEnumDecoder(SignatureMode);\n}\n\nexport function getSignatureModeCodec(): FixedSizeCodec<\n SignatureModeArgs,\n SignatureMode\n> {\n return combineCodec(getSignatureModeEncoder(), getSignatureModeDecoder());\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getEnumDecoder,\n getEnumEncoder,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n} from \"@solana/kit\";\n\n/** Storage type determines where attestations are stored */\nexport enum StorageType {\n Compressed,\n Regular,\n}\n\nexport type StorageTypeArgs = StorageType;\n\nexport function getStorageTypeEncoder(): FixedSizeEncoder<StorageTypeArgs> {\n return getEnumEncoder(StorageType);\n}\n\nexport function getStorageTypeDecoder(): FixedSizeDecoder<StorageType> {\n return getEnumDecoder(StorageType);\n}\n\nexport function getStorageTypeCodec(): FixedSizeCodec<\n StorageTypeArgs,\n StorageType\n> {\n return combineCodec(getStorageTypeEncoder(), getStorageTypeDecoder());\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n getOptionDecoder,\n getOptionEncoder,\n getTupleDecoder,\n getTupleEncoder,\n type Codec,\n type Decoder,\n type Encoder,\n type Option,\n type OptionOrNullable,\n} from \"@solana/kit\";\nimport {\n getCompressedProofDecoder,\n getCompressedProofEncoder,\n type CompressedProof,\n type CompressedProofArgs,\n} from \".\";\n\nexport type ValidityProof = readonly [Option<CompressedProof>];\n\nexport type ValidityProofArgs = readonly [\n OptionOrNullable<CompressedProofArgs>,\n];\n\nexport function getValidityProofEncoder(): Encoder<ValidityProofArgs> {\n return getTupleEncoder([getOptionEncoder(getCompressedProofEncoder())]);\n}\n\nexport function getValidityProofDecoder(): Decoder<ValidityProof> {\n return getTupleDecoder([getOptionDecoder(getCompressedProofDecoder())]);\n}\n\nexport function getValidityProofCodec(): Codec<\n ValidityProofArgs,\n ValidityProof\n> {\n return combineCodec(getValidityProofEncoder(), getValidityProofDecoder());\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n addDecoderSizePrefix,\n addEncoderSizePrefix,\n assertAccountExists,\n assertAccountsExist,\n combineCodec,\n decodeAccount,\n fetchEncodedAccount,\n fetchEncodedAccounts,\n fixDecoderSize,\n fixEncoderSize,\n getAddressDecoder,\n getAddressEncoder,\n getBooleanDecoder,\n getBooleanEncoder,\n getBytesDecoder,\n getBytesEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getU8Decoder,\n getU8Encoder,\n getUtf8Decoder,\n getUtf8Encoder,\n transformEncoder,\n type Account,\n type Address,\n type Codec,\n type Decoder,\n type EncodedAccount,\n type Encoder,\n type FetchAccountConfig,\n type FetchAccountsConfig,\n type MaybeAccount,\n type MaybeEncodedAccount,\n type Option,\n type OptionOrNullable,\n type ReadonlyUint8Array,\n} from \"@solana/kit\";\nimport {\n getSignatureModeDecoder,\n getSignatureModeEncoder,\n getStorageTypeDecoder,\n getStorageTypeEncoder,\n type SignatureMode,\n type SignatureModeArgs,\n type StorageType,\n type StorageTypeArgs,\n} from \"../types\";\n\nexport const SCHEMA_CONFIG_DISCRIMINATOR = new Uint8Array([\n 211, 19, 105, 220, 186, 61, 182, 47,\n]);\n\nexport function getSchemaConfigDiscriminatorBytes() {\n return fixEncoderSize(getBytesEncoder(), 8).encode(\n SCHEMA_CONFIG_DISCRIMINATOR,\n );\n}\n\nexport type SchemaConfig = {\n discriminator: ReadonlyUint8Array;\n /** SAS schema address this config applies to */\n sasSchema: Address;\n /** Signature verification mode */\n signatureMode: SignatureMode;\n /** Storage backend type */\n storageType: StorageType;\n /**\n * Schema for delegation verification.\n * If Some: owner OR valid delegate can sign (AgentOwnerSigned mode).\n * If None: only owner can sign (or anyone for CounterpartySigned mode).\n */\n delegationSchema: Option<Address>;\n /** Whether attestations can be closed/nullified */\n closeable: boolean;\n /** Schema name for signing messages (max 32 chars) */\n name: string;\n /** PDA bump seed */\n bump: number;\n};\n\nexport type SchemaConfigArgs = {\n /** SAS schema address this config applies to */\n sasSchema: Address;\n /** Signature verification mode */\n signatureMode: SignatureModeArgs;\n /** Storage backend type */\n storageType: StorageTypeArgs;\n /**\n * Schema for delegation verification.\n * If Some: owner OR valid delegate can sign (AgentOwnerSigned mode).\n * If None: only owner can sign (or anyone for CounterpartySigned mode).\n */\n delegationSchema: OptionOrNullable<Address>;\n /** Whether attestations can be closed/nullified */\n closeable: boolean;\n /** Schema name for signing messages (max 32 chars) */\n name: string;\n /** PDA bump seed */\n bump: number;\n};\n\n/** Gets the encoder for {@link SchemaConfigArgs} account data. */\nexport function getSchemaConfigEncoder(): Encoder<SchemaConfigArgs> {\n return transformEncoder(\n getStructEncoder([\n [\"discriminator\", fixEncoderSize(getBytesEncoder(), 8)],\n [\"sasSchema\", getAddressEncoder()],\n [\"signatureMode\", getSignatureModeEncoder()],\n [\"storageType\", getStorageTypeEncoder()],\n [\"delegationSchema\", getOptionEncoder(getAddressEncoder())],\n [\"closeable\", getBooleanEncoder()],\n [\"name\", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n [\"bump\", getU8Encoder()],\n ]),\n (value) => ({ ...value, discriminator: SCHEMA_CONFIG_DISCRIMINATOR }),\n );\n}\n\n/** Gets the decoder for {@link SchemaConfig} account data. */\nexport function getSchemaConfigDecoder(): Decoder<SchemaConfig> {\n return getStructDecoder([\n [\"discriminator\", fixDecoderSize(getBytesDecoder(), 8)],\n [\"sasSchema\", getAddressDecoder()],\n [\"signatureMode\", getSignatureModeDecoder()],\n [\"storageType\", getStorageTypeDecoder()],\n [\"delegationSchema\", getOptionDecoder(getAddressDecoder())],\n [\"closeable\", getBooleanDecoder()],\n [\"name\", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n [\"bump\", getU8Decoder()],\n ]);\n}\n\n/** Gets the codec for {@link SchemaConfig} account data. */\nexport function getSchemaConfigCodec(): Codec<SchemaConfigArgs, SchemaConfig> {\n return combineCodec(getSchemaConfigEncoder(), getSchemaConfigDecoder());\n}\n\nexport function decodeSchemaConfig<TAddress extends string = string>(\n encodedAccount: EncodedAccount<TAddress>,\n): Account<SchemaConfig, TAddress>;\nexport function decodeSchemaConfig<TAddress extends string = string>(\n encodedAccount: MaybeEncodedAccount<TAddress>,\n): MaybeAccount<SchemaConfig, TAddress>;\nexport function decodeSchemaConfig<TAddress extends string = string>(\n encodedAccount: EncodedAccount<TAddress> | MaybeEncodedAccount<TAddress>,\n): Account<SchemaConfig, TAddress> | MaybeAccount<SchemaConfig, TAddress> {\n return decodeAccount(\n encodedAccount as MaybeEncodedAccount<TAddress>,\n getSchemaConfigDecoder(),\n );\n}\n\nexport async function fetchSchemaConfig<TAddress extends string = string>(\n rpc: Parameters<typeof fetchEncodedAccount>[0],\n address: Address<TAddress>,\n config?: FetchAccountConfig,\n): Promise<Account<SchemaConfig, TAddress>> {\n const maybeAccount = await fetchMaybeSchemaConfig(rpc, address, config);\n assertAccountExists(maybeAccount);\n return maybeAccount;\n}\n\nexport async function fetchMaybeSchemaConfig<TAddress extends string = string>(\n rpc: Parameters<typeof fetchEncodedAccount>[0],\n address: Address<TAddress>,\n config?: FetchAccountConfig,\n): Promise<MaybeAccount<SchemaConfig, TAddress>> {\n const maybeAccount = await fetchEncodedAccount(rpc, address, config);\n return decodeSchemaConfig(maybeAccount);\n}\n\nexport async function fetchAllSchemaConfig(\n rpc: Parameters<typeof fetchEncodedAccounts>[0],\n addresses: Array<Address>,\n config?: FetchAccountsConfig,\n): Promise<Account<SchemaConfig>[]> {\n const maybeAccounts = await fetchAllMaybeSchemaConfig(rpc, addresses, config);\n assertAccountsExist(maybeAccounts);\n return maybeAccounts;\n}\n\nexport async function fetchAllMaybeSchemaConfig(\n rpc: Parameters<typeof fetchEncodedAccounts>[0],\n addresses: Array<Address>,\n config?: FetchAccountsConfig,\n): Promise<MaybeAccount<SchemaConfig>[]> {\n const maybeAccounts = await fetchEncodedAccounts(rpc, addresses, config);\n return maybeAccounts.map((maybeAccount) => decodeSchemaConfig(maybeAccount));\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n AccountRole,\n isProgramDerivedAddress,\n isTransactionSigner as kitIsTransactionSigner,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type ProgramDerivedAddress,\n type TransactionSigner,\n upgradeRoleToSigner,\n} from \"@solana/kit\";\n\n/**\n * Asserts that the given value is not null or undefined.\n * @internal\n */\nexport function expectSome<T>(value: T | null | undefined): T {\n if (value === null || value === undefined) {\n throw new Error(\"Expected a value but received null or undefined.\");\n }\n return value;\n}\n\n/**\n * Asserts that the given value is a PublicKey.\n * @internal\n */\nexport function expectAddress<T extends string = string>(\n value:\n | Address<T>\n | ProgramDerivedAddress<T>\n | TransactionSigner<T>\n | null\n | undefined,\n): Address<T> {\n if (!value) {\n throw new Error(\"Expected a Address.\");\n }\n if (typeof value === \"object\" && \"address\" in value) {\n return value.address;\n }\n if (Array.isArray(value)) {\n return value[0] as Address<T>;\n }\n return value as Address<T>;\n}\n\n/**\n * Asserts that the given value is a PDA.\n * @internal\n */\nexport function expectProgramDerivedAddress<T extends string = string>(\n value:\n | Address<T>\n | ProgramDerivedAddress<T>\n | TransactionSigner<T>\n | null\n | undefined,\n): ProgramDerivedAddress<T> {\n if (!value || !Array.isArray(value) || !isProgramDerivedAddress(value)) {\n throw new Error(\"Expected a ProgramDerivedAddress.\");\n }\n return value;\n}\n\n/**\n * Asserts that the given value is a TransactionSigner.\n * @internal\n */\nexport function expectTransactionSigner<T extends string = string>(\n value:\n | Address<T>\n | ProgramDerivedAddress<T>\n | TransactionSigner<T>\n | null\n | undefined,\n): TransactionSigner<T> {\n if (!value || !isTransactionSigner(value)) {\n throw new Error(\"Expected a TransactionSigner.\");\n }\n return value;\n}\n\n/**\n * Defines an instruction account to resolve.\n * @internal\n */\nexport type ResolvedAccount<\n T extends string = string,\n U extends\n | Address<T>\n | ProgramDerivedAddress<T>\n | TransactionSigner<T>\n | null =\n | Address<T>\n | ProgramDerivedAddress<T>\n | TransactionSigner<T>\n | null,\n> = {\n isWritable: boolean;\n value: U;\n};\n\n/**\n * Defines an instruction that stores additional bytes on-chain.\n * @internal\n */\nexport type InstructionWithByteDelta = {\n byteDelta: number;\n};\n\n/**\n * Get account metas and signers from resolved accounts.\n * @internal\n */\nexport function getAccountMetaFactory(\n programAddress: Address,\n optionalAccountStrategy: \"omitted\" | \"programId\",\n) {\n return (\n account: ResolvedAccount,\n ): AccountMeta | AccountSignerMeta | undefined => {\n if (!account.value) {\n if (optionalAccountStrategy === \"omitted\") return;\n return Object.freeze({\n address: programAddress,\n role: AccountRole.READONLY,\n });\n }\n\n const writableRole = account.isWritable\n ? AccountRole.WRITABLE\n : AccountRole.READONLY;\n return Object.freeze({\n address: expectAddress(account.value),\n role: isTransactionSigner(account.value)\n ? upgradeRoleToSigner(writableRole)\n : writableRole,\n ...(isTransactionSigner(account.value) ? { signer: account.value } : {}),\n });\n };\n}\n\nexport function isTransactionSigner<TAddress extends string = string>(\n value:\n | Address<TAddress>\n | ProgramDerivedAddress<TAddress>\n | TransactionSigner<TAddress>,\n): value is TransactionSigner<TAddress> {\n return (\n !!value &&\n typeof value === \"object\" &&\n \"address\" in value &&\n kitIsTransactionSigner(value)\n );\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n addDecoderSizePrefix,\n addEncoderSizePrefix,\n combineCodec,\n fixDecoderSize,\n fixEncoderSize,\n getAddressDecoder,\n getAddressEncoder,\n getBytesDecoder,\n getBytesEncoder,\n getProgramDerivedAddress,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableSignerAccount,\n} from \"@solana/kit\";\nimport { SATI_PROGRAM_ADDRESS } from \"../programs\";\nimport { getAccountMetaFactory, type ResolvedAccount } from \"../shared\";\nimport {\n getCompressedAccountMetaDecoder,\n getCompressedAccountMetaEncoder,\n getValidityProofDecoder,\n getValidityProofEncoder,\n type CompressedAccountMeta,\n type CompressedAccountMetaArgs,\n type ValidityProof,\n type ValidityProofArgs,\n} from \"../types\";\n\nexport const CLOSE_COMPRESSED_ATTESTATION_DISCRIMINATOR = new Uint8Array([\n 80, 7, 19, 206, 138, 158, 92, 24,\n]);\n\nexport function getCloseCompressedAttestationDiscriminatorBytes() {\n return fixEncoderSize(getBytesEncoder(), 8).encode(\n CLOSE_COMPRESSED_ATTESTATION_DISCRIMINATOR,\n );\n}\n\nexport type CloseCompressedAttestationInstruction<\n TProgram extends string = typeof SATI_PROGRAM_ADDRESS,\n TAccountSigner extends string | AccountMeta<string> = string,\n TAccountSchemaConfig extends string | AccountMeta<string> = string,\n TAccountAgentAta extends string | AccountMeta<string> = string,\n TAccountTokenProgram extends string | AccountMeta<string> = string,\n TAccountAgentMint extends string | AccountMeta<string> = string,\n TAccountEventAuthority extends string | AccountMeta<string> = string,\n TAccountProgram extends string | AccountMeta<string> = string,\n TRemainingAccounts extends readonly AccountMeta<string>[] = [],\n> = Instruction<TProgram> &\n InstructionWithData<ReadonlyUint8Array> &\n InstructionWithAccounts<\n [\n TAccountSigner extends string\n ? WritableSignerAccount<TAccountSigner> &\n AccountSignerMeta<TAccountSigner>\n : TAccountSigner,\n TAccountSchemaConfig extends string\n ? ReadonlyAccount<TAccountSchemaConfig>\n : TAccountSchemaConfig,\n TAccountAgentAta extends string\n ? ReadonlyAccount<TAccountAgentAta>\n : TAccountAgentAta,\n TAccountTokenProgram extends string\n ? ReadonlyAccount<TAccountTokenProgram>\n : TAccountTokenProgram,\n TAccountAgentMint extends string\n ? ReadonlyAccount<TAccountAgentMint>\n : TAccountAgentMint,\n TAccountEventAuthority extends string\n ? ReadonlyAccount<TAccountEventAuthority>\n : TAccountEventAuthority,\n TAccountProgram extends string\n ? ReadonlyAccount<TAccountProgram>\n : TAccountProgram,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type CloseCompressedAttestationInstructionData = {\n discriminator: ReadonlyUint8Array;\n /** Current attestation data (for hash verification) */\n currentData: ReadonlyUint8Array;\n /** Number of signatures in the attestation */\n numSignatures: number;\n /** First signature (required) */\n signature1: ReadonlyUint8Array;\n /** Second signature (zeroed for single-signature modes) */\n signature2: ReadonlyUint8Array;\n /** The compressed account address being closed (for event emission) */\n address: Address;\n /** Light Protocol validity proof */\n proof: ValidityProof;\n /** Light Protocol compressed account metadata */\n accountMeta: CompressedAccountMeta;\n};\n\nexport type CloseCompressedAttestationInstructionDataArgs = {\n /** Current attestation data (for hash verification) */\n currentData: ReadonlyUint8Array;\n /** Number of signatures in the attestation */\n numSignatures: number;\n /** First signature (required) */\n signature1: ReadonlyUint8Array;\n /** Second signature (zeroed for single-signature modes) */\n signature2: ReadonlyUint8Array;\n /** The compressed account address being closed (for event emission) */\n address: Address;\n /** Light Protocol validity proof */\n proof: ValidityProofArgs;\n /** Light Protocol compressed account metadata */\n accountMeta: CompressedAccountMetaArgs;\n};\n\nexport function getCloseCompressedAttestationInstructionDataEncoder(): Encoder<CloseCompressedAttestationInstructionDataArgs> {\n return transformEncoder(\n getStructEncoder([\n [\"discriminator\", fixEncoderSize(getBytesEncoder(), 8)],\n [\"currentData\", addEncoderSizePrefix(getBytesEncoder(), getU32Encoder())],\n [\"numSignatures\", getU8Encoder()],\n [\"signature1\", fixEncoderSize(getBytesEncoder(), 64)],\n [\"signature2\", fixEncoderSize(getBytesEncoder(), 64)],\n [\"address\", getAddressEncoder()],\n [\"proof\", getValidityProofEncoder()],\n [\"accountMeta\", getCompressedAccountMetaEncoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: CLOSE_COMPRESSED_ATTESTATION_DISCRIMINATOR,\n }),\n );\n}\n\nexport function getCloseCompressedAttestationInstructionDataDecoder(): Decoder<CloseCompressedAttestationInstructionData> {\n return getStructDecoder([\n [\"discriminator\", fixDecoderSize(getBytesDecoder(), 8)],\n [\"currentData\", addDecoderSizePrefix(getBytesDecoder(), getU32Decoder())],\n [\"numSignatures\", getU8Decoder()],\n [\"signature1\", fixDecoderSize(getBytesDecoder(), 64)],\n [\"signature2\", fixDecoderSize(getBytesDecoder(), 64)],\n [\"address\", getAddressDecoder()],\n [\"proof\", getValidityProofDecoder()],\n [\"accountMeta\", getCompressedAccountMetaDecoder()],\n ]);\n}\n\nexport function getCloseCompressedAttestationInstructionDataCodec(): Codec<\n CloseCompressedAttestationInstructionDataArgs,\n CloseCompressedAttestationInstructionData\n> {\n return combineCodec(\n getCloseCompressedAttestationInstructionDataEncoder(),\n getCloseCompressedAttestationInstructionDataDecoder(),\n );\n}\n\nexport type CloseCompressedAttestationAsyncInput<\n TAccountSigner extends string = string,\n TAccountSchemaConfig extends string = string,\n TAccountAgentAta extends string = string,\n TAccountTokenProgram extends string = string,\n TAccountAgentMint extends string = string,\n TAccountEventAuthority extends string = string,\n TAccountProgram extends string = string,\n> = {\n /** Signer must be either the agent (NFT owner via ATA) or the counterparty */\n signer: TransactionSigner<TAccountSigner>;\n /** Schema config PDA */\n schemaConfig: Address<TAccountSchemaConfig>;\n /**\n * Optional: Agent's ATA (required if signer is NFT owner, not counterparty).\n * If provided, must hold the agent NFT (mint matches agent_mint from data).\n */\n agentAta?: Address<TAccountAgentAta>;\n /** Token-2022 program for ATA verification (optional, required with agent_ata) */\n tokenProgram?: Address<TAccountTokenProgram>;\n /**\n * Agent mint (Token-2022 NFT) for Solscan indexing.\n * Must match agent_mint in attestation data (bytes 33-64).\n */\n agentMint: Address<TAccountAgentMint>;\n eventAuthority?: Address<TAccountEventAuthority>;\n program: Address<TAccountProgram>;\n currentData: CloseCompressedAttestationInstructionDataArgs[\"currentData\"];\n numSignatures: CloseCompressedAttestationInstructionDataArgs[\"numSignatures\"];\n signature1: CloseCompressedAttestationInstructionDataArgs[\"signature1\"];\n signature2: CloseCompressedAttestationInstructionDataArgs[\"signature2\"];\n address: CloseCompressedAttestationInstructionDataArgs[\"address\"];\n proof: CloseCompressedAttestationInstructionDataArgs[\"proof\"];\n accountMeta: CloseCompressedAttestationInstructionDataArgs[\"accountMeta\"];\n};\n\nexport async function getCloseCompressedAttestationInstructionAsync<\n TAccountSigner extends string,\n TAccountSchemaConfig extends string,\n TAccountAgentAta extends string,\n TAccountTokenProgram extends string,\n TAccountAgentMint extends string,\n TAccountEventAuthority extends string,\n TAccountProgram extends string,\n TProgramAddress extends Address = typeof SATI_PROGRAM_ADDRESS,\n>(\n input: CloseCompressedAttestationAsyncInput<\n TAccountSigner,\n TAccountSchemaConfig,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountEventAuthority,\n TAccountProgram\n >,\n config?: { programAddress?: TProgramAddress },\n): Promise<\n CloseCompressedAttestationInstruction<\n TProgramAddress,\n TAccountSigner,\n TAccountSchemaConfig,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountEventAuthority,\n TAccountProgram\n >\n> {\n // Program address.\n const programAddress = config?.programAddress ?? SATI_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n signer: { value: input.signer ?? null, isWritable: true },\n schemaConfig: { value: input.schemaConfig ?? null, isWritable: false },\n agentAta: { value: input.agentAta ?? null, isWritable: false },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n agentMint: { value: input.agentMint ?? null, isWritable: false },\n eventAuthority: { value: input.eventAuthority ?? null, isWritable: false },\n program: { value: input.program ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.eventAuthority.value) {\n accounts.eventAuthority.value = await getProgramDerivedAddress({\n programAddress,\n seeds: [\n getBytesEncoder().encode(\n new Uint8Array([\n 95, 95, 101, 118, 101, 110, 116, 95, 97, 117, 116, 104, 111, 114,\n 105, 116, 121,\n ]),\n ),\n ],\n });\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, \"programId\");\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.signer),\n getAccountMeta(accounts.schemaConfig),\n getAccountMeta(accounts.agentAta),\n getAccountMeta(accounts.tokenProgram),\n getAccountMeta(accounts.agentMint),\n getAccountMeta(accounts.eventAuthority),\n getAccountMeta(accounts.program),\n ],\n data: getCloseCompressedAttestationInstructionDataEncoder().encode(\n args as CloseCompressedAttestationInstructionDataArgs,\n ),\n programAddress,\n } as CloseCompressedAttestationInstruction<\n TProgramAddress,\n TAccountSigner,\n TAccountSchemaConfig,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountEventAuthority,\n TAccountProgram\n >);\n}\n\nexport type CloseCompressedAttestationInput<\n TAccountSigner extends string = string,\n TAccountSchemaConfig extends string = string,\n TAccountAgentAta extends string = string,\n TAccountTokenProgram extends string = string,\n TAccountAgentMint extends string = string,\n TAccountEventAuthority extends string = string,\n TAccountProgram extends string = string,\n> = {\n /** Signer must be either the agent (NFT owner via ATA) or the counterparty */\n signer: TransactionSigner<TAccountSigner>;\n /** Schema config PDA */\n schemaConfig: Address<TAccountSchemaConfig>;\n /**\n * Optional: Agent's ATA (required if signer is NFT owner, not counterparty).\n * If provided, must hold the agent NFT (mint matches agent_mint from data).\n */\n agentAta?: Address<TAccountAgentAta>;\n /** Token-2022 program for ATA verification (optional, required with agent_ata) */\n tokenProgram?: Address<TAccountTokenProgram>;\n /**\n * Agent mint (Token-2022 NFT) for Solscan indexing.\n * Must match agent_mint in attestation data (bytes 33-64).\n */\n agentMint: Address<TAccountAgentMint>;\n eventAuthority: Address<TAccountEventAuthority>;\n program: Address<TAccountProgram>;\n currentData: CloseCompressedAttestationInstructionDataArgs[\"currentData\"];\n numSignatures: CloseCompressedAttestationInstructionDataArgs[\"numSignatures\"];\n signature1: CloseCompressedAttestationInstructionDataArgs[\"signature1\"];\n signature2: CloseCompressedAttestationInstructionDataArgs[\"signature2\"];\n address: CloseCompressedAttestationInstructionDataArgs[\"address\"];\n proof: CloseCompressedAttestationInstructionDataArgs[\"proof\"];\n accountMeta: CloseCompressedAttestationInstructionDataArgs[\"accountMeta\"];\n};\n\nexport function getCloseCompressedAttestationInstruction<\n TAccountSigner extends string,\n TAccountSchemaConfig extends string,\n TAccountAgentAta extends string,\n TAccountTokenProgram extends string,\n TAccountAgentMint extends string,\n TAccountEventAuthority extends string,\n TAccountProgram extends string,\n TProgramAddress extends Address = typeof SATI_PROGRAM_ADDRESS,\n>(\n input: CloseCompressedAttestationInput<\n TAccountSigner,\n TAccountSchemaConfig,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountEventAuthority,\n TAccountProgram\n >,\n config?: { programAddress?: TProgramAddress },\n): CloseCompressedAttestationInstruction<\n TProgramAddress,\n TAccountSigner,\n TAccountSchemaConfig,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountEventAuthority,\n TAccountProgram\n> {\n // Program address.\n const programAddress = config?.programAddress ?? SATI_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n signer: { value: input.signer ?? null, isWritable: true },\n schemaConfig: { value: input.schemaConfig ?? null, isWritable: false },\n agentAta: { value: input.agentAta ?? null, isWritable: false },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n agentMint: { value: input.agentMint ?? null, isWritable: false },\n eventAuthority: { value: input.eventAuthority ?? null, isWritable: false },\n program: { value: input.program ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, \"programId\");\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.signer),\n getAccountMeta(accounts.schemaConfig),\n getAccountMeta(accounts.agentAta),\n getAccountMeta(accounts.tokenProgram),\n getAccountMeta(accounts.agentMint),\n getAccountMeta(accounts.eventAuthority),\n getAccountMeta(accounts.program),\n ],\n data: getCloseCompressedAttestationInstructionDataEncoder().encode(\n args as CloseCompressedAttestationInstructionDataArgs,\n ),\n programAddress,\n } as CloseCompressedAttestationInstruction<\n TProgramAddress,\n TAccountSigner,\n TAccountSchemaConfig,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountEventAuthority,\n TAccountProgram\n >);\n}\n\nexport type ParsedCloseCompressedAttestationInstruction<\n TProgram extends string = typeof SATI_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address<TProgram>;\n accounts: {\n /** Signer must be either the agent (NFT owner via ATA) or the counterparty */\n signer: TAccountMetas[0];\n /** Schema config PDA */\n schemaConfig: TAccountMetas[1];\n /**\n * Optional: Agent's ATA (required if signer is NFT owner, not counterparty).\n * If provided, must hold the agent NFT (mint matches agent_mint from data).\n */\n agentAta?: TAccountMetas[2] | undefined;\n /** Token-2022 program for ATA verification (optional, required with agent_ata) */\n tokenProgram?: TAccountMetas[3] | undefined;\n /**\n * Agent mint (Token-2022 NFT) for Solscan indexing.\n * Must match agent_mint in attestation data (bytes 33-64).\n */\n agentMint: TAccountMetas[4];\n eventAuthority: TAccountMetas[5];\n program: TAccountMetas[6];\n };\n data: CloseCompressedAttestationInstructionData;\n};\n\nexport function parseCloseCompressedAttestationInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction<TProgram> &\n InstructionWithAccounts<TAccountMetas> &\n InstructionWithData<ReadonlyUint8Array>,\n): ParsedCloseCompressedAttestationInstruction<TProgram, TAccountMetas> {\n if (instruction.accounts.length < 7) {\n // TODO: Coded error.\n throw new Error(\"Not enough accounts\");\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n const getNextOptionalAccount = () => {\n const accountMeta = getNextAccount();\n return accountMeta.address === SATI_PROGRAM_ADDRESS\n ? undefined\n : accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n signer: getNextAccount(),\n schemaConfig: getNextAccount(),\n agentAta: getNextOptionalAccount(),\n tokenProgram: getNextOptionalAccount(),\n agentMint: getNextAccount(),\n eventAuthority: getNextAccount(),\n program: getNextAccount(),\n },\n data: getCloseCompressedAttestationInstructionDataDecoder().decode(\n instruction.data,\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n fixDecoderSize,\n fixEncoderSize,\n getBytesDecoder,\n getBytesEncoder,\n getProgramDerivedAddress,\n getStructDecoder,\n getStructEncoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n type WritableSignerAccount,\n} from \"@solana/kit\";\nimport { SATI_PROGRAM_ADDRESS } from \"../programs\";\nimport { getAccountMetaFactory, type ResolvedAccount } from \"../shared\";\n\nexport const CLOSE_REGULAR_ATTESTATION_DISCRIMINATOR = new Uint8Array([\n 243, 10, 146, 163, 169, 75, 64, 28,\n]);\n\nexport function getCloseRegularAttestationDiscriminatorBytes() {\n return fixEncoderSize(getBytesEncoder(), 8).encode(\n CLOSE_REGULAR_ATTESTATION_DISCRIMINATOR,\n );\n}\n\nexport type CloseRegularAttestationInstruction<\n TProgram extends string = typeof SATI_PROGRAM_ADDRESS,\n TAccountPayer extends string | AccountMeta<string> = string,\n TAccountSigner extends string | AccountMeta<string> = string,\n TAccountSchemaConfig extends string | AccountMeta<string> = string,\n TAccountSatiPda extends string | AccountMeta<string> = string,\n TAccountSatiCredential extends string | AccountMeta<string> = string,\n TAccountAttestation extends string | AccountMeta<string> = string,\n TAccountSasProgram extends string | AccountMeta<string> =\n \"22zoJMtdu4tQc2PzL74ZUT7FrwgB1Udec8DdW4yw4BdG\",\n TAccountAgentAta extends string | AccountMeta<string> = string,\n TAccountTokenProgram extends string | AccountMeta<string> = string,\n TAccountAgentMint extends string | AccountMeta<string> = string,\n TAccountSasEventAuthority extends string | AccountMeta<string> = string,\n TAccountSystemProgram extends string | AccountMeta<string> =\n \"11111111111111111111111111111111\",\n TAccountEventAuthority extends string | AccountMeta<string> = string,\n TAccountProgram extends string | AccountMeta<string> = string,\n TRemainingAccounts extends readonly AccountMeta<string>[] = [],\n> = Instruction<TProgram> &\n InstructionWithData<ReadonlyUint8Array> &\n InstructionWithAccounts<\n [\n TAccountPayer extends string\n ? WritableSignerAccount<TAccountPayer> &\n AccountSignerMeta<TAccountPayer>\n : TAccountPayer,\n TAccountSigner extends string\n ? ReadonlySignerAccount<TAccountSigner> &\n AccountSignerMeta<TAccountSigner>\n : TAccountSigner,\n TAccountSchemaConfig extends string\n ? ReadonlyAccount<TAccountSchemaConfig>\n : TAccountSchemaConfig,\n TAccountSatiPda extends string\n ? ReadonlyAccount<TAccountSatiPda>\n : TAccountSatiPda,\n TAccountSatiCredential extends string\n ? ReadonlyAccount<TAccountSatiCredential>\n : TAccountSatiCredential,\n TAccountAttestation extends string\n ? WritableAccount<TAccountAttestation>\n : TAccountAttestation,\n TAccountSasProgram extends string\n ? ReadonlyAccount<TAccountSasProgram>\n : TAccountSasProgram,\n TAccountAgentAta extends string\n ? ReadonlyAccount<TAccountAgentAta>\n : TAccountAgentAta,\n TAccountTokenProgram extends string\n ? ReadonlyAccount<TAccountTokenProgram>\n : TAccountTokenProgram,\n TAccountAgentMint extends string\n ? ReadonlyAccount<TAccountAgentMint>\n : TAccountAgentMint,\n TAccountSasEventAuthority extends string\n ? ReadonlyAccount<TAccountSasEventAuthority>\n : TAccountSasEventAuthority,\n TAccountSystemProgram extends string\n ? ReadonlyAccount<TAccountSystemProgram>\n : TAccountSystemProgram,\n TAccountEventAuthority extends string\n ? ReadonlyAccount<TAccountEventAuthority>\n : TAccountEventAuthority,\n TAccountProgram extends string\n ? ReadonlyAccount<TAccountProgram>\n : TAccountProgram,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type CloseRegularAttestationInstructionData = {\n discriminator: ReadonlyUint8Array;\n};\n\nexport type CloseRegularAttestationInstructionDataArgs = {};\n\nexport function getCloseRegularAttestationInstructionDataEncoder(): FixedSizeEncoder<CloseRegularAttestationInstructionDataArgs> {\n return transformEncoder(\n getStructEncoder([[\"discriminator\", fixEncoderSize(getBytesEncoder(), 8)]]),\n (value) => ({\n ...value,\n discriminator: CLOSE_REGULAR_ATTESTATION_DISCRIMINATOR,\n }),\n );\n}\n\nexport function getCloseRegularAttestationInstructionDataDecoder(): FixedSizeDecoder<CloseRegularAttestationInstructionData> {\n return getStructDecoder([\n [\"discriminator\", fixDecoderSize(getBytesDecoder(), 8)],\n ]);\n}\n\nexport function getCloseRegularAttestationInstructionDataCodec(): FixedSizeCodec<\n CloseRegularAttestationInstructionDataArgs,\n CloseRegularAttestationInstructionData\n> {\n return combineCodec(\n getCloseRegularAttestationInstructionDataEncoder(),\n getCloseRegularAttestationInstructionDataDecoder(),\n );\n}\n\nexport type CloseRegularAttestationAsyncInput<\n TAccountPayer extends string = string,\n TAccountSigner extends string = string,\n TAccountSchemaConfig extends string = string,\n TAccountSatiPda extends string = string,\n TAccountSatiCredential extends string = string,\n TAccountAttestation extends string = string,\n TAccountSasProgram extends string = string,\n TAccountAgentAta extends string = string,\n TAccountTokenProgram extends string = string,\n TAccountAgentMint extends string = string,\n TAccountSasEventAuthority extends string = string,\n TAccountSystemProgram extends string = string,\n TAccountEventAuthority extends string = string,\n TAccountProgram extends string = string,\n> = {\n /** Payer receives rent back */\n payer: TransactionSigner<TAccountPayer>;\n /** Signer must be either the agent (NFT owner via ATA) or the counterparty */\n signer: TransactionSigner<TAccountSigner>;\n /** Schema config PDA */\n schemaConfig: Address<TAccountSchemaConfig>;\n /** SATI Attestation Program PDA - authorized signer on SAS credential */\n satiPda?: Address<TAccountSatiPda>;\n /** SATI SAS credential account */\n satiCredential: Address<TAccountSatiCredential>;\n /** Attestation account to be closed */\n attestation: Address<TAccountAttestation>;\n /** SAS program */\n sasProgram?: Address<TAccountSasProgram>;\n /**\n * Optional: Agent's ATA (required if signer is NFT owner, not counterparty).\n * If provided, must hold the agent NFT (mint matches agent_mint from data).\n */\n agentAta?: Address<TAccountAgentAta>;\n /** Token-2022 program for ATA verification (optional, required with agent_ata) */\n tokenProgram?: Address<TAccountTokenProgram>;\n /**\n * Agent mint (Token-2022 NFT) for Solscan indexing.\n * Must match agent_mint in attestation data (bytes 33-64).\n */\n agentMint: Address<TAccountAgentMint>;\n /** SAS event authority PDA (required for SAS close CPI event emission) */\n sasEventAuthority: Address<TAccountSasEventAuthority>;\n /** System program (required by SAS close instruction) */\n systemProgram?: Address<TAccountSystemProgram>;\n eventAuthority?: Address<TAccountEventAuthority>;\n program: Address<TAccountProgram>;\n};\n\nexport async function getCloseRegularAttestationInstructionAsync<\n TAccountPayer extends string,\n TAccountSigner extends string,\n TAccountSchemaConfig extends string,\n TAccountSatiPda extends string,\n TAccountSatiCredential extends string,\n TAccountAttestation extends string,\n TAccountSasProgram extends string,\n TAccountAgentAta extends string,\n TAccountTokenProgram extends string,\n TAccountAgentMint extends string,\n TAccountSasEventAuthority extends string,\n TAccountSystemProgram extends string,\n TAccountEventAuthority extends string,\n TAccountProgram extends string,\n TProgramAddress extends Address = typeof SATI_PROGRAM_ADDRESS,\n>(\n input: CloseRegularAttestationAsyncInput<\n TAccountPayer,\n TAccountSigner,\n TAccountSchemaConfig,\n TAccountSatiPda,\n TAccountSatiCredential,\n TAccountAttestation,\n TAccountSasProgram,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountSasEventAuthority,\n TAccountSystemProgram,\n TAccountEventAuthority,\n TAccountProgram\n >,\n config?: { programAddress?: TProgramAddress },\n): Promise<\n CloseRegularAttestationInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountSigner,\n TAccountSchemaConfig,\n TAccountSatiPda,\n TAccountSatiCredential,\n TAccountAttestation,\n TAccountSasProgram,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountSasEventAuthority,\n TAccountSystemProgram,\n TAccountEventAuthority,\n TAccountProgram\n >\n> {\n // Program address.\n const programAddress = config?.programAddress ?? SATI_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n signer: { value: input.signer ?? null, isWritable: false },\n schemaConfig: { value: input.schemaConfig ?? null, isWritable: false },\n satiPda: { value: input.satiPda ?? null, isWritable: false },\n satiCredential: { value: input.satiCredential ?? null, isWritable: false },\n attestation: { value: input.attestation ?? null, isWritable: true },\n sasProgram: { value: input.sasProgram ?? null, isWritable: false },\n agentAta: { value: input.agentAta ?? null, isWritable: false },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n agentMint: { value: input.agentMint ?? null, isWritable: false },\n sasEventAuthority: {\n value: input.sasEventAuthority ?? null,\n isWritable: false,\n },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n eventAuthority: { value: input.eventAuthority ?? null, isWritable: false },\n program: { value: input.program ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.satiPda.value) {\n accounts.satiPda.value = await getProgramDerivedAddress({\n programAddress,\n seeds: [\n getBytesEncoder().encode(\n new Uint8Array([\n 115, 97, 116, 105, 95, 97, 116, 116, 101, 115, 116, 97, 116, 105,\n 111, 110,\n ]),\n ),\n ],\n });\n }\n if (!accounts.sasProgram.value) {\n accounts.sasProgram.value =\n \"22zoJMtdu4tQc2PzL74ZUT7FrwgB1Udec8DdW4yw4BdG\" as Address<\"22zoJMtdu4tQc2PzL74ZUT7FrwgB1Udec8DdW4yw4BdG\">;\n }\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n \"11111111111111111111111111111111\" as Address<\"11111111111111111111111111111111\">;\n }\n if (!accounts.eventAuthority.value) {\n accounts.eventAuthority.value = await getProgramDerivedAddress({\n programAddress,\n seeds: [\n getBytesEncoder().encode(\n new Uint8Array([\n 95, 95, 101, 118, 101, 110, 116, 95, 97, 117, 116, 104, 111, 114,\n 105, 116, 121,\n ]),\n ),\n ],\n });\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, \"programId\");\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.signer),\n getAccountMeta(accounts.schemaConfig),\n getAccountMeta(accounts.satiPda),\n getAccountMeta(accounts.satiCredential),\n getAccountMeta(accounts.attestation),\n getAccountMeta(accounts.sasProgram),\n getAccountMeta(accounts.agentAta),\n getAccountMeta(accounts.tokenProgram),\n getAccountMeta(accounts.agentMint),\n getAccountMeta(accounts.sasEventAuthority),\n getAccountMeta(accounts.systemProgram),\n getAccountMeta(accounts.eventAuthority),\n getAccountMeta(accounts.program),\n ],\n data: getCloseRegularAttestationInstructionDataEncoder().encode({}),\n programAddress,\n } as CloseRegularAttestationInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountSigner,\n TAccountSchemaConfig,\n TAccountSatiPda,\n TAccountSatiCredential,\n TAccountAttestation,\n TAccountSasProgram,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountSasEventAuthority,\n TAccountSystemProgram,\n TAccountEventAuthority,\n TAccountProgram\n >);\n}\n\nexport type CloseRegularAttestationInput<\n TAccountPayer extends string = string,\n TAccountSigner extends string = string,\n TAccountSchemaConfig extends string = string,\n TAccountSatiPda extends string = string,\n TAccountSatiCredential extends string = string,\n TAccountAttestation extends string = string,\n TAccountSasProgram extends string = string,\n TAccountAgentAta extends string = string,\n TAccountTokenProgram extends string = string,\n TAccountAgentMint extends string = string,\n TAccountSasEventAuthority extends string = string,\n TAccountSystemProgram extends string = string,\n TAccountEventAuthority extends string = string,\n TAccountProgram extends string = string,\n> = {\n /** Payer receives rent back */\n payer: TransactionSigner<TAccountPayer>;\n /** Signer must be either the agent (NFT owner via ATA) or the counterparty */\n signer: TransactionSigner<TAccountSigner>;\n /** Schema config PDA */\n schemaConfig: Address<TAccountSchemaConfig>;\n /** SATI Attestation Program PDA - authorized signer on SAS credential */\n satiPda: Address<TAccountSatiPda>;\n /** SATI SAS credential account */\n satiCredential: Address<TAccountSatiCredential>;\n /** Attestation account to be closed */\n attestation: Address<TAccountAttestation>;\n /** SAS program */\n sasProgram?: Address<TAccountSasProgram>;\n /**\n * Optional: Agent's ATA (required if signer is NFT owner, not counterparty).\n * If provided, must hold the agent NFT (mint matches agent_mint from data).\n */\n agentAta?: Address<TAccountAgentAta>;\n /** Token-2022 program for ATA verification (optional, required with agent_ata) */\n tokenProgram?: Address<TAccountTokenProgram>;\n /**\n * Agent mint (Token-2022 NFT) for Solscan indexing.\n * Must match agent_mint in attestation data (bytes 33-64).\n */\n agentMint: Address<TAccountAgentMint>;\n /** SAS event authority PDA (required for SAS close CPI event emission) */\n sasEventAuthority: Address<TAccountSasEventAuthority>;\n /** System program (required by SAS close instruction) */\n systemProgram?: Address<TAccountSystemProgram>;\n eventAuthority: Address<TAccountEventAuthority>;\n program: Address<TAccountProgram>;\n};\n\nexport function getCloseRegularAttestationInstruction<\n TAccountPayer extends string,\n TAccountSigner extends string,\n TAccountSchemaConfig extends string,\n TAccountSatiPda extends string,\n TAccountSatiCredential extends string,\n TAccountAttestation extends string,\n TAccountSasProgram extends string,\n TAccountAgentAta extends string,\n TAccountTokenProgram extends string,\n TAccountAgentMint extends string,\n TAccountSasEventAuthority extends string,\n TAccountSystemProgram extends string,\n TAccountEventAuthority extends string,\n TAccountProgram extends string,\n TProgramAddress extends Address = typeof SATI_PROGRAM_ADDRESS,\n>(\n input: CloseRegularAttestationInput<\n TAccountPayer,\n TAccountSigner,\n TAccountSchemaConfig,\n TAccountSatiPda,\n TAccountSatiCredential,\n TAccountAttestation,\n TAccountSasProgram,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountSasEventAuthority,\n TAccountSystemProgram,\n TAccountEventAuthority,\n TAccountProgram\n >,\n config?: { programAddress?: TProgramAddress },\n): CloseRegularAttestationInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountSigner,\n TAccountSchemaConfig,\n TAccountSatiPda,\n TAccountSatiCredential,\n TAccountAttestation,\n TAccountSasProgram,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountSasEventAuthority,\n TAccountSystemProgram,\n TAccountEventAuthority,\n TAccountProgram\n> {\n // Program address.\n const programAddress = config?.programAddress ?? SATI_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n signer: { value: input.signer ?? null, isWritable: false },\n schemaConfig: { value: input.schemaConfig ?? null, isWritable: false },\n satiPda: { value: input.satiPda ?? null, isWritable: false },\n satiCredential: { value: input.satiCredential ?? null, isWritable: false },\n attestation: { value: input.attestation ?? null, isWritable: true },\n sasProgram: { value: input.sasProgram ?? null, isWritable: false },\n agentAta: { value: input.agentAta ?? null, isWritable: false },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n agentMint: { value: input.agentMint ?? null, isWritable: false },\n sasEventAuthority: {\n value: input.sasEventAuthority ?? null,\n isWritable: false,\n },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n eventAuthority: { value: input.eventAuthority ?? null, isWritable: false },\n program: { value: input.program ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.sasProgram.value) {\n accounts.sasProgram.value =\n \"22zoJMtdu4tQc2PzL74ZUT7FrwgB1Udec8DdW4yw4BdG\" as Address<\"22zoJMtdu4tQc2PzL74ZUT7FrwgB1Udec8DdW4yw4BdG\">;\n }\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n \"11111111111111111111111111111111\" as Address<\"11111111111111111111111111111111\">;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, \"programId\");\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.signer),\n getAccountMeta(accounts.schemaConfig),\n getAccountMeta(accounts.satiPda),\n getAccountMeta(accounts.satiCredential),\n getAccountMeta(accounts.attestation),\n getAccountMeta(accounts.sasProgram),\n getAccountMeta(accounts.agentAta),\n getAccountMeta(accounts.tokenProgram),\n getAccountMeta(accounts.agentMint),\n getAccountMeta(accounts.sasEventAuthority),\n getAccountMeta(accounts.systemProgram),\n getAccountMeta(accounts.eventAuthority),\n getAccountMeta(accounts.program),\n ],\n data: getCloseRegularAttestationInstructionDataEncoder().encode({}),\n programAddress,\n } as CloseRegularAttestationInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountSigner,\n TAccountSchemaConfig,\n TAccountSatiPda,\n TAccountSatiCredential,\n TAccountAttestation,\n TAccountSasProgram,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountSasEventAuthority,\n TAccountSystemProgram,\n TAccountEventAuthority,\n TAccountProgram\n >);\n}\n\nexport type ParsedCloseRegularAttestationInstruction<\n TProgram extends string = typeof SATI_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address<TProgram>;\n accounts: {\n /** Payer receives rent back */\n payer: TAccountMetas[0];\n /** Signer must be either the agent (NFT owner via ATA) or the counterparty */\n signer: TAccountMetas[1];\n /** Schema config PDA */\n schemaConfig: TAccountMetas[2];\n /** SATI Attestation Program PDA - authorized signer on SAS credential */\n satiPda: TAccountMetas[3];\n /** SATI SAS credential account */\n satiCredential: TAccountMetas[4];\n /** Attestation account to be closed */\n attestation: TAccountMetas[5];\n /** SAS program */\n sasProgram: TAccountMetas[6];\n /**\n * Optional: Agent's ATA (required if signer is NFT owner, not counterparty).\n * If provided, must hold the agent NFT (mint matches agent_mint from data).\n */\n agentAta?: TAccountMetas[7] | undefined;\n /** Token-2022 program for ATA verification (optional, required with agent_ata) */\n tokenProgram?: TAccountMetas[8] | undefined;\n /**\n * Agent mint (Token-2022 NFT) for Solscan indexing.\n * Must match agent_mint in attestation data (bytes 33-64).\n */\n agentMint: TAccountMetas[9];\n /** SAS event authority PDA (required for SAS close CPI event emission) */\n sasEventAuthority: TAccountMetas[10];\n /** System program (required by SAS close instruction) */\n systemProgram: TAccountMetas[11];\n eventAuthority: TAccountMetas[12];\n program: TAccountMetas[13];\n };\n data: CloseRegularAttestationInstructionData;\n};\n\nexport function parseCloseRegularAttestationInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction<TProgram> &\n InstructionWithAccounts<TAccountMetas> &\n InstructionWithData<ReadonlyUint8Array>,\n): ParsedCloseRegularAttestationInstruction<TProgram, TAccountMetas> {\n if (instruction.accounts.length < 14) {\n // TODO: Coded error.\n throw new Error(\"Not enough accounts\");\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n const getNextOptionalAccount = () => {\n const accountMeta = getNextAccount();\n return accountMeta.address === SATI_PROGRAM_ADDRESS\n ? undefined\n : accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n payer: getNextAccount(),\n signer: getNextAccount(),\n schemaConfig: getNextAccount(),\n satiPda: getNextAccount(),\n satiCredential: getNextAccount(),\n attestation: getNextAccount(),\n sasProgram: getNextAccount(),\n agentAta: getNextOptionalAccount(),\n tokenProgram: getNextOptionalAccount(),\n agentMint: getNextAccount(),\n sasEventAuthority: getNextAccount(),\n systemProgram: getNextAccount(),\n eventAuthority: getNextAccount(),\n program: getNextAccount(),\n },\n data: getCloseRegularAttestationInstructionDataDecoder().decode(\n instruction.data,\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n addDecoderSizePrefix,\n addEncoderSizePrefix,\n combineCodec,\n fixDecoderSize,\n fixEncoderSize,\n getBytesDecoder,\n getBytesEncoder,\n getProgramDerivedAddress,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getU8Decoder,\n getU8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableSignerAccount,\n} from \"@solana/kit\";\nimport { SATI_PROGRAM_ADDRESS } from \"../programs\";\nimport { getAccountMetaFactory, type ResolvedAccount } from \"../shared\";\nimport {\n getPackedAddressTreeInfoDecoder,\n getPackedAddressTreeInfoEncoder,\n getValidityProofDecoder,\n getValidityProofEncoder,\n type PackedAddressTreeInfo,\n type PackedAddressTreeInfoArgs,\n type ValidityProof,\n type ValidityProofArgs,\n} from \"../types\";\n\nexport const CREATE_COMPRESSED_ATTESTATION_DISCRIMINATOR = new Uint8Array([\n 204, 251, 61, 109, 25, 133, 237, 77,\n]);\n\nexport function getCreateCompressedAttestationDiscriminatorBytes() {\n return fixEncoderSize(getBytesEncoder(), 8).encode(\n CREATE_COMPRESSED_ATTESTATION_DISCRIMINATOR,\n );\n}\n\nexport type CreateCompressedAttestationInstruction<\n TProgram extends string = typeof SATI_PROGRAM_ADDRESS,\n TAccountPayer extends string | AccountMeta<string> = string,\n TAccountSchemaConfig extends string | AccountMeta<string> = string,\n TAccountInstructionsSysvar extends string | AccountMeta<string> =\n \"Sysvar1nstructions1111111111111111111111111\",\n TAccountAgentAta extends string | AccountMeta<string> = string,\n TAccountTokenProgram extends string | AccountMeta<string> = string,\n TAccountAgentMint extends string | AccountMeta<string> = string,\n TAccountDelegationAttestation extends string | AccountMeta<string> = string,\n TAccountSatiCredential extends string | AccountMeta<string> = string,\n TAccountClock extends string | AccountMeta<string> =\n \"SysvarC1ock11111111111111111111111111111111\",\n TAccountEventAuthority extends string | AccountMeta<string> = string,\n TAccountProgram extends string | AccountMeta<string> = string,\n TRemainingAccounts extends readonly AccountMeta<string>[] = [],\n> = Instruction<TProgram> &\n InstructionWithData<ReadonlyUint8Array> &\n InstructionWithAccounts<\n [\n TAccountPayer extends string\n ? WritableSignerAccount<TAccountPayer> &\n AccountSignerMeta<TAccountPayer>\n : TAccountPayer,\n TAccountSchemaConfig extends string\n ? ReadonlyAccount<TAccountSchemaConfig>\n : TAccountSchemaConfig,\n TAccountInstructionsSysvar extends string\n ? ReadonlyAccount<TAccountInstructionsSysvar>\n : TAccountInstructionsSysvar,\n TAccountAgentAta extends string\n ? ReadonlyAccount<TAccountAgentAta>\n : TAccountAgentAta,\n TAccountTokenProgram extends string\n ? ReadonlyAccount<TAccountTokenProgram>\n : TAccountTokenProgram,\n TAccountAgentMint extends string\n ? ReadonlyAccount<TAccountAgentMint>\n : TAccountAgentMint,\n TAccountDelegationAttestation extends string\n ? ReadonlyAccount<TAccountDelegationAttestation>\n : TAccountDelegationAttestation,\n TAccountSatiCredential extends string\n ? ReadonlyAccount<TAccountSatiCredential>\n : TAccountSatiCredential,\n TAccountClock extends string\n ? ReadonlyAccount<TAccountClock>\n : TAccountClock,\n TAccountEventAuthority extends string\n ? ReadonlyAccount<TAccountEventAuthority>\n : TAccountEventAuthority,\n TAccountProgram extends string\n ? ReadonlyAccount<TAccountProgram>\n : TAccountProgram,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type CreateCompressedAttestationInstructionData = {\n discriminator: ReadonlyUint8Array;\n /** Schema-conformant data bytes (130+ bytes, universal base layout) */\n data: ReadonlyUint8Array;\n /** Output state tree index for the new compressed account */\n outputStateTreeIndex: number;\n /** Light Protocol validity proof (None for new address creation) */\n proof: ValidityProof;\n /** Light Protocol address tree info */\n addressTreeInfo: PackedAddressTreeInfo;\n};\n\nexport type CreateCompressedAttestationInstructionDataArgs = {\n /** Schema-conformant data bytes (130+ bytes, universal base layout) */\n data: ReadonlyUint8Array;\n /** Output state tree index for the new compressed account */\n outputStateTreeIndex: number;\n /** Light Protocol validity proof (None for new address creation) */\n proof: ValidityProofArgs;\n /** Light Protocol address tree info */\n addressTreeInfo: PackedAddressTreeInfoArgs;\n};\n\nexport function getCreateCompressedAttestationInstructionDataEncoder(): Encoder<CreateCompressedAttestationInstructionDataArgs> {\n return transformEncoder(\n getStructEncoder([\n [\"discriminator\", fixEncoderSize(getBytesEncoder(), 8)],\n [\"data\", addEncoderSizePrefix(getBytesEncoder(), getU32Encoder())],\n [\"outputStateTreeIndex\", getU8Encoder()],\n [\"proof\", getValidityProofEncoder()],\n [\"addressTreeInfo\", getPackedAddressTreeInfoEncoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: CREATE_COMPRESSED_ATTESTATION_DISCRIMINATOR,\n }),\n );\n}\n\nexport function getCreateCompressedAttestationInstructionDataDecoder(): Decoder<CreateCompressedAttestationInstructionData> {\n return getStructDecoder([\n [\"discriminator\", fixDecoderSize(getBytesDecoder(), 8)],\n [\"data\", addDecoderSizePrefix(getBytesDecoder(), getU32Decoder())],\n [\"outputStateTreeIndex\", getU8Decoder()],\n [\"proof\", getValidityProofDecoder()],\n [\"addressTreeInfo\", getPackedAddressTreeInfoDecoder()],\n ]);\n}\n\nexport function getCreateCompressedAttestationInstructionDataCodec(): Codec<\n CreateCompressedAttestationInstructionDataArgs,\n CreateCompressedAttestationInstructionData\n> {\n return combineCodec(\n getCreateCompressedAttestationInstructionDataEncoder(),\n getCreateCompressedAttestationInstructionDataDecoder(),\n );\n}\n\nexport type CreateCompressedAttestationAsyncInput<\n TAccountPayer extends string = string,\n TAccountSchemaConfig extends string = string,\n TAccountInstructionsSysvar extends string = string,\n TAccountAgentAta extends string = string,\n TAccountTokenProgram extends string = string,\n TAccountAgentMint extends string = string,\n TAccountDelegationAttestation extends string = string,\n TAccountSatiCredential extends string = string,\n TAccountClock extends string = string,\n TAccountEventAuthority extends string = string,\n TAccountProgram extends string = string,\n> = {\n /** Payer for transaction fees */\n payer: TransactionSigner<TAccountPayer>;\n /** Schema config PDA */\n schemaConfig: Address<TAccountSchemaConfig>;\n /** Instructions sysvar for Ed25519 signature verification */\n instructionsSysvar?: Address<TAccountInstructionsSysvar>;\n /**\n * Agent's ATA that holds the NFT - proves signer owns the agent identity.\n * Required for DualSignature and AgentOwnerSigned modes.\n * Optional for CounterpartySigned mode (not validated).\n *\n * The mint must match agent_mint from attestation data,\n * amount must be >= 1, and owner must match signatures[0].pubkey.\n */\n agentAta?: Address<TAccountAgentAta>;\n /**\n * Token-2022 program for ATA verification.\n * Required when agent_ata is provided.\n */\n tokenProgram?: Address<TAccountTokenProgram>;\n /**\n * Agent mint (Token-2022 NFT) for Solscan indexing.\n * Must match agent_mint in attestation data (bytes 33-64).\n */\n agentMint: Address<TAccountAgentMint>;\n /**\n * Delegation attestation (optional).\n * Required when signer != agent ATA owner for AgentOwnerSigned mode.\n * Must be a valid DelegateV1 SAS attestation proving the signer's delegation.\n */\n delegationAttestation?: Address<TAccountDelegationAttestation>;\n /**\n * SATI SAS credential for delegation PDA derivation.\n * Required when delegation_attestation is provided.\n */\n satiCredential?: Address<TAccountSatiCredential>;\n /**\n * Clock sysvar for delegation expiry verification.\n * Required when delegation_attestation is provided.\n */\n clock?: Address<TAccountClock>;\n eventAuthority?: Address<TAccountEventAuthority>;\n program: Address<TAccountProgram>;\n data: CreateCompressedAttestationInstructionDataArgs[\"data\"];\n outputStateTreeIndex: CreateCompressedAttestationInstructionDataArgs[\"outputStateTreeIndex\"];\n proof: CreateCompressedAttestationInstructionDataArgs[\"proof\"];\n addressTreeInfo: CreateCompressedAttestationInstructionDataArgs[\"addressTreeInfo\"];\n};\n\nexport async function getCreateCompressedAttestationInstructionAsync<\n TAccountPayer extends string,\n TAccountSchemaConfig extends string,\n TAccountInstructionsSysvar extends string,\n TAccountAgentAta extends string,\n TAccountTokenProgram extends string,\n TAccountAgentMint extends string,\n TAccountDelegationAttestation extends string,\n TAccountSatiCredential extends string,\n TAccountClock extends string,\n TAccountEventAuthority extends string,\n TAccountProgram extends string,\n TProgramAddress extends Address = typeof SATI_PROGRAM_ADDRESS,\n>(\n input: CreateCompressedAttestationAsyncInput<\n TAccountPayer,\n TAccountSchemaConfig,\n TAccountInstructionsSysvar,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountDelegationAttestation,\n TAccountSatiCredential,\n TAccountClock,\n TAccountEventAuthority,\n TAccountProgram\n >,\n config?: { programAddress?: TProgramAddress },\n): Promise<\n CreateCompressedAttestationInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountSchemaConfig,\n TAccountInstructionsSysvar,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountDelegationAttestation,\n TAccountSatiCredential,\n TAccountClock,\n TAccountEventAuthority,\n TAccountProgram\n >\n> {\n // Program address.\n const programAddress = config?.programAddress ?? SATI_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n schemaConfig: { value: input.schemaConfig ?? null, isWritable: false },\n instructionsSysvar: {\n value: input.instructionsSysvar ?? null,\n isWritable: false,\n },\n agentAta: { value: input.agentAta ?? null, isWritable: false },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n agentMint: { value: input.agentMint ?? null, isWritable: false },\n delegationAttestation: {\n value: input.delegationAttestation ?? null,\n isWritable: false,\n },\n satiCredential: { value: input.satiCredential ?? null, isWritable: false },\n clock: { value: input.clock ?? null, isWritable: false },\n eventAuthority: { value: input.eventAuthority ?? null, isWritable: false },\n program: { value: input.program ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.instructionsSysvar.value) {\n accounts.instructionsSysvar.value =\n \"Sysvar1nstructions1111111111111111111111111\" as Address<\"Sysvar1nstructions1111111111111111111111111\">;\n }\n if (!accounts.clock.value) {\n accounts.clock.value =\n \"SysvarC1ock11111111111111111111111111111111\" as Address<\"SysvarC1ock11111111111111111111111111111111\">;\n }\n if (!accounts.eventAuthority.value) {\n accounts.eventAuthority.value = await getProgramDerivedAddress({\n programAddress,\n seeds: [\n getBytesEncoder().encode(\n new Uint8Array([\n 95, 95, 101, 118, 101, 110, 116, 95, 97, 117, 116, 104, 111, 114,\n 105, 116, 121,\n ]),\n ),\n ],\n });\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, \"programId\");\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.schemaConfig),\n getAccountMeta(accounts.instructionsSysvar),\n getAccountMeta(accounts.agentAta),\n getAccountMeta(accounts.tokenProgram),\n getAccountMeta(accounts.agentMint),\n getAccountMeta(accounts.delegationAttestation),\n getAccountMeta(accounts.satiCredential),\n getAccountMeta(accounts.clock),\n getAccountMeta(accounts.eventAuthority),\n getAccountMeta(accounts.program),\n ],\n data: getCreateCompressedAttestationInstructionDataEncoder().encode(\n args as CreateCompressedAttestationInstructionDataArgs,\n ),\n programAddress,\n } as CreateCompressedAttestationInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountSchemaConfig,\n TAccountInstructionsSysvar,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountDelegationAttestation,\n TAccountSatiCredential,\n TAccountClock,\n TAccountEventAuthority,\n TAccountProgram\n >);\n}\n\nexport type CreateCompressedAttestationInput<\n TAccountPayer extends string = string,\n TAccountSchemaConfig extends string = string,\n TAccountInstructionsSysvar extends string = string,\n TAccountAgentAta extends string = string,\n TAccountTokenProgram extends string = string,\n TAccountAgentMint extends string = string,\n TAccountDelegationAttestation extends string = string,\n TAccountSatiCredential extends string = string,\n TAccountClock extends string = string,\n TAccountEventAuthority extends string = string,\n TAccountProgram extends string = string,\n> = {\n /** Payer for transaction fees */\n payer: TransactionSigner<TAccountPayer>;\n /** Schema config PDA */\n schemaConfig: Address<TAccountSchemaConfig>;\n /** Instructions sysvar for Ed25519 signature verification */\n instructionsSysvar?: Address<TAccountInstructionsSysvar>;\n /**\n * Agent's ATA that holds the NFT - proves signer owns the agent identity.\n * Required for DualSignature and AgentOwnerSigned modes.\n * Optional for CounterpartySigned mode (not validated).\n *\n * The mint must match agent_mint from attestation data,\n * amount must be >= 1, and owner must match signatures[0].pubkey.\n */\n agentAta?: Address<TAccountAgentAta>;\n /**\n * Token-2022 program for ATA verification.\n * Required when agent_ata is provided.\n */\n tokenProgram?: Address<TAccountTokenProgram>;\n /**\n * Agent mint (Token-2022 NFT) for Solscan indexing.\n * Must match agent_mint in attestation data (bytes 33-64).\n */\n agentMint: Address<TAccountAgentMint>;\n /**\n * Delegation attestation (optional).\n * Required when signer != agent ATA owner for AgentOwnerSigned mode.\n * Must be a valid DelegateV1 SAS attestation proving the signer's delegation.\n */\n delegationAttestation?: Address<TAccountDelegationAttestation>;\n /**\n * SATI SAS credential for delegation PDA derivation.\n * Required when delegation_attestation is provided.\n */\n satiCredential?: Address<TAccountSatiCredential>;\n /**\n * Clock sysvar for delegation expiry verification.\n * Required when delegation_attestation is provided.\n */\n clock?: Address<TAccountClock>;\n eventAuthority: Address<TAccountEventAuthority>;\n program: Address<TAccountProgram>;\n data: CreateCompressedAttestationInstructionDataArgs[\"data\"];\n outputStateTreeIndex: CreateCompressedAttestationInstructionDataArgs[\"outputStateTreeIndex\"];\n proof: CreateCompressedAttestationInstructionDataArgs[\"proof\"];\n addressTreeInfo: CreateCompressedAttestationInstructionDataArgs[\"addressTreeInfo\"];\n};\n\nexport function getCreateCompressedAttestationInstruction<\n TAccountPayer extends string,\n TAccountSchemaConfig extends string,\n TAccountInstructionsSysvar extends string,\n TAccountAgentAta extends string,\n TAccountTokenProgram extends string,\n TAccountAgentMint extends string,\n TAccountDelegationAttestation extends string,\n TAccountSatiCredential extends string,\n TAccountClock extends string,\n TAccountEventAuthority extends string,\n TAccountProgram extends string,\n TProgramAddress extends Address = typeof SATI_PROGRAM_ADDRESS,\n>(\n input: CreateCompressedAttestationInput<\n TAccountPayer,\n TAccountSchemaConfig,\n TAccountInstructionsSysvar,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountDelegationAttestation,\n TAccountSatiCredential,\n TAccountClock,\n TAccountEventAuthority,\n TAccountProgram\n >,\n config?: { programAddress?: TProgramAddress },\n): CreateCompressedAttestationInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountSchemaConfig,\n TAccountInstructionsSysvar,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountDelegationAttestation,\n TAccountSatiCredential,\n TAccountClock,\n TAccountEventAuthority,\n TAccountProgram\n> {\n // Program address.\n const programAddress = config?.programAddress ?? SATI_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n schemaConfig: { value: input.schemaConfig ?? null, isWritable: false },\n instructionsSysvar: {\n value: input.instructionsSysvar ?? null,\n isWritable: false,\n },\n agentAta: { value: input.agentAta ?? null, isWritable: false },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n agentMint: { value: input.agentMint ?? null, isWritable: false },\n delegationAttestation: {\n value: input.delegationAttestation ?? null,\n isWritable: false,\n },\n satiCredential: { value: input.satiCredential ?? null, isWritable: false },\n clock: { value: input.clock ?? null, isWritable: false },\n eventAuthority: { value: input.eventAuthority ?? null, isWritable: false },\n program: { value: input.program ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.instructionsSysvar.value) {\n accounts.instructionsSysvar.value =\n \"Sysvar1nstructions1111111111111111111111111\" as Address<\"Sysvar1nstructions1111111111111111111111111\">;\n }\n if (!accounts.clock.value) {\n accounts.clock.value =\n \"SysvarC1ock11111111111111111111111111111111\" as Address<\"SysvarC1ock11111111111111111111111111111111\">;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, \"programId\");\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.schemaConfig),\n getAccountMeta(accounts.instructionsSysvar),\n getAccountMeta(accounts.agentAta),\n getAccountMeta(accounts.tokenProgram),\n getAccountMeta(accounts.agentMint),\n getAccountMeta(accounts.delegationAttestation),\n getAccountMeta(accounts.satiCredential),\n getAccountMeta(accounts.clock),\n getAccountMeta(accounts.eventAuthority),\n getAccountMeta(accounts.program),\n ],\n data: getCreateCompressedAttestationInstructionDataEncoder().encode(\n args as CreateCompressedAttestationInstructionDataArgs,\n ),\n programAddress,\n } as CreateCompressedAttestationInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountSchemaConfig,\n TAccountInstructionsSysvar,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountDelegationAttestation,\n TAccountSatiCredential,\n TAccountClock,\n TAccountEventAuthority,\n TAccountProgram\n >);\n}\n\nexport type ParsedCreateCompressedAttestationInstruction<\n TProgram extends string = typeof SATI_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address<TProgram>;\n accounts: {\n /** Payer for transaction fees */\n payer: TAccountMetas[0];\n /** Schema config PDA */\n schemaConfig: TAccountMetas[1];\n /** Instructions sysvar for Ed25519 signature verification */\n instructionsSysvar: TAccountMetas[2];\n /**\n * Agent's ATA that holds the NFT - proves signer owns the agent identity.\n * Required for DualSignature and AgentOwnerSigned modes.\n * Optional for CounterpartySigned mode (not validated).\n *\n * The mint must match agent_mint from attestation data,\n * amount must be >= 1, and owner must match signatures[0].pubkey.\n */\n agentAta?: TAccountMetas[3] | undefined;\n /**\n * Token-2022 program for ATA verification.\n * Required when agent_ata is provided.\n */\n tokenProgram?: TAccountMetas[4] | undefined;\n /**\n * Agent mint (Token-2022 NFT) for Solscan indexing.\n * Must match agent_mint in attestation data (bytes 33-64).\n */\n agentMint: TAccountMetas[5];\n /**\n * Delegation attestation (optional).\n * Required when signer != agent ATA owner for AgentOwnerSigned mode.\n * Must be a valid DelegateV1 SAS attestation proving the signer's delegation.\n */\n delegationAttestation?: TAccountMetas[6] | undefined;\n /**\n * SATI SAS credential for delegation PDA derivation.\n * Required when delegation_attestation is provided.\n */\n satiCredential?: TAccountMetas[7] | undefined;\n /**\n * Clock sysvar for delegation expiry verification.\n * Required when delegation_attestation is provided.\n */\n clock?: TAccountMetas[8] | undefined;\n eventAuthority: TAccountMetas[9];\n program: TAccountMetas[10];\n };\n data: CreateCompressedAttestationInstructionData;\n};\n\nexport function parseCreateCompressedAttestationInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction<TProgram> &\n InstructionWithAccounts<TAccountMetas> &\n InstructionWithData<ReadonlyUint8Array>,\n): ParsedCreateCompressedAttestationInstruction<TProgram, TAccountMetas> {\n if (instruction.accounts.length < 11) {\n // TODO: Coded error.\n throw new Error(\"Not enough accounts\");\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n const getNextOptionalAccount = () => {\n const accountMeta = getNextAccount();\n return accountMeta.address === SATI_PROGRAM_ADDRESS\n ? undefined\n : accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n payer: getNextAccount(),\n schemaConfig: getNextAccount(),\n instructionsSysvar: getNextAccount(),\n agentAta: getNextOptionalAccount(),\n tokenProgram: getNextOptionalAccount(),\n agentMint: getNextAccount(),\n delegationAttestation: getNextOptionalAccount(),\n satiCredential: getNextOptionalAccount(),\n clock: getNextOptionalAccount(),\n eventAuthority: getNextAccount(),\n program: getNextAccount(),\n },\n data: getCreateCompressedAttestationInstructionDataDecoder().decode(\n instruction.data,\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n addDecoderSizePrefix,\n addEncoderSizePrefix,\n combineCodec,\n fixDecoderSize,\n fixEncoderSize,\n getBytesDecoder,\n getBytesEncoder,\n getI64Decoder,\n getI64Encoder,\n getProgramDerivedAddress,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n type WritableSignerAccount,\n} from \"@solana/kit\";\nimport { SATI_PROGRAM_ADDRESS } from \"../programs\";\nimport { getAccountMetaFactory, type ResolvedAccount } from \"../shared\";\n\nexport const CREATE_REGULAR_ATTESTATION_DISCRIMINATOR = new Uint8Array([\n 69, 6, 28, 228, 190, 240, 142, 79,\n]);\n\nexport function getCreateRegularAttestationDiscriminatorBytes() {\n return fixEncoderSize(getBytesEncoder(), 8).encode(\n CREATE_REGULAR_ATTESTATION_DISCRIMINATOR,\n );\n}\n\nexport type CreateRegularAttestationInstruction<\n TProgram extends string = typeof SATI_PROGRAM_ADDRESS,\n TAccountPayer extends string | AccountMeta<string> = string,\n TAccountSchemaConfig extends string | AccountMeta<string> = string,\n TAccountSatiPda extends string | AccountMeta<string> = string,\n TAccountSatiCredential extends string | AccountMeta<string> = string,\n TAccountSasSchema extends string | AccountMeta<string> = string,\n TAccountAttestation extends string | AccountMeta<string> = string,\n TAccountInstructionsSysvar extends string | AccountMeta<string> =\n \"Sysvar1nstructions1111111111111111111111111\",\n TAccountAgentAta extends string | AccountMeta<string> = string,\n TAccountTokenProgram extends string | AccountMeta<string> = string,\n TAccountAgentMint extends string | AccountMeta<string> = string,\n TAccountDelegationAttestation extends string | AccountMeta<string> = string,\n TAccountClock extends string | AccountMeta<string> =\n \"SysvarC1ock11111111111111111111111111111111\",\n TAccountSasProgram extends string | AccountMeta<string> =\n \"22zoJMtdu4tQc2PzL74ZUT7FrwgB1Udec8DdW4yw4BdG\",\n TAccountSystemProgram extends string | AccountMeta<string> =\n \"11111111111111111111111111111111\",\n TAccountEventAuthority extends string | AccountMeta<string> = string,\n TAccountProgram extends string | AccountMeta<string> = string,\n TRemainingAccounts extends readonly AccountMeta<string>[] = [],\n> = Instruction<TProgram> &\n InstructionWithData<ReadonlyUint8Array> &\n InstructionWithAccounts<\n [\n TAccountPayer extends string\n ? WritableSignerAccount<TAccountPayer> &\n AccountSignerMeta<TAccountPayer>\n : TAccountPayer,\n TAccountSchemaConfig extends string\n ? ReadonlyAccount<TAccountSchemaConfig>\n : TAccountSchemaConfig,\n TAccountSatiPda extends string\n ? ReadonlyAccount<TAccountSatiPda>\n : TAccountSatiPda,\n TAccountSatiCredential extends string\n ? ReadonlyAccount<TAccountSatiCredential>\n : TAccountSatiCredential,\n TAccountSasSchema extends string\n ? ReadonlyAccount<TAccountSasSchema>\n : TAccountSasSchema,\n TAccountAttestation extends string\n ? WritableAccount<TAccountAttestation>\n : TAccountAttestation,\n TAccountInstructionsSysvar extends string\n ? ReadonlyAccount<TAccountInstructionsSysvar>\n : TAccountInstructionsSysvar,\n TAccountAgentAta extends string\n ? ReadonlyAccount<TAccountAgentAta>\n : TAccountAgentAta,\n TAccountTokenProgram extends string\n ? ReadonlyAccount<TAccountTokenProgram>\n : TAccountTokenProgram,\n TAccountAgentMint extends string\n ? ReadonlyAccount<TAccountAgentMint>\n : TAccountAgentMint,\n TAccountDelegationAttestation extends string\n ? ReadonlyAccount<TAccountDelegationAttestation>\n : TAccountDelegationAttestation,\n TAccountClock extends string\n ? ReadonlyAccount<TAccountClock>\n : TAccountClock,\n TAccountSasProgram extends string\n ? ReadonlyAccount<TAccountSasProgram>\n : TAccountSasProgram,\n TAccountSystemProgram extends string\n ? ReadonlyAccount<TAccountSystemProgram>\n : TAccountSystemProgram,\n TAccountEventAuthority extends string\n ? ReadonlyAccount<TAccountEventAuthority>\n : TAccountEventAuthority,\n TAccountProgram extends string\n ? ReadonlyAccount<TAccountProgram>\n : TAccountProgram,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type CreateRegularAttestationInstructionData = {\n discriminator: ReadonlyUint8Array;\n /** Schema-conformant data bytes (130+ bytes, universal base layout) */\n data: ReadonlyUint8Array;\n /** Expiry timestamp (0 = never expires) */\n expiry: bigint;\n};\n\nexport type CreateRegularAttestationInstructionDataArgs = {\n /** Schema-conformant data bytes (130+ bytes, universal base layout) */\n data: ReadonlyUint8Array;\n /** Expiry timestamp (0 = never expires) */\n expiry: number | bigint;\n};\n\nexport function getCreateRegularAttestationInstructionDataEncoder(): Encoder<CreateRegularAttestationInstructionDataArgs> {\n return transformEncoder(\n getStructEncoder([\n [\"discriminator\", fixEncoderSize(getBytesEncoder(), 8)],\n [\"data\", addEncoderSizePrefix(getBytesEncoder(), getU32Encoder())],\n [\"expiry\", getI64Encoder()],\n ]),\n (value) => ({\n ...value,\n discriminator: CREATE_REGULAR_ATTESTATION_DISCRIMINATOR,\n }),\n );\n}\n\nexport function getCreateRegularAttestationInstructionDataDecoder(): Decoder<CreateRegularAttestationInstructionData> {\n return getStructDecoder([\n [\"discriminator\", fixDecoderSize(getBytesDecoder(), 8)],\n [\"data\", addDecoderSizePrefix(getBytesDecoder(), getU32Decoder())],\n [\"expiry\", getI64Decoder()],\n ]);\n}\n\nexport function getCreateRegularAttestationInstructionDataCodec(): Codec<\n CreateRegularAttestationInstructionDataArgs,\n CreateRegularAttestationInstructionData\n> {\n return combineCodec(\n getCreateRegularAttestationInstructionDataEncoder(),\n getCreateRegularAttestationInstructionDataDecoder(),\n );\n}\n\nexport type CreateRegularAttestationAsyncInput<\n TAccountPayer extends string = string,\n TAccountSchemaConfig extends string = string,\n TAccountSatiPda extends string = string,\n TAccountSatiCredential extends string = string,\n TAccountSasSchema extends string = string,\n TAccountAttestation extends string = string,\n TAccountInstructionsSysvar extends string = string,\n TAccountAgentAta extends string = string,\n TAccountTokenProgram extends string = string,\n TAccountAgentMint extends string = string,\n TAccountDelegationAttestation extends string = string,\n TAccountClock extends string = string,\n TAccountSasProgram extends string = string,\n TAccountSystemProgram extends string = string,\n TAccountEventAuthority extends string = string,\n TAccountProgram extends string = string,\n> = {\n /** Payer for account creation */\n payer: TransactionSigner<TAccountPayer>;\n /** Schema config PDA */\n schemaConfig: Address<TAccountSchemaConfig>;\n /** SATI Attestation Program PDA - authorized signer on SAS credential */\n satiPda?: Address<TAccountSatiPda>;\n /** SATI SAS credential account */\n satiCredential: Address<TAccountSatiCredential>;\n /** SAS schema account */\n sasSchema: Address<TAccountSasSchema>;\n /** Attestation PDA to be created */\n attestation: Address<TAccountAttestation>;\n /** Instructions sysvar for Ed25519 signature verification */\n instructionsSysvar?: Address<TAccountInstructionsSysvar>;\n /**\n * Agent's ATA that holds the NFT - proves signer owns the agent identity.\n * Required for AgentOwnerSigned mode (DelegateV1).\n * Optional for CounterpartySigned mode (ReputationScore).\n */\n agentAta?: Address<TAccountAgentAta>;\n /**\n * Token-2022 program for ATA verification.\n * Required when agent_ata is provided.\n */\n tokenProgram?: Address<TAccountTokenProgram>;\n /**\n * Agent mint (Token-2022 NFT) for Solscan indexing.\n * Must match agent_mint in attestation data (bytes 33-64).\n */\n agentMint: Address<TAccountAgentMint>;\n /**\n * Delegation attestation (optional).\n * Required when signer != agent ATA owner for AgentOwnerSigned mode.\n * Must be a valid DelegateV1 SAS attestation proving the signer's delegation.\n */\n delegationAttestation?: Address<TAccountDelegationAttestation>;\n /**\n * Clock sysvar for delegation expiry verification.\n * Required when delegation_attestation is provided.\n */\n clock?: Address<TAccountClock>;\n /** SAS program */\n sasProgram?: Address<TAccountSasProgram>;\n systemProgram?: Address<TAccountSystemProgram>;\n eventAuthority?: Address<TAccountEventAuthority>;\n program: Address<TAccountProgram>;\n data: CreateRegularAttestationInstructionDataArgs[\"data\"];\n expiry: CreateRegularAttestationInstructionDataArgs[\"expiry\"];\n};\n\nexport async function getCreateRegularAttestationInstructionAsync<\n TAccountPayer extends string,\n TAccountSchemaConfig extends string,\n TAccountSatiPda extends string,\n TAccountSatiCredential extends string,\n TAccountSasSchema extends string,\n TAccountAttestation extends string,\n TAccountInstructionsSysvar extends string,\n TAccountAgentAta extends string,\n TAccountTokenProgram extends string,\n TAccountAgentMint extends string,\n TAccountDelegationAttestation extends string,\n TAccountClock extends string,\n TAccountSasProgram extends string,\n TAccountSystemProgram extends string,\n TAccountEventAuthority extends string,\n TAccountProgram extends string,\n TProgramAddress extends Address = typeof SATI_PROGRAM_ADDRESS,\n>(\n input: CreateRegularAttestationAsyncInput<\n TAccountPayer,\n TAccountSchemaConfig,\n TAccountSatiPda,\n TAccountSatiCredential,\n TAccountSasSchema,\n TAccountAttestation,\n TAccountInstructionsSysvar,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountDelegationAttestation,\n TAccountClock,\n TAccountSasProgram,\n TAccountSystemProgram,\n TAccountEventAuthority,\n TAccountProgram\n >,\n config?: { programAddress?: TProgramAddress },\n): Promise<\n CreateRegularAttestationInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountSchemaConfig,\n TAccountSatiPda,\n TAccountSatiCredential,\n TAccountSasSchema,\n TAccountAttestation,\n TAccountInstructionsSysvar,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountDelegationAttestation,\n TAccountClock,\n TAccountSasProgram,\n TAccountSystemProgram,\n TAccountEventAuthority,\n TAccountProgram\n >\n> {\n // Program address.\n const programAddress = config?.programAddress ?? SATI_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n schemaConfig: { value: input.schemaConfig ?? null, isWritable: false },\n satiPda: { value: input.satiPda ?? null, isWritable: false },\n satiCredential: { value: input.satiCredential ?? null, isWritable: false },\n sasSchema: { value: input.sasSchema ?? null, isWritable: false },\n attestation: { value: input.attestation ?? null, isWritable: true },\n instructionsSysvar: {\n value: input.instructionsSysvar ?? null,\n isWritable: false,\n },\n agentAta: { value: input.agentAta ?? null, isWritable: false },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n agentMint: { value: input.agentMint ?? null, isWritable: false },\n delegationAttestation: {\n value: input.delegationAttestation ?? null,\n isWritable: false,\n },\n clock: { value: input.clock ?? null, isWritable: false },\n sasProgram: { value: input.sasProgram ?? null, isWritable: false },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n eventAuthority: { value: input.eventAuthority ?? null, isWritable: false },\n program: { value: input.program ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.satiPda.value) {\n accounts.satiPda.value = await getProgramDerivedAddress({\n programAddress,\n seeds: [\n getBytesEncoder().encode(\n new Uint8Array([\n 115, 97, 116, 105, 95, 97, 116, 116, 101, 115, 116, 97, 116, 105,\n 111, 110,\n ]),\n ),\n ],\n });\n }\n if (!accounts.instructionsSysvar.value) {\n accounts.instructionsSysvar.value =\n \"Sysvar1nstructions1111111111111111111111111\" as Address<\"Sysvar1nstructions1111111111111111111111111\">;\n }\n if (!accounts.clock.value) {\n accounts.clock.value =\n \"SysvarC1ock11111111111111111111111111111111\" as Address<\"SysvarC1ock11111111111111111111111111111111\">;\n }\n if (!accounts.sasProgram.value) {\n accounts.sasProgram.value =\n \"22zoJMtdu4tQc2PzL74ZUT7FrwgB1Udec8DdW4yw4BdG\" as Address<\"22zoJMtdu4tQc2PzL74ZUT7FrwgB1Udec8DdW4yw4BdG\">;\n }\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n \"11111111111111111111111111111111\" as Address<\"11111111111111111111111111111111\">;\n }\n if (!accounts.eventAuthority.value) {\n accounts.eventAuthority.value = await getProgramDerivedAddress({\n programAddress,\n seeds: [\n getBytesEncoder().encode(\n new Uint8Array([\n 95, 95, 101, 118, 101, 110, 116, 95, 97, 117, 116, 104, 111, 114,\n 105, 116, 121,\n ]),\n ),\n ],\n });\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, \"programId\");\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.schemaConfig),\n getAccountMeta(accounts.satiPda),\n getAccountMeta(accounts.satiCredential),\n getAccountMeta(accounts.sasSchema),\n getAccountMeta(accounts.attestation),\n getAccountMeta(accounts.instructionsSysvar),\n getAccountMeta(accounts.agentAta),\n getAccountMeta(accounts.tokenProgram),\n getAccountMeta(accounts.agentMint),\n getAccountMeta(accounts.delegationAttestation),\n getAccountMeta(accounts.clock),\n getAccountMeta(accounts.sasProgram),\n getAccountMeta(accounts.systemProgram),\n getAccountMeta(accounts.eventAuthority),\n getAccountMeta(accounts.program),\n ],\n data: getCreateRegularAttestationInstructionDataEncoder().encode(\n args as CreateRegularAttestationInstructionDataArgs,\n ),\n programAddress,\n } as CreateRegularAttestationInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountSchemaConfig,\n TAccountSatiPda,\n TAccountSatiCredential,\n TAccountSasSchema,\n TAccountAttestation,\n TAccountInstructionsSysvar,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountDelegationAttestation,\n TAccountClock,\n TAccountSasProgram,\n TAccountSystemProgram,\n TAccountEventAuthority,\n TAccountProgram\n >);\n}\n\nexport type CreateRegularAttestationInput<\n TAccountPayer extends string = string,\n TAccountSchemaConfig extends string = string,\n TAccountSatiPda extends string = string,\n TAccountSatiCredential extends string = string,\n TAccountSasSchema extends string = string,\n TAccountAttestation extends string = string,\n TAccountInstructionsSysvar extends string = string,\n TAccountAgentAta extends string = string,\n TAccountTokenProgram extends string = string,\n TAccountAgentMint extends string = string,\n TAccountDelegationAttestation extends string = string,\n TAccountClock extends string = string,\n TAccountSasProgram extends string = string,\n TAccountSystemProgram extends string = string,\n TAccountEventAuthority extends string = string,\n TAccountProgram extends string = string,\n> = {\n /** Payer for account creation */\n payer: TransactionSigner<TAccountPayer>;\n /** Schema config PDA */\n schemaConfig: Address<TAccountSchemaConfig>;\n /** SATI Attestation Program PDA - authorized signer on SAS credential */\n satiPda: Address<TAccountSatiPda>;\n /** SATI SAS credential account */\n satiCredential: Address<TAccountSatiCredential>;\n /** SAS schema account */\n sasSchema: Address<TAccountSasSchema>;\n /** Attestation PDA to be created */\n attestation: Address<TAccountAttestation>;\n /** Instructions sysvar for Ed25519 signature verification */\n instructionsSysvar?: Address<TAccountInstructionsSysvar>;\n /**\n * Agent's ATA that holds the NFT - proves signer owns the agent identity.\n * Required for AgentOwnerSigned mode (DelegateV1).\n * Optional for CounterpartySigned mode (ReputationScore).\n */\n agentAta?: Address<TAccountAgentAta>;\n /**\n * Token-2022 program for ATA verification.\n * Required when agent_ata is provided.\n */\n tokenProgram?: Address<TAccountTokenProgram>;\n /**\n * Agent mint (Token-2022 NFT) for Solscan indexing.\n * Must match agent_mint in attestation data (bytes 33-64).\n */\n agentMint: Address<TAccountAgentMint>;\n /**\n * Delegation attestation (optional).\n * Required when signer != agent ATA owner for AgentOwnerSigned mode.\n * Must be a valid DelegateV1 SAS attestation proving the signer's delegation.\n */\n delegationAttestation?: Address<TAccountDelegationAttestation>;\n /**\n * Clock sysvar for delegation expiry verification.\n * Required when delegation_attestation is provided.\n */\n clock?: Address<TAccountClock>;\n /** SAS program */\n sasProgram?: Address<TAccountSasProgram>;\n systemProgram?: Address<TAccountSystemProgram>;\n eventAuthority: Address<TAccountEventAuthority>;\n program: Address<TAccountProgram>;\n data: CreateRegularAttestationInstructionDataArgs[\"data\"];\n expiry: CreateRegularAttestationInstructionDataArgs[\"expiry\"];\n};\n\nexport function getCreateRegularAttestationInstruction<\n TAccountPayer extends string,\n TAccountSchemaConfig extends string,\n TAccountSatiPda extends string,\n TAccountSatiCredential extends string,\n TAccountSasSchema extends string,\n TAccountAttestation extends string,\n TAccountInstructionsSysvar extends string,\n TAccountAgentAta extends string,\n TAccountTokenProgram extends string,\n TAccountAgentMint extends string,\n TAccountDelegationAttestation extends string,\n TAccountClock extends string,\n TAccountSasProgram extends string,\n TAccountSystemProgram extends string,\n TAccountEventAuthority extends string,\n TAccountProgram extends string,\n TProgramAddress extends Address = typeof SATI_PROGRAM_ADDRESS,\n>(\n input: CreateRegularAttestationInput<\n TAccountPayer,\n TAccountSchemaConfig,\n TAccountSatiPda,\n TAccountSatiCredential,\n TAccountSasSchema,\n TAccountAttestation,\n TAccountInstructionsSysvar,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountDelegationAttestation,\n TAccountClock,\n TAccountSasProgram,\n TAccountSystemProgram,\n TAccountEventAuthority,\n TAccountProgram\n >,\n config?: { programAddress?: TProgramAddress },\n): CreateRegularAttestationInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountSchemaConfig,\n TAccountSatiPda,\n TAccountSatiCredential,\n TAccountSasSchema,\n TAccountAttestation,\n TAccountInstructionsSysvar,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountDelegationAttestation,\n TAccountClock,\n TAccountSasProgram,\n TAccountSystemProgram,\n TAccountEventAuthority,\n TAccountProgram\n> {\n // Program address.\n const programAddress = config?.programAddress ?? SATI_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n schemaConfig: { value: input.schemaConfig ?? null, isWritable: false },\n satiPda: { value: input.satiPda ?? null, isWritable: false },\n satiCredential: { value: input.satiCredential ?? null, isWritable: false },\n sasSchema: { value: input.sasSchema ?? null, isWritable: false },\n attestation: { value: input.attestation ?? null, isWritable: true },\n instructionsSysvar: {\n value: input.instructionsSysvar ?? null,\n isWritable: false,\n },\n agentAta: { value: input.agentAta ?? null, isWritable: false },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n agentMint: { value: input.agentMint ?? null, isWritable: false },\n delegationAttestation: {\n value: input.delegationAttestation ?? null,\n isWritable: false,\n },\n clock: { value: input.clock ?? null, isWritable: false },\n sasProgram: { value: input.sasProgram ?? null, isWritable: false },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n eventAuthority: { value: input.eventAuthority ?? null, isWritable: false },\n program: { value: input.program ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.instructionsSysvar.value) {\n accounts.instructionsSysvar.value =\n \"Sysvar1nstructions1111111111111111111111111\" as Address<\"Sysvar1nstructions1111111111111111111111111\">;\n }\n if (!accounts.clock.value) {\n accounts.clock.value =\n \"SysvarC1ock11111111111111111111111111111111\" as Address<\"SysvarC1ock11111111111111111111111111111111\">;\n }\n if (!accounts.sasProgram.value) {\n accounts.sasProgram.value =\n \"22zoJMtdu4tQc2PzL74ZUT7FrwgB1Udec8DdW4yw4BdG\" as Address<\"22zoJMtdu4tQc2PzL74ZUT7FrwgB1Udec8DdW4yw4BdG\">;\n }\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n \"11111111111111111111111111111111\" as Address<\"11111111111111111111111111111111\">;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, \"programId\");\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.schemaConfig),\n getAccountMeta(accounts.satiPda),\n getAccountMeta(accounts.satiCredential),\n getAccountMeta(accounts.sasSchema),\n getAccountMeta(accounts.attestation),\n getAccountMeta(accounts.instructionsSysvar),\n getAccountMeta(accounts.agentAta),\n getAccountMeta(accounts.tokenProgram),\n getAccountMeta(accounts.agentMint),\n getAccountMeta(accounts.delegationAttestation),\n getAccountMeta(accounts.clock),\n getAccountMeta(accounts.sasProgram),\n getAccountMeta(accounts.systemProgram),\n getAccountMeta(accounts.eventAuthority),\n getAccountMeta(accounts.program),\n ],\n data: getCreateRegularAttestationInstructionDataEncoder().encode(\n args as CreateRegularAttestationInstructionDataArgs,\n ),\n programAddress,\n } as CreateRegularAttestationInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountSchemaConfig,\n TAccountSatiPda,\n TAccountSatiCredential,\n TAccountSasSchema,\n TAccountAttestation,\n TAccountInstructionsSysvar,\n TAccountAgentAta,\n TAccountTokenProgram,\n TAccountAgentMint,\n TAccountDelegationAttestation,\n TAccountClock,\n TAccountSasProgram,\n TAccountSystemProgram,\n TAccountEventAuthority,\n TAccountProgram\n >);\n}\n\nexport type ParsedCreateRegularAttestationInstruction<\n TProgram extends string = typeof SATI_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address<TProgram>;\n accounts: {\n /** Payer for account creation */\n payer: TAccountMetas[0];\n /** Schema config PDA */\n schemaConfig: TAccountMetas[1];\n /** SATI Attestation Program PDA - authorized signer on SAS credential */\n satiPda: TAccountMetas[2];\n /** SATI SAS credential account */\n satiCredential: TAccountMetas[3];\n /** SAS schema account */\n sasSchema: TAccountMetas[4];\n /** Attestation PDA to be created */\n attestation: TAccountMetas[5];\n /** Instructions sysvar for Ed25519 signature verification */\n instructionsSysvar: TAccountMetas[6];\n /**\n * Agent's ATA that holds the NFT - proves signer owns the agent identity.\n * Required for AgentOwnerSigned mode (DelegateV1).\n * Optional for CounterpartySigned mode (ReputationScore).\n */\n agentAta?: TAccountMetas[7] | undefined;\n /**\n * Token-2022 program for ATA verification.\n * Required when agent_ata is provided.\n */\n tokenProgram?: TAccountMetas[8] | undefined;\n /**\n * Agent mint (Token-2022 NFT) for Solscan indexing.\n * Must match agent_mint in attestation data (bytes 33-64).\n */\n agentMint: TAccountMetas[9];\n /**\n * Delegation attestation (optional).\n * Required when signer != agent ATA owner for AgentOwnerSigned mode.\n * Must be a valid DelegateV1 SAS attestation proving the signer's delegation.\n */\n delegationAttestation?: TAccountMetas[10] | undefined;\n /**\n * Clock sysvar for delegation expiry verification.\n * Required when delegation_attestation is provided.\n */\n clock?: TAccountMetas[11] | undefined;\n /** SAS program */\n sasProgram: TAccountMetas[12];\n systemProgram: TAccountMetas[13];\n eventAuthority: TAccountMetas[14];\n program: TAccountMetas[15];\n };\n data: CreateRegularAttestationInstructionData;\n};\n\nexport function parseCreateRegularAttestationInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction<TProgram> &\n InstructionWithAccounts<TAccountMetas> &\n InstructionWithData<ReadonlyUint8Array>,\n): ParsedCreateRegularAttestationInstruction<TProgram, TAccountMetas> {\n if (instruction.accounts.length < 16) {\n // TODO: Coded error.\n throw new Error(\"Not enough accounts\");\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n const getNextOptionalAccount = () => {\n const accountMeta = getNextAccount();\n return accountMeta.address === SATI_PROGRAM_ADDRESS\n ? undefined\n : accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n payer: getNextAccount(),\n schemaConfig: getNextAccount(),\n satiPda: getNextAccount(),\n satiCredential: getNextAccount(),\n sasSchema: getNextAccount(),\n attestation: getNextAccount(),\n instructionsSysvar: getNextAccount(),\n agentAta: getNextOptionalAccount(),\n tokenProgram: getNextOptionalAccount(),\n agentMint: getNextAccount(),\n delegationAttestation: getNextOptionalAccount(),\n clock: getNextOptionalAccount(),\n sasProgram: getNextAccount(),\n systemProgram: getNextAccount(),\n eventAuthority: getNextAccount(),\n program: getNextAccount(),\n },\n data: getCreateRegularAttestationInstructionDataDecoder().decode(\n instruction.data,\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n fixDecoderSize,\n fixEncoderSize,\n getBytesDecoder,\n getBytesEncoder,\n getProgramDerivedAddress,\n getStructDecoder,\n getStructEncoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type FixedSizeCodec,\n type FixedSizeDecoder,\n type FixedSizeEncoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n type WritableSignerAccount,\n} from \"@solana/kit\";\nimport { SATI_PROGRAM_ADDRESS } from \"../programs\";\nimport { getAccountMetaFactory, type ResolvedAccount } from \"../shared\";\n\nexport const INITIALIZE_DISCRIMINATOR = new Uint8Array([\n 175, 175, 109, 31, 13, 152, 155, 237,\n]);\n\nexport function getInitializeDiscriminatorBytes() {\n return fixEncoderSize(getBytesEncoder(), 8).encode(INITIALIZE_DISCRIMINATOR);\n}\n\nexport type InitializeInstruction<\n TProgram extends string = typeof SATI_PROGRAM_ADDRESS,\n TAccountAuthority extends string | AccountMeta<string> = string,\n TAccountRegistryConfig extends string | AccountMeta<string> = string,\n TAccountGroupMint extends string | AccountMeta<string> = string,\n TAccountSystemProgram extends string | AccountMeta<string> =\n \"11111111111111111111111111111111\",\n TRemainingAccounts extends readonly AccountMeta<string>[] = [],\n> = Instruction<TProgram> &\n InstructionWithData<ReadonlyUint8Array> &\n InstructionWithAccounts<\n [\n TAccountAuthority extends string\n ? WritableSignerAccount<TAccountAuthority> &\n AccountSignerMeta<TAccountAuthority>\n : TAccountAuthority,\n TAccountRegistryConfig extends string\n ? WritableAccount<TAccountRegistryConfig>\n : TAccountRegistryConfig,\n TAccountGroupMint extends string\n ? WritableAccount<TAccountGroupMint>\n : TAccountGroupMint,\n TAccountSystemProgram extends string\n ? ReadonlyAccount<TAccountSystemProgram>\n : TAccountSystemProgram,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type InitializeInstructionData = { discriminator: ReadonlyUint8Array };\n\nexport type InitializeInstructionDataArgs = {};\n\nexport function getInitializeInstructionDataEncoder(): FixedSizeEncoder<InitializeInstructionDataArgs> {\n return transformEncoder(\n getStructEncoder([[\"discriminator\", fixEncoderSize(getBytesEncoder(), 8)]]),\n (value) => ({ ...value, discriminator: INITIALIZE_DISCRIMINATOR }),\n );\n}\n\nexport function getInitializeInstructionDataDecoder(): FixedSizeDecoder<InitializeInstructionData> {\n return getStructDecoder([\n [\"discriminator\", fixDecoderSize(getBytesDecoder(), 8)],\n ]);\n}\n\nexport function getInitializeInstructionDataCodec(): FixedSizeCodec<\n InitializeInstructionDataArgs,\n InitializeInstructionData\n> {\n return combineCodec(\n getInitializeInstructionDataEncoder(),\n getInitializeInstructionDataDecoder(),\n );\n}\n\nexport type InitializeAsyncInput<\n TAccountAuthority extends string = string,\n TAccountRegistryConfig extends string = string,\n TAccountGroupMint extends string = string,\n TAccountSystemProgram extends string = string,\n> = {\n /** Initial registry authority (will be multisig in production) */\n authority: TransactionSigner<TAccountAuthority>;\n /** Registry configuration PDA */\n registryConfig?: Address<TAccountRegistryConfig>;\n /** TokenGroup mint - created and initialized by client, then finalized here */\n groupMint: Address<TAccountGroupMint>;\n systemProgram?: Address<TAccountSystemProgram>;\n};\n\nexport async function getInitializeInstructionAsync<\n TAccountAuthority extends string,\n TAccountRegistryConfig extends string,\n TAccountGroupMint extends string,\n TAccountSystemProgram extends string,\n TProgramAddress extends Address = typeof SATI_PROGRAM_ADDRESS,\n>(\n input: InitializeAsyncInput<\n TAccountAuthority,\n TAccountRegistryConfig,\n TAccountGroupMint,\n TAccountSystemProgram\n >,\n config?: { programAddress?: TProgramAddress },\n): Promise<\n InitializeInstruction<\n TProgramAddress,\n TAccountAuthority,\n TAccountRegistryConfig,\n TAccountGroupMint,\n TAccountSystemProgram\n >\n> {\n // Program address.\n const programAddress = config?.programAddress ?? SATI_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n authority: { value: input.authority ?? null, isWritable: true },\n registryConfig: { value: input.registryConfig ?? null, isWritable: true },\n groupMint: { value: input.groupMint ?? null, isWritable: true },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.registryConfig.value) {\n accounts.registryConfig.value = await getProgramDerivedAddress({\n programAddress,\n seeds: [\n getBytesEncoder().encode(\n new Uint8Array([114, 101, 103, 105, 115, 116, 114, 121]),\n ),\n ],\n });\n }\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n \"11111111111111111111111111111111\" as Address<\"11111111111111111111111111111111\">;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, \"programId\");\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.authority),\n getAccountMeta(accounts.registryConfig),\n getAccountMeta(accounts.groupMint),\n getAccountMeta(accounts.systemProgram),\n ],\n data: getInitializeInstructionDataEncoder().encode({}),\n programAddress,\n } as InitializeInstruction<\n TProgramAddress,\n TAccountAuthority,\n TAccountRegistryConfig,\n TAccountGroupMint,\n TAccountSystemProgram\n >);\n}\n\nexport type InitializeInput<\n TAccountAuthority extends string = string,\n TAccountRegistryConfig extends string = string,\n TAccountGroupMint extends string = string,\n TAccountSystemProgram extends string = string,\n> = {\n /** Initial registry authority (will be multisig in production) */\n authority: TransactionSigner<TAccountAuthority>;\n /** Registry configuration PDA */\n registryConfig: Address<TAccountRegistryConfig>;\n /** TokenGroup mint - created and initialized by client, then finalized here */\n groupMint: Address<TAccountGroupMint>;\n systemProgram?: Address<TAccountSystemProgram>;\n};\n\nexport function getInitializeInstruction<\n TAccountAuthority extends string,\n TAccountRegistryConfig extends string,\n TAccountGroupMint extends string,\n TAccountSystemProgram extends string,\n TProgramAddress extends Address = typeof SATI_PROGRAM_ADDRESS,\n>(\n input: InitializeInput<\n TAccountAuthority,\n TAccountRegistryConfig,\n TAccountGroupMint,\n TAccountSystemProgram\n >,\n config?: { programAddress?: TProgramAddress },\n): InitializeInstruction<\n TProgramAddress,\n TAccountAuthority,\n TAccountRegistryConfig,\n TAccountGroupMint,\n TAccountSystemProgram\n> {\n // Program address.\n const programAddress = config?.programAddress ?? SATI_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n authority: { value: input.authority ?? null, isWritable: true },\n registryConfig: { value: input.registryConfig ?? null, isWritable: true },\n groupMint: { value: input.groupMint ?? null, isWritable: true },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Resolve default values.\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n \"11111111111111111111111111111111\" as Address<\"11111111111111111111111111111111\">;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, \"programId\");\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.authority),\n getAccountMeta(accounts.registryConfig),\n getAccountMeta(accounts.groupMint),\n getAccountMeta(accounts.systemProgram),\n ],\n data: getInitializeInstructionDataEncoder().encode({}),\n programAddress,\n } as InitializeInstruction<\n TProgramAddress,\n TAccountAuthority,\n TAccountRegistryConfig,\n TAccountGroupMint,\n TAccountSystemProgram\n >);\n}\n\nexport type ParsedInitializeInstruction<\n TProgram extends string = typeof SATI_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address<TProgram>;\n accounts: {\n /** Initial registry authority (will be multisig in production) */\n authority: TAccountMetas[0];\n /** Registry configuration PDA */\n registryConfig: TAccountMetas[1];\n /** TokenGroup mint - created and initialized by client, then finalized here */\n groupMint: TAccountMetas[2];\n systemProgram: TAccountMetas[3];\n };\n data: InitializeInstructionData;\n};\n\nexport function parseInitializeInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction<TProgram> &\n InstructionWithAccounts<TAccountMetas> &\n InstructionWithData<ReadonlyUint8Array>,\n): ParsedInitializeInstruction<TProgram, TAccountMetas> {\n if (instruction.accounts.length < 4) {\n // TODO: Coded error.\n throw new Error(\"Not enough accounts\");\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n authority: getNextAccount(),\n registryConfig: getNextAccount(),\n groupMint: getNextAccount(),\n systemProgram: getNextAccount(),\n },\n data: getInitializeInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n addDecoderSizePrefix,\n addEncoderSizePrefix,\n combineCodec,\n fixDecoderSize,\n fixEncoderSize,\n getAddressEncoder,\n getBytesDecoder,\n getBytesEncoder,\n getProgramDerivedAddress,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getU8Decoder,\n getU8Encoder,\n getUtf8Decoder,\n getUtf8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n} from \"@solana/kit\";\nimport { SATI_PROGRAM_ADDRESS } from \"../programs\";\nimport {\n expectAddress,\n getAccountMetaFactory,\n type ResolvedAccount,\n} from \"../shared\";\n\nexport const LINK_EVM_ADDRESS_DISCRIMINATOR = new Uint8Array([\n 156, 75, 131, 178, 64, 110, 236, 64,\n]);\n\nexport function getLinkEvmAddressDiscriminatorBytes() {\n return fixEncoderSize(getBytesEncoder(), 8).encode(\n LINK_EVM_ADDRESS_DISCRIMINATOR,\n );\n}\n\nexport type LinkEvmAddressInstruction<\n TProgram extends string = typeof SATI_PROGRAM_ADDRESS,\n TAccountOwner extends string | AccountMeta<string> = string,\n TAccountAgentMint extends string | AccountMeta<string> = string,\n TAccountAta extends string | AccountMeta<string> = string,\n TAccountTokenProgram extends string | AccountMeta<string> =\n \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n TRemainingAccounts extends readonly AccountMeta<string>[] = [],\n> = Instruction<TProgram> &\n InstructionWithData<ReadonlyUint8Array> &\n InstructionWithAccounts<\n [\n TAccountOwner extends string\n ? ReadonlySignerAccount<TAccountOwner> &\n AccountSignerMeta<TAccountOwner>\n : TAccountOwner,\n TAccountAgentMint extends string\n ? ReadonlyAccount<TAccountAgentMint>\n : TAccountAgentMint,\n TAccountAta extends string ? ReadonlyAccount<TAccountAta> : TAccountAta,\n TAccountTokenProgram extends string\n ? ReadonlyAccount<TAccountTokenProgram>\n : TAccountTokenProgram,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type LinkEvmAddressInstructionData = {\n discriminator: ReadonlyUint8Array;\n /** EVM address (20 bytes) */\n evmAddress: ReadonlyUint8Array;\n /** CAIP-2 chain identifier (e.g., \"eip155:1\", \"eip155:8453\") */\n chainId: string;\n /** secp256k1 signature (64 bytes: r || s) */\n signature: ReadonlyUint8Array;\n /** Recovery ID (0 or 1) */\n recoveryId: number;\n};\n\nexport type LinkEvmAddressInstructionDataArgs = {\n /** EVM address (20 bytes) */\n evmAddress: ReadonlyUint8Array;\n /** CAIP-2 chain identifier (e.g., \"eip155:1\", \"eip155:8453\") */\n chainId: string;\n /** secp256k1 signature (64 bytes: r || s) */\n signature: ReadonlyUint8Array;\n /** Recovery ID (0 or 1) */\n recoveryId: number;\n};\n\nexport function getLinkEvmAddressInstructionDataEncoder(): Encoder<LinkEvmAddressInstructionDataArgs> {\n return transformEncoder(\n getStructEncoder([\n [\"discriminator\", fixEncoderSize(getBytesEncoder(), 8)],\n [\"evmAddress\", fixEncoderSize(getBytesEncoder(), 20)],\n [\"chainId\", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n [\"signature\", fixEncoderSize(getBytesEncoder(), 64)],\n [\"recoveryId\", getU8Encoder()],\n ]),\n (value) => ({ ...value, discriminator: LINK_EVM_ADDRESS_DISCRIMINATOR }),\n );\n}\n\nexport function getLinkEvmAddressInstructionDataDecoder(): Decoder<LinkEvmAddressInstructionData> {\n return getStructDecoder([\n [\"discriminator\", fixDecoderSize(getBytesDecoder(), 8)],\n [\"evmAddress\", fixDecoderSize(getBytesDecoder(), 20)],\n [\"chainId\", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n [\"signature\", fixDecoderSize(getBytesDecoder(), 64)],\n [\"recoveryId\", getU8Decoder()],\n ]);\n}\n\nexport function getLinkEvmAddressInstructionDataCodec(): Codec<\n LinkEvmAddressInstructionDataArgs,\n LinkEvmAddressInstructionData\n> {\n return combineCodec(\n getLinkEvmAddressInstructionDataEncoder(),\n getLinkEvmAddressInstructionDataDecoder(),\n );\n}\n\nexport type LinkEvmAddressAsyncInput<\n TAccountOwner extends string = string,\n TAccountAgentMint extends string = string,\n TAccountAta extends string = string,\n TAccountTokenProgram extends string = string,\n> = {\n /** Agent owner (must sign) */\n owner: TransactionSigner<TAccountOwner>;\n /** Agent mint account */\n agentMint: Address<TAccountAgentMint>;\n /**\n * Owner's associated token account for this mint\n * Validated to be correct ATA for the agent_mint and have balance > 0\n */\n ata?: Address<TAccountAta>;\n /** Token-2022 program for ATA verification */\n tokenProgram?: Address<TAccountTokenProgram>;\n evmAddress: LinkEvmAddressInstructionDataArgs[\"evmAddress\"];\n chainId: LinkEvmAddressInstructionDataArgs[\"chainId\"];\n signature: LinkEvmAddressInstructionDataArgs[\"signature\"];\n recoveryId: LinkEvmAddressInstructionDataArgs[\"recoveryId\"];\n};\n\nexport async function getLinkEvmAddressInstructionAsync<\n TAccountOwner extends string,\n TAccountAgentMint extends string,\n TAccountAta extends string,\n TAccountTokenProgram extends string,\n TProgramAddress extends Address = typeof SATI_PROGRAM_ADDRESS,\n>(\n input: LinkEvmAddressAsyncInput<\n TAccountOwner,\n TAccountAgentMint,\n TAccountAta,\n TAccountTokenProgram\n >,\n config?: { programAddress?: TProgramAddress },\n): Promise<\n LinkEvmAddressInstruction<\n TProgramAddress,\n TAccountOwner,\n TAccountAgentMint,\n TAccountAta,\n TAccountTokenProgram\n >\n> {\n // Program address.\n const programAddress = config?.programAddress ?? SATI_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n owner: { value: input.owner ?? null, isWritable: false },\n agentMint: { value: input.agentMint ?? null, isWritable: false },\n ata: { value: input.ata ?? null, isWritable: false },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.tokenProgram.value) {\n accounts.tokenProgram.value =\n \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\" as Address<\"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\">;\n }\n if (!accounts.ata.value) {\n accounts.ata.value = await getProgramDerivedAddress({\n programAddress:\n \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\" as Address<\"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\">,\n seeds: [\n getAddressEncoder().encode(expectAddress(accounts.owner.value)),\n getAddressEncoder().encode(expectAddress(accounts.tokenProgram.value)),\n getAddressEncoder().encode(expectAddress(accounts.agentMint.value)),\n ],\n });\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, \"programId\");\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.owner),\n getAccountMeta(accounts.agentMint),\n getAccountMeta(accounts.ata),\n getAccountMeta(accounts.tokenProgram),\n ],\n data: getLinkEvmAddressInstructionDataEncoder().encode(\n args as LinkEvmAddressInstructionDataArgs,\n ),\n programAddress,\n } as LinkEvmAddressInstruction<\n TProgramAddress,\n TAccountOwner,\n TAccountAgentMint,\n TAccountAta,\n TAccountTokenProgram\n >);\n}\n\nexport type LinkEvmAddressInput<\n TAccountOwner extends string = string,\n TAccountAgentMint extends string = string,\n TAccountAta extends string = string,\n TAccountTokenProgram extends string = string,\n> = {\n /** Agent owner (must sign) */\n owner: TransactionSigner<TAccountOwner>;\n /** Agent mint account */\n agentMint: Address<TAccountAgentMint>;\n /**\n * Owner's associated token account for this mint\n * Validated to be correct ATA for the agent_mint and have balance > 0\n */\n ata: Address<TAccountAta>;\n /** Token-2022 program for ATA verification */\n tokenProgram?: Address<TAccountTokenProgram>;\n evmAddress: LinkEvmAddressInstructionDataArgs[\"evmAddress\"];\n chainId: LinkEvmAddressInstructionDataArgs[\"chainId\"];\n signature: LinkEvmAddressInstructionDataArgs[\"signature\"];\n recoveryId: LinkEvmAddressInstructionDataArgs[\"recoveryId\"];\n};\n\nexport function getLinkEvmAddressInstruction<\n TAccountOwner extends string,\n TAccountAgentMint extends string,\n TAccountAta extends string,\n TAccountTokenProgram extends string,\n TProgramAddress extends Address = typeof SATI_PROGRAM_ADDRESS,\n>(\n input: LinkEvmAddressInput<\n TAccountOwner,\n TAccountAgentMint,\n TAccountAta,\n TAccountTokenProgram\n >,\n config?: { programAddress?: TProgramAddress },\n): LinkEvmAddressInstruction<\n TProgramAddress,\n TAccountOwner,\n TAccountAgentMint,\n TAccountAta,\n TAccountTokenProgram\n> {\n // Program address.\n const programAddress = config?.programAddress ?? SATI_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n owner: { value: input.owner ?? null, isWritable: false },\n agentMint: { value: input.agentMint ?? null, isWritable: false },\n ata: { value: input.ata ?? null, isWritable: false },\n tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.tokenProgram.value) {\n accounts.tokenProgram.value =\n \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\" as Address<\"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\">;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, \"programId\");\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.owner),\n getAccountMeta(accounts.agentMint),\n getAccountMeta(accounts.ata),\n getAccountMeta(accounts.tokenProgram),\n ],\n data: getLinkEvmAddressInstructionDataEncoder().encode(\n args as LinkEvmAddressInstructionDataArgs,\n ),\n programAddress,\n } as LinkEvmAddressInstruction<\n TProgramAddress,\n TAccountOwner,\n TAccountAgentMint,\n TAccountAta,\n TAccountTokenProgram\n >);\n}\n\nexport type ParsedLinkEvmAddressInstruction<\n TProgram extends string = typeof SATI_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address<TProgram>;\n accounts: {\n /** Agent owner (must sign) */\n owner: TAccountMetas[0];\n /** Agent mint account */\n agentMint: TAccountMetas[1];\n /**\n * Owner's associated token account for this mint\n * Validated to be correct ATA for the agent_mint and have balance > 0\n */\n ata: TAccountMetas[2];\n /** Token-2022 program for ATA verification */\n tokenProgram: TAccountMetas[3];\n };\n data: LinkEvmAddressInstructionData;\n};\n\nexport function parseLinkEvmAddressInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction<TProgram> &\n InstructionWithAccounts<TAccountMetas> &\n InstructionWithData<ReadonlyUint8Array>,\n): ParsedLinkEvmAddressInstruction<TProgram, TAccountMetas> {\n if (instruction.accounts.length < 4) {\n // TODO: Coded error.\n throw new Error(\"Not enough accounts\");\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n owner: getNextAccount(),\n agentMint: getNextAccount(),\n ata: getNextAccount(),\n tokenProgram: getNextAccount(),\n },\n data: getLinkEvmAddressInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n addDecoderSizePrefix,\n addEncoderSizePrefix,\n combineCodec,\n fixDecoderSize,\n fixEncoderSize,\n getArrayDecoder,\n getArrayEncoder,\n getBooleanDecoder,\n getBooleanEncoder,\n getBytesDecoder,\n getBytesEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getProgramDerivedAddress,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getUtf8Decoder,\n getUtf8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n type WritableSignerAccount,\n} from \"@solana/kit\";\nimport { SATI_PROGRAM_ADDRESS } from \"../programs\";\nimport { getAccountMetaFactory, type ResolvedAccount } from \"../shared\";\nimport {\n getMetadataEntryDecoder,\n getMetadataEntryEncoder,\n type MetadataEntry,\n type MetadataEntryArgs,\n} from \"../types\";\n\nexport const REGISTER_AGENT_DISCRIMINATOR = new Uint8Array([\n 135, 157, 66, 195, 2, 113, 175, 30,\n]);\n\nexport function getRegisterAgentDiscriminatorBytes() {\n return fixEncoderSize(getBytesEncoder(), 8).encode(\n REGISTER_AGENT_DISCRIMINATOR,\n );\n}\n\nexport type RegisterAgentInstruction<\n TProgram extends string = typeof SATI_PROGRAM_ADDRESS,\n TAccountPayer extends string | AccountMeta<string> = string,\n TAccountOwner extends string | AccountMeta<string> = string,\n TAccountRegistryConfig extends string | AccountMeta<string> = string,\n TAccountGroupMint extends string | AccountMeta<string> = string,\n TAccountAgentMint extends string | AccountMeta<string> = string,\n TAccountAgentTokenAccount extends string | AccountMeta<string> = string,\n TAccountToken2022Program extends string | AccountMeta<string> =\n \"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\",\n TAccountAgentIndex extends string | AccountMeta<string> = string,\n TAccountAssociatedTokenProgram extends string | AccountMeta<string> =\n \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\",\n TAccountSystemProgram extends string | AccountMeta<string> =\n \"11111111111111111111111111111111\",\n TRemainingAccounts extends readonly AccountMeta<string>[] = [],\n> = Instruction<TProgram> &\n InstructionWithData<ReadonlyUint8Array> &\n InstructionWithAccounts<\n [\n TAccountPayer extends string\n ? WritableSignerAccount<TAccountPayer> &\n AccountSignerMeta<TAccountPayer>\n : TAccountPayer,\n TAccountOwner extends string\n ? ReadonlyAccount<TAccountOwner>\n : TAccountOwner,\n TAccountRegistryConfig extends string\n ? WritableAccount<TAccountRegistryConfig>\n : TAccountRegistryConfig,\n TAccountGroupMint extends string\n ? WritableAccount<TAccountGroupMint>\n : TAccountGroupMint,\n TAccountAgentMint extends string\n ? WritableSignerAccount<TAccountAgentMint> &\n AccountSignerMeta<TAccountAgentMint>\n : TAccountAgentMint,\n TAccountAgentTokenAccount extends string\n ? WritableAccount<TAccountAgentTokenAccount>\n : TAccountAgentTokenAccount,\n TAccountToken2022Program extends string\n ? ReadonlyAccount<TAccountToken2022Program>\n : TAccountToken2022Program,\n TAccountAgentIndex extends string\n ? WritableAccount<TAccountAgentIndex>\n : TAccountAgentIndex,\n TAccountAssociatedTokenProgram extends string\n ? ReadonlyAccount<TAccountAssociatedTokenProgram>\n : TAccountAssociatedTokenProgram,\n TAccountSystemProgram extends string\n ? ReadonlyAccount<TAccountSystemProgram>\n : TAccountSystemProgram,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type RegisterAgentInstructionData = {\n discriminator: ReadonlyUint8Array;\n name: string;\n symbol: string;\n uri: string;\n additionalMetadata: Option<Array<MetadataEntry>>;\n nonTransferable: boolean;\n};\n\nexport type RegisterAgentInstructionDataArgs = {\n name: string;\n symbol: string;\n uri: string;\n additionalMetadata: OptionOrNullable<Array<MetadataEntryArgs>>;\n nonTransferable: boolean;\n};\n\nexport function getRegisterAgentInstructionDataEncoder(): Encoder<RegisterAgentInstructionDataArgs> {\n return transformEncoder(\n getStructEncoder([\n [\"discriminator\", fixEncoderSize(getBytesEncoder(), 8)],\n [\"name\", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n [\"symbol\", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n [\"uri\", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n [\n \"additionalMetadata\",\n getOptionEncoder(getArrayEncoder(getMetadataEntryEncoder())),\n ],\n [\"nonTransferable\", getBooleanEncoder()],\n ]),\n (value) => ({ ...value, discriminator: REGISTER_AGENT_DISCRIMINATOR }),\n );\n}\n\nexport function getRegisterAgentInstructionDataDecoder(): Decoder<RegisterAgentInstructionData> {\n return getStructDecoder([\n [\"discriminator\", fixDecoderSize(getBytesDecoder(), 8)],\n [\"name\", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n [\"symbol\", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n [\"uri\", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n [\n \"additionalMetadata\",\n getOptionDecoder(getArrayDecoder(getMetadataEntryDecoder())),\n ],\n [\"nonTransferable\", getBooleanDecoder()],\n ]);\n}\n\nexport function getRegisterAgentInstructionDataCodec(): Codec<\n RegisterAgentInstructionDataArgs,\n RegisterAgentInstructionData\n> {\n return combineCodec(\n getRegisterAgentInstructionDataEncoder(),\n getRegisterAgentInstructionDataDecoder(),\n );\n}\n\nexport type RegisterAgentAsyncInput<\n TAccountPayer extends string = string,\n TAccountOwner extends string = string,\n TAccountRegistryConfig extends string = string,\n TAccountGroupMint extends string = string,\n TAccountAgentMint extends string = string,\n TAccountAgentTokenAccount extends string = string,\n TAccountToken2022Program extends string = string,\n TAccountAgentIndex extends string = string,\n TAccountAssociatedTokenProgram extends string = string,\n TAccountSystemProgram extends string = string,\n> = {\n /** Pays for account creation */\n payer: TransactionSigner<TAccountPayer>;\n /** Agent NFT owner (default: payer) */\n owner: Address<TAccountOwner>;\n /** Registry configuration */\n registryConfig?: Address<TAccountRegistryConfig>;\n /** TokenGroup mint (for membership) */\n groupMint: Address<TAccountGroupMint>;\n /** New agent NFT mint (randomly generated keypair) */\n agentMint: TransactionSigner<TAccountAgentMint>;\n /** Owner's ATA for agent NFT */\n agentTokenAccount: Address<TAccountAgentTokenAccount>;\n token2022Program?: Address<TAccountToken2022Program>;\n /**\n * Agent index PDA for enumeration by member_number\n * NOTE: Uses (current_count + 1) which equals the new total_agents after increment\n */\n agentIndex: Address<TAccountAgentIndex>;\n associatedTokenProgram?: Address<TAccountAssociatedTokenProgram>;\n systemProgram?: Address<TAccountSystemProgram>;\n name: RegisterAgentInstructionDataArgs[\"name\"];\n symbol: RegisterAgentInstructionDataArgs[\"symbol\"];\n uri: RegisterAgentInstructionDataArgs[\"uri\"];\n additionalMetadata: RegisterAgentInstructionDataArgs[\"additionalMetadata\"];\n nonTransferable: RegisterAgentInstructionDataArgs[\"nonTransferable\"];\n};\n\nexport async function getRegisterAgentInstructionAsync<\n TAccountPayer extends string,\n TAccountOwner extends string,\n TAccountRegistryConfig extends string,\n TAccountGroupMint extends string,\n TAccountAgentMint extends string,\n TAccountAgentTokenAccount extends string,\n TAccountToken2022Program extends string,\n TAccountAgentIndex extends string,\n TAccountAssociatedTokenProgram extends string,\n TAccountSystemProgram extends string,\n TProgramAddress extends Address = typeof SATI_PROGRAM_ADDRESS,\n>(\n input: RegisterAgentAsyncInput<\n TAccountPayer,\n TAccountOwner,\n TAccountRegistryConfig,\n TAccountGroupMint,\n TAccountAgentMint,\n TAccountAgentTokenAccount,\n TAccountToken2022Program,\n TAccountAgentIndex,\n TAccountAssociatedTokenProgram,\n TAccountSystemProgram\n >,\n config?: { programAddress?: TProgramAddress },\n): Promise<\n RegisterAgentInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountOwner,\n TAccountRegistryConfig,\n TAccountGroupMint,\n TAccountAgentMint,\n TAccountAgentTokenAccount,\n TAccountToken2022Program,\n TAccountAgentIndex,\n TAccountAssociatedTokenProgram,\n TAccountSystemProgram\n >\n> {\n // Program address.\n const programAddress = config?.programAddress ?? SATI_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n registryConfig: { value: input.registryConfig ?? null, isWritable: true },\n groupMint: { value: input.groupMint ?? null, isWritable: true },\n agentMint: { value: input.agentMint ?? null, isWritable: true },\n agentTokenAccount: {\n value: input.agentTokenAccount ?? null,\n isWritable: true,\n },\n token2022Program: {\n value: input.token2022Program ?? null,\n isWritable: false,\n },\n agentIndex: { value: input.agentIndex ?? null, isWritable: true },\n associatedTokenProgram: {\n value: input.associatedTokenProgram ?? null,\n isWritable: false,\n },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.registryConfig.value) {\n accounts.registryConfig.value = await getProgramDerivedAddress({\n programAddress,\n seeds: [\n getBytesEncoder().encode(\n new Uint8Array([114, 101, 103, 105, 115, 116, 114, 121]),\n ),\n ],\n });\n }\n if (!accounts.token2022Program.value) {\n accounts.token2022Program.value =\n \"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\" as Address<\"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\">;\n }\n if (!accounts.associatedTokenProgram.value) {\n accounts.associatedTokenProgram.value =\n \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\" as Address<\"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\">;\n }\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n \"11111111111111111111111111111111\" as Address<\"11111111111111111111111111111111\">;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, \"programId\");\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.owner),\n getAccountMeta(accounts.registryConfig),\n getAccountMeta(accounts.groupMint),\n getAccountMeta(accounts.agentMint),\n getAccountMeta(accounts.agentTokenAccount),\n getAccountMeta(accounts.token2022Program),\n getAccountMeta(accounts.agentIndex),\n getAccountMeta(accounts.associatedTokenProgram),\n getAccountMeta(accounts.systemProgram),\n ],\n data: getRegisterAgentInstructionDataEncoder().encode(\n args as RegisterAgentInstructionDataArgs,\n ),\n programAddress,\n } as RegisterAgentInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountOwner,\n TAccountRegistryConfig,\n TAccountGroupMint,\n TAccountAgentMint,\n TAccountAgentTokenAccount,\n TAccountToken2022Program,\n TAccountAgentIndex,\n TAccountAssociatedTokenProgram,\n TAccountSystemProgram\n >);\n}\n\nexport type RegisterAgentInput<\n TAccountPayer extends string = string,\n TAccountOwner extends string = string,\n TAccountRegistryConfig extends string = string,\n TAccountGroupMint extends string = string,\n TAccountAgentMint extends string = string,\n TAccountAgentTokenAccount extends string = string,\n TAccountToken2022Program extends string = string,\n TAccountAgentIndex extends string = string,\n TAccountAssociatedTokenProgram extends string = string,\n TAccountSystemProgram extends string = string,\n> = {\n /** Pays for account creation */\n payer: TransactionSigner<TAccountPayer>;\n /** Agent NFT owner (default: payer) */\n owner: Address<TAccountOwner>;\n /** Registry configuration */\n registryConfig: Address<TAccountRegistryConfig>;\n /** TokenGroup mint (for membership) */\n groupMint: Address<TAccountGroupMint>;\n /** New agent NFT mint (randomly generated keypair) */\n agentMint: TransactionSigner<TAccountAgentMint>;\n /** Owner's ATA for agent NFT */\n agentTokenAccount: Address<TAccountAgentTokenAccount>;\n token2022Program?: Address<TAccountToken2022Program>;\n /**\n * Agent index PDA for enumeration by member_number\n * NOTE: Uses (current_count + 1) which equals the new total_agents after increment\n */\n agentIndex: Address<TAccountAgentIndex>;\n associatedTokenProgram?: Address<TAccountAssociatedTokenProgram>;\n systemProgram?: Address<TAccountSystemProgram>;\n name: RegisterAgentInstructionDataArgs[\"name\"];\n symbol: RegisterAgentInstructionDataArgs[\"symbol\"];\n uri: RegisterAgentInstructionDataArgs[\"uri\"];\n additionalMetadata: RegisterAgentInstructionDataArgs[\"additionalMetadata\"];\n nonTransferable: RegisterAgentInstructionDataArgs[\"nonTransferable\"];\n};\n\nexport function getRegisterAgentInstruction<\n TAccountPayer extends string,\n TAccountOwner extends string,\n TAccountRegistryConfig extends string,\n TAccountGroupMint extends string,\n TAccountAgentMint extends string,\n TAccountAgentTokenAccount extends string,\n TAccountToken2022Program extends string,\n TAccountAgentIndex extends string,\n TAccountAssociatedTokenProgram extends string,\n TAccountSystemProgram extends string,\n TProgramAddress extends Address = typeof SATI_PROGRAM_ADDRESS,\n>(\n input: RegisterAgentInput<\n TAccountPayer,\n TAccountOwner,\n TAccountRegistryConfig,\n TAccountGroupMint,\n TAccountAgentMint,\n TAccountAgentTokenAccount,\n TAccountToken2022Program,\n TAccountAgentIndex,\n TAccountAssociatedTokenProgram,\n TAccountSystemProgram\n >,\n config?: { programAddress?: TProgramAddress },\n): RegisterAgentInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountOwner,\n TAccountRegistryConfig,\n TAccountGroupMint,\n TAccountAgentMint,\n TAccountAgentTokenAccount,\n TAccountToken2022Program,\n TAccountAgentIndex,\n TAccountAssociatedTokenProgram,\n TAccountSystemProgram\n> {\n // Program address.\n const programAddress = config?.programAddress ?? SATI_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n owner: { value: input.owner ?? null, isWritable: false },\n registryConfig: { value: input.registryConfig ?? null, isWritable: true },\n groupMint: { value: input.groupMint ?? null, isWritable: true },\n agentMint: { value: input.agentMint ?? null, isWritable: true },\n agentTokenAccount: {\n value: input.agentTokenAccount ?? null,\n isWritable: true,\n },\n token2022Program: {\n value: input.token2022Program ?? null,\n isWritable: false,\n },\n agentIndex: { value: input.agentIndex ?? null, isWritable: true },\n associatedTokenProgram: {\n value: input.associatedTokenProgram ?? null,\n isWritable: false,\n },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.token2022Program.value) {\n accounts.token2022Program.value =\n \"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\" as Address<\"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\">;\n }\n if (!accounts.associatedTokenProgram.value) {\n accounts.associatedTokenProgram.value =\n \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\" as Address<\"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\">;\n }\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n \"11111111111111111111111111111111\" as Address<\"11111111111111111111111111111111\">;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, \"programId\");\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.owner),\n getAccountMeta(accounts.registryConfig),\n getAccountMeta(accounts.groupMint),\n getAccountMeta(accounts.agentMint),\n getAccountMeta(accounts.agentTokenAccount),\n getAccountMeta(accounts.token2022Program),\n getAccountMeta(accounts.agentIndex),\n getAccountMeta(accounts.associatedTokenProgram),\n getAccountMeta(accounts.systemProgram),\n ],\n data: getRegisterAgentInstructionDataEncoder().encode(\n args as RegisterAgentInstructionDataArgs,\n ),\n programAddress,\n } as RegisterAgentInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountOwner,\n TAccountRegistryConfig,\n TAccountGroupMint,\n TAccountAgentMint,\n TAccountAgentTokenAccount,\n TAccountToken2022Program,\n TAccountAgentIndex,\n TAccountAssociatedTokenProgram,\n TAccountSystemProgram\n >);\n}\n\nexport type ParsedRegisterAgentInstruction<\n TProgram extends string = typeof SATI_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address<TProgram>;\n accounts: {\n /** Pays for account creation */\n payer: TAccountMetas[0];\n /** Agent NFT owner (default: payer) */\n owner: TAccountMetas[1];\n /** Registry configuration */\n registryConfig: TAccountMetas[2];\n /** TokenGroup mint (for membership) */\n groupMint: TAccountMetas[3];\n /** New agent NFT mint (randomly generated keypair) */\n agentMint: TAccountMetas[4];\n /** Owner's ATA for agent NFT */\n agentTokenAccount: TAccountMetas[5];\n token2022Program: TAccountMetas[6];\n /**\n * Agent index PDA for enumeration by member_number\n * NOTE: Uses (current_count + 1) which equals the new total_agents after increment\n */\n agentIndex: TAccountMetas[7];\n associatedTokenProgram: TAccountMetas[8];\n systemProgram: TAccountMetas[9];\n };\n data: RegisterAgentInstructionData;\n};\n\nexport function parseRegisterAgentInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction<TProgram> &\n InstructionWithAccounts<TAccountMetas> &\n InstructionWithData<ReadonlyUint8Array>,\n): ParsedRegisterAgentInstruction<TProgram, TAccountMetas> {\n if (instruction.accounts.length < 10) {\n // TODO: Coded error.\n throw new Error(\"Not enough accounts\");\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n payer: getNextAccount(),\n owner: getNextAccount(),\n registryConfig: getNextAccount(),\n groupMint: getNextAccount(),\n agentMint: getNextAccount(),\n agentTokenAccount: getNextAccount(),\n token2022Program: getNextAccount(),\n agentIndex: getNextAccount(),\n associatedTokenProgram: getNextAccount(),\n systemProgram: getNextAccount(),\n },\n data: getRegisterAgentInstructionDataDecoder().decode(instruction.data),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n addDecoderSizePrefix,\n addEncoderSizePrefix,\n combineCodec,\n fixDecoderSize,\n fixEncoderSize,\n getAddressDecoder,\n getAddressEncoder,\n getBooleanDecoder,\n getBooleanEncoder,\n getBytesDecoder,\n getBytesEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getProgramDerivedAddress,\n getStructDecoder,\n getStructEncoder,\n getU32Decoder,\n getU32Encoder,\n getUtf8Decoder,\n getUtf8Encoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlyAccount,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n type WritableSignerAccount,\n} from \"@solana/kit\";\nimport { SATI_PROGRAM_ADDRESS } from \"../programs\";\nimport {\n expectSome,\n getAccountMetaFactory,\n type ResolvedAccount,\n} from \"../shared\";\nimport {\n getSignatureModeDecoder,\n getSignatureModeEncoder,\n getStorageTypeDecoder,\n getStorageTypeEncoder,\n type SignatureMode,\n type SignatureModeArgs,\n type StorageType,\n type StorageTypeArgs,\n} from \"../types\";\n\nexport const REGISTER_SCHEMA_CONFIG_DISCRIMINATOR = new Uint8Array([\n 21, 131, 188, 124, 189, 202, 70, 210,\n]);\n\nexport function getRegisterSchemaConfigDiscriminatorBytes() {\n return fixEncoderSize(getBytesEncoder(), 8).encode(\n REGISTER_SCHEMA_CONFIG_DISCRIMINATOR,\n );\n}\n\nexport type RegisterSchemaConfigInstruction<\n TProgram extends string = typeof SATI_PROGRAM_ADDRESS,\n TAccountPayer extends string | AccountMeta<string> = string,\n TAccountRegistryConfig extends string | AccountMeta<string> = string,\n TAccountAuthority extends string | AccountMeta<string> = string,\n TAccountSchemaConfig extends string | AccountMeta<string> = string,\n TAccountSystemProgram extends string | AccountMeta<string> =\n \"11111111111111111111111111111111\",\n TRemainingAccounts extends readonly AccountMeta<string>[] = [],\n> = Instruction<TProgram> &\n InstructionWithData<ReadonlyUint8Array> &\n InstructionWithAccounts<\n [\n TAccountPayer extends string\n ? WritableSignerAccount<TAccountPayer> &\n AccountSignerMeta<TAccountPayer>\n : TAccountPayer,\n TAccountRegistryConfig extends string\n ? ReadonlyAccount<TAccountRegistryConfig>\n : TAccountRegistryConfig,\n TAccountAuthority extends string\n ? ReadonlySignerAccount<TAccountAuthority> &\n AccountSignerMeta<TAccountAuthority>\n : TAccountAuthority,\n TAccountSchemaConfig extends string\n ? WritableAccount<TAccountSchemaConfig>\n : TAccountSchemaConfig,\n TAccountSystemProgram extends string\n ? ReadonlyAccount<TAccountSystemProgram>\n : TAccountSystemProgram,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type RegisterSchemaConfigInstructionData = {\n discriminator: ReadonlyUint8Array;\n sasSchema: Address;\n signatureMode: SignatureMode;\n storageType: StorageType;\n delegationSchema: Option<Address>;\n closeable: boolean;\n name: string;\n};\n\nexport type RegisterSchemaConfigInstructionDataArgs = {\n sasSchema: Address;\n signatureMode: SignatureModeArgs;\n storageType: StorageTypeArgs;\n delegationSchema: OptionOrNullable<Address>;\n closeable: boolean;\n name: string;\n};\n\nexport function getRegisterSchemaConfigInstructionDataEncoder(): Encoder<RegisterSchemaConfigInstructionDataArgs> {\n return transformEncoder(\n getStructEncoder([\n [\"discriminator\", fixEncoderSize(getBytesEncoder(), 8)],\n [\"sasSchema\", getAddressEncoder()],\n [\"signatureMode\", getSignatureModeEncoder()],\n [\"storageType\", getStorageTypeEncoder()],\n [\"delegationSchema\", getOptionEncoder(getAddressEncoder())],\n [\"closeable\", getBooleanEncoder()],\n [\"name\", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],\n ]),\n (value) => ({\n ...value,\n discriminator: REGISTER_SCHEMA_CONFIG_DISCRIMINATOR,\n }),\n );\n}\n\nexport function getRegisterSchemaConfigInstructionDataDecoder(): Decoder<RegisterSchemaConfigInstructionData> {\n return getStructDecoder([\n [\"discriminator\", fixDecoderSize(getBytesDecoder(), 8)],\n [\"sasSchema\", getAddressDecoder()],\n [\"signatureMode\", getSignatureModeDecoder()],\n [\"storageType\", getStorageTypeDecoder()],\n [\"delegationSchema\", getOptionDecoder(getAddressDecoder())],\n [\"closeable\", getBooleanDecoder()],\n [\"name\", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],\n ]);\n}\n\nexport function getRegisterSchemaConfigInstructionDataCodec(): Codec<\n RegisterSchemaConfigInstructionDataArgs,\n RegisterSchemaConfigInstructionData\n> {\n return combineCodec(\n getRegisterSchemaConfigInstructionDataEncoder(),\n getRegisterSchemaConfigInstructionDataDecoder(),\n );\n}\n\nexport type RegisterSchemaConfigAsyncInput<\n TAccountPayer extends string = string,\n TAccountRegistryConfig extends string = string,\n TAccountAuthority extends string = string,\n TAccountSchemaConfig extends string = string,\n TAccountSystemProgram extends string = string,\n> = {\n /** Payer for account creation */\n payer: TransactionSigner<TAccountPayer>;\n /** Registry config - validates authority and checks mutability */\n registryConfig?: Address<TAccountRegistryConfig>;\n /** Authority that can register schemas (validated against registry_config) */\n authority: TransactionSigner<TAccountAuthority>;\n /** Schema config PDA to be created */\n schemaConfig?: Address<TAccountSchemaConfig>;\n systemProgram?: Address<TAccountSystemProgram>;\n sasSchema: RegisterSchemaConfigInstructionDataArgs[\"sasSchema\"];\n signatureMode: RegisterSchemaConfigInstructionDataArgs[\"signatureMode\"];\n storageType: RegisterSchemaConfigInstructionDataArgs[\"storageType\"];\n delegationSchema: RegisterSchemaConfigInstructionDataArgs[\"delegationSchema\"];\n closeable: RegisterSchemaConfigInstructionDataArgs[\"closeable\"];\n name: RegisterSchemaConfigInstructionDataArgs[\"name\"];\n};\n\nexport async function getRegisterSchemaConfigInstructionAsync<\n TAccountPayer extends string,\n TAccountRegistryConfig extends string,\n TAccountAuthority extends string,\n TAccountSchemaConfig extends string,\n TAccountSystemProgram extends string,\n TProgramAddress extends Address = typeof SATI_PROGRAM_ADDRESS,\n>(\n input: RegisterSchemaConfigAsyncInput<\n TAccountPayer,\n TAccountRegistryConfig,\n TAccountAuthority,\n TAccountSchemaConfig,\n TAccountSystemProgram\n >,\n config?: { programAddress?: TProgramAddress },\n): Promise<\n RegisterSchemaConfigInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountRegistryConfig,\n TAccountAuthority,\n TAccountSchemaConfig,\n TAccountSystemProgram\n >\n> {\n // Program address.\n const programAddress = config?.programAddress ?? SATI_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n registryConfig: { value: input.registryConfig ?? null, isWritable: false },\n authority: { value: input.authority ?? null, isWritable: false },\n schemaConfig: { value: input.schemaConfig ?? null, isWritable: true },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.registryConfig.value) {\n accounts.registryConfig.value = await getProgramDerivedAddress({\n programAddress,\n seeds: [\n getBytesEncoder().encode(\n new Uint8Array([114, 101, 103, 105, 115, 116, 114, 121]),\n ),\n ],\n });\n }\n if (!accounts.schemaConfig.value) {\n accounts.schemaConfig.value = await getProgramDerivedAddress({\n programAddress,\n seeds: [\n getBytesEncoder().encode(\n new Uint8Array([\n 115, 99, 104, 101, 109, 97, 95, 99, 111, 110, 102, 105, 103,\n ]),\n ),\n getAddressEncoder().encode(expectSome(args.sasSchema)),\n ],\n });\n }\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n \"11111111111111111111111111111111\" as Address<\"11111111111111111111111111111111\">;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, \"programId\");\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.registryConfig),\n getAccountMeta(accounts.authority),\n getAccountMeta(accounts.schemaConfig),\n getAccountMeta(accounts.systemProgram),\n ],\n data: getRegisterSchemaConfigInstructionDataEncoder().encode(\n args as RegisterSchemaConfigInstructionDataArgs,\n ),\n programAddress,\n } as RegisterSchemaConfigInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountRegistryConfig,\n TAccountAuthority,\n TAccountSchemaConfig,\n TAccountSystemProgram\n >);\n}\n\nexport type RegisterSchemaConfigInput<\n TAccountPayer extends string = string,\n TAccountRegistryConfig extends string = string,\n TAccountAuthority extends string = string,\n TAccountSchemaConfig extends string = string,\n TAccountSystemProgram extends string = string,\n> = {\n /** Payer for account creation */\n payer: TransactionSigner<TAccountPayer>;\n /** Registry config - validates authority and checks mutability */\n registryConfig: Address<TAccountRegistryConfig>;\n /** Authority that can register schemas (validated against registry_config) */\n authority: TransactionSigner<TAccountAuthority>;\n /** Schema config PDA to be created */\n schemaConfig: Address<TAccountSchemaConfig>;\n systemProgram?: Address<TAccountSystemProgram>;\n sasSchema: RegisterSchemaConfigInstructionDataArgs[\"sasSchema\"];\n signatureMode: RegisterSchemaConfigInstructionDataArgs[\"signatureMode\"];\n storageType: RegisterSchemaConfigInstructionDataArgs[\"storageType\"];\n delegationSchema: RegisterSchemaConfigInstructionDataArgs[\"delegationSchema\"];\n closeable: RegisterSchemaConfigInstructionDataArgs[\"closeable\"];\n name: RegisterSchemaConfigInstructionDataArgs[\"name\"];\n};\n\nexport function getRegisterSchemaConfigInstruction<\n TAccountPayer extends string,\n TAccountRegistryConfig extends string,\n TAccountAuthority extends string,\n TAccountSchemaConfig extends string,\n TAccountSystemProgram extends string,\n TProgramAddress extends Address = typeof SATI_PROGRAM_ADDRESS,\n>(\n input: RegisterSchemaConfigInput<\n TAccountPayer,\n TAccountRegistryConfig,\n TAccountAuthority,\n TAccountSchemaConfig,\n TAccountSystemProgram\n >,\n config?: { programAddress?: TProgramAddress },\n): RegisterSchemaConfigInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountRegistryConfig,\n TAccountAuthority,\n TAccountSchemaConfig,\n TAccountSystemProgram\n> {\n // Program address.\n const programAddress = config?.programAddress ?? SATI_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n payer: { value: input.payer ?? null, isWritable: true },\n registryConfig: { value: input.registryConfig ?? null, isWritable: false },\n authority: { value: input.authority ?? null, isWritable: false },\n schemaConfig: { value: input.schemaConfig ?? null, isWritable: true },\n systemProgram: { value: input.systemProgram ?? null, isWritable: false },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.systemProgram.value) {\n accounts.systemProgram.value =\n \"11111111111111111111111111111111\" as Address<\"11111111111111111111111111111111\">;\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, \"programId\");\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.payer),\n getAccountMeta(accounts.registryConfig),\n getAccountMeta(accounts.authority),\n getAccountMeta(accounts.schemaConfig),\n getAccountMeta(accounts.systemProgram),\n ],\n data: getRegisterSchemaConfigInstructionDataEncoder().encode(\n args as RegisterSchemaConfigInstructionDataArgs,\n ),\n programAddress,\n } as RegisterSchemaConfigInstruction<\n TProgramAddress,\n TAccountPayer,\n TAccountRegistryConfig,\n TAccountAuthority,\n TAccountSchemaConfig,\n TAccountSystemProgram\n >);\n}\n\nexport type ParsedRegisterSchemaConfigInstruction<\n TProgram extends string = typeof SATI_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address<TProgram>;\n accounts: {\n /** Payer for account creation */\n payer: TAccountMetas[0];\n /** Registry config - validates authority and checks mutability */\n registryConfig: TAccountMetas[1];\n /** Authority that can register schemas (validated against registry_config) */\n authority: TAccountMetas[2];\n /** Schema config PDA to be created */\n schemaConfig: TAccountMetas[3];\n systemProgram: TAccountMetas[4];\n };\n data: RegisterSchemaConfigInstructionData;\n};\n\nexport function parseRegisterSchemaConfigInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction<TProgram> &\n InstructionWithAccounts<TAccountMetas> &\n InstructionWithData<ReadonlyUint8Array>,\n): ParsedRegisterSchemaConfigInstruction<TProgram, TAccountMetas> {\n if (instruction.accounts.length < 5) {\n // TODO: Coded error.\n throw new Error(\"Not enough accounts\");\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: {\n payer: getNextAccount(),\n registryConfig: getNextAccount(),\n authority: getNextAccount(),\n schemaConfig: getNextAccount(),\n systemProgram: getNextAccount(),\n },\n data: getRegisterSchemaConfigInstructionDataDecoder().decode(\n instruction.data,\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n combineCodec,\n fixDecoderSize,\n fixEncoderSize,\n getAddressDecoder,\n getAddressEncoder,\n getBytesDecoder,\n getBytesEncoder,\n getOptionDecoder,\n getOptionEncoder,\n getProgramDerivedAddress,\n getStructDecoder,\n getStructEncoder,\n transformEncoder,\n type AccountMeta,\n type AccountSignerMeta,\n type Address,\n type Codec,\n type Decoder,\n type Encoder,\n type Instruction,\n type InstructionWithAccounts,\n type InstructionWithData,\n type Option,\n type OptionOrNullable,\n type ReadonlySignerAccount,\n type ReadonlyUint8Array,\n type TransactionSigner,\n type WritableAccount,\n} from \"@solana/kit\";\nimport { SATI_PROGRAM_ADDRESS } from \"../programs\";\nimport { getAccountMetaFactory, type ResolvedAccount } from \"../shared\";\n\nexport const UPDATE_REGISTRY_AUTHORITY_DISCRIMINATOR = new Uint8Array([\n 36, 103, 15, 149, 117, 134, 26, 41,\n]);\n\nexport function getUpdateRegistryAuthorityDiscriminatorBytes() {\n return fixEncoderSize(getBytesEncoder(), 8).encode(\n UPDATE_REGISTRY_AUTHORITY_DISCRIMINATOR,\n );\n}\n\nexport type UpdateRegistryAuthorityInstruction<\n TProgram extends string = typeof SATI_PROGRAM_ADDRESS,\n TAccountAuthority extends string | AccountMeta<string> = string,\n TAccountRegistryConfig extends string | AccountMeta<string> = string,\n TRemainingAccounts extends readonly AccountMeta<string>[] = [],\n> = Instruction<TProgram> &\n InstructionWithData<ReadonlyUint8Array> &\n InstructionWithAccounts<\n [\n TAccountAuthority extends string\n ? ReadonlySignerAccount<TAccountAuthority> &\n AccountSignerMeta<TAccountAuthority>\n : TAccountAuthority,\n TAccountRegistryConfig extends string\n ? WritableAccount<TAccountRegistryConfig>\n : TAccountRegistryConfig,\n ...TRemainingAccounts,\n ]\n >;\n\nexport type UpdateRegistryAuthorityInstructionData = {\n discriminator: ReadonlyUint8Array;\n newAuthority: Option<Address>;\n};\n\nexport type UpdateRegistryAuthorityInstructionDataArgs = {\n newAuthority: OptionOrNullable<Address>;\n};\n\nexport function getUpdateRegistryAuthorityInstructionDataEncoder(): Encoder<UpdateRegistryAuthorityInstructionDataArgs> {\n return transformEncoder(\n getStructEncoder([\n [\"discriminator\", fixEncoderSize(getBytesEncoder(), 8)],\n [\"newAuthority\", getOptionEncoder(getAddressEncoder())],\n ]),\n (value) => ({\n ...value,\n discriminator: UPDATE_REGISTRY_AUTHORITY_DISCRIMINATOR,\n }),\n );\n}\n\nexport function getUpdateRegistryAuthorityInstructionDataDecoder(): Decoder<UpdateRegistryAuthorityInstructionData> {\n return getStructDecoder([\n [\"discriminator\", fixDecoderSize(getBytesDecoder(), 8)],\n [\"newAuthority\", getOptionDecoder(getAddressDecoder())],\n ]);\n}\n\nexport function getUpdateRegistryAuthorityInstructionDataCodec(): Codec<\n UpdateRegistryAuthorityInstructionDataArgs,\n UpdateRegistryAuthorityInstructionData\n> {\n return combineCodec(\n getUpdateRegistryAuthorityInstructionDataEncoder(),\n getUpdateRegistryAuthorityInstructionDataDecoder(),\n );\n}\n\nexport type UpdateRegistryAuthorityAsyncInput<\n TAccountAuthority extends string = string,\n TAccountRegistryConfig extends string = string,\n> = {\n /** Current authority (must sign) */\n authority: TransactionSigner<TAccountAuthority>;\n /** Registry configuration */\n registryConfig?: Address<TAccountRegistryConfig>;\n newAuthority: UpdateRegistryAuthorityInstructionDataArgs[\"newAuthority\"];\n};\n\nexport async function getUpdateRegistryAuthorityInstructionAsync<\n TAccountAuthority extends string,\n TAccountRegistryConfig extends string,\n TProgramAddress extends Address = typeof SATI_PROGRAM_ADDRESS,\n>(\n input: UpdateRegistryAuthorityAsyncInput<\n TAccountAuthority,\n TAccountRegistryConfig\n >,\n config?: { programAddress?: TProgramAddress },\n): Promise<\n UpdateRegistryAuthorityInstruction<\n TProgramAddress,\n TAccountAuthority,\n TAccountRegistryConfig\n >\n> {\n // Program address.\n const programAddress = config?.programAddress ?? SATI_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n authority: { value: input.authority ?? null, isWritable: false },\n registryConfig: { value: input.registryConfig ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n // Resolve default values.\n if (!accounts.registryConfig.value) {\n accounts.registryConfig.value = await getProgramDerivedAddress({\n programAddress,\n seeds: [\n getBytesEncoder().encode(\n new Uint8Array([114, 101, 103, 105, 115, 116, 114, 121]),\n ),\n ],\n });\n }\n\n const getAccountMeta = getAccountMetaFactory(programAddress, \"programId\");\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.authority),\n getAccountMeta(accounts.registryConfig),\n ],\n data: getUpdateRegistryAuthorityInstructionDataEncoder().encode(\n args as UpdateRegistryAuthorityInstructionDataArgs,\n ),\n programAddress,\n } as UpdateRegistryAuthorityInstruction<\n TProgramAddress,\n TAccountAuthority,\n TAccountRegistryConfig\n >);\n}\n\nexport type UpdateRegistryAuthorityInput<\n TAccountAuthority extends string = string,\n TAccountRegistryConfig extends string = string,\n> = {\n /** Current authority (must sign) */\n authority: TransactionSigner<TAccountAuthority>;\n /** Registry configuration */\n registryConfig: Address<TAccountRegistryConfig>;\n newAuthority: UpdateRegistryAuthorityInstructionDataArgs[\"newAuthority\"];\n};\n\nexport function getUpdateRegistryAuthorityInstruction<\n TAccountAuthority extends string,\n TAccountRegistryConfig extends string,\n TProgramAddress extends Address = typeof SATI_PROGRAM_ADDRESS,\n>(\n input: UpdateRegistryAuthorityInput<\n TAccountAuthority,\n TAccountRegistryConfig\n >,\n config?: { programAddress?: TProgramAddress },\n): UpdateRegistryAuthorityInstruction<\n TProgramAddress,\n TAccountAuthority,\n TAccountRegistryConfig\n> {\n // Program address.\n const programAddress = config?.programAddress ?? SATI_PROGRAM_ADDRESS;\n\n // Original accounts.\n const originalAccounts = {\n authority: { value: input.authority ?? null, isWritable: false },\n registryConfig: { value: input.registryConfig ?? null, isWritable: true },\n };\n const accounts = originalAccounts as Record<\n keyof typeof originalAccounts,\n ResolvedAccount\n >;\n\n // Original args.\n const args = { ...input };\n\n const getAccountMeta = getAccountMetaFactory(programAddress, \"programId\");\n return Object.freeze({\n accounts: [\n getAccountMeta(accounts.authority),\n getAccountMeta(accounts.registryConfig),\n ],\n data: getUpdateRegistryAuthorityInstructionDataEncoder().encode(\n args as UpdateRegistryAuthorityInstructionDataArgs,\n ),\n programAddress,\n } as UpdateRegistryAuthorityInstruction<\n TProgramAddress,\n TAccountAuthority,\n TAccountRegistryConfig\n >);\n}\n\nexport type ParsedUpdateRegistryAuthorityInstruction<\n TProgram extends string = typeof SATI_PROGRAM_ADDRESS,\n TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],\n> = {\n programAddress: Address<TProgram>;\n accounts: {\n /** Current authority (must sign) */\n authority: TAccountMetas[0];\n /** Registry configuration */\n registryConfig: TAccountMetas[1];\n };\n data: UpdateRegistryAuthorityInstructionData;\n};\n\nexport function parseUpdateRegistryAuthorityInstruction<\n TProgram extends string,\n TAccountMetas extends readonly AccountMeta[],\n>(\n instruction: Instruction<TProgram> &\n InstructionWithAccounts<TAccountMetas> &\n InstructionWithData<ReadonlyUint8Array>,\n): ParsedUpdateRegistryAuthorityInstruction<TProgram, TAccountMetas> {\n if (instruction.accounts.length < 2) {\n // TODO: Coded error.\n throw new Error(\"Not enough accounts\");\n }\n let accountIndex = 0;\n const getNextAccount = () => {\n const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;\n accountIndex += 1;\n return accountMeta;\n };\n return {\n programAddress: instruction.programAddress,\n accounts: { authority: getNextAccount(), registryConfig: getNextAccount() },\n data: getUpdateRegistryAuthorityInstructionDataDecoder().decode(\n instruction.data,\n ),\n };\n}\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n containsBytes,\n fixEncoderSize,\n getBytesEncoder,\n type Address,\n type ReadonlyUint8Array,\n} from \"@solana/kit\";\nimport {\n type ParsedCloseCompressedAttestationInstruction,\n type ParsedCloseRegularAttestationInstruction,\n type ParsedCreateCompressedAttestationInstruction,\n type ParsedCreateRegularAttestationInstruction,\n type ParsedInitializeInstruction,\n type ParsedLinkEvmAddressInstruction,\n type ParsedRegisterAgentInstruction,\n type ParsedRegisterSchemaConfigInstruction,\n type ParsedUpdateRegistryAuthorityInstruction,\n} from \"../instructions\";\n\nexport const SATI_PROGRAM_ADDRESS =\n \"satiRkxEiwZ51cv8PRu8UMzuaqeaNU9jABo6oAFMsLe\" as Address<\"satiRkxEiwZ51cv8PRu8UMzuaqeaNU9jABo6oAFMsLe\">;\n\nexport enum SatiAccount {\n AgentIndex,\n RegistryConfig,\n SchemaConfig,\n}\n\nexport function identifySatiAccount(\n account: { data: ReadonlyUint8Array } | ReadonlyUint8Array,\n): SatiAccount {\n const data = \"data\" in account ? account.data : account;\n if (\n containsBytes(\n data,\n fixEncoderSize(getBytesEncoder(), 8).encode(\n new Uint8Array([241, 154, 35, 103, 180, 141, 49, 179]),\n ),\n 0,\n )\n ) {\n return SatiAccount.AgentIndex;\n }\n if (\n containsBytes(\n data,\n fixEncoderSize(getBytesEncoder(), 8).encode(\n new Uint8Array([23, 118, 10, 246, 173, 231, 243, 156]),\n ),\n 0,\n )\n ) {\n return SatiAccount.RegistryConfig;\n }\n if (\n containsBytes(\n data,\n fixEncoderSize(getBytesEncoder(), 8).encode(\n new Uint8Array([211, 19, 105, 220, 186, 61, 182, 47]),\n ),\n 0,\n )\n ) {\n return SatiAccount.SchemaConfig;\n }\n throw new Error(\n \"The provided account could not be identified as a sati account.\",\n );\n}\n\nexport enum SatiInstruction {\n CloseCompressedAttestation,\n CloseRegularAttestation,\n CreateCompressedAttestation,\n CreateRegularAttestation,\n Initialize,\n LinkEvmAddress,\n RegisterAgent,\n RegisterSchemaConfig,\n UpdateRegistryAuthority,\n}\n\nexport function identifySatiInstruction(\n instruction: { data: ReadonlyUint8Array } | ReadonlyUint8Array,\n): SatiInstruction {\n const data = \"data\" in instruction ? instruction.data : instruction;\n if (\n containsBytes(\n data,\n fixEncoderSize(getBytesEncoder(), 8).encode(\n new Uint8Array([80, 7, 19, 206, 138, 158, 92, 24]),\n ),\n 0,\n )\n ) {\n return SatiInstruction.CloseCompressedAttestation;\n }\n if (\n containsBytes(\n data,\n fixEncoderSize(getBytesEncoder(), 8).encode(\n new Uint8Array([243, 10, 146, 163, 169, 75, 64, 28]),\n ),\n 0,\n )\n ) {\n return SatiInstruction.CloseRegularAttestation;\n }\n if (\n containsBytes(\n data,\n fixEncoderSize(getBytesEncoder(), 8).encode(\n new Uint8Array([204, 251, 61, 109, 25, 133, 237, 77]),\n ),\n 0,\n )\n ) {\n return SatiInstruction.CreateCompressedAttestation;\n }\n if (\n containsBytes(\n data,\n fixEncoderSize(getBytesEncoder(), 8).encode(\n new Uint8Array([69, 6, 28, 228, 190, 240, 142, 79]),\n ),\n 0,\n )\n ) {\n return SatiInstruction.CreateRegularAttestation;\n }\n if (\n containsBytes(\n data,\n fixEncoderSize(getBytesEncoder(), 8).encode(\n new Uint8Array([175, 175, 109, 31, 13, 152, 155, 237]),\n ),\n 0,\n )\n ) {\n return SatiInstruction.Initialize;\n }\n if (\n containsBytes(\n data,\n fixEncoderSize(getBytesEncoder(), 8).encode(\n new Uint8Array([156, 75, 131, 178, 64, 110, 236, 64]),\n ),\n 0,\n )\n ) {\n return SatiInstruction.LinkEvmAddress;\n }\n if (\n containsBytes(\n data,\n fixEncoderSize(getBytesEncoder(), 8).encode(\n new Uint8Array([135, 157, 66, 195, 2, 113, 175, 30]),\n ),\n 0,\n )\n ) {\n return SatiInstruction.RegisterAgent;\n }\n if (\n containsBytes(\n data,\n fixEncoderSize(getBytesEncoder(), 8).encode(\n new Uint8Array([21, 131, 188, 124, 189, 202, 70, 210]),\n ),\n 0,\n )\n ) {\n return SatiInstruction.RegisterSchemaConfig;\n }\n if (\n containsBytes(\n data,\n fixEncoderSize(getBytesEncoder(), 8).encode(\n new Uint8Array([36, 103, 15, 149, 117, 134, 26, 41]),\n ),\n 0,\n )\n ) {\n return SatiInstruction.UpdateRegistryAuthority;\n }\n throw new Error(\n \"The provided instruction could not be identified as a sati instruction.\",\n );\n}\n\nexport type ParsedSatiInstruction<\n TProgram extends string = \"satiRkxEiwZ51cv8PRu8UMzuaqeaNU9jABo6oAFMsLe\",\n> =\n | ({\n instructionType: SatiInstruction.CloseCompressedAttestation;\n } & ParsedCloseCompressedAttestationInstruction<TProgram>)\n | ({\n instructionType: SatiInstruction.CloseRegularAttestation;\n } & ParsedCloseRegularAttestationInstruction<TProgram>)\n | ({\n instructionType: SatiInstruction.CreateCompressedAttestation;\n } & ParsedCreateCompressedAttestationInstruction<TProgram>)\n | ({\n instructionType: SatiInstruction.CreateRegularAttestation;\n } & ParsedCreateRegularAttestationInstruction<TProgram>)\n | ({\n instructionType: SatiInstruction.Initialize;\n } & ParsedInitializeInstruction<TProgram>)\n | ({\n instructionType: SatiInstruction.LinkEvmAddress;\n } & ParsedLinkEvmAddressInstruction<TProgram>)\n | ({\n instructionType: SatiInstruction.RegisterAgent;\n } & ParsedRegisterAgentInstruction<TProgram>)\n | ({\n instructionType: SatiInstruction.RegisterSchemaConfig;\n } & ParsedRegisterSchemaConfigInstruction<TProgram>)\n | ({\n instructionType: SatiInstruction.UpdateRegistryAuthority;\n } & ParsedUpdateRegistryAuthorityInstruction<TProgram>);\n","/**\n * This code was AUTOGENERATED using the Codama library.\n * Please DO NOT EDIT THIS FILE, instead use visitors\n * to add features, then rerun Codama to update it.\n *\n * @see https://github.com/codama-idl/codama\n */\n\nimport {\n isProgramError,\n type Address,\n type SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM,\n type SolanaError,\n} from \"@solana/kit\";\nimport { SATI_PROGRAM_ADDRESS } from \"../programs\";\n\n/** InvalidGroupMint: Invalid group mint - must be owned by Token-2022 with TokenGroup extension */\nexport const SATI_ERROR__INVALID_GROUP_MINT = 0x1770; // 6000\n/** InvalidAuthority: Invalid authority */\nexport const SATI_ERROR__INVALID_AUTHORITY = 0x1771; // 6001\n/** ImmutableAuthority: Authority is immutable (renounced) */\nexport const SATI_ERROR__IMMUTABLE_AUTHORITY = 0x1772; // 6002\n/** NameTooLong: Name too long (max 32 bytes) */\nexport const SATI_ERROR__NAME_TOO_LONG = 0x1773; // 6003\n/** SymbolTooLong: Symbol too long (max 10 bytes) */\nexport const SATI_ERROR__SYMBOL_TOO_LONG = 0x1774; // 6004\n/** UriTooLong: URI too long (max 200 bytes) */\nexport const SATI_ERROR__URI_TOO_LONG = 0x1775; // 6005\n/** TooManyMetadataEntries: Too many metadata entries (max 10) */\nexport const SATI_ERROR__TOO_MANY_METADATA_ENTRIES = 0x1776; // 6006\n/** MetadataKeyTooLong: Metadata key too long (max 32 bytes) */\nexport const SATI_ERROR__METADATA_KEY_TOO_LONG = 0x1777; // 6007\n/** MetadataValueTooLong: Metadata value too long (max 200 bytes) */\nexport const SATI_ERROR__METADATA_VALUE_TOO_LONG = 0x1778; // 6008\n/** Overflow: Arithmetic overflow */\nexport const SATI_ERROR__OVERFLOW = 0x1779; // 6009\n/** MintAuthorityNotRenounced: Failed to renounce mint authority - supply guarantee violated */\nexport const SATI_ERROR__MINT_AUTHORITY_NOT_RENOUNCED = 0x177a; // 6010\n/** SchemaConfigNotFound: Schema config not found */\nexport const SATI_ERROR__SCHEMA_CONFIG_NOT_FOUND = 0x177b; // 6011\n/** InvalidSignatureCount: Invalid signature count for signature mode */\nexport const SATI_ERROR__INVALID_SIGNATURE_COUNT = 0x177c; // 6012\n/** InvalidSignature: Invalid Ed25519 signature */\nexport const SATI_ERROR__INVALID_SIGNATURE = 0x177d; // 6013\n/** StorageTypeNotSupported: Storage type not supported for this operation */\nexport const SATI_ERROR__STORAGE_TYPE_NOT_SUPPORTED = 0x177e; // 6014\n/** StorageTypeMismatch: Storage type mismatch */\nexport const SATI_ERROR__STORAGE_TYPE_MISMATCH = 0x177f; // 6015\n/** AttestationDataTooSmall: Attestation data too small (minimum 130 bytes for universal base layout) */\nexport const SATI_ERROR__ATTESTATION_DATA_TOO_SMALL = 0x1780; // 6016\n/** AttestationDataTooLarge: Attestation data exceeds maximum size */\nexport const SATI_ERROR__ATTESTATION_DATA_TOO_LARGE = 0x1781; // 6017\n/** ContentTooLarge: Content exceeds maximum size (512 bytes) */\nexport const SATI_ERROR__CONTENT_TOO_LARGE = 0x1782; // 6018\n/** SignatureMismatch: Signature pubkey does not match expected account */\nexport const SATI_ERROR__SIGNATURE_MISMATCH = 0x1783; // 6019\n/** SelfAttestationNotAllowed: Self-attestation is not allowed (agent_mint == counterparty) */\nexport const SATI_ERROR__SELF_ATTESTATION_NOT_ALLOWED = 0x1784; // 6020\n/** AgentAtaMintMismatch: Agent ATA mint does not match agent_mint in attestation data */\nexport const SATI_ERROR__AGENT_ATA_MINT_MISMATCH = 0x1785; // 6021\n/** AgentAtaEmpty: Agent ATA is empty - signer does not own the agent NFT */\nexport const SATI_ERROR__AGENT_ATA_EMPTY = 0x1786; // 6022\n/** AgentAtaRequired: Agent ATA required for this signature mode */\nexport const SATI_ERROR__AGENT_ATA_REQUIRED = 0x1787; // 6023\n/** UnauthorizedClose: Unauthorized to close attestation */\nexport const SATI_ERROR__UNAUTHORIZED_CLOSE = 0x1788; // 6024\n/** AttestationNotCloseable: Attestation cannot be closed for this schema */\nexport const SATI_ERROR__ATTESTATION_NOT_CLOSEABLE = 0x1789; // 6025\n/** InvalidOutcome: Invalid outcome value (must be 0, 1, or 2) */\nexport const SATI_ERROR__INVALID_OUTCOME = 0x178a; // 6026\n/** InvalidContentType: Invalid content type (must be 0-15) */\nexport const SATI_ERROR__INVALID_CONTENT_TYPE = 0x178b; // 6027\n/** UnsupportedLayoutVersion: Unsupported layout version */\nexport const SATI_ERROR__UNSUPPORTED_LAYOUT_VERSION = 0x178c; // 6028\n/** LightCpiInvocationFailed: Light Protocol CPI invocation failed */\nexport const SATI_ERROR__LIGHT_CPI_INVOCATION_FAILED = 0x178d; // 6029\n/** InvalidEd25519Instruction: Invalid Ed25519 instruction format */\nexport const SATI_ERROR__INVALID_ED25519_INSTRUCTION = 0x178e; // 6030\n/** MissingSignatures: Missing required Ed25519 signatures in transaction */\nexport const SATI_ERROR__MISSING_SIGNATURES = 0x178f; // 6031\n/** MessageMismatch: Message hash mismatch - signature was for different data */\nexport const SATI_ERROR__MESSAGE_MISMATCH = 0x1790; // 6032\n/** InvalidInstructionsSysvar: Invalid instructions sysvar */\nexport const SATI_ERROR__INVALID_INSTRUCTIONS_SYSVAR = 0x1791; // 6033\n/** DuplicateSigners: Duplicate signers not allowed for dual signature mode */\nexport const SATI_ERROR__DUPLICATE_SIGNERS = 0x1792; // 6034\n/** Ed25519InstructionNotFound: No Ed25519 instruction found in transaction */\nexport const SATI_ERROR__ED25519_INSTRUCTION_NOT_FOUND = 0x1793; // 6035\n/** AgentSignatureNotFound: Agent's Ed25519 signature not found (message content mismatch) */\nexport const SATI_ERROR__AGENT_SIGNATURE_NOT_FOUND = 0x1794; // 6036\n/** CounterpartySignatureNotFound: Counterparty's Ed25519 signature not found (message content mismatch) */\nexport const SATI_ERROR__COUNTERPARTY_SIGNATURE_NOT_FOUND = 0x1795; // 6037\n/** AgentMintAccountMismatch: Agent mint account does not match agent_mint in attestation data */\nexport const SATI_ERROR__AGENT_MINT_ACCOUNT_MISMATCH = 0x1796; // 6038\n/** OwnerOnly: Schema requires owner signature but delegate attempted */\nexport const SATI_ERROR__OWNER_ONLY = 0x1797; // 6039\n/** DelegationAttestationRequired: Delegate signed but no delegation attestation provided */\nexport const SATI_ERROR__DELEGATION_ATTESTATION_REQUIRED = 0x1798; // 6040\n/** InvalidDelegationPDA: Delegation attestation PDA doesn't match expected derivation */\nexport const SATI_ERROR__INVALID_DELEGATION_P_D_A = 0x1799; // 6041\n/** DelegateMismatch: Delegation attestation delegate doesn't match signer */\nexport const SATI_ERROR__DELEGATE_MISMATCH = 0x179a; // 6042\n/** AgentMintMismatch: Delegation attestation agent doesn't match target agent */\nexport const SATI_ERROR__AGENT_MINT_MISMATCH = 0x179b; // 6043\n/** DelegationOwnerMismatch: Delegation was created by different owner (NFT was transferred) */\nexport const SATI_ERROR__DELEGATION_OWNER_MISMATCH = 0x179c; // 6044\n/** DelegationExpired: Delegation attestation has expired */\nexport const SATI_ERROR__DELEGATION_EXPIRED = 0x179d; // 6045\n/** InvalidSecp256k1Signature: Invalid secp256k1 signature */\nexport const SATI_ERROR__INVALID_SECP256K1_SIGNATURE = 0x179e; // 6046\n/** Secp256k1RecoveryFailed: Secp256k1 recovery failed */\nexport const SATI_ERROR__SECP256K1_RECOVERY_FAILED = 0x179f; // 6047\n/** EvmAddressMismatch: EVM address mismatch - recovered address does not match expected */\nexport const SATI_ERROR__EVM_ADDRESS_MISMATCH = 0x17a0; // 6048\n/** InvalidEvmAddressRecovery: Failed to extract EVM address from secp256k1 key recovery */\nexport const SATI_ERROR__INVALID_EVM_ADDRESS_RECOVERY = 0x17a1; // 6049\n\nexport type SatiError =\n | typeof SATI_ERROR__AGENT_ATA_EMPTY\n | typeof SATI_ERROR__AGENT_ATA_MINT_MISMATCH\n | typeof SATI_ERROR__AGENT_ATA_REQUIRED\n | typeof SATI_ERROR__AGENT_MINT_ACCOUNT_MISMATCH\n | typeof SATI_ERROR__AGENT_MINT_MISMATCH\n | typeof SATI_ERROR__AGENT_SIGNATURE_NOT_FOUND\n | typeof SATI_ERROR__ATTESTATION_DATA_TOO_LARGE\n | typeof SATI_ERROR__ATTESTATION_DATA_TOO_SMALL\n | typeof SATI_ERROR__ATTESTATION_NOT_CLOSEABLE\n | typeof SATI_ERROR__CONTENT_TOO_LARGE\n | typeof SATI_ERROR__COUNTERPARTY_SIGNATURE_NOT_FOUND\n | typeof SATI_ERROR__DELEGATE_MISMATCH\n | typeof SATI_ERROR__DELEGATION_ATTESTATION_REQUIRED\n | typeof SATI_ERROR__DELEGATION_EXPIRED\n | typeof SATI_ERROR__DELEGATION_OWNER_MISMATCH\n | typeof SATI_ERROR__DUPLICATE_SIGNERS\n | typeof SATI_ERROR__ED25519_INSTRUCTION_NOT_FOUND\n | typeof SATI_ERROR__EVM_ADDRESS_MISMATCH\n | typeof SATI_ERROR__IMMUTABLE_AUTHORITY\n | typeof SATI_ERROR__INVALID_AUTHORITY\n | typeof SATI_ERROR__INVALID_CONTENT_TYPE\n | typeof SATI_ERROR__INVALID_DELEGATION_P_D_A\n | typeof SATI_ERROR__INVALID_ED25519_INSTRUCTION\n | typeof SATI_ERROR__INVALID_EVM_ADDRESS_RECOVERY\n | typeof SATI_ERROR__INVALID_GROUP_MINT\n | typeof SATI_ERROR__INVALID_INSTRUCTIONS_SYSVAR\n | typeof SATI_ERROR__INVALID_OUTCOME\n | typeof SATI_ERROR__INVALID_SECP256K1_SIGNATURE\n | typeof SATI_ERROR__INVALID_SIGNATURE\n | typeof SATI_ERROR__INVALID_SIGNATURE_COUNT\n | typeof SATI_ERROR__LIGHT_CPI_INVOCATION_FAILED\n | typeof SATI_ERROR__MESSAGE_MISMATCH\n | typeof SATI_ERROR__METADATA_KEY_TOO_LONG\n | typeof SATI_ERROR__METADATA_VALUE_TOO_LONG\n | typeof SATI_ERROR__MINT_AUTHORITY_NOT_RENOUNCED\n | typeof SATI_ERROR__MISSING_SIGNATURES\n | typeof SATI_ERROR__NAME_TOO_LONG\n | typeof SATI_ERROR__OVERFLOW\n | typeof SATI_ERROR__OWNER_ONLY\n | typeof SATI_ERROR__SCHEMA_CONFIG_NOT_FOUND\n | typeof SATI_ERROR__SECP256K1_RECOVERY_FAILED\n | typeof SATI_ERROR__SELF_ATTESTATION_NOT_ALLOWED\n | typeof SATI_ERROR__SIGNATURE_MISMATCH\n | typeof SATI_ERROR__STORAGE_TYPE_MISMATCH\n | typeof SATI_ERROR__STORAGE_TYPE_NOT_SUPPORTED\n | typeof SATI_ERROR__SYMBOL_TOO_LONG\n | typeof SATI_ERROR__TOO_MANY_METADATA_ENTRIES\n | typeof SATI_ERROR__UNAUTHORIZED_CLOSE\n | typeof SATI_ERROR__UNSUPPORTED_LAYOUT_VERSION\n | typeof SATI_ERROR__URI_TOO_LONG;\n\nlet satiErrorMessages: Record<SatiError, string> | undefined;\nif (process.env.NODE_ENV !== \"production\") {\n satiErrorMessages = {\n [SATI_ERROR__AGENT_ATA_EMPTY]: `Agent ATA is empty - signer does not own the agent NFT`,\n [SATI_ERROR__AGENT_ATA_MINT_MISMATCH]: `Agent ATA mint does not match agent_mint in attestation data`,\n [SATI_ERROR__AGENT_ATA_REQUIRED]: `Agent ATA required for this signature mode`,\n [SATI_ERROR__AGENT_MINT_ACCOUNT_MISMATCH]: `Agent mint account does not match agent_mint in attestation data`,\n [SATI_ERROR__AGENT_MINT_MISMATCH]: `Delegation attestation agent doesn't match target agent`,\n [SATI_ERROR__AGENT_SIGNATURE_NOT_FOUND]: `Agent's Ed25519 signature not found (message content mismatch)`,\n [SATI_ERROR__ATTESTATION_DATA_TOO_LARGE]: `Attestation data exceeds maximum size`,\n [SATI_ERROR__ATTESTATION_DATA_TOO_SMALL]: `Attestation data too small (minimum 130 bytes for universal base layout)`,\n [SATI_ERROR__ATTESTATION_NOT_CLOSEABLE]: `Attestation cannot be closed for this schema`,\n [SATI_ERROR__CONTENT_TOO_LARGE]: `Content exceeds maximum size (512 bytes)`,\n [SATI_ERROR__COUNTERPARTY_SIGNATURE_NOT_FOUND]: `Counterparty's Ed25519 signature not found (message content mismatch)`,\n [SATI_ERROR__DELEGATE_MISMATCH]: `Delegation attestation delegate doesn't match signer`,\n [SATI_ERROR__DELEGATION_ATTESTATION_REQUIRED]: `Delegate signed but no delegation attestation provided`,\n [SATI_ERROR__DELEGATION_EXPIRED]: `Delegation attestation has expired`,\n [SATI_ERROR__DELEGATION_OWNER_MISMATCH]: `Delegation was created by different owner (NFT was transferred)`,\n [SATI_ERROR__DUPLICATE_SIGNERS]: `Duplicate signers not allowed for dual signature mode`,\n [SATI_ERROR__ED25519_INSTRUCTION_NOT_FOUND]: `No Ed25519 instruction found in transaction`,\n [SATI_ERROR__EVM_ADDRESS_MISMATCH]: `EVM address mismatch - recovered address does not match expected`,\n [SATI_ERROR__IMMUTABLE_AUTHORITY]: `Authority is immutable (renounced)`,\n [SATI_ERROR__INVALID_AUTHORITY]: `Invalid authority`,\n [SATI_ERROR__INVALID_CONTENT_TYPE]: `Invalid content type (must be 0-15)`,\n [SATI_ERROR__INVALID_DELEGATION_P_D_A]: `Delegation attestation PDA doesn't match expected derivation`,\n [SATI_ERROR__INVALID_ED25519_INSTRUCTION]: `Invalid Ed25519 instruction format`,\n [SATI_ERROR__INVALID_EVM_ADDRESS_RECOVERY]: `Failed to extract EVM address from secp256k1 key recovery`,\n [SATI_ERROR__INVALID_GROUP_MINT]: `Invalid group mint - must be owned by Token-2022 with TokenGroup extension`,\n [SATI_ERROR__INVALID_INSTRUCTIONS_SYSVAR]: `Invalid instructions sysvar`,\n [SATI_ERROR__INVALID_OUTCOME]: `Invalid outcome value (must be 0, 1, or 2)`,\n [SATI_ERROR__INVALID_SECP256K1_SIGNATURE]: `Invalid secp256k1 signature`,\n [SATI_ERROR__INVALID_SIGNATURE]: `Invalid Ed25519 signature`,\n [SATI_ERROR__INVALID_SIGNATURE_COUNT]: `Invalid signature count for signature mode`,\n [SATI_ERROR__LIGHT_CPI_INVOCATION_FAILED]: `Light Protocol CPI invocation failed`,\n [SATI_ERROR__MESSAGE_MISMATCH]: `Message hash mismatch - signature was for different data`,\n [SATI_ERROR__METADATA_KEY_TOO_LONG]: `Metadata key too long (max 32 bytes)`,\n [SATI_ERROR__METADATA_VALUE_TOO_LONG]: `Metadata value too long (max 200 bytes)`,\n [SATI_ERROR__MINT_AUTHORITY_NOT_RENOUNCED]: `Failed to renounce mint authority - supply guarantee violated`,\n [SATI_ERROR__MISSING_SIGNATURES]: `Missing required Ed25519 signatures in transaction`,\n [SATI_ERROR__NAME_TOO_LONG]: `Name too long (max 32 bytes)`,\n [SATI_ERROR__OVERFLOW]: `Arithmetic overflow`,\n [SATI_ERROR__OWNER_ONLY]: `Schema requires owner signature but delegate attempted`,\n [SATI_ERROR__SCHEMA_CONFIG_NOT_FOUND]: `Schema config not found`,\n [SATI_ERROR__SECP256K1_RECOVERY_FAILED]: `Secp256k1 recovery failed`,\n [SATI_ERROR__SELF_ATTESTATION_NOT_ALLOWED]: `Self-attestation is not allowed (agent_mint == counterparty)`,\n [SATI_ERROR__SIGNATURE_MISMATCH]: `Signature pubkey does not match expected account`,\n [SATI_ERROR__STORAGE_TYPE_MISMATCH]: `Storage type mismatch`,\n [SATI_ERROR__STORAGE_TYPE_NOT_SUPPORTED]: `Storage type not supported for this operation`,\n [SATI_ERROR__SYMBOL_TOO_LONG]: `Symbol too long (max 10 bytes)`,\n [SATI_ERROR__TOO_MANY_METADATA_ENTRIES]: `Too many metadata entries (max 10)`,\n [SATI_ERROR__UNAUTHORIZED_CLOSE]: `Unauthorized to close attestation`,\n [SATI_ERROR__UNSUPPORTED_LAYOUT_VERSION]: `Unsupported layout version`,\n [SATI_ERROR__URI_TOO_LONG]: `URI too long (max 200 bytes)`,\n };\n}\n\nexport function getSatiErrorMessage(code: SatiError): string {\n if (process.env.NODE_ENV !== \"production\") {\n return (satiErrorMessages as Record<SatiError, string>)[code];\n }\n\n return \"Error message not available in production bundles.\";\n}\n\nexport function isSatiError<TProgramErrorCode extends SatiError>(\n error: unknown,\n transactionMessage: {\n instructions: Record<number, { programAddress: Address }>;\n },\n code?: TProgramErrorCode,\n): error is SolanaError<typeof SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM> &\n Readonly<{ context: Readonly<{ code: TProgramErrorCode }> }> {\n return isProgramError<TProgramErrorCode>(\n error,\n transactionMessage,\n SATI_PROGRAM_ADDRESS,\n code,\n );\n}\n","/**\n * SATI Schema Definitions\n *\n * Data layouts for SATI attestations with fixed offsets for memcmp filtering.\n * These schemas must match the on-chain program's expectations.\n *\n * ## Universal Base Layout (131 bytes)\n * All schemas share identical first 131 bytes:\n * - layout_version: 0 (1 byte) - version of the universal base layout\n * - task_ref: 1-32 (32 bytes) - CAIP-220 tx hash or task ID\n * - agent_mint: 33-64 (32 bytes) - agent's MINT ADDRESS (Token-2022 NFT identity)\n * - counterparty: 65-96 (32 bytes) - counterparty address\n * - outcome: 97 (1 byte) - 0=Negative, 1=Neutral, 2=Positive\n * - data_hash: 98-129 (32 bytes) - blind commitment (zeros for CounterpartySigned)\n * - content_type: 130 (1 byte) - format: 0=None, 1=JSON, 2=UTF-8, etc.\n * - content: 131+ (variable) - up to 512 bytes\n *\n * ## Identity Model\n * - `agentMint` = agent's **MINT ADDRESS** (stable Token-2022 NFT identity)\n * - NOT an Associated Token Account (ATA) - the ATA is used separately for ownership verification\n * - On-chain verification checks ATA ownership for authorization\n */\n\nimport { getAddressEncoder, getAddressDecoder, type Address } from \"@solana/kit\";\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Maximum content size in bytes (theoretical storage limit) */\nexport const MAX_CONTENT_SIZE = 512;\n\n/**\n * Maximum content size for DualSignature mode attestations.\n *\n * Due to Solana's 1232-byte transaction limit, content in DualSignature\n * mode is severely constrained because:\n * 1. Content appears TWICE: in data blob AND in SIWS message\n * 2. Agent ATA (32 bytes) can never be in lookup table (user-specific)\n * 3. SIWS message overhead is ~194 bytes\n *\n * Use ContentType.IPFS or ContentType.Arweave for larger content.\n */\nexport const MAX_DUAL_SIGNATURE_CONTENT_SIZE = 70;\n\n/**\n * Maximum content size for SingleSignature mode attestations.\n *\n * SingleSignature mode has more headroom because:\n * 1. Content appears only once (no SIWS message duplication)\n * 2. No counterparty signature verification overhead\n */\nexport const MAX_SINGLE_SIGNATURE_CONTENT_SIZE = 240;\n\n/**\n * Minimum universal base layout size.\n * All schemas share: layout_version(1) + task_ref(32) + agent_mint(32) + counterparty(32) +\n * outcome(1) + data_hash(32) + content_type(1) = 131 bytes.\n */\nexport const MIN_BASE_LAYOUT_SIZE = 131;\n\n/**\n * Current layout version for universal base layout.\n * Increment when making breaking changes to the layout structure.\n */\nexport const CURRENT_LAYOUT_VERSION = 1;\n\n/**\n * SAS attestation header size in bytes.\n *\n * Layout: discriminator(1) + nonce(32) + credential(32) + schema(32) + data_len(4)\n * Total: 101 bytes\n *\n * Must match programs/sati/src/constants.rs SAS_HEADER_SIZE\n */\nexport const SAS_HEADER_SIZE = 101;\n\n/**\n * Offset of the `data_len` field within the SAS attestation account.\n *\n * Layout: discriminator(1) + nonce(32) + credential(32) + schema(32) = 97\n * The 4-byte LE `data_len` field starts at offset 97.\n */\nexport const SAS_DATA_LEN_OFFSET = 97;\n\n// ============================================================================\n// Universal Offsets\n// ============================================================================\n\n/**\n * Universal base layout offsets (all schemas share these).\n * Must match programs/sati/src/constants.rs offsets module.\n */\nexport const OFFSETS = {\n /** Layout version (1 byte) - version of the universal base layout */\n LAYOUT_VERSION: 0,\n /** CAIP-220 tx hash or task identifier (32 bytes) */\n TASK_REF: 1,\n /** Agent's mint address (32 bytes) - Token-2022 NFT identity */\n AGENT_MINT: 33,\n /** Counterparty address (32 bytes) */\n COUNTERPARTY: 65,\n /** Outcome: 0=Negative, 1=Neutral, 2=Positive */\n OUTCOME: 97,\n /** Blind commitment hash (32 bytes, zeros for CounterpartySigned) */\n DATA_HASH: 98,\n /** Content format: 0=None, 1=JSON, 2=UTF-8, etc. */\n CONTENT_TYPE: 130,\n /** Variable-length content (up to 512 bytes) */\n CONTENT: 131,\n} as const;\n\n/** Alias for backward compatibility */\nexport const BASE_OFFSETS = OFFSETS;\n\n// ============================================================================\n// Enums\n// ============================================================================\n\n/**\n * Data type discriminator for attestations\n */\nexport enum DataType {\n /** Feedback attestation (compressed storage) */\n Feedback = 0,\n /** Validation attestation (compressed storage) */\n Validation = 1,\n /** ReputationScoreV3 attestation (regular storage) */\n ReputationScore = 2,\n}\n\n/**\n * Feedback outcome values (ERC-8004 compatible)\n *\n * Maps to ERC-8004 outcome semantics:\n * - Negative(0) - unfavorable interaction\n * - Neutral(1) - default / no strong signal\n * - Positive(2) - favorable interaction\n */\nexport enum Outcome {\n /** Negative feedback */\n Negative = 0,\n /** Neutral feedback (default) */\n Neutral = 1,\n /** Positive feedback */\n Positive = 2,\n}\n\n/**\n * Content type determines how to interpret the variable-length content field\n */\nexport enum ContentType {\n /** Empty content - just use outcome */\n None = 0,\n /** Inline JSON object */\n JSON = 1,\n /** Plain UTF-8 text */\n UTF8 = 2,\n /** IPFS CIDv1 (~36 bytes) */\n IPFS = 3,\n /** Arweave transaction ID (32 bytes) */\n Arweave = 4,\n /** End-to-end encrypted (X25519-XChaCha20-Poly1305) */\n Encrypted = 5,\n}\n\n/**\n * Validation method types.\n *\n * Note: In universal layout, this is stored in JSON content,\n * not as a binary field. Kept for SDK convenience.\n */\nexport enum ValidationType {\n /** Trusted Execution Environment */\n TEE = 0,\n /** Zero-knowledge Machine Learning */\n ZKML = 1,\n /** Re-execution verification */\n Reexecution = 2,\n /** Consensus-based validation */\n Consensus = 3,\n}\n\n// Import from generated (Codama is the source of truth)\n// Already exported via \"export * from ./generated\" in index.ts\nimport { SignatureMode } from \"./generated/types/signatureMode\";\nimport { StorageType } from \"./generated/types/storageType\";\n\n// ============================================================================\n// Base Layout\n// ============================================================================\n\n/**\n * Universal base data layout (131 bytes)\n *\n * All schemas MUST use this layout. Program parses this for signature\n * verification; schema-specific data goes in JSON content.\n */\nexport interface BaseLayout {\n /** CAIP-220 tx hash or arbitrary task ID (32 bytes) */\n taskRef: Uint8Array;\n /** Agent's mint address (32 bytes) - Token-2022 NFT identity */\n agentMint: Address;\n /** Counterparty address (32 bytes) */\n counterparty: Address;\n /** Outcome: 0=Negative, 1=Neutral, 2=Positive */\n outcome: Outcome;\n /** Hash of request/interaction data for agent's blind signature (32 bytes) */\n dataHash: Uint8Array;\n /** Content format (see ContentType) */\n contentType: ContentType;\n /** Variable-length content based on contentType */\n content: Uint8Array;\n}\n\n// ============================================================================\n// Feedback Schema (data_type = 0)\n// ============================================================================\n\n/**\n * Feedback schema - uses universal base layout\n *\n * Schema-specific fields (value, tags, message) go in JSON content:\n * { \"value\": 85, \"valueDecimals\": 0, \"tag1\": \"quality\", \"tag2\": \"latency\", \"m\": \"Great response!\" }\n */\nexport interface FeedbackData extends BaseLayout {}\n\n/**\n * Feedback JSON content structure (optional fields in content)\n */\nexport interface FeedbackContent {\n /** ERC-8004 signed fixed-point value */\n value?: number;\n /** Decimal places for value (0-18) */\n valueDecimals?: number;\n /** First tag dimension */\n tag1?: string;\n /** Second tag dimension */\n tag2?: string;\n /** Endpoint URI being reviewed */\n endpoint?: string;\n /** Feedback message */\n m?: string;\n}\n\n/**\n * Fixed offsets in Feedback schema (same as universal)\n */\nexport const FEEDBACK_OFFSETS = OFFSETS;\n\n/**\n * Serialize Feedback data to bytes\n */\nexport function serializeFeedback(data: FeedbackData): Uint8Array {\n return serializeUniversalLayout(data);\n}\n\n/**\n * Deserialize Feedback data from bytes\n */\nexport function deserializeFeedback(bytes: Uint8Array): FeedbackData {\n return deserializeUniversalLayout(bytes);\n}\n\n/**\n * Parse Feedback JSON content\n */\nexport function parseFeedbackContent(content: Uint8Array, contentType: ContentType): FeedbackContent | null {\n if (contentType !== ContentType.JSON || content.length === 0) {\n return null;\n }\n try {\n const text = new TextDecoder().decode(content);\n return JSON.parse(text) as FeedbackContent;\n } catch {\n return null;\n }\n}\n\n// ============================================================================\n// Validation Schema (data_type = 1)\n// ============================================================================\n\n/**\n * Validation schema - uses universal base layout\n *\n * Schema-specific fields (type, confidence) go in JSON content:\n * { \"type\": \"tee\", \"confidence\": 95, \"methodology\": \"...\" }\n */\nexport interface ValidationData extends BaseLayout {}\n\n/**\n * Validation JSON content structure (optional fields in content)\n */\nexport interface ValidationContent {\n /** Validation method: \"tee\", \"zkml\", \"reexecution\", \"consensus\" */\n type?: string;\n /** Confidence score: 0-100 */\n confidence?: number;\n /** Methodology description */\n methodology?: string;\n}\n\n/**\n * Fixed offsets in Validation schema (same as universal)\n */\nexport const VALIDATION_OFFSETS = OFFSETS;\n\n/**\n * Serialize Validation data to bytes\n */\nexport function serializeValidation(data: ValidationData): Uint8Array {\n return serializeUniversalLayout(data);\n}\n\n/**\n * Deserialize Validation data from bytes\n */\nexport function deserializeValidation(bytes: Uint8Array): ValidationData {\n return deserializeUniversalLayout(bytes);\n}\n\n/**\n * Parse Validation JSON content\n */\nexport function parseValidationContent(content: Uint8Array, contentType: ContentType): ValidationContent | null {\n if (contentType !== ContentType.JSON || content.length === 0) {\n return null;\n }\n try {\n const text = new TextDecoder().decode(content);\n return JSON.parse(text) as ValidationContent;\n } catch {\n return null;\n }\n}\n\n// ============================================================================\n// ReputationScoreV3 Schema (data_type = 2)\n// ============================================================================\n\n/**\n * ReputationScoreV3 schema - uses universal base layout (regular SAS storage)\n *\n * Provider-computed scores with direct on-chain queryability.\n * One ReputationScoreV3 per (provider, agent) pair - updates replace previous.\n *\n * Note: task_ref is deterministic: keccak256(counterparty, agent_mint)\n *\n * Schema-specific fields go in JSON content:\n * { \"score\": 85, \"methodology\": \"weighted_average\", \"feedbackCount\": 42 }\n */\nexport interface ReputationScoreData extends BaseLayout {}\n\n/**\n * ReputationScoreV3 JSON content structure (optional fields in content)\n */\nexport interface ReputationScoreContent {\n /** Normalized reputation score: 0-100 */\n score?: number;\n /** Scoring algorithm identifier (e.g., \"weighted_average\", \"bayesian\") */\n methodology?: string;\n /** Number of feedbacks analyzed */\n feedbackCount?: number;\n /** Number of validations analyzed */\n validationCount?: number;\n}\n\n/**\n * Fixed offsets in ReputationScoreV3 schema (same as universal)\n */\nexport const REPUTATION_SCORE_OFFSETS = OFFSETS;\n\n/**\n * Serialize ReputationScoreV3 data to bytes\n *\n * SAS schema uses VecU8 (type 13) for the content field, which requires\n * a 4-byte LE length prefix before the content bytes.\n *\n * Output: 131 base bytes + 4-byte LE content length + N content bytes\n */\nexport function serializeReputationScore(data: ReputationScoreData): Uint8Array {\n // Serialize base layout with empty content (131 bytes)\n const baseData = serializeUniversalLayout({ ...data, content: new Uint8Array(0) });\n\n const contentBytes = data.content.slice(0, MAX_CONTENT_SIZE);\n const contentLen = contentBytes.length;\n\n // Append VecU8: 4-byte LE length prefix + content bytes\n const buffer = new Uint8Array(baseData.length + 4 + contentLen);\n buffer.set(baseData, 0);\n new DataView(buffer.buffer).setUint32(baseData.length, contentLen, true);\n if (contentLen > 0) {\n buffer.set(contentBytes, baseData.length + 4);\n }\n return buffer;\n}\n\n/**\n * Deserialize ReputationScoreV3 data from bytes\n *\n * SAS schema uses VecU8 (type 13) for the content field. The data format is:\n * 131 base bytes + 4-byte LE content length + N content bytes.\n *\n * Reads the VecU8 length prefix to extract exact content bytes,\n * ignoring any trailing data (e.g., SAS tail bytes).\n */\nexport function deserializeReputationScore(bytes: Uint8Array): ReputationScoreData {\n const minSize = MIN_BASE_LAYOUT_SIZE + 4; // 131 base + 4 VecU8 prefix\n if (bytes.length < minSize) {\n throw new Error(`Data too small for ReputationScoreV3 (minimum ${minSize} bytes, got ${bytes.length})`);\n }\n\n // Parse base fields (layout_version through content_type, 131 bytes)\n const base = deserializeUniversalLayout(bytes.slice(0, MIN_BASE_LAYOUT_SIZE));\n\n // Read VecU8 length prefix at offset 131 (4-byte LE)\n const lenSlice = bytes.slice(MIN_BASE_LAYOUT_SIZE, MIN_BASE_LAYOUT_SIZE + 4);\n const contentLen = new DataView(lenSlice.buffer).getUint32(0, true);\n\n // Bounds check: contentLen must not exceed available bytes\n const contentStart = MIN_BASE_LAYOUT_SIZE + 4;\n const available = bytes.length - contentStart;\n if (contentLen > available) {\n throw new Error(`ReputationScoreV3 content length ${contentLen} exceeds available data (${available} bytes)`);\n }\n\n // Extract exact content bytes\n const content = bytes.slice(contentStart, contentStart + contentLen);\n\n return {\n ...base,\n content,\n };\n}\n\n/**\n * Parse ReputationScoreV3 JSON content\n */\nexport function parseReputationScoreContent(\n content: Uint8Array,\n contentType: ContentType,\n): ReputationScoreContent | null {\n if (contentType !== ContentType.JSON || content.length === 0) {\n return null;\n }\n try {\n const text = new TextDecoder().decode(content);\n return JSON.parse(text) as ReputationScoreContent;\n } catch {\n return null;\n }\n}\n\n/**\n * Validate ReputationScoreV3 JSON content structure.\n * Throws on invalid content.\n */\nexport function validateReputationScoreContent(content: ReputationScoreContent): void {\n if (content.score !== undefined) {\n if (typeof content.score !== \"number\" || content.score < 0 || content.score > 100) {\n throw new Error(\"score must be a number between 0 and 100\");\n }\n }\n if (content.methodology !== undefined && typeof content.methodology !== \"string\") {\n throw new Error(\"methodology must be a string\");\n }\n if (content.feedbackCount !== undefined) {\n if (\n typeof content.feedbackCount !== \"number\" ||\n content.feedbackCount < 0 ||\n !Number.isInteger(content.feedbackCount)\n ) {\n throw new Error(\"feedbackCount must be a non-negative integer\");\n }\n }\n if (content.validationCount !== undefined) {\n if (\n typeof content.validationCount !== \"number\" ||\n content.validationCount < 0 ||\n !Number.isInteger(content.validationCount)\n ) {\n throw new Error(\"validationCount must be a non-negative integer\");\n }\n }\n}\n\n// ============================================================================\n// Compressed Attestation Structure\n// ============================================================================\n\n/**\n * CompressedAttestation structure (Light Protocol storage)\n *\n * This represents the full compressed account structure with Light Protocol fields.\n * Public-facing fields use Address type for better API ergonomics.\n */\nexport interface CompressedAttestation {\n /** SAS schema address */\n sasSchema: Address;\n /** Agent's mint address (Token-2022 NFT identity) */\n agentMint: Address;\n /** Schema-conformant data bytes */\n data: Uint8Array;\n /** Number of signatures stored (1 or 2) */\n numSignatures: number;\n /** First signature (agent for DualSignature, counterparty for CounterpartySigned) */\n signature1: Uint8Array;\n /** Second signature (counterparty for DualSignature, zeroed for CounterpartySigned/AgentOwnerSigned) */\n signature2: Uint8Array;\n}\n\n/**\n * Fixed offsets in CompressedAttestation data for memcmp filters.\n *\n * Note: Light Protocol returns the discriminator as a separate field in the\n * response, NOT prefixed to the data bytes. The data bytes start directly\n * with the attestation fields:\n * - bytes 0-31: sasSchema (Pubkey)\n * - bytes 32-63: agentMint (Pubkey)\n * - bytes 64+: schemaData (Vec<u8>)\n */\nexport const COMPRESSED_OFFSETS = {\n /** SAS schema pubkey offset for memcmp */\n SAS_SCHEMA: 0,\n /** Agent mint address offset for memcmp */\n AGENT_MINT: 32,\n} as const;\n\n// ============================================================================\n// Schema Configuration\n// ============================================================================\n\n/**\n * Schema configuration for registered attestation types\n */\nexport interface SchemaConfig {\n /** SAS schema address */\n sasSchema: Address;\n /** Signature verification mode */\n signatureMode: SignatureMode;\n /** Storage backend type */\n storageType: StorageType;\n /**\n * Schema for delegation verification (only for AgentOwnerSigned mode).\n * If set, allows delegates (via Delegate attestations) to sign on behalf of agent owner.\n * If null, only the agent owner can sign.\n */\n delegationSchema: Address | null;\n /** Whether attestations can be closed/nullified */\n closeable: boolean;\n /** Human-readable schema name (max 32 chars) */\n name: string;\n}\n\n/**\n * Core SATI schema configurations.\n * Names are used in SIWS signing messages shown to users.\n *\n * Note: delegationSchema is null here and set at deployment time for schemas\n * that support delegation (Feedback, Validation). The Delegate schema address\n * is used to verify delegation attestations at runtime.\n */\nexport const SCHEMA_CONFIGS: Record<string, Omit<SchemaConfig, \"sasSchema\">> = {\n Feedback: {\n signatureMode: SignatureMode.DualSignature,\n storageType: StorageType.Compressed,\n delegationSchema: null, // Set at deployment to Delegate schema address\n closeable: false,\n name: \"FeedbackV1\",\n },\n FeedbackPublic: {\n signatureMode: SignatureMode.CounterpartySigned,\n storageType: StorageType.Compressed,\n delegationSchema: null, // No delegation for CounterpartySigned\n closeable: false,\n name: \"FeedbackPublicV1\",\n },\n Validation: {\n signatureMode: SignatureMode.DualSignature,\n storageType: StorageType.Compressed,\n delegationSchema: null, // Set at deployment to Delegate schema address\n closeable: false,\n name: \"ValidationV1\",\n },\n ReputationScore: {\n signatureMode: SignatureMode.CounterpartySigned,\n storageType: StorageType.Regular,\n delegationSchema: null, // Provider controls, no delegation\n closeable: true,\n name: \"ReputationScoreV3\",\n },\n Delegate: {\n signatureMode: SignatureMode.AgentOwnerSigned,\n storageType: StorageType.Regular,\n delegationSchema: null, // No delegation for delegation itself (no recursive delegation)\n closeable: true,\n name: \"DelegateV1\",\n },\n} as const;\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n// Address encoder/decoder singletons\nconst addressEncoder = getAddressEncoder();\nconst addressDecoder = getAddressDecoder();\n\n/**\n * Convert Address to 32-byte Uint8Array\n */\nexport function addressToBytes(address: Address): Uint8Array {\n return new Uint8Array(addressEncoder.encode(address));\n}\n\n/**\n * Convert 32-byte Uint8Array to Address\n */\nexport function bytesToAddress(bytes: Uint8Array): Address {\n return addressDecoder.decode(bytes);\n}\n\n/**\n * Serialize universal base layout data to bytes\n */\nexport function serializeUniversalLayout(data: BaseLayout): Uint8Array {\n const contentBytes = data.content.slice(0, MAX_CONTENT_SIZE);\n\n // Total size: 131 (base) + content\n const totalSize = MIN_BASE_LAYOUT_SIZE + contentBytes.length;\n const buffer = new Uint8Array(totalSize);\n let offset = 0;\n\n // layoutVersion (1 byte)\n buffer[offset++] = CURRENT_LAYOUT_VERSION;\n\n // taskRef (32 bytes)\n buffer.set(data.taskRef, offset);\n offset += 32;\n\n // agentMint (32 bytes)\n buffer.set(addressToBytes(data.agentMint), offset);\n offset += 32;\n\n // counterparty (32 bytes)\n buffer.set(addressToBytes(data.counterparty), offset);\n offset += 32;\n\n // outcome (1 byte)\n buffer[offset++] = data.outcome;\n\n // dataHash (32 bytes)\n buffer.set(data.dataHash, offset);\n offset += 32;\n\n // contentType (1 byte)\n buffer[offset++] = data.contentType;\n\n // content (variable, no length prefix - length derived from total size)\n buffer.set(contentBytes, offset);\n\n return buffer;\n}\n\n/**\n * Deserialize universal base layout data from bytes\n */\nexport function deserializeUniversalLayout(bytes: Uint8Array): BaseLayout {\n if (bytes.length < MIN_BASE_LAYOUT_SIZE) {\n throw new Error(`Data too small (minimum ${MIN_BASE_LAYOUT_SIZE} bytes, got ${bytes.length})`);\n }\n\n let offset = 0;\n\n // Skip layoutVersion (1 byte) - already validated on-chain\n offset += 1;\n\n // taskRef (32 bytes)\n const taskRef = bytes.slice(offset, offset + 32);\n offset += 32;\n\n // agentMint (32 bytes)\n const agentMint = bytesToAddress(bytes.slice(offset, offset + 32));\n offset += 32;\n\n // counterparty (32 bytes)\n const counterparty = bytesToAddress(bytes.slice(offset, offset + 32));\n offset += 32;\n\n // outcome (1 byte)\n const outcome = bytes[offset++] as Outcome;\n\n // dataHash (32 bytes)\n const dataHash = bytes.slice(offset, offset + 32);\n offset += 32;\n\n // contentType (1 byte)\n const contentType = bytes[offset++] as ContentType;\n\n // content (remaining bytes)\n const content = bytes.slice(offset);\n\n return {\n taskRef,\n agentMint,\n counterparty,\n outcome,\n dataHash,\n contentType,\n content,\n };\n}\n\n/**\n * Deserialize attestation data based on data type\n */\nexport function deserializeAttestationData(\n dataType: DataType,\n data: Uint8Array,\n): FeedbackData | ValidationData | ReputationScoreData {\n switch (dataType) {\n case DataType.Feedback:\n return deserializeFeedback(data);\n case DataType.Validation:\n return deserializeValidation(data);\n case DataType.ReputationScore:\n return deserializeReputationScore(data);\n default:\n throw new Error(`Unknown data type: ${dataType}`);\n }\n}\n\n/**\n * Get the outcome label string\n */\nexport function getOutcomeLabel(outcome: Outcome): string {\n switch (outcome) {\n case Outcome.Negative:\n return \"Negative\";\n case Outcome.Neutral:\n return \"Neutral\";\n case Outcome.Positive:\n return \"Positive\";\n default:\n return \"Unknown\";\n }\n}\n\n/**\n * Convert Outcome to ERC-8004 score (0-100)\n */\nexport function outcomeToScore(outcome: Outcome): number {\n switch (outcome) {\n case Outcome.Negative:\n return 0;\n case Outcome.Neutral:\n return 50;\n case Outcome.Positive:\n return 100;\n default:\n return 50;\n }\n}\n\n/**\n * Get the content type label string\n */\nexport function getContentTypeLabel(contentType: ContentType): string {\n switch (contentType) {\n case ContentType.None:\n return \"None\";\n case ContentType.JSON:\n return \"JSON\";\n case ContentType.UTF8:\n return \"UTF-8\";\n case ContentType.IPFS:\n return \"IPFS\";\n case ContentType.Arweave:\n return \"Arweave\";\n case ContentType.Encrypted:\n return \"Encrypted\";\n default:\n return \"Unknown\";\n }\n}\n\n/**\n * Create JSON content bytes from a content object\n */\nexport function createJsonContent<T>(content: T): Uint8Array {\n const json = JSON.stringify(content);\n return new TextEncoder().encode(json);\n}\n\n/**\n * Create zero-filled data hash (for CounterpartySigned/AgentOwnerSigned schemas)\n */\nexport function zeroDataHash(): Uint8Array {\n return new Uint8Array(32);\n}\n\n/**\n * Validate universal base layout\n */\nexport function validateBaseLayout(data: Uint8Array): void {\n if (data.length < MIN_BASE_LAYOUT_SIZE) {\n throw new Error(`Data too small (minimum ${MIN_BASE_LAYOUT_SIZE} bytes)`);\n }\n\n const version = data[OFFSETS.LAYOUT_VERSION];\n if (version !== CURRENT_LAYOUT_VERSION) {\n throw new Error(`Unsupported layout version: ${version} (expected ${CURRENT_LAYOUT_VERSION})`);\n }\n\n const outcome = data[OFFSETS.OUTCOME];\n if (outcome > 2) {\n throw new Error(`Invalid outcome value: ${outcome} (must be 0, 1, or 2)`);\n }\n\n const contentType = data[OFFSETS.CONTENT_TYPE];\n if (contentType > 15) {\n throw new Error(`Invalid content type: ${contentType} (must be 0-15)`);\n }\n\n const contentLen = data.length - OFFSETS.CONTENT;\n if (contentLen > MAX_CONTENT_SIZE) {\n throw new Error(`Content too large: ${contentLen} bytes (max ${MAX_CONTENT_SIZE})`);\n }\n}\n\n// ============================================================================\n// Content Size Validation\n// ============================================================================\n\n/**\n * Content size validation options\n */\nexport interface ContentSizeValidationOptions {\n /** Throw error if content exceeds limit (default: true) */\n throwOnError?: boolean;\n}\n\n/**\n * Content size validation result\n */\nexport interface ContentSizeValidationResult {\n /** Whether content size is valid */\n valid: boolean;\n /** Maximum allowed size for this mode */\n maxSize: number;\n /** Actual content size */\n actualSize: number;\n /** Error message if invalid */\n error?: string;\n}\n\n/**\n * Get maximum content size for a signature mode.\n *\n * @param signatureMode - DualSignature, CounterpartySigned, or AgentOwnerSigned\n * @returns Maximum content size in bytes\n *\n * @example\n * ```typescript\n * const maxSize = getMaxContentSize(SignatureMode.DualSignature);\n * // => 70\n * ```\n */\nexport function getMaxContentSize(signatureMode: SignatureMode): number {\n return signatureMode === SignatureMode.DualSignature\n ? MAX_DUAL_SIGNATURE_CONTENT_SIZE\n : MAX_SINGLE_SIGNATURE_CONTENT_SIZE; // CounterpartySigned and AgentOwnerSigned both use single signature\n}\n\n/**\n * Validate content size for a given signature mode.\n *\n * @param content - Content bytes to validate\n * @param signatureMode - DualSignature, CounterpartySigned, or AgentOwnerSigned\n * @param options - Validation options\n * @returns Validation result\n * @throws Error if content exceeds limit and throwOnError is true (default)\n *\n * @example\n * ```typescript\n * // Check before building transaction\n * const result = validateContentSize(myContent, SignatureMode.DualSignature, { throwOnError: false });\n * if (!result.valid) {\n * console.log(`Content too large: ${result.actualSize}/${result.maxSize} bytes`);\n * }\n *\n * // Or throw on error (default behavior)\n * validateContentSize(myContent, SignatureMode.DualSignature); // throws if too large\n * ```\n */\nexport function validateContentSize(\n content: Uint8Array,\n signatureMode: SignatureMode,\n options: ContentSizeValidationOptions = {},\n): ContentSizeValidationResult {\n const { throwOnError = true } = options;\n const maxSize = getMaxContentSize(signatureMode);\n const actualSize = content.length;\n const valid = actualSize <= maxSize;\n\n const result: ContentSizeValidationResult = {\n valid,\n maxSize,\n actualSize,\n };\n\n if (!valid) {\n const modeName = signatureMode === SignatureMode.DualSignature ? \"DualSignature\" : \"SingleSignature\";\n result.error = `Content too large for ${modeName} mode: ${actualSize} bytes exceeds maximum ${maxSize} bytes. Use ContentType.IPFS or ContentType.Arweave for larger content.`;\n\n if (throwOnError) {\n throw new Error(result.error);\n }\n }\n\n return result;\n}\n","/**\n * Domain-separated hash functions for SATI attestations.\n *\n * These functions must produce identical hashes to the Rust implementations\n * in programs/sati/src/signature.rs. Uses keccak256 from @noble/hashes.\n *\n * ## Universal Base Layout (130 bytes)\n * All schemas share identical first 130 bytes. Hash computation uses:\n * - task_ref (32 bytes)\n * - data_hash (32 bytes) at offset 97\n *\n * ## Signature Model\n * - Agent signs: interaction_hash = keccak256(domain, schema, task_ref, data_hash)\n * - Counterparty signs: SIWS human-readable message (built in offchain-signing.ts)\n *\n * ## Identity Model\n * - `agentMint` = agent's **MINT ADDRESS** (stable identity)\n * - The agent NFT **OWNER** signs (verified via ATA ownership on-chain)\n */\n\nimport { keccak_256 } from \"@noble/hashes/sha3.js\";\nimport { type Address, getAddressEncoder } from \"@solana/kit\";\n\n// Domain separators - must match programs/sati/src/constants.rs\nconst DOMAIN_INTERACTION = new TextEncoder().encode(\"SATI:interaction:v1\");\nconst DOMAIN_EVM_LINK = new TextEncoder().encode(\"SATI:evm_link:v1\");\n\n/**\n * Helper to convert Address to 32-byte Uint8Array\n */\nfunction addressToBytes(address: Address): Uint8Array {\n const encoder = getAddressEncoder();\n // Convert ReadonlyUint8Array to mutable Uint8Array\n return new Uint8Array(encoder.encode(address));\n}\n\n/**\n * Compute the interaction hash that the agent signs (blind to outcome).\n * Domain: SATI:interaction:v1\n *\n * The agent signs this hash as a blind commitment to the interaction.\n * Note: token_account is NOT included in the hash (removed in v2 layout).\n *\n * @param sasSchema - SAS schema address\n * @param taskRef - 32-byte task reference (e.g., CAIP-220 tx hash)\n * @param dataHash - 32-byte hash of the request/interaction data\n * @returns 32-byte keccak256 hash\n */\nexport function computeInteractionHash(sasSchema: Address, taskRef: Uint8Array, dataHash: Uint8Array): Uint8Array {\n if (taskRef.length !== 32) {\n throw new Error(\"taskRef must be 32 bytes\");\n }\n if (dataHash.length !== 32) {\n throw new Error(\"dataHash must be 32 bytes\");\n }\n\n const data = new Uint8Array(\n DOMAIN_INTERACTION.length + 32 + 32 + 32, // domain + schema + taskRef + dataHash\n );\n\n let offset = 0;\n data.set(DOMAIN_INTERACTION, offset);\n offset += DOMAIN_INTERACTION.length;\n data.set(addressToBytes(sasSchema), offset);\n offset += 32;\n data.set(taskRef, offset);\n offset += 32;\n data.set(dataHash, offset);\n\n return keccak_256(data);\n}\n\n/**\n * Compute the deterministic nonce for compressed attestation address derivation.\n * Includes counterparty to ensure unique addresses per (task, agent, counterparty) tuple.\n *\n * @param taskRef - 32-byte task reference\n * @param sasSchema - SAS schema address\n * @param agentMint - Agent's mint address\n * @param counterparty - Counterparty's address\n * @returns 32-byte keccak256 nonce\n */\nexport function computeAttestationNonce(\n taskRef: Uint8Array,\n sasSchema: Address,\n agentMint: Address,\n counterparty: Address,\n): Uint8Array {\n if (taskRef.length !== 32) {\n throw new Error(\"taskRef must be 32 bytes\");\n }\n\n const data = new Uint8Array(32 + 32 + 32 + 32); // taskRef + schema + agentMint + counterparty\n\n let offset = 0;\n data.set(taskRef, offset);\n offset += 32;\n data.set(addressToBytes(sasSchema), offset);\n offset += 32;\n data.set(addressToBytes(agentMint), offset);\n offset += 32;\n data.set(addressToBytes(counterparty), offset);\n\n return keccak_256(data);\n}\n\n/**\n * Compute the deterministic nonce for regular (SAS) ReputationScoreV3 attestation.\n * One ReputationScoreV3 per (provider, agent) pair.\n *\n * Also serves as the deterministic task_ref stored in the attestation data,\n * since both are keccak256(provider || agentMint) per the spec.\n *\n * @param provider - Reputation provider's address\n * @param agentMint - Agent's mint address\n * @returns 32-byte keccak256 nonce\n */\nexport function computeReputationNonce(provider: Address, agentMint: Address): Uint8Array {\n const data = new Uint8Array(32 + 32); // provider + agentMint\n\n data.set(addressToBytes(provider), 0);\n data.set(addressToBytes(agentMint), 32);\n\n return keccak_256(data);\n}\n\n/**\n * Compute the hash for EVM address linking.\n * Domain: SATI:evm_link:v1\n *\n * @param agentMint - Agent's mint address\n * @param evmAddress - 20-byte EVM address (without 0x prefix)\n * @param chainId - CAIP-2 chain identifier (e.g., \"eip155:1\")\n * @returns 32-byte keccak256 hash\n */\nexport function computeEvmLinkHash(agentMint: Address, evmAddress: Uint8Array, chainId: string): Uint8Array {\n if (evmAddress.length !== 20) {\n throw new Error(\"evmAddress must be 20 bytes\");\n }\n\n const chainIdBytes = new TextEncoder().encode(chainId);\n const data = new Uint8Array(DOMAIN_EVM_LINK.length + 32 + 20 + chainIdBytes.length);\n\n let offset = 0;\n data.set(DOMAIN_EVM_LINK, offset);\n offset += DOMAIN_EVM_LINK.length;\n data.set(addressToBytes(agentMint), offset);\n offset += 32;\n data.set(evmAddress, offset);\n offset += 20;\n data.set(chainIdBytes, offset);\n\n return keccak_256(data);\n}\n\n// =============================================================================\n// Data Hash Helpers\n// =============================================================================\n// These helpers compute the `data_hash` field for attestations - the agent's\n// cryptographic commitment to the interaction content.\n\n/**\n * Compute data_hash from raw request and response content.\n *\n * This is the agent's blind commitment to the interaction.\n * Use this when you have the full request/response content available.\n *\n * @param request - Raw request content (e.g., JSON body, prompt text)\n * @param response - Raw response content (e.g., API response, completion)\n * @returns 32-byte keccak256 hash\n *\n * @example\n * ```typescript\n * const request = new TextEncoder().encode(JSON.stringify({ prompt: \"Hello\" }));\n * const response = new TextEncoder().encode(JSON.stringify({ text: \"Hi there!\" }));\n * const dataHash = computeDataHash(request, response);\n * ```\n */\nexport function computeDataHash(request: Uint8Array, response: Uint8Array): Uint8Array {\n const data = new Uint8Array(request.length + response.length);\n data.set(request, 0);\n data.set(response, request.length);\n return keccak_256(data);\n}\n\n/**\n * Compute data_hash from pre-computed request and response hashes.\n *\n * Use this for large content or streaming scenarios where you want to\n * hash incrementally rather than buffering the entire content.\n *\n * @param requestHash - 32-byte hash of request content\n * @param responseHash - 32-byte hash of response content\n * @returns 32-byte keccak256 hash\n *\n * @example\n * ```typescript\n * // For large content, hash each part separately\n * const requestHash = keccak_256(largeRequestBuffer);\n * const responseHash = keccak_256(largeResponseBuffer);\n * const dataHash = computeDataHashFromHashes(requestHash, responseHash);\n * ```\n */\nexport function computeDataHashFromHashes(requestHash: Uint8Array, responseHash: Uint8Array): Uint8Array {\n if (requestHash.length !== 32) {\n throw new Error(\"requestHash must be 32 bytes\");\n }\n if (responseHash.length !== 32) {\n throw new Error(\"responseHash must be 32 bytes\");\n }\n\n const data = new Uint8Array(64);\n data.set(requestHash, 0);\n data.set(responseHash, 32);\n return keccak_256(data);\n}\n\n/**\n * Compute data_hash from string request and response.\n *\n * Convenience wrapper for the common case of string content.\n *\n * @param request - Request string (will be UTF-8 encoded)\n * @param response - Response string (will be UTF-8 encoded)\n * @returns 32-byte keccak256 hash\n *\n * @example\n * ```typescript\n * const dataHash = computeDataHashFromStrings(\n * '{\"prompt\": \"What is 2+2?\"}',\n * '{\"answer\": \"4\"}'\n * );\n * ```\n */\nexport function computeDataHashFromStrings(request: string, response: string): Uint8Array {\n const encoder = new TextEncoder();\n return computeDataHash(encoder.encode(request), encoder.encode(response));\n}\n\n/**\n * Create a zero-filled data_hash for SingleSigner schemas.\n *\n * SingleSigner schemas (like ReputationScoreV3) don't use blind commitments,\n * so data_hash should be zeros.\n *\n * @returns 32-byte zero-filled Uint8Array\n */\nexport function zeroDataHash(): Uint8Array {\n return new Uint8Array(32);\n}\n\n// Re-export Outcome from schemas (single source of truth)\nexport { Outcome } from \"./schemas\";\n\n/**\n * Export domain separators for reference\n */\nexport const DOMAINS = {\n INTERACTION: DOMAIN_INTERACTION,\n EVM_LINK: DOMAIN_EVM_LINK,\n} as const;\n","/**\n * SATI Light Client\n *\n * SATI-specific Light Protocol client that uses compression-kit as the underlying\n * RPC layer. This provides SATI-specific query and proof methods for compressed\n * attestations.\n *\n * ## Identity Model\n * - `agentMint` = agent's **MINT ADDRESS** (stable identity)\n */\n\nimport {\n address,\n type Address,\n getAddressEncoder,\n getAddressDecoder,\n getProgramDerivedAddress,\n getUtf8Encoder,\n} from \"@solana/kit\";\nimport {\n createPhotonRpc,\n type PhotonRpc,\n type CompressedAccount,\n type ValidityProofWithContext,\n type TreeInfo,\n type MemcmpFilter,\n deriveAddress,\n deriveAddressSeed,\n PackedAccounts,\n createSystemAccountConfig,\n LIGHT_SYSTEM_PROGRAM,\n ACCOUNT_COMPRESSION_PROGRAM,\n NOOP_PROGRAM,\n REGISTERED_PROGRAM_PDA,\n ADDRESS_TREE,\n ADDRESS_QUEUE,\n MERKLE_TREE_PUBKEY,\n NULLIFIER_QUEUE_PUBKEY,\n createBN254,\n} from \"@cascade-fyi/compression-kit\";\n\nimport { SATI_PROGRAM_ADDRESS } from \"./generated/programs/sati.js\";\nimport type { CompressedAttestation, FeedbackData, ValidationData, Outcome } from \"./schemas\";\nimport { deserializeFeedback, deserializeValidation } from \"./schemas\";\n\n// Offsets for parsing compressed attestation data (Borsh serialization)\n// Note: The `data` field is a Vec<u8> which has a 4-byte length prefix\nconst BORSH_OFFSETS = {\n SAS_SCHEMA: 0,\n AGENT_MINT: 32,\n DATA_LEN: 64, // 4-byte u32 LE length prefix for Vec<u8>\n DATA_START: 68, // Actual data bytes start after length prefix\n} as const;\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * PublicKey-like object (browser-compatible)\n */\nexport interface PublicKeyLike {\n toBase58(): string;\n toBytes(): Uint8Array;\n}\n\n/**\n * Filter options for querying compressed attestations.\n */\nexport interface AttestationFilter {\n sasSchema?: Address;\n /** Agent's mint address to filter by */\n agentMint?: Address;\n counterparty?: Address;\n outcome?: Outcome;\n responseMin?: number;\n responseMax?: number;\n /** Maximum number of results to return per page (default: all) */\n limit?: number;\n /** Pagination cursor from previous response (for fetching next page) */\n cursor?: string;\n}\n\n/**\n * Paginated result for attestation queries.\n * Matches Photon RPC cursor-based pagination model.\n */\nexport interface PaginatedAttestations<T> {\n /** Attestations matching the filter */\n items: T[];\n /** Cursor for next page, null if no more results */\n cursor: string | null;\n}\n\n/**\n * Parsed compressed attestation with decoded data\n */\nexport interface ParsedAttestation {\n address: Uint8Array;\n raw: CompressedAccount;\n attestation: CompressedAttestation;\n data: FeedbackData | ValidationData;\n}\n\n/**\n * Parsed feedback attestation with FeedbackData\n */\nexport interface ParsedFeedbackAttestation {\n address: Uint8Array;\n raw: CompressedAccount;\n attestation: CompressedAttestation;\n data: FeedbackData;\n}\n\n/**\n * Parsed validation attestation with ValidationData\n */\nexport interface ParsedValidationAttestation {\n address: Uint8Array;\n raw: CompressedAccount;\n attestation: CompressedAttestation;\n data: ValidationData;\n}\n\n/**\n * Validity proof result for instruction building\n */\nexport interface ValidityProofResult {\n compressedProof: {\n a: number[];\n b: number[];\n c: number[];\n };\n rootIndices: number[];\n leafIndices: number[];\n}\n\n/**\n * Packed address tree info for instruction data\n */\nexport interface PackedAddressTreeInfo {\n rootIndex: number;\n addressMerkleTreePubkeyIndex: number;\n addressQueuePubkeyIndex: number;\n}\n\n/**\n * Packed state tree info for instruction data\n */\nexport interface PackedStateTreeInfo {\n merkleTreePubkeyIndex: number;\n queuePubkeyIndex: number;\n leafIndex: number;\n rootIndex: number;\n}\n\n/**\n * Account meta for remaining accounts\n */\nexport interface AccountMeta {\n pubkey: PublicKeyLike;\n isSigner: boolean;\n isWritable: boolean;\n}\n\n/**\n * Creation proof result with all necessary data for creating compressed accounts\n */\nexport interface CreationProofResult {\n proof: ValidityProofResult;\n addressTreeInfo: PackedAddressTreeInfo;\n outputStateTreeIndex: number;\n remainingAccounts: AccountMeta[];\n}\n\n/**\n * Mutation proof result for closing/updating attestations\n */\nexport interface MutationProofResult {\n proof: ValidityProofResult;\n stateTreeInfo: PackedStateTreeInfo;\n outputStateTreeIndex: number;\n remainingAccounts: AccountMeta[];\n}\n\n// =============================================================================\n// Simple PublicKey Implementation\n// =============================================================================\n\n/**\n * Simple PublicKey implementation that satisfies the PublicKeyLike interface.\n */\nclass SimplePublicKey implements PublicKeyLike {\n private readonly bytes: Uint8Array;\n private cachedBase58: string | null = null;\n\n constructor(value: Uint8Array | string) {\n if (typeof value === \"string\") {\n this.bytes = new Uint8Array(getAddressEncoder().encode(address(value)));\n this.cachedBase58 = value;\n } else {\n if (value.length !== 32) {\n throw new Error(`Invalid public key length: ${value.length}, expected 32`);\n }\n this.bytes = new Uint8Array(value);\n }\n }\n\n toBase58(): string {\n if (this.cachedBase58 === null) {\n this.cachedBase58 = getAddressDecoder().decode(this.bytes) as string;\n }\n return this.cachedBase58;\n }\n\n toBytes(): Uint8Array {\n return this.bytes;\n }\n}\n\n// =============================================================================\n// SATI Light Client Interface\n// =============================================================================\n\n/**\n * SATI Light Client interface for compressed attestation operations.\n */\nexport interface SATILightClient {\n /** Get the underlying Photon RPC client */\n getRpc(): PhotonRpc;\n\n /** Derive attestation address from seeds */\n deriveAttestationAddress(seeds: Uint8Array[]): Promise<{\n address: PublicKeyLike;\n addressTree: PublicKeyLike;\n addressQueue: PublicKeyLike;\n }>;\n\n /** Get attestation by address */\n getAttestationByAddress(addr: Address): Promise<ParsedAttestation | null>;\n\n /** List feedback attestations with pagination */\n listFeedbacks(filter: Partial<AttestationFilter>): Promise<PaginatedAttestations<ParsedFeedbackAttestation>>;\n\n /** List validation attestations with pagination */\n listValidations(filter: Partial<AttestationFilter>): Promise<PaginatedAttestations<ParsedValidationAttestation>>;\n\n /** Get creation proof for a new compressed account */\n getCreationProof(addr: PublicKeyLike): Promise<CreationProofResult>;\n\n /** Get mutation proof for closing/updating an attestation */\n getMutationProof(compressedAccount: CompressedAccount): Promise<MutationProofResult>;\n\n /** Prepare everything needed to create a new compressed account */\n prepareCreate(seeds: Uint8Array[]): Promise<{\n address: PublicKeyLike;\n proof: ValidityProofResult;\n addressTreeInfo: PackedAddressTreeInfo;\n outputStateTreeIndex: number;\n remainingAccounts: AccountMeta[];\n }>;\n\n /** Get lookup table addresses for transaction compression */\n getLookupTableAddresses(\n schemaAddresses?: Address[],\n agentAtas?: { mint: Address; owner: Address }[],\n ): Promise<Address[]>;\n}\n\n// =============================================================================\n// SATI Light Client Implementation\n// =============================================================================\n\n/**\n * SATI Light Client implementation using compression-kit.\n */\nexport class SATILightClientImpl implements SATILightClient {\n private readonly rpc: PhotonRpc;\n private readonly programId: Address;\n\n constructor(photonRpcUrl: string, programId: Address = SATI_PROGRAM_ADDRESS) {\n this.rpc = createPhotonRpc(photonRpcUrl);\n this.programId = programId;\n }\n\n getRpc(): PhotonRpc {\n return this.rpc;\n }\n\n async deriveAttestationAddress(seeds: Uint8Array[]): Promise<{\n address: PublicKeyLike;\n addressTree: PublicKeyLike;\n addressQueue: PublicKeyLike;\n }> {\n const addressTree = ADDRESS_TREE;\n const addressQueue = ADDRESS_QUEUE;\n\n const seed = deriveAddressSeed(seeds, this.programId);\n const derivedAddress = deriveAddress(seed, addressTree);\n\n return {\n address: new SimplePublicKey(derivedAddress),\n addressTree: new SimplePublicKey(addressTree),\n addressQueue: new SimplePublicKey(addressQueue),\n };\n }\n\n async getAttestationByAddress(addr: Address): Promise<ParsedAttestation | null> {\n const account = await this.rpc.getCompressedAccount({ address: addr });\n if (!account || !account.data) return null;\n\n // Try feedback deserializer first (most common), fall back to validation\n try {\n return this.parseAttestation(account, deserializeFeedback);\n } catch {\n try {\n return this.parseAttestation(account, deserializeValidation);\n } catch {\n return null;\n }\n }\n }\n\n async listFeedbacks(\n filter: AttestationFilter & { sasSchema: Address },\n ): Promise<PaginatedAttestations<ParsedFeedbackAttestation>> {\n // Query compressed accounts owned by SATI program with sasSchema filter\n const result = await this.queryAttestations(filter, deserializeFeedback);\n return {\n items: result.items as ParsedFeedbackAttestation[],\n cursor: result.cursor,\n };\n }\n\n async listValidations(\n filter: AttestationFilter & { sasSchema: Address },\n ): Promise<PaginatedAttestations<ParsedValidationAttestation>> {\n // Query compressed accounts owned by SATI program with sasSchema filter\n const result = await this.queryAttestations(filter, deserializeValidation);\n return {\n items: result.items as ParsedValidationAttestation[],\n cursor: result.cursor,\n };\n }\n\n async getCreationProof(addr: PublicKeyLike): Promise<CreationProofResult> {\n const addressBytes = addr.toBytes();\n const addressBN254 = createBN254(addressBytes);\n\n const proofResult = await this.rpc.getValidityProof(\n [],\n [\n {\n address: addressBN254,\n addressTreeInfo: {\n tree: ADDRESS_TREE,\n queue: ADDRESS_QUEUE,\n treeType: 2, // AddressV1\n nextTreeInfo: null,\n },\n },\n ],\n );\n\n const packedAccounts = await PackedAccounts.newWithSystemAccounts(createSystemAccountConfig(this.programId));\n\n const addressTreeIndex = packedAccounts.insertOrGet(ADDRESS_TREE);\n const addressQueueIndex = packedAccounts.insertOrGet(ADDRESS_QUEUE);\n const outputStateTreeIndex = packedAccounts.insertOrGet(MERKLE_TREE_PUBKEY);\n\n const { remainingAccounts } = packedAccounts.toAccountMetas();\n\n return {\n proof: this.convertProof(proofResult),\n addressTreeInfo: {\n rootIndex: proofResult.rootIndices[0] ?? 0,\n addressMerkleTreePubkeyIndex: addressTreeIndex,\n addressQueuePubkeyIndex: addressQueueIndex,\n },\n outputStateTreeIndex,\n remainingAccounts: remainingAccounts.map((m: { address: Address; role: number }) => ({\n pubkey: new SimplePublicKey(m.address),\n isSigner: m.role === 2 || m.role === 3,\n isWritable: m.role === 1 || m.role === 3,\n })),\n };\n }\n\n async getMutationProof(compressedAccount: CompressedAccount): Promise<MutationProofResult> {\n const hash = compressedAccount.hash;\n const hashBN254 = typeof hash === \"bigint\" ? hash : createBN254(hash as Uint8Array);\n\n const proofResult = await this.rpc.getValidityProof(\n [\n {\n hash: hashBN254,\n stateTreeInfo: compressedAccount.treeInfo as TreeInfo,\n },\n ],\n [],\n );\n\n const packedAccounts = await PackedAccounts.newWithSystemAccounts(createSystemAccountConfig(this.programId));\n\n const treeInfo = compressedAccount.treeInfo as TreeInfo;\n const merkleTreeIndex = packedAccounts.insertOrGet(treeInfo.tree);\n const queueIndex = packedAccounts.insertOrGet(treeInfo.queue);\n const outputStateTreeIndex = packedAccounts.insertOrGet(MERKLE_TREE_PUBKEY);\n\n const { remainingAccounts } = packedAccounts.toAccountMetas();\n\n return {\n proof: this.convertProof(proofResult),\n stateTreeInfo: {\n merkleTreePubkeyIndex: merkleTreeIndex,\n queuePubkeyIndex: queueIndex,\n leafIndex: compressedAccount.leafIndex as number,\n rootIndex: proofResult.rootIndices[0] ?? 0,\n },\n outputStateTreeIndex,\n remainingAccounts: remainingAccounts.map((m: { address: Address; role: number }) => ({\n pubkey: new SimplePublicKey(m.address),\n isSigner: m.role === 2 || m.role === 3,\n isWritable: m.role === 1 || m.role === 3,\n })),\n };\n }\n\n async prepareCreate(seeds: Uint8Array[]): Promise<{\n address: PublicKeyLike;\n proof: ValidityProofResult;\n addressTreeInfo: PackedAddressTreeInfo;\n outputStateTreeIndex: number;\n remainingAccounts: AccountMeta[];\n }> {\n const { address: derivedAddress, addressTree, addressQueue } = await this.deriveAttestationAddress(seeds);\n\n const addressBN254 = createBN254(derivedAddress.toBytes());\n\n const proofResult = await this.rpc.getValidityProof(\n [],\n [\n {\n address: addressBN254,\n addressTreeInfo: {\n tree: addressTree.toBase58() as Address,\n queue: addressQueue.toBase58() as Address,\n treeType: 2, // AddressV1\n nextTreeInfo: null,\n },\n },\n ],\n );\n\n const packedAccounts = await PackedAccounts.newWithSystemAccounts(createSystemAccountConfig(this.programId));\n\n const addressTreeIndex = packedAccounts.insertOrGet(addressTree.toBase58() as Address);\n const addressQueueIndex = packedAccounts.insertOrGet(addressQueue.toBase58() as Address);\n const outputStateTreeIndex = packedAccounts.insertOrGet(MERKLE_TREE_PUBKEY);\n\n const { remainingAccounts } = packedAccounts.toAccountMetas();\n\n return {\n address: derivedAddress,\n proof: this.convertProof(proofResult),\n addressTreeInfo: {\n rootIndex: proofResult.rootIndices[0] ?? 0,\n addressMerkleTreePubkeyIndex: addressTreeIndex,\n addressQueuePubkeyIndex: addressQueueIndex,\n },\n outputStateTreeIndex,\n remainingAccounts: remainingAccounts.map((m: { address: Address; role: number }) => ({\n pubkey: new SimplePublicKey(m.address),\n isSigner: m.role === 2 || m.role === 3,\n isWritable: m.role === 1 || m.role === 3,\n })),\n };\n }\n\n /**\n * Get addresses that should be included in the lookup table for transaction compression.\n *\n * @param schemaAddresses - Optional schema addresses to include their schemaConfigPdas\n * (use deployed schema addresses for maximum compression)\n * @param agentAtas - Optional agent ATA info to include derived ATAs\n * (use known agents for maximum compression)\n */\n async getLookupTableAddresses(\n schemaAddresses?: Address[],\n agentAtas?: { mint: Address; owner: Address }[],\n ): Promise<Address[]> {\n // Solana system programs\n const SYSTEM_PROGRAM = address(\"11111111111111111111111111111111\");\n const ED25519_PROGRAM = address(\"Ed25519SigVerify111111111111111111111111111\");\n const INSTRUCTIONS_SYSVAR = address(\"Sysvar1nstructions1111111111111111111111111\");\n const COMPUTE_BUDGET_PROGRAM = address(\"ComputeBudget111111111111111111111111111111\");\n const TOKEN_2022_PROGRAM = address(\"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\");\n\n // Derive event authority PDA: PDA(SATI_PROGRAM, [\"__event_authority\"])\n const [eventAuthority] = await getProgramDerivedAddress({\n programAddress: this.programId,\n seeds: [getUtf8Encoder().encode(\"__event_authority\")],\n });\n\n // Derive CPI signer PDA: PDA(SATI_PROGRAM, [\"cpi_authority\"])\n // This is used by Light Protocol for CPI calls from our program\n const [cpiSigner] = await getProgramDerivedAddress({\n programAddress: this.programId,\n seeds: [getUtf8Encoder().encode(\"cpi_authority\")],\n });\n\n // Derive account compression authority PDA: PDA(LIGHT_SYSTEM_PROGRAM, [\"cpi_authority\"])\n // This is used by Light Protocol for account compression operations\n const [compressionAuthority] = await getProgramDerivedAddress({\n programAddress: LIGHT_SYSTEM_PROGRAM,\n seeds: [getUtf8Encoder().encode(\"cpi_authority\")],\n });\n\n // Derive schemaConfigPdas for provided schemas\n // Each schemaConfigPda in ALT saves 32 bytes per transaction\n const schemaConfigPdas: Address[] = [];\n if (schemaAddresses) {\n for (const sasSchema of schemaAddresses) {\n const [schemaConfigPda] = await getProgramDerivedAddress({\n programAddress: this.programId,\n seeds: [getUtf8Encoder().encode(\"schema_config\"), getAddressEncoder().encode(sasSchema)],\n });\n schemaConfigPdas.push(schemaConfigPda);\n }\n }\n\n // Derive ATAs for provided agent info\n // Each agentAta in ALT saves 32 bytes per transaction\n const ASSOCIATED_TOKEN_PROGRAM = address(\"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\");\n const derivedAtas: Address[] = [];\n if (agentAtas) {\n for (const ataInfo of agentAtas) {\n const [ata] = await getProgramDerivedAddress({\n programAddress: ASSOCIATED_TOKEN_PROGRAM,\n seeds: [\n getAddressEncoder().encode(ataInfo.owner),\n getAddressEncoder().encode(TOKEN_2022_PROGRAM),\n getAddressEncoder().encode(ataInfo.mint),\n ],\n });\n derivedAtas.push(ata);\n }\n }\n\n return [\n // Light Protocol core\n LIGHT_SYSTEM_PROGRAM,\n ACCOUNT_COMPRESSION_PROGRAM,\n NOOP_PROGRAM,\n REGISTERED_PROGRAM_PDA,\n\n // Light Protocol state trees\n ADDRESS_TREE,\n ADDRESS_QUEUE,\n MERKLE_TREE_PUBKEY,\n NULLIFIER_QUEUE_PUBKEY,\n\n // Light Protocol CPI authorities (CRITICAL for transaction size!)\n cpiSigner,\n compressionAuthority,\n\n // SATI program and PDAs\n this.programId,\n eventAuthority,\n\n // Schema config PDAs (saves 32 bytes per schema used)\n ...schemaConfigPdas,\n\n // Agent ATAs (saves 32 bytes per agent used)\n ...derivedAtas,\n\n // Solana system programs\n SYSTEM_PROGRAM,\n ED25519_PROGRAM,\n INSTRUCTIONS_SYSVAR,\n COMPUTE_BUDGET_PROGRAM,\n TOKEN_2022_PROGRAM,\n ];\n }\n\n // ===========================================================================\n // Private Helpers\n // ===========================================================================\n\n private convertProof(proofResult: ValidityProofWithContext): ValidityProofResult {\n return {\n compressedProof: proofResult.compressedProof\n ? {\n a: Array.from(proofResult.compressedProof.a),\n b: Array.from(proofResult.compressedProof.b),\n c: Array.from(proofResult.compressedProof.c),\n }\n : { a: [], b: [], c: [] },\n rootIndices: proofResult.rootIndices,\n leafIndices: proofResult.leafIndices,\n };\n }\n\n private async queryAttestations<T extends FeedbackData | ValidationData>(\n filter: AttestationFilter & { sasSchema: Address },\n deserializer: (data: Uint8Array) => T,\n ): Promise<PaginatedAttestations<ParsedAttestation>> {\n // Build memcmp filters for server-side filtering (Photon RPC)\n const memcmpFilters: MemcmpFilter[] = [];\n memcmpFilters.push({ offset: BORSH_OFFSETS.SAS_SCHEMA, bytes: filter.sasSchema });\n if (filter.agentMint) {\n memcmpFilters.push({ offset: BORSH_OFFSETS.AGENT_MINT, bytes: filter.agentMint });\n }\n\n const result = await this.rpc.getCompressedAccountsByOwner(this.programId, {\n cursor: filter.cursor,\n limit: filter.limit,\n filters: memcmpFilters,\n });\n const attestations: ParsedAttestation[] = [];\n\n for (const account of result.items) {\n if (!account.data) continue;\n\n try {\n const parsed = this.parseAttestation(account, deserializer);\n if (!parsed) continue;\n\n // Server-side memcmp handles sasSchema and agentMint;\n // client-side filtering for fields at variable offsets\n if (filter.counterparty && parsed.data.counterparty !== filter.counterparty) continue;\n if (filter.outcome !== undefined && parsed.data.outcome !== filter.outcome) continue;\n\n attestations.push(parsed);\n } catch {\n // Skip invalid attestations\n }\n }\n\n return {\n items: attestations,\n cursor: result.cursor,\n };\n }\n\n private parseAttestation<T extends FeedbackData | ValidationData>(\n account: CompressedAccount,\n deserializer: (data: Uint8Array) => T,\n ): ParsedAttestation | null {\n if (!account.data) return null;\n\n const rawData = account.data.data;\n const data = rawData instanceof Uint8Array ? new Uint8Array(rawData) : new Uint8Array(rawData as ArrayLike<number>);\n\n // Minimum: sasSchema(32) + agentMint(32) + dataLen(4) = 68 bytes\n if (data.length < BORSH_OFFSETS.DATA_START) return null;\n\n // Parse fixed fields and convert to Address\n const addressDecoder = getAddressDecoder();\n const sasSchemaBytes = data.slice(BORSH_OFFSETS.SAS_SCHEMA, BORSH_OFFSETS.SAS_SCHEMA + 32);\n const agentMintBytes = data.slice(BORSH_OFFSETS.AGENT_MINT, BORSH_OFFSETS.AGENT_MINT + 32);\n const sasSchema = addressDecoder.decode(sasSchemaBytes);\n const agentMint = addressDecoder.decode(agentMintBytes);\n\n // Parse Vec length (4-byte u32 LE at offset 64)\n const dataLen =\n data[BORSH_OFFSETS.DATA_LEN] |\n (data[BORSH_OFFSETS.DATA_LEN + 1] << 8) |\n (data[BORSH_OFFSETS.DATA_LEN + 2] << 16) |\n (data[BORSH_OFFSETS.DATA_LEN + 3] << 24);\n const schemaDataEnd = BORSH_OFFSETS.DATA_START + dataLen;\n\n // Validate we have enough bytes for: schemaData + numSignatures(1) + sig1(64) + sig2(64)\n if (data.length < schemaDataEnd + 129) return null;\n\n const schemaData = data.slice(BORSH_OFFSETS.DATA_START, schemaDataEnd);\n const numSignatures = data[schemaDataEnd];\n const signature1 = data.slice(schemaDataEnd + 1, schemaDataEnd + 65);\n const signature2 = numSignatures > 1 ? data.slice(schemaDataEnd + 65, schemaDataEnd + 129) : new Uint8Array(64);\n\n const attestation: CompressedAttestation = {\n sasSchema,\n agentMint,\n numSignatures,\n data: schemaData,\n signature1,\n signature2,\n };\n\n // Deserialize schema-specific data using provided deserializer\n const parsedData = deserializer(schemaData);\n\n return {\n address: account.address ?? new Uint8Array(32),\n raw: account,\n attestation,\n data: parsedData,\n };\n }\n}\n\n// =============================================================================\n// Factory Function\n// =============================================================================\n\n/**\n * Create a SATI Light Client.\n *\n * @param photonRpcUrl - Photon indexer URL\n * @param programId - Optional SATI program ID (defaults to deployed address)\n */\nexport function createSATILightClient(photonRpcUrl: string, programId?: Address): SATILightClient {\n return new SATILightClientImpl(photonRpcUrl, programId);\n}\n","/**\n * SAS PDA Derivation Helpers\n *\n * Functions for deriving Program Derived Addresses for the\n * Solana Attestation Service (SAS) integration with SATI.\n */\n\nimport { type Address, type ProgramDerivedAddressBump, getProgramDerivedAddress, getAddressEncoder } from \"@solana/kit\";\n\nimport { SATI_PROGRAM_ADDRESS } from \"./generated\";\n\n// SATI credential name (duplicated here to avoid importing sas.ts which pulls in sas-lib)\nconst SATI_CREDENTIAL_NAME = \"SATI\";\n\n// SAS Program Address (mainnet/devnet)\nexport const SAS_PROGRAM_ADDRESS: Address = \"22zoJMtdu4tQc2PzL74ZUT7FrwgB1Udec8DdW4yw4BdG\" as Address;\n\n// Seeds for SAS PDA derivation\nexport const CREDENTIAL_SEED = \"credential\";\nexport const SCHEMA_SEED = \"schema\";\nexport const ATTESTATION_SEED = \"attestation\";\nexport const SATI_ATTESTATION_SEED = \"sati_attestation\";\n\n// SATI-specific constants (SATI_CREDENTIAL_NAME imported from sas.ts)\nexport const REPUTATION_SCHEMA_NAME = \"ReputationScore\";\nexport const REPUTATION_SCHEMA_VERSION = 1;\n\n/**\n * Derive the SATI authority PDA.\n *\n * This PDA is used as the authority for the SATI credential in SAS.\n * Seeds: [\"sati_attestation\"]\n *\n * @returns [address, bump] tuple\n */\nexport async function deriveSatiPda(): Promise<readonly [Address, ProgramDerivedAddressBump]> {\n return getProgramDerivedAddress({\n programAddress: SATI_PROGRAM_ADDRESS,\n seeds: [SATI_ATTESTATION_SEED],\n });\n}\n\n/**\n * Derive the SATI credential PDA in SAS using SATI program PDA as authority.\n *\n * This is SATI-specific: authority is always the SATI program PDA.\n * For generic credential derivation with custom authority, use\n * `deriveSatiCredentialPda(authority)` from sas.ts.\n *\n * Seeds: [\"credential\", sati_pda, \"SATI\"]\n *\n * @returns [address, bump] tuple\n */\nexport async function deriveSatiProgramCredentialPda(): Promise<readonly [Address, ProgramDerivedAddressBump]> {\n const [satiPda] = await deriveSatiPda();\n const addressEncoder = getAddressEncoder();\n\n return getProgramDerivedAddress({\n programAddress: SAS_PROGRAM_ADDRESS,\n seeds: [CREDENTIAL_SEED, new Uint8Array(addressEncoder.encode(satiPda)), SATI_CREDENTIAL_NAME],\n });\n}\n\n/**\n * Derive the ReputationScoreV3 schema PDA in SAS.\n *\n * Seeds: [\"schema\", credential, \"ReputationScore\", version]\n *\n * @returns [address, bump] tuple\n */\nexport async function deriveReputationSchemaPda(): Promise<readonly [Address, ProgramDerivedAddressBump]> {\n const [credential] = await deriveSatiProgramCredentialPda();\n const addressEncoder = getAddressEncoder();\n const versionSeed = Uint8Array.from([REPUTATION_SCHEMA_VERSION]);\n\n return getProgramDerivedAddress({\n programAddress: SAS_PROGRAM_ADDRESS,\n seeds: [SCHEMA_SEED, new Uint8Array(addressEncoder.encode(credential)), REPUTATION_SCHEMA_NAME, versionSeed],\n });\n}\n\n/**\n * Derive a ReputationScoreV3 attestation PDA in SAS.\n *\n * The nonce is computed from (provider, agentMint) to ensure\n * one score per (provider, agent) pair.\n *\n * Seeds: [\"attestation\", credential, schema, nonce_as_address]\n *\n * @param credential - The SAS credential address (from deployed config)\n * @param schema - The SAS ReputationScoreV3 schema address (from deployed config)\n * @param nonce - 32-byte nonce (computed via computeReputationNonce)\n * @returns [address, bump] tuple\n */\nexport async function deriveReputationAttestationPda(\n credential: Address,\n schema: Address,\n nonce: Uint8Array,\n): Promise<readonly [Address, ProgramDerivedAddressBump]> {\n if (nonce.length !== 32) {\n throw new Error(\"Nonce must be 32 bytes\");\n }\n\n const addressEncoder = getAddressEncoder();\n\n return getProgramDerivedAddress({\n programAddress: SAS_PROGRAM_ADDRESS,\n seeds: [\n ATTESTATION_SEED,\n new Uint8Array(addressEncoder.encode(credential)),\n new Uint8Array(addressEncoder.encode(schema)),\n nonce,\n ],\n });\n}\n\n/**\n * Derive the SAS event authority PDA.\n *\n * Required for CPI calls to SAS that emit events (e.g., close attestation).\n * Seeds: [\"__event_authority\"] (derived from SAS program, not SATI program)\n *\n * @returns [address, bump] tuple\n */\nexport async function deriveSasEventAuthorityPda(): Promise<readonly [Address, ProgramDerivedAddressBump]> {\n return getProgramDerivedAddress({\n programAddress: SAS_PROGRAM_ADDRESS,\n seeds: [\"__event_authority\"],\n });\n}\n\n// NOTE: Generic SAS PDA derivation functions (deriveCredentialPda, deriveSchemaPda,\n// deriveAttestationPda) are available via the re-exports in sas.ts from sas-lib.\n// This file only contains SATI-specific derivation helpers.\n","/**\n * SATI SDK Helpers\n *\n * Browser-compatible utility functions for PDA derivation and constants.\n */\n\nimport { address, type Address, getProgramDerivedAddress, getAddressEncoder } from \"@solana/kit\";\nimport { SATI_PROGRAM_ADDRESS } from \"./generated\";\n\n// Token-2022 and Associated Token Program addresses\nexport const TOKEN_2022_PROGRAM_ADDRESS = address(\"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\");\nexport const ASSOCIATED_TOKEN_PROGRAM_ADDRESS = address(\"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\");\n\n// ============================================================\n// PDA Derivation Helpers\n// ============================================================\n\n/**\n * Derive the Registry Config PDA\n *\n * Seeds: [\"registry\"]\n */\nexport async function findRegistryConfigPda(): Promise<readonly [Address, number]> {\n const encoder = new TextEncoder();\n return getProgramDerivedAddress({\n programAddress: SATI_PROGRAM_ADDRESS,\n seeds: [encoder.encode(\"registry\")],\n });\n}\n\n/**\n * Derive the Schema Config PDA for a SAS schema\n *\n * Seeds: [\"schema_config\", sas_schema]\n *\n * @param sasSchema - The SAS (Solana Attestation Service) schema address\n */\nexport async function findSchemaConfigPda(sasSchema: Address): Promise<readonly [Address, number]> {\n const encoder = new TextEncoder();\n const addressEncoder = getAddressEncoder();\n return getProgramDerivedAddress({\n programAddress: SATI_PROGRAM_ADDRESS,\n seeds: [encoder.encode(\"schema_config\"), addressEncoder.encode(sasSchema)],\n });\n}\n\n// NOTE: There is intentionally NO findGroupMintPda() function.\n//\n// The group_mint in SATI is NOT a PDA - it's a pre-created Token-2022 mint\n// with GroupPointer extension that gets stored in the registry_config account\n// during initialization.\n//\n// To get the actual group_mint address, you MUST fetch the registry_config:\n//\n// const [registryConfigAddress] = await findRegistryConfigPda();\n// const registryConfig = await fetchRegistryConfig(rpc, registryConfigAddress);\n// const groupMint = registryConfig.data.groupMint;\n\n/**\n * Derive Associated Token Account address for Token-2022\n *\n * @param mint - Token mint address\n * @param owner - Token account owner\n */\nexport async function findAssociatedTokenAddress(mint: Address, owner: Address): Promise<readonly [Address, number]> {\n const addressEncoder = getAddressEncoder();\n return getProgramDerivedAddress({\n programAddress: ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n seeds: [\n addressEncoder.encode(owner),\n addressEncoder.encode(TOKEN_2022_PROGRAM_ADDRESS),\n addressEncoder.encode(mint),\n ],\n });\n}\n\n/**\n * Derive the Agent Index PDA for enumeration\n *\n * Seeds: [\"agent_index\", member_number.to_le_bytes()]\n *\n * Agent Index PDAs allow enumeration of all registered agents.\n * Each agent has a sequential member_number assigned at registration.\n *\n * @param memberNumber - The agent's member number (1-indexed)\n * @returns PDA address and bump\n */\nexport async function findAgentIndexPda(memberNumber: bigint): Promise<readonly [Address, number]> {\n const encoder = new TextEncoder();\n // Convert memberNumber to little-endian u64 bytes\n const memberBytes = new Uint8Array(8);\n const view = new DataView(memberBytes.buffer);\n view.setBigUint64(0, memberNumber, true); // true = little-endian\n\n return getProgramDerivedAddress({\n programAddress: SATI_PROGRAM_ADDRESS,\n seeds: [encoder.encode(\"agent_index\"), memberBytes],\n });\n}\n","/**\n * Ed25519 Precompile Instruction Builder\n *\n * Creates Ed25519 signature verification instructions for Solana's\n * native Ed25519SigVerify precompile program.\n *\n * Uses @solana/kit primitives - no legacy web3.js dependency.\n *\n * @see https://solana.com/docs/core/programs#ed25519-program\n */\n\nimport { address, type Address, type Instruction, type ReadonlyUint8Array } from \"@solana/kit\";\n\n/**\n * Ed25519 instruction with guaranteed data field.\n * The Ed25519 precompile always requires instruction data.\n */\nexport interface Ed25519Instruction extends Instruction {\n readonly data: ReadonlyUint8Array;\n}\n\n// Ed25519 precompile program address\nexport const ED25519_PROGRAM_ADDRESS: Address = address(\"Ed25519SigVerify111111111111111111111111111\");\n\n/**\n * Parameters for creating an Ed25519 verification instruction\n */\nexport interface Ed25519SignatureParams {\n /** 32-byte Ed25519 public key */\n publicKey: Uint8Array;\n /** Message that was signed */\n message: Uint8Array;\n /** 64-byte Ed25519 signature */\n signature: Uint8Array;\n}\n\n/**\n * Ed25519SignatureOffsets struct layout (14 bytes per signature)\n *\n * Layout:\n * - signature_offset: u16\n * - signature_instruction_index: u16\n * - public_key_offset: u16\n * - public_key_instruction_index: u16\n * - message_data_offset: u16\n * - message_data_size: u16\n * - message_instruction_index: u16\n */\nconst OFFSETS_SIZE = 14; // 7 x u16\n\n/**\n * Create an Ed25519 signature verification instruction.\n *\n * This instruction must be included in the transaction before any\n * instruction that requires Ed25519 signature verification via\n * instruction introspection.\n *\n * @param params - Signature verification parameters\n * @returns Instruction for Ed25519SigVerify program\n */\nexport function createEd25519Instruction(params: Ed25519SignatureParams): Ed25519Instruction {\n const { publicKey, message, signature } = params;\n\n if (publicKey.length !== 32) {\n throw new Error(\"Ed25519 public key must be 32 bytes\");\n }\n if (signature.length !== 64) {\n throw new Error(\"Ed25519 signature must be 64 bytes\");\n }\n\n // Instruction data layout:\n // - num_signatures: u8\n // - padding: u8\n // - offsets: Ed25519SignatureOffsets (14 bytes)\n // - public_key: 32 bytes\n // - signature: 64 bytes\n // - message: variable bytes\n\n const numSignatures = 1;\n const headerSize = 2; // num_signatures + padding\n const offsetsStart = headerSize;\n const dataStart = headerSize + OFFSETS_SIZE;\n\n // Data layout after header + offsets\n const publicKeyOffset = dataStart;\n const signatureOffset = publicKeyOffset + 32;\n const messageOffset = signatureOffset + 64;\n\n const totalSize = messageOffset + message.length;\n const data = new Uint8Array(totalSize);\n\n // Header\n data[0] = numSignatures;\n data[1] = 0; // padding\n\n // Write offsets (little-endian u16 values)\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n let offset = offsetsStart;\n\n // signature_offset\n view.setUint16(offset, signatureOffset, true);\n offset += 2;\n // signature_instruction_index (0xFFFF = same instruction)\n view.setUint16(offset, 0xffff, true);\n offset += 2;\n // public_key_offset\n view.setUint16(offset, publicKeyOffset, true);\n offset += 2;\n // public_key_instruction_index (0xFFFF = same instruction)\n view.setUint16(offset, 0xffff, true);\n offset += 2;\n // message_data_offset\n view.setUint16(offset, messageOffset, true);\n offset += 2;\n // message_data_size\n view.setUint16(offset, message.length, true);\n offset += 2;\n // message_instruction_index (0xFFFF = same instruction)\n view.setUint16(offset, 0xffff, true);\n\n // Write actual data\n data.set(publicKey, publicKeyOffset);\n data.set(signature, signatureOffset);\n data.set(message, messageOffset);\n\n return {\n programAddress: ED25519_PROGRAM_ADDRESS,\n accounts: [],\n data,\n };\n}\n\n/**\n * Create a single Ed25519 instruction that verifies multiple signatures.\n *\n * This is more efficient than creating separate instructions as it:\n * - Saves ~100 bytes per additional signature (no duplicate program address)\n * - Reduces transaction size for Light Protocol integration\n *\n * @param signatures - Array of signature verification parameters\n * @returns Single Ed25519 instruction verifying all signatures\n */\nexport function createBatchEd25519Instruction(signatures: Ed25519SignatureParams[]): Ed25519Instruction {\n if (signatures.length === 0) {\n throw new Error(\"At least one signature is required\");\n }\n\n // Validate all inputs\n for (const sig of signatures) {\n if (sig.publicKey.length !== 32) {\n throw new Error(\"Ed25519 public key must be 32 bytes\");\n }\n if (sig.signature.length !== 64) {\n throw new Error(\"Ed25519 signature must be 64 bytes\");\n }\n }\n\n const numSignatures = signatures.length;\n const headerSize = 2; // num_signatures + padding\n\n // Calculate total size for all signatures and their offsets\n // Each signature needs: 14 bytes for offsets, 32 bytes pubkey, 64 bytes sig, variable message\n let totalDataSize = headerSize;\n totalDataSize += numSignatures * OFFSETS_SIZE; // All offsets\n\n // Calculate data offset (after header and all offsets)\n const dataStart = totalDataSize;\n\n // Now add space for actual data (pubkeys, signatures, messages)\n for (const sig of signatures) {\n totalDataSize += 32 + 64 + sig.message.length;\n }\n\n const data = new Uint8Array(totalDataSize);\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n\n // Header\n data[0] = numSignatures;\n data[1] = 0; // padding\n\n // Track current data write position\n let currentDataOffset = dataStart;\n let offsetWritePos = headerSize;\n\n // Write each signature's offsets and data\n for (const sig of signatures) {\n const publicKeyOffset = currentDataOffset;\n const signatureOffset = publicKeyOffset + 32;\n const messageOffset = signatureOffset + 64;\n\n // Write offsets (little-endian u16 values)\n view.setUint16(offsetWritePos, signatureOffset, true);\n offsetWritePos += 2;\n view.setUint16(offsetWritePos, 0xffff, true); // signature_instruction_index\n offsetWritePos += 2;\n view.setUint16(offsetWritePos, publicKeyOffset, true);\n offsetWritePos += 2;\n view.setUint16(offsetWritePos, 0xffff, true); // public_key_instruction_index\n offsetWritePos += 2;\n view.setUint16(offsetWritePos, messageOffset, true);\n offsetWritePos += 2;\n view.setUint16(offsetWritePos, sig.message.length, true);\n offsetWritePos += 2;\n view.setUint16(offsetWritePos, 0xffff, true); // message_instruction_index\n offsetWritePos += 2;\n\n // Write actual data\n data.set(sig.publicKey, publicKeyOffset);\n data.set(sig.signature, signatureOffset);\n data.set(sig.message, messageOffset);\n\n currentDataOffset = messageOffset + sig.message.length;\n }\n\n return {\n programAddress: ED25519_PROGRAM_ADDRESS,\n accounts: [],\n data,\n };\n}\n","/**\n * Off-chain message signing utilities for SATI attestations.\n *\n * Creates human-readable messages for wallet signing that work with\n * Phantom, Backpack, and other Solana wallets.\n *\n * The signature is over the UTF-8 encoded message text, which is then\n * verified on-chain via Ed25519 precompile.\n *\n * ## Signature Model (v2 Universal Layout)\n * - Agent signs: 32-byte interaction_hash (blind commitment)\n * - Counterparty signs: Human-readable SIWS message (~300 bytes)\n *\n * ## Message Format (SIWS-Inspired)\n * Counterparty messages follow Sign-In With Solana (SIWS) patterns:\n * ```\n * SATI {schema_name}\n *\n * Agent: {agent_mint}\n * Task: {task_ref}\n * Outcome: {Negative|Neutral|Positive}\n * Details: {content}\n *\n * Sign to create this attestation.\n * ```\n */\n\nimport type { Address } from \"@solana/kit\";\nimport { type Outcome, OFFSETS, ContentType, getOutcomeLabel } from \"./schemas\";\n\n/**\n * Outcome labels for human-readable message display.\n */\nconst OUTCOME_LABELS: Record<Outcome, string> = {\n 0: \"Negative\",\n 1: \"Neutral\",\n 2: \"Positive\",\n};\n\n/**\n * Solana network type for CAIP-2 chain references.\n */\nexport type SolanaNetwork = \"mainnet\" | \"devnet\" | \"localnet\";\n\n/**\n * CAIP-2 chain references for Solana networks.\n * These are the first 32 characters of each network's genesis block hash (base58).\n *\n * @see https://namespaces.chainagnostic.org/solana/caip2\n */\nexport const SOLANA_CHAIN_REFS: Record<SolanaNetwork, string> = {\n mainnet: \"5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\",\n devnet: \"EtWTRABZaYq6iMfeYKouRu166VU2xqa1\",\n localnet: \"localnet\",\n} as const;\n\n/**\n * Default domain for SATI attestation messages.\n */\nconst SATI_DOMAIN = \"sati.fyi\";\n\n// Base58 alphabet for encoding\nconst BASE58_ALPHABET = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\";\n\n/**\n * Encode bytes to base58 string.\n */\nfunction bytesToBase58(bytes: Uint8Array): string {\n if (bytes.length === 0) return \"\";\n\n // Count leading zeros\n let leadingZeros = 0;\n for (const b of bytes) {\n if (b === 0) leadingZeros++;\n else break;\n }\n\n // Convert to big integer\n let num = BigInt(0);\n for (const b of bytes) {\n num = num * BigInt(256) + BigInt(b);\n }\n\n // Convert to base58\n let result = \"\";\n while (num > 0) {\n const remainder = Number(num % BigInt(58));\n result = BASE58_ALPHABET[remainder] + result;\n num = num / BigInt(58);\n }\n\n // Add leading '1's for each leading zero byte\n return \"1\".repeat(leadingZeros) + result;\n}\n\n/**\n * Format an address as CAIP-10 identifier.\n *\n * @param address - Solana address (base58)\n * @param network - Solana network (defaults to mainnet)\n * @returns CAIP-10 formatted string: `solana:{chain_ref}:{address}`\n *\n * @example\n * ```typescript\n * formatCaip10(\"7S3P4HxJpyy...\", \"mainnet\")\n * // => \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp:7S3P4HxJpyy...\"\n * ```\n */\nexport function formatCaip10(address: Address, network: SolanaNetwork = \"mainnet\"): string {\n return `solana:${SOLANA_CHAIN_REFS[network]}:${address}`;\n}\n\n/**\n * Convert bytes to hex string.\n */\nfunction bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\n/**\n * Result of building a signing message.\n */\nexport interface SigningMessage {\n /** The UTF-8 encoded message bytes to be signed */\n messageBytes: Uint8Array;\n /** The human-readable message text */\n text: string;\n}\n\n/**\n * @deprecated Use SigningMessage instead\n */\nexport type FeedbackSigningMessage = SigningMessage;\n\n// ============================================================================\n// Counterparty Message Builder (v2 Universal Layout)\n// ============================================================================\n\n/**\n * Parameters for building a counterparty signing message.\n */\nexport interface CounterpartyMessageParams {\n /** Schema name (e.g., \"Feedback\", \"Validation\") */\n schemaName: string;\n /** The universal layout data bytes (130+ bytes) */\n data: Uint8Array;\n}\n\n/**\n * Build a human-readable SIWS message for counterparty signing.\n *\n * Creates a UTF-8 encoded message (~300 bytes) that Phantom and other wallets\n * will display and allow signing. The signature can be verified on-chain\n * via Ed25519 precompile against the same message bytes.\n *\n * ## Message Format\n * ```\n * SATI {schema_name}\n *\n * Agent: {token_account}\n * Task: {task_ref}\n * Outcome: {Negative|Neutral|Positive}\n * Details: {content}\n *\n * Sign to create this attestation.\n * ```\n *\n * @param params - Parameters containing schema name and data bytes\n * @returns SigningMessage with messageBytes and human-readable text\n *\n * @example\n * ```typescript\n * import { buildCounterpartyMessage, serializeFeedback } from \"@cascade-fyi/sati-sdk\";\n *\n * // Build attestation data\n * const data = serializeFeedback({\n * taskRef: new Uint8Array(32),\n * agentMint: agentMintAddress,\n * counterparty: clientAddress,\n * outcome: Outcome.Positive,\n * dataHash: dataHash,\n * contentType: ContentType.JSON,\n * content: new TextEncoder().encode('{\"value\": 95, \"valueDecimals\": 0, \"tag1\": \"quality\"}'),\n * });\n *\n * // Build counterparty message\n * const { messageBytes, text } = buildCounterpartyMessage({\n * schemaName: \"Feedback\",\n * data,\n * });\n *\n * // Sign with wallet (Phantom will display the human-readable text)\n * const signature = await wallet.signMessage(messageBytes);\n *\n * // Pass messageBytes to the createAttestation instruction as counterparty_message\n * ```\n */\nexport function buildCounterpartyMessage(params: CounterpartyMessageParams): SigningMessage {\n const { schemaName, data } = params;\n\n if (data.length < OFFSETS.CONTENT) {\n throw new Error(`Data too small (minimum ${OFFSETS.CONTENT} bytes, got ${data.length})`);\n }\n\n // Extract fields from universal layout\n const taskRef = data.slice(OFFSETS.TASK_REF, OFFSETS.AGENT_MINT);\n const agentMint = data.slice(OFFSETS.AGENT_MINT, OFFSETS.COUNTERPARTY);\n const outcome = data[OFFSETS.OUTCOME] as Outcome;\n const contentType = data[OFFSETS.CONTENT_TYPE] as ContentType;\n const content = data.slice(OFFSETS.CONTENT);\n\n // Validate outcome\n if (outcome > 2) {\n throw new Error(`Invalid outcome value: ${outcome} (must be 0, 1, or 2)`);\n }\n\n // Format addresses as base58\n const agentMintB58 = bytesToBase58(agentMint);\n const taskRefB58 = bytesToBase58(taskRef);\n\n // Decode content for display\n const outcomeLabel = getOutcomeLabel(outcome);\n const detailsText = decodeContentForDisplay(content, contentType);\n\n // Build SIWS-style message\n const text = `SATI ${schemaName}\n\nAgent: ${agentMintB58}\nTask: ${taskRefB58}\nOutcome: ${outcomeLabel}\nDetails: ${detailsText}\n\nSign to create this attestation.`;\n\n return {\n messageBytes: new TextEncoder().encode(text),\n text,\n };\n}\n\n/**\n * Decode content bytes for human-readable display.\n */\nfunction decodeContentForDisplay(content: Uint8Array, contentType: ContentType): string {\n if (content.length === 0) {\n return \"(none)\";\n }\n\n switch (contentType) {\n case ContentType.None:\n return \"(none)\";\n case ContentType.JSON:\n case ContentType.UTF8:\n try {\n return new TextDecoder().decode(content);\n } catch {\n return `(${content.length} bytes)`;\n }\n case ContentType.IPFS:\n return `ipfs://${bytesToBase58(content)}`;\n case ContentType.Arweave:\n return `ar://${bytesToBase58(content)}`;\n case ContentType.Encrypted:\n return \"(encrypted)\";\n default:\n return `(${content.length} bytes)`;\n }\n}\n\n// ============================================================================\n// Legacy Message Builders (deprecated, but kept for backward compatibility)\n// ============================================================================\n\n/**\n * Parameters for building a feedback signing message (SIWS-style).\n * @deprecated Use buildCounterpartyMessage instead\n */\nexport interface FeedbackSigningParams {\n /** The 32-byte feedback hash computed by computeFeedbackHash */\n feedbackHash: Uint8Array;\n /** The feedback outcome (Negative=0, Neutral=1, Positive=2) */\n outcome: Outcome;\n /** The signer's wallet address (NFT owner) */\n ownerAddress: Address;\n /** The agent's mint address (for CAIP-10 identifier) */\n agentMint: Address;\n /** Solana network for CAIP-2 chain reference (defaults to mainnet) */\n network?: SolanaNetwork;\n}\n\n/**\n * Build a human-readable message for feedback attestation signing.\n *\n * @deprecated Use buildCounterpartyMessage instead. This function uses the legacy\n * hash-based signing format which has been replaced by SIWS messages in v2.\n *\n * Creates a UTF-8 encoded message that Phantom and other wallets will\n * display and allow signing. The signature can be verified on-chain\n * via Ed25519 precompile against the same message bytes.\n *\n * ## SIWS-Style Format (recommended)\n * Pass a FeedbackSigningParams object to get the full SIWS-style message\n * with CAIP-10 agent identifier:\n *\n * ```\n * sati.fyi wants you to attest with your Solana account:\n * {owner_address}\n *\n * Attestation: Feedback\n * Agent: solana:{chain_ref}:{agent_mint}\n * Outcome: Positive\n * Hash: 0x{hash}\n * ```\n *\n * ## Legacy Format (deprecated)\n * Pass (feedbackHash, outcome) directly for the compact format:\n *\n * ```\n * SATI:feedback:v1\n * Outcome: Positive\n * 0x{hash}\n * ```\n *\n * @example\n * ```typescript\n * import { buildFeedbackSigningMessage, computeFeedbackHash } from \"@cascade-fyi/sati-sdk\";\n *\n * // Compute the feedback hash\n * const feedbackHash = computeFeedbackHash(sasSchema, taskRef, agentMint, outcome);\n *\n * // SIWS-style (recommended)\n * const { messageBytes } = buildFeedbackSigningMessage({\n * feedbackHash,\n * outcome,\n * ownerAddress: wallet.publicKey,\n * agentMint,\n * network: \"mainnet\",\n * });\n *\n * // Sign with wallet (Phantom will display the human-readable text)\n * const signature = await wallet.signMessage(messageBytes);\n * ```\n */\nexport function buildFeedbackSigningMessage(params: FeedbackSigningParams): SigningMessage;\n/**\n * @deprecated Use the params object signature instead for SIWS-style messages\n */\nexport function buildFeedbackSigningMessage(feedbackHash: Uint8Array, outcome: Outcome): SigningMessage;\nexport function buildFeedbackSigningMessage(\n paramsOrHash: FeedbackSigningParams | Uint8Array,\n outcomeArg?: Outcome,\n): SigningMessage {\n // Handle legacy signature: (feedbackHash, outcome)\n if (paramsOrHash instanceof Uint8Array) {\n const feedbackHash = paramsOrHash;\n const outcome = outcomeArg as Outcome;\n\n if (feedbackHash.length !== 32) {\n throw new Error(\"feedbackHash must be 32 bytes\");\n }\n if (outcome < 0 || outcome > 2) {\n throw new Error(\"outcome must be 0, 1, or 2\");\n }\n\n const hexHash = bytesToHex(feedbackHash);\n const outcomeLabel = OUTCOME_LABELS[outcome];\n\n // Legacy compact format\n const text = `SATI:feedback:v1\nOutcome: ${outcomeLabel}\n0x${hexHash}`;\n\n return {\n messageBytes: new TextEncoder().encode(text),\n text,\n };\n }\n\n // SIWS-style params signature\n const { feedbackHash, outcome, ownerAddress, agentMint, network = \"mainnet\" } = paramsOrHash;\n\n if (feedbackHash.length !== 32) {\n throw new Error(\"feedbackHash must be 32 bytes\");\n }\n if (outcome < 0 || outcome > 2) {\n throw new Error(\"outcome must be 0, 1, or 2\");\n }\n\n const hexHash = bytesToHex(feedbackHash);\n const outcomeLabel = OUTCOME_LABELS[outcome];\n const agentCaip10 = formatCaip10(agentMint, network);\n\n // SIWS-inspired human-readable message\n const text = `${SATI_DOMAIN} wants you to attest with your Solana account:\n${ownerAddress}\n\nAttestation: Feedback\nAgent: ${agentCaip10}\nOutcome: ${outcomeLabel}\nHash: 0x${hexHash}`;\n\n return {\n messageBytes: new TextEncoder().encode(text),\n text,\n };\n}\n","/**\n * SATI Content Encryption Module\n *\n * End-to-end encrypted content using X25519-XChaCha20-Poly1305.\n *\n * ## Overview\n * - X25519 key exchange with ephemeral keypair (forward secrecy)\n * - XChaCha20-Poly1305 authenticated encryption (24-byte nonce)\n * - HKDF-SHA256 for key derivation\n * - Ed25519 → X25519 key conversion for Solana wallet compatibility\n *\n * ## Wire Format\n * | Offset | Size | Field |\n * |--------|------|-------|\n * | 0 | 1 | Version (0x01) |\n * | 1 | 32 | Ephemeral X25519 public key |\n * | 33 | 24 | XChaCha20 nonce |\n * | 57 | variable | Ciphertext + Poly1305 tag (16 bytes) |\n *\n * @packageDocumentation\n */\n\nimport { xchacha20poly1305 } from \"@noble/ciphers/chacha.js\";\nimport { randomBytes } from \"@noble/ciphers/utils.js\";\nimport { x25519, ed25519 } from \"@noble/curves/ed25519.js\";\nimport { hkdf } from \"@noble/hashes/hkdf.js\";\nimport { sha256 } from \"@noble/hashes/sha2.js\";\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Current encryption protocol version */\nexport const ENCRYPTION_VERSION = 1;\n\n/** XChaCha20 nonce size in bytes */\nexport const NONCE_SIZE = 24;\n\n/** X25519 public key size in bytes */\nexport const PUBKEY_SIZE = 32;\n\n/** Poly1305 authentication tag size in bytes */\nexport const TAG_SIZE = 16;\n\n/** X25519 private key size in bytes */\nexport const PRIVKEY_SIZE = 32;\n\n/**\n * Minimum encrypted payload size in bytes.\n * version (1) + ephemeral pubkey (32) + nonce (24) + tag (16) = 73 bytes\n */\nexport const MIN_ENCRYPTED_SIZE = 1 + PUBKEY_SIZE + NONCE_SIZE + TAG_SIZE;\n\n/** Maximum content size (from schemas.ts) */\nconst MAX_CONTENT_SIZE = 512;\n\n/** Maximum plaintext size after accounting for encryption overhead */\nexport const MAX_PLAINTEXT_SIZE = MAX_CONTENT_SIZE - MIN_ENCRYPTED_SIZE;\n\n/** HKDF info string for domain separation */\nconst HKDF_INFO = new TextEncoder().encode(\"sati-v1\");\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Encrypted payload structure.\n *\n * Contains all components needed for decryption:\n * - version: Protocol version for future upgrades\n * - ephemeralPubkey: Sender's X25519 public key for ECDH\n * - nonce: XChaCha20 nonce (24 bytes)\n * - ciphertext: Encrypted data + 16-byte Poly1305 tag\n */\nexport interface EncryptedPayload {\n /** Protocol version (currently 1) */\n version: number;\n /** Ephemeral X25519 public key (32 bytes) */\n ephemeralPubkey: Uint8Array;\n /** XChaCha20 nonce (24 bytes) */\n nonce: Uint8Array;\n /** Ciphertext including 16-byte Poly1305 authentication tag */\n ciphertext: Uint8Array;\n}\n\n/**\n * X25519 keypair for encryption operations.\n */\nexport interface EncryptionKeypair {\n /** X25519 public key (32 bytes) */\n publicKey: Uint8Array;\n /** X25519 private key (32 bytes) */\n privateKey: Uint8Array;\n}\n\n// ============================================================================\n// Key Derivation\n// ============================================================================\n\n/**\n * Derive an X25519 encryption keypair from an Ed25519 private key.\n *\n * This allows using existing Solana wallet keys for encryption.\n * The conversion is deterministic - same Ed25519 key always produces\n * the same X25519 keypair.\n *\n * @param ed25519PrivateKey - Ed25519 private key (32 or 64 bytes)\n * @returns X25519 keypair for encryption operations\n *\n * @example\n * ```typescript\n * // From Solana wallet secret key (64 bytes = 32 private + 32 public)\n * const { publicKey, privateKey } = deriveEncryptionKeypair(wallet.secretKey.slice(0, 32));\n *\n * // Use publicKey to receive encrypted content\n * // Use privateKey to decrypt received content\n * ```\n */\nexport function deriveEncryptionKeypair(ed25519PrivateKey: Uint8Array): EncryptionKeypair {\n // Handle both 32-byte seed and 64-byte full key\n const seed = ed25519PrivateKey.length === 64 ? ed25519PrivateKey.slice(0, 32) : ed25519PrivateKey;\n\n if (seed.length !== 32) {\n throw new Error(\"Ed25519 private key must be 32 or 64 bytes\");\n }\n\n // Get Ed25519 public key from seed\n const ed25519Public = ed25519.getPublicKey(seed);\n\n // Convert Ed25519 public key to X25519 (using v2 API)\n const x25519Public = ed25519.utils.toMontgomery(ed25519Public);\n\n // Convert Ed25519 private key to X25519 (using v2 API)\n const x25519Private = ed25519.utils.toMontgomerySecret(seed);\n\n return {\n publicKey: x25519Public,\n privateKey: x25519Private,\n };\n}\n\n/**\n * Derive X25519 public key from Ed25519 public key.\n *\n * Use this when you only have the recipient's Ed25519 public key\n * (e.g., from their Solana address).\n *\n * @param ed25519PublicKey - Ed25519 public key (32 bytes)\n * @returns X25519 public key for encryption\n *\n * @example\n * ```typescript\n * // Encrypt content for a Solana address\n * const x25519Pubkey = deriveEncryptionPublicKey(recipientEd25519Pubkey);\n * const encrypted = encryptContent(plaintext, x25519Pubkey);\n * ```\n */\nexport function deriveEncryptionPublicKey(ed25519PublicKey: Uint8Array): Uint8Array {\n if (ed25519PublicKey.length !== 32) {\n throw new Error(\"Ed25519 public key must be 32 bytes\");\n }\n // Convert Ed25519 public key to X25519 (using v2 API)\n return ed25519.utils.toMontgomery(ed25519PublicKey);\n}\n\n// ============================================================================\n// Encryption / Decryption\n// ============================================================================\n\n/**\n * Encrypt content for a recipient.\n *\n * Uses ephemeral X25519 keypair for forward secrecy - each encryption\n * generates a new keypair, so compromising a single ciphertext doesn't\n * reveal past or future messages.\n *\n * @param plaintext - Content to encrypt (max 439 bytes)\n * @param recipientPubkey - Recipient's X25519 public key (32 bytes)\n * @returns Encrypted payload with all components needed for decryption\n * @throws If plaintext exceeds maximum size or recipient key is invalid\n *\n * @example\n * ```typescript\n * const plaintext = new TextEncoder().encode(\"Great service!\");\n * const encrypted = encryptContent(plaintext, recipientX25519Pubkey);\n * const bytes = serializeEncryptedPayload(encrypted);\n * ```\n */\nexport function encryptContent(plaintext: Uint8Array, recipientPubkey: Uint8Array): EncryptedPayload {\n if (plaintext.length > MAX_PLAINTEXT_SIZE) {\n throw new Error(`Plaintext too large: ${plaintext.length} bytes (max ${MAX_PLAINTEXT_SIZE})`);\n }\n\n if (recipientPubkey.length !== PUBKEY_SIZE) {\n throw new Error(`Recipient public key must be ${PUBKEY_SIZE} bytes`);\n }\n\n // Generate ephemeral X25519 keypair\n const ephemeralPrivate = randomBytes(PRIVKEY_SIZE);\n const ephemeralPublic = x25519.getPublicKey(ephemeralPrivate);\n\n // Perform X25519 key exchange\n const sharedSecret = x25519.getSharedSecret(ephemeralPrivate, recipientPubkey);\n\n // Derive encryption key using HKDF with ephemeral public key as salt\n const encryptionKey = hkdf(sha256, sharedSecret, ephemeralPublic, HKDF_INFO, 32);\n\n // Generate random nonce\n const nonce = randomBytes(NONCE_SIZE);\n\n // Encrypt with XChaCha20-Poly1305\n const cipher = xchacha20poly1305(encryptionKey, nonce);\n const ciphertext = cipher.encrypt(plaintext);\n\n // Zero out sensitive material\n ephemeralPrivate.fill(0);\n sharedSecret.fill(0);\n encryptionKey.fill(0);\n\n return {\n version: ENCRYPTION_VERSION,\n ephemeralPubkey: ephemeralPublic,\n nonce,\n ciphertext,\n };\n}\n\n/**\n * Decrypt content using recipient's private key.\n *\n * @param payload - Encrypted payload from encryptContent\n * @param privateKey - Recipient's X25519 private key (32 bytes)\n * @returns Decrypted plaintext\n * @throws If decryption fails (wrong key, corrupted data, or tampered ciphertext)\n *\n * @example\n * ```typescript\n * const payload = deserializeEncryptedPayload(encryptedBytes);\n * const plaintext = decryptContent(payload, myX25519PrivateKey);\n * const text = new TextDecoder().decode(plaintext);\n * ```\n */\nexport function decryptContent(payload: EncryptedPayload, privateKey: Uint8Array): Uint8Array {\n if (payload.version !== ENCRYPTION_VERSION) {\n throw new Error(`Unsupported encryption version: ${payload.version}`);\n }\n\n if (privateKey.length !== PRIVKEY_SIZE) {\n throw new Error(`Private key must be ${PRIVKEY_SIZE} bytes`);\n }\n\n if (payload.ephemeralPubkey.length !== PUBKEY_SIZE) {\n throw new Error(`Ephemeral public key must be ${PUBKEY_SIZE} bytes`);\n }\n\n if (payload.nonce.length !== NONCE_SIZE) {\n throw new Error(`Nonce must be ${NONCE_SIZE} bytes`);\n }\n\n // Perform X25519 key exchange\n const sharedSecret = x25519.getSharedSecret(privateKey, payload.ephemeralPubkey);\n\n // Derive encryption key using HKDF with ephemeral public key as salt\n const encryptionKey = hkdf(sha256, sharedSecret, payload.ephemeralPubkey, HKDF_INFO, 32);\n\n // Decrypt with XChaCha20-Poly1305\n const cipher = xchacha20poly1305(encryptionKey, payload.nonce);\n const plaintext = cipher.decrypt(payload.ciphertext);\n\n // Zero out sensitive material\n sharedSecret.fill(0);\n encryptionKey.fill(0);\n\n return plaintext;\n}\n\n// ============================================================================\n// Serialization\n// ============================================================================\n\n/**\n * Serialize encrypted payload to bytes for on-chain storage.\n *\n * Wire format:\n * - byte 0: version\n * - bytes 1-32: ephemeral public key\n * - bytes 33-56: nonce\n * - bytes 57+: ciphertext (includes 16-byte auth tag)\n *\n * @param payload - Encrypted payload to serialize\n * @returns Serialized bytes suitable for storage in content field\n *\n * @example\n * ```typescript\n * const encrypted = encryptContent(plaintext, recipientPubkey);\n * const bytes = serializeEncryptedPayload(encrypted);\n *\n * const feedback: FeedbackData = {\n * contentType: ContentType.Encrypted,\n * content: bytes,\n * // ... other fields\n * };\n * ```\n */\nexport function serializeEncryptedPayload(payload: EncryptedPayload): Uint8Array {\n const totalSize = 1 + PUBKEY_SIZE + NONCE_SIZE + payload.ciphertext.length;\n const buffer = new Uint8Array(totalSize);\n\n let offset = 0;\n\n // Version (1 byte)\n buffer[offset++] = payload.version;\n\n // Ephemeral public key (32 bytes)\n buffer.set(payload.ephemeralPubkey, offset);\n offset += PUBKEY_SIZE;\n\n // Nonce (24 bytes)\n buffer.set(payload.nonce, offset);\n offset += NONCE_SIZE;\n\n // Ciphertext (variable length, includes auth tag)\n buffer.set(payload.ciphertext, offset);\n\n return buffer;\n}\n\n/**\n * Deserialize encrypted payload from bytes.\n *\n * @param bytes - Serialized encrypted payload\n * @returns Deserialized EncryptedPayload\n * @throws If bytes are too small or malformed\n *\n * @example\n * ```typescript\n * if (feedback.contentType === ContentType.Encrypted) {\n * const payload = deserializeEncryptedPayload(feedback.content);\n * const plaintext = decryptContent(payload, myPrivateKey);\n * }\n * ```\n */\nexport function deserializeEncryptedPayload(bytes: Uint8Array): EncryptedPayload {\n if (bytes.length < MIN_ENCRYPTED_SIZE) {\n throw new Error(`Encrypted payload too small: ${bytes.length} bytes (minimum ${MIN_ENCRYPTED_SIZE})`);\n }\n\n let offset = 0;\n\n // Version (1 byte)\n const version = bytes[offset++];\n\n if (version !== ENCRYPTION_VERSION) {\n throw new Error(`Unsupported encryption version: ${version} (supported: ${ENCRYPTION_VERSION})`);\n }\n\n // Ephemeral public key (32 bytes)\n const ephemeralPubkey = bytes.slice(offset, offset + PUBKEY_SIZE);\n offset += PUBKEY_SIZE;\n\n // Nonce (24 bytes)\n const nonce = bytes.slice(offset, offset + NONCE_SIZE);\n offset += NONCE_SIZE;\n\n // Ciphertext (remaining bytes, includes auth tag)\n const ciphertext = bytes.slice(offset);\n\n if (ciphertext.length < TAG_SIZE) {\n throw new Error(`Ciphertext too small: must include ${TAG_SIZE}-byte auth tag`);\n }\n\n return {\n version,\n ephemeralPubkey,\n nonce,\n ciphertext,\n };\n}\n","/**\n * Metadata upload abstractions for decentralized storage.\n *\n * Provides a pluggable `MetadataUploader` interface so consumers can\n * bring their own storage provider (Pinata, Arweave, local IPFS node, etc.).\n * A built-in Pinata implementation is included for convenience.\n *\n * @example\n * ```typescript\n * import { createPinataUploader, buildRegistrationFile } from \"@cascade-fyi/sati-sdk\";\n *\n * const uploader = createPinataUploader(process.env.PINATA_JWT!);\n * const regFile = buildRegistrationFile({ name: \"MyAgent\", description: \"...\", image: \"https://...\" });\n * const uri = await uploader.upload(regFile);\n * ```\n */\n\n/**\n * Provider-agnostic interface for uploading metadata JSON to decentralized storage.\n *\n * Implement this interface to use a custom storage provider with SATI.\n */\nexport interface MetadataUploader {\n /** Upload JSON-serializable data and return a URI (e.g. `ipfs://Qm...`, `ar://...`). */\n upload(data: unknown): Promise<string>;\n}\n\nconst SATI_UPLOAD_URL = \"https://sati.cascade.fyi/api/upload-metadata\";\n\n/**\n * Create a hosted SATI metadata uploader.\n *\n * Uploads JSON to the SATI Identity Service which pins it to IPFS via Pinata.\n * No API keys needed - zero-config alternative to `createPinataUploader()`.\n *\n * @returns MetadataUploader that uploads via sati.cascade.fyi\n *\n * @example\n * ```typescript\n * const uploader = createSatiUploader();\n * const uri = await uploader.upload({ name: \"MyAgent\" });\n * // \"ipfs://QmXyz...\"\n * ```\n */\nexport function createSatiUploader(): MetadataUploader {\n return {\n async upload(data: unknown): Promise<string> {\n const response = await fetch(SATI_UPLOAD_URL, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Metadata upload failed (${response.status}): ${text}`);\n }\n\n const result = (await response.json()) as { uri: string };\n return result.uri;\n },\n };\n}\n\ninterface PinataV3Response {\n data: {\n id: string;\n name: string;\n cid: string;\n created_at: string;\n size: number;\n number_of_files: number;\n mime_type: string;\n user_id: string;\n group_id: string | null;\n is_duplicate: boolean;\n };\n}\n\n/**\n * Create a Pinata IPFS uploader using the v3 Files API.\n *\n * @param jwt - Pinata API JWT token (requires `files:write` permission)\n * @returns MetadataUploader that pins JSON to public IPFS via Pinata\n *\n * @example\n * ```typescript\n * const uploader = createPinataUploader(process.env.PINATA_JWT!);\n * const uri = await uploader.upload({ name: \"MyAgent\" });\n * // \"ipfs://QmXyz...\"\n * ```\n */\nexport function createPinataUploader(jwt: string): MetadataUploader {\n return {\n async upload(data: unknown): Promise<string> {\n const jsonStr = JSON.stringify(data, null, 2);\n const blob = new Blob([jsonStr], { type: \"application/json\" });\n\n const formData = new FormData();\n formData.append(\"file\", blob, \"registration.json\");\n formData.append(\"network\", \"public\");\n\n const response = await fetch(\"https://uploads.pinata.cloud/v3/files\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${jwt}`,\n },\n body: formData,\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`IPFS upload failed (${response.status}): ${text}`);\n }\n\n const result = (await response.json()) as PinataV3Response;\n const cid = result.data?.cid;\n\n if (!cid) {\n throw new Error(`No CID returned from Pinata. Response: ${JSON.stringify(result)}`);\n }\n\n // Verify content is accessible on gateway (catches silent upload failures)\n try {\n const verifyResponse = await fetch(`https://gateway.pinata.cloud/ipfs/${cid}`, {\n signal: AbortSignal.timeout(5000),\n });\n if (!verifyResponse.ok && verifyResponse.status !== 429) {\n throw new Error(\n `Pinata returned CID ${cid} but content not accessible on gateway (HTTP ${verifyResponse.status})`,\n );\n }\n } catch (verifyError) {\n // Timeouts and rate limits are non-fatal - content may propagate with delay\n // Re-throw only genuine accessibility failures\n if (verifyError instanceof Error && verifyError.message.includes(\"not accessible\")) {\n throw verifyError;\n }\n }\n\n return `ipfs://${cid}`;\n },\n };\n}\n","{\n \"network\": \"devnet\",\n \"authority\": \"SQ2xxkJ6uEDHprYMNXPxS2AwyEtGGToZ7YC94icKH3Z\",\n \"deployedAt\": \"2026-02-10T13:55:02.691Z\",\n \"config\": {\n \"credential\": \"DQHW6fAhPfGAENuwJVYfzEvUN12DakZgaaGtPPRfGei1\",\n \"schemas\": {\n \"feedback\": \"CPSr2kXADrhfAykcLwr7mxaLtuG4EBkzei9xQCaEmRJS\",\n \"feedbackPublic\": \"7SvB6udRrxTsKLYyoMwCvrm2jiNLUCcWBnhzwDVCebss\",\n \"validation\": \"Ho7nAWqwrxi3AzasoVST2FTKfAbVopk9S6G5cb3Z3DMi\",\n \"reputationScore\": \"7MoXgvrFhMxmB84AfAtp8LGfC4sEXUHD6JCQJpfj2jTj\",\n \"delegate\": \"93wrAiBtCWgfVzToT6kU4zkPSvZpWbKDG3XUQEEHXBrk\"\n },\n \"lookupTable\": \"HGTEPmkGs2sWAzMw1CjBFKD2nVWBCAdHJeM8osoTibVQ\"\n }\n}\n","{\n \"network\": \"mainnet\",\n \"authority\": \"SQ2xxkJ6uEDHprYMNXPxS2AwyEtGGToZ7YC94icKH3Z\",\n \"deployedAt\": \"2026-02-10T14:20:59.279Z\",\n \"config\": {\n \"credential\": \"DQHW6fAhPfGAENuwJVYfzEvUN12DakZgaaGtPPRfGei1\",\n \"schemas\": {\n \"feedback\": \"CPSr2kXADrhfAykcLwr7mxaLtuG4EBkzei9xQCaEmRJS\",\n \"feedbackPublic\": \"7SvB6udRrxTsKLYyoMwCvrm2jiNLUCcWBnhzwDVCebss\",\n \"validation\": \"Ho7nAWqwrxi3AzasoVST2FTKfAbVopk9S6G5cb3Z3DMi\",\n \"reputationScore\": \"7MoXgvrFhMxmB84AfAtp8LGfC4sEXUHD6JCQJpfj2jTj\",\n \"delegate\": \"93wrAiBtCWgfVzToT6kU4zkPSvZpWbKDG3XUQEEHXBrk\"\n },\n \"lookupTable\": \"4XgHCijEGjWBch2wvs35XGBNLBdioQbVxLJhbr9AifAn\"\n }\n}\n","/**\n * Deployed SAS Configuration Loader\n *\n * Loads pre-deployed credential and schema addresses for each network.\n * This makes the SDK the source of truth - users just specify network\n * and schemas are automatically available.\n */\n\nimport type { SATISASConfig } from \"../types\";\n\n// Static imports for bundler compatibility (no require())\nimport devnetJson from \"./devnet.json\";\nimport mainnetJson from \"./mainnet.json\";\n\n// Extract config (handles placeholder files with null config)\ntype DeployedJson = {\n network: string;\n authority: string | null;\n deployedAt: string | null;\n config: SATISASConfig | null;\n};\n\nconst devnetConfig: SATISASConfig | null = (devnetJson as DeployedJson).config;\nconst mainnetConfig: SATISASConfig | null = (mainnetJson as DeployedJson).config;\n\nconst configs: Record<string, SATISASConfig | null> = {\n devnet: devnetConfig,\n mainnet: mainnetConfig,\n localnet: null, // Users must deploy locally\n};\n\n/**\n * Load deployed SAS configuration for a network\n *\n * @param network - Network identifier (\"devnet\", \"mainnet\", \"localnet\")\n * @returns SAS config if deployed, null otherwise\n */\nexport function loadDeployedConfig(network: string): SATISASConfig | null {\n return configs[network] ?? null;\n}\n\n/**\n * Check if a network has deployed SAS configuration\n *\n * @param network - Network identifier\n * @returns true if config exists for network\n */\nexport function hasDeployedConfig(network: string): boolean {\n return configs[network] !== null;\n}\n\n/**\n * Get list of networks with deployed configurations\n *\n * @returns Array of network names with deployed configs\n */\nexport function getDeployedNetworks(): string[] {\n return Object.entries(configs)\n .filter(([_, config]) => config !== null)\n .map(([network]) => network);\n}\n","/**\n * SATI Registration File\n *\n * Helpers for building, fetching, and working with ERC-8004 + Phantom\n * compatible registration files.\n *\n * @example\n * ```typescript\n * import {\n * buildRegistrationFile,\n * fetchRegistrationFile,\n * getImageUrl,\n * } from \"@cascade-fyi/sati-sdk\";\n *\n * // Build a registration file\n * const file = buildRegistrationFile({\n * name: \"MyAgent\",\n * description: \"AI assistant\",\n * image: \"https://example.com/avatar.png\",\n * });\n *\n * // Fetch from URI\n * const metadata = await fetchRegistrationFile(uri);\n * const imageUrl = getImageUrl(metadata);\n * ```\n */\n\nimport * as z from \"zod\";\n\n// ============================================================================\n// INTERNAL: Zod Schemas (not exported)\n// ============================================================================\n\nconst PropertyFileSchema = z.object({\n uri: z.url(),\n type: z.string(),\n});\n\nconst PropertiesSchema = z.object({\n files: z.array(PropertyFileSchema).min(1),\n category: z.enum([\"image\", \"video\", \"audio\"]).optional(),\n});\n\nconst EndpointSchema = z.object({\n name: z.string(),\n endpoint: z.string(),\n version: z.string().optional(),\n mcpTools: z.array(z.string()).optional(),\n mcpPrompts: z.array(z.string()).optional(),\n mcpResources: z.array(z.string()).optional(),\n a2aSkills: z.array(z.string()).optional(),\n skills: z.array(z.string()).optional(),\n domains: z.array(z.string()).optional(),\n});\n\nconst RegistrationEntrySchema = z.object({\n agentId: z.union([z.string(), z.number()]),\n agentRegistry: z.string(),\n});\n\nconst TrustMechanismSchema = z.enum([\"reputation\", \"crypto-economic\", \"tee-attestation\"]);\n\nconst RegistrationFileSchema = z.object({\n type: z.literal(\"https://eips.ethereum.org/EIPS/eip-8004#registration-v1\"),\n name: z.string().min(1),\n description: z.string().min(1),\n image: z.url(),\n properties: PropertiesSchema,\n external_url: z.url().optional(),\n services: z.array(EndpointSchema).optional(),\n registrations: z.array(RegistrationEntrySchema).optional(),\n supportedTrust: z.array(TrustMechanismSchema).optional(),\n active: z.boolean().optional().default(true),\n x402Support: z.boolean().optional(),\n});\n\n// ============================================================================\n// PUBLIC: TypeScript Types\n// ============================================================================\n\n/** File entry for Phantom/Metaplex wallet display */\nexport interface PropertyFile {\n uri: string;\n type: string;\n}\n\n/** Properties object for wallet compatibility */\nexport interface Properties {\n files: PropertyFile[];\n category?: \"image\" | \"video\" | \"audio\";\n}\n\n/** Service endpoint (ERC-8004) */\nexport interface Endpoint {\n name: string;\n endpoint: string;\n version?: string;\n mcpTools?: string[];\n mcpPrompts?: string[];\n mcpResources?: string[];\n a2aSkills?: string[];\n skills?: string[];\n domains?: string[];\n}\n\n/** Cross-chain registration entry (ERC-8004) */\nexport interface RegistrationEntry {\n agentId: string | number;\n agentRegistry: string;\n}\n\n/** Trust mechanism type */\nexport type TrustMechanism = \"reputation\" | \"crypto-economic\" | \"tee-attestation\";\n\n/**\n * Registration file schema (ERC-8004 + Phantom compatible)\n *\n * This is the off-chain JSON document referenced by the on-chain `uri` field.\n */\nexport interface RegistrationFile {\n /** Schema type identifier */\n type: \"https://eips.ethereum.org/EIPS/eip-8004#registration-v1\";\n /** Agent name */\n name: string;\n /** Agent description */\n description: string;\n /** Primary image URL */\n image: string;\n /** Properties for wallet display (required for Phantom) */\n properties: Properties;\n /** Project website URL */\n external_url?: string;\n /** Service endpoints (A2A, MCP, agentWallet) - ERC-8004 \"services\" array */\n services?: Endpoint[];\n /** Cross-chain registration entries */\n registrations?: RegistrationEntry[];\n /** Supported trust mechanisms */\n supportedTrust?: TrustMechanism[];\n /** Agent operational status */\n active?: boolean;\n /** Accepts x402 payments */\n x402Support?: boolean;\n}\n\n/** Input parameters for buildRegistrationFile */\nexport interface RegistrationFileParams {\n name: string;\n description: string;\n image: string;\n imageMimeType?: string;\n externalUrl?: string;\n services?: Endpoint[];\n registrations?: RegistrationEntry[];\n supportedTrust?: TrustMechanism[];\n active?: boolean;\n x402Support?: boolean;\n}\n\n// ============================================================================\n// PUBLIC: Helper Functions\n// ============================================================================\n\nconst MIME_TYPES: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n svg: \"image/svg+xml\",\n};\n\n/**\n * Infer MIME type from image URL extension.\n * Returns \"image/png\" as default if unrecognized.\n */\nexport function inferMimeType(url: string): string {\n const ext = url.split(\".\").pop()?.toLowerCase().split(\"?\")[0];\n return MIME_TYPES[ext ?? \"\"] ?? \"image/png\";\n}\n\n/**\n * Build a registration file from parameters.\n *\n * Automatically:\n * - Sets the ERC-8004 type identifier\n * - Generates properties.files from image URL\n * - Infers MIME type from extension\n * - Sets active to true by default\n *\n * @throws Error if required fields are missing or invalid\n */\nexport function buildRegistrationFile(params: RegistrationFileParams): RegistrationFile {\n const mimeType = params.imageMimeType ?? inferMimeType(params.image);\n\n const file = {\n type: \"https://eips.ethereum.org/EIPS/eip-8004#registration-v1\" as const,\n name: params.name,\n description: params.description,\n image: params.image,\n properties: {\n files: [{ uri: params.image, type: mimeType }],\n category: \"image\" as const,\n },\n ...(params.externalUrl && { external_url: params.externalUrl }),\n ...(params.services?.length && { services: params.services }),\n ...(params.registrations?.length && {\n registrations: params.registrations,\n }),\n ...(params.supportedTrust?.length && {\n supportedTrust: params.supportedTrust,\n }),\n active: params.active ?? true,\n ...(params.x402Support !== undefined && {\n x402Support: params.x402Support,\n }),\n };\n\n // Validate with Zod (throws on error)\n return RegistrationFileSchema.parse(file);\n}\n\n/**\n * Fetch and parse a registration file from URI.\n *\n * - Returns null on network errors or invalid URIs\n * - Validates structure, returns raw data for non-conforming files\n * - Never throws, never logs to console\n */\nexport async function fetchRegistrationFile(uri: string): Promise<RegistrationFile | null> {\n if (!uri) return null;\n\n // Convert IPFS/Arweave URIs to gateway URLs\n let url = uri;\n if (uri.startsWith(\"ipfs://\")) {\n url = `https://ipfs.io/ipfs/${uri.slice(7)}`;\n } else if (uri.startsWith(\"ar://\")) {\n url = `https://arweave.net/${uri.slice(5)}`;\n } else if (!uri.startsWith(\"http://\") && !uri.startsWith(\"https://\")) {\n return null;\n }\n\n try {\n const response = await fetch(url);\n if (!response.ok) {\n return null;\n }\n\n const data = await response.json();\n const result = RegistrationFileSchema.safeParse(data);\n\n if (!result.success) {\n // Return raw data for backwards compatibility with non-conforming files\n return data as RegistrationFile;\n }\n\n return result.data;\n } catch {\n return null;\n }\n}\n\n/**\n * Extract image URL from a registration file.\n *\n * Prefers properties.files (Phantom format), falls back to image field.\n * Handles IPFS/Arweave URI conversion.\n */\nexport function getImageUrl(file: RegistrationFile | null | undefined): string | null {\n if (!file) return null;\n\n // Prefer properties.files (Phantom format)\n const fileUri = file.properties?.files?.[0]?.uri;\n const uri = fileUri ?? file.image;\n\n if (!uri) return null;\n\n // Convert protocol URIs to gateway URLs\n if (uri.startsWith(\"ipfs://\")) {\n return `https://ipfs.io/ipfs/${uri.slice(7)}`;\n }\n if (uri.startsWith(\"ar://\")) {\n return `https://arweave.net/${uri.slice(5)}`;\n }\n if (uri.startsWith(\"http://\") || uri.startsWith(\"https://\")) {\n return uri;\n }\n\n return null;\n}\n\n/**\n * Serialize a registration file to JSON string.\n */\nexport function stringifyRegistrationFile(file: RegistrationFile, space = 2): string {\n return JSON.stringify(file, null, space);\n}\n\n// ============================================================================\n// SATI Registration Helpers\n// ============================================================================\n\n/** CAIP-2 chain identifier for Solana mainnet */\nexport const SATI_CHAIN_ID = \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\";\n\n/** SATI program ID */\nexport const SATI_PROGRAM_ID = \"satiRkxEiwZ51cv8PRu8UMzuaqeaNU9jABo6oAFMsLe\";\n\n/**\n * Build a registrations[] entry for linking a SATI agent to an off-chain registration file.\n *\n * @param agentMint - SATI agent mint address\n * @returns RegistrationEntry for the registrations[] array\n *\n * @example\n * ```typescript\n * const entry = buildSatiRegistrationEntry(\"AgentMint...\");\n * // { agentId: \"AgentMint...\", agentRegistry: \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp:satiR3q7...\" }\n * ```\n */\nexport function buildSatiRegistrationEntry(agentMint: string): RegistrationEntry {\n return {\n agentId: agentMint,\n agentRegistry: `${SATI_CHAIN_ID}:${SATI_PROGRAM_ID}`,\n };\n}\n\n/**\n * Check if a registration file contains a SATI registration.\n *\n * @param file - Registration file to check\n * @returns true if file contains at least one SATI registration\n */\nexport function hasSatiRegistration(file: RegistrationFile): boolean {\n return (\n file.registrations?.some((r) => typeof r.agentRegistry === \"string\" && r.agentRegistry.startsWith(SATI_CHAIN_ID)) ??\n false\n );\n}\n\n/**\n * Find SATI agent IDs from a registration file.\n *\n * @param file - Registration file to search\n * @returns Array of SATI agent mint addresses\n */\nexport function getSatiAgentIds(file: RegistrationFile): string[] {\n return (\n file.registrations\n ?.filter((r) => typeof r.agentRegistry === \"string\" && r.agentRegistry.startsWith(SATI_CHAIN_ID))\n .map((r) => String(r.agentId)) ?? []\n );\n}\n","/**\n * Simple TTL cache for feedback query results.\n *\n * Reduces redundant RPC calls when the same feedback data is queried\n * multiple times in quick succession (e.g. listing then revoking,\n * or dashboard re-renders).\n *\n * Automatically invalidated after write operations (giveFeedback,\n * revokeFeedback, submitPreparedFeedback).\n */\n\ninterface CacheEntry<T> {\n data: T;\n expires: number;\n}\n\nexport class FeedbackCache {\n private cache = new Map<string, CacheEntry<unknown>>();\n\n constructor(private readonly ttlMs = 30_000) {}\n\n /** Get cached data or null if expired/missing. */\n get<T>(key: string): T | null {\n const entry = this.cache.get(key);\n if (!entry || Date.now() > entry.expires) {\n if (entry) this.cache.delete(key);\n return null;\n }\n return entry.data as T;\n }\n\n /** Store data with TTL. */\n set<T>(key: string, data: T): void {\n this.cache.set(key, { data, expires: Date.now() + this.ttlMs });\n }\n\n /** Invalidate a specific key, or all entries if no key given. */\n invalidate(key?: string): void {\n if (key) {\n this.cache.delete(key);\n } else {\n this.cache.clear();\n }\n }\n\n /** Build a cache key from schema and optional agent mint. */\n static cacheKey(sasSchema: string, agentMint?: string): string {\n return `${sasSchema}:${agentMint ?? \"*\"}`;\n }\n}\n","/**\n * Fluent builder for SATI agent registration and management.\n *\n * Uses sati-sdk native types (no agent0-sdk dependency).\n *\n * @example\n * ```typescript\n * const builder = sati.createAgentBuilder(\"MyAgent\", \"AI assistant\", \"https://example.com/avatar.png\");\n * builder\n * .setMCP(\"https://mcp.example.com\", \"2025-06-18\", { tools: [\"search\", \"summarize\"] })\n * .setA2A(\"https://a2a.example.com/.well-known/agent-card.json\")\n * .setActive(true)\n * .setX402Support(true);\n *\n * const result = await builder.register({\n * payer,\n * uploader: createSatiUploader(),\n * });\n * ```\n */\n\nimport type { Address, KeyPairSigner } from \"@solana/kit\";\nimport type { AgentIdentity, RegisterAgentResult } from \"./types\";\nimport type { Endpoint, RegistrationFileParams, TrustMechanism } from \"./registration\";\nimport type { MetadataUploader } from \"./uploaders\";\nimport type { Sati } from \"./client\";\n\nexport class SatiAgentBuilder {\n private _params: RegistrationFileParams;\n private _identity: AgentIdentity | undefined;\n private readonly _sati: Sati;\n\n constructor(sati: Sati, name: string, description: string, image: string) {\n this._sati = sati;\n this._params = {\n name,\n description,\n image,\n services: [],\n active: true,\n };\n }\n\n // =========================================================================\n // Read-only accessors\n // =========================================================================\n\n /** Current registration file parameters. */\n get params(): RegistrationFileParams {\n return this._params;\n }\n\n /** On-chain identity (available after register/load). */\n get identity(): AgentIdentity | undefined {\n return this._identity;\n }\n\n // =========================================================================\n // Fluent setters\n // =========================================================================\n\n /** Set a generic endpoint. */\n setEndpoint(endpoint: Endpoint): this {\n if (!this._params.services) this._params.services = [];\n this._params.services = this._params.services.filter((ep) => ep.name !== endpoint.name);\n this._params.services.push(endpoint);\n return this;\n }\n\n /**\n * Set MCP endpoint.\n *\n * Unlike agent0-sdk's `SatiAgent.setMCP()`, this does NOT auto-fetch capabilities.\n * Pass tools/prompts/resources explicitly via the `meta` parameter.\n */\n setMCP(url: string, version?: string, meta?: { tools?: string[]; prompts?: string[]; resources?: string[] }): this {\n return this.setEndpoint({\n name: \"MCP\",\n endpoint: url,\n ...(version && { version }),\n ...(meta?.tools?.length && { mcpTools: meta.tools }),\n ...(meta?.prompts?.length && { mcpPrompts: meta.prompts }),\n ...(meta?.resources?.length && { mcpResources: meta.resources }),\n });\n }\n\n /** Set A2A endpoint. */\n setA2A(url: string, version?: string, meta?: { skills?: string[] }): this {\n return this.setEndpoint({\n name: \"A2A\",\n endpoint: url,\n ...(version && { version }),\n ...(meta?.skills?.length && { a2aSkills: meta.skills }),\n });\n }\n\n /** Set wallet endpoint. */\n setWallet(address: string): this {\n return this.setEndpoint({\n name: \"agentWallet\",\n endpoint: address,\n });\n }\n\n /** Remove an endpoint by name. */\n removeEndpoint(name: string): this {\n if (this._params.services) {\n this._params.services = this._params.services.filter((ep) => ep.name !== name);\n }\n return this;\n }\n\n /** Set agent active status. */\n setActive(active: boolean): this {\n this._params.active = active;\n return this;\n }\n\n /** Set x402 payment support. */\n setX402Support(x402: boolean): this {\n this._params.x402Support = x402;\n return this;\n }\n\n /** Set supported trust mechanisms. */\n setSupportedTrust(trusts: TrustMechanism[]): this {\n this._params.supportedTrust = trusts;\n return this;\n }\n\n /** Set external URL. */\n setExternalUrl(url: string): this {\n this._params.externalUrl = url;\n return this;\n }\n\n /** Update basic info. */\n updateInfo(opts: { name?: string; description?: string; image?: string }): this {\n if (opts.name !== undefined) this._params.name = opts.name;\n if (opts.description !== undefined) this._params.description = opts.description;\n if (opts.image !== undefined) this._params.image = opts.image;\n return this;\n }\n\n // =========================================================================\n // On-chain operations\n // =========================================================================\n\n /**\n * Upload registration file and register agent on-chain.\n *\n * @returns Registration result with mint address, member number, and signature\n */\n async register(opts: {\n payer: KeyPairSigner;\n uploader: MetadataUploader;\n nonTransferable?: boolean;\n owner?: Address;\n }): Promise<RegisterAgentResult> {\n const uri = await this._sati.uploadRegistrationFile(this._params, opts.uploader);\n return this._registerWithUri(uri, opts);\n }\n\n /**\n * Register agent on-chain with a pre-existing URI.\n *\n * Use when you already have a hosted registration file.\n */\n async registerWithUri(opts: {\n payer: KeyPairSigner;\n uri: string;\n nonTransferable?: boolean;\n owner?: Address;\n }): Promise<RegisterAgentResult> {\n return this._registerWithUri(opts.uri, opts);\n }\n\n /**\n * Re-upload registration file and update the on-chain URI.\n *\n * Use after modifying the builder via fluent setters.\n */\n async update(opts: {\n payer: KeyPairSigner;\n owner: KeyPairSigner;\n uploader: MetadataUploader;\n }): Promise<{ signature: string }> {\n if (!this._identity) {\n throw new Error(\"Agent not registered on-chain. Call register() first.\");\n }\n const uri = await this._sati.uploadRegistrationFile(this._params, opts.uploader);\n return this._updateUri(uri, opts);\n }\n\n /**\n * Update the on-chain URI to point to a new registration file.\n */\n async updateUri(opts: { payer: KeyPairSigner; owner: KeyPairSigner; uri: string }): Promise<{ signature: string }> {\n if (!this._identity) {\n throw new Error(\"Agent not registered on-chain. Call register() first.\");\n }\n return this._updateUri(opts.uri, opts);\n }\n\n /**\n * Load existing on-chain identity into this builder.\n * Useful for wrapping an already-registered agent.\n */\n setIdentity(identity: AgentIdentity): this {\n this._identity = identity;\n return this;\n }\n\n // =========================================================================\n // Private helpers\n // =========================================================================\n\n private async _registerWithUri(\n uri: string,\n opts: { payer: KeyPairSigner; nonTransferable?: boolean; owner?: Address },\n ): Promise<RegisterAgentResult> {\n if (this._identity) {\n throw new Error(\"Agent is already registered on-chain. Use update() instead.\");\n }\n\n const result = await this._sati.registerAgent({\n payer: opts.payer,\n name: this._params.name,\n uri,\n nonTransferable: opts.nonTransferable,\n owner: opts.owner,\n });\n\n this._identity = {\n mint: result.mint,\n owner: opts.owner ?? opts.payer.address,\n name: this._params.name,\n uri,\n memberNumber: result.memberNumber,\n additionalMetadata: {},\n nonTransferable: opts.nonTransferable ?? false,\n };\n\n return result;\n }\n\n private async _updateUri(\n uri: string,\n opts: { payer: KeyPairSigner; owner: KeyPairSigner },\n ): Promise<{ signature: string }> {\n const identity = this._identity;\n if (!identity) {\n throw new Error(\"Agent not registered on-chain. Call register() first.\");\n }\n\n const result = await this._sati.updateAgentMetadata({\n payer: opts.payer,\n owner: opts.owner,\n mint: identity.mint,\n updates: { uri },\n });\n\n identity.uri = uri;\n return { signature: result.signature };\n }\n}\n","/**\n * SATI Client - High-Level SDK Interface\n *\n * Provides a convenient wrapper around the generated Codama client\n * for the Solana Agent Trust Infrastructure.\n *\n * Features:\n * - Agent registration via Token-2022 NFT minting\n * - Compressed attestations via Light Protocol (Feedback, Validation)\n * - Regular attestations via SAS (ReputationScoreV3)\n * - Ed25519 signature building for blind feedback model\n *\n * @see https://github.com/cascade-protocol/sati\n */\n\nimport {\n pipe,\n generateKeyPairSigner,\n signTransactionMessageWithSigners,\n createTransactionMessage,\n setTransactionMessageFeePayer,\n setTransactionMessageLifetimeUsingBlockhash,\n appendTransactionMessageInstruction,\n appendTransactionMessageInstructions,\n addSignersToTransactionMessage,\n compressTransactionMessageUsingAddressLookupTables,\n compileTransaction,\n getSignatureFromTransaction,\n getAddressEncoder,\n getAddressDecoder,\n createSolanaRpc,\n createSolanaRpcSubscriptions,\n sendAndConfirmTransactionFactory,\n address,\n verifySignature,\n signatureBytes,\n signBytes,\n type Address,\n type KeyPairSigner,\n type AddressesByLookupTableAddress,\n type Base58EncodedBytes,\n} from \"@solana/kit\";\n\nimport {\n fetchMint as fetchToken2022Mint,\n fetchToken as fetchToken2022Token,\n getTransferInstruction,\n getUpdateTokenMetadataUpdateAuthorityInstruction,\n getUpdateTokenMetadataFieldInstruction,\n tokenMetadataField,\n getCreateAssociatedTokenIdempotentInstruction,\n type Extension,\n} from \"@solana-program/token-2022\";\n\nimport { fetchAddressLookupTable } from \"@solana-program/address-lookup-table\";\nimport { getSetComputeUnitLimitInstruction } from \"@solana-program/compute-budget\";\n\nimport {\n getRegisterAgentInstructionAsync,\n getRegisterSchemaConfigInstructionAsync,\n getCreateCompressedAttestationInstructionAsync,\n getCloseCompressedAttestationInstructionAsync,\n getCloseRegularAttestationInstructionAsync,\n getCreateRegularAttestationInstructionAsync,\n getLinkEvmAddressInstruction,\n fetchRegistryConfig,\n fetchSchemaConfig,\n fetchMaybeAgentIndex,\n fetchAllMaybeAgentIndex,\n SATI_PROGRAM_ADDRESS,\n type ValidityProofArgs,\n type PackedAddressTreeInfoArgs,\n type CompressedAccountMetaArgs,\n} from \"./generated\";\n\nimport {\n findAssociatedTokenAddress,\n findRegistryConfigPda,\n findSchemaConfigPda,\n findAgentIndexPda,\n TOKEN_2022_PROGRAM_ADDRESS,\n} from \"./helpers\";\n\nimport {\n computeInteractionHash,\n computeAttestationNonce,\n computeReputationNonce,\n computeEvmLinkHash,\n zeroDataHash,\n Outcome,\n} from \"./hashes\";\n\nimport { buildCounterpartyMessage } from \"./offchain-signing\";\n\nimport {\n ContentType,\n getContentTypeLabel,\n serializeFeedback,\n serializeValidation,\n serializeReputationScore,\n deserializeReputationScore,\n SAS_HEADER_SIZE,\n SAS_DATA_LEN_OFFSET,\n validateContentSize,\n type FeedbackData,\n type ValidationData,\n type ReputationScoreData,\n} from \"./schemas\";\n\nimport { SignatureMode, type StorageType } from \"./generated\";\n\nimport {\n type SATILightClient as LightClient,\n createSATILightClient,\n type ParsedAttestation,\n type ParsedFeedbackAttestation,\n type ParsedValidationAttestation,\n type AttestationFilter,\n type PaginatedAttestations,\n} from \"./compression\";\n\nimport { importEd25519PublicKey } from \"@cascade-fyi/compression-kit\";\n\n// Note: SAS schema setup is available via setupSASSchemas() from \"@cascade-fyi/sati-sdk/sas\"\n\nimport { deriveReputationAttestationPda, deriveSasEventAuthorityPda, SAS_PROGRAM_ADDRESS } from \"./sas-pdas\";\n\nimport { createBatchEd25519Instruction } from \"./ed25519\";\n\nimport { buildRegistrationFile, fetchRegistrationFile, type RegistrationFileParams } from \"./registration\";\n\nimport type { MetadataUploader } from \"./uploaders\";\n\nimport type {\n SATIClientOptions,\n SatiWarning,\n SATISASConfig,\n AgentIdentity,\n RegisterAgentResult,\n UpdateAgentMetadataParams,\n UpdateAgentMetadataResult,\n CloseCompressedAttestationParams,\n CloseRegularAttestationParams,\n CloseAttestationResult,\n SignatureVerificationResult,\n LinkEvmAddressResult,\n} from \"./types\";\n\nimport { loadDeployedConfig } from \"./deployed\";\nimport { FeedbackCache } from \"./cache\";\nimport { SatiAgentBuilder } from \"./agent-builder\";\n\nimport type {\n GiveFeedbackParams,\n GiveFeedbackResult,\n PreparedFeedbackData,\n FeedbackSearchOptions,\n ParsedFeedback,\n ReputationSummary,\n AgentSearchOptions,\n AgentSearchResult,\n ParsedValidation,\n} from \"./convenience\";\n\n// Re-export enums and types\nexport { Outcome } from \"./hashes\";\nexport { DataType, ContentType, ValidationType } from \"./schemas\";\nexport { SignatureMode, StorageType } from \"./generated\";\n\n// Default RPC URLs\nconst RPC_URLS = {\n mainnet: \"https://api.mainnet-beta.solana.com\",\n devnet: \"https://api.devnet.solana.com\",\n localnet: \"http://127.0.0.1:8899\",\n} as const;\n\n// Default WebSocket URLs\nconst WS_URLS = {\n mainnet: \"wss://api.mainnet-beta.solana.com\",\n devnet: \"wss://api.devnet.solana.com\",\n localnet: \"ws://127.0.0.1:8900\",\n} as const;\n\n// Default Photon RPC URLs (hosted proxy for zero-config experience)\nconst PHOTON_URLS = {\n mainnet: \"https://sati.cascade.fyi/api/photon/mainnet\",\n devnet: \"https://sati.cascade.fyi/api/photon/devnet\",\n localnet: \"http://127.0.0.1:8899\",\n} as const;\n\n// ============================================================\n// TYPES\n// ============================================================\n\n/**\n * Type for a 64-byte Ed25519 signature\n */\ntype Signature64 = Uint8Array & { length: 64 };\n\n/**\n * Type helper for signed transactions with blockhash lifetime.\n */\ntype SignedBlockhashTransaction = Awaited<ReturnType<typeof signTransactionMessageWithSigners>> & {\n lifetimeConstraint: { lastValidBlockHeight: bigint; blockhash: string };\n};\n\n/**\n * Attestation creation result\n */\nexport interface AttestationResult {\n /** Attestation address (compressed account address or SAS PDA) */\n address: Address;\n /** Transaction signature */\n signature: string;\n}\n\n/**\n * Built transaction ready for signing\n */\nexport interface BuiltTransaction {\n /** Attestation address that will be created */\n attestationAddress: Address;\n /** Base64-encoded transaction message bytes */\n messageBytes: string;\n /** Addresses that need to sign (first one is fee payer) */\n signers: Address[];\n /** Blockhash used for the transaction */\n blockhash: string;\n /** Last valid block height for the transaction */\n lastValidBlockHeight: bigint;\n}\n\n/**\n * Signature data with pubkey for attestation creation\n */\nexport interface SignatureInput {\n /** Public key that signed */\n pubkey: Address;\n /** 64-byte Ed25519 signature */\n signature: Uint8Array;\n}\n\n/**\n * Parameters for creating a Feedback attestation\n *\n * Uses universal base layout (131 bytes):\n * - task_ref(32) + agent_mint(32) + counterparty(32) +\n * - outcome(1) + data_hash(32) + content_type(1) + content(variable)\n */\nexport interface CreateFeedbackParams {\n /** Payer for transaction fees */\n payer: KeyPairSigner;\n /** SAS schema address for this feedback type */\n sasSchema: Address;\n /** Task reference (CAIP-220 tx hash or arbitrary ID) */\n taskRef: Uint8Array;\n /** Agent's mint address (Token-2022 NFT identity) */\n agentMint: Address;\n /** Client (feedback giver) */\n counterparty: Address;\n /** Hash of request/interaction data for agent's blind signature */\n dataHash: Uint8Array;\n /** Feedback outcome */\n outcome: Outcome;\n /** Content format */\n contentType?: ContentType;\n /**\n * Variable-length content (optional).\n *\n * **Size Limits (enforced at runtime):**\n * - DualSignature mode (with counterpartySignature): max ~70 bytes\n * - SingleSignature mode (FeedbackPublic): max ~240 bytes\n *\n * For larger content, use ContentType.IPFS or ContentType.Arweave\n * and store only the reference hash (32-36 bytes).\n *\n * @example\n * ```typescript\n * // Small content (fits in DualSignature)\n * content: new TextEncoder().encode('{\"value\":85,\"valueDecimals\":0,\"tag1\":\"starred\"}')\n *\n * // Large content (use IPFS reference)\n * contentType: ContentType.IPFS,\n * content: ipfsCidBytes // 36-byte CIDv1\n * ```\n */\n content?: Uint8Array;\n /** Agent's signature (signs interaction_hash) */\n agentSignature: SignatureInput;\n /** Counterparty's signature (signs SIWS message) - optional for CounterpartySigned schemas */\n counterpartySignature?: SignatureInput;\n /** SIWS message bytes that counterparty signed - required for DualSignature schemas */\n counterpartyMessage?: Uint8Array;\n /** Optional address lookup table for transaction compression */\n lookupTableAddress?: Address;\n /**\n * Skip WebSocket-based transaction confirmation.\n * Use this in serverless environments (e.g., Cloudflare Workers) that don't support\n * outbound WebSocket connections. When true, returns immediately after sending the\n * transaction without waiting for confirmation.\n */\n skipConfirmation?: boolean;\n}\n\n/**\n * Parameters for building a Feedback transaction (without signing/sending)\n *\n * Uses universal base layout (131 bytes):\n * - task_ref(32) + agent_mint(32) + counterparty(32) +\n * - outcome(1) + data_hash(32) + content_type(1) + content(variable)\n */\nexport interface BuildFeedbackParams {\n /** Fee payer address (will sign in browser) */\n payer: Address;\n /** SAS schema address for this feedback type */\n sasSchema: Address;\n /** Task reference (CAIP-220 tx hash or arbitrary ID) */\n taskRef: Uint8Array;\n /** Agent's mint address (Token-2022 NFT identity) */\n agentMint: Address;\n /** Client (feedback giver) */\n counterparty: Address;\n /** Hash of request/interaction data for agent's blind signature */\n dataHash: Uint8Array;\n /** Feedback outcome */\n outcome: Outcome;\n /** Content format */\n contentType?: ContentType;\n /**\n * Variable-length content (optional).\n *\n * **Size Limits (enforced at runtime):**\n * - DualSignature mode (with counterpartySignature): max ~70 bytes\n * - SingleSignature mode (FeedbackPublic): max ~240 bytes\n *\n * For larger content, use ContentType.IPFS or ContentType.Arweave\n * and store only the reference hash (32-36 bytes).\n */\n content?: Uint8Array;\n /** Agent's signature (signs interaction_hash) */\n agentSignature: SignatureInput;\n /** Counterparty's signature (signs SIWS message) - optional for CounterpartySigned schemas */\n counterpartySignature?: SignatureInput;\n /** SIWS message bytes that counterparty signed - required for DualSignature schemas */\n counterpartyMessage?: Uint8Array;\n /** Optional address lookup table for transaction compression */\n lookupTableAddress?: Address;\n}\n\n/**\n * Parameters for creating a Validation attestation\n */\nexport interface CreateValidationParams {\n /** Payer for transaction fees */\n payer: KeyPairSigner;\n /** SAS schema address */\n sasSchema: Address;\n /** Task reference */\n taskRef: Uint8Array;\n /** Agent's mint address (Token-2022 NFT identity) */\n agentMint: Address;\n /** Validator address */\n counterparty: Address;\n /** Hash of work being validated */\n dataHash: Uint8Array;\n /** Outcome: Positive (2) for pass, Negative (0) for fail, Neutral (1) for inconclusive */\n outcome: Outcome;\n /** Content format */\n contentType?: ContentType;\n /**\n * Variable-length content (JSON with validation details).\n *\n * **Size Limit (enforced at runtime):** max ~70 bytes\n *\n * Validation attestations always use DualSignature mode (agent + validator),\n * so content is limited due to SIWS message duplication.\n *\n * For larger content, use ContentType.IPFS or ContentType.Arweave\n * and store only the reference hash (32-36 bytes).\n */\n content?: Uint8Array;\n /** Agent's signature (blind) */\n agentSignature: SignatureInput;\n /** Validator's signature (SIWS message) */\n validatorSignature: SignatureInput;\n /** SIWS message bytes signed by validator */\n counterpartyMessage?: Uint8Array;\n /** Optional address lookup table for transaction compression */\n lookupTableAddress?: Address;\n}\n\n/**\n * Parameters for creating a ReputationScoreV3 attestation\n */\nexport interface CreateReputationScoreParams {\n /** Payer for transaction fees */\n payer: KeyPairSigner;\n /** Provider (reputation scorer) address */\n provider: Address;\n /** Provider's signature over the interaction hash */\n providerSignature: Uint8Array;\n /** SAS schema address */\n sasSchema: Address;\n /** SATI credential address in SAS */\n satiCredential: Address;\n /** Agent's mint address (Token-2022 NFT identity) being scored */\n agentMint: Address;\n /** Task reference (e.g., hash of provider identity or scoring context) */\n taskRef: Uint8Array;\n /** Hash of methodology/data used for scoring */\n dataHash: Uint8Array;\n /** Outcome: typically Positive for good score */\n outcome: Outcome;\n /** Content format */\n contentType?: ContentType;\n /**\n * Methodology/details content (JSON with score, components, etc.).\n *\n * **Size Limit:** max ~240 bytes\n *\n * ReputationScoreV3 uses SingleSignature mode, so has more headroom than\n * DualSignature schemas (Feedback, Validation).\n */\n content?: Uint8Array;\n /** Expiry timestamp (0 = never expires) */\n expiry?: number;\n}\n\n/**\n * Parameters for updating a ReputationScoreV3 attestation.\n *\n * High-level convenience method: auto-computes deterministic taskRef and\n * zero dataHash per spec. If a score already exists for this (provider, agent)\n * pair, it is closed first and a new one is created at the same PDA.\n *\n * Provider must be a KeyPairSigner because it signs both the close transaction\n * and the Ed25519 precompile instruction for create.\n */\nexport interface UpdateReputationScoreParams {\n /** Payer for transaction fees */\n payer: KeyPairSigner;\n /** Provider (reputation scorer) - must be KeyPairSigner to sign close + Ed25519 */\n provider: KeyPairSigner;\n /** SAS schema address */\n sasSchema: Address;\n /** SATI credential address in SAS */\n satiCredential: Address;\n /** Agent's mint address (Token-2022 NFT identity) being scored */\n agentMint: Address;\n /** Outcome: 0=Poor, 1=Average, 2=Good */\n outcome: Outcome;\n /** Content format (defaults to ContentType.None) */\n contentType?: ContentType;\n /** JSON content bytes (score, methodology, feedbackCount, validationCount). Required when contentType is not None. */\n content?: Uint8Array;\n /** Expiry timestamp (0 = never expires) */\n expiry?: number;\n}\n\n// ============================================================\n// HELPERS\n// ============================================================\n\n/**\n * Convert an Address to Base58EncodedBytes for RPC memcmp filters.\n */\nfunction addressToBase58Bytes(addr: Address): Base58EncodedBytes {\n return addr as unknown as Base58EncodedBytes;\n}\n\n/**\n * Validate and cast a signature to the expected 64-byte type.\n */\nfunction assertSignature64(sig: Uint8Array): Signature64 {\n if (sig.length !== 64) {\n throw new Error(`Invalid signature length: expected 64 bytes, got ${sig.length}`);\n }\n return sig as Signature64;\n}\n\n/**\n * Helper to unwrap Option type from @solana/kit\n */\nfunction unwrapOption<T>(option: { __option: \"Some\"; value: T } | { __option: \"None\" }): T | null {\n if (option.__option === \"Some\") {\n return option.value;\n }\n return null;\n}\n\n// ============================================================\n// SATI CLIENT\n// ============================================================\n\n/**\n * Sati Client\n *\n * High-level interface for interacting with SATI protocol.\n *\n * @example\n * ```typescript\n * const sati = new Sati({ network: \"devnet\", photonRpcUrl: \"...\" });\n *\n * // Register an agent\n * const { mint, memberNumber } = await sati.registerAgent({\n * payer,\n * name: \"MyAgent\",\n * uri: \"ipfs://QmRegistrationFile\",\n * });\n *\n * // Load an agent\n * const agent = await sati.loadAgent(mint);\n *\n * // Create feedback attestation\n * const result = await sati.createFeedback({\n * payer,\n * sasSchema,\n * taskRef,\n * agentMint,\n * counterparty,\n * outcome: Outcome.Positive,\n * agentSignature,\n * counterpartySignature,\n * });\n *\n * // List feedbacks\n * const feedbacks = await sati.listFeedbacks({ agentMint });\n * ```\n */\nexport class Sati {\n // Internal state\n private rpc: ReturnType<typeof createSolanaRpc>;\n private rpcSubscriptions: ReturnType<typeof createSolanaRpcSubscriptions>;\n private sendAndConfirm: ReturnType<typeof sendAndConfirmTransactionFactory>;\n private lightClient: LightClient;\n\n // Convenience layer state\n private readonly _deployedConfig: SATISASConfig | null;\n private readonly _feedbackCache = new FeedbackCache();\n private readonly _onWarning?: (warning: SatiWarning) => void;\n\n /** Network configuration */\n readonly network: \"mainnet\" | \"devnet\" | \"localnet\";\n\n constructor(options: SATIClientOptions) {\n this.network = options.network;\n const rpcUrl = options.rpcUrl ?? RPC_URLS[options.network];\n const wsUrl = options.wsUrl ?? WS_URLS[options.network];\n\n this.rpc = createSolanaRpc(rpcUrl);\n this.rpcSubscriptions = createSolanaRpcSubscriptions(wsUrl);\n this.sendAndConfirm = sendAndConfirmTransactionFactory({\n rpc: this.rpc,\n rpcSubscriptions: this.rpcSubscriptions,\n });\n\n // Use hosted Photon proxy by default (zero-config), override with photonRpcUrl\n const photonUrl = options.photonRpcUrl ?? PHOTON_URLS[options.network];\n this.lightClient = createSATILightClient(photonUrl);\n\n // Convenience layer\n this._deployedConfig = loadDeployedConfig(options.network);\n this._onWarning = options.onWarning;\n }\n\n // ============================================================\n // INTERNAL ACCESSORS\n // ============================================================\n\n /** @internal */\n getRpc(): ReturnType<typeof createSolanaRpc> {\n return this.rpc;\n }\n\n /** @internal */\n getSendAndConfirm(): ReturnType<typeof sendAndConfirmTransactionFactory> {\n return this.sendAndConfirm;\n }\n\n /** @internal */\n getLightClient(): LightClient {\n return this.lightClient;\n }\n\n // ============================================================\n // REGISTRY (Agent Management)\n // ============================================================\n\n /**\n * Register a new agent identity\n *\n * Creates a Token-2022 NFT with metadata and group membership atomically.\n */\n async registerAgent(params: {\n /** Payer for transaction and rent */\n payer: KeyPairSigner;\n /** Agent name (max 32 bytes) */\n name: string;\n /** Registration file URI (max 200 bytes) */\n uri: string;\n /** Additional metadata key-value pairs (max 10 entries) */\n additionalMetadata?: Array<{ key: string; value: string }>;\n /** Make agent non-transferable (soulbound) */\n nonTransferable?: boolean;\n /** Owner of the agent NFT (default: payer) */\n owner?: Address;\n /** Optional mint keypair - use to get a consistent mint address across networks */\n mintKeypair?: KeyPairSigner;\n }): Promise<RegisterAgentResult> {\n const { payer, name, uri, additionalMetadata, nonTransferable = false, owner, mintKeypair } = params;\n\n // Use provided mint keypair or generate a new one\n const agentMint = mintKeypair ?? (await generateKeyPairSigner());\n\n // Fetch registry config to get the actual group mint and agent count\n const [registryConfigAddress] = await findRegistryConfigPda();\n const registryConfig = await fetchRegistryConfig(this.rpc, registryConfigAddress);\n const groupMint = registryConfig.data.groupMint;\n const ownerAddress = owner ?? payer.address;\n const [agentTokenAccount] = await findAssociatedTokenAddress(agentMint.address, ownerAddress);\n\n // Derive agent index PDA (member_number = totalAgents + 1)\n const memberNumber = registryConfig.data.totalAgents + 1n;\n const [agentIndex] = await findAgentIndexPda(memberNumber);\n\n // Build instruction\n const registerIx = await getRegisterAgentInstructionAsync({\n payer,\n owner: ownerAddress,\n groupMint,\n agentMint,\n agentTokenAccount,\n agentIndex,\n name,\n symbol: \"\", // Empty - vestigial field from fungible tokens\n uri,\n additionalMetadata: additionalMetadata ?? null,\n nonTransferable,\n });\n\n // Build and send transaction\n const { value: latestBlockhash } = await this.rpc.getLatestBlockhash().send();\n\n const tx = pipe(\n createTransactionMessage({ version: 0 }),\n (msg) => setTransactionMessageFeePayer(payer.address, msg),\n (msg) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, msg),\n (msg) => appendTransactionMessageInstruction(registerIx, msg),\n );\n\n const signedTx = await signTransactionMessageWithSigners(tx);\n await this.sendAndConfirm(signedTx as SignedBlockhashTransaction, {\n commitment: \"confirmed\",\n });\n\n // Re-fetch registry config to verify the updated member number\n const updatedRegistryConfig = await fetchRegistryConfig(this.rpc, registryConfigAddress);\n const finalMemberNumber = updatedRegistryConfig.data.totalAgents;\n\n const signature = getSignatureFromTransaction(signedTx);\n\n return {\n mint: agentMint.address,\n memberNumber: finalMemberNumber,\n signature: signature.toString(),\n };\n }\n\n /**\n * Build a registration file from params, upload it via the provided uploader,\n * and return the resulting URI.\n *\n * @example\n * ```typescript\n * import { createPinataUploader } from \"@cascade-fyi/sati-sdk\";\n *\n * const uploader = createPinataUploader(process.env.PINATA_JWT!);\n * const uri = await sati.uploadRegistrationFile(\n * { name: \"MyAgent\", description: \"AI assistant\", image: \"https://example.com/img.png\" },\n * uploader,\n * );\n * ```\n */\n async uploadRegistrationFile(params: RegistrationFileParams, uploader: MetadataUploader): Promise<string> {\n const regFile = buildRegistrationFile(params);\n return uploader.upload(regFile);\n }\n\n /**\n * Load agent identity from mint address\n */\n async loadAgent(mint: Address): Promise<AgentIdentity | null> {\n try {\n const mintAccount = await fetchToken2022Mint(this.rpc, mint);\n\n const extensions = unwrapOption(\n mintAccount.data.extensions as { __option: \"Some\"; value: Extension[] } | { __option: \"None\" },\n );\n\n if (!extensions) {\n return null;\n }\n\n const metadataExt = extensions.find(\n (ext: Extension): ext is Extension & { __kind: \"TokenMetadata\" } => ext.__kind === \"TokenMetadata\",\n );\n\n if (!metadataExt) {\n return null;\n }\n\n const groupMemberExt = extensions.find(\n (ext: Extension): ext is Extension & { __kind: \"TokenGroupMember\" } => ext.__kind === \"TokenGroupMember\",\n );\n\n const nonTransferableExt = extensions.find((ext: Extension) => ext.__kind === \"NonTransferable\");\n\n const owner = await this.getAgentOwner(mint);\n\n const additionalMetadata: Record<string, string> = {};\n if (metadataExt.additionalMetadata) {\n for (const [key, value] of metadataExt.additionalMetadata) {\n additionalMetadata[key] = value;\n }\n }\n\n return {\n mint,\n owner,\n name: metadataExt.name,\n uri: metadataExt.uri,\n memberNumber: groupMemberExt?.memberNumber ?? 0n,\n additionalMetadata,\n nonTransferable: !!nonTransferableExt,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes(\"could not find account\") || message.includes(\"Account not found\")) {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Load multiple agent identities by mint addresses (batch operation).\n *\n * More efficient than calling loadAgent() multiple times as it batches\n * RPC calls where possible.\n *\n * @param mints - Array of agent NFT mint addresses\n * @returns Array of AgentIdentity or null for each mint (preserves order)\n *\n * @example\n * ```typescript\n * const agents = await sati.loadAgents([mint1, mint2, mint3]);\n * // agents[0] corresponds to mint1, etc.\n * ```\n */\n async loadAgents(mints: Address[]): Promise<(AgentIdentity | null)[]> {\n if (mints.length === 0) {\n return [];\n }\n\n // Batch fetch all mint accounts using getMultipleAccounts\n const mintAccountsResult = await this.rpc.getMultipleAccounts(mints, { encoding: \"jsonParsed\" }).send();\n\n // Process each mint account\n const results: (AgentIdentity | null)[] = [];\n\n for (let i = 0; i < mints.length; i++) {\n const mint = mints[i];\n const mintAccount = mintAccountsResult.value[i];\n\n if (!mintAccount) {\n results.push(null);\n continue;\n }\n\n try {\n const parsed = mintAccount.data as {\n parsed?: {\n info?: {\n extensions?: Array<{\n extension: string;\n state: Record<string, unknown>;\n }>;\n };\n };\n };\n\n const extensions = parsed.parsed?.info?.extensions;\n if (!extensions) {\n results.push(null);\n continue;\n }\n\n const metadataExt = extensions.find((ext) => ext.extension === \"tokenMetadata\");\n if (!metadataExt) {\n results.push(null);\n continue;\n }\n\n const metadata = metadataExt.state as {\n name?: string;\n uri?: string;\n additionalMetadata?: Array<[string, string]>;\n };\n\n const groupMemberExt = extensions.find((ext) => ext.extension === \"tokenGroupMember\");\n const memberState = groupMemberExt?.state as { memberNumber?: number } | undefined;\n\n const nonTransferableExt = extensions.find((ext) => ext.extension === \"nonTransferable\");\n\n // Get owner (still needs individual call due to ATA lookup)\n const owner = await this.getAgentOwner(mint);\n\n const additionalMetadata: Record<string, string> = {};\n if (metadata.additionalMetadata) {\n for (const [key, value] of metadata.additionalMetadata) {\n additionalMetadata[key] = value;\n }\n }\n\n results.push({\n mint,\n owner,\n name: metadata.name ?? \"\",\n uri: metadata.uri ?? \"\",\n memberNumber: BigInt(memberState?.memberNumber ?? 0),\n additionalMetadata,\n nonTransferable: !!nonTransferableExt,\n });\n } catch {\n results.push(null);\n }\n }\n\n return results;\n }\n\n /**\n * Transfer agent to new owner\n */\n async transferAgent(params: {\n payer: KeyPairSigner;\n owner: KeyPairSigner;\n mint: Address;\n newOwner: Address;\n }): Promise<{ signature: string }> {\n const { payer, owner, mint, newOwner } = params;\n\n const [sourceAta] = await findAssociatedTokenAddress(mint, owner.address);\n const [destAta] = await findAssociatedTokenAddress(mint, newOwner);\n\n // Create destination ATA if it doesn't exist (idempotent - won't fail if exists)\n const createAtaIx = getCreateAssociatedTokenIdempotentInstruction({\n payer,\n owner: newOwner,\n mint,\n ata: destAta,\n tokenProgram: TOKEN_2022_PROGRAM_ADDRESS,\n });\n\n const transferIx = getTransferInstruction({\n source: sourceAta,\n destination: destAta,\n authority: owner,\n amount: 1n,\n });\n\n const { value: latestBlockhash } = await this.rpc.getLatestBlockhash().send();\n\n const tx = pipe(\n createTransactionMessage({ version: 0 }),\n (msg) => setTransactionMessageFeePayer(payer.address, msg),\n (msg) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, msg),\n (msg) => appendTransactionMessageInstructions([createAtaIx, transferIx], msg),\n // Attach payer signer to fee payer (needed when payer !== owner)\n (msg) => addSignersToTransactionMessage([payer, owner], msg),\n );\n\n const signedTx = await signTransactionMessageWithSigners(tx);\n await this.sendAndConfirm(signedTx as SignedBlockhashTransaction, {\n commitment: \"confirmed\",\n });\n\n const signature = getSignatureFromTransaction(signedTx);\n return { signature: signature.toString() };\n }\n\n /**\n * Transfer agent with metadata update authority\n */\n async transferAgentWithAuthority(params: {\n payer: KeyPairSigner;\n owner: KeyPairSigner;\n mint: Address;\n newOwner: Address;\n }): Promise<{ signature: string }> {\n const { payer, owner, mint, newOwner } = params;\n\n const [sourceAta] = await findAssociatedTokenAddress(mint, owner.address);\n const [destAta] = await findAssociatedTokenAddress(mint, newOwner);\n\n const transferIx = getTransferInstruction({\n source: sourceAta,\n destination: destAta,\n authority: owner,\n amount: 1n,\n });\n\n const updateAuthorityIx = getUpdateTokenMetadataUpdateAuthorityInstruction({\n metadata: mint,\n updateAuthority: owner,\n newUpdateAuthority: newOwner,\n });\n\n const { value: latestBlockhash } = await this.rpc.getLatestBlockhash().send();\n\n const tx = pipe(\n createTransactionMessage({ version: 0 }),\n (msg) => setTransactionMessageFeePayer(payer.address, msg),\n (msg) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, msg),\n (msg) => appendTransactionMessageInstructions([transferIx, updateAuthorityIx], msg),\n // Attach payer signer to fee payer (needed when payer !== owner)\n (msg) => addSignersToTransactionMessage([payer, owner], msg),\n );\n\n const signedTx = await signTransactionMessageWithSigners(tx);\n await this.sendAndConfirm(signedTx as SignedBlockhashTransaction, {\n commitment: \"confirmed\",\n });\n\n const signature = getSignatureFromTransaction(signedTx);\n return { signature: signature.toString() };\n }\n\n /**\n * Get current owner of an agent\n */\n async getAgentOwner(mint: Address): Promise<Address> {\n const response = await this.rpc.getTokenLargestAccounts(mint, { commitment: \"confirmed\" }).send();\n\n if (!response.value || response.value.length === 0) {\n throw new Error(`No token accounts found for mint ${mint}`);\n }\n\n const holderAccount = response.value.find((acc: { address: string; amount: string }) => BigInt(acc.amount) > 0n);\n\n if (!holderAccount) {\n throw new Error(`No holder found for agent ${mint}`);\n }\n\n const tokenAccount = await fetchToken2022Token(this.rpc, address(holderAccount.address));\n\n return tokenAccount.data.owner;\n }\n\n /**\n * Get registry statistics\n */\n async getRegistryStats(): Promise<{\n groupMint: Address;\n authority: Address;\n totalAgents: bigint;\n isImmutable: boolean;\n }> {\n const [registryConfigAddress] = await findRegistryConfigPda();\n const registryConfig = await fetchRegistryConfig(this.rpc, registryConfigAddress);\n\n const isImmutable = registryConfig.data.authority === \"11111111111111111111111111111111\";\n\n return {\n groupMint: registryConfig.data.groupMint,\n authority: registryConfig.data.authority,\n totalAgents: registryConfig.data.totalAgents,\n isImmutable,\n };\n }\n\n /**\n * Get an agent by its member number (1-indexed).\n *\n * Uses the AgentIndex PDA which maps member numbers to agent mints,\n * enabling enumeration without external indexing.\n *\n * @param memberNumber - The agent's member number (1 to totalAgents)\n * @returns AgentIdentity or null if member number doesn't exist\n *\n * @example\n * ```typescript\n * const agent = await sati.getAgentByMemberNumber(1n);\n * if (agent) {\n * console.log(`First agent: ${agent.name}`);\n * }\n * ```\n */\n async getAgentByMemberNumber(memberNumber: bigint): Promise<AgentIdentity | null> {\n if (memberNumber < 1n) {\n return null;\n }\n\n const [indexPda] = await findAgentIndexPda(memberNumber);\n const maybeIndex = await fetchMaybeAgentIndex(this.rpc, indexPda);\n\n if (!maybeIndex.exists) {\n return null;\n }\n\n return this.loadAgent(maybeIndex.data.mint);\n }\n\n /**\n * List all registered agents with pagination.\n *\n * Uses AgentIndex PDAs for efficient enumeration without external indexing.\n * Member numbers are 1-indexed and sequential.\n *\n * @param options.limit - Maximum agents to return (default: 100)\n * @param options.offset - Starting member number, 1-indexed (default: 1)\n * @returns Array of AgentIdentity objects\n *\n * @example\n * ```typescript\n * // Get first 10 agents\n * const agents = await sati.listAllAgents({ limit: 10 });\n *\n * // Get next page\n * const page2 = await sati.listAllAgents({ limit: 10, offset: 11n });\n * ```\n */\n async listAllAgents(options?: { limit?: number; offset?: bigint }): Promise<AgentIdentity[]> {\n const limit = options?.limit ?? 100;\n const offset = options?.offset ?? 1n;\n\n if (offset < 1n) {\n return [];\n }\n\n const stats = await this.getRegistryStats();\n const totalAgents = stats.totalAgents;\n\n if (totalAgents === 0n || offset > totalAgents) {\n return [];\n }\n\n // Calculate end member number (inclusive)\n const end = offset + BigInt(limit) - 1n > totalAgents ? totalAgents : offset + BigInt(limit) - 1n;\n\n // Derive all AgentIndex PDAs for the range\n const pdas: Address[] = [];\n for (let i = offset; i <= end; i++) {\n const [pda] = await findAgentIndexPda(i);\n pdas.push(pda);\n }\n\n // Batch fetch all AgentIndex accounts\n const indexes = await fetchAllMaybeAgentIndex(this.rpc, pdas);\n\n // Load agent identities for existing indexes\n const agents: AgentIdentity[] = [];\n for (const index of indexes) {\n if (index.exists) {\n const agent = await this.loadAgent(index.data.mint);\n if (agent) {\n agents.push(agent);\n }\n }\n }\n\n return agents;\n }\n\n /**\n * List agents owned by a specific wallet\n */\n async listAgentsByOwner(owner: Address): Promise<AgentIdentity[]> {\n const stats = await this.getRegistryStats();\n const groupMint = stats.groupMint;\n\n const tokenAccountsResult = await this.rpc\n .getTokenAccountsByOwner(\n owner,\n { programId: address(\"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\") },\n { encoding: \"jsonParsed\" },\n )\n .send();\n\n const potentialMints: Address[] = [];\n\n for (const { account } of tokenAccountsResult.value) {\n const parsed = account.data as {\n parsed?: {\n info?: {\n mint?: string;\n tokenAmount?: { amount: string; decimals: number };\n };\n };\n };\n\n const info = parsed.parsed?.info;\n if (!info?.mint || !info?.tokenAmount) continue;\n\n if (info.tokenAmount.amount !== \"1\" || info.tokenAmount.decimals !== 0) {\n continue;\n }\n\n potentialMints.push(info.mint as Address);\n }\n\n if (potentialMints.length === 0) {\n return [];\n }\n\n const mintAccountsResult = await this.rpc.getMultipleAccounts(potentialMints, { encoding: \"jsonParsed\" }).send();\n\n const agents: AgentIdentity[] = [];\n\n for (let i = 0; i < potentialMints.length; i++) {\n const mintAccount = mintAccountsResult.value[i];\n if (!mintAccount) continue;\n\n const parsed = mintAccount.data as {\n parsed?: {\n info?: {\n extensions?: Array<{\n extension: string;\n state: Record<string, unknown>;\n }>;\n };\n };\n };\n\n const extensions = parsed.parsed?.info?.extensions;\n if (!extensions) continue;\n\n const groupMemberExt = extensions.find((ext) => ext.extension === \"tokenGroupMember\");\n if (!groupMemberExt) continue;\n\n const memberState = groupMemberExt.state as {\n group?: string;\n memberNumber?: number;\n };\n if (memberState.group !== groupMint) continue;\n\n const metadataExt = extensions.find((ext) => ext.extension === \"tokenMetadata\");\n if (!metadataExt) continue;\n\n const metadataState = metadataExt.state as {\n name?: string;\n symbol?: string;\n uri?: string;\n additionalMetadata?: Array<[string, string]>;\n };\n\n const nonTransferableExt = extensions.find((ext) => ext.extension === \"nonTransferable\");\n\n const additionalMetadata: Record<string, string> = {};\n if (metadataState.additionalMetadata) {\n for (const [key, value] of metadataState.additionalMetadata) {\n additionalMetadata[key] = value;\n }\n }\n\n agents.push({\n mint: potentialMints[i],\n owner,\n name: metadataState.name ?? \"Unknown\",\n uri: metadataState.uri ?? \"\",\n memberNumber: BigInt(memberState.memberNumber ?? 0),\n additionalMetadata,\n nonTransferable: !!nonTransferableExt,\n });\n }\n\n return agents;\n }\n\n /**\n * Update agent metadata\n */\n async updateAgentMetadata(params: UpdateAgentMetadataParams): Promise<UpdateAgentMetadataResult> {\n const { payer, owner, mint, updates } = params;\n\n type UpdateInstruction = ReturnType<typeof getUpdateTokenMetadataFieldInstruction>;\n const ixList: UpdateInstruction[] = [];\n\n if (updates.name !== undefined) {\n ixList.push(\n getUpdateTokenMetadataFieldInstruction({\n metadata: mint,\n updateAuthority: owner,\n field: tokenMetadataField(\"Name\"),\n value: updates.name,\n }),\n );\n }\n\n if (updates.uri !== undefined) {\n ixList.push(\n getUpdateTokenMetadataFieldInstruction({\n metadata: mint,\n updateAuthority: owner,\n field: tokenMetadataField(\"Uri\"),\n value: updates.uri,\n }),\n );\n }\n\n if (updates.additionalMetadata) {\n for (const [key, value] of updates.additionalMetadata) {\n ixList.push(\n getUpdateTokenMetadataFieldInstruction({\n metadata: mint,\n updateAuthority: owner,\n field: tokenMetadataField(\"Key\", [key]),\n value,\n }),\n );\n }\n }\n\n if (ixList.length === 0) {\n throw new Error(\"No updates specified\");\n }\n\n const { value: latestBlockhash } = await this.rpc.getLatestBlockhash().send();\n\n const tx = pipe(\n createTransactionMessage({ version: 0 }),\n (msg) => setTransactionMessageFeePayer(payer.address, msg),\n (msg) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, msg),\n (msg) => appendTransactionMessageInstructions(ixList, msg),\n // Attach payer signer to fee payer (needed when payer !== owner)\n (msg) => addSignersToTransactionMessage([payer, owner], msg),\n );\n\n const signedTx = await signTransactionMessageWithSigners(tx);\n await this.sendAndConfirm(signedTx as SignedBlockhashTransaction, {\n commitment: \"confirmed\",\n });\n\n const signature = getSignatureFromTransaction(signedTx);\n return { signature: signature.toString() };\n }\n\n /**\n * Link an EVM address to a SATI agent via secp256k1 signature verification.\n * Proves the agent owner controls the specified EVM address.\n *\n * Use cases:\n * - Link ERC-8004 registered agents (Ethereum) to SATI identity\n * - Prove ownership of any EVM EOA for cross-chain identity\n *\n * @example\n * ```typescript\n * // 1. Build the message hash\n * const evmAddressBytes = hexToBytes(\"742d35Cc6634C0532925a3b844Bc9e7595f0bEb7\");\n * const messageHash = computeEvmLinkHash(agentMint, evmAddressBytes, \"eip155:1\");\n *\n * // 2. Sign with Ethereum wallet (e.g., using ethers.js or viem)\n * const signature = await wallet.signMessage(messageHash);\n *\n * // 3. Link on SATI\n * await sati.linkEvmAddress({\n * payer: keypair,\n * agentMint: \"AgentMint...\",\n * evmAddress: \"0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb7\",\n * chainId: \"eip155:1\",\n * signature: signatureBytes,\n * recoveryId: 0,\n * });\n * ```\n */\n async linkEvmAddress(params: {\n /** Payer for transaction fees */\n payer: KeyPairSigner;\n /** Agent NFT mint address */\n agentMint: Address;\n /** EVM address (0x-prefixed hex string) */\n evmAddress: string;\n /** CAIP-2 chain identifier (e.g., \"eip155:1\", \"eip155:8453\") */\n chainId: string;\n /** secp256k1 signature (64 bytes: r || s) */\n signature: Uint8Array;\n /** Recovery ID (0 or 1) */\n recoveryId: number;\n }): Promise<LinkEvmAddressResult> {\n const { payer, agentMint, evmAddress, chainId, signature, recoveryId } = params;\n\n // Parse EVM address (remove 0x prefix if present)\n const evmAddressClean = evmAddress.startsWith(\"0x\") ? evmAddress.slice(2) : evmAddress;\n const hexPairs = evmAddressClean.match(/.{2}/g);\n if (!hexPairs || hexPairs.length !== 20) {\n throw new Error(\"Invalid EVM address format or length\");\n }\n const evmAddressBytes = new Uint8Array(hexPairs.map((byte) => parseInt(byte, 16)));\n if (signature.length !== 64) {\n throw new Error(\"Signature must be 64 bytes\");\n }\n if (recoveryId !== 0 && recoveryId !== 1) {\n throw new Error(\"Recovery ID must be 0 or 1\");\n }\n\n // Find owner's ATA\n const [ata] = await findAssociatedTokenAddress(agentMint, payer.address);\n\n // Build instruction\n const ix = getLinkEvmAddressInstruction({\n owner: payer,\n agentMint,\n ata,\n evmAddress: evmAddressBytes,\n chainId,\n signature,\n recoveryId,\n });\n\n // Send transaction\n const txSig = await this.sendSingleTransaction([ix], payer);\n return { signature: txSig };\n }\n\n /**\n * Build the EVM link hash that the EVM wallet should sign.\n * This is a convenience wrapper around computeEvmLinkHash.\n */\n buildEvmLinkHash(agentMint: Address, evmAddress: Uint8Array, chainId: string): Uint8Array {\n return computeEvmLinkHash(agentMint, evmAddress, chainId);\n }\n\n // ============================================================\n // SCHEMAS\n // ============================================================\n\n /**\n * Register a schema configuration\n */\n async registerSchemaConfig(params: {\n payer: KeyPairSigner;\n authority: KeyPairSigner;\n sasSchema: Address;\n signatureMode: SignatureMode;\n storageType: StorageType;\n closeable: boolean;\n /** Schema name for SIWS messages (e.g., \"Feedback\", \"Validation\") */\n name: string;\n /** Schema for delegation verification (null = owner only) */\n delegationSchema?: Address | null;\n }): Promise<{ signature: string }> {\n const { payer, authority, sasSchema, signatureMode, storageType, closeable, name, delegationSchema } = params;\n\n const [schemaConfigPda] = await findSchemaConfigPda(sasSchema);\n\n const registerIx = await getRegisterSchemaConfigInstructionAsync({\n payer,\n authority,\n sasSchema,\n schemaConfig: schemaConfigPda,\n signatureMode,\n storageType,\n delegationSchema: delegationSchema ?? null,\n closeable,\n name,\n });\n\n const { value: latestBlockhash } = await this.rpc.getLatestBlockhash().send();\n\n const tx = pipe(\n createTransactionMessage({ version: 0 }),\n (msg) => setTransactionMessageFeePayer(payer.address, msg),\n (msg) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, msg),\n (msg) => appendTransactionMessageInstruction(registerIx, msg),\n );\n\n const signedTx = await signTransactionMessageWithSigners(tx);\n await this.sendAndConfirm(signedTx as SignedBlockhashTransaction, {\n commitment: \"confirmed\",\n });\n\n const signature = getSignatureFromTransaction(signedTx);\n return { signature: signature.toString() };\n }\n\n /**\n * Get schema configuration\n */\n async getSchemaConfig(sasSchema: Address): Promise<{\n signatureMode: SignatureMode;\n storageType: StorageType;\n closeable: boolean;\n } | null> {\n const [schemaConfigPda] = await findSchemaConfigPda(sasSchema);\n\n try {\n const schemaConfig = await fetchSchemaConfig(this.rpc, schemaConfigPda);\n\n const signatureMode = schemaConfig.data.signatureMode as unknown as SignatureMode;\n const storageType = schemaConfig.data.storageType as unknown as StorageType;\n\n return {\n signatureMode,\n storageType,\n closeable: schemaConfig.data.closeable,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes(\"could not find account\") || message.includes(\"Account not found\")) {\n return null;\n }\n throw error;\n }\n }\n\n // ============================================================\n // COMPRESSED ATTESTATIONS (Light Protocol)\n // ============================================================\n\n /**\n * Create a Feedback attestation (compressed storage)\n *\n * Note: agentMint is the agent's MINT address (stable Token-2022 NFT identity).\n * The agentSignature.pubkey should be the NFT owner who signed.\n * On-chain verification ensures the owner holds the NFT via ATA.\n *\n * @throws Error if agentMint is not a registered SATI agent mint\n * @throws Error if content exceeds size limit for the signature mode\n * @throws Error if counterpartySignature is provided without counterpartyMessage\n */\n async createFeedback(params: CreateFeedbackParams): Promise<AttestationResult> {\n const {\n payer,\n sasSchema,\n taskRef,\n agentMint,\n counterparty,\n dataHash,\n contentType = ContentType.None,\n outcome,\n content = new Uint8Array(0),\n agentSignature,\n counterpartySignature,\n counterpartyMessage,\n lookupTableAddress,\n } = params;\n\n // Validate counterpartyMessage is provided when counterpartySignature is provided\n if (counterpartySignature && !counterpartyMessage) {\n throw new Error(\n \"counterpartyMessage is required when counterpartySignature is provided. \" +\n \"Use buildCounterpartyMessage() to generate the SIWS message bytes.\",\n );\n }\n\n // Validate content size based on signature mode\n // If counterpartySignature is provided, it's DualSignature mode\n const signatureMode = counterpartySignature ? SignatureMode.DualSignature : SignatureMode.CounterpartySigned;\n validateContentSize(content, signatureMode);\n\n // Validate agentMint is a registered agent mint\n await this.validateAgentMintIsRegisteredAgent(agentMint);\n\n const feedbackData: FeedbackData = {\n taskRef,\n agentMint,\n counterparty,\n dataHash,\n contentType,\n outcome,\n content,\n };\n const data = serializeFeedback(feedbackData);\n\n // Signatures for Ed25519 instruction (extracted by program, not passed as params)\n const signaturesForEd25519 = [\n {\n pubkey: agentSignature.pubkey,\n sig: assertSignature64(agentSignature.signature),\n },\n ];\n\n if (counterpartySignature) {\n signaturesForEd25519.push({\n pubkey: counterpartySignature.pubkey,\n sig: assertSignature64(counterpartySignature.signature),\n });\n }\n\n const [schemaConfigPda] = await findSchemaConfigPda(sasSchema);\n\n // Detect CounterpartySigned mode: counterpartyMessage provided but no counterpartySignature\n // In this mode, the \"agentSignature\" actually contains the counterparty's SIWS signature,\n // and we don't need to verify agent NFT ownership (counterparty doesn't own the agent)\n const isCounterpartySigned = counterpartyMessage && !counterpartySignature;\n\n // Derive agent's ATA only for modes that require agent ownership verification\n // (DualSignature and AgentOwnerSigned modes)\n let agentAta: Address | undefined;\n if (!isCounterpartySigned) {\n // agentMint is the agent's MINT address (identity), NOT a wallet address\n [agentAta] = await findAssociatedTokenAddress(\n agentMint, // mint address (agent identity)\n agentSignature.pubkey, // owner who signed\n );\n }\n\n const light = this.getLightClient();\n\n const addressEncoder = getAddressEncoder();\n const nonce = computeAttestationNonce(taskRef, sasSchema, agentMint, counterparty);\n const sasSchemaBytes = new Uint8Array(addressEncoder.encode(sasSchema));\n const agentMintBytesForSeed = new Uint8Array(addressEncoder.encode(agentMint));\n const seeds = [new TextEncoder().encode(\"attestation\"), sasSchemaBytes, agentMintBytesForSeed, nonce];\n\n const {\n address: derivedAddress,\n proof: proofResult,\n addressTreeInfo: packedAddressTreeInfo,\n outputStateTreeIndex,\n remainingAccounts,\n } = await light.prepareCreate(seeds);\n\n const proof: ValidityProofArgs = proofResult.compressedProof\n ? [\n {\n a: new Uint8Array(proofResult.compressedProof.a),\n b: new Uint8Array(proofResult.compressedProof.b),\n c: new Uint8Array(proofResult.compressedProof.c),\n },\n ]\n : [null];\n\n const addressTreeInfo: PackedAddressTreeInfoArgs = {\n addressMerkleTreePubkeyIndex: packedAddressTreeInfo.addressMerkleTreePubkeyIndex,\n addressQueuePubkeyIndex: packedAddressTreeInfo.addressQueuePubkeyIndex,\n rootIndex: packedAddressTreeInfo.rootIndex,\n };\n\n const baseCreateIx = await getCreateCompressedAttestationInstructionAsync({\n payer,\n schemaConfig: schemaConfigPda,\n agentAta, // undefined for CounterpartySigned mode, required for other modes\n tokenProgram: agentAta ? TOKEN_2022_PROGRAM_ADDRESS : undefined, // Only needed when verifying ATA\n agentMint, // Required for Solscan visibility\n program: SATI_PROGRAM_ADDRESS,\n data,\n outputStateTreeIndex,\n proof,\n addressTreeInfo,\n });\n\n const createIx = {\n ...baseCreateIx,\n accounts: [\n ...baseCreateIx.accounts,\n ...remainingAccounts.map((acc) => ({\n address: address(acc.pubkey.toBase58()),\n role: acc.isWritable ? (acc.isSigner ? 3 : 1) : acc.isSigner ? 2 : 0,\n })),\n ],\n };\n\n // Build Ed25519 entries based on signature mode\n const interactionHash = computeInteractionHash(sasSchema, taskRef, dataHash);\n const ed25519Entries: { publicKey: Uint8Array; message: Uint8Array; signature: Uint8Array }[] = [];\n\n if (counterpartySignature && counterpartyMessage) {\n // DualSignature mode: agent signs interaction hash, counterparty signs SIWS\n ed25519Entries.push({\n publicKey: new Uint8Array(addressEncoder.encode(agentSignature.pubkey)),\n message: interactionHash,\n signature: agentSignature.signature,\n });\n ed25519Entries.push({\n publicKey: new Uint8Array(addressEncoder.encode(counterpartySignature.pubkey)),\n message: counterpartyMessage,\n signature: counterpartySignature.signature,\n });\n } else if (counterpartyMessage && !counterpartySignature) {\n // CounterpartySigned mode: counterparty signs SIWS message (passed as agentSignature)\n ed25519Entries.push({\n publicKey: new Uint8Array(addressEncoder.encode(agentSignature.pubkey)),\n message: counterpartyMessage,\n signature: agentSignature.signature,\n });\n } else {\n // AgentOwnerSigned mode: agent owner signs interaction hash\n ed25519Entries.push({\n publicKey: new Uint8Array(addressEncoder.encode(agentSignature.pubkey)),\n message: interactionHash,\n signature: agentSignature.signature,\n });\n }\n\n const ed25519Ix = createBatchEd25519Instruction(ed25519Entries);\n\n const signature = await this.buildAndSendTransaction([ed25519Ix, createIx], payer, lookupTableAddress);\n\n return {\n address: address(derivedAddress.toBase58()),\n signature,\n };\n }\n\n /**\n * Build a Feedback transaction without signing or sending\n *\n * Note: agentMint is the agent's MINT address (stable Token-2022 NFT identity).\n * The agentSignature.pubkey should be the NFT owner who signed.\n * On-chain verification ensures the owner holds the NFT via ATA.\n *\n * @throws Error if agentMint is not a registered SATI agent mint\n * @throws Error if content exceeds size limit for the signature mode\n * @throws Error if counterpartySignature is provided without counterpartyMessage\n */\n async buildFeedbackTransaction(params: BuildFeedbackParams): Promise<BuiltTransaction> {\n const {\n payer,\n sasSchema,\n taskRef,\n agentMint,\n counterparty,\n dataHash,\n contentType = ContentType.None,\n outcome,\n content = new Uint8Array(0),\n agentSignature,\n counterpartySignature,\n counterpartyMessage,\n lookupTableAddress,\n } = params;\n\n // Validate counterpartyMessage is provided when counterpartySignature is provided\n if (counterpartySignature && !counterpartyMessage) {\n throw new Error(\n \"counterpartyMessage is required when counterpartySignature is provided. \" +\n \"Use buildCounterpartyMessage() to generate the SIWS message bytes.\",\n );\n }\n\n // Validate content size based on signature mode\n // If counterpartySignature is provided, it's DualSignature mode\n const signatureMode = counterpartySignature ? SignatureMode.DualSignature : SignatureMode.CounterpartySigned;\n validateContentSize(content, signatureMode);\n\n // Validate agentMint is a registered agent mint\n await this.validateAgentMintIsRegisteredAgent(agentMint);\n\n const feedbackData: FeedbackData = {\n taskRef,\n agentMint,\n counterparty,\n dataHash,\n contentType,\n outcome,\n content,\n };\n const data = serializeFeedback(feedbackData);\n\n // Signatures for Ed25519 instruction (extracted by program, not passed as params)\n const signaturesForEd25519 = [\n {\n pubkey: agentSignature.pubkey,\n sig: assertSignature64(agentSignature.signature),\n },\n ];\n\n if (counterpartySignature) {\n signaturesForEd25519.push({\n pubkey: counterpartySignature.pubkey,\n sig: assertSignature64(counterpartySignature.signature),\n });\n }\n\n const [schemaConfigPda] = await findSchemaConfigPda(sasSchema);\n\n // Detect CounterpartySigned mode: counterpartyMessage provided but no counterpartySignature\n // In this mode, the \"agentSignature\" actually contains the counterparty's SIWS signature,\n // and we don't need to verify agent NFT ownership (counterparty doesn't own the agent)\n const isCounterpartySigned = counterpartyMessage && !counterpartySignature;\n\n // Derive agent's ATA only for modes that require agent ownership verification\n // (DualSignature and AgentOwnerSigned modes)\n let agentAta: Address | undefined;\n if (!isCounterpartySigned) {\n // agentMint is the agent's MINT address (identity), NOT a wallet address\n [agentAta] = await findAssociatedTokenAddress(\n agentMint, // mint address (agent identity)\n agentSignature.pubkey, // owner who signed\n );\n }\n\n const light = this.getLightClient();\n\n const addressEncoder = getAddressEncoder();\n const nonce = computeAttestationNonce(taskRef, sasSchema, agentMint, counterparty);\n const sasSchemaBytes = new Uint8Array(addressEncoder.encode(sasSchema));\n const agentMintBytesForSeed = new Uint8Array(addressEncoder.encode(agentMint));\n const seeds = [new TextEncoder().encode(\"attestation\"), sasSchemaBytes, agentMintBytesForSeed, nonce];\n\n const {\n address: derivedAddress,\n proof: proofResult,\n addressTreeInfo: packedAddressTreeInfo,\n outputStateTreeIndex,\n remainingAccounts,\n } = await light.prepareCreate(seeds);\n\n const proof: ValidityProofArgs = proofResult.compressedProof\n ? [\n {\n a: new Uint8Array(proofResult.compressedProof.a),\n b: new Uint8Array(proofResult.compressedProof.b),\n c: new Uint8Array(proofResult.compressedProof.c),\n },\n ]\n : [null];\n\n const addressTreeInfo: PackedAddressTreeInfoArgs = {\n addressMerkleTreePubkeyIndex: packedAddressTreeInfo.addressMerkleTreePubkeyIndex,\n addressQueuePubkeyIndex: packedAddressTreeInfo.addressQueuePubkeyIndex,\n rootIndex: packedAddressTreeInfo.rootIndex,\n };\n\n const baseCreateIx = await getCreateCompressedAttestationInstructionAsync({\n payer: { address: payer } as KeyPairSigner,\n schemaConfig: schemaConfigPda,\n agentAta, // undefined for CounterpartySigned mode, required for other modes\n tokenProgram: agentAta ? TOKEN_2022_PROGRAM_ADDRESS : undefined, // Only needed when verifying ATA\n agentMint, // Required for Solscan visibility\n program: SATI_PROGRAM_ADDRESS,\n data,\n outputStateTreeIndex,\n proof,\n addressTreeInfo,\n });\n\n const createIx = {\n ...baseCreateIx,\n accounts: [\n ...baseCreateIx.accounts,\n ...remainingAccounts.map((acc) => ({\n address: address(acc.pubkey.toBase58()),\n role: acc.isWritable ? (acc.isSigner ? 3 : 1) : acc.isSigner ? 2 : 0,\n })),\n ],\n };\n\n // Build Ed25519 entries based on signature mode\n const interactionHash = computeInteractionHash(sasSchema, taskRef, dataHash);\n const ed25519Entries: { publicKey: Uint8Array; message: Uint8Array; signature: Uint8Array }[] = [];\n\n if (counterpartySignature && counterpartyMessage) {\n // DualSignature mode: agent signs interaction hash, counterparty signs SIWS\n ed25519Entries.push({\n publicKey: new Uint8Array(addressEncoder.encode(agentSignature.pubkey)),\n message: interactionHash,\n signature: agentSignature.signature,\n });\n ed25519Entries.push({\n publicKey: new Uint8Array(addressEncoder.encode(counterpartySignature.pubkey)),\n message: counterpartyMessage,\n signature: counterpartySignature.signature,\n });\n } else if (counterpartyMessage && !counterpartySignature) {\n // CounterpartySigned mode: counterparty signs SIWS message (passed as agentSignature)\n ed25519Entries.push({\n publicKey: new Uint8Array(addressEncoder.encode(agentSignature.pubkey)),\n message: counterpartyMessage,\n signature: agentSignature.signature,\n });\n } else {\n // AgentOwnerSigned mode: agent owner signs interaction hash\n ed25519Entries.push({\n publicKey: new Uint8Array(addressEncoder.encode(agentSignature.pubkey)),\n message: interactionHash,\n signature: agentSignature.signature,\n });\n }\n\n const ed25519Ix = createBatchEd25519Instruction(ed25519Entries);\n\n const { value: latestBlockhash } = await this.rpc.getLatestBlockhash().send();\n\n const computeBudgetIx = getSetComputeUnitLimitInstruction({\n units: 400_000,\n });\n\n const baseTxMessage = pipe(\n createTransactionMessage({ version: 0 }),\n (msg) => setTransactionMessageFeePayer(payer, msg),\n (msg) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, msg),\n (msg) => appendTransactionMessageInstruction(computeBudgetIx, msg),\n (msg) => appendTransactionMessageInstructions([ed25519Ix, createIx], msg),\n );\n\n const finalTxMessage = await (async () => {\n if (!lookupTableAddress) {\n return baseTxMessage;\n }\n const lookupTableAccount = await fetchAddressLookupTable(this.rpc, lookupTableAddress);\n const addressesByLookupTable: AddressesByLookupTableAddress = {\n [lookupTableAddress]: lookupTableAccount.data.addresses,\n };\n return compressTransactionMessageUsingAddressLookupTables(baseTxMessage, addressesByLookupTable);\n })();\n\n const compiledTx = compileTransaction(finalTxMessage);\n\n const messageBytes = compiledTx.messageBytes as unknown as Uint8Array;\n const binaryString = Array.from(messageBytes)\n .map((byte) => String.fromCharCode(byte))\n .join(\"\");\n const messageBase64 = btoa(binaryString);\n\n return {\n attestationAddress: address(derivedAddress.toBase58()),\n messageBytes: messageBase64,\n signers: Object.keys(compiledTx.signatures) as Address[],\n blockhash: latestBlockhash.blockhash,\n lastValidBlockHeight: latestBlockhash.lastValidBlockHeight,\n };\n }\n\n /**\n * Create a Validation attestation (compressed storage)\n *\n * Note: agentMint is the agent's MINT address (stable identity).\n * The agentSignature.pubkey should be the NFT owner who signed.\n * On-chain verification ensures the owner holds the NFT via ATA.\n *\n * @throws Error if agentMint is not a registered SATI agent mint\n * @throws Error if content exceeds size limit for DualSignature mode (~70 bytes)\n * @throws Error if counterpartyMessage is not provided\n */\n async createValidation(params: CreateValidationParams): Promise<AttestationResult> {\n const {\n payer,\n sasSchema,\n taskRef,\n agentMint,\n counterparty,\n dataHash,\n outcome,\n contentType = ContentType.None,\n content = new Uint8Array(0),\n agentSignature,\n validatorSignature,\n counterpartyMessage,\n lookupTableAddress,\n } = params;\n\n // Validation attestations are always DualSignature, so counterpartyMessage is required\n if (!counterpartyMessage) {\n throw new Error(\n \"counterpartyMessage is required for Validation attestations. \" +\n \"Use buildCounterpartyMessage() to generate the SIWS message bytes.\",\n );\n }\n\n // Validation attestations are always DualSignature (agent + validator)\n validateContentSize(content, SignatureMode.DualSignature);\n\n // Validate agentMint is a registered agent mint\n await this.validateAgentMintIsRegisteredAgent(agentMint);\n\n const validationData: ValidationData = {\n taskRef,\n agentMint,\n counterparty,\n dataHash,\n outcome,\n contentType,\n content,\n };\n const data = serializeValidation(validationData);\n\n const [schemaConfigPda] = await findSchemaConfigPda(sasSchema);\n\n // Derive agent's ATA - verifies signer (agentSignature.pubkey) owns the agent NFT (agentMint)\n // agentMint is the agent's MINT address (identity), NOT a wallet address\n const [agentAta] = await findAssociatedTokenAddress(\n agentMint, // mint address (agent identity)\n agentSignature.pubkey, // owner who signed\n );\n\n const light = this.getLightClient();\n\n const addressEncoder = getAddressEncoder();\n const nonce = computeAttestationNonce(taskRef, sasSchema, agentMint, counterparty);\n const seeds = [\n new TextEncoder().encode(\"attestation\"),\n new Uint8Array(addressEncoder.encode(sasSchema)),\n new Uint8Array(addressEncoder.encode(agentMint)),\n nonce,\n ];\n\n const {\n address: derivedAddress,\n proof: proofResult,\n addressTreeInfo: packedAddressTreeInfo,\n outputStateTreeIndex,\n remainingAccounts,\n } = await light.prepareCreate(seeds);\n\n const proof: ValidityProofArgs = proofResult.compressedProof\n ? [\n {\n a: new Uint8Array(proofResult.compressedProof.a),\n b: new Uint8Array(proofResult.compressedProof.b),\n c: new Uint8Array(proofResult.compressedProof.c),\n },\n ]\n : [null];\n\n const addressTreeInfo: PackedAddressTreeInfoArgs = {\n addressMerkleTreePubkeyIndex: packedAddressTreeInfo.addressMerkleTreePubkeyIndex,\n addressQueuePubkeyIndex: packedAddressTreeInfo.addressQueuePubkeyIndex,\n rootIndex: packedAddressTreeInfo.rootIndex,\n };\n\n const baseCreateIx = await getCreateCompressedAttestationInstructionAsync({\n payer,\n schemaConfig: schemaConfigPda,\n agentAta, // Proves signer owns the agent NFT\n tokenProgram: TOKEN_2022_PROGRAM_ADDRESS, // Agent NFTs use Token-2022\n agentMint, // Required for Solscan visibility\n program: SATI_PROGRAM_ADDRESS,\n data,\n outputStateTreeIndex,\n proof,\n addressTreeInfo,\n });\n\n const createIx = {\n ...baseCreateIx,\n accounts: [\n ...baseCreateIx.accounts,\n ...remainingAccounts.map((acc) => ({\n address: address(acc.pubkey.toBase58()),\n role: acc.isWritable ? (acc.isSigner ? 3 : 1) : acc.isSigner ? 2 : 0,\n })),\n ],\n };\n\n // Agent signs interaction hash (blind commitment to task + data)\n const interactionHash = computeInteractionHash(sasSchema, taskRef, dataHash);\n\n const ed25519Entries = [\n {\n publicKey: new Uint8Array(addressEncoder.encode(agentSignature.pubkey)),\n message: interactionHash,\n signature: agentSignature.signature,\n },\n ];\n\n // Validator signs human-readable SIWS message\n if (counterpartyMessage) {\n ed25519Entries.push({\n publicKey: new Uint8Array(addressEncoder.encode(validatorSignature.pubkey)),\n message: counterpartyMessage,\n signature: validatorSignature.signature,\n });\n }\n\n const ed25519Ix = createBatchEd25519Instruction(ed25519Entries);\n\n const signature = await this.buildAndSendTransaction([ed25519Ix, createIx], payer, lookupTableAddress);\n\n return {\n address: address(derivedAddress.toBase58()),\n signature,\n };\n }\n\n /**\n * Close a compressed attestation (Light Protocol)\n */\n async closeCompressedAttestation(params: CloseCompressedAttestationParams): Promise<CloseAttestationResult> {\n const { payer, counterparty, sasSchema, attestationAddress, lookupTableAddress } = params;\n\n const light = this.getLightClient();\n const parsedAttestation = await light.getAttestationByAddress(attestationAddress);\n\n if (!parsedAttestation) {\n throw new Error(`Attestation not found at address ${attestationAddress}`);\n }\n\n const addressEncoder = getAddressEncoder();\n const counterpartyBytes = parsedAttestation.attestation.data.slice(64, 96);\n const expectedCounterpartyBytes = new Uint8Array(addressEncoder.encode(counterparty.address));\n\n const isCounterparty =\n counterpartyBytes.length === expectedCounterpartyBytes.length &&\n counterpartyBytes.every((byte, i) => byte === expectedCounterpartyBytes[i]);\n\n if (!isCounterparty) {\n throw new Error(\"Signer must be the counterparty from the original attestation\");\n }\n\n const mutationResult = await light.getMutationProof(parsedAttestation.raw);\n\n const accountMeta: CompressedAccountMetaArgs = {\n treeInfo: {\n rootIndex: mutationResult.stateTreeInfo.rootIndex,\n proveByIndex: true,\n merkleTreePubkeyIndex: mutationResult.stateTreeInfo.merkleTreePubkeyIndex,\n queuePubkeyIndex: mutationResult.stateTreeInfo.queuePubkeyIndex,\n leafIndex: mutationResult.stateTreeInfo.leafIndex,\n },\n address: parsedAttestation.address,\n outputStateTreeIndex: mutationResult.outputStateTreeIndex,\n };\n\n const proof: ValidityProofArgs = mutationResult.proof.compressedProof\n ? [\n {\n a: new Uint8Array(mutationResult.proof.compressedProof.a),\n b: new Uint8Array(mutationResult.proof.compressedProof.b),\n c: new Uint8Array(mutationResult.proof.compressedProof.c),\n },\n ]\n : [null];\n\n const [schemaConfigPda] = await findSchemaConfigPda(sasSchema);\n\n const baseCloseIx = await getCloseCompressedAttestationInstructionAsync({\n signer: counterparty,\n schemaConfig: schemaConfigPda,\n agentMint: parsedAttestation.attestation.agentMint,\n program: SATI_PROGRAM_ADDRESS,\n currentData: parsedAttestation.attestation.data,\n numSignatures: parsedAttestation.attestation.numSignatures,\n signature1: parsedAttestation.attestation.signature1,\n signature2: parsedAttestation.attestation.signature2,\n address: attestationAddress,\n proof,\n accountMeta,\n });\n\n const closeIx = {\n ...baseCloseIx,\n accounts: [\n ...baseCloseIx.accounts,\n ...mutationResult.remainingAccounts.map((acc) => ({\n address: address(acc.pubkey.toBase58()),\n role: acc.isWritable ? (acc.isSigner ? 3 : 1) : acc.isSigner ? 2 : 0,\n })),\n ],\n };\n\n const signature = await this.buildAndSendTransaction([closeIx], payer, lookupTableAddress);\n\n return { signature };\n }\n\n // ============================================================\n // REGULAR ATTESTATIONS (SAS)\n // ============================================================\n\n /**\n * Create a ReputationScoreV3 attestation (regular SAS storage)\n *\n * @throws Error if agentMint is not a registered SATI agent mint\n */\n async createReputationScore(params: CreateReputationScoreParams): Promise<AttestationResult> {\n const {\n payer,\n provider,\n providerSignature,\n sasSchema,\n satiCredential,\n agentMint,\n taskRef,\n dataHash,\n outcome,\n contentType = ContentType.None,\n content = new Uint8Array(0),\n expiry = 0,\n } = params;\n\n if (providerSignature.length !== 64) {\n throw new Error(\"Provider signature must be 64 bytes\");\n }\n\n if (contentType !== ContentType.None && content.length === 0) {\n throw new Error(`content is required when contentType is ${getContentTypeLabel(contentType)}`);\n }\n\n // Validate agentMint is a registered agent mint\n await this.validateAgentMintIsRegisteredAgent(agentMint);\n\n const nonce = computeReputationNonce(provider, agentMint);\n\n const reputationData: ReputationScoreData = {\n taskRef,\n agentMint,\n counterparty: provider,\n dataHash,\n outcome,\n contentType,\n content,\n };\n const data = serializeReputationScore(reputationData);\n\n // Provider signs interaction hash (same as agent signature in dual-sig)\n const messageHash = computeInteractionHash(sasSchema, taskRef, dataHash);\n\n const [attestationPda] = await deriveReputationAttestationPda(satiCredential, sasSchema, nonce);\n\n const [schemaConfigPda] = await findSchemaConfigPda(sasSchema);\n\n const addressEncoder = getAddressEncoder();\n const ed25519Ix = createBatchEd25519Instruction([\n {\n publicKey: new Uint8Array(addressEncoder.encode(provider)),\n message: messageHash,\n signature: providerSignature,\n },\n ]);\n\n const createIx = await getCreateRegularAttestationInstructionAsync({\n payer,\n schemaConfig: schemaConfigPda,\n agentMint,\n satiCredential,\n sasSchema,\n attestation: attestationPda,\n program: SATI_PROGRAM_ADDRESS,\n data,\n expiry: BigInt(expiry),\n });\n\n const signature = await this.buildAndSendTransaction([ed25519Ix, createIx], payer);\n\n return {\n address: attestationPda,\n signature,\n };\n }\n\n /**\n * Update (or create) a ReputationScoreV3 attestation.\n *\n * High-level method that auto-computes deterministic taskRef and zero dataHash\n * per the spec. If a score already exists for this (provider, agent) pair,\n * closes it first and creates a new one at the same PDA in a single transaction.\n */\n async updateReputationScore(params: UpdateReputationScoreParams): Promise<AttestationResult> {\n const {\n payer,\n provider,\n sasSchema,\n satiCredential,\n agentMint,\n outcome,\n contentType = ContentType.None,\n content = new Uint8Array(0),\n expiry = 0,\n } = params;\n\n if (contentType !== ContentType.None && content.length === 0) {\n throw new Error(`content is required when contentType is ${getContentTypeLabel(contentType)}`);\n }\n\n await this.validateAgentMintIsRegisteredAgent(agentMint);\n\n const nonce = computeReputationNonce(provider.address, agentMint);\n const taskRef = computeReputationNonce(provider.address, agentMint); // same as nonce per spec\n const dataHash = zeroDataHash();\n\n const [attestationPda] = await deriveReputationAttestationPda(satiCredential, sasSchema, nonce);\n const [schemaConfigPda] = await findSchemaConfigPda(sasSchema);\n\n const instructions: Array<Parameters<typeof appendTransactionMessageInstructions>[0][number]> = [];\n\n // If attestation already exists, close it first\n const existingAccount = await this.rpc.getAccountInfo(attestationPda, { encoding: \"base64\" }).send();\n if (existingAccount.value) {\n const [sasEventAuthority] = await deriveSasEventAuthorityPda();\n const closeIx = await getCloseRegularAttestationInstructionAsync({\n payer,\n signer: provider,\n schemaConfig: schemaConfigPda,\n agentMint,\n satiCredential,\n attestation: attestationPda,\n sasEventAuthority,\n program: SATI_PROGRAM_ADDRESS,\n });\n instructions.push(closeIx);\n }\n\n // Build create instructions\n const reputationData: ReputationScoreData = {\n taskRef,\n agentMint,\n counterparty: provider.address,\n dataHash,\n outcome,\n contentType,\n content,\n };\n const data = serializeReputationScore(reputationData);\n\n const messageHash = computeInteractionHash(sasSchema, taskRef, dataHash);\n const providerSig = new Uint8Array(await signBytes(provider.keyPair.privateKey, messageHash));\n\n const addressEncoder = getAddressEncoder();\n const ed25519Ix = createBatchEd25519Instruction([\n {\n publicKey: new Uint8Array(addressEncoder.encode(provider.address)),\n message: messageHash,\n signature: providerSig,\n },\n ]);\n\n const createIx = await getCreateRegularAttestationInstructionAsync({\n payer,\n schemaConfig: schemaConfigPda,\n agentMint,\n satiCredential,\n sasSchema,\n attestation: attestationPda,\n program: SATI_PROGRAM_ADDRESS,\n data,\n expiry: BigInt(expiry),\n });\n\n instructions.push(ed25519Ix, createIx);\n\n const signature = await this.buildAndSendTransaction(instructions, payer);\n\n return {\n address: attestationPda,\n signature,\n };\n }\n\n /**\n * Close a regular SAS attestation (ReputationScoreV3)\n */\n async closeRegularAttestation(params: CloseRegularAttestationParams): Promise<CloseAttestationResult> {\n const { payer, provider, sasSchema, satiCredential, agentMint, attestation } = params;\n\n const [schemaConfigPda] = await findSchemaConfigPda(sasSchema);\n const [sasEventAuthority] = await deriveSasEventAuthorityPda();\n\n const closeIx = await getCloseRegularAttestationInstructionAsync({\n payer,\n signer: provider,\n schemaConfig: schemaConfigPda,\n agentMint,\n satiCredential,\n attestation,\n sasEventAuthority,\n program: SATI_PROGRAM_ADDRESS,\n });\n\n const signature = await this.buildAndSendTransaction([closeIx], payer);\n\n return { signature };\n }\n\n // ============================================================\n // QUERY METHODS\n // ============================================================\n\n /**\n * List Feedback attestations with pagination\n */\n async listFeedbacks(filter: Partial<AttestationFilter>): Promise<PaginatedAttestations<ParsedFeedbackAttestation>> {\n const light = this.getLightClient();\n return light.listFeedbacks(filter);\n }\n\n /**\n * List Validation attestations with pagination\n */\n async listValidations(\n filter: Partial<AttestationFilter>,\n ): Promise<PaginatedAttestations<ParsedValidationAttestation>> {\n const light = this.getLightClient();\n return light.listValidations(filter);\n }\n\n /**\n * Get a ReputationScoreV3 for an agent from a specific provider\n */\n async getReputationScore(\n provider: Address,\n agentMint: Address,\n satiCredential: Address,\n sasSchema: Address,\n ): Promise<ReputationScoreData | null> {\n const nonce = computeReputationNonce(provider, agentMint);\n\n const [attestationPda] = await deriveReputationAttestationPda(satiCredential, sasSchema, nonce);\n\n const accountInfo = await this.rpc.getAccountInfo(attestationPda, { encoding: \"base64\" }).send();\n\n if (!accountInfo.value) {\n return null;\n }\n\n const base64Data = accountInfo.value.data[0];\n const binaryString = atob(base64Data);\n const data = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n data[i] = binaryString.charCodeAt(i);\n }\n\n if (data.length < SAS_HEADER_SIZE) {\n return null;\n }\n\n // Read data_len from SAS header (4-byte LE at SAS_DATA_LEN_OFFSET) to exclude SAS tail\n const dataLenSlice = data.slice(SAS_DATA_LEN_OFFSET, SAS_DATA_LEN_OFFSET + 4);\n const dataLen = new DataView(dataLenSlice.buffer).getUint32(0, true);\n const satiData = data.slice(SAS_HEADER_SIZE, SAS_HEADER_SIZE + dataLen);\n\n return deserializeReputationScore(satiData);\n }\n\n /**\n * List ReputationScoreV3 attestations for an agent\n */\n async listReputationScores(agentMint: Address, sasSchema: Address): Promise<ReputationScoreData[]> {\n // SAS attestation account layout:\n // discriminator(1) + nonce(32) + credential(32) + schema(32) + data_len(4) + data...\n // Schema is at offset 65 in the SAS header.\n // AgentMint is in SATI data at: SAS_HEADER_SIZE(101) + layoutVersion(1) + taskRef(32) = 134\n const accounts = await this.rpc\n .getProgramAccounts(SAS_PROGRAM_ADDRESS, {\n encoding: \"base64\",\n filters: [\n {\n memcmp: {\n offset: BigInt(65),\n bytes: addressToBase58Bytes(sasSchema),\n encoding: \"base58\",\n },\n },\n {\n memcmp: {\n offset: BigInt(SAS_HEADER_SIZE + 33),\n bytes: addressToBase58Bytes(agentMint),\n encoding: \"base58\",\n },\n },\n ],\n })\n .send();\n\n const results: ReputationScoreData[] = [];\n for (const { account } of accounts) {\n try {\n const [base64Data] = account.data as [string, string];\n const bytes = Uint8Array.from(atob(base64Data), (c) => c.charCodeAt(0));\n // Read data_len from SAS header (4-byte LE at SAS_DATA_LEN_OFFSET) to exclude SAS tail\n const dataLenSlice = bytes.slice(SAS_DATA_LEN_OFFSET, SAS_DATA_LEN_OFFSET + 4);\n const dataLen = new DataView(dataLenSlice.buffer).getUint32(0, true);\n const attestationData = bytes.slice(SAS_HEADER_SIZE, SAS_HEADER_SIZE + dataLen);\n results.push(deserializeReputationScore(attestationData));\n } catch {\n // Skip malformed accounts\n }\n }\n\n return results;\n }\n\n // ============================================================\n // SIGNATURE HELPERS\n // ============================================================\n\n /**\n * Build the interaction hash that the agent should sign (blind to outcome)\n *\n * The agent signs this hash before knowing the outcome, binding them to the\n * task and data without committing to a specific result.\n */\n buildInteractionHash(sasSchema: Address, taskRef: Uint8Array, dataHash: Uint8Array): Uint8Array {\n return computeInteractionHash(sasSchema, taskRef, dataHash);\n }\n\n /**\n * Build the counterparty message for signing (SIWS-style human-readable message)\n *\n * @param schemaName - The schema name (e.g., \"Feedback\", \"Validation\")\n * @param data - Serialized attestation data (universal layout)\n */\n buildCounterpartySigningMessage(schemaName: string, data: Uint8Array): Uint8Array {\n return buildCounterpartyMessage({ schemaName, data }).messageBytes;\n }\n\n // ============================================================\n // SIGNATURE VERIFICATION\n // ============================================================\n\n /**\n * Verify signatures on a parsed attestation\n *\n * For dual-signature attestations (Feedback, Validation), the counterparty signature\n * is verified against the SIWS-style human-readable message. This requires the schema\n * name to reconstruct the message.\n *\n * @param attestation - The parsed attestation to verify\n * @param schemaName - Schema name for counterparty message reconstruction (e.g., \"Feedback\")\n */\n async verifySignatures(attestation: ParsedAttestation, schemaName?: string): Promise<SignatureVerificationResult> {\n const { attestation: compressed, data } = attestation;\n const addressEncoder = getAddressEncoder();\n\n // sasSchema and agentMint are now Address strings\n const sasSchema = compressed.sasSchema;\n\n const signature1 = compressed.signature1;\n const signature2 = compressed.signature2;\n\n // All schemas share the same base layout, so we can use FeedbackData for common fields\n const baseData = data as FeedbackData;\n\n // Determine signature mode from numSignatures\n const isDualSignature = compressed.numSignatures === 2;\n\n if (isDualSignature) {\n // DualSignature mode (Feedback, Validation): agent + counterparty\n\n // Agent signs interaction hash (blind commitment to task + data)\n const interactionHash = computeInteractionHash(sasSchema, baseData.taskRef, baseData.dataHash);\n\n // For counterparty verification, we need the schema name to build the SIWS message\n if (!schemaName) {\n // Without schema name, we can only verify agent signature\n const agentPubkeyBytes = new Uint8Array(addressEncoder.encode(baseData.agentMint));\n const agentKey = await importEd25519PublicKey(agentPubkeyBytes);\n const agentValid = await verifySignature(agentKey, signatureBytes(signature1), interactionHash);\n\n return {\n valid: agentValid,\n agentValid,\n counterpartyValid: undefined,\n };\n }\n\n // Serialize the data to build counterparty message\n // Use the raw compressed data directly since it's already in universal layout\n const counterpartyMessageObj = buildCounterpartyMessage({ schemaName, data: compressed.data });\n\n const agentPubkeyBytes = new Uint8Array(addressEncoder.encode(baseData.agentMint));\n const agentKey = await importEd25519PublicKey(agentPubkeyBytes);\n\n const counterpartyPubkeyBytes = new Uint8Array(addressEncoder.encode(baseData.counterparty));\n const counterpartyKey = await importEd25519PublicKey(counterpartyPubkeyBytes);\n\n const agentValid = await verifySignature(agentKey, signatureBytes(signature1), interactionHash);\n const counterpartyValid = await verifySignature(\n counterpartyKey,\n signatureBytes(signature2),\n counterpartyMessageObj.messageBytes,\n );\n\n return {\n valid: agentValid && counterpartyValid,\n agentValid,\n counterpartyValid,\n };\n } else {\n // Single signature mode (CounterpartySigned or AgentOwnerSigned)\n const interactionHash = computeInteractionHash(sasSchema, baseData.taskRef, baseData.dataHash);\n\n // For single signature, signature1 is the only signature\n // The signer could be either the agent owner or the counterparty depending on the schema\n // We verify that signature1 is valid for the interaction hash\n const signerPubkeyBytes = new Uint8Array(addressEncoder.encode(baseData.counterparty));\n const signerKey = await importEd25519PublicKey(signerPubkeyBytes);\n const signerValid = await verifySignature(signerKey, signatureBytes(signature1), interactionHash);\n\n return {\n valid: signerValid,\n agentValid: undefined,\n counterpartyValid: signerValid,\n };\n }\n }\n\n // ============================================================\n // PRIVATE HELPERS\n // ============================================================\n\n /**\n * Validate that agentMint is a registered SATI agent mint.\n *\n * This validation runs at SDK level to fail fast with clear errors\n * before attempting on-chain operations.\n *\n * @param agentMint - Address to validate as a registered agent mint\n * @throws Error if agentMint is not a registered SATI agent\n */\n private async validateAgentMintIsRegisteredAgent(agentMint: Address): Promise<void> {\n try {\n const agent = await this.loadAgent(agentMint);\n if (!agent) {\n throw new Error(`agentMint ${agentMint} is not a registered SATI agent mint`);\n }\n } catch (error) {\n // Re-throw with consistent error message for any lookup failure\n const message = error instanceof Error ? error.message : String(error);\n // Already has our message format\n if (message.includes(\"is not a registered SATI agent mint\")) {\n throw error;\n }\n // Wrap other errors (account not found, decode errors, etc.)\n throw new Error(`agentMint ${agentMint} is not a registered SATI agent mint`);\n }\n }\n\n /**\n * Build, optionally compress, sign, and send a transaction.\n */\n private async buildAndSendTransaction(\n instructions: Parameters<typeof appendTransactionMessageInstructions>[0],\n payer: KeyPairSigner,\n lookupTableAddress?: Address,\n computeUnits: number = 400_000,\n ): Promise<string> {\n const { value: latestBlockhash } = await this.rpc.getLatestBlockhash().send();\n\n const computeBudgetIx = getSetComputeUnitLimitInstruction({\n units: computeUnits,\n });\n\n const baseTx = pipe(\n createTransactionMessage({ version: 0 }),\n (msg) => setTransactionMessageFeePayer(payer.address, msg),\n (msg) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, msg),\n (msg) => appendTransactionMessageInstruction(computeBudgetIx, msg),\n (msg) => appendTransactionMessageInstructions(instructions, msg),\n );\n\n const finalTx = await (async () => {\n if (!lookupTableAddress) {\n return baseTx;\n }\n const lookupTableAccount = await fetchAddressLookupTable(this.rpc, lookupTableAddress);\n const addressesByLookupTable: AddressesByLookupTableAddress = {\n [lookupTableAddress]: lookupTableAccount.data.addresses,\n };\n return compressTransactionMessageUsingAddressLookupTables(baseTx, addressesByLookupTable);\n })();\n\n const signedTx = await signTransactionMessageWithSigners(finalTx);\n await this.sendAndConfirm(signedTx as SignedBlockhashTransaction, {\n commitment: \"confirmed\",\n });\n\n return getSignatureFromTransaction(signedTx).toString();\n }\n\n /**\n * Send a single transaction without address lookup table.\n */\n private async sendSingleTransaction(\n instructions: Parameters<typeof appendTransactionMessageInstructions>[0],\n payer: KeyPairSigner,\n ): Promise<string> {\n const { value: latestBlockhash } = await this.rpc.getLatestBlockhash().send();\n\n const txMessage = pipe(\n createTransactionMessage({ version: 0 }),\n (msg) => setTransactionMessageFeePayer(payer.address, msg),\n (msg) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, msg),\n (msg) => appendTransactionMessageInstructions(instructions, msg),\n );\n\n const signedTx = await signTransactionMessageWithSigners(txMessage);\n const signature = getSignatureFromTransaction(signedTx);\n\n await this.sendAndConfirm(signedTx as SignedBlockhashTransaction, {\n commitment: \"confirmed\",\n });\n\n return signature;\n }\n\n // ============================================================\n // CONVENIENCE: Config Accessors\n // ============================================================\n\n /** Deployed SAS configuration for this network (null for localnet unless deployed). */\n get deployedConfig(): SATISASConfig | null {\n return this._deployedConfig;\n }\n\n /** FeedbackPublic schema address (CounterpartySigned mode). */\n get feedbackPublicSchema(): Address | undefined {\n return this._deployedConfig?.schemas.feedbackPublic;\n }\n\n /** Feedback schema address (DualSignature mode). */\n get feedbackSchema(): Address | undefined {\n return this._deployedConfig?.schemas.feedback;\n }\n\n /** Validation schema address. */\n get validationSchema(): Address | undefined {\n return this._deployedConfig?.schemas.validation;\n }\n\n /** Address Lookup Table for transaction compression. */\n get lookupTable(): Address | undefined {\n return this._deployedConfig?.lookupTable;\n }\n\n // ============================================================\n // CONVENIENCE: Simplified Feedback\n // ============================================================\n\n /**\n * Give feedback to an agent (simplified).\n *\n * Uses FeedbackPublicV1 schema (CounterpartySigned mode).\n * Automatically handles SIWS message construction and signing.\n *\n * @example\n * ```typescript\n * const result = await sati.giveFeedback({\n * payer: myKeypair,\n * agentMint: address(\"Agent...\"),\n * value: 87,\n * valueDecimals: 0,\n * tag1: \"starred\",\n * message: \"Great response time\",\n * });\n * ```\n */\n async giveFeedback(params: GiveFeedbackParams): Promise<GiveFeedbackResult> {\n const schema = this._requireFeedbackPublicSchema();\n const payer = params.payer;\n\n // Validate value\n if (params.value !== undefined && !Number.isFinite(params.value)) {\n throw new Error(`Feedback value must be a finite number, got: ${params.value}`);\n }\n if (params.valueDecimals !== undefined && (params.valueDecimals < 0 || params.valueDecimals > 18)) {\n throw new Error(`valueDecimals must be 0-18, got: ${params.valueDecimals}`);\n }\n\n // Build content JSON (ERC-8004 field names)\n const contentObj: Record<string, unknown> = {};\n if (params.value !== undefined) contentObj.value = params.value;\n if (params.valueDecimals !== undefined) contentObj.valueDecimals = params.valueDecimals;\n if (params.tag1) contentObj.tag1 = params.tag1;\n if (params.tag2) contentObj.tag2 = params.tag2;\n if (params.endpoint) contentObj.endpoint = params.endpoint;\n if (params.message) contentObj.m = params.message;\n\n const content =\n Object.keys(contentObj).length > 0 ? new TextEncoder().encode(JSON.stringify(contentObj)) : new Uint8Array(0);\n const contentType = content.length > 0 ? ContentType.JSON : ContentType.None;\n\n const taskRef = params.taskRef ?? globalThis.crypto.getRandomValues(new Uint8Array(32));\n const outcome = params.outcome ?? Outcome.Neutral;\n\n // Serialize and build SIWS message\n const feedbackData: FeedbackData = {\n taskRef,\n agentMint: params.agentMint,\n counterparty: payer.address,\n dataHash: zeroDataHash(),\n outcome,\n contentType,\n content,\n };\n const serializedData = serializeFeedback(feedbackData);\n const { messageBytes } = buildCounterpartyMessage({\n schemaName: \"FeedbackPublicV1\",\n data: serializedData,\n });\n const sig = await signBytes(payer.keyPair.privateKey, messageBytes);\n\n const result = await this.createFeedback({\n payer,\n sasSchema: schema,\n taskRef,\n agentMint: params.agentMint,\n counterparty: payer.address,\n dataHash: zeroDataHash(),\n outcome,\n contentType,\n content,\n agentSignature: {\n pubkey: payer.address,\n signature: new Uint8Array(sig),\n },\n counterpartyMessage: messageBytes,\n lookupTableAddress: this._deployedConfig?.lookupTable,\n });\n\n this._feedbackCache.invalidate();\n\n return {\n signature: result.signature,\n attestationAddress: result.address,\n };\n }\n\n /**\n * Prepare feedback for browser wallet signing.\n *\n * Returns SIWS message bytes that the counterparty must sign externally.\n * Pass the result + signature to `submitPreparedFeedback()`.\n */\n async prepareFeedback(\n params: Omit<GiveFeedbackParams, \"payer\"> & { counterparty: Address },\n ): Promise<PreparedFeedbackData> {\n const schema = this._requireFeedbackPublicSchema();\n\n if (params.value !== undefined && !Number.isFinite(params.value)) {\n throw new Error(`Feedback value must be a finite number, got: ${params.value}`);\n }\n if (params.valueDecimals !== undefined && (params.valueDecimals < 0 || params.valueDecimals > 18)) {\n throw new Error(`valueDecimals must be 0-18, got: ${params.valueDecimals}`);\n }\n\n // Build content JSON (ERC-8004 field names)\n const contentObj: Record<string, unknown> = {};\n if (params.value !== undefined) contentObj.value = params.value;\n if (params.valueDecimals !== undefined) contentObj.valueDecimals = params.valueDecimals;\n if (params.tag1) contentObj.tag1 = params.tag1;\n if (params.tag2) contentObj.tag2 = params.tag2;\n if (params.endpoint) contentObj.endpoint = params.endpoint;\n if (params.message) contentObj.m = params.message;\n\n const content =\n Object.keys(contentObj).length > 0 ? new TextEncoder().encode(JSON.stringify(contentObj)) : new Uint8Array(0);\n const contentType = content.length > 0 ? ContentType.JSON : ContentType.None;\n\n const taskRef = params.taskRef ?? globalThis.crypto.getRandomValues(new Uint8Array(32));\n const outcome = params.outcome ?? Outcome.Neutral;\n\n const feedbackData: FeedbackData = {\n taskRef,\n agentMint: params.agentMint,\n counterparty: params.counterparty,\n dataHash: zeroDataHash(),\n outcome,\n contentType,\n content,\n };\n const serializedData = serializeFeedback(feedbackData);\n const { messageBytes } = buildCounterpartyMessage({\n schemaName: \"FeedbackPublicV1\",\n data: serializedData,\n });\n\n return {\n messageBytes,\n agentMint: params.agentMint,\n counterparty: params.counterparty,\n taskRef,\n dataHash: zeroDataHash(),\n outcome,\n contentType,\n content,\n sasSchema: schema,\n lookupTable: this._deployedConfig?.lookupTable,\n meta: {\n value: params.value,\n valueDecimals: params.valueDecimals,\n tag1: params.tag1,\n tag2: params.tag2,\n message: params.message,\n endpoint: params.endpoint,\n },\n };\n }\n\n /**\n * Submit prepared feedback with an externally-obtained wallet signature.\n *\n * The payer signs the transaction and pays gas. The counterparty's SIWS\n * signature (from wallet) proves consent.\n */\n async submitPreparedFeedback(params: {\n payer: KeyPairSigner;\n prepared: PreparedFeedbackData;\n counterpartySignature: Uint8Array;\n }): Promise<GiveFeedbackResult> {\n const { payer, prepared, counterpartySignature } = params;\n\n const result = await this.createFeedback({\n payer,\n sasSchema: prepared.sasSchema,\n taskRef: prepared.taskRef,\n agentMint: prepared.agentMint,\n counterparty: prepared.counterparty,\n dataHash: prepared.dataHash,\n outcome: prepared.outcome,\n contentType: prepared.contentType,\n content: prepared.content,\n agentSignature: {\n pubkey: prepared.counterparty,\n signature: new Uint8Array(counterpartySignature),\n },\n counterpartyMessage: prepared.messageBytes,\n lookupTableAddress: prepared.lookupTable,\n });\n\n this._feedbackCache.invalidate();\n\n return {\n signature: result.signature,\n attestationAddress: result.address,\n };\n }\n\n /**\n * Revoke (close) a feedback attestation by its compressed account address.\n *\n * The payer must be the counterparty who originally submitted the feedback.\n * Closed attestations are permanently deleted.\n */\n async revokeFeedback(params: { payer: KeyPairSigner; attestationAddress: Address }): Promise<{ signature: string }> {\n const schema = this._deployedConfig?.schemas.feedbackPublic ?? this._deployedConfig?.schemas.feedback;\n if (!schema) {\n throw new Error(`No feedback schema deployed for network \"${this.network}\"`);\n }\n\n const result = await this.closeCompressedAttestation({\n payer: params.payer,\n counterparty: params.payer,\n sasSchema: schema,\n attestationAddress: params.attestationAddress,\n lookupTableAddress: this._deployedConfig?.lookupTable,\n });\n\n this._feedbackCache.invalidate();\n return { signature: result.signature };\n }\n\n // ============================================================\n // CONVENIENCE: Search & Query\n // ============================================================\n\n /**\n * Search feedback attestations with client-side filtering.\n *\n * Note: `createdAt` timestamps are approximate - derived from Solana slot\n * numbers using ~400ms/slot estimate.\n *\n * @example\n * ```typescript\n * const feedbacks = await sati.searchFeedback({\n * agentMint: address(\"Agent...\"),\n * tag1: \"starred\",\n * minValue: 70,\n * });\n * ```\n */\n async searchFeedback(options?: FeedbackSearchOptions): Promise<ParsedFeedback[]> {\n const schema = this._deployedConfig?.schemas.feedbackPublic ?? this._deployedConfig?.schemas.feedback;\n if (!schema) {\n throw new Error(`No feedback schema deployed for network \"${this.network}\"`);\n }\n\n // Build RPC filter\n const filter: Partial<AttestationFilter> = { sasSchema: schema };\n if (options?.agentMint) filter.agentMint = options.agentMint;\n if (options?.counterparty) filter.counterparty = options.counterparty;\n\n // Check cache\n const cacheKey = FeedbackCache.cacheKey(schema, options?.agentMint);\n const cached = this._feedbackCache.get<PaginatedAttestations<ParsedFeedbackAttestation>>(cacheKey);\n const result = cached ?? (await this.listFeedbacks(filter));\n if (!cached) this._feedbackCache.set(cacheKey, result);\n\n // Fetch current slot for timestamp conversion\n const currentSlot = await this.rpc.getSlot({ commitment: \"confirmed\" }).send();\n const nowSec = Math.floor(Date.now() / 1000);\n\n const feedbacks: ParsedFeedback[] = [];\n for (const item of result.items) {\n const rawContent = this._parseContentJson(item.data.content, item.data.contentType);\n\n const value = rawContent?.value as number | undefined;\n const valueDecimals = rawContent?.valueDecimals as number | undefined;\n const tag1 = rawContent?.tag1 as string | undefined;\n const tag2 = rawContent?.tag2 as string | undefined;\n const message = rawContent?.m as string | undefined;\n const endpoint = rawContent?.endpoint as string | undefined;\n\n // Client-side tag filtering\n if (options?.tag1 !== undefined && tag1 !== options.tag1) continue;\n if (options?.tag2 !== undefined && tag2 !== options.tag2) continue;\n\n // Client-side value filtering\n if (options?.minValue !== undefined && (value === undefined || value < options.minValue)) continue;\n if (options?.maxValue !== undefined && (value === undefined || value > options.maxValue)) continue;\n\n // Compute createdAt from slotCreated (~400ms per slot)\n const slotDiff = Number(BigInt(currentSlot) - item.raw.slotCreated);\n const createdAt = nowSec - Math.floor(slotDiff * 0.4);\n\n const [compressedAddress] = getAddressDecoder().read(item.address, 0);\n\n feedbacks.push({\n compressedAddress,\n agentMint: item.data.agentMint as Address,\n counterparty: item.data.counterparty as Address,\n outcome: item.data.outcome,\n value,\n valueDecimals,\n tag1,\n tag2,\n message,\n endpoint,\n createdAt,\n });\n }\n\n // Optionally populate txHash\n if (options?.includeTxHash) {\n const photon = this.getLightClient().getRpc();\n await Promise.all(\n feedbacks.map(async (fb) => {\n try {\n const sigs = await photon.getCompressionSignaturesForAddress(fb.compressedAddress, { limit: 1 });\n fb.txSignature = sigs.items[0]?.signature;\n } catch (error) {\n this._warn({\n code: \"SIGNATURE_LOOKUP_FAILED\",\n message: \"Failed to fetch tx signature\",\n context: fb.compressedAddress,\n cause: error,\n });\n }\n }),\n );\n }\n\n return feedbacks;\n }\n\n /**\n * Get reputation summary for an agent.\n *\n * Aggregates feedback values, optionally filtered by tag1 and/or tag2.\n *\n * @example\n * ```typescript\n * const summary = await sati.getReputationSummary(address(\"Agent...\"));\n * console.log(`${summary.count} reviews, avg ${summary.averageValue}`);\n * ```\n */\n async getReputationSummary(agentMint: Address, tag1?: string, tag2?: string): Promise<ReputationSummary> {\n const schema = this._deployedConfig?.schemas.feedbackPublic ?? this._deployedConfig?.schemas.feedback;\n if (!schema) {\n throw new Error(`No feedback schema deployed for network \"${this.network}\"`);\n }\n\n const cacheKey = FeedbackCache.cacheKey(schema, agentMint);\n const cached = this._feedbackCache.get<PaginatedAttestations<ParsedFeedbackAttestation>>(cacheKey);\n const result = cached ?? (await this.listFeedbacks({ sasSchema: schema, agentMint }));\n if (!cached) this._feedbackCache.set(cacheKey, result);\n\n if (result.items.length === 0) {\n return { count: 0, averageValue: 0 };\n }\n\n let sum = 0;\n let count = 0;\n\n for (const item of result.items) {\n const rawContent = this._parseContentJson(item.data.content, item.data.contentType);\n const value = rawContent?.value as number | undefined;\n const itemTag1 = rawContent?.tag1 as string | undefined;\n const itemTag2 = rawContent?.tag2 as string | undefined;\n\n // Apply tag filters\n if (tag1 !== undefined && itemTag1 !== tag1) continue;\n if (tag2 !== undefined && itemTag2 !== tag2) continue;\n\n if (value !== undefined) {\n sum += value;\n count++;\n }\n }\n\n return {\n count,\n averageValue: count > 0 ? sum / count : 0,\n };\n }\n\n /**\n * Search validation attestations for an agent.\n *\n * Note: `createdAt` timestamps are approximate.\n */\n async searchValidations(agentMint: Address): Promise<ParsedValidation[]> {\n const validationSchema = this._deployedConfig?.schemas.validation;\n if (!validationSchema) {\n throw new Error(`No validation schema deployed for network \"${this.network}\"`);\n }\n\n const result = await this.listValidations({\n sasSchema: validationSchema,\n agentMint,\n });\n\n const currentSlot = await this.rpc.getSlot({ commitment: \"confirmed\" }).send();\n const nowSec = Math.floor(Date.now() / 1000);\n\n return result.items.map((item) => {\n const slotDiff = Number(BigInt(currentSlot) - item.raw.slotCreated);\n const createdAt = nowSec - Math.floor(slotDiff * 0.4);\n const [compressedAddress] = getAddressDecoder().read(item.address, 0);\n\n return {\n compressedAddress,\n agentMint: item.data.agentMint as Address,\n counterparty: item.data.counterparty as Address,\n outcome: item.data.outcome,\n createdAt,\n };\n });\n }\n\n /**\n * Search registered agents with filtering and optional feedback stats.\n *\n * @example\n * ```typescript\n * const agents = await sati.searchAgents({\n * endpointTypes: [\"MCP\"],\n * active: true,\n * includeFeedbackStats: true,\n * });\n * ```\n */\n async searchAgents(options?: AgentSearchOptions): Promise<AgentSearchResult[]> {\n const limit = options?.limit ?? 100;\n const offset = options?.offset;\n\n // Fetch agents\n let agents: AgentIdentity[];\n if (options?.owner) {\n agents = await this.listAgentsByOwner(options.owner);\n } else {\n agents = await this.listAllAgents({ limit, offset });\n }\n\n // Apply name filter\n if (options?.name) {\n const lower = options.name.toLowerCase();\n agents = agents.filter((a) => a.name.toLowerCase().includes(lower));\n }\n\n // Determine if we need registration files\n const needsRegFile = !!(options?.active !== undefined || options?.endpointTypes?.length);\n\n // Fetch registration files in parallel\n const regFiles: (import(\"./registration\").RegistrationFile | null)[] =\n needsRegFile || options?.includeFeedbackStats\n ? await Promise.all(\n agents.map(async (a) => {\n try {\n return await fetchRegistrationFile(a.uri);\n } catch {\n return null;\n }\n }),\n )\n : agents.map(() => null);\n\n // Apply filters\n const filtered: { identity: AgentIdentity; regFile: import(\"./registration\").RegistrationFile | null }[] = [];\n for (let i = 0; i < agents.length; i++) {\n const identity = agents[i];\n const regFile = regFiles[i];\n const services = regFile?.services ?? [];\n\n if (options?.active !== undefined && (regFile?.active ?? true) !== options.active) continue;\n if (options?.endpointTypes?.length) {\n const hasAllTypes = options.endpointTypes.every((type) =>\n services.some((e) => e.name.toUpperCase() === type.toUpperCase()),\n );\n if (!hasAllTypes) continue;\n }\n\n filtered.push({ identity, regFile });\n }\n\n // Optionally fetch feedback stats\n let statsMap: Map<string, ReputationSummary> | null = null;\n if (options?.includeFeedbackStats && this._deployedConfig && filtered.length > 0) {\n statsMap = new Map();\n await Promise.all(\n filtered.map(async ({ identity }) => {\n try {\n const summary = await this.getReputationSummary(identity.mint);\n statsMap?.set(identity.mint, summary);\n } catch (error) {\n this._warn({\n code: \"RPC_ERROR\",\n message: \"Failed to fetch feedback stats\",\n context: identity.mint,\n cause: error,\n });\n }\n }),\n );\n }\n\n return filtered.map(({ identity, regFile }) => ({\n identity,\n registrationFile: regFile,\n ...(statsMap && { feedbackStats: statsMap.get(identity.mint) }),\n }));\n }\n\n // ============================================================\n // CONVENIENCE: Agent Builder\n // ============================================================\n\n /**\n * Create a fluent builder for agent registration.\n *\n * @example\n * ```typescript\n * const builder = sati.createAgentBuilder(\"MyAgent\", \"AI assistant\", \"https://example.com/avatar.png\");\n * builder.setMCP(\"https://mcp.example.com\").setActive(true);\n * const result = await builder.register({ payer, uploader: createSatiUploader() });\n * ```\n */\n createAgentBuilder(name: string, description: string, image: string): SatiAgentBuilder {\n return new SatiAgentBuilder(this, name, description, image);\n }\n\n // ============================================================\n // CONVENIENCE: Private Helpers\n // ============================================================\n\n /** Safely parse JSON content from an attestation. */\n private _parseContentJson(content: Uint8Array, contentType: number): Record<string, unknown> | null {\n if (contentType !== ContentType.JSON || content.length === 0) return null;\n try {\n return JSON.parse(new TextDecoder().decode(content)) as Record<string, unknown>;\n } catch {\n return null;\n }\n }\n\n /** Fire a non-fatal warning. */\n private _warn(warning: SatiWarning): void {\n this._onWarning?.(warning);\n }\n\n /** Get the FeedbackPublic schema address or throw. */\n private _requireFeedbackPublicSchema(): Address {\n const schema = this._deployedConfig?.schemas.feedbackPublic;\n if (!schema) {\n throw new Error(\n `No FeedbackPublic schema deployed for network \"${this.network}\". ` +\n \"Pass sasSchema explicitly via the low-level createFeedback() method.\",\n );\n }\n return schema;\n }\n}\n","/**\n * SATI SDK Error Types\n *\n * Follows the same pattern as cascade-splits/splits-sdk for consistency.\n */\n\n/** All possible SDK error codes */\nexport type SatiErrorCode =\n | \"DUPLICATE_ATTESTATION\"\n | \"AGENT_NOT_FOUND\"\n | \"SCHEMA_NOT_FOUND\"\n | \"INVALID_SIGNATURE\"\n | \"TRANSACTION_FAILED\"\n | \"WALLET_REJECTED\"\n | \"WALLET_DISCONNECTED\"\n | \"NETWORK_ERROR\"\n | \"TRANSACTION_EXPIRED\";\n\n/** Base class for all SATI SDK errors */\nexport class SatiError extends Error {\n constructor(\n message: string,\n public readonly code: SatiErrorCode,\n options?: ErrorOptions,\n ) {\n super(message, options);\n this.name = \"SatiError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Thrown when attempting to create an attestation that already exists.\n * This occurs when the same (schema, agent, taskRef, dataHash) combination\n * is submitted twice.\n *\n * Light Protocol error: 9002 (0x232a)\n */\nexport class DuplicateAttestationError extends SatiError {\n constructor(options?: ErrorOptions) {\n super(\"An attestation with these parameters already exists\", \"DUPLICATE_ATTESTATION\", options);\n this.name = \"DuplicateAttestationError\";\n }\n}\n\n/** Agent mint is not a registered SATI agent */\nexport class AgentNotFoundError extends SatiError {\n constructor(\n public readonly agentMint: string,\n options?: ErrorOptions,\n ) {\n super(`Agent not found: ${agentMint}`, \"AGENT_NOT_FOUND\", options);\n this.name = \"AgentNotFoundError\";\n }\n}\n\n/** Schema not found or not initialized */\nexport class SchemaNotFoundError extends SatiError {\n constructor(\n public readonly schema: string,\n options?: ErrorOptions,\n ) {\n super(`Schema not found: ${schema}`, \"SCHEMA_NOT_FOUND\", options);\n this.name = \"SchemaNotFoundError\";\n }\n}\n\n// Light Protocol error codes\nexport const LIGHT_ERROR_CODES = {\n DUPLICATE_LEAF: 9002, // 0x232a\n} as const;\n","/**\n * User-facing error messages.\n *\n * Separated for reusability and potential i18n.\n * Follows the same pattern as cascade-splits/splits-sdk.\n */\n\nexport function duplicateAttestationMessage(): string {\n return \"You've already submitted feedback for this interaction. Each interaction can only be attested once.\";\n}\n\nexport function walletRejectedMessage(): string {\n return \"Transaction was rejected by your wallet.\";\n}\n\nexport function walletDisconnectedMessage(): string {\n return \"Wallet disconnected. Please reconnect and try again.\";\n}\n\nexport function networkErrorMessage(): string {\n return \"Network error. Please check your connection and try again.\";\n}\n\nexport function transactionExpiredMessage(): string {\n return \"Transaction expired. Please try again.\";\n}\n\nexport function transactionFailedMessage(detail?: string): string {\n return detail ? `Transaction failed: ${detail}` : \"Transaction failed. Please try again.\";\n}\n","/**\n * Transaction error handling utilities.\n *\n * Converts raw Solana/Light Protocol errors into structured results\n * with user-friendly messages.\n *\n * Follows the same pattern as cascade-splits/splits-sdk.\n */\n\nimport {\n duplicateAttestationMessage,\n walletRejectedMessage,\n walletDisconnectedMessage,\n networkErrorMessage,\n transactionExpiredMessage,\n transactionFailedMessage,\n} from \"./messages.js\";\n\n/** Reason why a transaction failed */\nexport type FailedReason =\n | \"duplicate_attestation\"\n | \"wallet_rejected\"\n | \"wallet_disconnected\"\n | \"network_error\"\n | \"transaction_expired\"\n | \"program_error\";\n\n/** Result when a transaction fails */\nexport interface FailedResult {\n status: \"failed\";\n reason: FailedReason;\n message: string;\n error?: Error;\n}\n\n/** Check if error is Light Protocol duplicate leaf (9002 / 0x232a) */\nfunction isDuplicateLeafError(error: unknown): boolean {\n const str = String(error);\n return str.includes(\"9002\") || str.includes(\"0x232a\");\n}\n\n/** Check if error is wallet rejection */\nfunction isWalletRejectedError(error: unknown): boolean {\n const str = String(error);\n return str.includes(\"User rejected\") || str.includes(\"user rejected\") || str.includes(\"rejected the request\");\n}\n\n/** Check if error is wallet disconnected */\nfunction isWalletDisconnectedError(error: unknown): boolean {\n const str = String(error);\n return str.includes(\"disconnected\") || str.includes(\"not connected\");\n}\n\n/** Check if error is network related */\nfunction isNetworkError(error: unknown): boolean {\n const str = String(error);\n return (\n str.includes(\"network\") || str.includes(\"fetch\") || str.includes(\"ECONNREFUSED\") || str.includes(\"Failed to fetch\")\n );\n}\n\n/** Check if error is transaction expiration */\nfunction isTransactionExpiredError(error: unknown): boolean {\n const str = String(error);\n return str.includes(\"expired\") || str.includes(\"blockhash not found\");\n}\n\n/**\n * Convert a raw transaction error into a structured FailedResult.\n *\n * Use this when catching errors from transaction submission or RPC calls.\n * Returns a result object with a user-friendly message and typed reason.\n *\n * @example\n * ```typescript\n * try {\n * await sati.createFeedback(...);\n * } catch (error) {\n * const result = handleTransactionError(error);\n * if (result.reason === \"duplicate_attestation\") {\n * // Show \"already submitted\" message\n * }\n * toast.error(result.message);\n * }\n * ```\n */\nexport function handleTransactionError(error: unknown): FailedResult {\n const wrappedError = error instanceof Error ? error : new Error(String(error));\n\n // Check specific error types in order of likelihood\n if (isDuplicateLeafError(error)) {\n return {\n status: \"failed\",\n reason: \"duplicate_attestation\",\n message: duplicateAttestationMessage(),\n error: wrappedError,\n };\n }\n\n if (isWalletRejectedError(error)) {\n return {\n status: \"failed\",\n reason: \"wallet_rejected\",\n message: walletRejectedMessage(),\n error: wrappedError,\n };\n }\n\n if (isWalletDisconnectedError(error)) {\n return {\n status: \"failed\",\n reason: \"wallet_disconnected\",\n message: walletDisconnectedMessage(),\n error: wrappedError,\n };\n }\n\n if (isNetworkError(error)) {\n return {\n status: \"failed\",\n reason: \"network_error\",\n message: networkErrorMessage(),\n error: wrappedError,\n };\n }\n\n if (isTransactionExpiredError(error)) {\n return {\n status: \"failed\",\n reason: \"transaction_expired\",\n message: transactionExpiredMessage(),\n error: wrappedError,\n };\n }\n\n // Default: generic program error\n return {\n status: \"failed\",\n reason: \"program_error\",\n message: transactionFailedMessage(wrappedError.message),\n error: wrappedError,\n };\n}\n"],"mappings":"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"}
|