@theliem/xmarket-sdk 1.0.12 → 3.0.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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config/networks.ts","../src/pda.ts","../src/programs/oracle.ts","../src/programs/hook.ts","../src/types.ts","../src/programs/market.ts","../src/programs/ctf.ts","../src/signing.ts","../src/programs/clob.ts","../src/sdk.ts","../src/order.ts","../src/approve.ts"],"names":["PublicKey","createHash","SystemProgram","anchor","TOKEN_2022_PROGRAM_ID","QuestionStatus","anchor2","SYSVAR_RENT_PUBKEY","TOKEN_PROGRAM_ID","getAssociatedTokenAddressSync","ASSOCIATED_TOKEN_PROGRAM_ID","anchor3","TransactionInstruction","Ed25519Program","SYSVAR_INSTRUCTIONS_PUBKEY","TransactionMessage","VersionedTransaction","anchor4","Connection","oracleIdl","hookIdl","questionMarketIdl","conditionalTokensIdl","clobExchangeIdl","BN","nacl","aBuy","bBuy","createApproveInstruction","Transaction"],"mappings":"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","file":"index.js","sourcesContent":["import { PublicKey } from \"@solana/web3.js\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface ProgramIds {\n oracle: PublicKey;\n conditionalTokens: PublicKey;\n questionMarket: PublicKey;\n hook: PublicKey;\n clobExchange: PublicKey;\n}\n\nexport interface CollateralConfig {\n mint: PublicKey;\n /** Token decimals (USDC = 6) */\n decimals: number;\n}\n\nexport interface NetworkConfig {\n name: string;\n rpcUrl: string;\n programIds: ProgramIds;\n defaultCollateral: CollateralConfig;\n}\n\nexport type NetworkName = \"devnet\" | \"localnet\" | \"mainnet\";\n\n// ─── Devnet ───────────────────────────────────────────────────────────────────\n// Programs deployed to devnet (same IDs as localnet anchored build)\n\nexport const DEVNET_CONFIG: NetworkConfig = {\n name: \"devnet\",\n rpcUrl: \"https://api.devnet.solana.com\",\n programIds: {\n oracle: new PublicKey(\"FzLnnbKtQCTKviEbrDYMLZYXNDHQdjSSa4Ybj4jAbrUL\"),\n conditionalTokens: new PublicKey(\"A6N1F8MRsdgcojAx8p6FaECvw8mo8w6qJcWsbKQBANK4\"),\n questionMarket: new PublicKey(\"FCvCbWoLpzNYKzQnXYXCo1yz9DTpgUs11QqHVqnqtWhA\"),\n hook: new PublicKey(\"F7y5MfW8d5kqR25QHDhUQ9LrKCiZUZVF6Pdnw15q5zZW\"),\n clobExchange: new PublicKey(\"Cs4GY1yZVxjxhhyUum3AupMuS3bo4yKRXifgLTTAh1sf\"),\n },\n defaultCollateral: {\n mint: new PublicKey(\"53osACZSom79AHf6nK4eq8DL6viMZmyVERYPDB6S6Eck\"),\n decimals: 9,\n },\n};\n\n// ─── Localnet ─────────────────────────────────────────────────────────────────\n// Same program IDs as devnet (anchor build uses the same keypairs).\n// RPC points to local test validator.\n\nexport const LOCALNET_CONFIG: NetworkConfig = {\n name: \"localnet\",\n rpcUrl: \"http://localhost:8899\",\n programIds: { ...DEVNET_CONFIG.programIds },\n defaultCollateral: {\n mint: new PublicKey(\"6Gk4qsruSjunenwzP4L5DQukawfVNvdr9rPX2qG77jmH\"),\n decimals: 6,\n },\n};\n\n// ─── Mainnet ──────────────────────────────────────────────────────────────────\n// Oracle / CTF / QuestionMarket are deployed to mainnet.\n// Hook + CLOB program IDs will be filled in after mainnet deployment.\n\nexport const MAINNET_CONFIG: NetworkConfig = {\n name: \"mainnet\",\n rpcUrl: \"https://api.mainnet-beta.solana.com\",\n programIds: {\n oracle: new PublicKey(\"E667trvbHmZEnptjnjXp9x8e1Fpji3viHo1J1DGPKijh\"),\n conditionalTokens: new PublicKey(\"3WFSX7zPLrJSU811h7awgqXTZuKhUR1Fi1VBDayHhk4s\"),\n questionMarket: new PublicKey(\"GiQh2xBmEiM4gYq4U9PMSaUJNq1T9TfEJL5cXvNYhtGm\"),\n hook: new PublicKey(\"11111111111111111111111111111111\"), // not yet deployed\n clobExchange: new PublicKey(\"11111111111111111111111111111111\"), // not yet deployed\n },\n defaultCollateral: {\n mint: new PublicKey(\"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\"), // USDC mainnet\n decimals: 6,\n },\n};\n\n// ─── Registry ─────────────────────────────────────────────────────────────────\n\nexport const NETWORK_CONFIGS: Record<NetworkName, NetworkConfig> = {\n devnet: DEVNET_CONFIG,\n localnet: LOCALNET_CONFIG,\n mainnet: MAINNET_CONFIG,\n};\n","import { PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport { createHash } from \"crypto\";\nimport { ProgramIds } from \"./config/networks\";\n\n// ─── PDA Seeds ────────────────────────────────────────────────────────────────\n// These are constants — they don't change per network.\n\nexport const SEEDS = {\n config: Buffer.from(\"config\"),\n question: Buffer.from(\"question\"),\n condition: Buffer.from(\"condition\"),\n collateralVault: Buffer.from(\"collateral_vault\"),\n vaultToken: Buffer.from(\"vault_token\"),\n position: Buffer.from(\"position\"),\n yesMint: Buffer.from(\"yes_mint\"),\n noMint: Buffer.from(\"no_mint\"),\n mintAuthority: Buffer.from(\"mint_authority\"),\n reporter: Buffer.from(\"reporter\"),\n result: Buffer.from(\"result\"),\n ctfConfig: Buffer.from(\"ctf_config\"),\n hookConfig: Buffer.from(\"hook_config\"),\n extraAccountMetas: Buffer.from(\"extra-account-metas\"),\n clobConfig: Buffer.from(\"clob_config\"),\n order: Buffer.from(\"order\"),\n} as const;\n\n// ─── PDA derivation helpers ───────────────────────────────────────────────────\n// All methods require explicit programIds — no hidden globals.\n\nexport class PDA {\n // ─── Question Market ────────────────────────────────────────────────────────\n\n static questionMarketConfig(\n owner: PublicKey,\n programIds: Pick<ProgramIds, \"questionMarket\">\n ): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [SEEDS.config, owner.toBuffer()],\n programIds.questionMarket\n );\n }\n\n static question(\n config: PublicKey,\n questionId: Uint8Array,\n programIds: Pick<ProgramIds, \"questionMarket\">\n ): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [SEEDS.question, config.toBuffer(), Buffer.from(questionId)],\n programIds.questionMarket\n );\n }\n\n // ─── Conditional Tokens ─────────────────────────────────────────────────────\n\n static ctfConfig(\n programIds: Pick<ProgramIds, \"conditionalTokens\">\n ): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [SEEDS.ctfConfig],\n programIds.conditionalTokens\n );\n }\n\n static condition(\n oracle: PublicKey,\n questionId: Uint8Array,\n programIds: Pick<ProgramIds, \"conditionalTokens\">\n ): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [SEEDS.condition, oracle.toBuffer(), Buffer.from(questionId)],\n programIds.conditionalTokens\n );\n }\n\n static collateralVault(\n collateralMint: PublicKey,\n programIds: Pick<ProgramIds, \"conditionalTokens\">\n ): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [SEEDS.collateralVault, collateralMint.toBuffer()],\n programIds.conditionalTokens\n );\n }\n\n static vaultToken(\n collateralMint: PublicKey,\n programIds: Pick<ProgramIds, \"conditionalTokens\">\n ): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [SEEDS.vaultToken, collateralMint.toBuffer()],\n programIds.conditionalTokens\n );\n }\n\n static yesMint(\n condition: PublicKey,\n programIds: Pick<ProgramIds, \"conditionalTokens\">\n ): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [SEEDS.yesMint, condition.toBuffer()],\n programIds.conditionalTokens\n );\n }\n\n static noMint(\n condition: PublicKey,\n programIds: Pick<ProgramIds, \"conditionalTokens\">\n ): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [SEEDS.noMint, condition.toBuffer()],\n programIds.conditionalTokens\n );\n }\n\n static mintAuthority(\n condition: PublicKey,\n programIds: Pick<ProgramIds, \"conditionalTokens\">\n ): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [SEEDS.mintAuthority, condition.toBuffer()],\n programIds.conditionalTokens\n );\n }\n\n static position(\n condition: PublicKey,\n outcomeIndex: number,\n owner: PublicKey,\n programIds: Pick<ProgramIds, \"conditionalTokens\">\n ): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [SEEDS.position, condition.toBuffer(), Buffer.from([outcomeIndex]), owner.toBuffer()],\n programIds.conditionalTokens\n );\n }\n\n // ─── Oracle ─────────────────────────────────────────────────────────────────\n\n static oracleConfig(\n owner: PublicKey,\n programIds: Pick<ProgramIds, \"oracle\">\n ): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [SEEDS.config, owner.toBuffer()],\n programIds.oracle\n );\n }\n\n static reporter(\n oracleConfig: PublicKey,\n reporterAddress: PublicKey,\n programIds: Pick<ProgramIds, \"oracle\">\n ): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [SEEDS.reporter, oracleConfig.toBuffer(), reporterAddress.toBuffer()],\n programIds.oracle\n );\n }\n\n static questionResult(\n oracleConfig: PublicKey,\n questionId: Uint8Array,\n programIds: Pick<ProgramIds, \"oracle\">\n ): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [SEEDS.result, oracleConfig.toBuffer(), Buffer.from(questionId)],\n programIds.oracle\n );\n }\n\n // ─── Hook ───────────────────────────────────────────────────────────────────\n\n static hookConfig(\n programIds: Pick<ProgramIds, \"hook\">\n ): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [SEEDS.hookConfig],\n programIds.hook\n );\n }\n\n static extraAccountMetaList(\n mint: PublicKey,\n programIds: Pick<ProgramIds, \"hook\">\n ): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [SEEDS.extraAccountMetas, mint.toBuffer()],\n programIds.hook\n );\n }\n\n // ─── CLOB ───────────────────────────────────────────────────────────────────\n\n static clobConfig(\n programIds: Pick<ProgramIds, \"clobExchange\">\n ): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [SEEDS.clobConfig],\n programIds.clobExchange\n );\n }\n\n static orderStatus(\n maker: PublicKey,\n nonce: BN,\n programIds: Pick<ProgramIds, \"clobExchange\">\n ): [PublicKey, number] {\n const nonceBuf = Buffer.alloc(8);\n nonceBuf.writeBigUInt64LE(BigInt(nonce.toString()));\n return PublicKey.findProgramAddressSync(\n [SEEDS.order, maker.toBuffer(), nonceBuf],\n programIds.clobExchange\n );\n }\n}\n\n// ─── Utilities ────────────────────────────────────────────────────────────────\n\n/** Unique 32-byte question ID: SHA-256(content + timestamp). Different each call. */\nexport function generateQuestionId(content: string, salt?: number): Uint8Array {\n const input = content + (salt ?? Date.now());\n return new Uint8Array(createHash(\"sha256\").update(input).digest());\n}\n\n/** Deterministic 32-byte content hash: SHA-256(content). Same content = same hash. */\nexport function generateContentHash(content: string): Uint8Array {\n return new Uint8Array(createHash(\"sha256\").update(content).digest());\n}\n","import * as anchor from \"@coral-xyz/anchor\";\nimport { Keypair, PublicKey, SystemProgram } from \"@solana/web3.js\";\nimport { PDA } from \"../pda\";\nimport { ProgramIds } from \"../config/networks\";\nimport { OracleConfig, QuestionResult, TxResult } from \"../types\";\n\nexport class OracleClient {\n private readonly program: anchor.Program;\n private readonly provider: anchor.AnchorProvider;\n private readonly programIds: ProgramIds;\n\n constructor(\n program: anchor.Program,\n provider: anchor.AnchorProvider,\n programIds: ProgramIds\n ) {\n this.program = program;\n this.provider = provider;\n this.programIds = programIds;\n }\n\n get walletPubkey(): PublicKey {\n return this.provider.wallet.publicKey;\n }\n\n configPda(owner: PublicKey = this.walletPubkey): PublicKey {\n return PDA.oracleConfig(owner, this.programIds)[0];\n }\n\n // ─── Instructions ────────────────────────────────────────────────────────────\n\n /** One-time setup. Caller becomes owner. */\n async initialize(admin: PublicKey): Promise<TxResult> {\n const sig = await this.program.methods\n .initialize(admin)\n .accounts({\n owner: this.walletPubkey,\n oracleConfig: this.configPda(),\n systemProgram: SystemProgram.programId,\n })\n .rpc();\n return { signature: sig };\n }\n\n /** Admin or owner adds an address to the oracle whitelist. */\n async addToWhitelist(address: PublicKey, ownerPubkey?: PublicKey): Promise<TxResult> {\n const sig = await this.program.methods\n .addToWhitelist(address)\n .accounts({\n authority: this.walletPubkey,\n payer: this.walletPubkey,\n oracleConfig: this.configPda(ownerPubkey),\n })\n .rpc();\n return { signature: sig };\n }\n\n /** Admin or owner removes an address from the oracle whitelist. */\n async removeFromWhitelist(address: PublicKey, ownerPubkey?: PublicKey): Promise<TxResult> {\n const sig = await this.program.methods\n .removeFromWhitelist(address)\n .accounts({\n authority: this.walletPubkey,\n payer: this.walletPubkey,\n oracleConfig: this.configPda(ownerPubkey),\n })\n .rpc();\n return { signature: sig };\n }\n\n /**\n * Whitelisted reporter resolves a question.\n * CPIs directly into CTF.set_payout — condition is resolved in one tx.\n * @param conditionPda - CTF condition account (oracle_config = oraclePda, question_id must match)\n * @param ownerPubkey - oracle config owner (defaults to wallet)\n * @param payer - fee payer (defaults to wallet)\n */\n async resolveQuestion(\n questionId: Uint8Array,\n outcomeCount: number,\n payoutNumerators: number[],\n conditionPda: PublicKey,\n ownerPubkey?: PublicKey,\n payer?: PublicKey,\n signers: Keypair[] = []\n ): Promise<TxResult> {\n const oracleConfig = this.configPda(ownerPubkey);\n const [questionResultPda] = PDA.questionResult(oracleConfig, questionId, this.programIds);\n const sig = await this.program.methods\n .resolveQuestion(\n Array.from(questionId) as number[],\n outcomeCount,\n payoutNumerators.map((n) => new anchor.BN(n))\n )\n .accounts({\n reporter: this.walletPubkey,\n oracleConfig,\n questionResult: questionResultPda,\n condition: conditionPda,\n conditionalTokensProgram: this.programIds.conditionalTokens,\n payer: payer ?? this.walletPubkey,\n systemProgram: SystemProgram.programId,\n })\n .signers(signers)\n .rpc();\n return { signature: sig };\n }\n\n /** Owner updates the admin. */\n async updateAdmin(newAdmin: PublicKey, ownerPubkey?: PublicKey): Promise<TxResult> {\n const sig = await this.program.methods\n .updateAdmin(newAdmin)\n .accounts({\n owner: this.walletPubkey,\n oracleConfig: this.configPda(ownerPubkey),\n })\n .rpc();\n return { signature: sig };\n }\n\n /** Owner transfers ownership to a new keypair. */\n async transferOwnership(newOwner: PublicKey, ownerPubkey?: PublicKey): Promise<TxResult> {\n const sig = await this.program.methods\n .transferOwnership(newOwner)\n .accounts({\n owner: this.walletPubkey,\n oracleConfig: this.configPda(ownerPubkey),\n })\n .rpc();\n return { signature: sig };\n }\n\n /** Admin or owner pause/unpause the oracle. */\n async pause(paused: boolean, ownerPubkey?: PublicKey): Promise<TxResult> {\n const sig = await this.program.methods\n .pause(paused)\n .accounts({\n authority: this.walletPubkey,\n oracleConfig: this.configPda(ownerPubkey),\n })\n .rpc();\n return { signature: sig };\n }\n\n // ─── Queries ─────────────────────────────────────────────────────────────────\n\n async fetchConfig(owner?: PublicKey): Promise<OracleConfig | null> {\n try {\n const acc = await (this.program.account as any).oracleConfig.fetch(\n this.configPda(owner ?? this.walletPubkey)\n );\n return {\n owner: acc.owner,\n admin: acc.admin,\n questionCount: acc.questionCount.toNumber(),\n whitelist: acc.whitelist as PublicKey[],\n whitelistLen: acc.whitelistLen,\n isPaused: acc.isPaused,\n bump: acc.bump,\n };\n } catch {\n return null;\n }\n }\n\n async fetchQuestionResult(\n questionId: Uint8Array,\n ownerPubkey?: PublicKey\n ): Promise<QuestionResult | null> {\n try {\n const oracleConfig = this.configPda(ownerPubkey);\n const [pda] = PDA.questionResult(oracleConfig, questionId, this.programIds);\n const acc = await (this.program.account as any).questionResult.fetch(pda);\n return {\n oracleConfig: acc.oracleConfig,\n questionId: new Uint8Array(acc.questionId),\n outcomeIndex: acc.outcomeIndex,\n outcomeCount: acc.outcomeCount,\n payoutNumerators: acc.payoutNumerators,\n isResolved: acc.isResolved,\n resolvedAt: acc.resolvedAt.toNumber(),\n reporter: acc.reporter,\n condition: acc.condition ?? null,\n bump: acc.bump,\n };\n } catch {\n return null;\n }\n }\n}\n","import * as anchor from \"@coral-xyz/anchor\";\nimport { PublicKey, SystemProgram } from \"@solana/web3.js\";\nimport { TOKEN_2022_PROGRAM_ID } from \"@solana/spl-token\";\nimport { PDA } from \"../pda\";\nimport { ProgramIds } from \"../config/networks\";\nimport { HookConfig, TxResult } from \"../types\";\n\nexport class HookClient {\n private readonly program: anchor.Program;\n private readonly provider: anchor.AnchorProvider;\n private readonly programIds: ProgramIds;\n\n constructor(\n program: anchor.Program,\n provider: anchor.AnchorProvider,\n programIds: ProgramIds\n ) {\n this.program = program;\n this.provider = provider;\n this.programIds = programIds;\n }\n\n get walletPubkey(): PublicKey {\n return this.provider.wallet.publicKey;\n }\n\n configPda(): PublicKey {\n return PDA.hookConfig(this.programIds)[0];\n }\n\n // ─── Instructions ────────────────────────────────────────────────────────────\n\n /** One-time setup. Caller becomes owner. */\n async initialize(initialWhitelist: PublicKey[]): Promise<TxResult> {\n const sig = await this.program.methods\n .initializeHookConfig(initialWhitelist)\n .accounts({\n owner: this.walletPubkey,\n hookConfig: this.configPda(),\n systemProgram: SystemProgram.programId,\n })\n .rpc();\n return { signature: sig };\n }\n\n /**\n * Register extra account metas for a Token-2022 YES/NO mint.\n * Must be called once per mint after CTF creates it.\n */\n async initializeExtraAccountMetaList(mint: PublicKey): Promise<TxResult> {\n const [extraAccountMetaList] = PDA.extraAccountMetaList(mint, this.programIds);\n const sig = await this.program.methods\n .initializeExtraAccountMetaList()\n .accounts({\n payer: this.walletPubkey,\n extraAccountMetaList,\n mint,\n hookConfig: this.configPda(),\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .rpc();\n return { signature: sig };\n }\n\n /** Owner adds a program to the transfer whitelist. */\n async addToWhitelist(program: PublicKey): Promise<TxResult> {\n const sig = await this.program.methods\n .addToWhitelist(program)\n .accounts({\n owner: this.walletPubkey,\n hookConfig: this.configPda(),\n })\n .rpc();\n return { signature: sig };\n }\n\n /** Owner removes a program from the transfer whitelist. */\n async removeFromWhitelist(program: PublicKey): Promise<TxResult> {\n const sig = await this.program.methods\n .removeFromWhitelist(program)\n .accounts({\n owner: this.walletPubkey,\n hookConfig: this.configPda(),\n })\n .rpc();\n return { signature: sig };\n }\n\n /** Permanently freeze the whitelist — no further changes allowed. */\n async freezeWhitelist(): Promise<TxResult> {\n const sig = await this.program.methods\n .freezeWhitelist()\n .accounts({\n owner: this.walletPubkey,\n hookConfig: this.configPda(),\n })\n .rpc();\n return { signature: sig };\n }\n\n /**\n * SPL Transfer-Hook `execute` — invoked automatically by Token-2022 on every\n * YES/NO token transfer. Validates the destination against the whitelist.\n *\n * Calling this directly is useful for:\n * - Off-chain simulation (\"would this transfer be allowed?\")\n * - Integration tests that verify whitelist enforcement\n *\n * Token-2022 calls this automatically; you normally don't call it manually.\n *\n * @param sourceToken - Source token account (tokens leaving)\n * @param mint - The YES/NO Token-2022 mint\n * @param destinationToken - Destination token account (tokens arriving)\n * @param owner - Authority that authorized the transfer\n * @param amount - Token amount being transferred\n */\n async execute(\n sourceToken: PublicKey,\n mint: PublicKey,\n destinationToken: PublicKey,\n owner: PublicKey,\n amount: anchor.BN\n ): Promise<TxResult> {\n const [extraAccountMetaList] = PDA.extraAccountMetaList(mint, this.programIds);\n const sig = await this.program.methods\n .execute(amount)\n .accounts({\n sourceToken,\n mint,\n destinationToken,\n owner,\n extraAccountMetaList,\n hookConfig: this.configPda(),\n })\n .rpc();\n return { signature: sig };\n }\n\n // ─── Queries ─────────────────────────────────────────────────────────────────\n\n async fetchConfig(): Promise<HookConfig | null> {\n try {\n const acc = await (this.program.account as any).hookConfig.fetch(this.configPda());\n return {\n owner: acc.owner,\n whitelist: acc.whitelist as PublicKey[],\n whitelistLen: acc.whitelistLen,\n isFrozen: acc.isFrozen,\n bump: acc.bump,\n };\n } catch {\n return null;\n }\n }\n\n async isWhitelisted(program: PublicKey): Promise<boolean> {\n const config = await this.fetchConfig();\n if (!config) return false;\n return config.whitelist.some((p) => p.equals(program));\n }\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\n\n// ─── Shared ───────────────────────────────────────────────────────────────────\n\nexport interface TxResult {\n signature: string;\n}\n\n// ─── Oracle ───────────────────────────────────────────────────────────────────\n\nexport interface OracleConfig {\n owner: PublicKey;\n admin: PublicKey;\n questionCount: number;\n whitelist: PublicKey[];\n whitelistLen: number;\n isPaused: boolean;\n bump: number;\n}\n\nexport interface QuestionResult {\n oracleConfig: PublicKey;\n questionId: Uint8Array;\n outcomeIndex: number;\n outcomeCount: number;\n payoutNumerators: BN[];\n isResolved: boolean;\n resolvedAt: number;\n reporter: PublicKey;\n condition: PublicKey | null;\n bump: number;\n}\n\n// ─── Conditional Tokens ───────────────────────────────────────────────────────\n\nexport interface Condition {\n oracle: PublicKey;\n questionId: Uint8Array;\n outcomeSlotCount: number;\n payoutNumerators: BN[];\n payoutDenominator: BN;\n totalCollateral: BN;\n collateralMint: PublicKey;\n collateralVault: PublicKey;\n yesMint: PublicKey;\n noMint: PublicKey;\n hookProgram: PublicKey;\n authorizedClob: PublicKey;\n isResolved: boolean;\n resolvedAt: number;\n bump: number;\n}\n\nexport interface CollateralVault {\n collateralMint: PublicKey;\n vaultTokenAccount: PublicKey;\n totalLocked: BN;\n conditionCount: BN;\n bump: number;\n vaultBump: number;\n}\n\nexport interface Position {\n owner: PublicKey;\n condition: PublicKey;\n outcomeIndex: number;\n balance: BN;\n bump: number;\n}\n\n// ─── Question Market ──────────────────────────────────────────────────────────\n\nexport enum QuestionStatus {\n Pending = \"pending\",\n Approved = \"approved\",\n Rejected = \"rejected\",\n Resolved = \"resolved\",\n}\n\nexport interface QuestionMarketConfig {\n owner: PublicKey;\n admin: PublicKey;\n oracle: PublicKey;\n conditionalTokensProgram: PublicKey;\n questionCount: number;\n approvedCount: number;\n rejectedCount: number;\n whitelist: PublicKey[];\n whitelistLen: number;\n isPaused: boolean;\n bump: number;\n}\n\nexport interface Question {\n config: PublicKey;\n questionId: Uint8Array;\n contentHash: Uint8Array;\n expirationTime: number;\n currencyMint: PublicKey;\n creator: PublicKey;\n condition: PublicKey | null;\n status: QuestionStatus;\n createdAt: number;\n approvedAt: number;\n resolvedAt: number;\n bump: number;\n}\n\nexport interface CreateQuestionParams {\n /** Human-readable question text — used to derive questionId + contentHash */\n content: string;\n /** Expiration as Unix timestamp */\n expirationTime: number;\n /** Collateral mint (e.g. USDC) */\n collateralMint: PublicKey;\n /** Hook program ID for Token-2022 transfer enforcement */\n hookProgram: PublicKey;\n /** Authorized CLOB program ID */\n authorizedClob: PublicKey;\n /** Override auto-generated questionId */\n questionId?: Uint8Array;\n /** Override auto-generated contentHash */\n contentHash?: Uint8Array;\n}\n\n// ─── Conditional Tokens (CtfConfig) ──────────────────────────────────────────\n\nexport interface CtfConfig {\n owner: PublicKey;\n bump: number;\n}\n\n// ─── Hook ─────────────────────────────────────────────────────────────────────\n\nexport interface HookConfig {\n owner: PublicKey;\n whitelist: PublicKey[];\n whitelistLen: number;\n isFrozen: boolean;\n bump: number;\n}\n\n// ─── CLOB Exchange ────────────────────────────────────────────────────────────\n\nexport interface ClobConfig {\n owner: PublicKey;\n operators: PublicKey[];\n operatorsLen: number;\n feeRecipient: PublicKey;\n feeRateBps: number;\n conditionalTokensProgram: PublicKey;\n isPaused: boolean;\n bump: number;\n}\n\nexport interface ClobWhitelistEntry {\n address: PublicKey;\n bump: number;\n}\n\nexport interface OrderStatus {\n maker: PublicKey;\n nonce: BN;\n filledAmount: BN;\n isCancelled: boolean;\n bump: number;\n}\n\n/**\n * Off-chain order struct passed as instruction data.\n * Operator validates + submits matched order pairs on-chain.\n *\n * Semantics (mirrors EVM makerAmount/takerAmount):\n * BUY (side=1): makerAmount = USDC paid, takerAmount = CTF tokens received\n * SELL (side=0): makerAmount = CTF tokens given, takerAmount = USDC received\n */\nexport interface Order {\n /** Maker's wallet public key */\n maker: PublicKey;\n /** Condition PDA this order belongs to */\n condition: PublicKey;\n /** Outcome token: 0 = NO, 1 = YES */\n tokenId: number;\n /** Side: 0 = SELL (give tokens, want USDC), 1 = BUY (give USDC, want tokens) */\n side: number;\n /** Amount the maker puts in: BUY → USDC, SELL → CTF tokens */\n makerAmount: BN;\n /** Amount the maker wants to receive: BUY → CTF tokens, SELL → USDC */\n takerAmount: BN;\n /** Unique nonce per maker — used for OrderStatus PDA + replay protection */\n nonce: BN;\n /** Unix timestamp expiry (0 = no expiry) */\n expiry: BN;\n /** Creation timestamp (Unix seconds) */\n createdAt: BN;\n /** Fee from taker order transferred to treasury. 0 = use global fee_rate_bps */\n fee: BN;\n /** Directed order: only this pubkey can be counterparty. PublicKey.default() = public */\n taker: PublicKey;\n /** Ed25519 signer key. Must equal maker for now (proxy not supported) */\n signer: PublicKey;\n}\n\n/**\n * Signed order — Order + 64-byte Ed25519 signature over serializeOrderToBytes().\n * This is the on-chain instruction data type for all match_* instructions.\n */\nexport interface SignedOrder {\n order: Order;\n /** Ed25519 signature (64 bytes) from order.maker over serializeOrderToBytes() */\n signature: Uint8Array;\n}\n\n// ─── Errors ───────────────────────────────────────────────────────────────────\n\nexport class XMarketError extends Error {\n constructor(message: string, public code?: string) {\n super(message);\n this.name = \"XMarketError\";\n }\n}\n\nexport class UnauthorizedError extends XMarketError {\n constructor(msg = \"Unauthorized\") {\n super(msg, \"UNAUTHORIZED\");\n this.name = \"UnauthorizedError\";\n }\n}\n\nexport class AccountNotFoundError extends XMarketError {\n constructor(account: string, address?: string) {\n super(`${account} not found${address ? `: ${address}` : \"\"}`, \"NOT_FOUND\");\n this.name = \"AccountNotFoundError\";\n }\n}\n\nexport class InvalidParamError extends XMarketError {\n constructor(msg = \"Invalid parameter\") {\n super(msg, \"INVALID_PARAM\");\n this.name = \"InvalidParamError\";\n }\n}\n","import * as anchor from \"@coral-xyz/anchor\";\nimport { PublicKey, SystemProgram, SYSVAR_RENT_PUBKEY, Transaction } from \"@solana/web3.js\";\nimport { TOKEN_2022_PROGRAM_ID } from \"@solana/spl-token\";\nimport { PDA, generateQuestionId, generateContentHash } from \"../pda\";\nimport { ProgramIds } from \"../config/networks\";\nimport {\n QuestionMarketConfig,\n Question,\n QuestionStatus,\n CreateQuestionParams,\n Position,\n} from \"../types\";\nimport type { CtfClient } from \"./ctf\";\n\nexport class MarketClient {\n private readonly program: anchor.Program;\n private readonly provider: anchor.AnchorProvider;\n private readonly programIds: ProgramIds;\n readonly configPda: PublicKey;\n\n /** Injected by XMarketSDK after construction — enables fetchQuestionBalances. */\n ctfClient?: CtfClient;\n\n constructor(\n program: anchor.Program,\n provider: anchor.AnchorProvider,\n programIds: ProgramIds,\n ownerPubkey: PublicKey\n ) {\n this.program = program;\n this.provider = provider;\n this.programIds = programIds;\n this.configPda = PDA.questionMarketConfig(ownerPubkey, programIds)[0];\n }\n\n get walletPubkey(): PublicKey {\n return this.provider.wallet.publicKey;\n }\n\n // ─── Instructions (return Transaction — caller signs + sends) ───────────────\n\n async initialize(\n admin: PublicKey,\n oracle: PublicKey,\n owner: PublicKey = this.walletPubkey\n ): Promise<Transaction> {\n return this.program.methods\n .initialize({\n admin,\n conditionalTokensProgram: this.programIds.conditionalTokens,\n oracle,\n })\n .accounts({\n owner,\n config: this.configPda,\n systemProgram: SystemProgram.programId,\n })\n .transaction();\n }\n\n /**\n * Build createQuestion transaction.\n * @param payer - Pays rent for all new accounts (can differ from creator)\n * @param creator - Identity of the question creator (signs but does not pay)\n */\n async createQuestion(\n params: CreateQuestionParams,\n oracle: PublicKey,\n creator: PublicKey = this.walletPubkey,\n payer: PublicKey = creator\n ): Promise<{ tx: Transaction; questionPda: PublicKey; conditionPda: PublicKey; questionId: Uint8Array }> {\n const questionId = params.questionId ?? generateQuestionId(params.content);\n const contentHash = params.contentHash ?? generateContentHash(params.content);\n\n const [questionPda] = PDA.question(this.configPda, questionId, this.programIds);\n const [conditionPda] = PDA.condition(oracle, questionId, this.programIds);\n const [yesMint] = PDA.yesMint(conditionPda, this.programIds);\n const [noMint] = PDA.noMint(conditionPda, this.programIds);\n const [mintAuthority] = PDA.mintAuthority(conditionPda, this.programIds);\n const [collateralVault] = PDA.collateralVault(params.collateralMint, this.programIds);\n\n const tx = await this.program.methods\n .createQuestionWithCondition({\n questionId: Array.from(questionId) as number[],\n contentHash: Array.from(contentHash) as number[],\n hookProgram: params.hookProgram,\n authorizedClob: params.authorizedClob,\n expirationTime: new anchor.BN(params.expirationTime),\n })\n .accounts({\n payer,\n creator,\n config: this.configPda,\n question: questionPda,\n currencyMint: params.collateralMint,\n oracle,\n condition: conditionPda,\n yesMint,\n noMint,\n mintAuthority,\n collateralVault,\n conditionalTokensProgram: this.programIds.conditionalTokens,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n rent: SYSVAR_RENT_PUBKEY,\n })\n .transaction();\n\n return { tx, questionPda, conditionPda, questionId };\n }\n\n /**\n * Build createQuestionAdmin transaction (whitelist/admin path — status = Approved immediately).\n * @param creator - Whitelisted creator (must be in whitelist or be admin/owner)\n * @param payer - Fee payer (pays rent; can differ from creator)\n */\n async createQuestionAdmin(\n params: CreateQuestionParams,\n oracle: PublicKey,\n creator: PublicKey = this.walletPubkey,\n payer: PublicKey = creator\n ): Promise<{ tx: Transaction; questionPda: PublicKey; conditionPda: PublicKey; questionId: Uint8Array }> {\n const questionId = params.questionId ?? generateQuestionId(params.content);\n const contentHash = params.contentHash ?? generateContentHash(params.content);\n\n const [questionPda] = PDA.question(this.configPda, questionId, this.programIds);\n const [conditionPda] = PDA.condition(oracle, questionId, this.programIds);\n const [yesMint] = PDA.yesMint(conditionPda, this.programIds);\n const [noMint] = PDA.noMint(conditionPda, this.programIds);\n const [mintAuthority] = PDA.mintAuthority(conditionPda, this.programIds);\n const [collateralVault] = PDA.collateralVault(params.collateralMint, this.programIds);\n\n const tx = await this.program.methods\n .createQuestionAdmin({\n questionId: Array.from(questionId) as number[],\n contentHash: Array.from(contentHash) as number[],\n hookProgram: params.hookProgram,\n authorizedClob: params.authorizedClob,\n expirationTime: new anchor.BN(params.expirationTime),\n })\n .accounts({\n creator,\n payer,\n config: this.configPda,\n question: questionPda,\n currencyMint: params.collateralMint,\n oracle,\n condition: conditionPda,\n yesMint,\n noMint,\n mintAuthority,\n collateralVault,\n conditionalTokensProgram: this.programIds.conditionalTokens,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n rent: SYSVAR_RENT_PUBKEY,\n })\n .transaction();\n\n return { tx, questionPda, conditionPda, questionId };\n }\n\n async approveQuestion(\n questionPda: PublicKey,\n admin: PublicKey = this.walletPubkey,\n payer: PublicKey = admin\n ): Promise<Transaction> {\n return this.program.methods\n .approveQuestion()\n .accounts({\n admin,\n payer,\n config: this.configPda,\n question: questionPda,\n })\n .transaction();\n }\n\n async updateConfig(\n params: { newAdmin?: PublicKey; newOracle?: PublicKey; isPaused?: boolean; newConditionalTokensProgram?: PublicKey },\n authority: PublicKey = this.walletPubkey,\n payer: PublicKey = authority\n ): Promise<Transaction> {\n return this.program.methods\n .updateConfig({\n newAdmin: params.newAdmin ?? null,\n newOracle: params.newOracle ?? null,\n isPaused: params.isPaused ?? null,\n newConditionalTokensProgram: params.newConditionalTokensProgram ?? null,\n })\n .accounts({\n authority,\n payer,\n config: this.configPda,\n })\n .transaction();\n }\n\n /** Set the admin (owner only). Replaces any existing admin. */\n async addAdmin(\n newAdmin: PublicKey,\n owner: PublicKey = this.walletPubkey\n ): Promise<Transaction> {\n return this.program.methods\n .addAdmin(newAdmin)\n .accounts({\n owner,\n config: this.configPda,\n })\n .transaction();\n }\n\n /** Clear the admin (owner only). Sets admin to default pubkey. */\n async removeAdmin(\n owner: PublicKey = this.walletPubkey\n ): Promise<Transaction> {\n return this.program.methods\n .removeAdmin()\n .accounts({\n owner,\n config: this.configPda,\n })\n .transaction();\n }\n\n async addToWhitelist(\n address: PublicKey,\n authority: PublicKey = this.walletPubkey,\n payer: PublicKey = authority\n ): Promise<Transaction> {\n return this.program.methods\n .addToWhitelist(address)\n .accounts({\n authority,\n payer,\n config: this.configPda,\n })\n .transaction();\n }\n\n async removeFromWhitelist(\n address: PublicKey,\n authority: PublicKey = this.walletPubkey,\n payer: PublicKey = authority\n ): Promise<Transaction> {\n return this.program.methods\n .removeFromWhitelist(address)\n .accounts({\n authority,\n payer,\n config: this.configPda,\n })\n .transaction();\n }\n\n // ─── Queries ─────────────────────────────────────────────────────────────────\n\n async fetchConfig(): Promise<QuestionMarketConfig | null> {\n try {\n const acc = await (this.program.account as any).questionMarketConfig.fetch(this.configPda);\n return {\n owner: acc.owner,\n admin: acc.admin,\n oracle: acc.oracle,\n conditionalTokensProgram: acc.conditionalTokensProgram,\n questionCount: acc.questionCount.toNumber(),\n approvedCount: acc.approvedCount.toNumber(),\n rejectedCount: acc.rejectedCount.toNumber(),\n whitelist: acc.whitelist as PublicKey[],\n whitelistLen: acc.whitelistLen,\n isPaused: acc.isPaused,\n bump: acc.bump,\n };\n } catch {\n return null;\n }\n }\n\n async fetchQuestion(questionPda: PublicKey): Promise<Question | null> {\n try {\n const acc = await (this.program.account as any).question.fetch(questionPda);\n return {\n config: acc.config,\n questionId: new Uint8Array(acc.questionId),\n contentHash: new Uint8Array(acc.contentHash),\n expirationTime: acc.expirationTime.toNumber(),\n currencyMint: acc.currencyMint,\n creator: acc.creator,\n condition: acc.condition ?? null,\n status: this._parseStatus(acc.status),\n createdAt: acc.createdAt.toNumber(),\n approvedAt: acc.approvedAt.toNumber(),\n resolvedAt: acc.resolvedAt.toNumber(),\n bump: acc.bump,\n };\n } catch {\n return null;\n }\n }\n\n questionPda(questionId: Uint8Array): PublicKey {\n return PDA.question(this.configPda, questionId, this.programIds)[0];\n }\n\n private _parseStatus(raw: any): QuestionStatus {\n if (raw.pending !== undefined) return QuestionStatus.Pending;\n if (raw.approved !== undefined) return QuestionStatus.Approved;\n if (raw.rejected !== undefined) return QuestionStatus.Rejected;\n if (raw.resolved !== undefined) return QuestionStatus.Resolved;\n return QuestionStatus.Pending;\n }\n\n /**\n * Convenience: fetch YES and NO token balances for a question.\n * Returns null for each if question not approved or position not initialized.\n * Requires ctfClient to be injected (done automatically by XMarketSDK).\n */\n async fetchQuestionBalances(\n questionPda: PublicKey,\n owner: PublicKey\n ): Promise<{ yes: Position | null; no: Position | null }> {\n if (!this.ctfClient) return { yes: null, no: null };\n const q = await this.fetchQuestion(questionPda);\n if (!q || !q.condition) return { yes: null, no: null };\n return this.ctfClient.fetchBothPositions(q.condition, owner);\n }\n}\n","import * as anchor from \"@coral-xyz/anchor\";\nimport { Keypair, PublicKey, SystemProgram, SYSVAR_RENT_PUBKEY, TransactionInstruction } from \"@solana/web3.js\";\nimport {\n TOKEN_PROGRAM_ID,\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddressSync,\n} from \"@solana/spl-token\";\nimport { PDA } from \"../pda\";\nimport { ProgramIds } from \"../config/networks\";\nimport { Condition, CollateralVault, CtfConfig, Position, TxResult } from \"../types\";\n\nexport class CtfClient {\n private readonly program: anchor.Program;\n private readonly provider: anchor.AnchorProvider;\n private readonly programIds: ProgramIds;\n\n constructor(\n program: anchor.Program,\n provider: anchor.AnchorProvider,\n programIds: ProgramIds\n ) {\n this.program = program;\n this.provider = provider;\n this.programIds = programIds;\n }\n\n get walletPubkey(): PublicKey {\n return this.provider.wallet.publicKey;\n }\n\n // ─── Instructions ────────────────────────────────────────────────────────────\n\n /**\n * Create a Condition directly (bypasses QuestionMarket).\n * oracle is UncheckedAccount — set it to any pubkey (e.g. user wallet)\n * so that wallet can later sign reportPayouts.\n * payer covers rent for condition + mints.\n */\n async prepareCondition(\n questionId: Uint8Array,\n oracle: PublicKey,\n collateralMint: PublicKey,\n hookProgram: PublicKey,\n authorizedClob: PublicKey,\n payer: PublicKey = this.walletPubkey,\n signers: Keypair[] = []\n ): Promise<{ signature: string; conditionPda: PublicKey; yesMint: PublicKey; noMint: PublicKey }> {\n const [conditionPda] = PDA.condition(oracle, questionId, this.programIds);\n const [yesMint] = PDA.yesMint(conditionPda, this.programIds);\n const [noMint] = PDA.noMint(conditionPda, this.programIds);\n const [mintAuthority] = PDA.mintAuthority(conditionPda, this.programIds);\n const [collateralVault] = PDA.collateralVault(collateralMint, this.programIds);\n\n const sig = await this.program.methods\n .prepareCondition(\n Array.from(questionId) as number[],\n hookProgram,\n authorizedClob\n )\n .accounts({\n oracle,\n condition: conditionPda,\n yesMint,\n noMint,\n mintAuthority,\n collateralMint,\n collateralVault,\n payer,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n rent: SYSVAR_RENT_PUBKEY,\n })\n .signers(signers)\n .rpc({ skipPreflight: true });\n\n return { signature: sig, conditionPda, yesMint, noMint };\n }\n\n /** One-time setup. Caller becomes the CTF owner. Can only be called once. */\n async initializeCtfConfig(): Promise<TxResult> {\n const [ctfConfig] = PDA.ctfConfig(this.programIds);\n const sig = await this.program.methods\n .initializeCtfConfig()\n .accounts({\n payer: this.walletPubkey,\n ctfConfig,\n systemProgram: SystemProgram.programId,\n })\n .rpc();\n return { signature: sig };\n }\n\n /**\n * Create the shared collateral vault for a given collateral mint (e.g. USDC).\n * Only callable by the CTF owner (as stored in ctf_config).\n * authority defaults to the wallet — pass a different signer if needed.\n */\n async initializeVault(collateralMint: PublicKey): Promise<TxResult> {\n const [ctfConfig] = PDA.ctfConfig(this.programIds);\n const [collateralVault] = PDA.collateralVault(collateralMint, this.programIds);\n const [vaultTokenAccount] = PDA.vaultToken(collateralMint, this.programIds);\n const sig = await this.program.methods\n .initializeVault()\n .accounts({\n authority: this.walletPubkey,\n payer: this.walletPubkey,\n ctfConfig,\n collateralMint,\n collateralVault,\n vaultTokenAccount,\n systemProgram: SystemProgram.programId,\n tokenProgram: TOKEN_PROGRAM_ID,\n rent: SYSVAR_RENT_PUBKEY,\n })\n .rpc();\n return { signature: sig };\n }\n\n /**\n * Initialize an empty Position account (balance = 0) for a user.\n * Needed before redeemPositions when the user only holds the opposite outcome\n * (e.g. buyer received YES via CLOB match but never had a NO position).\n *\n * Idempotent — call `fetchPosition` first to skip if already initialized.\n */\n async initPosition(\n condition: PublicKey,\n outcomeIndex: number,\n user: PublicKey = this.walletPubkey\n ): Promise<TxResult> {\n const [position] = PDA.position(condition, outcomeIndex, user, this.programIds);\n const sig = await this.program.methods\n .initPosition(outcomeIndex)\n .accounts({\n user,\n condition,\n position,\n systemProgram: SystemProgram.programId,\n })\n .rpc();\n return { signature: sig };\n }\n\n /**\n * Split `amount` collateral into equal YES + NO tokens.\n * ATAs created automatically via `init_if_needed`.\n */\n async splitPosition(\n condition: PublicKey,\n collateralMint: PublicKey,\n amount: anchor.BN,\n user: PublicKey = this.walletPubkey,\n payer: PublicKey = this.walletPubkey,\n signers: Keypair[] = []\n ): Promise<TxResult> {\n const [collateralVault] = PDA.collateralVault(collateralMint, this.programIds);\n const [vaultTokenAccount] = PDA.vaultToken(collateralMint, this.programIds);\n const [yesMint] = PDA.yesMint(condition, this.programIds);\n const [noMint] = PDA.noMint(condition, this.programIds);\n const [mintAuthority] = PDA.mintAuthority(condition, this.programIds);\n const [yesPosition] = PDA.position(condition, 1, user, this.programIds);\n const [noPosition] = PDA.position(condition, 0, user, this.programIds);\n\n const userYesAta = getAssociatedTokenAddressSync(yesMint, user, false, TOKEN_2022_PROGRAM_ID);\n const userNoAta = getAssociatedTokenAddressSync(noMint, user, false, TOKEN_2022_PROGRAM_ID);\n const userCollateral = getAssociatedTokenAddressSync(collateralMint, user);\n\n const sig = await this.program.methods\n .splitPosition(amount)\n .accounts({\n user,\n payer,\n condition,\n collateralVault,\n vaultTokenAccount,\n userCollateral,\n yesMint,\n userYesAta,\n noMint,\n userNoAta,\n yesPosition,\n noPosition,\n mintAuthority,\n tokenProgram: TOKEN_PROGRAM_ID,\n token2022Program: TOKEN_2022_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .signers(signers)\n .rpc({ skipPreflight: true });\n return { signature: sig };\n }\n\n /**\n * Merge `amount` YES + NO tokens back into collateral.\n * Both token balances must be ≥ amount.\n */\n async mergePosition(\n condition: PublicKey,\n collateralMint: PublicKey,\n amount: anchor.BN,\n user: PublicKey = this.walletPubkey,\n payer: PublicKey = this.walletPubkey,\n signers: Keypair[] = []\n ): Promise<TxResult> {\n const [collateralVault] = PDA.collateralVault(collateralMint, this.programIds);\n const [vaultTokenAccount] = PDA.vaultToken(collateralMint, this.programIds);\n const [yesMint] = PDA.yesMint(condition, this.programIds);\n const [noMint] = PDA.noMint(condition, this.programIds);\n const [yesPosition] = PDA.position(condition, 1, user, this.programIds);\n const [noPosition] = PDA.position(condition, 0, user, this.programIds);\n\n const userYesAta = getAssociatedTokenAddressSync(yesMint, user, false, TOKEN_2022_PROGRAM_ID);\n const userNoAta = getAssociatedTokenAddressSync(noMint, user, false, TOKEN_2022_PROGRAM_ID);\n const userCollateral = getAssociatedTokenAddressSync(collateralMint, user);\n\n const sig = await this.program.methods\n .mergePosition(amount)\n .accounts({\n user,\n payer,\n condition,\n collateralVault,\n vaultTokenAccount,\n userCollateral,\n yesMint,\n userYesAta,\n noMint,\n userNoAta,\n yesPosition,\n noPosition,\n tokenProgram: TOKEN_PROGRAM_ID,\n token2022Program: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .signers(signers)\n .rpc({ skipPreflight: true });\n return { signature: sig };\n }\n\n /**\n * After condition resolves: burn outcome tokens proportional to payout\n * and receive USDC. Works for winning, losing, or both positions.\n */\n async redeemPositions(\n condition: PublicKey,\n collateralMint: PublicKey,\n user: PublicKey = this.walletPubkey,\n payer: PublicKey = this.walletPubkey,\n signers: Keypair[] = []\n ): Promise<TxResult> {\n const [collateralVault] = PDA.collateralVault(collateralMint, this.programIds);\n const [vaultTokenAccount] = PDA.vaultToken(collateralMint, this.programIds);\n const [yesMint] = PDA.yesMint(condition, this.programIds);\n const [noMint] = PDA.noMint(condition, this.programIds);\n const [yesPosition] = PDA.position(condition, 1, user, this.programIds);\n const [noPosition] = PDA.position(condition, 0, user, this.programIds);\n\n const userYesAta = getAssociatedTokenAddressSync(yesMint, user, false, TOKEN_2022_PROGRAM_ID);\n const userNoAta = getAssociatedTokenAddressSync(noMint, user, false, TOKEN_2022_PROGRAM_ID);\n const userCollateral = getAssociatedTokenAddressSync(collateralMint, user);\n\n const sig = await this.program.methods\n .redeemPositions()\n .accounts({\n user,\n payer,\n condition,\n collateralVault,\n vaultTokenAccount,\n userCollateral,\n yesMint,\n userYesAta,\n noMint,\n userNoAta,\n yesPosition,\n noPosition,\n tokenProgram: TOKEN_PROGRAM_ID,\n token2022Program: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .signers(signers)\n .rpc({ skipPreflight: true });\n return { signature: sig };\n }\n\n /**\n * Oracle directly resolves a condition with payout numerators.\n * Bypasses QuestionMarket — only for oracle-owned conditions.\n */\n async reportPayouts(\n condition: PublicKey,\n payoutNumerators: number[]\n ): Promise<TxResult> {\n const sig = await this.program.methods\n .reportPayouts(payoutNumerators.map((n) => new anchor.BN(n)))\n .accounts({\n oracle: this.walletPubkey,\n condition,\n })\n .rpc();\n return { signature: sig };\n }\n\n /**\n * Build the `transfer_position` instruction for use in a CLOB CPI.\n *\n * This instruction requires `clob_authority` (the CLOB's PDA) to sign.\n * A PDA can only sign from within its own program via CPI — this method\n * CANNOT be called directly from a wallet transaction.\n *\n * Use-cases:\n * - Custom CLOB implementations that call CTF.transfer_position via CPI\n * - Anchor CPI builders in other Rust programs\n *\n * @param condition - Condition PDA\n * @param outcomeMint - YES or NO mint\n * @param fromUser - Source wallet\n * @param fromTokenAccount - Source ATA\n * @param fromPosition - Source Position PDA\n * @param toUser - Destination wallet\n * @param toTokenAccount - Destination ATA (created if needed — payer covers rent)\n * @param toPosition - Destination Position PDA\n * @param payer - Pays rent for toPosition + toTokenAccount creation\n * @param clobAuthority - CLOB config PDA (must sign via CPI)\n * @param outcomeIndex - 0 = NO, 1 = YES\n * @param amount - Token amount to transfer\n */\n async transferPositionIx(\n condition: PublicKey,\n outcomeMint: PublicKey,\n fromUser: PublicKey,\n fromTokenAccount: PublicKey,\n fromPosition: PublicKey,\n toUser: PublicKey,\n toTokenAccount: PublicKey,\n toPosition: PublicKey,\n payer: PublicKey,\n clobAuthority: PublicKey,\n outcomeIndex: number,\n amount: anchor.BN\n ): Promise<TransactionInstruction> {\n return this.program.methods\n .transferPosition(outcomeIndex, amount)\n .accounts({\n payer,\n clobAuthority,\n condition,\n outcomeMint,\n fromUser,\n fromTokenAccount,\n fromPosition,\n toUser,\n toTokenAccount,\n toPosition,\n token2022Program: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n /**\n * Update the authorized CLOB on a condition.\n * Only callable by the condition's oracle (the wallet that signed createQuestion).\n */\n async updateAuthorizedClob(\n condition: PublicKey,\n newAuthorizedClob: PublicKey\n ): Promise<TxResult> {\n const sig = await this.program.methods\n .updateAuthorizedClob(newAuthorizedClob)\n .accounts({\n oracle: this.walletPubkey,\n condition,\n })\n .rpc();\n return { signature: sig };\n }\n\n // ─── Queries ─────────────────────────────────────────────────────────────────\n\n async fetchCtfConfig(): Promise<CtfConfig | null> {\n try {\n const [ctfConfig] = PDA.ctfConfig(this.programIds);\n const acc = await (this.program.account as any).ctfConfig.fetch(ctfConfig);\n return {\n owner: acc.owner,\n bump: acc.bump,\n };\n } catch {\n return null;\n }\n }\n\n async fetchCondition(conditionPda: PublicKey): Promise<Condition | null> {\n try {\n const acc = await (this.program.account as any).condition.fetch(conditionPda);\n return {\n oracle: acc.oracle,\n questionId: new Uint8Array(acc.questionId),\n outcomeSlotCount: acc.outcomeSlotCount,\n payoutNumerators: acc.payoutNumerators,\n payoutDenominator: acc.payoutDenominator,\n totalCollateral: acc.totalCollateral,\n collateralMint: acc.collateralMint,\n collateralVault: acc.collateralVault,\n yesMint: acc.yesMint,\n noMint: acc.noMint,\n hookProgram: acc.hookProgram,\n authorizedClob: acc.authorizedClob,\n isResolved: acc.isResolved,\n resolvedAt: acc.resolvedAt?.toNumber() ?? 0,\n bump: acc.bump,\n };\n } catch {\n return null;\n }\n }\n\n async fetchVault(collateralMint: PublicKey): Promise<CollateralVault | null> {\n try {\n const [vaultPda] = PDA.collateralVault(collateralMint, this.programIds);\n const acc = await (this.program.account as any).collateralVault.fetch(vaultPda);\n return {\n collateralMint: acc.collateralMint,\n vaultTokenAccount: acc.vaultTokenAccount,\n totalLocked: acc.totalLocked,\n conditionCount: acc.conditionCount,\n bump: acc.bump,\n vaultBump: acc.vaultBump,\n };\n } catch {\n return null;\n }\n }\n\n async fetchPosition(\n condition: PublicKey,\n outcomeIndex: number,\n owner: PublicKey = this.walletPubkey\n ): Promise<Position | null> {\n try {\n const [pda] = PDA.position(condition, outcomeIndex, owner, this.programIds);\n const acc = await (this.program.account as any).position.fetch(pda);\n return {\n owner: acc.owner,\n condition: acc.condition,\n outcomeIndex: acc.outcomeIndex,\n balance: acc.balance,\n bump: acc.bump,\n };\n } catch {\n return null;\n }\n }\n\n /** YES = outcome index 1, NO = outcome index 0. */\n async fetchBothPositions(\n condition: PublicKey,\n owner: PublicKey = this.walletPubkey\n ): Promise<{ yes: Position | null; no: Position | null }> {\n const [yes, no] = await Promise.all([\n this.fetchPosition(condition, 1, owner),\n this.fetchPosition(condition, 0, owner),\n ]);\n return { yes, no };\n }\n\n /** Thin wrapper: fetch position for a single outcome token (0=NO, 1=YES). */\n async fetchTokenBalance(\n condition: PublicKey,\n tokenId: number,\n owner: PublicKey = this.walletPubkey\n ): Promise<Position | null> {\n return this.fetchPosition(condition, tokenId, owner);\n }\n\n // ─── PDA helpers (public for consumers) ──────────────────────────────────────\n\n yesMintPda(condition: PublicKey): PublicKey {\n return PDA.yesMint(condition, this.programIds)[0];\n }\n\n noMintPda(condition: PublicKey): PublicKey {\n return PDA.noMint(condition, this.programIds)[0];\n }\n\n mintAuthorityPda(condition: PublicKey): PublicKey {\n return PDA.mintAuthority(condition, this.programIds)[0];\n }\n\n collateralVaultPda(collateralMint: PublicKey): PublicKey {\n return PDA.collateralVault(collateralMint, this.programIds)[0];\n }\n}\n","/**\n * Order signing utilities.\n *\n * Canonical message layout (178 bytes) — must match Rust `Order::to_signable_bytes()`:\n * [0..31] maker pubkey\n * [32..63] condition pubkey\n * [64] token_id (u8)\n * [65] side (u8)\n * [66..73] maker_amount (u64 le)\n * [74..81] taker_amount (u64 le)\n * [82..89] nonce (u64 le)\n * [90..97] expiry (i64 le)\n * [98..105] created_at (i64 le)\n * [106..113] fee (u64 le)\n * [114..145] taker pubkey\n * [146..177] signer pubkey\n */\nimport {\n TransactionInstruction,\n Ed25519Program,\n SYSVAR_INSTRUCTIONS_PUBKEY,\n} from \"@solana/web3.js\";\nimport { Order, SignedOrder } from \"./types\";\n\n// ─── Serialization ────────────────────────────────────────────────────────────\n\nexport function serializeOrderToBytes(order: Order): Uint8Array {\n const buf = new Uint8Array(178);\n\n buf.set(order.maker.toBytes(), 0);\n buf.set(order.condition.toBytes(), 32);\n buf[64] = order.tokenId;\n buf[65] = order.side;\n\n buf.set(order.makerAmount.toArrayLike(Buffer, \"le\", 8), 66);\n buf.set(order.takerAmount.toArrayLike(Buffer, \"le\", 8), 74);\n buf.set(order.nonce.toArrayLike(Buffer, \"le\", 8), 82);\n buf.set(order.expiry.toArrayLike(Buffer, \"le\", 8), 90);\n buf.set(order.createdAt.toArrayLike(Buffer, \"le\", 8), 98);\n buf.set(order.fee.toArrayLike(Buffer, \"le\", 8), 106);\n buf.set(order.taker.toBytes(), 114);\n buf.set(order.signer.toBytes(), 146);\n\n return buf;\n}\n\n// ─── Signing ──────────────────────────────────────────────────────────────────\n\n/**\n * Sign an order with a keypair's sign function.\n * The `signFn` receives the 98-byte canonical message and returns a 64-byte signature.\n *\n * Usage with a Keypair:\n * const signed = signOrder(order, (msg) => keypair.secretKey.slice(0,64) && nacl.sign.detached(msg, keypair.secretKey))\n *\n * Or use the convenience wrapper `signOrderWithKeypair` from this module.\n */\nexport async function signOrder(\n order: Order,\n signFn: (message: Uint8Array) => Uint8Array | Promise<Uint8Array>\n): Promise<SignedOrder> {\n const message = serializeOrderToBytes(order);\n const signature = await signFn(message);\n if (signature.length !== 64) throw new Error(\"signature must be 64 bytes\");\n return { order, signature };\n}\n\n// ─── Ed25519 instruction builder ─────────────────────────────────────────────\n\n/**\n * Build a single batched Ed25519 precompile instruction for N signed orders.\n *\n * All signatures are packed into one instruction (ix[0]).\n * The on-chain program reads sig[i] via `extract_order_from_ed25519_ix(sysvar, i)`.\n *\n * Batched layout saves ~12 bytes vs N separate Ed25519 instructions — critical for\n * fitting 1-taker + 2-maker transactions within Solana's 1232-byte raw tx limit.\n *\n * Data format:\n * [0] num_sigs (N)\n * [1] padding\n * [2+i*14] per-sig offset entries (14 bytes each)\n * Then: sigs (64B each), pubkeys (32B each), messages (178B each)\n */\nexport function buildBatchedEd25519Instruction(orders: SignedOrder[]): TransactionInstruction {\n const N = orders.length;\n if (N === 0) throw new Error(\"At least 1 order required\");\n\n const MSG_SIZE = 178;\n const SIG_SIZE = 64;\n const PK_SIZE = 32;\n const HEADER = 2 + N * 14;\n const sigBase = HEADER;\n const pkBase = sigBase + N * SIG_SIZE;\n const msgBase = pkBase + N * PK_SIZE;\n const totalSize = msgBase + N * MSG_SIZE;\n\n const data = Buffer.alloc(totalSize);\n data[0] = N;\n data[1] = 0;\n\n for (let i = 0; i < N; i++) {\n const e = 2 + i * 14;\n data.writeUInt16LE(sigBase + i * SIG_SIZE, e); // sig_offset\n data.writeUInt16LE(0xffff, e + 2); // sig_ix_index (this ix)\n data.writeUInt16LE(pkBase + i * PK_SIZE, e + 4); // pubkey_offset\n data.writeUInt16LE(0xffff, e + 6); // pubkey_ix_index (this ix)\n data.writeUInt16LE(msgBase + i * MSG_SIZE, e + 8); // msg_offset\n data.writeUInt16LE(MSG_SIZE, e + 10); // msg_size\n data.writeUInt16LE(0xffff, e + 12); // msg_ix_index (this ix)\n\n data.set(orders[i].signature, sigBase + i * SIG_SIZE);\n data.set(orders[i].order.maker.toBytes(), pkBase + i * PK_SIZE);\n data.set(serializeOrderToBytes(orders[i].order), msgBase + i * MSG_SIZE);\n }\n\n return new TransactionInstruction({\n keys: [],\n programId: Ed25519Program.programId,\n data,\n });\n}\n\n/**\n * The Solana instructions sysvar public key.\n * Pass this as `ixSysvar` to all match_* instruction accounts.\n */\nexport const IX_SYSVAR = SYSVAR_INSTRUCTIONS_PUBKEY;\n\n// ─── Anchor serialization helper ─────────────────────────────────────────────\n\n/**\n * Convert SignedOrder to the shape anchor expects for SignedOrder struct.\n * The signature must be passed as a fixed-size array of 64 numbers.\n */\nexport function _toAnchorSignedOrder(signed: SignedOrder) {\n const sig = Array.from(signed.signature);\n if (sig.length !== 64) throw new Error(\"signature must be 64 bytes\");\n return {\n order: {\n maker: signed.order.maker,\n condition: signed.order.condition,\n tokenId: signed.order.tokenId,\n side: signed.order.side,\n makerAmount: signed.order.makerAmount,\n takerAmount: signed.order.takerAmount,\n nonce: signed.order.nonce,\n expiry: signed.order.expiry,\n createdAt: signed.order.createdAt,\n fee: signed.order.fee,\n taker: signed.order.taker,\n signer: signed.order.signer,\n },\n signature: sig,\n };\n}\n","import * as anchor from \"@coral-xyz/anchor\";\nimport {\n PublicKey,\n SystemProgram,\n TransactionInstruction,\n TransactionMessage,\n VersionedTransaction,\n AddressLookupTableAccount,\n type Signer as SolanaSigner,\n} from \"@solana/web3.js\";\nimport {\n TOKEN_PROGRAM_ID,\n TOKEN_2022_PROGRAM_ID,\n getAssociatedTokenAddressSync,\n} from \"@solana/spl-token\";\nimport { PDA } from \"../pda\";\nimport { ProgramIds } from \"../config/networks\";\nimport {\n ClobConfig, ClobWhitelistEntry, OrderStatus, Order, SignedOrder, TxResult, InvalidParamError,\n} from \"../types\";\nimport { buildBatchedEd25519Instruction, IX_SYSVAR, _toAnchorSignedOrder } from \"../signing\";\n\nconst CLOB_WHITELIST_SEED = Buffer.from(\"clob_whitelist\");\n\nexport class ClobClient {\n private readonly program: anchor.Program;\n private readonly provider: anchor.AnchorProvider;\n private readonly programIds: ProgramIds;\n\n constructor(\n program: anchor.Program,\n provider: anchor.AnchorProvider,\n programIds: ProgramIds\n ) {\n this.program = program;\n this.provider = provider;\n this.programIds = programIds;\n }\n\n get walletPubkey(): PublicKey {\n return this.provider.wallet.publicKey;\n }\n\n /**\n * Send a match transaction as versioned (v0).\n * Pass a pre-built AddressLookupTableAccount to compress account keys and\n * stay under the 1232-byte limit — required for match_complementary which\n * has ~25 accounts + 2 Ed25519 precompile instructions (~1697 bytes raw).\n *\n * If `whitelistedWallet` is provided and differs from `this.provider.wallet`,\n * both wallets sign the transaction (whitelisted operator + payer).\n */\n private async _sendMatchTx(\n instructions: TransactionInstruction[],\n lookupTable?: AddressLookupTableAccount,\n whitelistedWallet?: anchor.Wallet,\n ): Promise<string> {\n const { connection } = this.provider;\n const { blockhash, lastValidBlockHeight } = await connection.getLatestBlockhash();\n // payer is this.provider.wallet; feePayer = payer.publicKey\n const message = new TransactionMessage({\n payerKey: this.walletPubkey,\n recentBlockhash: blockhash,\n instructions,\n }).compileToV0Message(lookupTable ? [lookupTable] : []);\n const vtx = new VersionedTransaction(message);\n const signers: SolanaSigner[] = [(this.provider.wallet as any).payer as SolanaSigner];\n if (\n whitelistedWallet &&\n !whitelistedWallet.publicKey.equals(this.walletPubkey)\n ) {\n signers.push((whitelistedWallet as any).payer as SolanaSigner);\n }\n vtx.sign(signers);\n const sig = await connection.sendRawTransaction(vtx.serialize(), {\n skipPreflight: false,\n });\n await connection.confirmTransaction(\n { signature: sig, blockhash, lastValidBlockHeight },\n \"confirmed\",\n );\n return sig;\n }\n\n /** PDA for a CLOB whitelist entry. */\n whitelistEntryPda(address: PublicKey): PublicKey {\n return PublicKey.findProgramAddressSync(\n [CLOB_WHITELIST_SEED, address.toBytes()],\n this.programIds.clobExchange,\n )[0];\n }\n\n configPda(): PublicKey {\n return PDA.clobConfig(this.programIds)[0];\n }\n\n // ─── Instructions ────────────────────────────────────────────────────────────\n\n /** One-time setup. Caller becomes admin. */\n async initialize(\n operators: PublicKey[],\n feeRecipient: PublicKey,\n feeRateBps: number\n ): Promise<TxResult> {\n const sig = await this.program.methods\n .initializeClob(\n operators,\n feeRecipient,\n feeRateBps,\n this.programIds.conditionalTokens\n )\n .accounts({\n owner: this.walletPubkey,\n clobConfig: this.configPda(),\n systemProgram: SystemProgram.programId,\n })\n .rpc();\n return { signature: sig };\n }\n\n /** Admin adds an operator to the whitelist. */\n async addOperator(operator: PublicKey): Promise<TxResult> {\n const sig = await this.program.methods\n .addOperator(operator)\n .accounts({\n owner: this.walletPubkey,\n clobConfig: this.configPda(),\n })\n .rpc();\n return { signature: sig };\n }\n\n /** Admin removes an operator from the whitelist. */\n async removeOperator(operator: PublicKey): Promise<TxResult> {\n const sig = await this.program.methods\n .removeOperator(operator)\n .accounts({\n owner: this.walletPubkey,\n clobConfig: this.configPda(),\n })\n .rpc();\n return { signature: sig };\n }\n\n /** Admin pause/unpause the CLOB. */\n async setPaused(paused: boolean): Promise<TxResult> {\n const sig = await this.program.methods\n .setPaused(paused)\n .accounts({\n owner: this.walletPubkey,\n clobConfig: this.configPda(),\n })\n .rpc();\n return { signature: sig };\n }\n\n /**\n * Maker cancels their own order.\n * OrderStatus PDA is marked cancelled — any future fill rejected.\n */\n async cancelOrder(nonce: anchor.BN): Promise<TxResult> {\n const maker = this.walletPubkey;\n const [orderStatus] = PDA.orderStatus(maker, nonce, this.programIds);\n const sig = await this.program.methods\n .cancelOrder(nonce)\n .accounts({\n signer: maker,\n clobConfig: this.configPda(),\n maker,\n orderStatus,\n systemProgram: SystemProgram.programId,\n })\n .rpc();\n return { signature: sig };\n }\n\n /**\n * Emergency reset of CLOB config (upgrade authority only).\n */\n async forceResetClob(\n programData: PublicKey,\n newAdmin: PublicKey,\n newOperators: PublicKey[],\n newFeeRecipient: PublicKey,\n newFeeRateBps: number\n ): Promise<TxResult> {\n const sig = await this.program.methods\n .forceResetClob(newAdmin, newOperators, newFeeRecipient, newFeeRateBps)\n .accounts({\n upgradeAuthority: this.walletPubkey,\n programData,\n clobConfig: this.configPda(),\n })\n .rpc();\n return { signature: sig };\n }\n\n /**\n * COMPLEMENTARY match: 1 buyer (taker) + N sellers (makers), same tokenId.\n *\n * Transaction structure:\n * ix[0] Ed25519(taker/buyer)\n * ix[1+i] Ed25519(maker_i/seller_i)\n * ix[N+1] match_complementary(buyNonce, makerNonces[])\n *\n * remaining_accounts: [hook×3] [seller×5 × N]\n */\n private async matchComplementary(\n buySigned: SignedOrder,\n makersSigned: SignedOrder[],\n collateralMint: PublicKey,\n feeRecipient: PublicKey,\n whitelistedWallet: anchor.Wallet,\n lookupTable?: AddressLookupTableAccount,\n ): Promise<TxResult> {\n const condition = buySigned.order.condition;\n const tokenId = buySigned.order.tokenId;\n\n const [outcomeMint] = tokenId === 1\n ? PDA.yesMint(condition, this.programIds)\n : PDA.noMint(condition, this.programIds);\n\n const buyer = buySigned.order.maker;\n const buyerCollateral = getAssociatedTokenAddressSync(collateralMint, buyer);\n const buyerTokenAccount = getAssociatedTokenAddressSync(outcomeMint, buyer, false, TOKEN_2022_PROGRAM_ID);\n const [buyerPosition] = PDA.position(condition, tokenId, buyer, this.programIds);\n const [buyOrderStatus] = PDA.orderStatus(buyer, buySigned.order.nonce, this.programIds);\n\n const [extraAccountMetaList] = PDA.extraAccountMetaList(outcomeMint, this.programIds);\n const [hookConfig] = PDA.hookConfig(this.programIds);\n const hookAccounts = [\n { pubkey: extraAccountMetaList, isSigner: false, isWritable: false },\n { pubkey: hookConfig, isSigner: false, isWritable: false },\n { pubkey: this.programIds.hook, isSigner: false, isWritable: false },\n ];\n\n const makerAccounts = makersSigned.flatMap(m => {\n const seller = m.order.maker;\n const sellerTokenAccount = getAssociatedTokenAddressSync(outcomeMint, seller, false, TOKEN_2022_PROGRAM_ID);\n const [sellerPosition] = PDA.position(condition, tokenId, seller, this.programIds);\n const sellerCollateral = getAssociatedTokenAddressSync(collateralMint, seller);\n const [sellOrderStatus] = PDA.orderStatus(seller, m.order.nonce, this.programIds);\n return [\n { pubkey: seller, isSigner: false, isWritable: false },\n { pubkey: sellerTokenAccount, isSigner: false, isWritable: true },\n { pubkey: sellerPosition, isSigner: false, isWritable: true },\n { pubkey: sellerCollateral, isSigner: false, isWritable: true },\n { pubkey: sellOrderStatus, isSigner: false, isWritable: true },\n ];\n });\n\n const whitelisted = whitelistedWallet.publicKey;\n const whitelistEntry = this.whitelistEntryPda(whitelisted);\n const makerNonces = makersSigned.map(m => m.order.nonce);\n\n const ed25519Ixs = [\n buildBatchedEd25519Instruction([buySigned, ...makersSigned]),\n ];\n\n const matchIx = await this.program.methods\n .matchComplementary(buySigned.order.nonce, makerNonces)\n .accounts({\n whitelisted,\n payer: this.walletPubkey,\n whitelistEntry,\n clobConfig: this.configPda(),\n ixSysvar: IX_SYSVAR,\n condition,\n buyer,\n buyerCollateral,\n buyerTokenAccount,\n buyerPosition,\n buyOrderStatus,\n outcomeMint,\n feeRecipient,\n conditionalTokensProgram: this.programIds.conditionalTokens,\n tokenProgram: TOKEN_PROGRAM_ID,\n token2022Program: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .remainingAccounts([...hookAccounts, ...makerAccounts])\n .instruction();\n\n const sig = await this._sendMatchTx(\n [...ed25519Ixs, matchIx],\n lookupTable,\n whitelistedWallet,\n );\n return { signature: sig };\n }\n\n /**\n * MINT match: 1 YES buyer (taker) + N NO buyers (makers).\n *\n * Transaction structure:\n * ix[0] Ed25519(taker/YES buyer)\n * ix[1+i] Ed25519(maker_i/NO buyer)\n * ix[N+1] match_mint_orders(yesNonce, makerNonces[])\n *\n * remaining_accounts: [maker×5 × N] (no hook accounts — mint_to doesn't fire hook)\n */\n private async matchMintOrders(\n yesSigned: SignedOrder,\n makersSigned: SignedOrder[],\n collateralMint: PublicKey,\n whitelistedWallet: anchor.Wallet,\n lookupTable?: AddressLookupTableAccount,\n ): Promise<TxResult> {\n const condition = yesSigned.order.condition;\n\n const [yesMint] = PDA.yesMint(condition, this.programIds);\n const [noMint] = PDA.noMint(condition, this.programIds);\n const [mintAuthority] = PDA.mintAuthority(condition, this.programIds);\n const [collateralVault] = PDA.collateralVault(collateralMint, this.programIds);\n const [vaultTokenAccount] = PDA.vaultToken(collateralMint, this.programIds);\n const [clobAuthority] = PDA.clobConfig(this.programIds);\n\n const buyerYes = yesSigned.order.maker;\n const buyerYesCollateral = getAssociatedTokenAddressSync(collateralMint, buyerYes);\n const buyerYesTokenAccount = getAssociatedTokenAddressSync(yesMint, buyerYes, false, TOKEN_2022_PROGRAM_ID);\n const [buyerYesPosition] = PDA.position(condition, 1, buyerYes, this.programIds);\n const [yesOrderStatus] = PDA.orderStatus(buyerYes, yesSigned.order.nonce, this.programIds);\n\n const makerAccounts = makersSigned.flatMap(m => {\n const maker = m.order.maker;\n const makerUsdcAta = getAssociatedTokenAddressSync(collateralMint, maker);\n const makerNoAta = getAssociatedTokenAddressSync(noMint, maker, false, TOKEN_2022_PROGRAM_ID);\n const [makerNoPosition] = PDA.position(condition, 0, maker, this.programIds);\n const [makerOrderStatus] = PDA.orderStatus(maker, m.order.nonce, this.programIds);\n return [\n { pubkey: maker, isSigner: false, isWritable: false },\n { pubkey: makerUsdcAta, isSigner: false, isWritable: true },\n { pubkey: makerNoAta, isSigner: false, isWritable: true },\n { pubkey: makerNoPosition, isSigner: false, isWritable: true },\n { pubkey: makerOrderStatus,isSigner: false, isWritable: true },\n ];\n });\n\n const whitelisted = whitelistedWallet.publicKey;\n const whitelistEntry = this.whitelistEntryPda(whitelisted);\n const makerNonces = makersSigned.map(m => m.order.nonce);\n\n const ed25519Ixs = [\n buildBatchedEd25519Instruction([yesSigned, ...makersSigned]),\n ];\n\n const matchIx = await this.program.methods\n .matchMintOrders(yesSigned.order.nonce, makerNonces)\n .accounts({\n whitelisted,\n payer: this.walletPubkey,\n whitelistEntry,\n clobConfig: this.configPda(),\n ixSysvar: IX_SYSVAR,\n condition,\n buyerYes,\n buyerYesCollateral,\n buyerYesTokenAccount,\n buyerYesPosition,\n yesOrderStatus,\n collateralVault,\n vaultTokenAccount,\n yesMint,\n noMint,\n mintAuthority,\n clobAuthority,\n conditionalTokensProgram: this.programIds.conditionalTokens,\n collateralTokenProgram: TOKEN_PROGRAM_ID,\n token2022Program: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .remainingAccounts(makerAccounts)\n .instruction();\n\n const sig = await this._sendMatchTx(\n [...ed25519Ixs, matchIx],\n lookupTable,\n whitelistedWallet,\n );\n return { signature: sig };\n }\n\n /**\n * MERGE match: 1 YES seller (taker) + N NO sellers (makers).\n *\n * Transaction structure:\n * ix[0] Ed25519(taker/YES seller)\n * ix[1+i] Ed25519(maker_i/NO seller)\n * ix[N+1] match_merge_orders(yesNonce, makerNonces[])\n *\n * remaining_accounts: [maker×5 × N] (no hook accounts — burn doesn't fire hook)\n */\n private async matchMergeOrders(\n yesSigned: SignedOrder,\n makersSigned: SignedOrder[],\n collateralMint: PublicKey,\n whitelistedWallet: anchor.Wallet,\n lookupTable?: AddressLookupTableAccount,\n ): Promise<TxResult> {\n const condition = yesSigned.order.condition;\n\n const [yesMint] = PDA.yesMint(condition, this.programIds);\n const [noMint] = PDA.noMint(condition, this.programIds);\n const [collateralVault] = PDA.collateralVault(collateralMint, this.programIds);\n const [vaultTokenAccount] = PDA.vaultToken(collateralMint, this.programIds);\n const [clobAuthority] = PDA.clobConfig(this.programIds);\n\n const sellerYes = yesSigned.order.maker;\n const sellerYesTokenAccount = getAssociatedTokenAddressSync(yesMint, sellerYes, false, TOKEN_2022_PROGRAM_ID);\n const [sellerYesPosition] = PDA.position(condition, 1, sellerYes, this.programIds);\n const sellerYesCollateral = getAssociatedTokenAddressSync(collateralMint, sellerYes);\n const [yesOrderStatus] = PDA.orderStatus(sellerYes, yesSigned.order.nonce, this.programIds);\n\n const makerAccounts = makersSigned.flatMap(m => {\n const maker = m.order.maker;\n const makerNoAta = getAssociatedTokenAddressSync(noMint, maker, false, TOKEN_2022_PROGRAM_ID);\n const [makerNoPosition] = PDA.position(condition, 0, maker, this.programIds);\n const makerUsdcAta = getAssociatedTokenAddressSync(collateralMint, maker);\n const [makerOrderStatus] = PDA.orderStatus(maker, m.order.nonce, this.programIds);\n return [\n { pubkey: maker, isSigner: false, isWritable: false },\n { pubkey: makerNoAta, isSigner: false, isWritable: true },\n { pubkey: makerNoPosition, isSigner: false, isWritable: true },\n { pubkey: makerUsdcAta, isSigner: false, isWritable: true },\n { pubkey: makerOrderStatus,isSigner: false, isWritable: true },\n ];\n });\n\n const whitelisted = whitelistedWallet.publicKey;\n const whitelistEntry = this.whitelistEntryPda(whitelisted);\n const makerNonces = makersSigned.map(m => m.order.nonce);\n\n const ed25519Ixs = [\n buildBatchedEd25519Instruction([yesSigned, ...makersSigned]),\n ];\n\n const matchIx = await this.program.methods\n .matchMergeOrders(yesSigned.order.nonce, makerNonces)\n .accounts({\n whitelisted,\n payer: this.walletPubkey,\n whitelistEntry,\n clobConfig: this.configPda(),\n ixSysvar: IX_SYSVAR,\n condition,\n sellerYes,\n sellerYesTokenAccount,\n sellerYesPosition,\n sellerYesCollateral,\n yesOrderStatus,\n collateralVault,\n vaultTokenAccount,\n yesMint,\n noMint,\n clobAuthority,\n conditionalTokensProgram: this.programIds.conditionalTokens,\n collateralTokenProgram: TOKEN_PROGRAM_ID,\n token2022Program: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .remainingAccounts(makerAccounts)\n .instruction();\n\n const sig = await this._sendMatchTx(\n [...ed25519Ixs, matchIx],\n lookupTable,\n whitelistedWallet,\n );\n return { signature: sig };\n }\n\n /**\n * Auto-detect match type and execute 1-taker + N-makers in a single transaction.\n *\n * Detection (pure, no RPC) based on taker.order vs makers[0].order:\n * taker.tokenId === makers[0].tokenId: taker BUY + all makers SELL → COMPLEMENTARY\n * taker.tokenId !== makers[0].tokenId + taker BUY + all makers BUY → MINT\n * taker.tokenId !== makers[0].tokenId + taker SELL + all makers SELL → MERGE\n * Otherwise → throws InvalidParamError\n *\n * All makers must have the same tokenId and side as makers[0].\n */\n async matchOrders(\n taker: SignedOrder,\n makers: SignedOrder[],\n collateralMint: PublicKey,\n feeRecipient: PublicKey,\n whitelistedWallet: anchor.Wallet,\n lookupTable?: AddressLookupTableAccount,\n ): Promise<TxResult> {\n if (makers.length === 0) throw new InvalidParamError(\"At least 1 maker required\");\n const t = taker.order;\n const m0 = makers[0].order;\n const SIDE_BUY = 1;\n const SIDE_SELL = 0;\n\n if (t.tokenId === m0.tokenId) {\n // COMPLEMENTARY: taker BUY, all makers SELL\n if (t.side === SIDE_BUY && makers.every(m => m.order.side === SIDE_SELL)) {\n return this.matchComplementary(taker, makers, collateralMint, feeRecipient, whitelistedWallet, lookupTable);\n }\n // COMPLEMENTARY reversed: taker SELL, all makers BUY — swap perspective\n if (t.side === SIDE_SELL && makers.every(m => m.order.side === SIDE_BUY)) {\n // Not supported in N-maker model (taker must be the buyer)\n throw new InvalidParamError(\"COMPLEMENTARY N-maker: taker must be the BUY side\");\n }\n throw new InvalidParamError(\"COMPLEMENTARY requires taker=BUY, makers=SELL on same tokenId\");\n }\n\n // MINT or MERGE: complementary tokenIds\n const allBuy = t.side === SIDE_BUY && makers.every(m => m.order.side === SIDE_BUY);\n const allSell = t.side === SIDE_SELL && makers.every(m => m.order.side === SIDE_SELL);\n\n if (!allBuy && !allSell) {\n throw new InvalidParamError(\"MINT/MERGE: all orders must be the same side (all BUY or all SELL)\");\n }\n\n // Sort taker as YES (tokenId=1)\n if (t.tokenId !== 1) {\n throw new InvalidParamError(\"MINT/MERGE: taker must be the YES side (tokenId=1)\");\n }\n if (!makers.every(m => m.order.tokenId === 0)) {\n throw new InvalidParamError(\"MINT/MERGE: all makers must be the NO side (tokenId=0)\");\n }\n\n if (allBuy) {\n return this.matchMintOrders(taker, makers, collateralMint, whitelistedWallet, lookupTable);\n }\n return this.matchMergeOrders(taker, makers, collateralMint, whitelistedWallet, lookupTable);\n }\n\n // ─── Whitelist admin ─────────────────────────────────────────────────────────\n\n /** Add an address to the CLOB whitelist (owner only). */\n async addToWhitelist(address: PublicKey): Promise<TxResult> {\n const whitelistEntry = this.whitelistEntryPda(address);\n const sig = await this.program.methods\n .addToClobWhitelist(address)\n .accounts({\n owner: this.walletPubkey,\n payer: this.walletPubkey,\n clobConfig: this.configPda(),\n whitelistEntry,\n systemProgram: SystemProgram.programId,\n })\n .rpc();\n return { signature: sig };\n }\n\n /** Batch-add addresses to the CLOB whitelist (owner only). All PDAs created in one tx. */\n async addToWhitelistBatch(addresses: PublicKey[]): Promise<TxResult> {\n if (addresses.length === 0) throw new InvalidParamError(\"At least 1 address required\");\n const remainingAccounts = addresses.map(addr => ({\n pubkey: this.whitelistEntryPda(addr),\n isSigner: false,\n isWritable: true,\n }));\n const sig = await this.program.methods\n .addToClobWhitelistBatch(addresses)\n .accounts({\n owner: this.walletPubkey,\n payer: this.walletPubkey,\n clobConfig: this.configPda(),\n systemProgram: SystemProgram.programId,\n })\n .remainingAccounts(remainingAccounts)\n .rpc();\n return { signature: sig };\n }\n\n /** Remove an address from the CLOB whitelist (owner only). */\n async removeFromWhitelist(address: PublicKey, rentReceiver?: PublicKey): Promise<TxResult> {\n const whitelistEntry = this.whitelistEntryPda(address);\n const sig = await this.program.methods\n .removeFromClobWhitelist(address)\n .accounts({\n owner: this.walletPubkey,\n rentReceiver: rentReceiver ?? this.walletPubkey,\n clobConfig: this.configPda(),\n whitelistEntry,\n })\n .rpc();\n return { signature: sig };\n }\n\n /** Fetch a whitelist entry PDA (returns null if address is not whitelisted). */\n async fetchWhitelistEntry(address: PublicKey): Promise<ClobWhitelistEntry | null> {\n try {\n const pda = this.whitelistEntryPda(address);\n const acc = await (this.program.account as any).clobWhitelistEntry.fetch(pda);\n return { address: acc.address, bump: acc.bump };\n } catch {\n return null;\n }\n }\n\n /** Check if an address is on the CLOB whitelist. */\n async isWhitelisted(address: PublicKey): Promise<boolean> {\n return (await this.fetchWhitelistEntry(address)) !== null;\n }\n\n /** Fetch all whitelisted addresses (scans all ClobWhitelistEntry accounts). */\n async fetchWhitelist(): Promise<PublicKey[]> {\n const entries = await (this.program.account as any).clobWhitelistEntry.all();\n return entries.map((e: any) => e.account.address as PublicKey);\n }\n\n // ─── Queries ─────────────────────────────────────────────────────────────────\n\n async fetchConfig(): Promise<ClobConfig | null> {\n try {\n const acc = await (this.program.account as any).clobConfig.fetch(this.configPda());\n return {\n owner: acc.owner,\n operators: acc.operators as PublicKey[],\n operatorsLen: acc.operatorsLen,\n feeRecipient: acc.feeRecipient,\n feeRateBps: acc.feeRateBps,\n conditionalTokensProgram: acc.conditionalTokensProgram,\n isPaused: acc.isPaused,\n bump: acc.bump,\n };\n } catch {\n return null;\n }\n }\n\n async fetchOrderStatus(maker: PublicKey, nonce: anchor.BN): Promise<OrderStatus | null> {\n try {\n const [pda] = PDA.orderStatus(maker, nonce, this.programIds);\n const acc = await (this.program.account as any).orderStatus.fetch(pda);\n return {\n maker: acc.maker,\n nonce: acc.nonce,\n isCancelled: acc.isCancelled,\n filledAmount: acc.filledAmount,\n bump: acc.bump,\n };\n } catch {\n return null;\n }\n }\n\n async isOrderCancelled(maker: PublicKey, nonce: anchor.BN): Promise<boolean> {\n const status = await this.fetchOrderStatus(maker, nonce);\n return status?.isCancelled === true;\n }\n}\n","import * as anchor from \"@coral-xyz/anchor\";\nimport { Connection, PublicKey } from \"@solana/web3.js\";\nimport {\n NetworkConfig,\n NetworkName,\n NETWORK_CONFIGS,\n ProgramIds,\n} from \"./config/networks\";\nimport { OracleClient } from \"./programs/oracle\";\nimport { HookClient } from \"./programs/hook\";\nimport { MarketClient } from \"./programs/market\";\nimport { CtfClient } from \"./programs/ctf\";\nimport { ClobClient } from \"./programs/clob\";\n\n// IDL imports\nimport oracleIdl from \"./idls/oracle.json\";\nimport hookIdl from \"./idls/hook.json\";\nimport questionMarketIdl from \"./idls/question_market.json\";\nimport conditionalTokensIdl from \"./idls/conditional_tokens.json\";\nimport clobExchangeIdl from \"./idls/clob_exchange.json\";\n\nexport interface XMarketSDKConfig {\n /**\n * Network to connect to.\n * - `\"devnet\"` — public devnet, programs deployed\n * - `\"localnet\"` — local test validator (same program IDs as devnet)\n * - `\"mainnet\"` — mainnet-beta (hook + clob IDs TBD)\n * - `NetworkConfig` — fully custom config\n */\n network: NetworkName | NetworkConfig;\n wallet: anchor.Wallet;\n /**\n * Owner public key used to derive QuestionMarket + Oracle config PDAs.\n * Defaults to wallet pubkey.\n */\n marketOwner?: PublicKey;\n}\n\n/**\n * Top-level SDK entry point.\n *\n * ```ts\n * // Quickstart: devnet\n * const sdk = XMarketSDK.devnet(wallet);\n *\n * // Create a question market\n * await sdk.market.createQuestion({ content: \"...\", ... }, oraclePubkey);\n *\n * // Split collateral into YES + NO tokens\n * await sdk.ctf.splitPosition(conditionPda, usdcMint, new BN(100_000));\n *\n * // Match orders on the CLOB\n * await sdk.clob.matchMintOrders(yesOrder, noOrder, fillAmount, usdcMint);\n *\n * // Inspect active network config\n * console.log(sdk.networkConfig.name, sdk.networkConfig.programIds);\n * ```\n */\nexport class XMarketSDK {\n readonly provider: anchor.AnchorProvider;\n /** Active network configuration (program IDs, RPC, collateral) */\n readonly networkConfig: NetworkConfig;\n\n private readonly _programIds: ProgramIds;\n private readonly _marketOwner: PublicKey;\n\n private _oracle?: OracleClient;\n private _hook?: HookClient;\n private _market?: MarketClient;\n private _ctf?: CtfClient;\n private _clob?: ClobClient;\n\n constructor(config: XMarketSDKConfig) {\n this.networkConfig =\n typeof config.network === \"string\"\n ? NETWORK_CONFIGS[config.network]\n : config.network;\n\n this.provider = new anchor.AnchorProvider(\n new Connection(this.networkConfig.rpcUrl, \"confirmed\"),\n config.wallet,\n { commitment: \"confirmed\", preflightCommitment: \"confirmed\" }\n );\n anchor.setProvider(this.provider);\n\n this._programIds = this.networkConfig.programIds;\n this._marketOwner = config.marketOwner ?? config.wallet.publicKey;\n }\n\n // ─── Lazy-initialised clients ─────────────────────────────────────────────\n\n private _withAddress(idl: object, address: PublicKey): anchor.Idl {\n return { ...idl, address: address.toBase58() } as anchor.Idl;\n }\n\n /** Oracle program client */\n get oracle(): OracleClient {\n if (!this._oracle) {\n const program = new anchor.Program(this._withAddress(oracleIdl, this._programIds.oracle), this.provider);\n this._oracle = new OracleClient(program, this.provider, this._programIds);\n }\n return this._oracle;\n }\n\n /** Transfer-hook program client */\n get hook(): HookClient {\n if (!this._hook) {\n const program = new anchor.Program(this._withAddress(hookIdl, this._programIds.hook), this.provider);\n this._hook = new HookClient(program, this.provider, this._programIds);\n }\n return this._hook;\n }\n\n /** QuestionMarket program client */\n get market(): MarketClient {\n if (!this._market) {\n const program = new anchor.Program(this._withAddress(questionMarketIdl, this._programIds.questionMarket), this.provider);\n this._market = new MarketClient(program, this.provider, this._programIds, this._marketOwner);\n this._market.ctfClient = this.ctf;\n }\n return this._market;\n }\n\n /** Conditional tokens (CTF) program client */\n get ctf(): CtfClient {\n if (!this._ctf) {\n const program = new anchor.Program(this._withAddress(conditionalTokensIdl, this._programIds.conditionalTokens), this.provider);\n this._ctf = new CtfClient(program, this.provider, this._programIds);\n }\n return this._ctf;\n }\n\n /** CLOB exchange program client */\n get clob(): ClobClient {\n if (!this._clob) {\n const program = new anchor.Program(this._withAddress(clobExchangeIdl, this._programIds.clobExchange), this.provider);\n this._clob = new ClobClient(program, this.provider, this._programIds);\n }\n return this._clob;\n }\n\n // ─── Factory helpers ──────────────────────────────────────────────────────\n\n /**\n * Connect to devnet.\n * ```ts\n * const sdk = XMarketSDK.devnet(wallet);\n * ```\n */\n static devnet(wallet: anchor.Wallet, marketOwner?: PublicKey): XMarketSDK {\n return new XMarketSDK({ network: \"devnet\", wallet, marketOwner });\n }\n\n /**\n * Connect to localhost test validator.\n * ```ts\n * const sdk = XMarketSDK.localnet(wallet);\n * ```\n */\n static localnet(wallet: anchor.Wallet, marketOwner?: PublicKey): XMarketSDK {\n return new XMarketSDK({ network: \"localnet\", wallet, marketOwner });\n }\n\n /**\n * Connect to mainnet-beta.\n * ```ts\n * const sdk = XMarketSDK.mainnet(wallet);\n * ```\n */\n static mainnet(wallet: anchor.Wallet, marketOwner?: PublicKey): XMarketSDK {\n return new XMarketSDK({ network: \"mainnet\", wallet, marketOwner });\n }\n\n /**\n * Custom network (e.g. custom RPC, custom program IDs for a fork).\n * ```ts\n * const sdk = XMarketSDK.custom({\n * name: \"staging\",\n * rpcUrl: \"https://my-rpc.com\",\n * programIds: { ... },\n * defaultCollateral: { mint: ..., decimals: 6 },\n * }, wallet);\n * ```\n */\n static custom(config: NetworkConfig, wallet: anchor.Wallet, marketOwner?: PublicKey): XMarketSDK {\n return new XMarketSDK({ network: config, wallet, marketOwner });\n }\n}\n","/**\n * High-level order utilities — build, sign, serialize, verify, detect match type.\n *\n * These helpers layer on top of the low-level `signing.ts` primitives and\n * provide a convenient interface for both the browser (wallet adapters) and\n * Node.js (Keypair-based) environments.\n */\nimport { Keypair, PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport * as nacl from \"tweetnacl\";\nimport { Order, SignedOrder, InvalidParamError } from \"./types\";\nimport { serializeOrderToBytes, signOrder } from \"./signing\";\n\n// ─── Order factory ────────────────────────────────────────────────────────────\n\n/**\n * Build a fully-populated Order.\n * Sets `signer = maker` (proxy not yet supported).\n * `taker` defaults to new PublicKey(new Uint8Array(32)) (public order).\n * `createdAt` defaults to current Unix timestamp.\n * `fee` defaults to 0 (use global fee_rate_bps).\n */\nexport function buildOrder(params: {\n maker: PublicKey;\n condition: PublicKey;\n tokenId: number;\n side: number;\n makerAmount: BN;\n takerAmount: BN;\n nonce?: BN;\n expiry?: BN;\n createdAt?: BN;\n fee?: BN;\n taker?: PublicKey;\n}): Order {\n return {\n maker: params.maker,\n condition: params.condition,\n tokenId: params.tokenId,\n side: params.side,\n makerAmount: params.makerAmount,\n takerAmount: params.takerAmount,\n nonce: params.nonce ?? new BN(Date.now()),\n expiry: params.expiry ?? new BN(0),\n createdAt: params.createdAt ?? new BN(Math.floor(Date.now() / 1000)),\n fee: params.fee ?? new BN(0),\n taker: params.taker ?? new PublicKey(new Uint8Array(32)),\n signer: params.maker,\n };\n}\n\n// ─── Signing helpers ──────────────────────────────────────────────────────────\n\n/**\n * Sign an order with a Keypair.\n * Uses Ed25519 (nacl.sign.detached) over the 178-byte canonical message.\n */\nexport function signOrderWithKeypair(order: Order, keypair: Keypair): SignedOrder {\n const message = serializeOrderToBytes(order);\n const signature = nacl.sign.detached(message, keypair.secretKey);\n return { order, signature };\n}\n\n/** Return the 178-byte canonical message that gets signed for an order. */\nexport function getOrderSignBytes(order: Order): Uint8Array {\n return serializeOrderToBytes(order);\n}\n\n// ─── Serialization ────────────────────────────────────────────────────────────\n\n/** Serialize a SignedOrder to bytes: 178 (order) + 64 (sig) = 242 bytes. */\nexport function serializeSignedOrder(signed: SignedOrder): Uint8Array {\n const orderBytes = serializeOrderToBytes(signed.order);\n const buf = new Uint8Array(242);\n buf.set(orderBytes, 0);\n buf.set(signed.signature, 178);\n return buf;\n}\n\n/**\n * Deserialize 242 bytes back to a SignedOrder.\n * Field layout mirrors `serializeOrderToBytes()` + 64-byte signature.\n */\nexport function deserializeSignedOrder(bytes: Uint8Array): SignedOrder {\n if (bytes.length !== 242) throw new InvalidParamError(\"SignedOrder must be 242 bytes\");\n\n const readPubkey = (offset: number) => new PublicKey(bytes.slice(offset, offset + 32));\n const readU64 = (offset: number) => new BN(bytes.slice(offset, offset + 8), \"le\");\n const readI64 = (offset: number) => new BN(bytes.slice(offset, offset + 8), \"le\");\n\n const order: Order = {\n maker: readPubkey(0),\n condition: readPubkey(32),\n tokenId: bytes[64],\n side: bytes[65],\n makerAmount: readU64(66),\n takerAmount: readU64(74),\n nonce: readU64(82),\n expiry: readI64(90),\n createdAt: readI64(98),\n fee: readU64(106),\n taker: readPubkey(114),\n signer: readPubkey(146),\n };\n const signature = bytes.slice(178, 242);\n return { order, signature };\n}\n\n// ─── Verification ─────────────────────────────────────────────────────────────\n\n/**\n * Verify the Ed25519 signature on a signed order.\n * Returns true only if the signature is valid for `order.maker` (or `order.signer`).\n */\nexport function verifySignedOrder(signed: SignedOrder): boolean {\n const message = serializeOrderToBytes(signed.order);\n return nacl.sign.detached.verify(\n message,\n signed.signature,\n signed.order.signer.toBytes(),\n );\n}\n\n// ─── Match type detection ─────────────────────────────────────────────────────\n\nexport type MatchType = \"COMPLEMENTARY\" | \"MINT\" | \"MERGE\";\n\n/**\n * Detect the match type from two orders (pure, no RPC).\n *\n * | tokenId A === B | sides | type |\n * |-----------------|--------------|---------------|\n * | yes | one BUY+SELL | COMPLEMENTARY |\n * | no | both BUY | MINT |\n * | no | both SELL | MERGE |\n */\nexport function detectMatchType(a: Order | SignedOrder, b: Order | SignedOrder): MatchType {\n const _a = \"order\" in a ? a.order : a;\n const _b = \"order\" in b ? b.order : b;\n return _detectMatchType(_a, _b);\n}\n\nfunction _detectMatchType(a: Order, b: Order): MatchType {\n const SIDE_BUY = 1;\n const SIDE_SELL = 0;\n\n if (a.tokenId === b.tokenId) {\n const aBuy = a.side === SIDE_BUY;\n const bBuy = b.side === SIDE_BUY;\n if (aBuy !== bBuy) return \"COMPLEMENTARY\";\n throw new InvalidParamError(\n \"Orders with same tokenId must be one BUY and one SELL (COMPLEMENTARY)\"\n );\n }\n\n const aBuy = a.side === SIDE_BUY;\n const bBuy = b.side === SIDE_BUY;\n if (aBuy && bBuy) return \"MINT\";\n if (!aBuy && !bBuy) return \"MERGE\";\n throw new InvalidParamError(\n \"Orders with different tokenIds must both be BUY (MINT) or both SELL (MERGE)\"\n );\n}\n\nexport { signOrder };\n","/**\n * SPL Token / Token-2022 approve utilities for the CLOB matching flow.\n *\n * Before a match instruction can transfer tokens on behalf of a user, the user\n * must approve the CLOB config PDA as a delegate. These helpers build the\n * approve transactions that need two signers:\n * - signer = the token owner (user wallet — must sign the approve instruction)\n * - payer = the BE wallet (pays transaction fees)\n *\n * Both must sign the resulting Transaction before sending.\n */\nimport {\n PublicKey,\n Transaction,\n SystemProgram,\n} from \"@solana/web3.js\";\nimport {\n TOKEN_PROGRAM_ID,\n TOKEN_2022_PROGRAM_ID,\n getAssociatedTokenAddressSync,\n createApproveInstruction,\n} from \"@solana/spl-token\";\nimport BN from \"bn.js\";\nimport { PDA } from \"./pda\";\nimport { ProgramIds } from \"./config/networks\";\n\n/** Maximum u64 — approve \"unlimited\" amount. */\nexport const MAX_APPROVE_AMOUNT = new BN(\"18446744073709551615\");\n\n// ─── Collateral (SPL Token) approve ──────────────────────────────────────────\n\n/**\n * Build a Transaction that approves the CLOB config PDA to transfer collateral\n * (USDC) from the signer's ATA.\n *\n * Required signers: signer (token owner), payer (fee payer).\n *\n * @param collateralMint - e.g. USDC mint\n * @param signer - token owner (must sign)\n * @param payer - fee payer wallet pubkey\n * @param delegate - clob config PDA (the spender)\n * @param amount - amount to approve (defaults to MAX_APPROVE_AMOUNT)\n */\nexport function buildApproveCollateralTx(\n collateralMint: PublicKey,\n signer: PublicKey,\n payer: PublicKey,\n delegate: PublicKey,\n amount: BN = MAX_APPROVE_AMOUNT,\n): Transaction {\n const ownerAta = getAssociatedTokenAddressSync(collateralMint, signer, false, TOKEN_PROGRAM_ID);\n const approveIx = createApproveInstruction(\n ownerAta,\n delegate,\n signer,\n BigInt(amount.toString()),\n [],\n TOKEN_PROGRAM_ID,\n );\n const tx = new Transaction();\n tx.feePayer = payer;\n tx.add(approveIx);\n return tx;\n}\n\n/**\n * Build a Transaction that approves the CLOB config PDA to transfer BOTH\n * YES and NO outcome tokens from the signer's ATAs (two approve instructions).\n *\n * Required signers: signer (token owner), payer (fee payer).\n */\nexport function buildApproveAllOutcomeTokensTx(\n condition: PublicKey,\n signer: PublicKey,\n payer: PublicKey,\n delegate: PublicKey,\n programIds: ProgramIds,\n amount: BN = MAX_APPROVE_AMOUNT,\n): Transaction {\n const [yesMint] = PDA.yesMint(condition, programIds);\n const [noMint] = PDA.noMint(condition, programIds);\n\n const yesAta = getAssociatedTokenAddressSync(yesMint, signer, false, TOKEN_2022_PROGRAM_ID);\n const noAta = getAssociatedTokenAddressSync(noMint, signer, false, TOKEN_2022_PROGRAM_ID);\n const amountBig = BigInt(amount.toString());\n\n const approveYesIx = createApproveInstruction(\n yesAta, delegate, signer, amountBig, [], TOKEN_2022_PROGRAM_ID,\n );\n const approveNoIx = createApproveInstruction(\n noAta, delegate, signer, amountBig, [], TOKEN_2022_PROGRAM_ID,\n );\n\n const tx = new Transaction();\n tx.feePayer = payer;\n tx.add(approveYesIx, approveNoIx);\n return tx;\n}\n"]}
1
+ {"version":3,"sources":["../src/pda.ts","../src/programs/oracle.ts","../src/programs/hook.ts","../src/types.ts","../src/programs/market.ts","../src/programs/ctf.ts","../src/signing.ts","../src/programs/clob.ts","../src/sdk.ts","../src/order.ts","../src/approve.ts"],"names":["PublicKey","createHash","SystemProgram","anchor","TOKEN_2022_PROGRAM_ID","QuestionStatus","anchor2","SYSVAR_RENT_PUBKEY","TOKEN_PROGRAM_ID","getAssociatedTokenAddressSync","ASSOCIATED_TOKEN_PROGRAM_ID","anchor3","TransactionInstruction","Ed25519Program","SYSVAR_INSTRUCTIONS_PUBKEY","TransactionMessage","VersionedTransaction","anchor4","Connection","oracleIdl","hookIdl","questionMarketIdl","conditionalTokensIdl","clobExchangeIdl","BN","nacl","aBuy","bBuy","createApproveInstruction","Transaction"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQO,IAAM,KAAA,GAAQ;AAAA,EACnB,MAAA,EAAmB,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAAA,EACvC,QAAA,EAAmB,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAAA,EACzC,SAAA,EAAmB,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA;AAAA,EAC1C,eAAA,EAAmB,MAAA,CAAO,IAAA,CAAK,kBAAkB,CAAA;AAAA,EACjD,UAAA,EAAmB,MAAA,CAAO,IAAA,CAAK,aAAa,CAAA;AAAA,EAC5C,QAAA,EAAmB,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAAA,EACzC,OAAA,EAAmB,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAAA,EACzC,MAAA,EAAmB,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAAA,EACxC,aAAA,EAAmB,MAAA,CAAO,IAAA,CAAK,gBAAgB,CAAA;AAAA,EAC/C,QAAA,EAAmB,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAAA,EACzC,MAAA,EAAmB,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAAA,EACvC,SAAA,EAAmB,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA;AAAA,EAC3C,UAAA,EAAmB,MAAA,CAAO,IAAA,CAAK,aAAa,CAAA;AAAA,EAC5C,iBAAA,EAAmB,MAAA,CAAO,IAAA,CAAK,qBAAqB,CAAA;AAAA,EACpD,UAAA,EAAmB,MAAA,CAAO,IAAA,CAAK,aAAa,CAAA;AAAA,EAC5C,KAAA,EAAmB,MAAA,CAAO,IAAA,CAAK,OAAO;AACxC;AAKO,IAAM,MAAN,MAAU;AAAA;AAAA,EAGf,OAAO,oBAAA,CACL,KAAA,EACA,UAAA,EACqB;AACrB,IAAA,OAAOA,iBAAA,CAAU,sBAAA;AAAA,MACf,CAAC,KAAA,CAAM,MAAA,EAAQ,KAAA,CAAM,UAAU,CAAA;AAAA,MAC/B,UAAA,CAAW;AAAA,KACb;AAAA,EACF;AAAA,EAEA,OAAO,QAAA,CACL,MAAA,EACA,UAAA,EACA,UAAA,EACqB;AACrB,IAAA,OAAOA,iBAAA,CAAU,sBAAA;AAAA,MACf,CAAC,MAAM,QAAA,EAAU,MAAA,CAAO,UAAS,EAAG,MAAA,CAAO,IAAA,CAAK,UAAU,CAAC,CAAA;AAAA,MAC3D,UAAA,CAAW;AAAA,KACb;AAAA,EACF;AAAA;AAAA,EAIA,OAAO,UACL,UAAA,EACqB;AACrB,IAAA,OAAOA,iBAAA,CAAU,sBAAA;AAAA,MACf,CAAC,MAAM,SAAS,CAAA;AAAA,MAChB,UAAA,CAAW;AAAA,KACb;AAAA,EACF;AAAA,EAEA,OAAO,SAAA,CACL,MAAA,EACA,UAAA,EACA,UAAA,EACqB;AACrB,IAAA,OAAOA,iBAAA,CAAU,sBAAA;AAAA,MACf,CAAC,MAAM,SAAA,EAAW,MAAA,CAAO,UAAS,EAAG,MAAA,CAAO,IAAA,CAAK,UAAU,CAAC,CAAA;AAAA,MAC5D,UAAA,CAAW;AAAA,KACb;AAAA,EACF;AAAA,EAEA,OAAO,eAAA,CACL,cAAA,EACA,UAAA,EACqB;AACrB,IAAA,OAAOA,iBAAA,CAAU,sBAAA;AAAA,MACf,CAAC,KAAA,CAAM,eAAA,EAAiB,cAAA,CAAe,UAAU,CAAA;AAAA,MACjD,UAAA,CAAW;AAAA,KACb;AAAA,EACF;AAAA,EAEA,OAAO,UAAA,CACL,cAAA,EACA,UAAA,EACqB;AACrB,IAAA,OAAOA,iBAAA,CAAU,sBAAA;AAAA,MACf,CAAC,KAAA,CAAM,UAAA,EAAY,cAAA,CAAe,UAAU,CAAA;AAAA,MAC5C,UAAA,CAAW;AAAA,KACb;AAAA,EACF;AAAA,EAEA,OAAO,OAAA,CACL,SAAA,EACA,UAAA,EACqB;AACrB,IAAA,OAAOA,iBAAA,CAAU,sBAAA;AAAA,MACf,CAAC,KAAA,CAAM,OAAA,EAAS,SAAA,CAAU,UAAU,CAAA;AAAA,MACpC,UAAA,CAAW;AAAA,KACb;AAAA,EACF;AAAA,EAEA,OAAO,MAAA,CACL,SAAA,EACA,UAAA,EACqB;AACrB,IAAA,OAAOA,iBAAA,CAAU,sBAAA;AAAA,MACf,CAAC,KAAA,CAAM,MAAA,EAAQ,SAAA,CAAU,UAAU,CAAA;AAAA,MACnC,UAAA,CAAW;AAAA,KACb;AAAA,EACF;AAAA,EAEA,OAAO,aAAA,CACL,SAAA,EACA,UAAA,EACqB;AACrB,IAAA,OAAOA,iBAAA,CAAU,sBAAA;AAAA,MACf,CAAC,KAAA,CAAM,aAAA,EAAe,SAAA,CAAU,UAAU,CAAA;AAAA,MAC1C,UAAA,CAAW;AAAA,KACb;AAAA,EACF;AAAA,EAEA,OAAO,QAAA,CACL,SAAA,EACA,YAAA,EACA,OACA,UAAA,EACqB;AACrB,IAAA,OAAOA,iBAAA,CAAU,sBAAA;AAAA,MACf,CAAC,KAAA,CAAM,QAAA,EAAU,SAAA,CAAU,UAAS,EAAG,MAAA,CAAO,IAAA,CAAK,CAAC,YAAY,CAAC,CAAA,EAAG,KAAA,CAAM,UAAU,CAAA;AAAA,MACpF,UAAA,CAAW;AAAA,KACb;AAAA,EACF;AAAA;AAAA,EAIA,OAAO,YAAA,CACL,KAAA,EACA,UAAA,EACqB;AACrB,IAAA,OAAOA,iBAAA,CAAU,sBAAA;AAAA,MACf,CAAC,KAAA,CAAM,MAAA,EAAQ,KAAA,CAAM,UAAU,CAAA;AAAA,MAC/B,UAAA,CAAW;AAAA,KACb;AAAA,EACF;AAAA,EAEA,OAAO,QAAA,CACL,YAAA,EACA,eAAA,EACA,UAAA,EACqB;AACrB,IAAA,OAAOA,iBAAA,CAAU,sBAAA;AAAA,MACf,CAAC,MAAM,QAAA,EAAU,YAAA,CAAa,UAAS,EAAG,eAAA,CAAgB,UAAU,CAAA;AAAA,MACpE,UAAA,CAAW;AAAA,KACb;AAAA,EACF;AAAA,EAEA,OAAO,cAAA,CACL,YAAA,EACA,UAAA,EACA,UAAA,EACqB;AACrB,IAAA,OAAOA,iBAAA,CAAU,sBAAA;AAAA,MACf,CAAC,MAAM,MAAA,EAAQ,YAAA,CAAa,UAAS,EAAG,MAAA,CAAO,IAAA,CAAK,UAAU,CAAC,CAAA;AAAA,MAC/D,UAAA,CAAW;AAAA,KACb;AAAA,EACF;AAAA;AAAA,EAIA,OAAO,WACL,UAAA,EACqB;AACrB,IAAA,OAAOA,iBAAA,CAAU,sBAAA;AAAA,MACf,CAAC,MAAM,UAAU,CAAA;AAAA,MACjB,UAAA,CAAW;AAAA,KACb;AAAA,EACF;AAAA,EAEA,OAAO,oBAAA,CACL,IAAA,EACA,UAAA,EACqB;AACrB,IAAA,OAAOA,iBAAA,CAAU,sBAAA;AAAA,MACf,CAAC,KAAA,CAAM,iBAAA,EAAmB,IAAA,CAAK,UAAU,CAAA;AAAA,MACzC,UAAA,CAAW;AAAA,KACb;AAAA,EACF;AAAA;AAAA,EAIA,OAAO,WACL,UAAA,EACqB;AACrB,IAAA,OAAOA,iBAAA,CAAU,sBAAA;AAAA,MACf,CAAC,MAAM,UAAU,CAAA;AAAA,MACjB,UAAA,CAAW;AAAA,KACb;AAAA,EACF;AAAA,EAEA,OAAO,WAAA,CACL,KAAA,EACA,KAAA,EACA,UAAA,EACqB;AACrB,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA;AAC/B,IAAA,QAAA,CAAS,gBAAA,CAAiB,MAAA,CAAO,KAAA,CAAM,QAAA,EAAU,CAAC,CAAA;AAClD,IAAA,OAAOA,iBAAA,CAAU,sBAAA;AAAA,MACf,CAAC,KAAA,CAAM,KAAA,EAAO,KAAA,CAAM,QAAA,IAAY,QAAQ,CAAA;AAAA,MACxC,UAAA,CAAW;AAAA,KACb;AAAA,EACF;AACF;AAKO,SAAS,kBAAA,CAAmB,SAAiB,IAAA,EAA2B;AAC7E,EAAA,MAAM,KAAA,GAAQ,OAAA,IAAW,IAAA,IAAQ,IAAA,CAAK,GAAA,EAAI,CAAA;AAC1C,EAAA,OAAO,IAAI,WAAWC,iBAAA,CAAW,QAAQ,EAAE,MAAA,CAAO,KAAK,CAAA,CAAE,MAAA,EAAQ,CAAA;AACnE;AAGO,SAAS,oBAAoB,OAAA,EAA6B;AAC/D,EAAA,OAAO,IAAI,WAAWA,iBAAA,CAAW,QAAQ,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,MAAA,EAAQ,CAAA;AACrE;;;AC/NO,IAAM,eAAN,MAAmB;AAAA,EAKxB,WAAA,CACE,OAAA,EACA,QAAA,EACA,UAAA,EACA;AACA,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,EACpB;AAAA,EAEA,IAAI,YAAA,GAA0B;AAC5B,IAAA,OAAO,IAAA,CAAK,SAAS,MAAA,CAAO,SAAA;AAAA,EAC9B;AAAA,EAEA,SAAA,CAAU,KAAA,GAAmB,IAAA,CAAK,YAAA,EAAyB;AACzD,IAAA,OAAO,IAAI,YAAA,CAAa,KAAA,EAAO,IAAA,CAAK,UAAU,EAAE,CAAC,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,KAAA,EAAqC;AACpD,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,QAC5B,UAAA,CAAW,KAAK,EAChB,QAAA,CAAS;AAAA,MACR,OAAO,IAAA,CAAK,YAAA;AAAA,MACZ,YAAA,EAAc,KAAK,SAAA,EAAU;AAAA,MAC7B,eAAeC,qBAAA,CAAc;AAAA,KAC9B,EACA,GAAA,EAAI;AACP,IAAA,OAAO,EAAE,WAAW,GAAA,EAAI;AAAA,EAC1B;AAAA;AAAA,EAGA,MAAM,cAAA,CAAe,OAAA,EAAoB,WAAA,EAA4C;AACnF,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,QAC5B,cAAA,CAAe,OAAO,EACtB,QAAA,CAAS;AAAA,MACR,WAAc,IAAA,CAAK,YAAA;AAAA,MACnB,OAAc,IAAA,CAAK,YAAA;AAAA,MACnB,YAAA,EAAc,IAAA,CAAK,SAAA,CAAU,WAAW;AAAA,KACzC,EACA,GAAA,EAAI;AACP,IAAA,OAAO,EAAE,WAAW,GAAA,EAAI;AAAA,EAC1B;AAAA;AAAA,EAGA,MAAM,mBAAA,CAAoB,OAAA,EAAoB,WAAA,EAA4C;AACxF,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,QAC5B,mBAAA,CAAoB,OAAO,EAC3B,QAAA,CAAS;AAAA,MACR,WAAc,IAAA,CAAK,YAAA;AAAA,MACnB,OAAc,IAAA,CAAK,YAAA;AAAA,MACnB,YAAA,EAAc,IAAA,CAAK,SAAA,CAAU,WAAW;AAAA,KACzC,EACA,GAAA,EAAI;AACP,IAAA,OAAO,EAAE,WAAW,GAAA,EAAI;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,eAAA,CACJ,UAAA,EACA,YAAA,EACA,gBAAA,EACA,cACA,WAAA,EACA,KAAA,EACA,OAAA,GAAqB,EAAC,EACH;AACnB,IAAA,MAAM,YAAA,GAAsB,IAAA,CAAK,SAAA,CAAU,WAAW,CAAA;AACtD,IAAA,MAAM,CAAC,iBAAiB,CAAA,GAAI,GAAA,CAAI,eAAe,YAAA,EAAc,UAAA,EAAY,KAAK,UAAU,CAAA;AACxF,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAC5B,eAAA;AAAA,MACC,KAAA,CAAM,KAAK,UAAU,CAAA;AAAA,MACrB,YAAA;AAAA,MACA,iBAAiB,GAAA,CAAI,CAAC,MAAM,IAAWC,kBAAA,CAAA,EAAA,CAAG,CAAC,CAAC;AAAA,MAE7C,QAAA,CAAS;AAAA,MACR,UAA0B,IAAA,CAAK,YAAA;AAAA,MAC/B,YAAA;AAAA,MACA,cAAA,EAA0B,iBAAA;AAAA,MAC1B,SAAA,EAA0B,YAAA;AAAA,MAC1B,wBAAA,EAA0B,KAAK,UAAA,CAAW,iBAAA;AAAA,MAC1C,KAAA,EAA0B,SAAS,IAAA,CAAK,YAAA;AAAA,MACxC,eAA0BD,qBAAA,CAAc;AAAA,KACzC,CAAA,CACA,OAAA,CAAQ,OAAO,EACf,GAAA,EAAI;AACP,IAAA,OAAO,EAAE,WAAW,GAAA,EAAI;AAAA,EAC1B;AAAA;AAAA,EAGA,MAAM,WAAA,CAAY,QAAA,EAAqB,WAAA,EAA4C;AACjF,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,QAC5B,WAAA,CAAY,QAAQ,EACpB,QAAA,CAAS;AAAA,MACR,OAAO,IAAA,CAAK,YAAA;AAAA,MACZ,YAAA,EAAc,IAAA,CAAK,SAAA,CAAU,WAAW;AAAA,KACzC,EACA,GAAA,EAAI;AACP,IAAA,OAAO,EAAE,WAAW,GAAA,EAAI;AAAA,EAC1B;AAAA;AAAA,EAGA,MAAM,iBAAA,CAAkB,QAAA,EAAqB,WAAA,EAA4C;AACvF,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,QAC5B,iBAAA,CAAkB,QAAQ,EAC1B,QAAA,CAAS;AAAA,MACR,OAAO,IAAA,CAAK,YAAA;AAAA,MACZ,YAAA,EAAc,IAAA,CAAK,SAAA,CAAU,WAAW;AAAA,KACzC,EACA,GAAA,EAAI;AACP,IAAA,OAAO,EAAE,WAAW,GAAA,EAAI;AAAA,EAC1B;AAAA;AAAA,EAGA,MAAM,KAAA,CAAM,MAAA,EAAiB,WAAA,EAA4C;AACvE,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,QAC5B,KAAA,CAAM,MAAM,EACZ,QAAA,CAAS;AAAA,MACR,WAAW,IAAA,CAAK,YAAA;AAAA,MAChB,YAAA,EAAc,IAAA,CAAK,SAAA,CAAU,WAAW;AAAA,KACzC,EACA,GAAA,EAAI;AACP,IAAA,OAAO,EAAE,WAAW,GAAA,EAAI;AAAA,EAC1B;AAAA;AAAA,EAIA,MAAM,YAAY,KAAA,EAAiD;AACjE,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAO,IAAA,CAAK,OAAA,CAAQ,QAAgB,YAAA,CAAa,KAAA;AAAA,QAC3D,IAAA,CAAK,SAAA,CAAU,KAAA,IAAS,IAAA,CAAK,YAAY;AAAA,OAC3C;AACA,MAAA,OAAO;AAAA,QACL,OAAc,GAAA,CAAI,KAAA;AAAA,QAClB,OAAc,GAAA,CAAI,KAAA;AAAA,QAClB,aAAA,EAAe,GAAA,CAAI,aAAA,CAAc,QAAA,EAAS;AAAA,QAC1C,WAAc,GAAA,CAAI,SAAA;AAAA,QAClB,cAAc,GAAA,CAAI,YAAA;AAAA,QAClB,UAAc,GAAA,CAAI,QAAA;AAAA,QAClB,MAAc,GAAA,CAAI;AAAA,OACpB;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,mBAAA,CACJ,UAAA,EACA,WAAA,EACgC;AAChC,IAAA,IAAI;AACF,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,SAAA,CAAU,WAAW,CAAA;AAC/C,MAAA,MAAM,CAAC,GAAG,CAAA,GAAI,GAAA,CAAI,eAAe,YAAA,EAAc,UAAA,EAAY,KAAK,UAAU,CAAA;AAC1E,MAAA,MAAM,MAAM,MAAO,IAAA,CAAK,QAAQ,OAAA,CAAgB,cAAA,CAAe,MAAM,GAAG,CAAA;AACxE,MAAA,OAAO;AAAA,QACL,cAAkB,GAAA,CAAI,YAAA;AAAA,QACtB,UAAA,EAAkB,IAAI,UAAA,CAAW,GAAA,CAAI,UAAU,CAAA;AAAA,QAC/C,cAAkB,GAAA,CAAI,YAAA;AAAA,QACtB,cAAkB,GAAA,CAAI,YAAA;AAAA,QACtB,kBAAkB,GAAA,CAAI,gBAAA;AAAA,QACtB,YAAkB,GAAA,CAAI,UAAA;AAAA,QACtB,UAAA,EAAkB,GAAA,CAAI,UAAA,CAAW,QAAA,EAAS;AAAA,QAC1C,UAAkB,GAAA,CAAI,QAAA;AAAA,QACtB,SAAA,EAAkB,IAAI,SAAA,IAAa,IAAA;AAAA,QACnC,MAAkB,GAAA,CAAI;AAAA,OACxB;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACF;ACtLO,IAAM,aAAN,MAAiB;AAAA,EAKtB,WAAA,CACE,OAAA,EACA,QAAA,EACA,UAAA,EACA;AACA,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,EACpB;AAAA,EAEA,IAAI,YAAA,GAA0B;AAC5B,IAAA,OAAO,IAAA,CAAK,SAAS,MAAA,CAAO,SAAA;AAAA,EAC9B;AAAA,EAEA,SAAA,GAAuB;AACrB,IAAA,OAAO,GAAA,CAAI,UAAA,CAAW,IAAA,CAAK,UAAU,EAAE,CAAC,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,gBAAA,EAAkD;AACjE,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,QAC5B,oBAAA,CAAqB,gBAAgB,EACrC,QAAA,CAAS;AAAA,MACR,OAAe,IAAA,CAAK,YAAA;AAAA,MACpB,UAAA,EAAe,KAAK,SAAA,EAAU;AAAA,MAC9B,eAAeA,qBAAAA,CAAc;AAAA,KAC9B,EACA,GAAA,EAAI;AACP,IAAA,OAAO,EAAE,WAAW,GAAA,EAAI;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,+BAA+B,IAAA,EAAoC;AACvE,IAAA,MAAM,CAAC,oBAAoB,CAAA,GAAI,IAAI,oBAAA,CAAqB,IAAA,EAAM,KAAK,UAAU,CAAA;AAC7E,IAAA,MAAM,MAAM,MAAM,IAAA,CAAK,QAAQ,OAAA,CAC5B,8BAAA,GACA,QAAA,CAAS;AAAA,MACR,OAAsB,IAAA,CAAK,YAAA;AAAA,MAC3B,oBAAA;AAAA,MACA,IAAA;AAAA,MACA,UAAA,EAAsB,KAAK,SAAA,EAAU;AAAA,MACrC,YAAA,EAAsBE,8BAAA;AAAA,MACtB,eAAsBF,qBAAAA,CAAc;AAAA,KACrC,EACA,GAAA,EAAI;AACP,IAAA,OAAO,EAAE,WAAW,GAAA,EAAI;AAAA,EAC1B;AAAA;AAAA,EAGA,MAAM,eAAe,OAAA,EAAuC;AAC1D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,QAC5B,cAAA,CAAe,OAAO,EACtB,QAAA,CAAS;AAAA,MACR,OAAY,IAAA,CAAK,YAAA;AAAA,MACjB,UAAA,EAAY,KAAK,SAAA;AAAU,KAC5B,EACA,GAAA,EAAI;AACP,IAAA,OAAO,EAAE,WAAW,GAAA,EAAI;AAAA,EAC1B;AAAA;AAAA,EAGA,MAAM,oBAAoB,OAAA,EAAuC;AAC/D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,QAC5B,mBAAA,CAAoB,OAAO,EAC3B,QAAA,CAAS;AAAA,MACR,OAAY,IAAA,CAAK,YAAA;AAAA,MACjB,UAAA,EAAY,KAAK,SAAA;AAAU,KAC5B,EACA,GAAA,EAAI;AACP,IAAA,OAAO,EAAE,WAAW,GAAA,EAAI;AAAA,EAC1B;AAAA;AAAA,EAGA,MAAM,eAAA,GAAqC;AACzC,IAAA,MAAM,MAAM,MAAM,IAAA,CAAK,QAAQ,OAAA,CAC5B,eAAA,GACA,QAAA,CAAS;AAAA,MACR,OAAY,IAAA,CAAK,YAAA;AAAA,MACjB,UAAA,EAAY,KAAK,SAAA;AAAU,KAC5B,EACA,GAAA,EAAI;AACP,IAAA,OAAO,EAAE,WAAW,GAAA,EAAI;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAM,OAAA,CACJ,WAAA,EACA,IAAA,EACA,gBAAA,EACA,OACA,MAAA,EACmB;AACnB,IAAA,MAAM,CAAC,oBAAoB,CAAA,GAAI,IAAI,oBAAA,CAAqB,IAAA,EAAM,KAAK,UAAU,CAAA;AAC7E,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,QAC5B,OAAA,CAAQ,MAAM,EACd,QAAA,CAAS;AAAA,MACR,WAAA;AAAA,MACA,IAAA;AAAA,MACA,gBAAA;AAAA,MACA,KAAA;AAAA,MACA,oBAAA;AAAA,MACA,UAAA,EAAY,KAAK,SAAA;AAAU,KAC5B,EACA,GAAA,EAAI;AACP,IAAA,OAAO,EAAE,WAAW,GAAA,EAAI;AAAA,EAC1B;AAAA;AAAA,EAIA,MAAM,WAAA,GAA0C;AAC9C,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAO,IAAA,CAAK,OAAA,CAAQ,QAAgB,UAAA,CAAW,KAAA,CAAM,IAAA,CAAK,SAAA,EAAW,CAAA;AACjF,MAAA,OAAO;AAAA,QACL,OAAc,GAAA,CAAI,KAAA;AAAA,QAClB,WAAc,GAAA,CAAI,SAAA;AAAA,QAClB,cAAc,GAAA,CAAI,YAAA;AAAA,QAClB,UAAc,GAAA,CAAI,QAAA;AAAA,QAClB,MAAc,GAAA,CAAI;AAAA,OACpB;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,OAAA,EAAsC;AACxD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,WAAA,EAAY;AACtC,IAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,IAAA,OAAO,MAAA,CAAO,UAAU,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,EACvD;AACF;;;ACxFO,IAAK,cAAA,qBAAAG,eAAAA,KAAL;AACL,EAAAA,gBAAA,SAAA,CAAA,GAAW,SAAA;AACX,EAAAA,gBAAA,UAAA,CAAA,GAAW,UAAA;AACX,EAAAA,gBAAA,UAAA,CAAA,GAAW,UAAA;AACX,EAAAA,gBAAA,UAAA,CAAA,GAAW,UAAA;AAJD,EAAA,OAAAA,eAAAA;AAAA,CAAA,EAAA,cAAA,IAAA,EAAA;AA+IL,IAAM,YAAA,GAAN,cAA2B,KAAA,CAAM;AAAA,EACtC,WAAA,CAAY,SAAwB,IAAA,EAAe;AACjD,IAAA,KAAA,CAAM,OAAO,CAAA;AADqB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAElC,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AAAA,EACd;AACF;AAEO,IAAM,iBAAA,GAAN,cAAgC,YAAA,CAAa;AAAA,EAClD,WAAA,CAAY,MAAM,cAAA,EAAgB;AAChC,IAAA,KAAA,CAAM,KAAK,cAAc,CAAA;AACzB,IAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AAAA,EACd;AACF;AAEO,IAAM,oBAAA,GAAN,cAAmC,YAAA,CAAa;AAAA,EACrD,WAAA,CAAY,SAAiB,OAAA,EAAkB;AAC7C,IAAA,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,UAAA,EAAa,OAAA,GAAU,KAAK,OAAO,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,EAAI,WAAW,CAAA;AACzE,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AAAA,EACd;AACF;AAEO,IAAM,iBAAA,GAAN,cAAgC,YAAA,CAAa;AAAA,EAClD,WAAA,CAAY,MAAM,mBAAA,EAAqB;AACrC,IAAA,KAAA,CAAM,KAAK,eAAe,CAAA;AAC1B,IAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AAAA,EACd;AACF;;;ACpOO,IAAM,eAAN,MAAmB;AAAA,EASxB,WAAA,CACE,OAAA,EACA,QAAA,EACA,UAAA,EACA,WAAA,EACA;AACA,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,YAAY,GAAA,CAAI,oBAAA,CAAqB,WAAA,EAAa,UAAU,EAAE,CAAC,CAAA;AAAA,EACtE;AAAA,EAEA,IAAI,YAAA,GAA0B;AAC5B,IAAA,OAAO,IAAA,CAAK,SAAS,MAAA,CAAO,SAAA;AAAA,EAC9B;AAAA;AAAA,EAIA,MAAM,UAAA,CACJ,KAAA,EACA,MAAA,EACA,KAAA,GAAmB,KAAK,YAAA,EACF;AACtB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,CACjB,UAAA,CAAW;AAAA,MACV,KAAA;AAAA,MACA,wBAAA,EAA0B,KAAK,UAAA,CAAW,iBAAA;AAAA,MAC1C;AAAA,KACD,EACA,QAAA,CAAS;AAAA,MACR,KAAA;AAAA,MACA,QAAe,IAAA,CAAK,SAAA;AAAA,MACpB,eAAeH,qBAAAA,CAAc;AAAA,KAC9B,EACA,WAAA,EAAY;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,eACJ,MAAA,EACA,MAAA,EACA,UAAqB,IAAA,CAAK,YAAA,EAC1B,QAAqB,OAAA,EACkF;AACvG,IAAA,MAAM,UAAA,GAAc,MAAA,CAAO,UAAA,IAAe,kBAAA,CAAmB,OAAO,OAAO,CAAA;AAC3E,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,WAAA,IAAe,mBAAA,CAAoB,OAAO,OAAO,CAAA;AAE5E,IAAA,MAAM,CAAC,WAAW,CAAA,GAAQ,GAAA,CAAI,SAAS,IAAA,CAAK,SAAA,EAAW,UAAA,EAAY,IAAA,CAAK,UAAU,CAAA;AAClF,IAAA,MAAM,CAAC,YAAY,CAAA,GAAO,GAAA,CAAI,UAAU,MAAA,EAAQ,UAAA,EAAY,KAAK,UAAU,CAAA;AAC3E,IAAA,MAAM,CAAC,OAAO,CAAA,GAAY,IAAI,OAAA,CAAQ,YAAA,EAAc,KAAK,UAAU,CAAA;AACnE,IAAA,MAAM,CAAC,MAAM,CAAA,GAAa,IAAI,MAAA,CAAO,YAAA,EAAc,KAAK,UAAU,CAAA;AAClE,IAAA,MAAM,CAAC,aAAa,CAAA,GAAM,IAAI,aAAA,CAAc,YAAA,EAAc,KAAK,UAAU,CAAA;AACzE,IAAA,MAAM,CAAC,eAAe,CAAA,GAAI,GAAA,CAAI,gBAAgB,MAAA,CAAO,cAAA,EAAgB,KAAK,UAAU,CAAA;AAEpF,IAAA,MAAM,EAAA,GAAK,MAAM,IAAA,CAAK,OAAA,CAAQ,QAC3B,2BAAA,CAA4B;AAAA,MAC3B,UAAA,EAAgB,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA;AAAA,MACrC,WAAA,EAAgB,KAAA,CAAM,IAAA,CAAK,WAAW,CAAA;AAAA,MACtC,aAAgB,MAAA,CAAO,WAAA;AAAA,MACvB,gBAAgB,MAAA,CAAO,cAAA;AAAA,MACvB,cAAA,EAAgB,IAAWI,kBAAA,CAAA,EAAA,CAAG,MAAA,CAAO,cAAc;AAAA,KACpD,EACA,QAAA,CAAS;AAAA,MACR,KAAA;AAAA,MACA,OAAA;AAAA,MACA,QAA0B,IAAA,CAAK,SAAA;AAAA,MAC/B,QAAA,EAA0B,WAAA;AAAA,MAC1B,cAA0B,MAAA,CAAO,cAAA;AAAA,MACjC,MAAA;AAAA,MACA,SAAA,EAA0B,YAAA;AAAA,MAC1B,OAAA;AAAA,MACA,MAAA;AAAA,MACA,aAAA;AAAA,MACA,eAAA;AAAA,MACA,wBAAA,EAA0B,KAAK,UAAA,CAAW,iBAAA;AAAA,MAC1C,YAAA,EAA0BF,8BAAAA;AAAA,MAC1B,eAA0BF,qBAAAA,CAAc,SAAA;AAAA,MACxC,IAAA,EAA0BK;AAAA,KAC3B,EACA,WAAA,EAAY;AAEf,IAAA,OAAO,EAAE,EAAA,EAAI,WAAA,EAAa,YAAA,EAAc,UAAA,EAAW;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,oBACJ,MAAA,EACA,MAAA,EACA,UAAqB,IAAA,CAAK,YAAA,EAC1B,QAAqB,OAAA,EACkF;AACvG,IAAA,MAAM,UAAA,GAAc,MAAA,CAAO,UAAA,IAAe,kBAAA,CAAmB,OAAO,OAAO,CAAA;AAC3E,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,WAAA,IAAe,mBAAA,CAAoB,OAAO,OAAO,CAAA;AAE5E,IAAA,MAAM,CAAC,WAAW,CAAA,GAAQ,GAAA,CAAI,SAAS,IAAA,CAAK,SAAA,EAAW,UAAA,EAAY,IAAA,CAAK,UAAU,CAAA;AAClF,IAAA,MAAM,CAAC,YAAY,CAAA,GAAO,GAAA,CAAI,UAAU,MAAA,EAAQ,UAAA,EAAY,KAAK,UAAU,CAAA;AAC3E,IAAA,MAAM,CAAC,OAAO,CAAA,GAAY,IAAI,OAAA,CAAQ,YAAA,EAAc,KAAK,UAAU,CAAA;AACnE,IAAA,MAAM,CAAC,MAAM,CAAA,GAAa,IAAI,MAAA,CAAO,YAAA,EAAc,KAAK,UAAU,CAAA;AAClE,IAAA,MAAM,CAAC,aAAa,CAAA,GAAM,IAAI,aAAA,CAAc,YAAA,EAAc,KAAK,UAAU,CAAA;AACzE,IAAA,MAAM,CAAC,eAAe,CAAA,GAAI,GAAA,CAAI,gBAAgB,MAAA,CAAO,cAAA,EAAgB,KAAK,UAAU,CAAA;AAEpF,IAAA,MAAM,EAAA,GAAK,MAAM,IAAA,CAAK,OAAA,CAAQ,QAC3B,mBAAA,CAAoB;AAAA,MACnB,UAAA,EAAgB,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA;AAAA,MACrC,WAAA,EAAgB,KAAA,CAAM,IAAA,CAAK,WAAW,CAAA;AAAA,MACtC,aAAgB,MAAA,CAAO,WAAA;AAAA,MACvB,gBAAgB,MAAA,CAAO,cAAA;AAAA,MACvB,cAAA,EAAgB,IAAWD,kBAAA,CAAA,EAAA,CAAG,MAAA,CAAO,cAAc;AAAA,KACpD,EACA,QAAA,CAAS;AAAA,MACR,OAAA;AAAA,MACA,KAAA;AAAA,MACA,QAA0B,IAAA,CAAK,SAAA;AAAA,MAC/B,QAAA,EAA0B,WAAA;AAAA,MAC1B,cAA0B,MAAA,CAAO,cAAA;AAAA,MACjC,MAAA;AAAA,MACA,SAAA,EAA0B,YAAA;AAAA,MAC1B,OAAA;AAAA,MACA,MAAA;AAAA,MACA,aAAA;AAAA,MACA,eAAA;AAAA,MACA,wBAAA,EAA0B,KAAK,UAAA,CAAW,iBAAA;AAAA,MAC1C,YAAA,EAA0BF,8BAAAA;AAAA,MAC1B,eAA0BF,qBAAAA,CAAc,SAAA;AAAA,MACxC,IAAA,EAA0BK;AAAA,KAC3B,EACA,WAAA,EAAY;AAEf,IAAA,OAAO,EAAE,EAAA,EAAI,WAAA,EAAa,YAAA,EAAc,UAAA,EAAW;AAAA,EACrD;AAAA,EAEA,MAAM,eAAA,CACJ,WAAA,EACA,QAAmB,IAAA,CAAK,YAAA,EACxB,QAAmB,KAAA,EACG;AACtB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,CACjB,eAAA,GACA,QAAA,CAAS;AAAA,MACR,KAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAU,IAAA,CAAK,SAAA;AAAA,MACf,QAAA,EAAU;AAAA,KACX,EACA,WAAA,EAAY;AAAA,EACjB;AAAA,EAEA,MAAM,YAAA,CACJ,MAAA,EACA,YAAuB,IAAA,CAAK,YAAA,EAC5B,QAAuB,SAAA,EACD;AACtB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,CACjB,YAAA,CAAa;AAAA,MACZ,QAAA,EAAW,OAAO,QAAA,IAAa,IAAA;AAAA,MAC/B,SAAA,EAAW,OAAO,SAAA,IAAa,IAAA;AAAA,MAC/B,QAAA,EAAW,OAAO,QAAA,IAAa,IAAA;AAAA,MAC/B,2BAAA,EAA6B,OAAO,2BAAA,IAA+B;AAAA,KACpE,EACA,QAAA,CAAS;AAAA,MACR,SAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAQ,IAAA,CAAK;AAAA,KACd,EACA,WAAA,EAAY;AAAA,EACjB;AAAA;AAAA,EAGA,MAAM,QAAA,CACJ,QAAA,EACA,KAAA,GAAmB,KAAK,YAAA,EACF;AACtB,IAAA,OAAO,KAAK,OAAA,CAAQ,OAAA,CACjB,QAAA,CAAS,QAAQ,EACjB,QAAA,CAAS;AAAA,MACR,KAAA;AAAA,MACA,QAAQ,IAAA,CAAK;AAAA,KACd,EACA,WAAA,EAAY;AAAA,EACjB;AAAA;AAAA,EAGA,MAAM,WAAA,CACJ,KAAA,GAAmB,IAAA,CAAK,YAAA,EACF;AACtB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,CACjB,WAAA,GACA,QAAA,CAAS;AAAA,MACR,KAAA;AAAA,MACA,QAAQ,IAAA,CAAK;AAAA,KACd,EACA,WAAA,EAAY;AAAA,EACjB;AAAA,EAEA,MAAM,cAAA,CACJ,OAAA,EACA,YAAuB,IAAA,CAAK,YAAA,EAC5B,QAAuB,SAAA,EACD;AACtB,IAAA,OAAO,KAAK,OAAA,CAAQ,OAAA,CACjB,cAAA,CAAe,OAAO,EACtB,QAAA,CAAS;AAAA,MACR,SAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAQ,IAAA,CAAK;AAAA,KACd,EACA,WAAA,EAAY;AAAA,EACjB;AAAA,EAEA,MAAM,mBAAA,CACJ,OAAA,EACA,YAAuB,IAAA,CAAK,YAAA,EAC5B,QAAuB,SAAA,EACD;AACtB,IAAA,OAAO,KAAK,OAAA,CAAQ,OAAA,CACjB,mBAAA,CAAoB,OAAO,EAC3B,QAAA,CAAS;AAAA,MACR,SAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAQ,IAAA,CAAK;AAAA,KACd,EACA,WAAA,EAAY;AAAA,EACjB;AAAA;AAAA,EAIA,MAAM,WAAA,GAAoD;AACxD,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAO,IAAA,CAAK,OAAA,CAAQ,QAAgB,oBAAA,CAAqB,KAAA,CAAM,KAAK,SAAS,CAAA;AACzF,MAAA,OAAO;AAAA,QACL,OAA0B,GAAA,CAAI,KAAA;AAAA,QAC9B,OAA0B,GAAA,CAAI,KAAA;AAAA,QAC9B,QAA0B,GAAA,CAAI,MAAA;AAAA,QAC9B,0BAA0B,GAAA,CAAI,wBAAA;AAAA,QAC9B,aAAA,EAA0B,GAAA,CAAI,aAAA,CAAc,QAAA,EAAS;AAAA,QACrD,aAAA,EAA0B,GAAA,CAAI,aAAA,CAAc,QAAA,EAAS;AAAA,QACrD,aAAA,EAA0B,GAAA,CAAI,aAAA,CAAc,QAAA,EAAS;AAAA,QACrD,WAA0B,GAAA,CAAI,SAAA;AAAA,QAC9B,cAA0B,GAAA,CAAI,YAAA;AAAA,QAC9B,UAA0B,GAAA,CAAI,QAAA;AAAA,QAC9B,MAA0B,GAAA,CAAI;AAAA,OAChC;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,WAAA,EAAkD;AACpE,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAO,IAAA,CAAK,QAAQ,OAAA,CAAgB,QAAA,CAAS,MAAM,WAAW,CAAA;AAC1E,MAAA,OAAO;AAAA,QACL,QAAgB,GAAA,CAAI,MAAA;AAAA,QACpB,UAAA,EAAgB,IAAI,UAAA,CAAW,GAAA,CAAI,UAAU,CAAA;AAAA,QAC7C,WAAA,EAAgB,IAAI,UAAA,CAAW,GAAA,CAAI,WAAW,CAAA;AAAA,QAC9C,cAAA,EAAgB,GAAA,CAAI,cAAA,CAAe,QAAA,EAAS;AAAA,QAC5C,cAAgB,GAAA,CAAI,YAAA;AAAA,QACpB,SAAgB,GAAA,CAAI,OAAA;AAAA,QACpB,SAAA,EAAgB,IAAI,SAAA,IAAa,IAAA;AAAA,QACjC,MAAA,EAAgB,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA;AAAA,QAC5C,SAAA,EAAgB,GAAA,CAAI,SAAA,CAAU,QAAA,EAAS;AAAA,QACvC,UAAA,EAAgB,GAAA,CAAI,UAAA,CAAW,QAAA,EAAS;AAAA,QACxC,UAAA,EAAgB,GAAA,CAAI,UAAA,CAAW,QAAA,EAAS;AAAA,QACxC,MAAgB,GAAA,CAAI;AAAA,OACtB;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,YAAY,UAAA,EAAmC;AAC7C,IAAA,OAAO,GAAA,CAAI,SAAS,IAAA,CAAK,SAAA,EAAW,YAAY,IAAA,CAAK,UAAU,EAAE,CAAC,CAAA;AAAA,EACpE;AAAA,EAEQ,aAAa,GAAA,EAA0B;AAC7C,IAAA,IAAI,GAAA,CAAI,YAAa,MAAA,EAAW,OAAA,SAAA;AAChC,IAAA,IAAI,GAAA,CAAI,aAAa,MAAA,EAAW,OAAA,UAAA;AAChC,IAAA,IAAI,GAAA,CAAI,aAAa,MAAA,EAAW,OAAA,UAAA;AAChC,IAAA,IAAI,GAAA,CAAI,aAAa,MAAA,EAAW,OAAA,UAAA;AAChC,IAAA,OAAA,SAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,qBAAA,CACJ,WAAA,EACA,KAAA,EACwD;AACxD,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW,OAAO,EAAE,GAAA,EAAK,IAAA,EAAM,IAAI,IAAA,EAAK;AAClD,IAAA,MAAM,CAAA,GAAI,MAAM,IAAA,CAAK,aAAA,CAAc,WAAW,CAAA;AAC9C,IAAA,IAAI,CAAC,CAAA,IAAK,CAAC,CAAA,CAAE,SAAA,SAAkB,EAAE,GAAA,EAAK,IAAA,EAAM,EAAA,EAAI,IAAA,EAAK;AACrD,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,kBAAA,CAAmB,CAAA,CAAE,WAAW,KAAK,CAAA;AAAA,EAC7D;AACF;AC1TO,IAAM,YAAN,MAAgB;AAAA,EAKrB,WAAA,CACE,OAAA,EACA,QAAA,EACA,UAAA,EACA;AACA,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,EACpB;AAAA,EAEA,IAAI,YAAA,GAA0B;AAC5B,IAAA,OAAO,IAAA,CAAK,SAAS,MAAA,CAAO,SAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,gBAAA,CACJ,UAAA,EACA,MAAA,EACA,cAAA,EACA,WAAA,EACA,cAAA,EACA,KAAA,GAAmB,IAAA,CAAK,YAAA,EACxB,OAAA,GAAqB,EAAC,EAC0E;AAChG,IAAA,MAAM,CAAC,YAAY,CAAA,GAAO,GAAA,CAAI,UAAU,MAAA,EAAQ,UAAA,EAAY,KAAK,UAAU,CAAA;AAC3E,IAAA,MAAM,CAAC,OAAO,CAAA,GAAY,IAAI,OAAA,CAAQ,YAAA,EAAc,KAAK,UAAU,CAAA;AACnE,IAAA,MAAM,CAAC,MAAM,CAAA,GAAa,IAAI,MAAA,CAAO,YAAA,EAAc,KAAK,UAAU,CAAA;AAClE,IAAA,MAAM,CAAC,aAAa,CAAA,GAAM,IAAI,aAAA,CAAc,YAAA,EAAc,KAAK,UAAU,CAAA;AACzE,IAAA,MAAM,CAAC,eAAe,CAAA,GAAI,IAAI,eAAA,CAAgB,cAAA,EAAgB,KAAK,UAAU,CAAA;AAE7E,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAC5B,gBAAA;AAAA,MACC,KAAA,CAAM,KAAK,UAAU,CAAA;AAAA,MACrB,WAAA;AAAA,MACA;AAAA,MAED,QAAA,CAAS;AAAA,MACR,MAAA;AAAA,MACA,SAAA,EAAgB,YAAA;AAAA,MAChB,OAAA;AAAA,MACA,MAAA;AAAA,MACA,aAAA;AAAA,MACA,cAAA;AAAA,MACA,eAAA;AAAA,MACA,KAAA;AAAA,MACA,YAAA,EAAgBH,8BAAAA;AAAA,MAChB,eAAgBF,qBAAAA,CAAc,SAAA;AAAA,MAC9B,IAAA,EAAgBK;AAAA,KACjB,EACA,OAAA,CAAQ,OAAO,EACf,GAAA,CAAI,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA;AAE9B,IAAA,OAAO,EAAE,SAAA,EAAW,GAAA,EAAK,YAAA,EAAc,SAAS,MAAA,EAAO;AAAA,EACzD;AAAA;AAAA,EAGA,MAAM,mBAAA,GAAyC;AAC7C,IAAA,MAAM,CAAC,SAAS,CAAA,GAAI,GAAA,CAAI,SAAA,CAAU,KAAK,UAAU,CAAA;AACjD,IAAA,MAAM,MAAM,MAAM,IAAA,CAAK,QAAQ,OAAA,CAC5B,mBAAA,GACA,QAAA,CAAS;AAAA,MACR,OAAe,IAAA,CAAK,YAAA;AAAA,MACpB,SAAA;AAAA,MACA,eAAeL,qBAAAA,CAAc;AAAA,KAC9B,EACA,GAAA,EAAI;AACP,IAAA,OAAO,EAAE,WAAW,GAAA,EAAI;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBAAgB,cAAA,EAA8C;AAClE,IAAA,MAAM,CAAC,SAAS,CAAA,GAAY,GAAA,CAAI,SAAA,CAAU,KAAK,UAAU,CAAA;AACzD,IAAA,MAAM,CAAC,eAAe,CAAA,GAAM,IAAI,eAAA,CAAgB,cAAA,EAAgB,KAAK,UAAU,CAAA;AAC/E,IAAA,MAAM,CAAC,iBAAiB,CAAA,GAAI,IAAI,UAAA,CAAW,cAAA,EAAgB,KAAK,UAAU,CAAA;AAC1E,IAAA,MAAM,MAAM,MAAM,IAAA,CAAK,QAAQ,OAAA,CAC5B,eAAA,GACA,QAAA,CAAS;AAAA,MACR,WAAmB,IAAA,CAAK,YAAA;AAAA,MACxB,OAAmB,IAAA,CAAK,YAAA;AAAA,MACxB,SAAA;AAAA,MACA,cAAA;AAAA,MACA,eAAA;AAAA,MACA,iBAAA;AAAA,MACA,eAAmBA,qBAAAA,CAAc,SAAA;AAAA,MACjC,YAAA,EAAmBM,yBAAA;AAAA,MACnB,IAAA,EAAmBD;AAAA,KACpB,EACA,GAAA,EAAI;AACP,IAAA,OAAO,EAAE,WAAW,GAAA,EAAI;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,YAAA,CACJ,SAAA,EACA,YAAA,EACA,IAAA,GAAkB,KAAK,YAAA,EACJ;AACnB,IAAA,MAAM,CAAC,QAAQ,CAAA,GAAI,GAAA,CAAI,SAAS,SAAA,EAAW,YAAA,EAAc,IAAA,EAAM,IAAA,CAAK,UAAU,CAAA;AAC9E,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,QAC5B,YAAA,CAAa,YAAY,EACzB,QAAA,CAAS;AAAA,MACR,IAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA,eAAeL,qBAAAA,CAAc;AAAA,KAC9B,EACA,GAAA,EAAI;AACP,IAAA,OAAO,EAAE,WAAW,GAAA,EAAI;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAA,CACJ,SAAA,EACA,cAAA,EACA,MAAA,EACA,IAAA,GAAqB,IAAA,CAAK,YAAA,EAC1B,KAAA,GAAqB,IAAA,CAAK,YAAA,EAC1B,OAAA,GAAqB,EAAC,EACH;AACnB,IAAA,MAAM,CAAC,eAAe,CAAA,GAAM,IAAI,eAAA,CAAgB,cAAA,EAAgB,KAAK,UAAU,CAAA;AAC/E,IAAA,MAAM,CAAC,iBAAiB,CAAA,GAAI,IAAI,UAAA,CAAW,cAAA,EAAgB,KAAK,UAAU,CAAA;AAC1E,IAAA,MAAM,CAAC,OAAO,CAAA,GAAc,IAAI,OAAA,CAAQ,SAAA,EAAW,KAAK,UAAU,CAAA;AAClE,IAAA,MAAM,CAAC,MAAM,CAAA,GAAe,IAAI,MAAA,CAAO,SAAA,EAAW,KAAK,UAAU,CAAA;AACjE,IAAA,MAAM,CAAC,aAAa,CAAA,GAAQ,IAAI,aAAA,CAAc,SAAA,EAAW,KAAK,UAAU,CAAA;AACxE,IAAA,MAAM,CAAC,WAAW,CAAA,GAAU,GAAA,CAAI,SAAS,SAAA,EAAW,CAAA,EAAG,IAAA,EAAM,IAAA,CAAK,UAAU,CAAA;AAC5E,IAAA,MAAM,CAAC,UAAU,CAAA,GAAW,GAAA,CAAI,SAAS,SAAA,EAAW,CAAA,EAAG,IAAA,EAAM,IAAA,CAAK,UAAU,CAAA;AAE5E,IAAA,MAAM,UAAA,GAAiBO,sCAAA,CAA8B,OAAA,EAAS,IAAA,EAAM,OAAOL,8BAAqB,CAAA;AAChG,IAAA,MAAM,SAAA,GAAiBK,sCAAA,CAA8B,MAAA,EAAS,IAAA,EAAM,OAAOL,8BAAqB,CAAA;AAChG,IAAA,MAAM,cAAA,GAAiBK,sCAAA,CAA8B,cAAA,EAAgB,IAAI,CAAA;AAEzE,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,QAC5B,aAAA,CAAc,MAAM,EACpB,QAAA,CAAS;AAAA,MACR,IAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA;AAAA,MACA,eAAA;AAAA,MACA,iBAAA;AAAA,MACA,cAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA;AAAA,MACA,aAAA;AAAA,MACA,YAAA,EAAwBD,yBAAA;AAAA,MACxB,gBAAA,EAAwBJ,8BAAAA;AAAA,MACxB,sBAAA,EAAwBM,oCAAA;AAAA,MACxB,eAAwBR,qBAAAA,CAAc;AAAA,KACvC,EACA,OAAA,CAAQ,OAAO,EACf,GAAA,CAAI,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA;AAC9B,IAAA,OAAO,EAAE,WAAW,GAAA,EAAI;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAA,CACJ,SAAA,EACA,cAAA,EACA,MAAA,EACA,IAAA,GAAqB,IAAA,CAAK,YAAA,EAC1B,KAAA,GAAqB,IAAA,CAAK,YAAA,EAC1B,OAAA,GAAqB,EAAC,EACH;AACnB,IAAA,MAAM,CAAC,eAAe,CAAA,GAAM,IAAI,eAAA,CAAgB,cAAA,EAAgB,KAAK,UAAU,CAAA;AAC/E,IAAA,MAAM,CAAC,iBAAiB,CAAA,GAAI,IAAI,UAAA,CAAW,cAAA,EAAgB,KAAK,UAAU,CAAA;AAC1E,IAAA,MAAM,CAAC,OAAO,CAAA,GAAc,IAAI,OAAA,CAAQ,SAAA,EAAW,KAAK,UAAU,CAAA;AAClE,IAAA,MAAM,CAAC,MAAM,CAAA,GAAe,IAAI,MAAA,CAAO,SAAA,EAAW,KAAK,UAAU,CAAA;AACjE,IAAA,MAAM,CAAC,WAAW,CAAA,GAAU,GAAA,CAAI,SAAS,SAAA,EAAW,CAAA,EAAG,IAAA,EAAM,IAAA,CAAK,UAAU,CAAA;AAC5E,IAAA,MAAM,CAAC,UAAU,CAAA,GAAW,GAAA,CAAI,SAAS,SAAA,EAAW,CAAA,EAAG,IAAA,EAAM,IAAA,CAAK,UAAU,CAAA;AAE5E,IAAA,MAAM,UAAA,GAAiBO,sCAAA,CAA8B,OAAA,EAAS,IAAA,EAAM,OAAOL,8BAAqB,CAAA;AAChG,IAAA,MAAM,SAAA,GAAiBK,sCAAA,CAA8B,MAAA,EAAS,IAAA,EAAM,OAAOL,8BAAqB,CAAA;AAChG,IAAA,MAAM,cAAA,GAAiBK,sCAAA,CAA8B,cAAA,EAAgB,IAAI,CAAA;AAEzE,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,QAC5B,aAAA,CAAc,MAAM,EACpB,QAAA,CAAS;AAAA,MACR,IAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA;AAAA,MACA,eAAA;AAAA,MACA,iBAAA;AAAA,MACA,cAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA;AAAA,MACA,YAAA,EAAkBD,yBAAA;AAAA,MAClB,gBAAA,EAAkBJ,8BAAAA;AAAA,MAClB,eAAkBF,qBAAAA,CAAc;AAAA,KACjC,EACA,OAAA,CAAQ,OAAO,EACf,GAAA,CAAI,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA;AAC9B,IAAA,OAAO,EAAE,WAAW,GAAA,EAAI;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,eAAA,CACJ,SAAA,EACA,cAAA,EACA,IAAA,GAAqB,IAAA,CAAK,YAAA,EAC1B,KAAA,GAAqB,IAAA,CAAK,YAAA,EAC1B,OAAA,GAAqB,EAAC,EACH;AACnB,IAAA,MAAM,CAAC,eAAe,CAAA,GAAM,IAAI,eAAA,CAAgB,cAAA,EAAgB,KAAK,UAAU,CAAA;AAC/E,IAAA,MAAM,CAAC,iBAAiB,CAAA,GAAI,IAAI,UAAA,CAAW,cAAA,EAAgB,KAAK,UAAU,CAAA;AAC1E,IAAA,MAAM,CAAC,OAAO,CAAA,GAAc,IAAI,OAAA,CAAQ,SAAA,EAAW,KAAK,UAAU,CAAA;AAClE,IAAA,MAAM,CAAC,MAAM,CAAA,GAAe,IAAI,MAAA,CAAO,SAAA,EAAW,KAAK,UAAU,CAAA;AACjE,IAAA,MAAM,CAAC,WAAW,CAAA,GAAU,GAAA,CAAI,SAAS,SAAA,EAAW,CAAA,EAAG,IAAA,EAAM,IAAA,CAAK,UAAU,CAAA;AAC5E,IAAA,MAAM,CAAC,UAAU,CAAA,GAAW,GAAA,CAAI,SAAS,SAAA,EAAW,CAAA,EAAG,IAAA,EAAM,IAAA,CAAK,UAAU,CAAA;AAE5E,IAAA,MAAM,UAAA,GAAiBO,sCAAA,CAA8B,OAAA,EAAS,IAAA,EAAM,OAAOL,8BAAqB,CAAA;AAChG,IAAA,MAAM,SAAA,GAAiBK,sCAAA,CAA8B,MAAA,EAAS,IAAA,EAAM,OAAOL,8BAAqB,CAAA;AAChG,IAAA,MAAM,cAAA,GAAiBK,sCAAA,CAA8B,cAAA,EAAgB,IAAI,CAAA;AAEzE,IAAA,MAAM,MAAM,MAAM,IAAA,CAAK,QAAQ,OAAA,CAC5B,eAAA,GACA,QAAA,CAAS;AAAA,MACR,IAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA;AAAA,MACA,eAAA;AAAA,MACA,iBAAA;AAAA,MACA,cAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA;AAAA,MACA,YAAA,EAAkBD,yBAAA;AAAA,MAClB,gBAAA,EAAkBJ,8BAAAA;AAAA,MAClB,eAAkBF,qBAAAA,CAAc;AAAA,KACjC,EACA,OAAA,CAAQ,OAAO,EACf,GAAA,CAAI,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA;AAC9B,IAAA,OAAO,EAAE,WAAW,GAAA,EAAI;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAA,CACJ,SAAA,EACA,gBAAA,EACmB;AACnB,IAAA,MAAM,MAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAC5B,cAAc,gBAAA,CAAiB,GAAA,CAAI,CAAC,CAAA,KAAM,IAAWS,kBAAA,CAAA,EAAA,CAAG,CAAC,CAAC,CAAC,EAC3D,QAAA,CAAS;AAAA,MACR,QAAW,IAAA,CAAK,YAAA;AAAA,MAChB;AAAA,KACD,EACA,GAAA,EAAI;AACP,IAAA,OAAO,EAAE,WAAW,GAAA,EAAI;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BA,MAAM,kBAAA,CACJ,SAAA,EACA,WAAA,EACA,QAAA,EACA,gBAAA,EACA,YAAA,EACA,MAAA,EACA,cAAA,EACA,UAAA,EACA,KAAA,EACA,aAAA,EACA,cACA,MAAA,EACiC;AACjC,IAAA,OAAO,KAAK,OAAA,CAAQ,OAAA,CACjB,iBAAiB,YAAA,EAAc,MAAM,EACrC,QAAA,CAAS;AAAA,MACR,KAAA;AAAA,MACA,aAAA;AAAA,MACA,SAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAA;AAAA,MACA,gBAAA;AAAA,MACA,YAAA;AAAA,MACA,MAAA;AAAA,MACA,cAAA;AAAA,MACA,UAAA;AAAA,MACA,gBAAA,EAAkBP,8BAAAA;AAAA,MAClB,eAAkBF,qBAAAA,CAAc;AAAA,KACjC,EACA,WAAA,EAAY;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,oBAAA,CACJ,SAAA,EACA,iBAAA,EACmB;AACnB,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,QAC5B,oBAAA,CAAqB,iBAAiB,EACtC,QAAA,CAAS;AAAA,MACR,QAAW,IAAA,CAAK,YAAA;AAAA,MAChB;AAAA,KACD,EACA,GAAA,EAAI;AACP,IAAA,OAAO,EAAE,WAAW,GAAA,EAAI;AAAA,EAC1B;AAAA;AAAA,EAIA,MAAM,cAAA,GAA4C;AAChD,IAAA,IAAI;AACF,MAAA,MAAM,CAAC,SAAS,CAAA,GAAI,GAAA,CAAI,SAAA,CAAU,KAAK,UAAU,CAAA;AACjD,MAAA,MAAM,MAAM,MAAO,IAAA,CAAK,QAAQ,OAAA,CAAgB,SAAA,CAAU,MAAM,SAAS,CAAA;AACzE,MAAA,OAAO;AAAA,QACL,OAAO,GAAA,CAAI,KAAA;AAAA,QACX,MAAO,GAAA,CAAI;AAAA,OACb;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,YAAA,EAAoD;AACvE,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAO,IAAA,CAAK,QAAQ,OAAA,CAAgB,SAAA,CAAU,MAAM,YAAY,CAAA;AAC5E,MAAA,OAAO;AAAA,QACL,QAAmB,GAAA,CAAI,MAAA;AAAA,QACvB,UAAA,EAAmB,IAAI,UAAA,CAAW,GAAA,CAAI,UAAU,CAAA;AAAA,QAChD,kBAAmB,GAAA,CAAI,gBAAA;AAAA,QACvB,kBAAmB,GAAA,CAAI,gBAAA;AAAA,QACvB,mBAAmB,GAAA,CAAI,iBAAA;AAAA,QACvB,iBAAmB,GAAA,CAAI,eAAA;AAAA,QACvB,gBAAmB,GAAA,CAAI,cAAA;AAAA,QACvB,iBAAmB,GAAA,CAAI,eAAA;AAAA,QACvB,SAAmB,GAAA,CAAI,OAAA;AAAA,QACvB,QAAmB,GAAA,CAAI,MAAA;AAAA,QACvB,aAAmB,GAAA,CAAI,WAAA;AAAA,QACvB,gBAAmB,GAAA,CAAI,cAAA;AAAA,QACvB,YAAmB,GAAA,CAAI,UAAA;AAAA,QACvB,UAAA,EAAmB,GAAA,CAAI,UAAA,EAAY,QAAA,EAAS,IAAK,CAAA;AAAA,QACjD,MAAmB,GAAA,CAAI;AAAA,OACzB;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,cAAA,EAA4D;AAC3E,IAAA,IAAI;AACF,MAAA,MAAM,CAAC,QAAQ,CAAA,GAAI,IAAI,eAAA,CAAgB,cAAA,EAAgB,KAAK,UAAU,CAAA;AACtE,MAAA,MAAM,MAAM,MAAO,IAAA,CAAK,QAAQ,OAAA,CAAgB,eAAA,CAAgB,MAAM,QAAQ,CAAA;AAC9E,MAAA,OAAO;AAAA,QACL,gBAAmB,GAAA,CAAI,cAAA;AAAA,QACvB,mBAAmB,GAAA,CAAI,iBAAA;AAAA,QACvB,aAAmB,GAAA,CAAI,WAAA;AAAA,QACvB,gBAAmB,GAAA,CAAI,cAAA;AAAA,QACvB,MAAmB,GAAA,CAAI,IAAA;AAAA,QACvB,WAAmB,GAAA,CAAI;AAAA,OACzB;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,aAAA,CACJ,SAAA,EACA,YAAA,EACA,KAAA,GAAmB,KAAK,YAAA,EACE;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,CAAC,GAAG,CAAA,GAAI,GAAA,CAAI,SAAS,SAAA,EAAW,YAAA,EAAc,KAAA,EAAO,IAAA,CAAK,UAAU,CAAA;AAC1E,MAAA,MAAM,MAAM,MAAO,IAAA,CAAK,QAAQ,OAAA,CAAgB,QAAA,CAAS,MAAM,GAAG,CAAA;AAClE,MAAA,OAAO;AAAA,QACL,OAAc,GAAA,CAAI,KAAA;AAAA,QAClB,WAAc,GAAA,CAAI,SAAA;AAAA,QAClB,cAAc,GAAA,CAAI,YAAA;AAAA,QAClB,SAAc,GAAA,CAAI,OAAA;AAAA,QAClB,MAAc,GAAA,CAAI;AAAA,OACpB;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,kBAAA,CACJ,SAAA,EACA,KAAA,GAAmB,KAAK,YAAA,EACgC;AACxD,IAAA,MAAM,CAAC,GAAA,EAAK,EAAE,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,MAClC,IAAA,CAAK,aAAA,CAAc,SAAA,EAAW,CAAA,EAAG,KAAK,CAAA;AAAA,MACtC,IAAA,CAAK,aAAA,CAAc,SAAA,EAAW,CAAA,EAAG,KAAK;AAAA,KACvC,CAAA;AACD,IAAA,OAAO,EAAE,KAAK,EAAA,EAAG;AAAA,EACnB;AAAA;AAAA,EAGA,MAAM,iBAAA,CACJ,SAAA,EACA,OAAA,EACA,KAAA,GAAmB,KAAK,YAAA,EACE;AAC1B,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,SAAA,EAAW,OAAA,EAAS,KAAK,CAAA;AAAA,EACrD;AAAA;AAAA,EAIA,WAAW,SAAA,EAAiC;AAC1C,IAAA,OAAO,IAAI,OAAA,CAAQ,SAAA,EAAW,IAAA,CAAK,UAAU,EAAE,CAAC,CAAA;AAAA,EAClD;AAAA,EAEA,UAAU,SAAA,EAAiC;AACzC,IAAA,OAAO,IAAI,MAAA,CAAO,SAAA,EAAW,IAAA,CAAK,UAAU,EAAE,CAAC,CAAA;AAAA,EACjD;AAAA,EAEA,iBAAiB,SAAA,EAAiC;AAChD,IAAA,OAAO,IAAI,aAAA,CAAc,SAAA,EAAW,IAAA,CAAK,UAAU,EAAE,CAAC,CAAA;AAAA,EACxD;AAAA,EAEA,mBAAmB,cAAA,EAAsC;AACvD,IAAA,OAAO,IAAI,eAAA,CAAgB,cAAA,EAAgB,IAAA,CAAK,UAAU,EAAE,CAAC,CAAA;AAAA,EAC/D;AACF;ACrdO,SAAS,sBAAsB,KAAA,EAA0B;AAC9D,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,GAAG,CAAA;AAE9B,EAAA,GAAA,CAAI,GAAA,CAAI,KAAA,CAAM,KAAA,CAAM,OAAA,IAAW,CAAC,CAAA;AAChC,EAAA,GAAA,CAAI,GAAA,CAAI,KAAA,CAAM,SAAA,CAAU,OAAA,IAAW,EAAE,CAAA;AACrC,EAAA,GAAA,CAAI,EAAE,IAAI,KAAA,CAAM,OAAA;AAChB,EAAA,GAAA,CAAI,EAAE,IAAI,KAAA,CAAM,IAAA;AAEhB,EAAA,GAAA,CAAI,GAAA,CAAI,MAAM,WAAA,CAAY,WAAA,CAAY,QAAQ,IAAA,EAAM,CAAC,GAAI,EAAE,CAAA;AAC3D,EAAA,GAAA,CAAI,GAAA,CAAI,MAAM,WAAA,CAAY,WAAA,CAAY,QAAQ,IAAA,EAAM,CAAC,GAAI,EAAE,CAAA;AAC3D,EAAA,GAAA,CAAI,GAAA,CAAI,MAAM,KAAA,CAAM,WAAA,CAAY,QAAQ,IAAA,EAAM,CAAC,GAAU,EAAE,CAAA;AAC3D,EAAA,GAAA,CAAI,GAAA,CAAI,MAAM,MAAA,CAAO,WAAA,CAAY,QAAQ,IAAA,EAAM,CAAC,GAAS,EAAE,CAAA;AAC3D,EAAA,GAAA,CAAI,GAAA,CAAI,MAAM,SAAA,CAAU,WAAA,CAAY,QAAQ,IAAA,EAAM,CAAC,GAAM,EAAE,CAAA;AAC3D,EAAA,GAAA,CAAI,GAAA,CAAI,MAAM,GAAA,CAAI,WAAA,CAAY,QAAQ,IAAA,EAAM,CAAC,GAAM,GAAG,CAAA;AACtD,EAAA,GAAA,CAAI,GAAA,CAAI,KAAA,CAAM,KAAA,CAAM,OAAA,IAAoC,GAAG,CAAA;AAC3D,EAAA,GAAA,CAAI,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,OAAA,IAAmC,GAAG,CAAA;AAE3D,EAAA,OAAO,GAAA;AACT;AAaA,eAAsB,SAAA,CACpB,OACA,MAAA,EACsB;AACtB,EAAA,MAAM,OAAA,GAAU,sBAAsB,KAAK,CAAA;AAC3C,EAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,OAAO,CAAA;AACtC,EAAA,IAAI,UAAU,MAAA,KAAW,EAAA,EAAI,MAAM,IAAI,MAAM,4BAA4B,CAAA;AACzE,EAAA,OAAO,EAAE,OAAO,SAAA,EAAU;AAC5B;AAmBO,SAAS,+BAA+B,MAAA,EAA+C;AAC5F,EAAA,MAAM,IAAI,MAAA,CAAO,MAAA;AACjB,EAAA,IAAI,CAAA,KAAM,CAAA,EAAG,MAAM,IAAI,MAAM,2BAA2B,CAAA;AAExD,EAAA,MAAM,QAAA,GAAY,GAAA;AAClB,EAAA,MAAM,QAAA,GAAY,EAAA;AAClB,EAAA,MAAM,OAAA,GAAY,EAAA;AAClB,EAAA,MAAM,MAAA,GAAY,IAAI,CAAA,GAAI,EAAA;AAC1B,EAAA,MAAM,OAAA,GAAY,MAAA;AAClB,EAAA,MAAM,MAAA,GAAY,UAAU,CAAA,GAAI,QAAA;AAChC,EAAA,MAAM,OAAA,GAAY,SAAU,CAAA,GAAI,OAAA;AAChC,EAAA,MAAM,SAAA,GAAY,UAAU,CAAA,GAAI,QAAA;AAEhC,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA;AACnC,EAAA,IAAA,CAAK,CAAC,CAAA,GAAI,CAAA;AACV,EAAA,IAAA,CAAK,CAAC,CAAA,GAAI,CAAA;AAEV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,MAAM,CAAA,GAAI,IAAI,CAAA,GAAI,EAAA;AAClB,IAAA,IAAA,CAAK,aAAA,CAAc,OAAA,GAAU,CAAA,GAAI,QAAA,EAAW,CAAC,CAAA;AAC7C,IAAA,IAAA,CAAK,aAAA,CAAc,KAAA,EAAyB,CAAA,GAAI,CAAC,CAAA;AACjD,IAAA,IAAA,CAAK,aAAA,CAAc,MAAA,GAAU,CAAA,GAAI,OAAA,EAAW,IAAI,CAAC,CAAA;AACjD,IAAA,IAAA,CAAK,aAAA,CAAc,KAAA,EAAyB,CAAA,GAAI,CAAC,CAAA;AACjD,IAAA,IAAA,CAAK,aAAA,CAAc,OAAA,GAAU,CAAA,GAAI,QAAA,EAAW,IAAI,CAAC,CAAA;AACjD,IAAA,IAAA,CAAK,aAAA,CAAc,QAAA,EAAyB,CAAA,GAAI,EAAE,CAAA;AAClD,IAAA,IAAA,CAAK,aAAA,CAAc,KAAA,EAAyB,CAAA,GAAI,EAAE,CAAA;AAElD,IAAA,IAAA,CAAK,IAAI,MAAA,CAAO,CAAC,EAAE,SAAA,EAAwC,OAAA,GAAU,IAAI,QAAQ,CAAA;AACjF,IAAA,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,CAAM,MAAM,OAAA,EAAQ,EAAoB,MAAA,GAAU,CAAA,GAAI,OAAO,CAAA;AAChF,IAAA,IAAA,CAAK,GAAA,CAAI,sBAAsB,MAAA,CAAO,CAAC,EAAE,KAAK,CAAA,EAAa,OAAA,GAAU,CAAA,GAAI,QAAQ,CAAA;AAAA,EACnF;AAEA,EAAA,OAAO,IAAIU,8BAAAA,CAAuB;AAAA,IAChC,MAAM,EAAC;AAAA,IACP,WAAWC,sBAAA,CAAe,SAAA;AAAA,IAC1B;AAAA,GACD,CAAA;AACH;AAMO,IAAM,SAAA,GAAYC;;;ACzGzB,IAAM,mBAAA,GAAsB,MAAA,CAAO,IAAA,CAAK,gBAAgB,CAAA;AAEjD,IAAM,aAAN,MAAiB;AAAA,EAKtB,WAAA,CACE,OAAA,EACA,QAAA,EACA,UAAA,EACA;AACA,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,EACpB;AAAA,EAEA,IAAI,YAAA,GAA0B;AAC5B,IAAA,OAAO,IAAA,CAAK,SAAS,MAAA,CAAO,SAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAc,YAAA,CACZ,YAAA,EACA,WAAA,EACA,iBAAA,EACiB;AACjB,IAAA,MAAM,EAAE,UAAA,EAAW,GAAI,IAAA,CAAK,QAAA;AAC5B,IAAA,MAAM,EAAE,SAAA,EAAW,oBAAA,EAAqB,GAAI,MAAM,WAAW,kBAAA,EAAmB;AAEhF,IAAA,MAAM,OAAA,GAAU,IAAIC,0BAAA,CAAmB;AAAA,MACrC,UAAiB,IAAA,CAAK,YAAA;AAAA,MACtB,eAAA,EAAiB,SAAA;AAAA,MACjB;AAAA,KACD,EAAE,kBAAA,CAAmB,WAAA,GAAc,CAAC,WAAW,CAAA,GAAI,EAAE,CAAA;AACtD,IAAA,MAAM,GAAA,GAAM,IAAIC,4BAAA,CAAqB,OAAO,CAAA;AAC5C,IAAA,MAAM,OAAA,GAA0B,CAAE,IAAA,CAAK,QAAA,CAAS,OAAe,KAAqB,CAAA;AACpF,IAAA,IACE,qBACA,CAAC,iBAAA,CAAkB,UAAU,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA,EACrD;AACA,MAAA,OAAA,CAAQ,IAAA,CAAM,kBAA0B,KAAqB,CAAA;AAAA,IAC/D;AACA,IAAA,GAAA,CAAI,KAAK,OAAO,CAAA;AAChB,IAAA,MAAM,MAAM,MAAM,UAAA,CAAW,kBAAA,CAAmB,GAAA,CAAI,WAAU,EAAG;AAAA,MAC/D,aAAA,EAAe;AAAA,KAChB,CAAA;AACD,IAAA,MAAM,UAAA,CAAW,kBAAA;AAAA,MACf,EAAE,SAAA,EAAW,GAAA,EAAK,SAAA,EAAW,oBAAA,EAAqB;AAAA,MAClD;AAAA,KACF;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA,EAGA,kBAAkB,OAAA,EAA+B;AAC/C,IAAA,OAAOhB,iBAAAA,CAAU,sBAAA;AAAA,MACf,CAAC,mBAAA,EAAqB,OAAA,CAAQ,OAAA,EAAS,CAAA;AAAA,MACvC,KAAK,UAAA,CAAW;AAAA,MAChB,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,SAAA,GAAuB;AACrB,IAAA,OAAO,GAAA,CAAI,UAAA,CAAW,IAAA,CAAK,UAAU,EAAE,CAAC,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CACJ,SAAA,EACA,YAAA,EACA,UAAA,EACmB;AACnB,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAC5B,cAAA;AAAA,MACC,SAAA;AAAA,MACA,YAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAK,UAAA,CAAW;AAAA,MAEjB,QAAA,CAAS;AAAA,MACR,OAAe,IAAA,CAAK,YAAA;AAAA,MACpB,UAAA,EAAe,KAAK,SAAA,EAAU;AAAA,MAC9B,eAAeE,qBAAAA,CAAc;AAAA,KAC9B,EACA,GAAA,EAAI;AACP,IAAA,OAAO,EAAE,WAAW,GAAA,EAAI;AAAA,EAC1B;AAAA;AAAA,EAGA,MAAM,YAAY,QAAA,EAAwC;AACxD,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,QAC5B,WAAA,CAAY,QAAQ,EACpB,QAAA,CAAS;AAAA,MACR,OAAY,IAAA,CAAK,YAAA;AAAA,MACjB,UAAA,EAAY,KAAK,SAAA;AAAU,KAC5B,EACA,GAAA,EAAI;AACP,IAAA,OAAO,EAAE,WAAW,GAAA,EAAI;AAAA,EAC1B;AAAA;AAAA,EAGA,MAAM,eAAe,QAAA,EAAwC;AAC3D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,QAC5B,cAAA,CAAe,QAAQ,EACvB,QAAA,CAAS;AAAA,MACR,OAAY,IAAA,CAAK,YAAA;AAAA,MACjB,UAAA,EAAY,KAAK,SAAA;AAAU,KAC5B,EACA,GAAA,EAAI;AACP,IAAA,OAAO,EAAE,WAAW,GAAA,EAAI;AAAA,EAC1B;AAAA;AAAA,EAGA,MAAM,UAAU,MAAA,EAAoC;AAClD,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,QAC5B,SAAA,CAAU,MAAM,EAChB,QAAA,CAAS;AAAA,MACR,OAAY,IAAA,CAAK,YAAA;AAAA,MACjB,UAAA,EAAY,KAAK,SAAA;AAAU,KAC5B,EACA,GAAA,EAAI;AACP,IAAA,OAAO,EAAE,WAAW,GAAA,EAAI;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAY,KAAA,EAAqC;AACrD,IAAA,MAAM,QAAQ,IAAA,CAAK,YAAA;AACnB,IAAA,MAAM,CAAC,WAAW,CAAA,GAAI,GAAA,CAAI,YAAY,KAAA,EAAO,KAAA,EAAO,KAAK,UAAU,CAAA;AACnE,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,QAC5B,WAAA,CAAY,KAAK,EACjB,QAAA,CAAS;AAAA,MACR,MAAA,EAAc,KAAA;AAAA,MACd,UAAA,EAAc,KAAK,SAAA,EAAU;AAAA,MAC7B,KAAA;AAAA,MACA,WAAA;AAAA,MACA,eAAeA,qBAAAA,CAAc;AAAA,KAC9B,EACA,GAAA,EAAI;AACP,IAAA,OAAO,EAAE,WAAW,GAAA,EAAI;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,CACJ,WAAA,EACA,QAAA,EACA,YAAA,EACA,iBACA,aAAA,EACmB;AACnB,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAC5B,cAAA,CAAe,QAAA,EAAU,YAAA,EAAc,eAAA,EAAiB,aAAa,CAAA,CACrE,QAAA,CAAS;AAAA,MACR,kBAAkB,IAAA,CAAK,YAAA;AAAA,MACvB,WAAA;AAAA,MACA,UAAA,EAAkB,KAAK,SAAA;AAAU,KAClC,EACA,GAAA,EAAI;AACP,IAAA,OAAO,EAAE,WAAW,GAAA,EAAI;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAc,kBAAA,CACZ,SAAA,EACA,cACA,cAAA,EACA,YAAA,EACA,mBACA,WAAA,EACmB;AACnB,IAAA,MAAM,SAAA,GAAY,UAAU,KAAA,CAAM,SAAA;AAClC,IAAA,MAAM,OAAA,GAAY,UAAU,KAAA,CAAM,OAAA;AAElC,IAAA,MAAM,CAAC,WAAW,CAAA,GAAI,OAAA,KAAY,IAC9B,GAAA,CAAI,OAAA,CAAQ,SAAA,EAAW,IAAA,CAAK,UAAU,CAAA,GACtC,GAAA,CAAI,MAAA,CAAO,SAAA,EAAW,KAAK,UAAU,CAAA;AAEzC,IAAA,MAAM,KAAA,GAAQ,UAAU,KAAA,CAAM,KAAA;AAC9B,IAAA,MAAM,eAAA,GAAqBO,sCAAAA,CAA8B,cAAA,EAAgB,KAAK,CAAA;AAC9E,IAAA,MAAM,iBAAA,GAAqBA,sCAAAA,CAA8B,WAAA,EAAa,KAAA,EAAO,OAAOL,8BAAqB,CAAA;AACzG,IAAA,MAAM,CAAC,aAAa,CAAA,GAAO,GAAA,CAAI,SAAS,SAAA,EAAW,OAAA,EAAS,KAAA,EAAO,IAAA,CAAK,UAAU,CAAA;AAClF,IAAA,MAAM,CAAC,cAAc,CAAA,GAAM,GAAA,CAAI,WAAA,CAAY,OAAO,SAAA,CAAU,KAAA,CAAM,KAAA,EAAO,IAAA,CAAK,UAAU,CAAA;AAExF,IAAA,MAAM,CAAC,oBAAoB,CAAA,GAAI,IAAI,oBAAA,CAAqB,WAAA,EAAa,KAAK,UAAU,CAAA;AACpF,IAAA,MAAM,CAAC,UAAU,CAAA,GAAc,GAAA,CAAI,UAAA,CAAW,KAAK,UAAU,CAAA;AAC7D,IAAA,MAAM,YAAA,GAAe;AAAA,MACnB,EAAE,MAAA,EAAQ,oBAAA,EAAsB,QAAA,EAAU,KAAA,EAAO,YAAY,KAAA,EAAM;AAAA,MACnE,EAAE,MAAA,EAAQ,UAAA,EAAsB,QAAA,EAAU,KAAA,EAAO,YAAY,KAAA,EAAM;AAAA,MACnE,EAAE,QAAQ,IAAA,CAAK,UAAA,CAAW,MAAM,QAAA,EAAU,KAAA,EAAO,YAAY,KAAA;AAAM,KACrE;AAEA,IAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,OAAA,CAAQ,CAAA,CAAA,KAAK;AAC9C,MAAA,MAAM,MAAA,GAAsB,EAAE,KAAA,CAAM,KAAA;AACpC,MAAA,MAAM,kBAAA,GAAsBK,sCAAAA,CAA8B,WAAA,EAAa,MAAA,EAAQ,OAAOL,8BAAqB,CAAA;AAC3G,MAAA,MAAM,CAAC,cAAc,CAAA,GAAO,GAAA,CAAI,SAAS,SAAA,EAAW,OAAA,EAAS,MAAA,EAAQ,IAAA,CAAK,UAAU,CAAA;AACpF,MAAA,MAAM,gBAAA,GAAsBK,sCAAAA,CAA8B,cAAA,EAAgB,MAAM,CAAA;AAChF,MAAA,MAAM,CAAC,eAAe,CAAA,GAAM,GAAA,CAAI,WAAA,CAAY,QAAQ,CAAA,CAAE,KAAA,CAAM,KAAA,EAAO,IAAA,CAAK,UAAU,CAAA;AAClF,MAAA,OAAO;AAAA,QACL,EAAE,MAAA,EAAQ,MAAA,EAAkB,QAAA,EAAU,KAAA,EAAO,YAAY,KAAA,EAAM;AAAA,QAC/D,EAAE,MAAA,EAAQ,kBAAA,EAAoB,QAAA,EAAU,KAAA,EAAO,YAAY,IAAA,EAAK;AAAA,QAChE,EAAE,MAAA,EAAQ,cAAA,EAAkB,QAAA,EAAU,KAAA,EAAO,YAAY,IAAA,EAAK;AAAA,QAC9D,EAAE,MAAA,EAAQ,gBAAA,EAAkB,QAAA,EAAU,KAAA,EAAO,YAAY,IAAA,EAAK;AAAA,QAC9D,EAAE,MAAA,EAAQ,eAAA,EAAkB,QAAA,EAAU,KAAA,EAAO,YAAY,IAAA;AAAK,OAChE;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAM,cAAiB,iBAAA,CAAkB,SAAA;AACzC,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,iBAAA,CAAkB,WAAW,CAAA;AACzD,IAAA,MAAM,cAAiB,YAAA,CAAa,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,MAAM,KAAK,CAAA;AAE1D,IAAA,MAAM,UAAA,GAAa;AAAA,MACjB,8BAAA,CAA+B,CAAC,SAAA,EAAW,GAAG,YAAY,CAAC;AAAA,KAC7D;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAChC,kBAAA,CAAmB,SAAA,CAAU,KAAA,CAAM,KAAA,EAAO,WAAW,CAAA,CACrD,QAAA,CAAS;AAAA,MACR,WAAA;AAAA,MACA,OAA0B,IAAA,CAAK,YAAA;AAAA,MAC/B,cAAA;AAAA,MACA,UAAA,EAA0B,KAAK,SAAA,EAAU;AAAA,MACzC,QAAA,EAA0B,SAAA;AAAA,MAC1B,SAAA;AAAA,MACA,KAAA;AAAA,MACA,eAAA;AAAA,MACA,iBAAA;AAAA,MACA,aAAA;AAAA,MACA,cAAA;AAAA,MACA,WAAA;AAAA,MACA,YAAA;AAAA,MACA,wBAAA,EAA0B,KAAK,UAAA,CAAW,iBAAA;AAAA,MAC1C,YAAA,EAA0BD,yBAAAA;AAAA,MAC1B,gBAAA,EAA0BJ,8BAAAA;AAAA,MAC1B,eAA0BF,qBAAAA,CAAc;AAAA,KACzC,CAAA,CACA,iBAAA,CAAkB,CAAC,GAAG,cAAc,GAAG,aAAa,CAAC,CAAA,CACrD,WAAA,EAAY;AAEf,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,YAAA;AAAA,MACrB,CAAC,GAAG,UAAA,EAAY,OAAO,CAAA;AAAA,MACvB,WAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,OAAO,EAAE,WAAW,GAAA,EAAI;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAc,eAAA,CACZ,SAAA,EACA,YAAA,EACA,cAAA,EACA,mBACA,WAAA,EACmB;AACnB,IAAA,MAAM,SAAA,GAAY,UAAU,KAAA,CAAM,SAAA;AAElC,IAAA,MAAM,CAAC,OAAO,CAAA,GAAc,IAAI,OAAA,CAAQ,SAAA,EAAW,KAAK,UAAU,CAAA;AAClE,IAAA,MAAM,CAAC,MAAM,CAAA,GAAe,IAAI,MAAA,CAAO,SAAA,EAAW,KAAK,UAAU,CAAA;AACjE,IAAA,MAAM,CAAC,aAAa,CAAA,GAAQ,IAAI,aAAA,CAAc,SAAA,EAAW,KAAK,UAAU,CAAA;AACxE,IAAA,MAAM,CAAC,eAAe,CAAA,GAAM,IAAI,eAAA,CAAgB,cAAA,EAAgB,KAAK,UAAU,CAAA;AAC/E,IAAA,MAAM,CAAC,iBAAiB,CAAA,GAAI,IAAI,UAAA,CAAW,cAAA,EAAgB,KAAK,UAAU,CAAA;AAC1E,IAAA,MAAM,CAAC,aAAa,CAAA,GAAQ,GAAA,CAAI,UAAA,CAAW,KAAK,UAAU,CAAA;AAE1D,IAAA,MAAM,QAAA,GAAW,UAAU,KAAA,CAAM,KAAA;AACjC,IAAA,MAAM,kBAAA,GAAuBO,sCAAAA,CAA8B,cAAA,EAAgB,QAAQ,CAAA;AACnF,IAAA,MAAM,oBAAA,GAAuBA,sCAAAA,CAA8B,OAAA,EAAS,QAAA,EAAU,OAAOL,8BAAqB,CAAA;AAC1G,IAAA,MAAM,CAAC,gBAAgB,CAAA,GAAM,GAAA,CAAI,SAAS,SAAA,EAAW,CAAA,EAAG,QAAA,EAAU,IAAA,CAAK,UAAU,CAAA;AACjF,IAAA,MAAM,CAAC,cAAc,CAAA,GAAQ,GAAA,CAAI,WAAA,CAAY,UAAU,SAAA,CAAU,KAAA,CAAM,KAAA,EAAO,IAAA,CAAK,UAAU,CAAA;AAE7F,IAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,OAAA,CAAQ,CAAA,CAAA,KAAK;AAC9C,MAAA,MAAM,KAAA,GAAqB,EAAE,KAAA,CAAM,KAAA;AACnC,MAAA,MAAM,YAAA,GAAqBK,sCAAAA,CAA8B,cAAA,EAAgB,KAAK,CAAA;AAC9E,MAAA,MAAM,UAAA,GAAqBA,sCAAAA,CAA8B,MAAA,EAAQ,KAAA,EAAO,OAAOL,8BAAqB,CAAA;AACpG,MAAA,MAAM,CAAC,eAAe,CAAA,GAAK,GAAA,CAAI,SAAS,SAAA,EAAW,CAAA,EAAG,KAAA,EAAO,IAAA,CAAK,UAAU,CAAA;AAC5E,MAAA,MAAM,CAAC,gBAAgB,CAAA,GAAI,GAAA,CAAI,WAAA,CAAY,OAAO,CAAA,CAAE,KAAA,CAAM,KAAA,EAAO,IAAA,CAAK,UAAU,CAAA;AAChF,MAAA,OAAO;AAAA,QACL,EAAE,MAAA,EAAQ,KAAA,EAAiB,QAAA,EAAU,KAAA,EAAO,YAAY,KAAA,EAAM;AAAA,QAC9D,EAAE,MAAA,EAAQ,YAAA,EAAiB,QAAA,EAAU,KAAA,EAAO,YAAY,IAAA,EAAK;AAAA,QAC7D,EAAE,MAAA,EAAQ,UAAA,EAAiB,QAAA,EAAU,KAAA,EAAO,YAAY,IAAA,EAAK;AAAA,QAC7D,EAAE,MAAA,EAAQ,eAAA,EAAiB,QAAA,EAAU,KAAA,EAAO,YAAY,IAAA,EAAK;AAAA,QAC7D,EAAE,MAAA,EAAQ,gBAAA,EAAiB,QAAA,EAAU,KAAA,EAAO,YAAY,IAAA;AAAK,OAC/D;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAM,cAAiB,iBAAA,CAAkB,SAAA;AACzC,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,iBAAA,CAAkB,WAAW,CAAA;AACzD,IAAA,MAAM,cAAiB,YAAA,CAAa,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,MAAM,KAAK,CAAA;AAE1D,IAAA,MAAM,UAAA,GAAa;AAAA,MACjB,8BAAA,CAA+B,CAAC,SAAA,EAAW,GAAG,YAAY,CAAC;AAAA,KAC7D;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAChC,eAAA,CAAgB,SAAA,CAAU,KAAA,CAAM,KAAA,EAAO,WAAW,CAAA,CAClD,QAAA,CAAS;AAAA,MACR,WAAA;AAAA,MACA,OAA0B,IAAA,CAAK,YAAA;AAAA,MAC/B,cAAA;AAAA,MACA,UAAA,EAA0B,KAAK,SAAA,EAAU;AAAA,MACzC,QAAA,EAA0B,SAAA;AAAA,MAC1B,SAAA;AAAA,MACA,QAAA;AAAA,MACA,kBAAA;AAAA,MACA,oBAAA;AAAA,MACA,gBAAA;AAAA,MACA,cAAA;AAAA,MACA,eAAA;AAAA,MACA,iBAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA,MACA,wBAAA,EAA0B,KAAK,UAAA,CAAW,iBAAA;AAAA,MAC1C,sBAAA,EAA0BI,yBAAAA;AAAA,MAC1B,gBAAA,EAA0BJ,8BAAAA;AAAA,MAC1B,eAA0BF,qBAAAA,CAAc;AAAA,KACzC,CAAA,CACA,iBAAA,CAAkB,aAAa,EAC/B,WAAA,EAAY;AAEf,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,YAAA;AAAA,MACrB,CAAC,GAAG,UAAA,EAAY,OAAO,CAAA;AAAA,MACvB,WAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,OAAO,EAAE,WAAW,GAAA,EAAI;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAc,gBAAA,CACZ,SAAA,EACA,YAAA,EACA,cAAA,EACA,mBACA,WAAA,EACmB;AACnB,IAAA,MAAM,SAAA,GAAY,UAAU,KAAA,CAAM,SAAA;AAElC,IAAA,MAAM,CAAC,OAAO,CAAA,GAAc,IAAI,OAAA,CAAQ,SAAA,EAAW,KAAK,UAAU,CAAA;AAClE,IAAA,MAAM,CAAC,MAAM,CAAA,GAAe,IAAI,MAAA,CAAO,SAAA,EAAW,KAAK,UAAU,CAAA;AACjE,IAAA,MAAM,CAAC,eAAe,CAAA,GAAM,IAAI,eAAA,CAAgB,cAAA,EAAgB,KAAK,UAAU,CAAA;AAC/E,IAAA,MAAM,CAAC,iBAAiB,CAAA,GAAI,IAAI,UAAA,CAAW,cAAA,EAAgB,KAAK,UAAU,CAAA;AAC1E,IAAA,MAAM,CAAC,aAAa,CAAA,GAAQ,GAAA,CAAI,UAAA,CAAW,KAAK,UAAU,CAAA;AAE1D,IAAA,MAAM,SAAA,GAAY,UAAU,KAAA,CAAM,KAAA;AAClC,IAAA,MAAM,qBAAA,GAAwBO,sCAAAA,CAA8B,OAAA,EAAS,SAAA,EAAW,OAAOL,8BAAqB,CAAA;AAC5G,IAAA,MAAM,CAAC,iBAAiB,CAAA,GAAM,GAAA,CAAI,SAAS,SAAA,EAAW,CAAA,EAAG,SAAA,EAAW,IAAA,CAAK,UAAU,CAAA;AACnF,IAAA,MAAM,mBAAA,GAAwBK,sCAAAA,CAA8B,cAAA,EAAgB,SAAS,CAAA;AACrF,IAAA,MAAM,CAAC,cAAc,CAAA,GAAS,GAAA,CAAI,WAAA,CAAY,WAAW,SAAA,CAAU,KAAA,CAAM,KAAA,EAAO,IAAA,CAAK,UAAU,CAAA;AAE/F,IAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,OAAA,CAAQ,CAAA,CAAA,KAAK;AAC9C,MAAA,MAAM,KAAA,GAAqB,EAAE,KAAA,CAAM,KAAA;AACnC,MAAA,MAAM,UAAA,GAAqBA,sCAAAA,CAA8B,MAAA,EAAQ,KAAA,EAAO,OAAOL,8BAAqB,CAAA;AACpG,MAAA,MAAM,CAAC,eAAe,CAAA,GAAK,GAAA,CAAI,SAAS,SAAA,EAAW,CAAA,EAAG,KAAA,EAAO,IAAA,CAAK,UAAU,CAAA;AAC5E,MAAA,MAAM,YAAA,GAAqBK,sCAAAA,CAA8B,cAAA,EAAgB,KAAK,CAAA;AAC9E,MAAA,MAAM,CAAC,gBAAgB,CAAA,GAAI,GAAA,CAAI,WAAA,CAAY,OAAO,CAAA,CAAE,KAAA,CAAM,KAAA,EAAO,IAAA,CAAK,UAAU,CAAA;AAChF,MAAA,OAAO;AAAA,QACL,EAAE,MAAA,EAAQ,KAAA,EAAiB,QAAA,EAAU,KAAA,EAAO,YAAY,KAAA,EAAM;AAAA,QAC9D,EAAE,MAAA,EAAQ,UAAA,EAAiB,QAAA,EAAU,KAAA,EAAO,YAAY,IAAA,EAAK;AAAA,QAC7D,EAAE,MAAA,EAAQ,eAAA,EAAiB,QAAA,EAAU,KAAA,EAAO,YAAY,IAAA,EAAK;AAAA,QAC7D,EAAE,MAAA,EAAQ,YAAA,EAAiB,QAAA,EAAU,KAAA,EAAO,YAAY,IAAA,EAAK;AAAA,QAC7D,EAAE,MAAA,EAAQ,gBAAA,EAAiB,QAAA,EAAU,KAAA,EAAO,YAAY,IAAA;AAAK,OAC/D;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAM,cAAiB,iBAAA,CAAkB,SAAA;AACzC,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,iBAAA,CAAkB,WAAW,CAAA;AACzD,IAAA,MAAM,cAAiB,YAAA,CAAa,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,MAAM,KAAK,CAAA;AAE1D,IAAA,MAAM,UAAA,GAAa;AAAA,MACjB,8BAAA,CAA+B,CAAC,SAAA,EAAW,GAAG,YAAY,CAAC;AAAA,KAC7D;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAChC,gBAAA,CAAiB,SAAA,CAAU,KAAA,CAAM,KAAA,EAAO,WAAW,CAAA,CACnD,QAAA,CAAS;AAAA,MACR,WAAA;AAAA,MACA,OAA0B,IAAA,CAAK,YAAA;AAAA,MAC/B,cAAA;AAAA,MACA,UAAA,EAA0B,KAAK,SAAA,EAAU;AAAA,MACzC,QAAA,EAA0B,SAAA;AAAA,MAC1B,SAAA;AAAA,MACA,SAAA;AAAA,MACA,qBAAA;AAAA,MACA,iBAAA;AAAA,MACA,mBAAA;AAAA,MACA,cAAA;AAAA,MACA,eAAA;AAAA,MACA,iBAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,aAAA;AAAA,MACA,wBAAA,EAA0B,KAAK,UAAA,CAAW,iBAAA;AAAA,MAC1C,sBAAA,EAA0BD,yBAAAA;AAAA,MAC1B,gBAAA,EAA0BJ,8BAAAA;AAAA,MAC1B,eAA0BF,qBAAAA,CAAc;AAAA,KACzC,CAAA,CACA,iBAAA,CAAkB,aAAa,EAC/B,WAAA,EAAY;AAEf,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,YAAA;AAAA,MACrB,CAAC,GAAG,UAAA,EAAY,OAAO,CAAA;AAAA,MACvB,WAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,OAAO,EAAE,WAAW,GAAA,EAAI;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,WAAA,CACJ,KAAA,EACA,QACA,cAAA,EACA,YAAA,EACA,mBACA,WAAA,EACmB;AACnB,IAAA,IAAI,OAAO,MAAA,KAAW,CAAA,EAAG,MAAM,IAAI,kBAAkB,2BAA2B,CAAA;AAChF,IAAA,MAAM,IAAI,KAAA,CAAM,KAAA;AAChB,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA;AACrB,IAAA,MAAM,QAAA,GAAY,CAAA;AAClB,IAAA,MAAM,SAAA,GAAY,CAAA;AAElB,IAAA,IAAI,CAAA,CAAE,OAAA,KAAY,EAAA,CAAG,OAAA,EAAS;AAE5B,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,QAAA,IAAY,MAAA,CAAO,KAAA,CAAM,OAAK,CAAA,CAAE,KAAA,CAAM,IAAA,KAAS,SAAS,CAAA,EAAG;AACxE,QAAA,OAAO,KAAK,kBAAA,CAAmB,KAAA,EAAO,QAAQ,cAAA,EAAgB,YAAA,EAAc,mBAAmB,WAAW,CAAA;AAAA,MAC5G;AAEA,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,SAAA,IAAa,MAAA,CAAO,KAAA,CAAM,OAAK,CAAA,CAAE,KAAA,CAAM,IAAA,KAAS,QAAQ,CAAA,EAAG;AAExE,QAAA,MAAM,IAAI,kBAAkB,mDAAmD,CAAA;AAAA,MACjF;AACA,MAAA,MAAM,IAAI,kBAAkB,+DAA+D,CAAA;AAAA,IAC7F;AAGA,IAAA,MAAM,MAAA,GAAU,CAAA,CAAE,IAAA,KAAS,QAAA,IAAa,MAAA,CAAO,MAAM,CAAA,CAAA,KAAK,CAAA,CAAE,KAAA,CAAM,IAAA,KAAS,QAAQ,CAAA;AACnF,IAAA,MAAM,OAAA,GAAU,CAAA,CAAE,IAAA,KAAS,SAAA,IAAa,MAAA,CAAO,MAAM,CAAA,CAAA,KAAK,CAAA,CAAE,KAAA,CAAM,IAAA,KAAS,SAAS,CAAA;AAEpF,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,OAAA,EAAS;AACvB,MAAA,MAAM,IAAI,kBAAkB,oEAAoE,CAAA;AAAA,IAClG;AAGA,IAAA,IAAI,CAAA,CAAE,YAAY,CAAA,EAAG;AACnB,MAAA,MAAM,IAAI,kBAAkB,oDAAoD,CAAA;AAAA,IAClF;AACA,IAAA,IAAI,CAAC,OAAO,KAAA,CAAM,CAAA,CAAA,KAAK,EAAE,KAAA,CAAM,OAAA,KAAY,CAAC,CAAA,EAAG;AAC7C,MAAA,MAAM,IAAI,kBAAkB,wDAAwD,CAAA;AAAA,IACtF;AAEA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAO,KAAK,eAAA,CAAgB,KAAA,EAAO,MAAA,EAAQ,cAAA,EAAgB,mBAAmB,WAAW,CAAA;AAAA,IAC3F;AACA,IAAA,OAAO,KAAK,gBAAA,CAAiB,KAAA,EAAO,MAAA,EAAQ,cAAA,EAAgB,mBAAmB,WAAW,CAAA;AAAA,EAC5F;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,OAAA,EAAuC;AAC1D,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,iBAAA,CAAkB,OAAO,CAAA;AACrD,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,QAC5B,kBAAA,CAAmB,OAAO,EAC1B,QAAA,CAAS;AAAA,MACR,OAAgB,IAAA,CAAK,YAAA;AAAA,MACrB,OAAgB,IAAA,CAAK,YAAA;AAAA,MACrB,UAAA,EAAgB,KAAK,SAAA,EAAU;AAAA,MAC/B,cAAA;AAAA,MACA,eAAgBA,qBAAAA,CAAc;AAAA,KAC/B,EACA,GAAA,EAAI;AACP,IAAA,OAAO,EAAE,WAAW,GAAA,EAAI;AAAA,EAC1B;AAAA;AAAA,EAGA,MAAM,oBAAoB,SAAA,EAA2C;AACnE,IAAA,IAAI,UAAU,MAAA,KAAW,CAAA,EAAG,MAAM,IAAI,kBAAkB,6BAA6B,CAAA;AACrF,IAAA,MAAM,iBAAA,GAAoB,SAAA,CAAU,GAAA,CAAI,CAAA,IAAA,MAAS;AAAA,MAC/C,MAAA,EAAY,IAAA,CAAK,iBAAA,CAAkB,IAAI,CAAA;AAAA,MACvC,QAAA,EAAY,KAAA;AAAA,MACZ,UAAA,EAAY;AAAA,KACd,CAAE,CAAA;AACF,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,QAC5B,uBAAA,CAAwB,SAAS,EACjC,QAAA,CAAS;AAAA,MACR,OAAe,IAAA,CAAK,YAAA;AAAA,MACpB,OAAe,IAAA,CAAK,YAAA;AAAA,MACpB,UAAA,EAAe,KAAK,SAAA,EAAU;AAAA,MAC9B,eAAeA,qBAAAA,CAAc;AAAA,KAC9B,CAAA,CACA,iBAAA,CAAkB,iBAAiB,EACnC,GAAA,EAAI;AACP,IAAA,OAAO,EAAE,WAAW,GAAA,EAAI;AAAA,EAC1B;AAAA;AAAA,EAGA,MAAM,mBAAA,CAAoB,OAAA,EAAoB,YAAA,EAA6C;AACzF,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,iBAAA,CAAkB,OAAO,CAAA;AACrD,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,QAC5B,uBAAA,CAAwB,OAAO,EAC/B,QAAA,CAAS;AAAA,MACR,OAAgB,IAAA,CAAK,YAAA;AAAA,MACrB,YAAA,EAAgB,gBAAgB,IAAA,CAAK,YAAA;AAAA,MACrC,UAAA,EAAgB,KAAK,SAAA,EAAU;AAAA,MAC/B;AAAA,KACD,EACA,GAAA,EAAI;AACP,IAAA,OAAO,EAAE,WAAW,GAAA,EAAI;AAAA,EAC1B;AAAA;AAAA,EAGA,MAAM,oBAAoB,OAAA,EAAwD;AAChF,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,iBAAA,CAAkB,OAAO,CAAA;AAC1C,MAAA,MAAM,MAAM,MAAO,IAAA,CAAK,QAAQ,OAAA,CAAgB,kBAAA,CAAmB,MAAM,GAAG,CAAA;AAC5E,MAAA,OAAO,EAAE,OAAA,EAAS,GAAA,CAAI,OAAA,EAAS,IAAA,EAAM,IAAI,IAAA,EAAK;AAAA,IAChD,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,cAAc,OAAA,EAAsC;AACxD,IAAA,OAAQ,MAAM,IAAA,CAAK,mBAAA,CAAoB,OAAO,CAAA,KAAO,IAAA;AAAA,EACvD;AAAA;AAAA,EAGA,MAAM,cAAA,GAAuC;AAC3C,IAAA,MAAM,UAAU,MAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAgB,mBAAmB,GAAA,EAAI;AAC3E,IAAA,OAAO,QAAQ,GAAA,CAAI,CAAC,CAAA,KAAW,CAAA,CAAE,QAAQ,OAAoB,CAAA;AAAA,EAC/D;AAAA;AAAA,EAIA,MAAM,WAAA,GAA0C;AAC9C,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAO,IAAA,CAAK,OAAA,CAAQ,QAAgB,UAAA,CAAW,KAAA,CAAM,IAAA,CAAK,SAAA,EAAW,CAAA;AACjF,MAAA,OAAO;AAAA,QACL,OAA0B,GAAA,CAAI,KAAA;AAAA,QAC9B,WAA0B,GAAA,CAAI,SAAA;AAAA,QAC9B,cAA0B,GAAA,CAAI,YAAA;AAAA,QAC9B,cAA0B,GAAA,CAAI,YAAA;AAAA,QAC9B,YAA0B,GAAA,CAAI,UAAA;AAAA,QAC9B,0BAA0B,GAAA,CAAI,wBAAA;AAAA,QAC9B,UAA0B,GAAA,CAAI,QAAA;AAAA,QAC9B,MAA0B,GAAA,CAAI;AAAA,OAChC;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,gBAAA,CAAiB,KAAA,EAAkB,KAAA,EAA+C;AACtF,IAAA,IAAI;AACF,MAAA,MAAM,CAAC,GAAG,CAAA,GAAI,GAAA,CAAI,YAAY,KAAA,EAAO,KAAA,EAAO,KAAK,UAAU,CAAA;AAC3D,MAAA,MAAM,MAAM,MAAO,IAAA,CAAK,QAAQ,OAAA,CAAgB,WAAA,CAAY,MAAM,GAAG,CAAA;AACrE,MAAA,OAAO;AAAA,QACL,OAAc,GAAA,CAAI,KAAA;AAAA,QAClB,OAAc,GAAA,CAAI,KAAA;AAAA,QAClB,aAAc,GAAA,CAAI,WAAA;AAAA,QAClB,cAAc,GAAA,CAAI,YAAA;AAAA,QAClB,MAAc,GAAA,CAAI;AAAA,OACpB;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,gBAAA,CAAiB,KAAA,EAAkB,KAAA,EAAoC;AAC3E,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,gBAAA,CAAiB,OAAO,KAAK,CAAA;AACvD,IAAA,OAAO,QAAQ,WAAA,KAAgB,IAAA;AAAA,EACjC;AACF;ACxnBO,IAAM,aAAN,MAAiB;AAAA,EAatB,WAAA,CACE,MAAA,EACA,MAAA,EACA,WAAA,EACA;AACA,IAAA,IAAA,CAAK,aAAA,GAAgB,MAAA;AACrB,IAAA,IAAA,CAAK,WAAW,IAAWe,kBAAA,CAAA,cAAA;AAAA,MACzB,IAAIC,kBAAA,CAAW,MAAA,CAAO,MAAA,EAAQ,WAAW,CAAA;AAAA,MACzC,MAAA;AAAA,MACA,EAAE,UAAA,EAAY,WAAA,EAAa,mBAAA,EAAqB,WAAA;AAAY,KAC9D;AACA,IAAOD,kBAAA,CAAA,WAAA,CAAY,KAAK,QAAQ,CAAA;AAChC,IAAA,IAAA,CAAK,cAAe,MAAA,CAAO,UAAA;AAC3B,IAAA,IAAA,CAAK,YAAA,GAAe,eAAe,MAAA,CAAO,SAAA;AAAA,EAC5C;AAAA,EAEQ,YAAA,CAAa,KAAa,OAAA,EAAgC;AAChE,IAAA,OAAO,EAAE,GAAG,GAAA,EAAK,OAAA,EAAS,OAAA,CAAQ,UAAS,EAAE;AAAA,EAC/C;AAAA,EAEA,IAAI,MAAA,GAAuB;AACzB,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,OAAA,GAAU,IAAWA,kBAAA,CAAA,OAAA,CAAQ,IAAA,CAAK,YAAA,CAAaE,0BAAA,EAAW,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAA;AACvG,MAAA,IAAA,CAAK,UAAU,IAAI,YAAA,CAAa,SAAS,IAAA,CAAK,QAAA,EAAU,KAAK,WAAW,CAAA;AAAA,IAC1E;AACA,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,IAAI,IAAA,GAAmB;AACrB,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,MAAM,OAAA,GAAU,IAAWF,kBAAA,CAAA,OAAA,CAAQ,IAAA,CAAK,YAAA,CAAaG,wBAAA,EAAS,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAA;AACnG,MAAA,IAAA,CAAK,QAAQ,IAAI,UAAA,CAAW,SAAS,IAAA,CAAK,QAAA,EAAU,KAAK,WAAW,CAAA;AAAA,IACtE;AACA,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,IAAI,MAAA,GAAuB;AACzB,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,OAAA,GAAU,IAAWH,kBAAA,CAAA,OAAA,CAAQ,IAAA,CAAK,YAAA,CAAaI,kCAAA,EAAmB,IAAA,CAAK,WAAA,CAAY,cAAc,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAA;AACvH,MAAA,IAAA,CAAK,OAAA,GAAU,IAAI,YAAA,CAAa,OAAA,EAAS,KAAK,QAAA,EAAU,IAAA,CAAK,WAAA,EAAa,IAAA,CAAK,YAAY,CAAA;AAC3F,MAAA,IAAA,CAAK,OAAA,CAAQ,YAAY,IAAA,CAAK,GAAA;AAAA,IAChC;AACA,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,IAAI,GAAA,GAAiB;AACnB,IAAA,IAAI,CAAC,KAAK,IAAA,EAAM;AACd,MAAA,MAAM,OAAA,GAAU,IAAWJ,kBAAA,CAAA,OAAA,CAAQ,IAAA,CAAK,YAAA,CAAaK,qCAAA,EAAsB,IAAA,CAAK,WAAA,CAAY,iBAAiB,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAA;AAC7H,MAAA,IAAA,CAAK,OAAO,IAAI,SAAA,CAAU,SAAS,IAAA,CAAK,QAAA,EAAU,KAAK,WAAW,CAAA;AAAA,IACpE;AACA,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EACd;AAAA,EAEA,IAAI,IAAA,GAAmB;AACrB,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,MAAM,OAAA,GAAU,IAAWL,kBAAA,CAAA,OAAA,CAAQ,IAAA,CAAK,YAAA,CAAaM,gCAAA,EAAiB,IAAA,CAAK,WAAA,CAAY,YAAY,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAA;AACnH,MAAA,IAAA,CAAK,QAAQ,IAAI,UAAA,CAAW,SAAS,IAAA,CAAK,QAAA,EAAU,KAAK,WAAW,CAAA;AAAA,IACtE;AACA,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AACF;AClEO,SAAS,WAAW,MAAA,EAYjB;AACR,EAAA,OAAO;AAAA,IACL,OAAa,MAAA,CAAO,KAAA;AAAA,IACpB,WAAa,MAAA,CAAO,SAAA;AAAA,IACpB,SAAa,MAAA,CAAO,OAAA;AAAA,IACpB,MAAa,MAAA,CAAO,IAAA;AAAA,IACpB,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,OAAa,MAAA,CAAO,KAAA,IAAc,IAAIC,oBAAAA,CAAG,IAAA,CAAK,KAAK,CAAA;AAAA,IACnD,MAAA,EAAa,MAAA,CAAO,MAAA,IAAa,IAAIA,qBAAG,CAAC,CAAA;AAAA,IACzC,SAAA,EAAa,MAAA,CAAO,SAAA,IAAa,IAAIA,oBAAAA,CAAG,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,EAAI,GAAI,GAAI,CAAC,CAAA;AAAA,IACrE,GAAA,EAAQ,MAAA,CAAO,GAAA,IAAQ,IAAIA,qBAAG,CAAC,CAAA;AAAA,IAC/B,KAAA,EAAa,OAAO,KAAA,IAAa,IAAIxB,kBAAU,IAAI,UAAA,CAAW,EAAE,CAAC,CAAA;AAAA,IACjE,QAAa,MAAA,CAAO;AAAA,GACtB;AACF;AAQO,SAAS,oBAAA,CAAqB,OAAc,OAAA,EAA+B;AAChF,EAAA,MAAM,OAAA,GAAU,sBAAsB,KAAK,CAAA;AAC3C,EAAA,MAAM,SAAA,GAAiByB,eAAA,CAAA,IAAA,CAAK,QAAA,CAAS,OAAA,EAAS,QAAQ,SAAS,CAAA;AAC/D,EAAA,OAAO,EAAE,OAAO,SAAA,EAAU;AAC5B;AAGO,SAAS,kBAAkB,KAAA,EAA0B;AAC1D,EAAA,OAAO,sBAAsB,KAAK,CAAA;AACpC;AAKO,SAAS,qBAAqB,MAAA,EAAiC;AACpE,EAAA,MAAM,UAAA,GAAa,qBAAA,CAAsB,MAAA,CAAO,KAAK,CAAA;AACrD,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,GAAG,CAAA;AAC9B,EAAA,GAAA,CAAI,GAAA,CAAI,YAAY,CAAC,CAAA;AACrB,EAAA,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,SAAA,EAAW,GAAG,CAAA;AAC7B,EAAA,OAAO,GAAA;AACT;AAMO,SAAS,uBAAuB,KAAA,EAAgC;AACrE,EAAA,IAAI,MAAM,MAAA,KAAW,GAAA,EAAK,MAAM,IAAI,kBAAkB,+BAA+B,CAAA;AAErF,EAAA,MAAM,UAAA,GAAa,CAAC,MAAA,KAAmB,IAAIzB,iBAAAA,CAAU,MAAM,KAAA,CAAM,MAAA,EAAQ,MAAA,GAAS,EAAE,CAAC,CAAA;AACrF,EAAA,MAAM,OAAA,GAAa,CAAC,MAAA,KAAmB,IAAIwB,oBAAAA,CAAG,KAAA,CAAM,KAAA,CAAM,MAAA,EAAQ,MAAA,GAAS,CAAC,CAAA,EAAG,IAAI,CAAA;AACnF,EAAA,MAAM,OAAA,GAAa,CAAC,MAAA,KAAmB,IAAIA,oBAAAA,CAAG,KAAA,CAAM,KAAA,CAAM,MAAA,EAAQ,MAAA,GAAS,CAAC,CAAA,EAAG,IAAI,CAAA;AAEnF,EAAA,MAAM,KAAA,GAAe;AAAA,IACnB,KAAA,EAAa,WAAW,CAAC,CAAA;AAAA,IACzB,SAAA,EAAa,WAAW,EAAE,CAAA;AAAA,IAC1B,OAAA,EAAa,MAAM,EAAE,CAAA;AAAA,IACrB,IAAA,EAAa,MAAM,EAAE,CAAA;AAAA,IACrB,WAAA,EAAa,QAAQ,EAAE,CAAA;AAAA,IACvB,WAAA,EAAa,QAAQ,EAAE,CAAA;AAAA,IACvB,KAAA,EAAa,QAAQ,EAAE,CAAA;AAAA,IACvB,MAAA,EAAa,QAAQ,EAAE,CAAA;AAAA,IACvB,SAAA,EAAa,QAAQ,EAAE,CAAA;AAAA,IACvB,GAAA,EAAQ,QAAQ,GAAG,CAAA;AAAA,IACnB,KAAA,EAAa,WAAW,GAAG,CAAA;AAAA,IAC3B,MAAA,EAAa,WAAW,GAAG;AAAA,GAC7B;AACA,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,CAAM,GAAA,EAAK,GAAG,CAAA;AACtC,EAAA,OAAO,EAAE,OAAO,SAAA,EAAU;AAC5B;AAQO,SAAS,kBAAkB,MAAA,EAA8B;AAC9D,EAAA,MAAM,OAAA,GAAU,qBAAA,CAAsB,MAAA,CAAO,KAAK,CAAA;AAClD,EAAA,OAAYC,qBAAK,QAAA,CAAS,MAAA;AAAA,IACxB,OAAA;AAAA,IACA,MAAA,CAAO,SAAA;AAAA,IACP,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,OAAA;AAAQ,GAC9B;AACF;AAeO,SAAS,eAAA,CAAgB,GAAwB,CAAA,EAAmC;AACzF,EAAA,MAAM,EAAA,GAAK,OAAA,IAAW,CAAA,GAAI,CAAA,CAAE,KAAA,GAAQ,CAAA;AACpC,EAAA,MAAM,EAAA,GAAK,OAAA,IAAW,CAAA,GAAI,CAAA,CAAE,KAAA,GAAQ,CAAA;AACpC,EAAA,OAAO,gBAAA,CAAiB,IAAI,EAAE,CAAA;AAChC;AAEA,SAAS,gBAAA,CAAiB,GAAU,CAAA,EAAqB;AACvD,EAAA,MAAM,QAAA,GAAY,CAAA;AAGlB,EAAA,IAAI,CAAA,CAAE,OAAA,KAAY,CAAA,CAAE,OAAA,EAAS;AAC3B,IAAA,MAAMC,KAAAA,GAAO,EAAE,IAAA,KAAS,QAAA;AACxB,IAAA,MAAMC,KAAAA,GAAO,EAAE,IAAA,KAAS,QAAA;AACxB,IAAA,IAAID,KAAAA,KAASC,OAAM,OAAO,eAAA;AAC1B,IAAA,MAAM,IAAI,iBAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,IAAA,GAAO,EAAE,IAAA,KAAS,QAAA;AACxB,EAAA,MAAM,IAAA,GAAO,EAAE,IAAA,KAAS,QAAA;AACxB,EAAA,IAAI,IAAA,IAAQ,MAAQ,OAAO,MAAA;AAC3B,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,EAAM,OAAO,OAAA;AAC3B,EAAA,MAAM,IAAI,iBAAA;AAAA,IACR;AAAA,GACF;AACF;ACvIO,IAAM,kBAAA,GAAqB,IAAIH,oBAAAA,CAAG,sBAAsB;AAgBxD,SAAS,yBACd,cAAA,EACA,MAAA,EACA,KAAA,EACA,QAAA,EACA,SAAa,kBAAA,EACA;AACb,EAAA,MAAM,QAAA,GAAWf,sCAAAA,CAA8B,cAAA,EAAgB,MAAA,EAAQ,OAAOD,yBAAgB,CAAA;AAC9F,EAAA,MAAM,SAAA,GAAYoB,iCAAA;AAAA,IAChB,QAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,CAAA;AAAA,IACxB,EAAC;AAAA,IACDpB;AAAA,GACF;AACA,EAAA,MAAM,EAAA,GAAK,IAAIqB,mBAAAA,EAAY;AAC3B,EAAA,EAAA,CAAG,QAAA,GAAW,KAAA;AACd,EAAA,EAAA,CAAG,IAAI,SAAS,CAAA;AAChB,EAAA,OAAO,EAAA;AACT;AAQO,SAAS,+BACd,SAAA,EACA,MAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,SAAa,kBAAA,EACA;AACb,EAAA,MAAM,CAAC,OAAO,CAAA,GAAI,GAAA,CAAI,OAAA,CAAQ,WAAW,UAAU,CAAA;AACnD,EAAA,MAAM,CAAC,MAAM,CAAA,GAAK,GAAA,CAAI,MAAA,CAAO,WAAW,UAAU,CAAA;AAElD,EAAA,MAAM,MAAA,GAASpB,sCAAAA,CAA8B,OAAA,EAAS,MAAA,EAAQ,OAAOL,8BAAqB,CAAA;AAC1F,EAAA,MAAM,KAAA,GAASK,sCAAAA,CAA8B,MAAA,EAAS,MAAA,EAAQ,OAAOL,8BAAqB,CAAA;AAC1F,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,CAAA;AAE1C,EAAA,MAAM,YAAA,GAAewB,iCAAA;AAAA,IACnB,MAAA;AAAA,IAAQ,QAAA;AAAA,IAAU,MAAA;AAAA,IAAQ,SAAA;AAAA,IAAW,EAAC;AAAA,IAAGxB;AAAA,GAC3C;AACA,EAAA,MAAM,WAAA,GAAcwB,iCAAA;AAAA,IAClB,KAAA;AAAA,IAAQ,QAAA;AAAA,IAAU,MAAA;AAAA,IAAQ,SAAA;AAAA,IAAW,EAAC;AAAA,IAAGxB;AAAA,GAC3C;AAEA,EAAA,MAAM,EAAA,GAAK,IAAIyB,mBAAAA,EAAY;AAC3B,EAAA,EAAA,CAAG,QAAA,GAAW,KAAA;AACd,EAAA,EAAA,CAAG,GAAA,CAAI,cAAc,WAAW,CAAA;AAChC,EAAA,OAAO,EAAA;AACT","file":"index.js","sourcesContent":["import { PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport { createHash } from \"crypto\";\nimport { ProgramIds } from \"./config/networks\";\n\n// ─── PDA Seeds ────────────────────────────────────────────────────────────────\n// These are constants — they don't change per network.\n\nexport const SEEDS = {\n config: Buffer.from(\"config\"),\n question: Buffer.from(\"question\"),\n condition: Buffer.from(\"condition\"),\n collateralVault: Buffer.from(\"collateral_vault\"),\n vaultToken: Buffer.from(\"vault_token\"),\n position: Buffer.from(\"position\"),\n yesMint: Buffer.from(\"yes_mint\"),\n noMint: Buffer.from(\"no_mint\"),\n mintAuthority: Buffer.from(\"mint_authority\"),\n reporter: Buffer.from(\"reporter\"),\n result: Buffer.from(\"result\"),\n ctfConfig: Buffer.from(\"ctf_config\"),\n hookConfig: Buffer.from(\"hook_config\"),\n extraAccountMetas: Buffer.from(\"extra-account-metas\"),\n clobConfig: Buffer.from(\"clob_config\"),\n order: Buffer.from(\"order\"),\n} as const;\n\n// ─── PDA derivation helpers ───────────────────────────────────────────────────\n// All methods require explicit programIds — no hidden globals.\n\nexport class PDA {\n // ─── Question Market ────────────────────────────────────────────────────────\n\n static questionMarketConfig(\n owner: PublicKey,\n programIds: Pick<ProgramIds, \"questionMarket\">\n ): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [SEEDS.config, owner.toBuffer()],\n programIds.questionMarket\n );\n }\n\n static question(\n config: PublicKey,\n questionId: Uint8Array,\n programIds: Pick<ProgramIds, \"questionMarket\">\n ): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [SEEDS.question, config.toBuffer(), Buffer.from(questionId)],\n programIds.questionMarket\n );\n }\n\n // ─── Conditional Tokens ─────────────────────────────────────────────────────\n\n static ctfConfig(\n programIds: Pick<ProgramIds, \"conditionalTokens\">\n ): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [SEEDS.ctfConfig],\n programIds.conditionalTokens\n );\n }\n\n static condition(\n oracle: PublicKey,\n questionId: Uint8Array,\n programIds: Pick<ProgramIds, \"conditionalTokens\">\n ): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [SEEDS.condition, oracle.toBuffer(), Buffer.from(questionId)],\n programIds.conditionalTokens\n );\n }\n\n static collateralVault(\n collateralMint: PublicKey,\n programIds: Pick<ProgramIds, \"conditionalTokens\">\n ): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [SEEDS.collateralVault, collateralMint.toBuffer()],\n programIds.conditionalTokens\n );\n }\n\n static vaultToken(\n collateralMint: PublicKey,\n programIds: Pick<ProgramIds, \"conditionalTokens\">\n ): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [SEEDS.vaultToken, collateralMint.toBuffer()],\n programIds.conditionalTokens\n );\n }\n\n static yesMint(\n condition: PublicKey,\n programIds: Pick<ProgramIds, \"conditionalTokens\">\n ): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [SEEDS.yesMint, condition.toBuffer()],\n programIds.conditionalTokens\n );\n }\n\n static noMint(\n condition: PublicKey,\n programIds: Pick<ProgramIds, \"conditionalTokens\">\n ): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [SEEDS.noMint, condition.toBuffer()],\n programIds.conditionalTokens\n );\n }\n\n static mintAuthority(\n condition: PublicKey,\n programIds: Pick<ProgramIds, \"conditionalTokens\">\n ): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [SEEDS.mintAuthority, condition.toBuffer()],\n programIds.conditionalTokens\n );\n }\n\n static position(\n condition: PublicKey,\n outcomeIndex: number,\n owner: PublicKey,\n programIds: Pick<ProgramIds, \"conditionalTokens\">\n ): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [SEEDS.position, condition.toBuffer(), Buffer.from([outcomeIndex]), owner.toBuffer()],\n programIds.conditionalTokens\n );\n }\n\n // ─── Oracle ─────────────────────────────────────────────────────────────────\n\n static oracleConfig(\n owner: PublicKey,\n programIds: Pick<ProgramIds, \"oracle\">\n ): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [SEEDS.config, owner.toBuffer()],\n programIds.oracle\n );\n }\n\n static reporter(\n oracleConfig: PublicKey,\n reporterAddress: PublicKey,\n programIds: Pick<ProgramIds, \"oracle\">\n ): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [SEEDS.reporter, oracleConfig.toBuffer(), reporterAddress.toBuffer()],\n programIds.oracle\n );\n }\n\n static questionResult(\n oracleConfig: PublicKey,\n questionId: Uint8Array,\n programIds: Pick<ProgramIds, \"oracle\">\n ): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [SEEDS.result, oracleConfig.toBuffer(), Buffer.from(questionId)],\n programIds.oracle\n );\n }\n\n // ─── Hook ───────────────────────────────────────────────────────────────────\n\n static hookConfig(\n programIds: Pick<ProgramIds, \"hook\">\n ): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [SEEDS.hookConfig],\n programIds.hook\n );\n }\n\n static extraAccountMetaList(\n mint: PublicKey,\n programIds: Pick<ProgramIds, \"hook\">\n ): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [SEEDS.extraAccountMetas, mint.toBuffer()],\n programIds.hook\n );\n }\n\n // ─── CLOB ───────────────────────────────────────────────────────────────────\n\n static clobConfig(\n programIds: Pick<ProgramIds, \"clobExchange\">\n ): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [SEEDS.clobConfig],\n programIds.clobExchange\n );\n }\n\n static orderStatus(\n maker: PublicKey,\n nonce: BN,\n programIds: Pick<ProgramIds, \"clobExchange\">\n ): [PublicKey, number] {\n const nonceBuf = Buffer.alloc(8);\n nonceBuf.writeBigUInt64LE(BigInt(nonce.toString()));\n return PublicKey.findProgramAddressSync(\n [SEEDS.order, maker.toBuffer(), nonceBuf],\n programIds.clobExchange\n );\n }\n}\n\n// ─── Utilities ────────────────────────────────────────────────────────────────\n\n/** Unique 32-byte question ID: SHA-256(content + timestamp). Different each call. */\nexport function generateQuestionId(content: string, salt?: number): Uint8Array {\n const input = content + (salt ?? Date.now());\n return new Uint8Array(createHash(\"sha256\").update(input).digest());\n}\n\n/** Deterministic 32-byte content hash: SHA-256(content). Same content = same hash. */\nexport function generateContentHash(content: string): Uint8Array {\n return new Uint8Array(createHash(\"sha256\").update(content).digest());\n}\n","import * as anchor from \"@coral-xyz/anchor\";\nimport { Keypair, PublicKey, SystemProgram } from \"@solana/web3.js\";\nimport { PDA } from \"../pda\";\nimport { ProgramIds } from \"../config/networks\";\nimport { OracleConfig, QuestionResult, TxResult } from \"../types\";\n\nexport class OracleClient {\n private readonly program: anchor.Program;\n private readonly provider: anchor.AnchorProvider;\n private readonly programIds: ProgramIds;\n\n constructor(\n program: anchor.Program,\n provider: anchor.AnchorProvider,\n programIds: ProgramIds\n ) {\n this.program = program;\n this.provider = provider;\n this.programIds = programIds;\n }\n\n get walletPubkey(): PublicKey {\n return this.provider.wallet.publicKey;\n }\n\n configPda(owner: PublicKey = this.walletPubkey): PublicKey {\n return PDA.oracleConfig(owner, this.programIds)[0];\n }\n\n // ─── Instructions ────────────────────────────────────────────────────────────\n\n /** One-time setup. Caller becomes owner. */\n async initialize(admin: PublicKey): Promise<TxResult> {\n const sig = await this.program.methods\n .initialize(admin)\n .accounts({\n owner: this.walletPubkey,\n oracleConfig: this.configPda(),\n systemProgram: SystemProgram.programId,\n })\n .rpc();\n return { signature: sig };\n }\n\n /** Admin or owner adds an address to the oracle whitelist. */\n async addToWhitelist(address: PublicKey, ownerPubkey?: PublicKey): Promise<TxResult> {\n const sig = await this.program.methods\n .addToWhitelist(address)\n .accounts({\n authority: this.walletPubkey,\n payer: this.walletPubkey,\n oracleConfig: this.configPda(ownerPubkey),\n })\n .rpc();\n return { signature: sig };\n }\n\n /** Admin or owner removes an address from the oracle whitelist. */\n async removeFromWhitelist(address: PublicKey, ownerPubkey?: PublicKey): Promise<TxResult> {\n const sig = await this.program.methods\n .removeFromWhitelist(address)\n .accounts({\n authority: this.walletPubkey,\n payer: this.walletPubkey,\n oracleConfig: this.configPda(ownerPubkey),\n })\n .rpc();\n return { signature: sig };\n }\n\n /**\n * Whitelisted reporter resolves a question.\n * CPIs directly into CTF.set_payout — condition is resolved in one tx.\n * @param conditionPda - CTF condition account (oracle_config = oraclePda, question_id must match)\n * @param ownerPubkey - oracle config owner (defaults to wallet)\n * @param payer - fee payer (defaults to wallet)\n */\n async resolveQuestion(\n questionId: Uint8Array,\n outcomeCount: number,\n payoutNumerators: number[],\n conditionPda: PublicKey,\n ownerPubkey?: PublicKey,\n payer?: PublicKey,\n signers: Keypair[] = []\n ): Promise<TxResult> {\n const oracleConfig = this.configPda(ownerPubkey);\n const [questionResultPda] = PDA.questionResult(oracleConfig, questionId, this.programIds);\n const sig = await this.program.methods\n .resolveQuestion(\n Array.from(questionId) as number[],\n outcomeCount,\n payoutNumerators.map((n) => new anchor.BN(n))\n )\n .accounts({\n reporter: this.walletPubkey,\n oracleConfig,\n questionResult: questionResultPda,\n condition: conditionPda,\n conditionalTokensProgram: this.programIds.conditionalTokens,\n payer: payer ?? this.walletPubkey,\n systemProgram: SystemProgram.programId,\n })\n .signers(signers)\n .rpc();\n return { signature: sig };\n }\n\n /** Owner updates the admin. */\n async updateAdmin(newAdmin: PublicKey, ownerPubkey?: PublicKey): Promise<TxResult> {\n const sig = await this.program.methods\n .updateAdmin(newAdmin)\n .accounts({\n owner: this.walletPubkey,\n oracleConfig: this.configPda(ownerPubkey),\n })\n .rpc();\n return { signature: sig };\n }\n\n /** Owner transfers ownership to a new keypair. */\n async transferOwnership(newOwner: PublicKey, ownerPubkey?: PublicKey): Promise<TxResult> {\n const sig = await this.program.methods\n .transferOwnership(newOwner)\n .accounts({\n owner: this.walletPubkey,\n oracleConfig: this.configPda(ownerPubkey),\n })\n .rpc();\n return { signature: sig };\n }\n\n /** Admin or owner pause/unpause the oracle. */\n async pause(paused: boolean, ownerPubkey?: PublicKey): Promise<TxResult> {\n const sig = await this.program.methods\n .pause(paused)\n .accounts({\n authority: this.walletPubkey,\n oracleConfig: this.configPda(ownerPubkey),\n })\n .rpc();\n return { signature: sig };\n }\n\n // ─── Queries ─────────────────────────────────────────────────────────────────\n\n async fetchConfig(owner?: PublicKey): Promise<OracleConfig | null> {\n try {\n const acc = await (this.program.account as any).oracleConfig.fetch(\n this.configPda(owner ?? this.walletPubkey)\n );\n return {\n owner: acc.owner,\n admin: acc.admin,\n questionCount: acc.questionCount.toNumber(),\n whitelist: acc.whitelist as PublicKey[],\n whitelistLen: acc.whitelistLen,\n isPaused: acc.isPaused,\n bump: acc.bump,\n };\n } catch {\n return null;\n }\n }\n\n async fetchQuestionResult(\n questionId: Uint8Array,\n ownerPubkey?: PublicKey\n ): Promise<QuestionResult | null> {\n try {\n const oracleConfig = this.configPda(ownerPubkey);\n const [pda] = PDA.questionResult(oracleConfig, questionId, this.programIds);\n const acc = await (this.program.account as any).questionResult.fetch(pda);\n return {\n oracleConfig: acc.oracleConfig,\n questionId: new Uint8Array(acc.questionId),\n outcomeIndex: acc.outcomeIndex,\n outcomeCount: acc.outcomeCount,\n payoutNumerators: acc.payoutNumerators,\n isResolved: acc.isResolved,\n resolvedAt: acc.resolvedAt.toNumber(),\n reporter: acc.reporter,\n condition: acc.condition ?? null,\n bump: acc.bump,\n };\n } catch {\n return null;\n }\n }\n}\n","import * as anchor from \"@coral-xyz/anchor\";\nimport { PublicKey, SystemProgram } from \"@solana/web3.js\";\nimport { TOKEN_2022_PROGRAM_ID } from \"@solana/spl-token\";\nimport { PDA } from \"../pda\";\nimport { ProgramIds } from \"../config/networks\";\nimport { HookConfig, TxResult } from \"../types\";\n\nexport class HookClient {\n private readonly program: anchor.Program;\n private readonly provider: anchor.AnchorProvider;\n private readonly programIds: ProgramIds;\n\n constructor(\n program: anchor.Program,\n provider: anchor.AnchorProvider,\n programIds: ProgramIds\n ) {\n this.program = program;\n this.provider = provider;\n this.programIds = programIds;\n }\n\n get walletPubkey(): PublicKey {\n return this.provider.wallet.publicKey;\n }\n\n configPda(): PublicKey {\n return PDA.hookConfig(this.programIds)[0];\n }\n\n // ─── Instructions ────────────────────────────────────────────────────────────\n\n /** One-time setup. Caller becomes owner. */\n async initialize(initialWhitelist: PublicKey[]): Promise<TxResult> {\n const sig = await this.program.methods\n .initializeHookConfig(initialWhitelist)\n .accounts({\n owner: this.walletPubkey,\n hookConfig: this.configPda(),\n systemProgram: SystemProgram.programId,\n })\n .rpc();\n return { signature: sig };\n }\n\n /**\n * Register extra account metas for a Token-2022 YES/NO mint.\n * Must be called once per mint after CTF creates it.\n */\n async initializeExtraAccountMetaList(mint: PublicKey): Promise<TxResult> {\n const [extraAccountMetaList] = PDA.extraAccountMetaList(mint, this.programIds);\n const sig = await this.program.methods\n .initializeExtraAccountMetaList()\n .accounts({\n payer: this.walletPubkey,\n extraAccountMetaList,\n mint,\n hookConfig: this.configPda(),\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .rpc();\n return { signature: sig };\n }\n\n /** Owner adds a program to the transfer whitelist. */\n async addToWhitelist(program: PublicKey): Promise<TxResult> {\n const sig = await this.program.methods\n .addToWhitelist(program)\n .accounts({\n owner: this.walletPubkey,\n hookConfig: this.configPda(),\n })\n .rpc();\n return { signature: sig };\n }\n\n /** Owner removes a program from the transfer whitelist. */\n async removeFromWhitelist(program: PublicKey): Promise<TxResult> {\n const sig = await this.program.methods\n .removeFromWhitelist(program)\n .accounts({\n owner: this.walletPubkey,\n hookConfig: this.configPda(),\n })\n .rpc();\n return { signature: sig };\n }\n\n /** Permanently freeze the whitelist — no further changes allowed. */\n async freezeWhitelist(): Promise<TxResult> {\n const sig = await this.program.methods\n .freezeWhitelist()\n .accounts({\n owner: this.walletPubkey,\n hookConfig: this.configPda(),\n })\n .rpc();\n return { signature: sig };\n }\n\n /**\n * SPL Transfer-Hook `execute` — invoked automatically by Token-2022 on every\n * YES/NO token transfer. Validates the destination against the whitelist.\n *\n * Calling this directly is useful for:\n * - Off-chain simulation (\"would this transfer be allowed?\")\n * - Integration tests that verify whitelist enforcement\n *\n * Token-2022 calls this automatically; you normally don't call it manually.\n *\n * @param sourceToken - Source token account (tokens leaving)\n * @param mint - The YES/NO Token-2022 mint\n * @param destinationToken - Destination token account (tokens arriving)\n * @param owner - Authority that authorized the transfer\n * @param amount - Token amount being transferred\n */\n async execute(\n sourceToken: PublicKey,\n mint: PublicKey,\n destinationToken: PublicKey,\n owner: PublicKey,\n amount: anchor.BN\n ): Promise<TxResult> {\n const [extraAccountMetaList] = PDA.extraAccountMetaList(mint, this.programIds);\n const sig = await this.program.methods\n .execute(amount)\n .accounts({\n sourceToken,\n mint,\n destinationToken,\n owner,\n extraAccountMetaList,\n hookConfig: this.configPda(),\n })\n .rpc();\n return { signature: sig };\n }\n\n // ─── Queries ─────────────────────────────────────────────────────────────────\n\n async fetchConfig(): Promise<HookConfig | null> {\n try {\n const acc = await (this.program.account as any).hookConfig.fetch(this.configPda());\n return {\n owner: acc.owner,\n whitelist: acc.whitelist as PublicKey[],\n whitelistLen: acc.whitelistLen,\n isFrozen: acc.isFrozen,\n bump: acc.bump,\n };\n } catch {\n return null;\n }\n }\n\n async isWhitelisted(program: PublicKey): Promise<boolean> {\n const config = await this.fetchConfig();\n if (!config) return false;\n return config.whitelist.some((p) => p.equals(program));\n }\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\n\n// ─── Shared ───────────────────────────────────────────────────────────────────\n\nexport interface TxResult {\n signature: string;\n}\n\n// ─── Oracle ───────────────────────────────────────────────────────────────────\n\nexport interface OracleConfig {\n owner: PublicKey;\n admin: PublicKey;\n questionCount: number;\n whitelist: PublicKey[];\n whitelistLen: number;\n isPaused: boolean;\n bump: number;\n}\n\nexport interface QuestionResult {\n oracleConfig: PublicKey;\n questionId: Uint8Array;\n outcomeIndex: number;\n outcomeCount: number;\n payoutNumerators: BN[];\n isResolved: boolean;\n resolvedAt: number;\n reporter: PublicKey;\n condition: PublicKey | null;\n bump: number;\n}\n\n// ─── Conditional Tokens ───────────────────────────────────────────────────────\n\nexport interface Condition {\n oracle: PublicKey;\n questionId: Uint8Array;\n outcomeSlotCount: number;\n payoutNumerators: BN[];\n payoutDenominator: BN;\n totalCollateral: BN;\n collateralMint: PublicKey;\n collateralVault: PublicKey;\n yesMint: PublicKey;\n noMint: PublicKey;\n hookProgram: PublicKey;\n authorizedClob: PublicKey;\n isResolved: boolean;\n resolvedAt: number;\n bump: number;\n}\n\nexport interface CollateralVault {\n collateralMint: PublicKey;\n vaultTokenAccount: PublicKey;\n totalLocked: BN;\n conditionCount: BN;\n bump: number;\n vaultBump: number;\n}\n\nexport interface Position {\n owner: PublicKey;\n condition: PublicKey;\n outcomeIndex: number;\n balance: BN;\n bump: number;\n}\n\n// ─── Question Market ──────────────────────────────────────────────────────────\n\nexport enum QuestionStatus {\n Pending = \"pending\",\n Approved = \"approved\",\n Rejected = \"rejected\",\n Resolved = \"resolved\",\n}\n\nexport interface QuestionMarketConfig {\n owner: PublicKey;\n admin: PublicKey;\n oracle: PublicKey;\n conditionalTokensProgram: PublicKey;\n questionCount: number;\n approvedCount: number;\n rejectedCount: number;\n whitelist: PublicKey[];\n whitelistLen: number;\n isPaused: boolean;\n bump: number;\n}\n\nexport interface Question {\n config: PublicKey;\n questionId: Uint8Array;\n contentHash: Uint8Array;\n expirationTime: number;\n currencyMint: PublicKey;\n creator: PublicKey;\n condition: PublicKey | null;\n status: QuestionStatus;\n createdAt: number;\n approvedAt: number;\n resolvedAt: number;\n bump: number;\n}\n\nexport interface CreateQuestionParams {\n /** Human-readable question text — used to derive questionId + contentHash */\n content: string;\n /** Expiration as Unix timestamp */\n expirationTime: number;\n /** Collateral mint (e.g. USDC) */\n collateralMint: PublicKey;\n /** Hook program ID for Token-2022 transfer enforcement */\n hookProgram: PublicKey;\n /** Authorized CLOB program ID */\n authorizedClob: PublicKey;\n /** Override auto-generated questionId */\n questionId?: Uint8Array;\n /** Override auto-generated contentHash */\n contentHash?: Uint8Array;\n}\n\n// ─── Conditional Tokens (CtfConfig) ──────────────────────────────────────────\n\nexport interface CtfConfig {\n owner: PublicKey;\n bump: number;\n}\n\n// ─── Hook ─────────────────────────────────────────────────────────────────────\n\nexport interface HookConfig {\n owner: PublicKey;\n whitelist: PublicKey[];\n whitelistLen: number;\n isFrozen: boolean;\n bump: number;\n}\n\n// ─── CLOB Exchange ────────────────────────────────────────────────────────────\n\nexport interface ClobConfig {\n owner: PublicKey;\n operators: PublicKey[];\n operatorsLen: number;\n feeRecipient: PublicKey;\n feeRateBps: number;\n conditionalTokensProgram: PublicKey;\n isPaused: boolean;\n bump: number;\n}\n\nexport interface ClobWhitelistEntry {\n address: PublicKey;\n bump: number;\n}\n\nexport interface OrderStatus {\n maker: PublicKey;\n nonce: BN;\n filledAmount: BN;\n isCancelled: boolean;\n bump: number;\n}\n\n/**\n * Off-chain order struct passed as instruction data.\n * Operator validates + submits matched order pairs on-chain.\n *\n * Semantics (mirrors EVM makerAmount/takerAmount):\n * BUY (side=1): makerAmount = USDC paid, takerAmount = CTF tokens received\n * SELL (side=0): makerAmount = CTF tokens given, takerAmount = USDC received\n */\nexport interface Order {\n /** Maker's wallet public key */\n maker: PublicKey;\n /** Condition PDA this order belongs to */\n condition: PublicKey;\n /** Outcome token: 0 = NO, 1 = YES */\n tokenId: number;\n /** Side: 0 = SELL (give tokens, want USDC), 1 = BUY (give USDC, want tokens) */\n side: number;\n /** Amount the maker puts in: BUY → USDC, SELL → CTF tokens */\n makerAmount: BN;\n /** Amount the maker wants to receive: BUY → CTF tokens, SELL → USDC */\n takerAmount: BN;\n /** Unique nonce per maker — used for OrderStatus PDA + replay protection */\n nonce: BN;\n /** Unix timestamp expiry (0 = no expiry) */\n expiry: BN;\n /** Creation timestamp (Unix seconds) */\n createdAt: BN;\n /** Fee from taker order transferred to treasury. 0 = use global fee_rate_bps */\n fee: BN;\n /** Directed order: only this pubkey can be counterparty. PublicKey.default() = public */\n taker: PublicKey;\n /** Ed25519 signer key. Must equal maker for now (proxy not supported) */\n signer: PublicKey;\n}\n\n/**\n * Signed order — Order + 64-byte Ed25519 signature over serializeOrderToBytes().\n * This is the on-chain instruction data type for all match_* instructions.\n */\nexport interface SignedOrder {\n order: Order;\n /** Ed25519 signature (64 bytes) from order.maker over serializeOrderToBytes() */\n signature: Uint8Array;\n}\n\n// ─── Errors ───────────────────────────────────────────────────────────────────\n\nexport class XMarketError extends Error {\n constructor(message: string, public code?: string) {\n super(message);\n this.name = \"XMarketError\";\n }\n}\n\nexport class UnauthorizedError extends XMarketError {\n constructor(msg = \"Unauthorized\") {\n super(msg, \"UNAUTHORIZED\");\n this.name = \"UnauthorizedError\";\n }\n}\n\nexport class AccountNotFoundError extends XMarketError {\n constructor(account: string, address?: string) {\n super(`${account} not found${address ? `: ${address}` : \"\"}`, \"NOT_FOUND\");\n this.name = \"AccountNotFoundError\";\n }\n}\n\nexport class InvalidParamError extends XMarketError {\n constructor(msg = \"Invalid parameter\") {\n super(msg, \"INVALID_PARAM\");\n this.name = \"InvalidParamError\";\n }\n}\n","import * as anchor from \"@coral-xyz/anchor\";\nimport { PublicKey, SystemProgram, SYSVAR_RENT_PUBKEY, Transaction } from \"@solana/web3.js\";\nimport { TOKEN_2022_PROGRAM_ID } from \"@solana/spl-token\";\nimport { PDA, generateQuestionId, generateContentHash } from \"../pda\";\nimport { ProgramIds } from \"../config/networks\";\nimport {\n QuestionMarketConfig,\n Question,\n QuestionStatus,\n CreateQuestionParams,\n Position,\n} from \"../types\";\nimport type { CtfClient } from \"./ctf\";\n\nexport class MarketClient {\n private readonly program: anchor.Program;\n private readonly provider: anchor.AnchorProvider;\n private readonly programIds: ProgramIds;\n readonly configPda: PublicKey;\n\n /** Injected by XMarketSDK after construction — enables fetchQuestionBalances. */\n ctfClient?: CtfClient;\n\n constructor(\n program: anchor.Program,\n provider: anchor.AnchorProvider,\n programIds: ProgramIds,\n ownerPubkey: PublicKey\n ) {\n this.program = program;\n this.provider = provider;\n this.programIds = programIds;\n this.configPda = PDA.questionMarketConfig(ownerPubkey, programIds)[0];\n }\n\n get walletPubkey(): PublicKey {\n return this.provider.wallet.publicKey;\n }\n\n // ─── Instructions (return Transaction — caller signs + sends) ───────────────\n\n async initialize(\n admin: PublicKey,\n oracle: PublicKey,\n owner: PublicKey = this.walletPubkey\n ): Promise<Transaction> {\n return this.program.methods\n .initialize({\n admin,\n conditionalTokensProgram: this.programIds.conditionalTokens,\n oracle,\n })\n .accounts({\n owner,\n config: this.configPda,\n systemProgram: SystemProgram.programId,\n })\n .transaction();\n }\n\n /**\n * Build createQuestion transaction.\n * @param payer - Pays rent for all new accounts (can differ from creator)\n * @param creator - Identity of the question creator (signs but does not pay)\n */\n async createQuestion(\n params: CreateQuestionParams,\n oracle: PublicKey,\n creator: PublicKey = this.walletPubkey,\n payer: PublicKey = creator\n ): Promise<{ tx: Transaction; questionPda: PublicKey; conditionPda: PublicKey; questionId: Uint8Array }> {\n const questionId = params.questionId ?? generateQuestionId(params.content);\n const contentHash = params.contentHash ?? generateContentHash(params.content);\n\n const [questionPda] = PDA.question(this.configPda, questionId, this.programIds);\n const [conditionPda] = PDA.condition(oracle, questionId, this.programIds);\n const [yesMint] = PDA.yesMint(conditionPda, this.programIds);\n const [noMint] = PDA.noMint(conditionPda, this.programIds);\n const [mintAuthority] = PDA.mintAuthority(conditionPda, this.programIds);\n const [collateralVault] = PDA.collateralVault(params.collateralMint, this.programIds);\n\n const tx = await this.program.methods\n .createQuestionWithCondition({\n questionId: Array.from(questionId) as number[],\n contentHash: Array.from(contentHash) as number[],\n hookProgram: params.hookProgram,\n authorizedClob: params.authorizedClob,\n expirationTime: new anchor.BN(params.expirationTime),\n })\n .accounts({\n payer,\n creator,\n config: this.configPda,\n question: questionPda,\n currencyMint: params.collateralMint,\n oracle,\n condition: conditionPda,\n yesMint,\n noMint,\n mintAuthority,\n collateralVault,\n conditionalTokensProgram: this.programIds.conditionalTokens,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n rent: SYSVAR_RENT_PUBKEY,\n })\n .transaction();\n\n return { tx, questionPda, conditionPda, questionId };\n }\n\n /**\n * Build createQuestionAdmin transaction (whitelist/admin path — status = Approved immediately).\n * @param creator - Whitelisted creator (must be in whitelist or be admin/owner)\n * @param payer - Fee payer (pays rent; can differ from creator)\n */\n async createQuestionAdmin(\n params: CreateQuestionParams,\n oracle: PublicKey,\n creator: PublicKey = this.walletPubkey,\n payer: PublicKey = creator\n ): Promise<{ tx: Transaction; questionPda: PublicKey; conditionPda: PublicKey; questionId: Uint8Array }> {\n const questionId = params.questionId ?? generateQuestionId(params.content);\n const contentHash = params.contentHash ?? generateContentHash(params.content);\n\n const [questionPda] = PDA.question(this.configPda, questionId, this.programIds);\n const [conditionPda] = PDA.condition(oracle, questionId, this.programIds);\n const [yesMint] = PDA.yesMint(conditionPda, this.programIds);\n const [noMint] = PDA.noMint(conditionPda, this.programIds);\n const [mintAuthority] = PDA.mintAuthority(conditionPda, this.programIds);\n const [collateralVault] = PDA.collateralVault(params.collateralMint, this.programIds);\n\n const tx = await this.program.methods\n .createQuestionAdmin({\n questionId: Array.from(questionId) as number[],\n contentHash: Array.from(contentHash) as number[],\n hookProgram: params.hookProgram,\n authorizedClob: params.authorizedClob,\n expirationTime: new anchor.BN(params.expirationTime),\n })\n .accounts({\n creator,\n payer,\n config: this.configPda,\n question: questionPda,\n currencyMint: params.collateralMint,\n oracle,\n condition: conditionPda,\n yesMint,\n noMint,\n mintAuthority,\n collateralVault,\n conditionalTokensProgram: this.programIds.conditionalTokens,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n rent: SYSVAR_RENT_PUBKEY,\n })\n .transaction();\n\n return { tx, questionPda, conditionPda, questionId };\n }\n\n async approveQuestion(\n questionPda: PublicKey,\n admin: PublicKey = this.walletPubkey,\n payer: PublicKey = admin\n ): Promise<Transaction> {\n return this.program.methods\n .approveQuestion()\n .accounts({\n admin,\n payer,\n config: this.configPda,\n question: questionPda,\n })\n .transaction();\n }\n\n async updateConfig(\n params: { newAdmin?: PublicKey; newOracle?: PublicKey; isPaused?: boolean; newConditionalTokensProgram?: PublicKey },\n authority: PublicKey = this.walletPubkey,\n payer: PublicKey = authority\n ): Promise<Transaction> {\n return this.program.methods\n .updateConfig({\n newAdmin: params.newAdmin ?? null,\n newOracle: params.newOracle ?? null,\n isPaused: params.isPaused ?? null,\n newConditionalTokensProgram: params.newConditionalTokensProgram ?? null,\n })\n .accounts({\n authority,\n payer,\n config: this.configPda,\n })\n .transaction();\n }\n\n /** Set the admin (owner only). Replaces any existing admin. */\n async addAdmin(\n newAdmin: PublicKey,\n owner: PublicKey = this.walletPubkey\n ): Promise<Transaction> {\n return this.program.methods\n .addAdmin(newAdmin)\n .accounts({\n owner,\n config: this.configPda,\n })\n .transaction();\n }\n\n /** Clear the admin (owner only). Sets admin to default pubkey. */\n async removeAdmin(\n owner: PublicKey = this.walletPubkey\n ): Promise<Transaction> {\n return this.program.methods\n .removeAdmin()\n .accounts({\n owner,\n config: this.configPda,\n })\n .transaction();\n }\n\n async addToWhitelist(\n address: PublicKey,\n authority: PublicKey = this.walletPubkey,\n payer: PublicKey = authority\n ): Promise<Transaction> {\n return this.program.methods\n .addToWhitelist(address)\n .accounts({\n authority,\n payer,\n config: this.configPda,\n })\n .transaction();\n }\n\n async removeFromWhitelist(\n address: PublicKey,\n authority: PublicKey = this.walletPubkey,\n payer: PublicKey = authority\n ): Promise<Transaction> {\n return this.program.methods\n .removeFromWhitelist(address)\n .accounts({\n authority,\n payer,\n config: this.configPda,\n })\n .transaction();\n }\n\n // ─── Queries ─────────────────────────────────────────────────────────────────\n\n async fetchConfig(): Promise<QuestionMarketConfig | null> {\n try {\n const acc = await (this.program.account as any).questionMarketConfig.fetch(this.configPda);\n return {\n owner: acc.owner,\n admin: acc.admin,\n oracle: acc.oracle,\n conditionalTokensProgram: acc.conditionalTokensProgram,\n questionCount: acc.questionCount.toNumber(),\n approvedCount: acc.approvedCount.toNumber(),\n rejectedCount: acc.rejectedCount.toNumber(),\n whitelist: acc.whitelist as PublicKey[],\n whitelistLen: acc.whitelistLen,\n isPaused: acc.isPaused,\n bump: acc.bump,\n };\n } catch {\n return null;\n }\n }\n\n async fetchQuestion(questionPda: PublicKey): Promise<Question | null> {\n try {\n const acc = await (this.program.account as any).question.fetch(questionPda);\n return {\n config: acc.config,\n questionId: new Uint8Array(acc.questionId),\n contentHash: new Uint8Array(acc.contentHash),\n expirationTime: acc.expirationTime.toNumber(),\n currencyMint: acc.currencyMint,\n creator: acc.creator,\n condition: acc.condition ?? null,\n status: this._parseStatus(acc.status),\n createdAt: acc.createdAt.toNumber(),\n approvedAt: acc.approvedAt.toNumber(),\n resolvedAt: acc.resolvedAt.toNumber(),\n bump: acc.bump,\n };\n } catch {\n return null;\n }\n }\n\n questionPda(questionId: Uint8Array): PublicKey {\n return PDA.question(this.configPda, questionId, this.programIds)[0];\n }\n\n private _parseStatus(raw: any): QuestionStatus {\n if (raw.pending !== undefined) return QuestionStatus.Pending;\n if (raw.approved !== undefined) return QuestionStatus.Approved;\n if (raw.rejected !== undefined) return QuestionStatus.Rejected;\n if (raw.resolved !== undefined) return QuestionStatus.Resolved;\n return QuestionStatus.Pending;\n }\n\n /**\n * Convenience: fetch YES and NO token balances for a question.\n * Returns null for each if question not approved or position not initialized.\n * Requires ctfClient to be injected (done automatically by XMarketSDK).\n */\n async fetchQuestionBalances(\n questionPda: PublicKey,\n owner: PublicKey\n ): Promise<{ yes: Position | null; no: Position | null }> {\n if (!this.ctfClient) return { yes: null, no: null };\n const q = await this.fetchQuestion(questionPda);\n if (!q || !q.condition) return { yes: null, no: null };\n return this.ctfClient.fetchBothPositions(q.condition, owner);\n }\n}\n","import * as anchor from \"@coral-xyz/anchor\";\nimport { Keypair, PublicKey, SystemProgram, SYSVAR_RENT_PUBKEY, TransactionInstruction } from \"@solana/web3.js\";\nimport {\n TOKEN_PROGRAM_ID,\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddressSync,\n} from \"@solana/spl-token\";\nimport { PDA } from \"../pda\";\nimport { ProgramIds } from \"../config/networks\";\nimport { Condition, CollateralVault, CtfConfig, Position, TxResult } from \"../types\";\n\nexport class CtfClient {\n private readonly program: anchor.Program;\n private readonly provider: anchor.AnchorProvider;\n private readonly programIds: ProgramIds;\n\n constructor(\n program: anchor.Program,\n provider: anchor.AnchorProvider,\n programIds: ProgramIds\n ) {\n this.program = program;\n this.provider = provider;\n this.programIds = programIds;\n }\n\n get walletPubkey(): PublicKey {\n return this.provider.wallet.publicKey;\n }\n\n // ─── Instructions ────────────────────────────────────────────────────────────\n\n /**\n * Create a Condition directly (bypasses QuestionMarket).\n * oracle is UncheckedAccount — set it to any pubkey (e.g. user wallet)\n * so that wallet can later sign reportPayouts.\n * payer covers rent for condition + mints.\n */\n async prepareCondition(\n questionId: Uint8Array,\n oracle: PublicKey,\n collateralMint: PublicKey,\n hookProgram: PublicKey,\n authorizedClob: PublicKey,\n payer: PublicKey = this.walletPubkey,\n signers: Keypair[] = []\n ): Promise<{ signature: string; conditionPda: PublicKey; yesMint: PublicKey; noMint: PublicKey }> {\n const [conditionPda] = PDA.condition(oracle, questionId, this.programIds);\n const [yesMint] = PDA.yesMint(conditionPda, this.programIds);\n const [noMint] = PDA.noMint(conditionPda, this.programIds);\n const [mintAuthority] = PDA.mintAuthority(conditionPda, this.programIds);\n const [collateralVault] = PDA.collateralVault(collateralMint, this.programIds);\n\n const sig = await this.program.methods\n .prepareCondition(\n Array.from(questionId) as number[],\n hookProgram,\n authorizedClob\n )\n .accounts({\n oracle,\n condition: conditionPda,\n yesMint,\n noMint,\n mintAuthority,\n collateralMint,\n collateralVault,\n payer,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n rent: SYSVAR_RENT_PUBKEY,\n })\n .signers(signers)\n .rpc({ skipPreflight: true });\n\n return { signature: sig, conditionPda, yesMint, noMint };\n }\n\n /** One-time setup. Caller becomes the CTF owner. Can only be called once. */\n async initializeCtfConfig(): Promise<TxResult> {\n const [ctfConfig] = PDA.ctfConfig(this.programIds);\n const sig = await this.program.methods\n .initializeCtfConfig()\n .accounts({\n payer: this.walletPubkey,\n ctfConfig,\n systemProgram: SystemProgram.programId,\n })\n .rpc();\n return { signature: sig };\n }\n\n /**\n * Create the shared collateral vault for a given collateral mint (e.g. USDC).\n * Only callable by the CTF owner (as stored in ctf_config).\n * authority defaults to the wallet — pass a different signer if needed.\n */\n async initializeVault(collateralMint: PublicKey): Promise<TxResult> {\n const [ctfConfig] = PDA.ctfConfig(this.programIds);\n const [collateralVault] = PDA.collateralVault(collateralMint, this.programIds);\n const [vaultTokenAccount] = PDA.vaultToken(collateralMint, this.programIds);\n const sig = await this.program.methods\n .initializeVault()\n .accounts({\n authority: this.walletPubkey,\n payer: this.walletPubkey,\n ctfConfig,\n collateralMint,\n collateralVault,\n vaultTokenAccount,\n systemProgram: SystemProgram.programId,\n tokenProgram: TOKEN_PROGRAM_ID,\n rent: SYSVAR_RENT_PUBKEY,\n })\n .rpc();\n return { signature: sig };\n }\n\n /**\n * Initialize an empty Position account (balance = 0) for a user.\n * Needed before redeemPositions when the user only holds the opposite outcome\n * (e.g. buyer received YES via CLOB match but never had a NO position).\n *\n * Idempotent — call `fetchPosition` first to skip if already initialized.\n */\n async initPosition(\n condition: PublicKey,\n outcomeIndex: number,\n user: PublicKey = this.walletPubkey\n ): Promise<TxResult> {\n const [position] = PDA.position(condition, outcomeIndex, user, this.programIds);\n const sig = await this.program.methods\n .initPosition(outcomeIndex)\n .accounts({\n user,\n condition,\n position,\n systemProgram: SystemProgram.programId,\n })\n .rpc();\n return { signature: sig };\n }\n\n /**\n * Split `amount` collateral into equal YES + NO tokens.\n * ATAs created automatically via `init_if_needed`.\n */\n async splitPosition(\n condition: PublicKey,\n collateralMint: PublicKey,\n amount: anchor.BN,\n user: PublicKey = this.walletPubkey,\n payer: PublicKey = this.walletPubkey,\n signers: Keypair[] = []\n ): Promise<TxResult> {\n const [collateralVault] = PDA.collateralVault(collateralMint, this.programIds);\n const [vaultTokenAccount] = PDA.vaultToken(collateralMint, this.programIds);\n const [yesMint] = PDA.yesMint(condition, this.programIds);\n const [noMint] = PDA.noMint(condition, this.programIds);\n const [mintAuthority] = PDA.mintAuthority(condition, this.programIds);\n const [yesPosition] = PDA.position(condition, 1, user, this.programIds);\n const [noPosition] = PDA.position(condition, 0, user, this.programIds);\n\n const userYesAta = getAssociatedTokenAddressSync(yesMint, user, false, TOKEN_2022_PROGRAM_ID);\n const userNoAta = getAssociatedTokenAddressSync(noMint, user, false, TOKEN_2022_PROGRAM_ID);\n const userCollateral = getAssociatedTokenAddressSync(collateralMint, user);\n\n const sig = await this.program.methods\n .splitPosition(amount)\n .accounts({\n user,\n payer,\n condition,\n collateralVault,\n vaultTokenAccount,\n userCollateral,\n yesMint,\n userYesAta,\n noMint,\n userNoAta,\n yesPosition,\n noPosition,\n mintAuthority,\n tokenProgram: TOKEN_PROGRAM_ID,\n token2022Program: TOKEN_2022_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .signers(signers)\n .rpc({ skipPreflight: true });\n return { signature: sig };\n }\n\n /**\n * Merge `amount` YES + NO tokens back into collateral.\n * Both token balances must be ≥ amount.\n */\n async mergePosition(\n condition: PublicKey,\n collateralMint: PublicKey,\n amount: anchor.BN,\n user: PublicKey = this.walletPubkey,\n payer: PublicKey = this.walletPubkey,\n signers: Keypair[] = []\n ): Promise<TxResult> {\n const [collateralVault] = PDA.collateralVault(collateralMint, this.programIds);\n const [vaultTokenAccount] = PDA.vaultToken(collateralMint, this.programIds);\n const [yesMint] = PDA.yesMint(condition, this.programIds);\n const [noMint] = PDA.noMint(condition, this.programIds);\n const [yesPosition] = PDA.position(condition, 1, user, this.programIds);\n const [noPosition] = PDA.position(condition, 0, user, this.programIds);\n\n const userYesAta = getAssociatedTokenAddressSync(yesMint, user, false, TOKEN_2022_PROGRAM_ID);\n const userNoAta = getAssociatedTokenAddressSync(noMint, user, false, TOKEN_2022_PROGRAM_ID);\n const userCollateral = getAssociatedTokenAddressSync(collateralMint, user);\n\n const sig = await this.program.methods\n .mergePosition(amount)\n .accounts({\n user,\n payer,\n condition,\n collateralVault,\n vaultTokenAccount,\n userCollateral,\n yesMint,\n userYesAta,\n noMint,\n userNoAta,\n yesPosition,\n noPosition,\n tokenProgram: TOKEN_PROGRAM_ID,\n token2022Program: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .signers(signers)\n .rpc({ skipPreflight: true });\n return { signature: sig };\n }\n\n /**\n * After condition resolves: burn outcome tokens proportional to payout\n * and receive USDC. Works for winning, losing, or both positions.\n */\n async redeemPositions(\n condition: PublicKey,\n collateralMint: PublicKey,\n user: PublicKey = this.walletPubkey,\n payer: PublicKey = this.walletPubkey,\n signers: Keypair[] = []\n ): Promise<TxResult> {\n const [collateralVault] = PDA.collateralVault(collateralMint, this.programIds);\n const [vaultTokenAccount] = PDA.vaultToken(collateralMint, this.programIds);\n const [yesMint] = PDA.yesMint(condition, this.programIds);\n const [noMint] = PDA.noMint(condition, this.programIds);\n const [yesPosition] = PDA.position(condition, 1, user, this.programIds);\n const [noPosition] = PDA.position(condition, 0, user, this.programIds);\n\n const userYesAta = getAssociatedTokenAddressSync(yesMint, user, false, TOKEN_2022_PROGRAM_ID);\n const userNoAta = getAssociatedTokenAddressSync(noMint, user, false, TOKEN_2022_PROGRAM_ID);\n const userCollateral = getAssociatedTokenAddressSync(collateralMint, user);\n\n const sig = await this.program.methods\n .redeemPositions()\n .accounts({\n user,\n payer,\n condition,\n collateralVault,\n vaultTokenAccount,\n userCollateral,\n yesMint,\n userYesAta,\n noMint,\n userNoAta,\n yesPosition,\n noPosition,\n tokenProgram: TOKEN_PROGRAM_ID,\n token2022Program: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .signers(signers)\n .rpc({ skipPreflight: true });\n return { signature: sig };\n }\n\n /**\n * Oracle directly resolves a condition with payout numerators.\n * Bypasses QuestionMarket — only for oracle-owned conditions.\n */\n async reportPayouts(\n condition: PublicKey,\n payoutNumerators: number[]\n ): Promise<TxResult> {\n const sig = await this.program.methods\n .reportPayouts(payoutNumerators.map((n) => new anchor.BN(n)))\n .accounts({\n oracle: this.walletPubkey,\n condition,\n })\n .rpc();\n return { signature: sig };\n }\n\n /**\n * Build the `transfer_position` instruction for use in a CLOB CPI.\n *\n * This instruction requires `clob_authority` (the CLOB's PDA) to sign.\n * A PDA can only sign from within its own program via CPI — this method\n * CANNOT be called directly from a wallet transaction.\n *\n * Use-cases:\n * - Custom CLOB implementations that call CTF.transfer_position via CPI\n * - Anchor CPI builders in other Rust programs\n *\n * @param condition - Condition PDA\n * @param outcomeMint - YES or NO mint\n * @param fromUser - Source wallet\n * @param fromTokenAccount - Source ATA\n * @param fromPosition - Source Position PDA\n * @param toUser - Destination wallet\n * @param toTokenAccount - Destination ATA (created if needed — payer covers rent)\n * @param toPosition - Destination Position PDA\n * @param payer - Pays rent for toPosition + toTokenAccount creation\n * @param clobAuthority - CLOB config PDA (must sign via CPI)\n * @param outcomeIndex - 0 = NO, 1 = YES\n * @param amount - Token amount to transfer\n */\n async transferPositionIx(\n condition: PublicKey,\n outcomeMint: PublicKey,\n fromUser: PublicKey,\n fromTokenAccount: PublicKey,\n fromPosition: PublicKey,\n toUser: PublicKey,\n toTokenAccount: PublicKey,\n toPosition: PublicKey,\n payer: PublicKey,\n clobAuthority: PublicKey,\n outcomeIndex: number,\n amount: anchor.BN\n ): Promise<TransactionInstruction> {\n return this.program.methods\n .transferPosition(outcomeIndex, amount)\n .accounts({\n payer,\n clobAuthority,\n condition,\n outcomeMint,\n fromUser,\n fromTokenAccount,\n fromPosition,\n toUser,\n toTokenAccount,\n toPosition,\n token2022Program: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n /**\n * Update the authorized CLOB on a condition.\n * Only callable by the condition's oracle (the wallet that signed createQuestion).\n */\n async updateAuthorizedClob(\n condition: PublicKey,\n newAuthorizedClob: PublicKey\n ): Promise<TxResult> {\n const sig = await this.program.methods\n .updateAuthorizedClob(newAuthorizedClob)\n .accounts({\n oracle: this.walletPubkey,\n condition,\n })\n .rpc();\n return { signature: sig };\n }\n\n // ─── Queries ─────────────────────────────────────────────────────────────────\n\n async fetchCtfConfig(): Promise<CtfConfig | null> {\n try {\n const [ctfConfig] = PDA.ctfConfig(this.programIds);\n const acc = await (this.program.account as any).ctfConfig.fetch(ctfConfig);\n return {\n owner: acc.owner,\n bump: acc.bump,\n };\n } catch {\n return null;\n }\n }\n\n async fetchCondition(conditionPda: PublicKey): Promise<Condition | null> {\n try {\n const acc = await (this.program.account as any).condition.fetch(conditionPda);\n return {\n oracle: acc.oracle,\n questionId: new Uint8Array(acc.questionId),\n outcomeSlotCount: acc.outcomeSlotCount,\n payoutNumerators: acc.payoutNumerators,\n payoutDenominator: acc.payoutDenominator,\n totalCollateral: acc.totalCollateral,\n collateralMint: acc.collateralMint,\n collateralVault: acc.collateralVault,\n yesMint: acc.yesMint,\n noMint: acc.noMint,\n hookProgram: acc.hookProgram,\n authorizedClob: acc.authorizedClob,\n isResolved: acc.isResolved,\n resolvedAt: acc.resolvedAt?.toNumber() ?? 0,\n bump: acc.bump,\n };\n } catch {\n return null;\n }\n }\n\n async fetchVault(collateralMint: PublicKey): Promise<CollateralVault | null> {\n try {\n const [vaultPda] = PDA.collateralVault(collateralMint, this.programIds);\n const acc = await (this.program.account as any).collateralVault.fetch(vaultPda);\n return {\n collateralMint: acc.collateralMint,\n vaultTokenAccount: acc.vaultTokenAccount,\n totalLocked: acc.totalLocked,\n conditionCount: acc.conditionCount,\n bump: acc.bump,\n vaultBump: acc.vaultBump,\n };\n } catch {\n return null;\n }\n }\n\n async fetchPosition(\n condition: PublicKey,\n outcomeIndex: number,\n owner: PublicKey = this.walletPubkey\n ): Promise<Position | null> {\n try {\n const [pda] = PDA.position(condition, outcomeIndex, owner, this.programIds);\n const acc = await (this.program.account as any).position.fetch(pda);\n return {\n owner: acc.owner,\n condition: acc.condition,\n outcomeIndex: acc.outcomeIndex,\n balance: acc.balance,\n bump: acc.bump,\n };\n } catch {\n return null;\n }\n }\n\n /** YES = outcome index 1, NO = outcome index 0. */\n async fetchBothPositions(\n condition: PublicKey,\n owner: PublicKey = this.walletPubkey\n ): Promise<{ yes: Position | null; no: Position | null }> {\n const [yes, no] = await Promise.all([\n this.fetchPosition(condition, 1, owner),\n this.fetchPosition(condition, 0, owner),\n ]);\n return { yes, no };\n }\n\n /** Thin wrapper: fetch position for a single outcome token (0=NO, 1=YES). */\n async fetchTokenBalance(\n condition: PublicKey,\n tokenId: number,\n owner: PublicKey = this.walletPubkey\n ): Promise<Position | null> {\n return this.fetchPosition(condition, tokenId, owner);\n }\n\n // ─── PDA helpers (public for consumers) ──────────────────────────────────────\n\n yesMintPda(condition: PublicKey): PublicKey {\n return PDA.yesMint(condition, this.programIds)[0];\n }\n\n noMintPda(condition: PublicKey): PublicKey {\n return PDA.noMint(condition, this.programIds)[0];\n }\n\n mintAuthorityPda(condition: PublicKey): PublicKey {\n return PDA.mintAuthority(condition, this.programIds)[0];\n }\n\n collateralVaultPda(collateralMint: PublicKey): PublicKey {\n return PDA.collateralVault(collateralMint, this.programIds)[0];\n }\n}\n","/**\n * Order signing utilities.\n *\n * Canonical message layout (178 bytes) — must match Rust `Order::to_signable_bytes()`:\n * [0..31] maker pubkey\n * [32..63] condition pubkey\n * [64] token_id (u8)\n * [65] side (u8)\n * [66..73] maker_amount (u64 le)\n * [74..81] taker_amount (u64 le)\n * [82..89] nonce (u64 le)\n * [90..97] expiry (i64 le)\n * [98..105] created_at (i64 le)\n * [106..113] fee (u64 le)\n * [114..145] taker pubkey\n * [146..177] signer pubkey\n */\nimport {\n TransactionInstruction,\n Ed25519Program,\n SYSVAR_INSTRUCTIONS_PUBKEY,\n} from \"@solana/web3.js\";\nimport { Order, SignedOrder } from \"./types\";\n\n// ─── Serialization ────────────────────────────────────────────────────────────\n\nexport function serializeOrderToBytes(order: Order): Uint8Array {\n const buf = new Uint8Array(178);\n\n buf.set(order.maker.toBytes(), 0);\n buf.set(order.condition.toBytes(), 32);\n buf[64] = order.tokenId;\n buf[65] = order.side;\n\n buf.set(order.makerAmount.toArrayLike(Buffer, \"le\", 8), 66);\n buf.set(order.takerAmount.toArrayLike(Buffer, \"le\", 8), 74);\n buf.set(order.nonce.toArrayLike(Buffer, \"le\", 8), 82);\n buf.set(order.expiry.toArrayLike(Buffer, \"le\", 8), 90);\n buf.set(order.createdAt.toArrayLike(Buffer, \"le\", 8), 98);\n buf.set(order.fee.toArrayLike(Buffer, \"le\", 8), 106);\n buf.set(order.taker.toBytes(), 114);\n buf.set(order.signer.toBytes(), 146);\n\n return buf;\n}\n\n// ─── Signing ──────────────────────────────────────────────────────────────────\n\n/**\n * Sign an order with a keypair's sign function.\n * The `signFn` receives the 98-byte canonical message and returns a 64-byte signature.\n *\n * Usage with a Keypair:\n * const signed = signOrder(order, (msg) => keypair.secretKey.slice(0,64) && nacl.sign.detached(msg, keypair.secretKey))\n *\n * Or use the convenience wrapper `signOrderWithKeypair` from this module.\n */\nexport async function signOrder(\n order: Order,\n signFn: (message: Uint8Array) => Uint8Array | Promise<Uint8Array>\n): Promise<SignedOrder> {\n const message = serializeOrderToBytes(order);\n const signature = await signFn(message);\n if (signature.length !== 64) throw new Error(\"signature must be 64 bytes\");\n return { order, signature };\n}\n\n// ─── Ed25519 instruction builder ─────────────────────────────────────────────\n\n/**\n * Build a single batched Ed25519 precompile instruction for N signed orders.\n *\n * All signatures are packed into one instruction (ix[0]).\n * The on-chain program reads sig[i] via `extract_order_from_ed25519_ix(sysvar, i)`.\n *\n * Batched layout saves ~12 bytes vs N separate Ed25519 instructions — critical for\n * fitting 1-taker + 2-maker transactions within Solana's 1232-byte raw tx limit.\n *\n * Data format:\n * [0] num_sigs (N)\n * [1] padding\n * [2+i*14] per-sig offset entries (14 bytes each)\n * Then: sigs (64B each), pubkeys (32B each), messages (178B each)\n */\nexport function buildBatchedEd25519Instruction(orders: SignedOrder[]): TransactionInstruction {\n const N = orders.length;\n if (N === 0) throw new Error(\"At least 1 order required\");\n\n const MSG_SIZE = 178;\n const SIG_SIZE = 64;\n const PK_SIZE = 32;\n const HEADER = 2 + N * 14;\n const sigBase = HEADER;\n const pkBase = sigBase + N * SIG_SIZE;\n const msgBase = pkBase + N * PK_SIZE;\n const totalSize = msgBase + N * MSG_SIZE;\n\n const data = Buffer.alloc(totalSize);\n data[0] = N;\n data[1] = 0;\n\n for (let i = 0; i < N; i++) {\n const e = 2 + i * 14;\n data.writeUInt16LE(sigBase + i * SIG_SIZE, e); // sig_offset\n data.writeUInt16LE(0xffff, e + 2); // sig_ix_index (this ix)\n data.writeUInt16LE(pkBase + i * PK_SIZE, e + 4); // pubkey_offset\n data.writeUInt16LE(0xffff, e + 6); // pubkey_ix_index (this ix)\n data.writeUInt16LE(msgBase + i * MSG_SIZE, e + 8); // msg_offset\n data.writeUInt16LE(MSG_SIZE, e + 10); // msg_size\n data.writeUInt16LE(0xffff, e + 12); // msg_ix_index (this ix)\n\n data.set(orders[i].signature, sigBase + i * SIG_SIZE);\n data.set(orders[i].order.maker.toBytes(), pkBase + i * PK_SIZE);\n data.set(serializeOrderToBytes(orders[i].order), msgBase + i * MSG_SIZE);\n }\n\n return new TransactionInstruction({\n keys: [],\n programId: Ed25519Program.programId,\n data,\n });\n}\n\n/**\n * The Solana instructions sysvar public key.\n * Pass this as `ixSysvar` to all match_* instruction accounts.\n */\nexport const IX_SYSVAR = SYSVAR_INSTRUCTIONS_PUBKEY;\n\n// ─── Anchor serialization helper ─────────────────────────────────────────────\n\n/**\n * Convert SignedOrder to the shape anchor expects for SignedOrder struct.\n * The signature must be passed as a fixed-size array of 64 numbers.\n */\nexport function _toAnchorSignedOrder(signed: SignedOrder) {\n const sig = Array.from(signed.signature);\n if (sig.length !== 64) throw new Error(\"signature must be 64 bytes\");\n return {\n order: {\n maker: signed.order.maker,\n condition: signed.order.condition,\n tokenId: signed.order.tokenId,\n side: signed.order.side,\n makerAmount: signed.order.makerAmount,\n takerAmount: signed.order.takerAmount,\n nonce: signed.order.nonce,\n expiry: signed.order.expiry,\n createdAt: signed.order.createdAt,\n fee: signed.order.fee,\n taker: signed.order.taker,\n signer: signed.order.signer,\n },\n signature: sig,\n };\n}\n","import * as anchor from \"@coral-xyz/anchor\";\nimport {\n PublicKey,\n SystemProgram,\n TransactionInstruction,\n TransactionMessage,\n VersionedTransaction,\n AddressLookupTableAccount,\n type Signer as SolanaSigner,\n} from \"@solana/web3.js\";\nimport {\n TOKEN_PROGRAM_ID,\n TOKEN_2022_PROGRAM_ID,\n getAssociatedTokenAddressSync,\n} from \"@solana/spl-token\";\nimport { PDA } from \"../pda\";\nimport { ProgramIds } from \"../config/networks\";\nimport {\n ClobConfig, ClobWhitelistEntry, OrderStatus, Order, SignedOrder, TxResult, InvalidParamError,\n} from \"../types\";\nimport { buildBatchedEd25519Instruction, IX_SYSVAR, _toAnchorSignedOrder } from \"../signing\";\n\nconst CLOB_WHITELIST_SEED = Buffer.from(\"clob_whitelist\");\n\nexport class ClobClient {\n private readonly program: anchor.Program;\n private readonly provider: anchor.AnchorProvider;\n private readonly programIds: ProgramIds;\n\n constructor(\n program: anchor.Program,\n provider: anchor.AnchorProvider,\n programIds: ProgramIds\n ) {\n this.program = program;\n this.provider = provider;\n this.programIds = programIds;\n }\n\n get walletPubkey(): PublicKey {\n return this.provider.wallet.publicKey;\n }\n\n /**\n * Send a match transaction as versioned (v0).\n * Pass a pre-built AddressLookupTableAccount to compress account keys and\n * stay under the 1232-byte limit — required for match_complementary which\n * has ~25 accounts + 2 Ed25519 precompile instructions (~1697 bytes raw).\n *\n * If `whitelistedWallet` is provided and differs from `this.provider.wallet`,\n * both wallets sign the transaction (whitelisted operator + payer).\n */\n private async _sendMatchTx(\n instructions: TransactionInstruction[],\n lookupTable?: AddressLookupTableAccount,\n whitelistedWallet?: anchor.Wallet,\n ): Promise<string> {\n const { connection } = this.provider;\n const { blockhash, lastValidBlockHeight } = await connection.getLatestBlockhash();\n // payer is this.provider.wallet; feePayer = payer.publicKey\n const message = new TransactionMessage({\n payerKey: this.walletPubkey,\n recentBlockhash: blockhash,\n instructions,\n }).compileToV0Message(lookupTable ? [lookupTable] : []);\n const vtx = new VersionedTransaction(message);\n const signers: SolanaSigner[] = [(this.provider.wallet as any).payer as SolanaSigner];\n if (\n whitelistedWallet &&\n !whitelistedWallet.publicKey.equals(this.walletPubkey)\n ) {\n signers.push((whitelistedWallet as any).payer as SolanaSigner);\n }\n vtx.sign(signers);\n const sig = await connection.sendRawTransaction(vtx.serialize(), {\n skipPreflight: false,\n });\n await connection.confirmTransaction(\n { signature: sig, blockhash, lastValidBlockHeight },\n \"confirmed\",\n );\n return sig;\n }\n\n /** PDA for a CLOB whitelist entry. */\n whitelistEntryPda(address: PublicKey): PublicKey {\n return PublicKey.findProgramAddressSync(\n [CLOB_WHITELIST_SEED, address.toBytes()],\n this.programIds.clobExchange,\n )[0];\n }\n\n configPda(): PublicKey {\n return PDA.clobConfig(this.programIds)[0];\n }\n\n // ─── Instructions ────────────────────────────────────────────────────────────\n\n /** One-time setup. Caller becomes admin. */\n async initialize(\n operators: PublicKey[],\n feeRecipient: PublicKey,\n feeRateBps: number\n ): Promise<TxResult> {\n const sig = await this.program.methods\n .initializeClob(\n operators,\n feeRecipient,\n feeRateBps,\n this.programIds.conditionalTokens\n )\n .accounts({\n owner: this.walletPubkey,\n clobConfig: this.configPda(),\n systemProgram: SystemProgram.programId,\n })\n .rpc();\n return { signature: sig };\n }\n\n /** Admin adds an operator to the whitelist. */\n async addOperator(operator: PublicKey): Promise<TxResult> {\n const sig = await this.program.methods\n .addOperator(operator)\n .accounts({\n owner: this.walletPubkey,\n clobConfig: this.configPda(),\n })\n .rpc();\n return { signature: sig };\n }\n\n /** Admin removes an operator from the whitelist. */\n async removeOperator(operator: PublicKey): Promise<TxResult> {\n const sig = await this.program.methods\n .removeOperator(operator)\n .accounts({\n owner: this.walletPubkey,\n clobConfig: this.configPda(),\n })\n .rpc();\n return { signature: sig };\n }\n\n /** Admin pause/unpause the CLOB. */\n async setPaused(paused: boolean): Promise<TxResult> {\n const sig = await this.program.methods\n .setPaused(paused)\n .accounts({\n owner: this.walletPubkey,\n clobConfig: this.configPda(),\n })\n .rpc();\n return { signature: sig };\n }\n\n /**\n * Maker cancels their own order.\n * OrderStatus PDA is marked cancelled — any future fill rejected.\n */\n async cancelOrder(nonce: anchor.BN): Promise<TxResult> {\n const maker = this.walletPubkey;\n const [orderStatus] = PDA.orderStatus(maker, nonce, this.programIds);\n const sig = await this.program.methods\n .cancelOrder(nonce)\n .accounts({\n signer: maker,\n clobConfig: this.configPda(),\n maker,\n orderStatus,\n systemProgram: SystemProgram.programId,\n })\n .rpc();\n return { signature: sig };\n }\n\n /**\n * Emergency reset of CLOB config (upgrade authority only).\n */\n async forceResetClob(\n programData: PublicKey,\n newAdmin: PublicKey,\n newOperators: PublicKey[],\n newFeeRecipient: PublicKey,\n newFeeRateBps: number\n ): Promise<TxResult> {\n const sig = await this.program.methods\n .forceResetClob(newAdmin, newOperators, newFeeRecipient, newFeeRateBps)\n .accounts({\n upgradeAuthority: this.walletPubkey,\n programData,\n clobConfig: this.configPda(),\n })\n .rpc();\n return { signature: sig };\n }\n\n /**\n * COMPLEMENTARY match: 1 buyer (taker) + N sellers (makers), same tokenId.\n *\n * Transaction structure:\n * ix[0] Ed25519(taker/buyer)\n * ix[1+i] Ed25519(maker_i/seller_i)\n * ix[N+1] match_complementary(buyNonce, makerNonces[])\n *\n * remaining_accounts: [hook×3] [seller×5 × N]\n */\n private async matchComplementary(\n buySigned: SignedOrder,\n makersSigned: SignedOrder[],\n collateralMint: PublicKey,\n feeRecipient: PublicKey,\n whitelistedWallet: anchor.Wallet,\n lookupTable?: AddressLookupTableAccount,\n ): Promise<TxResult> {\n const condition = buySigned.order.condition;\n const tokenId = buySigned.order.tokenId;\n\n const [outcomeMint] = tokenId === 1\n ? PDA.yesMint(condition, this.programIds)\n : PDA.noMint(condition, this.programIds);\n\n const buyer = buySigned.order.maker;\n const buyerCollateral = getAssociatedTokenAddressSync(collateralMint, buyer);\n const buyerTokenAccount = getAssociatedTokenAddressSync(outcomeMint, buyer, false, TOKEN_2022_PROGRAM_ID);\n const [buyerPosition] = PDA.position(condition, tokenId, buyer, this.programIds);\n const [buyOrderStatus] = PDA.orderStatus(buyer, buySigned.order.nonce, this.programIds);\n\n const [extraAccountMetaList] = PDA.extraAccountMetaList(outcomeMint, this.programIds);\n const [hookConfig] = PDA.hookConfig(this.programIds);\n const hookAccounts = [\n { pubkey: extraAccountMetaList, isSigner: false, isWritable: false },\n { pubkey: hookConfig, isSigner: false, isWritable: false },\n { pubkey: this.programIds.hook, isSigner: false, isWritable: false },\n ];\n\n const makerAccounts = makersSigned.flatMap(m => {\n const seller = m.order.maker;\n const sellerTokenAccount = getAssociatedTokenAddressSync(outcomeMint, seller, false, TOKEN_2022_PROGRAM_ID);\n const [sellerPosition] = PDA.position(condition, tokenId, seller, this.programIds);\n const sellerCollateral = getAssociatedTokenAddressSync(collateralMint, seller);\n const [sellOrderStatus] = PDA.orderStatus(seller, m.order.nonce, this.programIds);\n return [\n { pubkey: seller, isSigner: false, isWritable: false },\n { pubkey: sellerTokenAccount, isSigner: false, isWritable: true },\n { pubkey: sellerPosition, isSigner: false, isWritable: true },\n { pubkey: sellerCollateral, isSigner: false, isWritable: true },\n { pubkey: sellOrderStatus, isSigner: false, isWritable: true },\n ];\n });\n\n const whitelisted = whitelistedWallet.publicKey;\n const whitelistEntry = this.whitelistEntryPda(whitelisted);\n const makerNonces = makersSigned.map(m => m.order.nonce);\n\n const ed25519Ixs = [\n buildBatchedEd25519Instruction([buySigned, ...makersSigned]),\n ];\n\n const matchIx = await this.program.methods\n .matchComplementary(buySigned.order.nonce, makerNonces)\n .accounts({\n whitelisted,\n payer: this.walletPubkey,\n whitelistEntry,\n clobConfig: this.configPda(),\n ixSysvar: IX_SYSVAR,\n condition,\n buyer,\n buyerCollateral,\n buyerTokenAccount,\n buyerPosition,\n buyOrderStatus,\n outcomeMint,\n feeRecipient,\n conditionalTokensProgram: this.programIds.conditionalTokens,\n tokenProgram: TOKEN_PROGRAM_ID,\n token2022Program: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .remainingAccounts([...hookAccounts, ...makerAccounts])\n .instruction();\n\n const sig = await this._sendMatchTx(\n [...ed25519Ixs, matchIx],\n lookupTable,\n whitelistedWallet,\n );\n return { signature: sig };\n }\n\n /**\n * MINT match: 1 YES buyer (taker) + N NO buyers (makers).\n *\n * Transaction structure:\n * ix[0] Ed25519(taker/YES buyer)\n * ix[1+i] Ed25519(maker_i/NO buyer)\n * ix[N+1] match_mint_orders(yesNonce, makerNonces[])\n *\n * remaining_accounts: [maker×5 × N] (no hook accounts — mint_to doesn't fire hook)\n */\n private async matchMintOrders(\n yesSigned: SignedOrder,\n makersSigned: SignedOrder[],\n collateralMint: PublicKey,\n whitelistedWallet: anchor.Wallet,\n lookupTable?: AddressLookupTableAccount,\n ): Promise<TxResult> {\n const condition = yesSigned.order.condition;\n\n const [yesMint] = PDA.yesMint(condition, this.programIds);\n const [noMint] = PDA.noMint(condition, this.programIds);\n const [mintAuthority] = PDA.mintAuthority(condition, this.programIds);\n const [collateralVault] = PDA.collateralVault(collateralMint, this.programIds);\n const [vaultTokenAccount] = PDA.vaultToken(collateralMint, this.programIds);\n const [clobAuthority] = PDA.clobConfig(this.programIds);\n\n const buyerYes = yesSigned.order.maker;\n const buyerYesCollateral = getAssociatedTokenAddressSync(collateralMint, buyerYes);\n const buyerYesTokenAccount = getAssociatedTokenAddressSync(yesMint, buyerYes, false, TOKEN_2022_PROGRAM_ID);\n const [buyerYesPosition] = PDA.position(condition, 1, buyerYes, this.programIds);\n const [yesOrderStatus] = PDA.orderStatus(buyerYes, yesSigned.order.nonce, this.programIds);\n\n const makerAccounts = makersSigned.flatMap(m => {\n const maker = m.order.maker;\n const makerUsdcAta = getAssociatedTokenAddressSync(collateralMint, maker);\n const makerNoAta = getAssociatedTokenAddressSync(noMint, maker, false, TOKEN_2022_PROGRAM_ID);\n const [makerNoPosition] = PDA.position(condition, 0, maker, this.programIds);\n const [makerOrderStatus] = PDA.orderStatus(maker, m.order.nonce, this.programIds);\n return [\n { pubkey: maker, isSigner: false, isWritable: false },\n { pubkey: makerUsdcAta, isSigner: false, isWritable: true },\n { pubkey: makerNoAta, isSigner: false, isWritable: true },\n { pubkey: makerNoPosition, isSigner: false, isWritable: true },\n { pubkey: makerOrderStatus,isSigner: false, isWritable: true },\n ];\n });\n\n const whitelisted = whitelistedWallet.publicKey;\n const whitelistEntry = this.whitelistEntryPda(whitelisted);\n const makerNonces = makersSigned.map(m => m.order.nonce);\n\n const ed25519Ixs = [\n buildBatchedEd25519Instruction([yesSigned, ...makersSigned]),\n ];\n\n const matchIx = await this.program.methods\n .matchMintOrders(yesSigned.order.nonce, makerNonces)\n .accounts({\n whitelisted,\n payer: this.walletPubkey,\n whitelistEntry,\n clobConfig: this.configPda(),\n ixSysvar: IX_SYSVAR,\n condition,\n buyerYes,\n buyerYesCollateral,\n buyerYesTokenAccount,\n buyerYesPosition,\n yesOrderStatus,\n collateralVault,\n vaultTokenAccount,\n yesMint,\n noMint,\n mintAuthority,\n clobAuthority,\n conditionalTokensProgram: this.programIds.conditionalTokens,\n collateralTokenProgram: TOKEN_PROGRAM_ID,\n token2022Program: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .remainingAccounts(makerAccounts)\n .instruction();\n\n const sig = await this._sendMatchTx(\n [...ed25519Ixs, matchIx],\n lookupTable,\n whitelistedWallet,\n );\n return { signature: sig };\n }\n\n /**\n * MERGE match: 1 YES seller (taker) + N NO sellers (makers).\n *\n * Transaction structure:\n * ix[0] Ed25519(taker/YES seller)\n * ix[1+i] Ed25519(maker_i/NO seller)\n * ix[N+1] match_merge_orders(yesNonce, makerNonces[])\n *\n * remaining_accounts: [maker×5 × N] (no hook accounts — burn doesn't fire hook)\n */\n private async matchMergeOrders(\n yesSigned: SignedOrder,\n makersSigned: SignedOrder[],\n collateralMint: PublicKey,\n whitelistedWallet: anchor.Wallet,\n lookupTable?: AddressLookupTableAccount,\n ): Promise<TxResult> {\n const condition = yesSigned.order.condition;\n\n const [yesMint] = PDA.yesMint(condition, this.programIds);\n const [noMint] = PDA.noMint(condition, this.programIds);\n const [collateralVault] = PDA.collateralVault(collateralMint, this.programIds);\n const [vaultTokenAccount] = PDA.vaultToken(collateralMint, this.programIds);\n const [clobAuthority] = PDA.clobConfig(this.programIds);\n\n const sellerYes = yesSigned.order.maker;\n const sellerYesTokenAccount = getAssociatedTokenAddressSync(yesMint, sellerYes, false, TOKEN_2022_PROGRAM_ID);\n const [sellerYesPosition] = PDA.position(condition, 1, sellerYes, this.programIds);\n const sellerYesCollateral = getAssociatedTokenAddressSync(collateralMint, sellerYes);\n const [yesOrderStatus] = PDA.orderStatus(sellerYes, yesSigned.order.nonce, this.programIds);\n\n const makerAccounts = makersSigned.flatMap(m => {\n const maker = m.order.maker;\n const makerNoAta = getAssociatedTokenAddressSync(noMint, maker, false, TOKEN_2022_PROGRAM_ID);\n const [makerNoPosition] = PDA.position(condition, 0, maker, this.programIds);\n const makerUsdcAta = getAssociatedTokenAddressSync(collateralMint, maker);\n const [makerOrderStatus] = PDA.orderStatus(maker, m.order.nonce, this.programIds);\n return [\n { pubkey: maker, isSigner: false, isWritable: false },\n { pubkey: makerNoAta, isSigner: false, isWritable: true },\n { pubkey: makerNoPosition, isSigner: false, isWritable: true },\n { pubkey: makerUsdcAta, isSigner: false, isWritable: true },\n { pubkey: makerOrderStatus,isSigner: false, isWritable: true },\n ];\n });\n\n const whitelisted = whitelistedWallet.publicKey;\n const whitelistEntry = this.whitelistEntryPda(whitelisted);\n const makerNonces = makersSigned.map(m => m.order.nonce);\n\n const ed25519Ixs = [\n buildBatchedEd25519Instruction([yesSigned, ...makersSigned]),\n ];\n\n const matchIx = await this.program.methods\n .matchMergeOrders(yesSigned.order.nonce, makerNonces)\n .accounts({\n whitelisted,\n payer: this.walletPubkey,\n whitelistEntry,\n clobConfig: this.configPda(),\n ixSysvar: IX_SYSVAR,\n condition,\n sellerYes,\n sellerYesTokenAccount,\n sellerYesPosition,\n sellerYesCollateral,\n yesOrderStatus,\n collateralVault,\n vaultTokenAccount,\n yesMint,\n noMint,\n clobAuthority,\n conditionalTokensProgram: this.programIds.conditionalTokens,\n collateralTokenProgram: TOKEN_PROGRAM_ID,\n token2022Program: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .remainingAccounts(makerAccounts)\n .instruction();\n\n const sig = await this._sendMatchTx(\n [...ed25519Ixs, matchIx],\n lookupTable,\n whitelistedWallet,\n );\n return { signature: sig };\n }\n\n /**\n * Auto-detect match type and execute 1-taker + N-makers in a single transaction.\n *\n * Detection (pure, no RPC) based on taker.order vs makers[0].order:\n * taker.tokenId === makers[0].tokenId: taker BUY + all makers SELL → COMPLEMENTARY\n * taker.tokenId !== makers[0].tokenId + taker BUY + all makers BUY → MINT\n * taker.tokenId !== makers[0].tokenId + taker SELL + all makers SELL → MERGE\n * Otherwise → throws InvalidParamError\n *\n * All makers must have the same tokenId and side as makers[0].\n */\n async matchOrders(\n taker: SignedOrder,\n makers: SignedOrder[],\n collateralMint: PublicKey,\n feeRecipient: PublicKey,\n whitelistedWallet: anchor.Wallet,\n lookupTable?: AddressLookupTableAccount,\n ): Promise<TxResult> {\n if (makers.length === 0) throw new InvalidParamError(\"At least 1 maker required\");\n const t = taker.order;\n const m0 = makers[0].order;\n const SIDE_BUY = 1;\n const SIDE_SELL = 0;\n\n if (t.tokenId === m0.tokenId) {\n // COMPLEMENTARY: taker BUY, all makers SELL\n if (t.side === SIDE_BUY && makers.every(m => m.order.side === SIDE_SELL)) {\n return this.matchComplementary(taker, makers, collateralMint, feeRecipient, whitelistedWallet, lookupTable);\n }\n // COMPLEMENTARY reversed: taker SELL, all makers BUY — swap perspective\n if (t.side === SIDE_SELL && makers.every(m => m.order.side === SIDE_BUY)) {\n // Not supported in N-maker model (taker must be the buyer)\n throw new InvalidParamError(\"COMPLEMENTARY N-maker: taker must be the BUY side\");\n }\n throw new InvalidParamError(\"COMPLEMENTARY requires taker=BUY, makers=SELL on same tokenId\");\n }\n\n // MINT or MERGE: complementary tokenIds\n const allBuy = t.side === SIDE_BUY && makers.every(m => m.order.side === SIDE_BUY);\n const allSell = t.side === SIDE_SELL && makers.every(m => m.order.side === SIDE_SELL);\n\n if (!allBuy && !allSell) {\n throw new InvalidParamError(\"MINT/MERGE: all orders must be the same side (all BUY or all SELL)\");\n }\n\n // Sort taker as YES (tokenId=1)\n if (t.tokenId !== 1) {\n throw new InvalidParamError(\"MINT/MERGE: taker must be the YES side (tokenId=1)\");\n }\n if (!makers.every(m => m.order.tokenId === 0)) {\n throw new InvalidParamError(\"MINT/MERGE: all makers must be the NO side (tokenId=0)\");\n }\n\n if (allBuy) {\n return this.matchMintOrders(taker, makers, collateralMint, whitelistedWallet, lookupTable);\n }\n return this.matchMergeOrders(taker, makers, collateralMint, whitelistedWallet, lookupTable);\n }\n\n // ─── Whitelist admin ─────────────────────────────────────────────────────────\n\n /** Add an address to the CLOB whitelist (owner only). */\n async addToWhitelist(address: PublicKey): Promise<TxResult> {\n const whitelistEntry = this.whitelistEntryPda(address);\n const sig = await this.program.methods\n .addToClobWhitelist(address)\n .accounts({\n owner: this.walletPubkey,\n payer: this.walletPubkey,\n clobConfig: this.configPda(),\n whitelistEntry,\n systemProgram: SystemProgram.programId,\n })\n .rpc();\n return { signature: sig };\n }\n\n /** Batch-add addresses to the CLOB whitelist (owner only). All PDAs created in one tx. */\n async addToWhitelistBatch(addresses: PublicKey[]): Promise<TxResult> {\n if (addresses.length === 0) throw new InvalidParamError(\"At least 1 address required\");\n const remainingAccounts = addresses.map(addr => ({\n pubkey: this.whitelistEntryPda(addr),\n isSigner: false,\n isWritable: true,\n }));\n const sig = await this.program.methods\n .addToClobWhitelistBatch(addresses)\n .accounts({\n owner: this.walletPubkey,\n payer: this.walletPubkey,\n clobConfig: this.configPda(),\n systemProgram: SystemProgram.programId,\n })\n .remainingAccounts(remainingAccounts)\n .rpc();\n return { signature: sig };\n }\n\n /** Remove an address from the CLOB whitelist (owner only). */\n async removeFromWhitelist(address: PublicKey, rentReceiver?: PublicKey): Promise<TxResult> {\n const whitelistEntry = this.whitelistEntryPda(address);\n const sig = await this.program.methods\n .removeFromClobWhitelist(address)\n .accounts({\n owner: this.walletPubkey,\n rentReceiver: rentReceiver ?? this.walletPubkey,\n clobConfig: this.configPda(),\n whitelistEntry,\n })\n .rpc();\n return { signature: sig };\n }\n\n /** Fetch a whitelist entry PDA (returns null if address is not whitelisted). */\n async fetchWhitelistEntry(address: PublicKey): Promise<ClobWhitelistEntry | null> {\n try {\n const pda = this.whitelistEntryPda(address);\n const acc = await (this.program.account as any).clobWhitelistEntry.fetch(pda);\n return { address: acc.address, bump: acc.bump };\n } catch {\n return null;\n }\n }\n\n /** Check if an address is on the CLOB whitelist. */\n async isWhitelisted(address: PublicKey): Promise<boolean> {\n return (await this.fetchWhitelistEntry(address)) !== null;\n }\n\n /** Fetch all whitelisted addresses (scans all ClobWhitelistEntry accounts). */\n async fetchWhitelist(): Promise<PublicKey[]> {\n const entries = await (this.program.account as any).clobWhitelistEntry.all();\n return entries.map((e: any) => e.account.address as PublicKey);\n }\n\n // ─── Queries ─────────────────────────────────────────────────────────────────\n\n async fetchConfig(): Promise<ClobConfig | null> {\n try {\n const acc = await (this.program.account as any).clobConfig.fetch(this.configPda());\n return {\n owner: acc.owner,\n operators: acc.operators as PublicKey[],\n operatorsLen: acc.operatorsLen,\n feeRecipient: acc.feeRecipient,\n feeRateBps: acc.feeRateBps,\n conditionalTokensProgram: acc.conditionalTokensProgram,\n isPaused: acc.isPaused,\n bump: acc.bump,\n };\n } catch {\n return null;\n }\n }\n\n async fetchOrderStatus(maker: PublicKey, nonce: anchor.BN): Promise<OrderStatus | null> {\n try {\n const [pda] = PDA.orderStatus(maker, nonce, this.programIds);\n const acc = await (this.program.account as any).orderStatus.fetch(pda);\n return {\n maker: acc.maker,\n nonce: acc.nonce,\n isCancelled: acc.isCancelled,\n filledAmount: acc.filledAmount,\n bump: acc.bump,\n };\n } catch {\n return null;\n }\n }\n\n async isOrderCancelled(maker: PublicKey, nonce: anchor.BN): Promise<boolean> {\n const status = await this.fetchOrderStatus(maker, nonce);\n return status?.isCancelled === true;\n }\n}\n","import * as anchor from \"@coral-xyz/anchor\";\nimport { Connection, PublicKey } from \"@solana/web3.js\";\nimport { NetworkConfig, ProgramIds } from \"./config/networks\";\nimport { OracleClient } from \"./programs/oracle\";\nimport { HookClient } from \"./programs/hook\";\nimport { MarketClient } from \"./programs/market\";\nimport { CtfClient } from \"./programs/ctf\";\nimport { ClobClient } from \"./programs/clob\";\n\nimport oracleIdl from \"./idls/oracle.json\";\nimport hookIdl from \"./idls/hook.json\";\nimport questionMarketIdl from \"./idls/question_market.json\";\nimport conditionalTokensIdl from \"./idls/conditional_tokens.json\";\nimport clobExchangeIdl from \"./idls/clob_exchange.json\";\n\nexport class XMarketSDK {\n readonly provider: anchor.AnchorProvider;\n readonly networkConfig: NetworkConfig;\n\n private readonly _programIds: ProgramIds;\n private readonly _marketOwner: PublicKey;\n\n private _oracle?: OracleClient;\n private _hook?: HookClient;\n private _market?: MarketClient;\n private _ctf?: CtfClient;\n private _clob?: ClobClient;\n\n constructor(\n config: NetworkConfig,\n wallet: anchor.Wallet,\n marketOwner?: PublicKey,\n ) {\n this.networkConfig = config;\n this.provider = new anchor.AnchorProvider(\n new Connection(config.rpcUrl, \"confirmed\"),\n wallet,\n { commitment: \"confirmed\", preflightCommitment: \"confirmed\" },\n );\n anchor.setProvider(this.provider);\n this._programIds = config.programIds;\n this._marketOwner = marketOwner ?? wallet.publicKey;\n }\n\n private _withAddress(idl: object, address: PublicKey): anchor.Idl {\n return { ...idl, address: address.toBase58() } as anchor.Idl;\n }\n\n get oracle(): OracleClient {\n if (!this._oracle) {\n const program = new anchor.Program(this._withAddress(oracleIdl, this._programIds.oracle), this.provider);\n this._oracle = new OracleClient(program, this.provider, this._programIds);\n }\n return this._oracle;\n }\n\n get hook(): HookClient {\n if (!this._hook) {\n const program = new anchor.Program(this._withAddress(hookIdl, this._programIds.hook), this.provider);\n this._hook = new HookClient(program, this.provider, this._programIds);\n }\n return this._hook;\n }\n\n get market(): MarketClient {\n if (!this._market) {\n const program = new anchor.Program(this._withAddress(questionMarketIdl, this._programIds.questionMarket), this.provider);\n this._market = new MarketClient(program, this.provider, this._programIds, this._marketOwner);\n this._market.ctfClient = this.ctf;\n }\n return this._market;\n }\n\n get ctf(): CtfClient {\n if (!this._ctf) {\n const program = new anchor.Program(this._withAddress(conditionalTokensIdl, this._programIds.conditionalTokens), this.provider);\n this._ctf = new CtfClient(program, this.provider, this._programIds);\n }\n return this._ctf;\n }\n\n get clob(): ClobClient {\n if (!this._clob) {\n const program = new anchor.Program(this._withAddress(clobExchangeIdl, this._programIds.clobExchange), this.provider);\n this._clob = new ClobClient(program, this.provider, this._programIds);\n }\n return this._clob;\n }\n}\n","/**\n * High-level order utilities — build, sign, serialize, verify, detect match type.\n *\n * These helpers layer on top of the low-level `signing.ts` primitives and\n * provide a convenient interface for both the browser (wallet adapters) and\n * Node.js (Keypair-based) environments.\n */\nimport { Keypair, PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport * as nacl from \"tweetnacl\";\nimport { Order, SignedOrder, InvalidParamError } from \"./types\";\nimport { serializeOrderToBytes, signOrder } from \"./signing\";\n\n// ─── Order factory ────────────────────────────────────────────────────────────\n\n/**\n * Build a fully-populated Order.\n * Sets `signer = maker` (proxy not yet supported).\n * `taker` defaults to new PublicKey(new Uint8Array(32)) (public order).\n * `createdAt` defaults to current Unix timestamp.\n * `fee` defaults to 0 (use global fee_rate_bps).\n */\nexport function buildOrder(params: {\n maker: PublicKey;\n condition: PublicKey;\n tokenId: number;\n side: number;\n makerAmount: BN;\n takerAmount: BN;\n nonce?: BN;\n expiry?: BN;\n createdAt?: BN;\n fee?: BN;\n taker?: PublicKey;\n}): Order {\n return {\n maker: params.maker,\n condition: params.condition,\n tokenId: params.tokenId,\n side: params.side,\n makerAmount: params.makerAmount,\n takerAmount: params.takerAmount,\n nonce: params.nonce ?? new BN(Date.now()),\n expiry: params.expiry ?? new BN(0),\n createdAt: params.createdAt ?? new BN(Math.floor(Date.now() / 1000)),\n fee: params.fee ?? new BN(0),\n taker: params.taker ?? new PublicKey(new Uint8Array(32)),\n signer: params.maker,\n };\n}\n\n// ─── Signing helpers ──────────────────────────────────────────────────────────\n\n/**\n * Sign an order with a Keypair.\n * Uses Ed25519 (nacl.sign.detached) over the 178-byte canonical message.\n */\nexport function signOrderWithKeypair(order: Order, keypair: Keypair): SignedOrder {\n const message = serializeOrderToBytes(order);\n const signature = nacl.sign.detached(message, keypair.secretKey);\n return { order, signature };\n}\n\n/** Return the 178-byte canonical message that gets signed for an order. */\nexport function getOrderSignBytes(order: Order): Uint8Array {\n return serializeOrderToBytes(order);\n}\n\n// ─── Serialization ────────────────────────────────────────────────────────────\n\n/** Serialize a SignedOrder to bytes: 178 (order) + 64 (sig) = 242 bytes. */\nexport function serializeSignedOrder(signed: SignedOrder): Uint8Array {\n const orderBytes = serializeOrderToBytes(signed.order);\n const buf = new Uint8Array(242);\n buf.set(orderBytes, 0);\n buf.set(signed.signature, 178);\n return buf;\n}\n\n/**\n * Deserialize 242 bytes back to a SignedOrder.\n * Field layout mirrors `serializeOrderToBytes()` + 64-byte signature.\n */\nexport function deserializeSignedOrder(bytes: Uint8Array): SignedOrder {\n if (bytes.length !== 242) throw new InvalidParamError(\"SignedOrder must be 242 bytes\");\n\n const readPubkey = (offset: number) => new PublicKey(bytes.slice(offset, offset + 32));\n const readU64 = (offset: number) => new BN(bytes.slice(offset, offset + 8), \"le\");\n const readI64 = (offset: number) => new BN(bytes.slice(offset, offset + 8), \"le\");\n\n const order: Order = {\n maker: readPubkey(0),\n condition: readPubkey(32),\n tokenId: bytes[64],\n side: bytes[65],\n makerAmount: readU64(66),\n takerAmount: readU64(74),\n nonce: readU64(82),\n expiry: readI64(90),\n createdAt: readI64(98),\n fee: readU64(106),\n taker: readPubkey(114),\n signer: readPubkey(146),\n };\n const signature = bytes.slice(178, 242);\n return { order, signature };\n}\n\n// ─── Verification ─────────────────────────────────────────────────────────────\n\n/**\n * Verify the Ed25519 signature on a signed order.\n * Returns true only if the signature is valid for `order.maker` (or `order.signer`).\n */\nexport function verifySignedOrder(signed: SignedOrder): boolean {\n const message = serializeOrderToBytes(signed.order);\n return nacl.sign.detached.verify(\n message,\n signed.signature,\n signed.order.signer.toBytes(),\n );\n}\n\n// ─── Match type detection ─────────────────────────────────────────────────────\n\nexport type MatchType = \"COMPLEMENTARY\" | \"MINT\" | \"MERGE\";\n\n/**\n * Detect the match type from two orders (pure, no RPC).\n *\n * | tokenId A === B | sides | type |\n * |-----------------|--------------|---------------|\n * | yes | one BUY+SELL | COMPLEMENTARY |\n * | no | both BUY | MINT |\n * | no | both SELL | MERGE |\n */\nexport function detectMatchType(a: Order | SignedOrder, b: Order | SignedOrder): MatchType {\n const _a = \"order\" in a ? a.order : a;\n const _b = \"order\" in b ? b.order : b;\n return _detectMatchType(_a, _b);\n}\n\nfunction _detectMatchType(a: Order, b: Order): MatchType {\n const SIDE_BUY = 1;\n const SIDE_SELL = 0;\n\n if (a.tokenId === b.tokenId) {\n const aBuy = a.side === SIDE_BUY;\n const bBuy = b.side === SIDE_BUY;\n if (aBuy !== bBuy) return \"COMPLEMENTARY\";\n throw new InvalidParamError(\n \"Orders with same tokenId must be one BUY and one SELL (COMPLEMENTARY)\"\n );\n }\n\n const aBuy = a.side === SIDE_BUY;\n const bBuy = b.side === SIDE_BUY;\n if (aBuy && bBuy) return \"MINT\";\n if (!aBuy && !bBuy) return \"MERGE\";\n throw new InvalidParamError(\n \"Orders with different tokenIds must both be BUY (MINT) or both SELL (MERGE)\"\n );\n}\n\nexport { signOrder };\n","/**\n * SPL Token / Token-2022 approve utilities for the CLOB matching flow.\n *\n * Before a match instruction can transfer tokens on behalf of a user, the user\n * must approve the CLOB config PDA as a delegate. These helpers build the\n * approve transactions that need two signers:\n * - signer = the token owner (user wallet — must sign the approve instruction)\n * - payer = the BE wallet (pays transaction fees)\n *\n * Both must sign the resulting Transaction before sending.\n */\nimport {\n PublicKey,\n Transaction,\n SystemProgram,\n} from \"@solana/web3.js\";\nimport {\n TOKEN_PROGRAM_ID,\n TOKEN_2022_PROGRAM_ID,\n getAssociatedTokenAddressSync,\n createApproveInstruction,\n} from \"@solana/spl-token\";\nimport BN from \"bn.js\";\nimport { PDA } from \"./pda\";\nimport { ProgramIds } from \"./config/networks\";\n\n/** Maximum u64 — approve \"unlimited\" amount. */\nexport const MAX_APPROVE_AMOUNT = new BN(\"18446744073709551615\");\n\n// ─── Collateral (SPL Token) approve ──────────────────────────────────────────\n\n/**\n * Build a Transaction that approves the CLOB config PDA to transfer collateral\n * (USDC) from the signer's ATA.\n *\n * Required signers: signer (token owner), payer (fee payer).\n *\n * @param collateralMint - e.g. USDC mint\n * @param signer - token owner (must sign)\n * @param payer - fee payer wallet pubkey\n * @param delegate - clob config PDA (the spender)\n * @param amount - amount to approve (defaults to MAX_APPROVE_AMOUNT)\n */\nexport function buildApproveCollateralTx(\n collateralMint: PublicKey,\n signer: PublicKey,\n payer: PublicKey,\n delegate: PublicKey,\n amount: BN = MAX_APPROVE_AMOUNT,\n): Transaction {\n const ownerAta = getAssociatedTokenAddressSync(collateralMint, signer, false, TOKEN_PROGRAM_ID);\n const approveIx = createApproveInstruction(\n ownerAta,\n delegate,\n signer,\n BigInt(amount.toString()),\n [],\n TOKEN_PROGRAM_ID,\n );\n const tx = new Transaction();\n tx.feePayer = payer;\n tx.add(approveIx);\n return tx;\n}\n\n/**\n * Build a Transaction that approves the CLOB config PDA to transfer BOTH\n * YES and NO outcome tokens from the signer's ATAs (two approve instructions).\n *\n * Required signers: signer (token owner), payer (fee payer).\n */\nexport function buildApproveAllOutcomeTokensTx(\n condition: PublicKey,\n signer: PublicKey,\n payer: PublicKey,\n delegate: PublicKey,\n programIds: ProgramIds,\n amount: BN = MAX_APPROVE_AMOUNT,\n): Transaction {\n const [yesMint] = PDA.yesMint(condition, programIds);\n const [noMint] = PDA.noMint(condition, programIds);\n\n const yesAta = getAssociatedTokenAddressSync(yesMint, signer, false, TOKEN_2022_PROGRAM_ID);\n const noAta = getAssociatedTokenAddressSync(noMint, signer, false, TOKEN_2022_PROGRAM_ID);\n const amountBig = BigInt(amount.toString());\n\n const approveYesIx = createApproveInstruction(\n yesAta, delegate, signer, amountBig, [], TOKEN_2022_PROGRAM_ID,\n );\n const approveNoIx = createApproveInstruction(\n noAta, delegate, signer, amountBig, [], TOKEN_2022_PROGRAM_ID,\n );\n\n const tx = new Transaction();\n tx.feePayer = payer;\n tx.add(approveYesIx, approveNoIx);\n return tx;\n}\n"]}