@wireio/stake 0.0.6 → 0.1.1
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/README.md +260 -13
- package/lib/stake.browser.js +4861 -4218
- package/lib/stake.browser.js.map +1 -1
- package/lib/stake.d.ts +434 -6484
- package/lib/stake.js +5059 -4371
- package/lib/stake.js.map +1 -1
- package/lib/stake.m.js +4861 -4218
- package/lib/stake.m.js.map +1 -1
- package/package.json +2 -2
- package/src/assets/solana/idl/liqsol_core.json +4239 -0
- package/src/assets/solana/idl/liqsol_token.json +183 -0
- package/src/assets/solana/idl/validator_leaderboard.json +296 -250
- package/src/assets/solana/types/liqsol_core.ts +4245 -0
- package/src/assets/solana/types/liqsol_token.ts +189 -0
- package/src/assets/solana/types/validator_leaderboard.ts +296 -250
- package/src/index.ts +2 -5
- package/src/networks/ethereum/contract.ts +138 -36
- package/src/networks/ethereum/ethereum.ts +167 -38
- package/src/networks/ethereum/types.ts +32 -1
- package/src/networks/solana/clients/deposit.client.ts +92 -139
- package/src/networks/solana/clients/distribution.client.ts +302 -178
- package/src/networks/solana/clients/leaderboard.client.ts +40 -160
- package/src/networks/solana/constants.ts +238 -69
- package/src/networks/solana/program.ts +27 -93
- package/src/networks/solana/solana.ts +181 -36
- package/src/networks/solana/types.ts +47 -0
- package/src/networks/solana/utils.ts +522 -93
- package/src/scripts/fetch-artifacts.sh +24 -0
- package/src/scripts/tsconfig.json +17 -0
- package/src/staker/staker.ts +35 -30
- package/src/staker/types.ts +25 -22
- package/src/assets/solana/idl/deposit.json +0 -260
- package/src/assets/solana/idl/distribution.json +0 -736
- package/src/assets/solana/idl/liq_sol_token.json +0 -275
- package/src/assets/solana/idl/stake_controller.json +0 -1788
- package/src/assets/solana/idl/stake_registry.json +0 -435
- package/src/assets/solana/idl/treasury.json +0 -336
- package/src/assets/solana/idl/validator_registry.json +0 -418
- package/src/assets/solana/idl/yield_oracle.json +0 -32
- package/src/assets/solana/types/deposit.ts +0 -266
- package/src/assets/solana/types/distribution.ts +0 -742
- package/src/assets/solana/types/liq_sol_token.ts +0 -281
- package/src/assets/solana/types/stake_controller.ts +0 -1794
- package/src/assets/solana/types/stake_registry.ts +0 -441
- package/src/assets/solana/types/treasury.ts +0 -342
- package/src/assets/solana/types/validator_registry.ts +0 -424
- package/src/assets/solana/types/yield_oracle.ts +0 -38
- package/src/utils.ts +0 -9
package/lib/stake.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stake.js","sources":["../src/utils.ts","../src/networks/solana/constants.ts","../src/networks/solana/utils.ts","../src/networks/solana/program.ts","../src/networks/solana/clients/deposit.client.ts","../src/networks/solana/clients/distribution.client.ts","../src/networks/solana/clients/leaderboard.client.ts","../src/networks/solana/solana.ts","../src/staker/staker.ts","../src/networks/ethereum/contract.ts","../src/networks/ethereum/ethereum.ts","../src/networks/ethereum/types.ts"],"sourcesContent":["/**\n * Static utility functions for working with Wire Network Staking Protocol.\n * \n * @module utils\n */\n\nexport const hi = (name: string): string => {\n return `Hello, ${name}!`;\n}","// src/networks/solana/constants.ts\n\nimport { PublicKey } from '@solana/web3.js';\nimport { TOKEN_2022_PROGRAM_ID, ASSOCIATED_TOKEN_PROGRAM_ID } from '@solana/spl-token';\n\n// — IDLs — (must match your filesystem: src/assets/solana/idl/*.json)\nimport DepositIDL from '../../assets/solana/idl/deposit.json';\nimport DistributionIDL from '../../assets/solana/idl/distribution.json';\nimport LiqSolTokenIDL from '../../assets/solana/idl/liq_sol_token.json';\nimport StakeControllerIDL from '../../assets/solana/idl/stake_controller.json';\nimport StakeRegistryIDL from '../../assets/solana/idl/stake_registry.json';\nimport TreasuryIDL from '../../assets/solana/idl/treasury.json';\nimport ValidatorLeaderboardIDL from '../../assets/solana/idl/validator_leaderboard.json';\nimport ValidatorRegistryIDL from '../../assets/solana/idl/validator_registry.json';\nimport YieldOracleIDL from '../../assets/solana/idl/yield_oracle.json';\n\n// — Types — for your clients\nimport type { Deposit } from '../../assets/solana/types/deposit';\nimport type { Distribution } from '../../assets/solana/types/distribution';\nimport type { ValidatorLeaderboard } from '../../assets/solana/types/validator_leaderboard';\nimport type { LiqSolToken } from '../../assets/solana/types/liq_sol_token';\nimport type { StakeController } from '../../assets/solana/types/stake_controller';\nimport type { StakeRegistry } from '../../assets/solana/types/stake_registry';\nimport type { Treasury } from '../../assets/solana/types/treasury';\nimport type { ValidatorRegistry } from '../../assets/solana/types/validator_registry';\nimport type { YieldOracle } from '../../assets/solana/types/yield_oracle';\n\n// Re-export for easy import elsewhere:\nexport {\n Deposit,\n DepositIDL,\n Distribution,\n DistributionIDL,\n LiqSolToken,\n LiqSolTokenIDL,\n StakeController,\n StakeControllerIDL,\n StakeRegistry,\n StakeRegistryIDL,\n Treasury,\n TreasuryIDL,\n ValidatorLeaderboard,\n ValidatorLeaderboardIDL,\n ValidatorRegistry,\n ValidatorRegistryIDL,\n YieldOracle,\n YieldOracleIDL,\n};\n\n// — Program IDs — anchor “address” fields inside each IDL must match these:\nexport const DEPOSIT_PROGRAM_ID = new PublicKey(DepositIDL.address);\nexport const DISTRIBUTION_PROGRAM_ID = new PublicKey(DistributionIDL.address);\nexport const LIQSOL_TOKEN_PROGRAM_ID = new PublicKey(LiqSolTokenIDL.address);\nexport const STAKE_CONTROLLER_PROGRAM_ID = new PublicKey(StakeControllerIDL.address);\nexport const STAKE_REGISTRY_PROGRAM_ID = new PublicKey(StakeRegistryIDL.address);\nexport const TREASURY_PROGRAM_ID = new PublicKey(TreasuryIDL.address);\nexport const VALIDATOR_LEADERBOARD_PROGRAM_ID = new PublicKey(ValidatorLeaderboardIDL.address);\nexport const VALIDATOR_REGISTRY_PROGRAM_ID = new PublicKey(ValidatorRegistryIDL.address);\nexport const YIELD_ORACLE_PROGRAM_ID = new PublicKey(YieldOracleIDL.address);\n\n// — Protocol constants — tweak as needed:\nexport const MIN_SOL_TO_PARTICIPATE = 1_000_000_000; // 1 SOL in lamports\nexport const MIN_FUNDS_THRESHOLD = 10_000_000_000; // 10 SOL in lamports\nexport const RESERVE_FOR_FEES = 1_000_000_000; // 1 SOL\n\n// — Pre-derived PDA seeds for your convenience — \n// (you can still use your utils.ts helpers instead)\nexport const TREASURY_WALLET_PDA = new PublicKey('9gLj1MRrm66GNYqnMLPGUzyYqYJpVLQgFSbtCQV9Ta4G');\nexport const LIQSOL_MINT_ADDRESS = new PublicKey('B2XtJABkc6eUoYUNgSfZVb3kYckmbh2zxp4rp2hX2Xwa');\nexport const STAKE_VAULT_PDA = new PublicKey('AY83EfU5LXJGDhbLeP45H3tLKisGZgSe2G4mGYfPimqN');\n\n// re-export SPL token constants:\nexport { TOKEN_2022_PROGRAM_ID, ASSOCIATED_TOKEN_PROGRAM_ID };","// src/solana/utils.ts\nimport { AnchorProvider, Program } from '@coral-xyz/anchor'\nimport { PublicKey } from '@solana/web3.js'\nimport { getAssociatedTokenAddressSync, TOKEN_2022_PROGRAM_ID, ASSOCIATED_TOKEN_PROGRAM_ID } from '@solana/spl-token'\nimport {\n DEPOSIT_PROGRAM_ID,\n DISTRIBUTION_PROGRAM_ID,\n STAKE_CONTROLLER_PROGRAM_ID,\n VALIDATOR_LEADERBOARD_PROGRAM_ID,\n LIQSOL_MINT_ADDRESS,\n DepositIDL,\n Deposit\n} from './constants'\n\n// -- Program factories ------------------------------------------------------\n/**\n * Create an Anchor Program client for the Deposit program\n */\nexport function getDepositProgram(provider: AnchorProvider): Program<Deposit> {\n // Ensure the IDL has the correct program address\n const idlWithAddress = {\n ...JSON.parse(JSON.stringify(DepositIDL)),\n address: DEPOSIT_PROGRAM_ID.toString(),\n }\n return new Program(idlWithAddress as any, provider) as Program<Deposit>\n}\n\n// (Other program factories can go here if needed)\n\n// -- PDA derivation helpers ------------------------------------------------\nexport function deriveDepositAuthorityPDA(\n programId: PublicKey = DEPOSIT_PROGRAM_ID\n): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [Buffer.from('program_authority')],\n programId\n )\n}\n\nexport function deriveLiqsolMintAuthorityPDA(\n programId: PublicKey = LIQSOL_MINT_ADDRESS\n): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [Buffer.from('mint_authority')],\n programId\n )\n}\n\nexport function deriveStakeControllerVaultPDA(): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [Buffer.from('vault')],\n STAKE_CONTROLLER_PROGRAM_ID\n )\n}\n\nexport function deriveStakeControllerReservePoolPDA(): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [Buffer.from('reserve_pool')],\n STAKE_CONTROLLER_PROGRAM_ID\n )\n}\n\nexport function deriveStakeControllerStatePDA(): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [Buffer.from('stake_controller')],\n STAKE_CONTROLLER_PROGRAM_ID\n )\n}\n\nexport function deriveDistributionStatePDA(): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [Buffer.from('distribution_state')],\n DISTRIBUTION_PROGRAM_ID\n )\n}\n\nexport function deriveUserRecordPDA(\n user: PublicKey\n): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [Buffer.from('user_record'), user.toBuffer()],\n DISTRIBUTION_PROGRAM_ID\n )\n}\n\nexport function deriveLeaderboardHeadPDA(): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [Buffer.from('leaderboard_head')],\n VALIDATOR_LEADERBOARD_PROGRAM_ID\n )\n}\n\nexport function deriveValidatorRecordPDA(\n voteAccount: PublicKey\n): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [Buffer.from('validator_record'), voteAccount.toBuffer()],\n VALIDATOR_LEADERBOARD_PROGRAM_ID\n )\n}\n\nexport function deriveTop10CachePDA(): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [Buffer.from('top_10_cache')],\n VALIDATOR_LEADERBOARD_PROGRAM_ID\n )\n}\n\n// -- SPL Token helper -------------------------------------------------------\nexport function getUserLiqsolATA(\n user: PublicKey\n): PublicKey {\n return getAssociatedTokenAddressSync(\n LIQSOL_MINT_ADDRESS,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID\n )\n}\n\n// seedToPID(seed: string): PublicKey ","// src/solana/programService.ts\n\nimport { AnchorProvider, Program } from '@coral-xyz/anchor';\nimport { PublicKey } from '@solana/web3.js';\n\n// 1) pull in all your on-chain IDLs (must match lowercase `src/assets/solana/idl`)\nimport depositJson from '../../assets/solana/idl/deposit.json';\nimport distributionJson from '../../assets/solana/idl/distribution.json';\nimport liqSolTokenJson from '../../assets/solana/idl/liq_sol_token.json';\nimport stakeControllerJson from '../../assets/solana/idl/stake_controller.json';\nimport stakeRegistryJson from '../../assets/solana/idl/stake_registry.json';\nimport treasuryJson from '../../assets/solana/idl/treasury.json';\nimport validatorLeaderboardJson from '../../assets/solana/idl/validator_leaderboard.json';\nimport validatorRegistryJson from '../../assets/solana/idl/validator_registry.json';\nimport yieldOracleJson from '../../assets/solana/idl/yield_oracle.json';\n\n// 2) import their companion TS types\nimport type { Deposit } from '../../assets/solana/types/deposit';\nimport type { Distribution } from '../../assets/solana/types/distribution';\nimport type { LiqSolToken } from '../../assets/solana/types/liq_sol_token';\nimport type { StakeController } from '../../assets/solana/types/stake_controller';\nimport type { StakeRegistry } from '../../assets/solana/types/stake_registry';\nimport type { Treasury } from '../../assets/solana/types/treasury';\nimport type { ValidatorLeaderboard } from '../../assets/solana/types/validator_leaderboard';\nimport type { ValidatorRegistry } from '../../assets/solana/types/validator_registry';\nimport type { YieldOracle } from '../../assets/solana/types/yield_oracle';\n\ntype IdlEntry<IDL> = {\n idl: IDL & { address: string };\n address: PublicKey;\n};\n\nexport const PROGRAM_IDLS = {\n deposit: {\n idl: depositJson,\n address: new PublicKey(depositJson.address),\n } as IdlEntry<Deposit>,\n\n distribution: {\n idl: distributionJson,\n address: new PublicKey(distributionJson.address),\n } as IdlEntry<Distribution>,\n\n liqSolToken: {\n idl: liqSolTokenJson,\n address: new PublicKey(liqSolTokenJson.address),\n } as IdlEntry<LiqSolToken>,\n\n stakeController: {\n idl: stakeControllerJson,\n address: new PublicKey(stakeControllerJson.address),\n } as IdlEntry<StakeController>,\n\n stakeRegistry: {\n idl: stakeRegistryJson,\n address: new PublicKey(stakeRegistryJson.address),\n } as IdlEntry<StakeRegistry>,\n\n treasury: {\n idl: treasuryJson,\n address: new PublicKey(treasuryJson.address),\n } as IdlEntry<Treasury>,\n\n validatorLeaderboard: {\n idl: validatorLeaderboardJson,\n address: new PublicKey(validatorLeaderboardJson.address),\n } as IdlEntry<ValidatorLeaderboard>,\n\n validatorRegistry: {\n idl: validatorRegistryJson,\n address: new PublicKey(validatorRegistryJson.address),\n } as IdlEntry<ValidatorRegistry>,\n\n yieldOracle: {\n idl: yieldOracleJson,\n address: new PublicKey(yieldOracleJson.address),\n } as IdlEntry<YieldOracle>,\n};\n\n/**\n * Factory for Anchor Program clients.\n *\n * Anchor v0.28+ reads the program ID from `idl.address`, so\n * we call the 2-arg constructor: `new Program(idl, provider)`.\n */\nexport class SolanaProgramService {\n constructor(private provider: AnchorProvider) { }\n\n /**\n * Returns a typed Anchor Program instance for the given key.\n */\n getProgram<K extends keyof typeof PROGRAM_IDLS>(\n name: K\n ): Program<(typeof PROGRAM_IDLS)[K]['idl']> {\n const entry = PROGRAM_IDLS[name];\n // stamp the correct address into a fresh copy of the IDL\n const idlWithAddr = { ...entry.idl, address: entry.address.toString() };\n // use the two-arg signature: (idl, provider)\n return new Program(idlWithAddr as any, this.provider) as Program<\n (typeof PROGRAM_IDLS)[K]['idl']\n >;\n }\n\n /** List all program keys */\n listProgramNames(): Array<keyof typeof PROGRAM_IDLS> {\n return Object.keys(PROGRAM_IDLS) as Array<keyof typeof PROGRAM_IDLS>;\n }\n\n /** Raw PublicKey of a program */\n getProgramId(name: keyof typeof PROGRAM_IDLS): PublicKey {\n return PROGRAM_IDLS[name].address;\n }\n}","import { AnchorProvider } from '@coral-xyz/anchor';\nimport { BN } from '@coral-xyz/anchor';\nimport {\n PublicKey,\n Transaction,\n SystemProgram,\n SYSVAR_INSTRUCTIONS_PUBKEY,\n SYSVAR_CLOCK_PUBKEY,\n SYSVAR_RENT_PUBKEY,\n SYSVAR_STAKE_HISTORY_PUBKEY,\n StakeProgram,\n ComputeBudgetProgram,\n VersionedTransaction,\n Signer,\n TransactionSignature,\n} from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n} from '@solana/spl-token';\n\nimport {\n deriveDepositAuthorityPDA,\n deriveLiqsolMintAuthorityPDA,\n deriveStakeControllerVaultPDA,\n deriveStakeControllerReservePoolPDA,\n deriveStakeControllerStatePDA,\n deriveDistributionStatePDA,\n deriveUserRecordPDA,\n getUserLiqsolATA,\n} from '../utils';\nimport {\n LIQSOL_MINT_ADDRESS,\n TREASURY_WALLET_PDA,\n STAKE_CONTROLLER_PROGRAM_ID,\n LIQSOL_TOKEN_PROGRAM_ID,\n YIELD_ORACLE_PROGRAM_ID,\n DISTRIBUTION_PROGRAM_ID,\n MIN_SOL_TO_PARTICIPATE,\n} from '../constants';\nimport { SolanaProgramService } from '../program';\n\n/**\n * DepositClient provides methods for building, simulating, and sending deposit transactions\n * to the Solana blockchain using the Anchor framework. It handles the creation of ephemeral\n * stake accounts, derives necessary PDAs and ATAs, and manages transaction construction\n * with compute budget adjustments. This client is designed to facilitate deposits into\n * the Liqsol staking protocol, ensuring all required accounts and instructions are included.\n *\n * @remarks\n * - Uses AnchorProvider for network interactions.\n * - Enforces minimum deposit requirements.\n * - Supports dry-run simulation for transaction debugging.\n * - Provides high-level helper for building and sending deposit transactions.\n */\nexport class DepositClient {\n private program = new SolanaProgramService(this.provider);\n\n constructor(private provider: AnchorProvider) { }\n\n /** Minimum lamports (1 SOL) */\n static readonly MIN_DEPOSIT = MIN_SOL_TO_PARTICIPATE;\n\n /**\n * Build the deposit transaction (compute-budget bump + deposit Ix).\n * Returns both the Transaction and the ephemeral stake account Pubkey.\n */\n async buildDepositTx(\n user: PublicKey,\n amount: number\n ): Promise<{ transaction: Transaction; ephemeralStakePubkey: PublicKey }> {\n if (amount < MIN_SOL_TO_PARTICIPATE) {\n throw new Error(\n `Minimum deposit is ${MIN_SOL_TO_PARTICIPATE / 1e9} SOL`\n );\n }\n\n // 1) grab your typed Anchor program\n const program = this.program.getProgram('deposit');\n\n // 2) PDAs & ATAs\n const userAta = getUserLiqsolATA(user);\n const [depositAuthPDA] = deriveDepositAuthorityPDA();\n const [mintAuthPDA] = deriveLiqsolMintAuthorityPDA();\n const [vaultPDA] = deriveStakeControllerVaultPDA();\n const [reservePoolPDA] = deriveStakeControllerReservePoolPDA();\n const [controllerStatePDA] = deriveStakeControllerStatePDA();\n const [distStatePDA] = deriveDistributionStatePDA();\n const [userRecordPDA] = deriveUserRecordPDA(user);\n\n // 3) ephemeral stake account\n const seed = Math.floor(Math.random() * 0xffffffff);\n const ephemeralSeed = `ephemeral_${seed}`;\n const ephemeralStakePubkey = await PublicKey.createWithSeed(\n user,\n ephemeralSeed,\n StakeProgram.programId\n );\n\n // 4) build deposit instruction\n const depositIx = await program.methods\n .deposit(new BN(amount), seed)\n .accounts({\n user,\n programAuthority: depositAuthPDA,\n treasuryWallet: TREASURY_WALLET_PDA,\n systemProgram: SystemProgram.programId,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n stakeControllerProgram: STAKE_CONTROLLER_PROGRAM_ID,\n liqsolProgram: LIQSOL_TOKEN_PROGRAM_ID,\n yieldOracleProgram: YIELD_ORACLE_PROGRAM_ID,\n stakeProgram: StakeProgram.programId,\n distributionProgram: DISTRIBUTION_PROGRAM_ID,\n liqsolMint: LIQSOL_MINT_ADDRESS,\n userAta,\n liqsolMintAuthority: mintAuthPDA,\n reservePool: reservePoolPDA,\n vault: vaultPDA,\n ephemeralStake: ephemeralStakePubkey,\n controllerState: controllerStatePDA,\n userRecord: userRecordPDA,\n distributionState: distStatePDA,\n instructionsSysvar: SYSVAR_INSTRUCTIONS_PUBKEY,\n clock: SYSVAR_CLOCK_PUBKEY,\n stakeHistory: SYSVAR_STAKE_HISTORY_PUBKEY,\n rent: SYSVAR_RENT_PUBKEY,\n } as any)\n .instruction();\n\n // 5) prepend compute-budget bump\n const computeIx = ComputeBudgetProgram.setComputeUnitLimit({\n units: 400_000,\n });\n\n const tx = new Transaction().add(computeIx, depositIx);\n return { transaction: tx, ephemeralStakePubkey };\n }\n\n /**\n * Simulate (dry-run) a built transaction.\n * Returns any error plus the total compute-units consumed.\n */\n async simulate(\n tx: Transaction\n ): Promise<{ err: any; unitsConsumed: number }> {\n tx.feePayer = this.provider.wallet.publicKey;\n const { blockhash } = await this.provider.connection.getLatestBlockhash();\n tx.recentBlockhash = blockhash;\n\n const versioned = new VersionedTransaction(tx.compileMessage());\n const sim = await this.provider.connection.simulateTransaction(\n versioned,\n { sigVerify: false }\n );\n return { err: sim.value.err, unitsConsumed: sim.value.unitsConsumed! };\n }\n\n /**\n * High-level “build & send” helper.\n * Returns the confirmed signature.\n */\n async deposit(\n user: PublicKey,\n amount: number,\n signers: Signer[] = []\n ): Promise<TransactionSignature> {\n const { transaction } = await this.buildDepositTx(user, amount);\n\n // set feePayer & recent blockhash\n transaction.feePayer = this.provider.wallet.publicKey;\n const { blockhash } = await this.provider.connection.getLatestBlockhash();\n transaction.recentBlockhash = blockhash;\n\n // send + confirm\n return this.provider.sendAndConfirm(transaction, signers);\n }\n}","// src/solana/clients/DistributionClient.ts\nimport { AnchorProvider, Program, BN, web3 } from '@coral-xyz/anchor';\nimport {\n PublicKey,\n Transaction,\n TransactionInstruction,\n SystemProgram,\n VersionedTransaction,\n} from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddressSync,\n} from '@solana/spl-token';\nimport {\n DISTRIBUTION_PROGRAM_ID,\n STAKE_CONTROLLER_PROGRAM_ID,\n DistributionIDL,\n Distribution,\n YIELD_ORACLE_PROGRAM_ID,\n LIQSOL_TOKEN_PROGRAM_ID,\n} from '../constants';\nimport {\n deriveDistributionStatePDA,\n deriveUserRecordPDA,\n deriveLiqsolMintAuthorityPDA,\n} from '../utils';\n\nexport class DistributionClient {\n constructor(private provider: AnchorProvider) { }\n\n /** Wrapped Anchor Program for Distribution */\n private get program(): Program<Distribution> {\n const idlWithAddress = {\n ...JSON.parse(JSON.stringify(DistributionIDL)),\n address: DISTRIBUTION_PROGRAM_ID.toString(),\n };\n return new Program(idlWithAddress as any, this.provider) as Program<Distribution>;\n }\n\n /** Derive the PDA for global distribution state */\n deriveStatePDA(): PublicKey {\n return deriveDistributionStatePDA()[0];\n }\n\n /** Derive the PDA for a user’s record */\n deriveUserRecordPDA(user: PublicKey): PublicKey {\n return deriveUserRecordPDA(user)[0];\n }\n\n /** Fetch on-chain distribution state */\n async getState(): Promise<any> {\n return this.program.account.distributionState.fetch(this.deriveStatePDA());\n }\n\n /** Fetch a user’s record or return null if it doesn’t exist */\n async getUserRecord(user: PublicKey): Promise<any | null> {\n try {\n return await this.program.account.userRecord.fetch(\n this.deriveUserRecordPDA(user)\n );\n } catch {\n return null;\n }\n }\n\n /** Build an `initialize` transaction for the distribution program */\n async buildInitializeTransaction(user: PublicKey): Promise<Transaction> {\n const [statePda] = deriveDistributionStatePDA();\n const ix = await this.program.methods\n .initialize()\n .accounts({\n authority: user,\n distributionState: statePda,\n systemProgram: SystemProgram.programId,\n rent: web3.SYSVAR_RENT_PUBKEY,\n } as any)\n .instruction();\n\n return new Transaction().add(ix);\n }\n\n /** Build an `updateUser` transaction (register or refresh a user record) */\n async buildUpdateUserTransaction(user: PublicKey): Promise<Transaction> {\n const statePda = this.deriveStatePDA();\n const userPda = this.deriveUserRecordPDA(user);\n\n // Fetch state to get the liqSOL mint address\n const state: any = await this.getState();\n const liqsolMint: PublicKey = state.liqsolMint;\n const userAta = getAssociatedTokenAddressSync(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID\n );\n\n const [stakeControllerStatePda] = PublicKey.findProgramAddressSync(\n [Buffer.from('stake_controller')],\n STAKE_CONTROLLER_PROGRAM_ID\n );\n\n const ix = await this.program.methods\n .updateUser()\n .accounts({\n user,\n userAta,\n userRecord: userPda,\n authority: user,\n payer: user,\n distributionState: statePda,\n stakeControllerState: stakeControllerStatePda,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n yieldOracleProgram: YIELD_ORACLE_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n } as any)\n .instruction();\n\n return new Transaction().add(ix);\n }\n\n /** Build a `withdraw` transaction */\n async buildWithdrawTransaction(user: PublicKey, amount: number): Promise<Transaction> {\n const statePda = this.deriveStatePDA();\n const userPda = this.deriveUserRecordPDA(user);\n\n // Fetch state for the mint\n const state: any = await this.getState();\n const liqsolMint: PublicKey = state.liqsolMint;\n const userAta = getAssociatedTokenAddressSync(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID\n );\n\n const [stakeControllerStatePda] = PublicKey.findProgramAddressSync(\n [Buffer.from('stake_controller')],\n STAKE_CONTROLLER_PROGRAM_ID\n );\n const [controllerAuthPda] = PublicKey.findProgramAddressSync(\n [Buffer.from('stake_authority')],\n STAKE_CONTROLLER_PROGRAM_ID\n );\n\n const ix = await this.program.methods\n .withdraw(new BN(amount))\n .accounts({\n user,\n userAta,\n userRecord: userPda,\n distributionState: statePda,\n liqsolMint,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n stakeControllerProgram: STAKE_CONTROLLER_PROGRAM_ID,\n stakeControllerState: stakeControllerStatePda,\n controllerAuthority: controllerAuthPda,\n yieldOracleProgram: YIELD_ORACLE_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n } as any)\n .instruction();\n\n return new Transaction().add(ix);\n }\n\n /** Build a `claimRewards` transaction */\n async buildClaimRewardsTransaction(user: PublicKey): Promise<Transaction> {\n const statePda = this.deriveStatePDA();\n const userPda = this.deriveUserRecordPDA(user);\n\n // Fetch state for the mint\n const state: any = await this.getState();\n const liqsolMint: PublicKey = state.liqsolMint;\n const userAta = getAssociatedTokenAddressSync(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID\n );\n const [mintAuthPda] = deriveLiqsolMintAuthorityPDA();\n\n const ix = await this.program.methods\n .claimRewards()\n .accounts({\n user,\n userAta,\n userRecord: userPda,\n distributionState: statePda,\n liqsolMint,\n liqsolProgram: LIQSOL_TOKEN_PROGRAM_ID,\n liqsolMintAuthority: mintAuthPda,\n instructionsSysvar: web3.SYSVAR_INSTRUCTIONS_PUBKEY,\n yieldOracleProgram: YIELD_ORACLE_PROGRAM_ID,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n } as any)\n .instruction();\n\n return new Transaction().add(ix);\n }\n\n /** Send & confirm a single-IX transaction; returns the tx signature */\n async sendTransaction(\n tx: Transaction,\n signers: import('@solana/web3.js').Signer[] = []\n ): Promise<string> {\n tx.feePayer = this.provider.wallet.publicKey;\n const { blockhash } = await this.provider.connection.getLatestBlockhash();\n tx.recentBlockhash = blockhash;\n return this.provider.sendAndConfirm(tx, signers);\n }\n\n /** Simulate a single-IX transaction; returns error (if any) + compute units used */\n async simulateTransaction(\n tx: Transaction\n ): Promise<{ err: any; unitsConsumed: number }> {\n tx.feePayer = this.provider.wallet.publicKey;\n const { blockhash } = await this.provider.connection.getLatestBlockhash();\n tx.recentBlockhash = blockhash;\n const versioned = new VersionedTransaction(tx.compileMessage());\n const sim = await this.provider.connection.simulateTransaction(versioned, {\n sigVerify: false,\n });\n return { err: sim.value.err, unitsConsumed: sim.value.unitsConsumed! };\n }\n}","// src/solana/clients/ValidatorLeaderboardClient.ts\nimport { AnchorProvider, Program, BN } from '@coral-xyz/anchor';\nimport { PublicKey, Transaction, TransactionInstruction, SystemProgram, VersionedTransaction } from '@solana/web3.js';\nimport {\n deriveLeaderboardHeadPDA,\n deriveValidatorRecordPDA,\n deriveTop10CachePDA,\n} from '../utils';\nimport { VALIDATOR_LEADERBOARD_PROGRAM_ID, ValidatorLeaderboard, ValidatorLeaderboardIDL } from '../constants';\n\nexport class ValidatorLeaderboardClient {\n constructor(private provider: AnchorProvider) { }\n\n /**\n * Wrapped Anchor Program for ValidatorLeaderboard\n */\n private get program(): Program<ValidatorLeaderboard> {\n const idlWithAddress = {\n ...JSON.parse(JSON.stringify(ValidatorLeaderboardIDL)),\n address: VALIDATOR_LEADERBOARD_PROGRAM_ID.toString(),\n };\n return new Program(idlWithAddress as any, this.provider) as Program<ValidatorLeaderboard>;\n }\n\n /** Derive the PDA for the leaderboard head */\n deriveHeadPDA(): PublicKey {\n return deriveLeaderboardHeadPDA()[0];\n }\n\n /** Derive the PDA for a given validator record */\n deriveRecordPDA(voteAccount: PublicKey): PublicKey {\n return deriveValidatorRecordPDA(voteAccount)[0];\n }\n\n /**\n * Build the initialize instruction as a Transaction\n */\n async buildInitializeTransaction(authority: PublicKey): Promise<Transaction> {\n const [headPda] = deriveLeaderboardHeadPDA();\n const ix = await this.program.methods\n .initialize()\n .accounts({\n authority,\n leaderboardHead: headPda,\n systemProgram: SystemProgram.programId,\n } as any)\n .instruction();\n\n return new Transaction().add(ix);\n }\n\n /**\n * Build an updateValidator transaction\n */\n async buildUpdateValidatorTransaction(params: {\n authority: PublicKey;\n registrant: PublicKey;\n voteAccount: PublicKey;\n vpp: number;\n insertAfter?: PublicKey;\n insertBefore?: PublicKey;\n currentPrev?: PublicKey;\n currentNext?: PublicKey;\n }): Promise<Transaction> {\n const { authority, registrant, voteAccount, vpp, insertAfter, insertBefore, currentPrev, currentNext } = params;\n const [headPda] = deriveLeaderboardHeadPDA();\n const [recPda] = deriveValidatorRecordPDA(voteAccount);\n\n const accounts: any = {\n registrant,\n voteAccount,\n validatorRecord: recPda,\n leaderboardHead: headPda,\n systemProgram: SystemProgram.programId,\n ...(insertAfter && { insertAfter }),\n ...(insertBefore && { insertBefore }),\n ...(currentPrev && { currentPrev }),\n ...(currentNext && { currentNext }),\n };\n\n const ix = await this.program.methods\n .updateValidator(new BN(vpp))\n .accounts(accounts)\n .instruction();\n\n return new Transaction().add(ix);\n }\n\n /**\n * Build an updateTop10Cache transaction\n */\n async buildUpdateTop10CacheTransaction(params: {\n authority: PublicKey;\n top10Validators: PublicKey[];\n }): Promise<Transaction> {\n const { authority, top10Validators } = params;\n if (top10Validators.length !== 10) {\n throw new Error('Must supply exactly 10 validators');\n }\n const [cachePda] = deriveTop10CachePDA();\n const ix = await this.program.methods\n .updateTop10Cache(top10Validators)\n .accounts({ authority, cache: cachePda, systemProgram: SystemProgram.programId } as any)\n .instruction();\n\n return new Transaction().add(ix);\n }\n\n /**\n * Fetch the cached top 10 validators via a view call\n */\n async getCachedTop10(): Promise<PublicKey[]> {\n const [cachePda] = deriveTop10CachePDA();\n return this.program.methods\n .getCachedTop10()\n .accounts({ cache: cachePda } as any)\n .view();\n }\n\n /**\n * Traverse the on-chain linked list and return the sequence of PublicKeys\n */\n async getLeaderboard(): Promise<PublicKey[]> {\n const [headPda] = deriveLeaderboardHeadPDA();\n let headAccount;\n try {\n headAccount = await this.program.account.leaderboardHead.fetch(headPda);\n } catch {\n return [];\n }\n const result: PublicKey[] = [];\n let cursor: PublicKey = headAccount.nextValidator;\n while (cursor && !cursor.equals(PublicKey.default)) {\n result.push(cursor);\n const rec = await this.program.account.validatorRecord.fetch(cursor);\n cursor = rec.nextValidator;\n }\n return result;\n }\n\n /**\n * Fetch a single validator record or null\n */\n async getRecord(voteAccount: PublicKey): Promise<any | null> {\n const [recPda] = deriveValidatorRecordPDA(voteAccount);\n try {\n return await this.program.account.validatorRecord.fetch(recPda);\n } catch {\n return null;\n }\n }\n\n /**\n * Send & confirm a single-IX Transaction; returns the signature\n */\n async sendTransaction(\n tx: Transaction,\n signers: import('@solana/web3.js').Signer[] = []\n ): Promise<string> {\n tx.feePayer = this.provider.wallet.publicKey;\n const { blockhash } = await this.provider.connection.getLatestBlockhash();\n tx.recentBlockhash = blockhash;\n return this.provider.sendAndConfirm(tx, signers);\n }\n\n /**\n * Simulate a single-IX Transaction; returns any err + compute units consumed\n */\n async simulateTransaction(\n tx: Transaction\n ): Promise<{ err: any; unitsConsumed: number }> {\n tx.feePayer = this.provider.wallet.publicKey;\n const { blockhash } = await this.provider.connection.getLatestBlockhash();\n tx.recentBlockhash = blockhash;\n const versioned = new VersionedTransaction(tx.compileMessage());\n const sim = await this.provider.connection.simulateTransaction(versioned, { sigVerify: false });\n return { err: sim.value.err, unitsConsumed: sim.value.unitsConsumed! };\n }\n}\n","import {\n Connection,\n PublicKey as SolPubKey,\n Transaction,\n VersionedTransaction,\n TransactionSignature,\n Commitment,\n} from '@solana/web3.js';\nimport { AnchorProvider } from '@coral-xyz/anchor';\nimport { BaseSignerWalletAdapter } from '@solana/wallet-adapter-base';\nimport { IStakingClient, SolanaTransaction, StakerConfig } from '../../staker/types';\nimport { ChainID, ExternalNetwork, KeyType, PublicKey } from '@wireio/core';\nimport { DepositClient } from './clients/deposit.client';\nimport { DistributionClient } from './clients/distribution.client';\nimport { ValidatorLeaderboardClient } from './clients/leaderboard.client';\n\nconst commitment: Commitment = 'confirmed';\n\nexport class SolanaStakingClient implements IStakingClient {\n public pubKey: PublicKey;\n public network: ExternalNetwork;\n\n public connection: Connection;\n public anchor: AnchorProvider;\n\n private depositClient: DepositClient;\n private distributionClient: DistributionClient;\n private leaderboardClient: ValidatorLeaderboardClient;\n\n balanceNative: number = 0;\n balanceLiquid: number = 0;\n\n get solPubKey(): SolPubKey {\n return new SolPubKey(this.pubKey.data.array);\n }\n\n constructor(private config: StakerConfig) {\n // 1) unwrap & validate wallet adapter\n const adapter = config.provider as BaseSignerWalletAdapter;\n if (!adapter.publicKey) {\n throw new Error('Solana wallet adapter not connected');\n }\n\n // 2) sanity‐check wire ↔ solana pubkey\n const publicKey = adapter.publicKey;\n const wirePub = new PublicKey(KeyType.ED, publicKey.toBytes());\n if (!wirePub.equals(config.pubKey)) {\n throw new Error('Passed-in pubKey doesn\\'t match adapter.publicKey');\n }\n\n this.network = config.network;\n this.pubKey = wirePub;\n this.connection = new Connection(config.network.rpcUrls[0], commitment);\n this.setBalances();\n\n const anchorWallet = {\n publicKey,\n async signTransaction<T extends SolanaTransaction>(tx: T): Promise<T> {\n return adapter.signTransaction(tx);\n },\n async signAllTransactions<T extends SolanaTransaction>(txs: T[]): Promise<T[]> {\n return Promise.all(txs.map((tx) => adapter.signTransaction(tx)));\n },\n };\n\n this.anchor = new AnchorProvider(\n this.connection,\n anchorWallet,\n { commitment }\n );\n\n // 4) staking clients\n this.depositClient = new DepositClient(this.anchor);\n this.distributionClient = new DistributionClient(this.anchor);\n this.leaderboardClient = new ValidatorLeaderboardClient(this.anchor);\n }\n\n /**\n * Update the native and liquid balances.\n * @returns The updated balances.\n */\n async setBalances() {\n this.balanceNative = await this.connection.getBalance(this.solPubKey);\n this.balanceLiquid = 0; // TODO fetch liq balance\n\n return { native: this.balanceNative, liquid: this.balanceLiquid };\n }\n\n /**\n * Deposit funds into the staking pool.\n * @param lamports The amount to deposit (in lamports).\n * @returns The transaction signature.\n */\n async deposit(lamports: number): Promise<string> {\n const tx = await this.depositClient.buildDepositTx(\n this.solPubKey,\n lamports,\n );\n const signed = await this.signTransaction(tx.transaction);\n return this.sendTransaction(signed);\n }\n\n async signTransaction(tx: SolanaTransaction): Promise<SolanaTransaction> {\n return await this.anchor.wallet.signTransaction(tx);\n }\n\n async sendTransaction(signed: SolanaTransaction): Promise<TransactionSignature> {\n return await this.anchor.sendAndConfirm(signed);\n }\n}","// src/staker/staker.ts\n\nimport { ChainID, Curve, EvmChainID, SolChainID } from '@wireio/core';\nimport { IStakingClient, StakeBalance, StakerConfig } from './types';\nimport { SolanaStakingClient } from '../networks/solana/solana';\nimport { EthereumStakingClient } from '../networks/ethereum/ethereum';\n\nexport class Staker {\n private clients: Map<ChainID, IStakingClient> = new Map();\n\n constructor(config: StakerConfig | StakerConfig[]) {\n if (!Array.isArray(config)) config = [config];\n\n config.forEach((cfg) => {\n switch (cfg.network.chainId) {\n case SolChainID.WireTestnet:\n this.clients.set(cfg.network.chainId, new SolanaStakingClient(cfg));\n break;\n\n // case EvmChainID.Sepolia:\n // this.clients.set(EvmChainID.Sepolia, new EthereumStakingClient(cfg));\n // break;\n default:\n throw new Error(`Unsupported network curve: ${cfg.network.name}`);\n }\n });\n }\n\n /** Return the raw client (if any) for a chain */\n getClient(chainId: ChainID): IStakingClient | undefined {\n return this.clients.get(chainId);\n }\n\n /** Convenience: ensure a client exists or throw a friendly error */\n private ensureClient(chainId: ChainID): IStakingClient {\n const c = this.clients.get(chainId);\n if (!c) throw new Error(`Staker not initialized for chain ${chainId}`);\n return c;\n }\n\n /**\n * Deposit funds into the staking pool.\n * @param chainId The chain ID to deposit into.\n * @param amount The amount to deposit (in smallest unit i.e. Lamport or Wei).\n * @returns The transaction signature.\n */\n deposit(chainId: ChainID, amount: number): Promise<string> {\n return this.ensureClient(chainId).deposit(amount);\n }\n\n getBalance(chainId: ChainID): Promise<StakeBalance> {\n return this.ensureClient(chainId).setBalances();\n }\n\n // …withdraw, claimRewards, etc…\n}","/**\n * @module EthereumContractService\n * \n * Provides a unified service for interacting with Ethereum smart contracts using ethers.js.\n * \n * This module includes:\n * - ABI imports for ERC20, ERC721, and ERC1155 token standards.\n * - Address book and contract configuration types.\n * - A service class for managing contract instances, interfaces, and utility methods for read/write access.\n * - Utility for decoding custom errors and events using a combined interface of all known ABIs.\n * \n * @remarks\n * - Update the `ADDRESSES` and `CONTRACTS` objects to match your deployment.\n * - The service supports both read-only and write-enabled contract handles, depending on the presence of a signer.\n * - The `omniInterface` property allows decoding of errors and events across all included ABIs.\n * \n * @example\n * ```typescript\n * const service = new EthereumContractService({ provider, signer });\n * const stakeContract = service.getContract('Stake');\n * const address = service.getAddress('Stake');\n * ```\n */\n\nimport ERC20Artifact from '../../assets/ethereum/ABI/token/ERC20Token.sol/ERC20Token.json';\nimport ERC721Artifact from '../../assets/ethereum/ABI/token/ERC721Token.sol/ERC721Token.json';\nimport ERC1155Artifact from '../../assets/ethereum/ABI/token/ERC1155Token.sol/ERC1155Token.json';\nimport { AddressBook, ContractName } from './types';\nimport { Contract, ethers, providers, Signer } from 'ethers';\nimport { JsonFragment } from '@ethersproject/abi';\nimport { ErrorDescription } from '@ethersproject/abi/lib/interface';\n\nexport const ERC20Abi = ERC20Artifact.abi;\nexport const ERC721Abi = ERC721Artifact.abi;\nexport const ERC1155Abi = ERC1155Artifact.abi;\n\n// Update this to be your staking contract address book\nexport const ADDRESSES: AddressBook = {\n Stake: '0xEeaCBa95852324eAc63fE2711aFe0283adf3bC93',\n};\n\nexport type Contracts<T extends string = ContractName> = Record<T, ContractConfig>;\n\nexport type ContractConfig = {\n address: string;\n abi: JsonFragment[];\n}\n\nexport const CONTRACTS: Contracts<ContractName> = {\n Stake: { address: ADDRESSES.Stake, abi: undefined as any }, // Replace with actual ABI artifact when available\n // Stake: { address: ADDRESSES.Stake, abi: Stake.abi },\n}\n\nexport interface ContractOptions {\n /** RPC endpoint or injected EIP-1193 provider */\n provider?: ethers.providers.Provider;\n /** Only required if you need to send txns */\n signer?: Signer;\n}\n\n\nexport class EthereumContractService {\n private provider?: providers.Provider;\n private signer?: Signer;\n\n public readonly contract: { [N in ContractName]: ethers.Contract } = {} as any;\n public readonly iface: { [N in ContractName]: ethers.utils.Interface } = {} as any;\n\n constructor(opts: ContractOptions) {\n this.provider = opts.provider;\n this.signer = opts.signer;\n\n (Object.keys(CONTRACTS) as ContractName[]).forEach((name) => {\n const { address, abi } = CONTRACTS[name];\n this.iface[name] = new ethers.utils.Interface(abi);\n this.contract[name] = new ethers.Contract(address, abi, this.signer ?? this.provider);\n });\n }\n\n /** Get raw address for a contract */\n public getAddress(name: ContractName): string {\n return CONTRACTS[name].address;\n }\n\n /** Utility: get a read-only handle even if signer is present */\n getReadOnly(name: ContractName): Contract {\n const { address, abi } = CONTRACTS[name];\n return new Contract(address, abi, this.provider);\n }\n\n /** Utility: get a write-enabled handle (throws if no signer) */\n getWrite(name: ContractName): Contract {\n if (!this.signer) throw new Error('No signer available for write calls');\n const { address, abi } = CONTRACTS[name];\n return new Contract(address, abi, this.signer);\n }\n\n /** Expose network info */\n async getNetwork() {\n return this.provider?.getNetwork();\n }\n\n /** List all known contract names */\n public listContractNames(): ContractName[] {\n return Object.keys(CONTRACTS) as ContractName[];\n }\n\n /** Get Interface instance for a contract */\n public getInterface(name: ContractName): ethers.utils.Interface {\n const iface = this.iface[name];\n if (!iface) throw new Error(`Interface not initialized for ${name}`);\n return iface;\n }\n\n /** Get live Contract instance */\n public getContract(name: ContractName): ethers.Contract {\n const ctr = this.contract[name];\n if (!ctr) throw new Error(`Contract not initialized for ${name}`);\n return ctr;\n }\n\n /** A unified Interface containing all ABIs (addresses + extra decoding-only)\n * to parse custom errors or events. */\n public get omniInterface(): ethers.utils.Interface {\n const all: any[] = [];\n\n // Add all artifacts to the interface\n const allArtifacts = [\n ERC20Artifact,\n ERC721Artifact,\n ERC1155Artifact,\n // Add more artifacts as needed\n ];\n\n // Add all ABIs to the omnibus interface\n allArtifacts.forEach(artifact => {\n if (artifact && artifact.abi) {\n all.push(...artifact.abi);\n }\n });\n\n // dedupe\n const seen = new Set<string>();\n const dedup: any[] = [];\n for (const item of all) {\n try {\n const frag = ethers.utils.Fragment.from(item);\n const key = `${frag.type}:${frag.format(ethers.utils.FormatTypes.full)}`.toLowerCase();\n if (!seen.has(key)) {\n seen.add(key);\n dedup.push(item);\n }\n } catch { }\n }\n\n return new ethers.utils.Interface(dedup);\n }\n\n /** Decode a revert or custom error payload */\n public parseError(revertData: string): ErrorDescription {\n try {\n return this.omniInterface.parseError(revertData);\n } catch {\n throw new Error(`Unable to parse error data: ${revertData}`);\n }\n }\n}","// src/networks/ethereum/ethereum.ts\n\nimport { ethers } from 'ethers';\nimport { IStakingClient, StakerConfig } from '../../staker/types';\nimport { PublicKey as WirePubKey } from '@wireio/core';\nimport { ERC20Abi } from './contract'; // TODO replace with staking contract ABI\nimport axios from 'axios';\n\n// — replace with your actual staking contract ABI & address —\nconst STAKING_CONTRACT_ADDRESS = '0xYourStakingContractAddress';\n\nexport class EthereumStakingClient implements IStakingClient {\n public readonly pubKey: WirePubKey;\n private readonly provider: ethers.providers.Web3Provider;\n private readonly signer: ethers.Signer;\n private readonly contract: ethers.Contract;\n\n constructor(private config: StakerConfig) {\n // 1) unwrap & validate Ethers provider\n if (!ethers.providers.Web3Provider.isProvider(config.provider as any)) {\n throw new Error('Expected a Web3Provider for Ethereum');\n }\n this.provider = config.provider as ethers.providers.Web3Provider;\n\n // 2) signer\n this.signer = this.provider.getSigner();\n this.pubKey = config.pubKey as WirePubKey;\n\n // 4) instantiate your contract wrapper\n this.contract = new ethers.Contract(\n STAKING_CONTRACT_ADDRESS,\n ERC20Abi,\n this.signer\n );\n }\n\n /** Submit a deposit; returns the transaction hash */\n async deposit(amount: number): Promise<string> {\n // build & send in one go\n const txResponse = await this.contract.deposit(\n ethers.BigNumber.from(amount),\n {\n // if your contract needs ETH value:\n // value: ethers.BigNumber.from(amount),\n }\n );\n\n // wait for on-chain confirmation (optional)\n await txResponse.wait();\n return txResponse.hash;\n }\n\n /** (Optional) dry-run via eth_call */\n async simulateDeposit(amount: number): Promise<any> {\n return this.provider.call({\n to: STAKING_CONTRACT_ADDRESS,\n data: this.contract.interface.encodeFunctionData('deposit', [\n ethers.BigNumber.from(amount)\n ]),\n });\n }\n\n // TODO: implement withdraw, claimRewards, etc.\n}","export const CONTRACT_NAMES = [\n 'Stake',\n] as const;\n\nexport type ContractName = typeof CONTRACT_NAMES[number];\nexport type AddressBook = Record<ContractName, string>;"],"names":["PublicKey","DepositIDL","LiqSolTokenIDL","StakeControllerIDL","StakeRegistryIDL","TreasuryIDL","ValidatorRegistryIDL","YieldOracleIDL","__spreadProps","Program","getAssociatedTokenAddressSync","TOKEN_2022_PROGRAM_ID","ASSOCIATED_TOKEN_PROGRAM_ID","distributionJson","validatorLeaderboardJson","__async","StakeProgram","BN","SystemProgram","SYSVAR_INSTRUCTIONS_PUBKEY","SYSVAR_CLOCK_PUBKEY","SYSVAR_STAKE_HISTORY_PUBKEY","SYSVAR_RENT_PUBKEY","ComputeBudgetProgram","Transaction","VersionedTransaction","web3","KeyType","Connection","AnchorProvider","SolPubKey","SolChainID","ethers","Contract"],"mappings":";;;;;;;;AAMa,MAAA,EAAA,GAAK,CAAC,IAAyB,KAAA;AACxC,EAAA,OAAO,UAAU,IAAI,CAAA,CAAA,CAAA,CAAA;AACzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
|
|
1
|
+
{"version":3,"file":"stake.js","sources":["../src/networks/solana/constants.ts","../src/networks/solana/program.ts","../src/networks/solana/clients/deposit.client.ts","../src/networks/solana/clients/distribution.client.ts","../src/networks/solana/clients/leaderboard.client.ts","../src/networks/solana/solana.ts","../src/networks/ethereum/contract.ts","../src/networks/ethereum/ethereum.ts","../src/staker/staker.ts","../src/networks/ethereum/types.ts","../src/networks/solana/utils.ts"],"sourcesContent":["// src/networks/solana/constants.ts\nimport { PublicKey, StakeProgram } from '@solana/web3.js';\n\nimport liqsolCoreIDL from \"../../assets/solana/idl/liqsol_core.json\";\nimport liqSolTokenIDL from \"../../assets/solana/idl/liqsol_token.json\";\nimport validatorLeaderboardIDL from \"../../assets/solana/idl/validator_leaderboard.json\";\n\n/**\n * ---------------------------------------------------------------------------\n * PROGRAM IDS\n * ---------------------------------------------------------------------------\n *\n * These should match:\n * - `metadata.address` in your Anchor IDLs under src/assets/solana/idl/*.json\n * - The program IDs printed by your deploy scripts\n */\n// Extract program IDs from IDL files\nexport const PROGRAM_IDS = {\n LIQSOL_CORE: new PublicKey(liqsolCoreIDL.address),\n LIQSOL_TOKEN: new PublicKey(liqSolTokenIDL.address),\n VALIDATOR_LEADERBOARD: new PublicKey(validatorLeaderboardIDL.address),\n} as const;\n\n// Export individual program IDs for convenience\nexport const {\n LIQSOL_CORE,\n LIQSOL_TOKEN,\n VALIDATOR_LEADERBOARD,\n} = PROGRAM_IDS;\n\n/**\n * ---------------------------------------------------------------------------\n * PDA SEEDS (must match on-chain programs)\n * ---------------------------------------------------------------------------\n *\n * These strings are baked into the on-chain programs and are already used in\n * your test utils. We centralize them here so all clients share them.\n */\n\nexport const PDA_SEEDS = {\n // liqsol_core: deposit / stake controller\n DEPOSIT_AUTHORITY: 'deposit_authority',\n VAULT: 'vault',\n RESERVE_POOL: 'reserve_pool',\n STAKE_CONTROLLER_STATE: 'stake_controller',\n PAYOUT_STATE: 'payout-state',\n\n // liqsol_token: mint + bucket\n LIQSOL_MINT: 'liqsol_mint',\n LIQSOL_MINT_AUTHORITY: 'mint_authority',\n BUCKET_AUTHORITY: 'liqsol_bucket',\n\n // distribution program (embedded in liqsol_core)\n DISTRIBUTION_STATE: 'distribution_state',\n USER_RECORD: 'user_record',\n\n // pay-rate history\n PAY_RATE_HISTORY: 'pay_rate_history',\n\n // validator leaderboard (state + records)\n LEADERBOARD_STATE: 'leaderboard_state',\n VALIDATOR_RECORD: 'validator',\n GLOBAL_STAKE_INFO: 'global_stake_info',\n} as const;\n\n/**\n * Helpers for PDA derivation so clients don’t duplicate logic.\n */\n\nexport const deriveLiqsolMintPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQSOL_MINT)],\n PROGRAM_IDS.LIQSOL_TOKEN,\n )[0];\n\nexport const deriveLiqsolMintAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQSOL_MINT_AUTHORITY)],\n PROGRAM_IDS.LIQSOL_TOKEN,\n )[0];\n\nexport const deriveDepositAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.DEPOSIT_AUTHORITY)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveVaultPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VAULT)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveReservePoolPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.RESERVE_POOL)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveStakeControllerStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.STAKE_CONTROLLER_STATE)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const derivePayoutStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.PAYOUT_STATE)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveBucketAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.BUCKET_AUTHORITY)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveDistributionStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.DISTRIBUTION_STATE)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveUserRecordPda = (user: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.USER_RECORD), user.toBuffer()],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const derivePayRateHistoryPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.PAY_RATE_HISTORY)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\n// export const deriveGlobalStakeInfoPda = () =>\n// PublicKey.findProgramAddressSync(\n// [Buffer.from(PDA_SEEDS.GLOBAL_STAKE_INFO)],\n// PROGRAM_IDS.LIQSOL_CORE,\n// )[0];\n\nexport const deriveLeaderboardStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LEADERBOARD_STATE)],\n PROGRAM_IDS.VALIDATOR_LEADERBOARD,\n )[0];\n\nexport const deriveValidatorRecordPda = (voteAccount: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VALIDATOR_RECORD), voteAccount.toBuffer()],\n PROGRAM_IDS.VALIDATOR_LEADERBOARD,\n )[0];\n\n/**\n* Stake controller vault PDA (reserve pool SOL vault).\n* This is the same as VAULT, but named more explicitly for SDK callers.\n*/\nexport const deriveStakeControllerVaultPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VAULT)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\n/**\n * Ephemeral stake account address used per-deposit.\n * On-chain convention: seed = `ephemeral_<u32>` under StakeProgram.programId.\n */\nexport const deriveEphemeralStakeAddress = async (\n user: PublicKey,\n seed: any,\n): Promise<PublicKey> => {\n const seedStr = `ephemeral_${seed}`;\n return await PublicKey.createWithSeed(user, seedStr, StakeProgram.programId);\n};\n\n\n\n/**\n * ---------------------------------------------------------------------------\n * ECONOMICS & MATH CONSTANTS\n * ---------------------------------------------------------------------------\n */\n\n// Same scale factor used on-chain for pay-rate math\nexport const PAY_RATE_SCALE_FACTOR = BigInt(1_000_000_000_000); // 10^12\n\n// Default pay rate fallback used in tests & utils\nexport const DEFAULT_AVERAGE_PAY_RATE = BigInt(191_780_821);\n\n// How many history entries to average when computing expected fee\nexport const DEFAULT_PAY_RATE_LOOKBACK = 5;\n\n// Rent exemption for ephemeral stake account (lamports)\n// Mirrors EPHEMERAL_RENT_EXEMPTION = 2_282_880 used in tests\nexport const EPHEMERAL_RENT_EXEMPTION = 2_282_880;\n\n// For convenience: lamports <-> SOL helpers (no RPC dependency)\nexport const LAMPORTS_PER_SOL = 1_000_000_000;\n\nexport const lamportsToSol = (lamports: number | bigint): number =>\n Number(lamports) / LAMPORTS_PER_SOL;\n\nexport const solToLamports = (sol: number): number =>\n Math.round(sol * LAMPORTS_PER_SOL);\n\n/**\n * ---------------------------------------------------------------------------\n * CLUSTER / ENVIRONMENT CONFIG (optional but handy)\n * ---------------------------------------------------------------------------\n */\n\nexport type SolanaCluster = 'localnet' | 'devnet' | 'mainnet';\n\n// export interface SolanaStakeProgramAddresses {\n// liqsolCore: PublicKey;\n// liqsolToken: PublicKey;\n// validatorLeaderboard: PublicKey;\n// }\n\n// export const PROGRAMS_BY_CLUSTER: Record<SolanaCluster, SolanaStakeProgramAddresses> = {\n// localnet: {\n// liqsolCore: PROGRAM_IDS.LIQSOL_CORE,\n// liqsolToken: PROGRAM_IDS.LIQSOL_TOKEN,\n// validatorLeaderboard: PROGRAM_IDS.VALIDATOR_LEADERBOARD,\n// },\n// devnet: {\n// liqsolCore: PROGRAM_IDS.LIQSOL_CORE,\n// liqsolToken: PROGRAM_IDS.LIQSOL_TOKEN,\n// validatorLeaderboard: PROGRAM_IDS.VALIDATOR_LEADERBOARD,\n// },\n// mainnet: {\n// liqsolCore: PROGRAM_IDS.LIQSOL_CORE,\n// liqsolToken: PROGRAM_IDS.LIQSOL_TOKEN,\n// validatorLeaderboard: PROGRAM_IDS.VALIDATOR_LEADERBOARD,\n// },\n// };\n\n// export const DEFAULT_CLUSTER: SolanaCluster = 'localnet';\n\n// export function getProgramIds(cluster: SolanaCluster = DEFAULT_CLUSTER): SolanaStakeProgramAddresses {\n// return PROGRAMS_BY_CLUSTER[cluster];\n// }","import { AnchorProvider, Program } from '@coral-xyz/anchor';\n\nimport liqsolCoreJson from '../../assets/solana/idl/liqsol_core.json';\nimport liqsolTokenJson from '../../assets/solana/idl/liqsol_token.json';\nimport validatorLeaderboardJson from '../../assets/solana/idl/validator_leaderboard.json';\n\nimport type { LiqsolCore } from '../../assets/solana/types/liqsol_core';\nimport type { LiqsolToken } from '../../assets/solana/types/liqsol_token';\nimport type { ValidatorLeaderboard } from '../../assets/solana/types/validator_leaderboard';\n\nimport { PROGRAM_IDS } from './constants';\n\ntype Entry<IDL> = {\n idl: IDL & { address: string };\n address: string;\n};\n\nconst PROGRAMS = {\n liqsolCore: {\n idl: liqsolCoreJson,\n address: PROGRAM_IDS.LIQSOL_CORE.toBase58(),\n } as Entry<LiqsolCore>,\n liqsolToken: {\n idl: liqsolTokenJson,\n address: PROGRAM_IDS.LIQSOL_TOKEN.toBase58(),\n } as Entry<LiqsolToken>,\n validatorLeaderboard: {\n idl: validatorLeaderboardJson,\n address: PROGRAM_IDS.VALIDATOR_LEADERBOARD.toBase58(),\n } as Entry<ValidatorLeaderboard>,\n} as const;\n\nexport type SolanaProgramName = keyof typeof PROGRAMS;\n\nexport class SolanaProgramService {\n constructor(private provider: AnchorProvider) { }\n\n getProgram<K extends SolanaProgramName>(name: K): Program<(typeof PROGRAMS)[K]['idl']> {\n const { idl, address } = PROGRAMS[name];\n const idlWithAddr = { ...idl, address };\n return new Program(idlWithAddr, this.provider) as Program<(typeof PROGRAMS)[K]['idl']>;\n }\n\n listProgramNames(): SolanaProgramName[] {\n return Object.keys(PROGRAMS) as SolanaProgramName[];\n }\n}","import { AnchorProvider, BN, Program } from '@coral-xyz/anchor';\nimport {\n PublicKey,\n SystemProgram,\n Transaction,\n TransactionInstruction,\n StakeProgram,\n SYSVAR_INSTRUCTIONS_PUBKEY,\n SYSVAR_CLOCK_PUBKEY,\n SYSVAR_RENT_PUBKEY,\n SYSVAR_STAKE_HISTORY_PUBKEY,\n} from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddressSync,\n} from '@solana/spl-token';\n\nimport { SolanaProgramService } from '../program';\nimport type { LiqsolCore } from '../../../assets/solana/types/liqsol_core';\n\nimport {\n PROGRAM_IDS,\n deriveDepositAuthorityPda,\n deriveLiqsolMintPda,\n deriveLiqsolMintAuthorityPda,\n deriveReservePoolPda,\n deriveVaultPda,\n deriveStakeControllerStatePda,\n deriveBucketAuthorityPda,\n derivePayRateHistoryPda,\n deriveDistributionStatePda,\n deriveUserRecordPda,\n derivePayoutStatePda,\n deriveEphemeralStakeAddress,\n} from '../constants';\n\nexport class DepositClient {\n private program: Program<LiqsolCore>;\n\n constructor(private provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('liqsolCore');\n }\n\n async buildDepositTx(\n user: PublicKey,\n lamports: number\n ): Promise<{ transaction: Transaction; ephemeralStake: PublicKey }> {\n\n const program = this.program;\n\n // -------------------------------------------------------------\n // PDAs\n // -------------------------------------------------------------\n const depositAuthority = deriveDepositAuthorityPda();\n const liqsolMint = deriveLiqsolMintPda();\n const liqsolMintAuthority = deriveLiqsolMintAuthorityPda();\n const reservePool = deriveReservePoolPda();\n const vault = deriveVaultPda();\n const controllerState = deriveStakeControllerStatePda();\n const payoutState = derivePayoutStatePda();\n const bucketAuthority = deriveBucketAuthorityPda();\n const payRateHistory = derivePayRateHistoryPda();\n const distributionState = deriveDistributionStatePda();\n const userRecord = deriveUserRecordPda(user);\n\n // -------------------------------------------------------------\n // Token-2022 ATAs\n // -------------------------------------------------------------\n const userAta = getAssociatedTokenAddressSync(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID\n );\n\n const bucketTokenAccount = getAssociatedTokenAddressSync(\n liqsolMint,\n bucketAuthority,\n true,\n TOKEN_2022_PROGRAM_ID\n );\n\n // -------------------------------------------------------------\n // Ephemeral stake\n // -------------------------------------------------------------\n const seed = Math.floor(Math.random() * 2 ** 32);\n const ephemeralStake = await deriveEphemeralStakeAddress(user, seed);\n\n // -------------------------------------------------------------\n // BUILD IX (MUST MATCH IDL)\n // -------------------------------------------------------------\n const ix: TransactionInstruction = await program.methods\n .deposit(new BN(lamports), seed)\n .accounts({\n user,\n depositAuthority,\n systemProgram: SystemProgram.programId,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n liqsolProgram: PROGRAM_IDS.LIQSOL_TOKEN,\n stakeProgram: StakeProgram.programId,\n\n liqsolMint,\n userAta,\n liqsolMintAuthority,\n reservePool,\n vault,\n ephemeralStake,\n\n controllerState,\n payoutState,\n bucketAuthority,\n bucketTokenAccount,\n\n userRecord,\n distributionState,\n payRateHistory,\n\n instructionsSysvar: SYSVAR_INSTRUCTIONS_PUBKEY,\n clock: SYSVAR_CLOCK_PUBKEY,\n stakeHistory: SYSVAR_STAKE_HISTORY_PUBKEY,\n rent: SYSVAR_RENT_PUBKEY,\n })\n .instruction();\n\n const tx = new Transaction().add(ix);\n return { transaction: tx, ephemeralStake };\n }\n}","import { AnchorProvider, Program } from '@coral-xyz/anchor';\nimport {\n ParsedAccountData,\n PublicKey,\n SYSVAR_INSTRUCTIONS_PUBKEY,\n Transaction,\n SystemProgram,\n} from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n getAssociatedTokenAddress,\n} from '@solana/spl-token';\n\nimport { SolanaProgramService } from '../program';\nimport type { LiqsolCore } from '../../../assets/solana/types/liqsol_core';\nimport {\n deriveBucketAuthorityPda,\n deriveDistributionStatePda,\n deriveLiqsolMintPda,\n derivePayRateHistoryPda,\n deriveUserRecordPda,\n} from '../constants';\nimport type { CorrectRegisterBuildResult, DistributionState, MismatchCandidate, ParsedAccountInfo, UserRecord } from '../types';\n\n/**\n * Distribution client – wraps the distribution portion of the liqsol_core\n * program. Responsible for:\n * - Reading DistributionState + UserRecord\n * - Computing mismatch candidates (tracked > actual)\n * - Building a \"correct then register\" transaction for the caller\n *\n * Aligned with the on-chain `update_user` script:\n * - Single `updateUser()` entrypoint that:\n * * Can create userRecord if missing\n * * Reconciles tracked vs actual using user, userAta, bucket, pay-rate\n */\nexport class DistributionClient {\n private program: Program<LiqsolCore>;\n\n constructor(private provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('liqsolCore');\n }\n\n get connection() {\n return this.provider.connection;\n }\n\n /**\n * Fetch the global distribution state account.\n */\n async getDistributionState(): Promise<DistributionState | null> {\n const pda = deriveDistributionStatePda();\n try {\n // IDL account name: \"distributionState\"\n return await this.program.account.distributionState.fetch(pda);\n } catch {\n return null;\n }\n }\n\n /**\n * Fetch a user's distribution userRecord (or null if missing).\n */\n async getUserRecord(user: PublicKey): Promise<UserRecord | null> {\n const pda = deriveUserRecordPda(user);\n try {\n return await this.program.account.userRecord.fetchNullable(pda);\n } catch {\n return null;\n }\n }\n\n /**\n * Helper: get actual liqSOL balances for all token holders.\n *\n * Returns a map: owner (base58) -> actual balance (BigInt)\n */\n private async getActualBalancesByOwner(): Promise<Map<string, bigint>> {\n const liqsolMint = deriveLiqsolMintPda();\n const mintStr = liqsolMint.toBase58();\n\n const accounts = await this.connection.getParsedProgramAccounts(\n TOKEN_2022_PROGRAM_ID,\n {\n filters: [\n // SPL token layout: mint at offset 0\n { memcmp: { offset: 0, bytes: mintStr } },\n ],\n commitment: 'confirmed',\n },\n );\n\n const byOwner = new Map<string, bigint>();\n\n for (const acct of accounts) {\n const data = acct.account.data as ParsedAccountData;\n const parsed = data.parsed;\n if (!parsed || parsed.type !== 'account') continue;\n\n const info: ParsedAccountInfo = parsed.info;\n const ownerStr = info.owner;\n const amountStr = info.tokenAmount.amount;\n const amount = BigInt(amountStr);\n\n const prev = byOwner.get(ownerStr) ?? BigInt(0);\n byOwner.set(ownerStr, prev + amount);\n }\n\n return byOwner;\n }\n\n /**\n * Helper: get tracked balances from all userRecord accounts,\n * keyed by *actual wallet owner*, not the userRecord PDA.\n *\n * userRecord struct:\n * - userAta: pubkey\n * - trackedBalance: u64\n * - claimBalance: u64\n * - lastClaimTimestamp: i64\n * - bump: u8\n */\n private async getTrackedBalances(): Promise<\n Map<string, { owner: PublicKey; tracked: bigint }>\n > {\n const records = await this.program.account.userRecord.all();\n const map = new Map<string, { owner: PublicKey; tracked: bigint }>();\n\n for (const r of records) {\n const ur = r.account as UserRecord;\n const userAta = ur.userAta as PublicKey;\n\n // Resolve the *wallet* that owns this ATA\n const ataInfo = await this.connection.getParsedAccountInfo(userAta);\n const parsedData = ataInfo.value?.data as ParsedAccountData | undefined;\n if (!parsedData) continue;\n\n const parsed = parsedData.parsed;\n if (!parsed || (parsed as any).type !== 'account') continue;\n\n const info: ParsedAccountInfo = parsed.info;\n const ownerStr = info.owner;\n const owner = new PublicKey(ownerStr);\n\n const tracked = BigInt(ur.trackedBalance.toString());\n map.set(ownerStr, { owner, tracked });\n }\n\n return map;\n }\n\n /**\n * Discover all mismatch candidates where tracked > actual.\n *\n * - actual balances are derived from token accounts for the liqSOL mint\n * - tracked balances come from Distribution.userRecord\n */\n private async deriveMismatchCandidates(): Promise<MismatchCandidate[]> {\n const [actualByOwner, trackedByOwner] = await Promise.all([\n this.getActualBalancesByOwner(),\n this.getTrackedBalances(),\n ]);\n\n const out: MismatchCandidate[] = [];\n\n for (const [ownerStr, { owner, tracked }] of trackedByOwner.entries()) {\n const actual = actualByOwner.get(ownerStr) ?? BigInt(0);\n const delta = tracked - actual;\n if (delta > BigInt(0)) {\n out.push({ owner, actual, tracked, delta });\n }\n }\n\n // Largest discrepancy first\n out.sort((a, b) => (b.delta > a.delta ? 1 : b.delta < a.delta ? -1 : 0));\n return out;\n }\n\n /**\n * Canonical helper to build an `updateUser` instruction for a given user,\n * matching the standalone update-user.ts script.\n */\n private async buildUpdateUserIx(targetUser: PublicKey) {\n const walletPk = this.provider.wallet.publicKey;\n\n const distributionStatePDA = deriveDistributionStatePda();\n const userRecordPDA = deriveUserRecordPda(targetUser);\n const liqsolMintPDA = deriveLiqsolMintPda();\n const payRateHistoryPDA = derivePayRateHistoryPda();\n const bucketAuthorityPDA = deriveBucketAuthorityPda();\n\n const userAta = await getAssociatedTokenAddress(\n liqsolMintPDA,\n targetUser,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n const bucketTokenAccount = await getAssociatedTokenAddress(\n liqsolMintPDA,\n bucketAuthorityPDA,\n true, // allowOwnerOffCurve\n TOKEN_2022_PROGRAM_ID,\n );\n\n return (this.program.methods as any)\n .updateUser()\n .accounts({\n user: targetUser,\n userAta,\n userRecord: userRecordPDA,\n authority: walletPk,\n payer: walletPk,\n distributionState: distributionStatePDA,\n liqsolMint: liqsolMintPDA,\n instructionsSysvar: SYSVAR_INSTRUCTIONS_PUBKEY,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n bucketAuthority: bucketAuthorityPDA,\n bucketTokenAccount,\n payRateHistory: payRateHistoryPDA,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n /**\n * Build the \"correct & register\" transaction.\n *\n * - Fetches DistributionState + all userRecords + token holders\n * - Computes caller's untracked amount (actual - tracked)\n * - If DistributionState.availableBalance already covers that, we only\n * send updateUser(caller).\n * - Otherwise we select top mismatch candidates until their freed deltas\n * cover the shortfall, then build updateUser(target) for each,\n * followed by updateUser(caller).\n *\n * NOTE:\n * - This no longer uses a separate updateSpecificUser; the single\n * updateUser entrypoint accepts any `user` as long as authority/payer\n * are valid, per your script.\n */\n async buildCorrectRegisterTx(opts: {\n amount?: bigint;\n maxCandidates?: number;\n } = {}): Promise<CorrectRegisterBuildResult> {\n const walletPk = this.provider.wallet.publicKey;\n const callerStr = walletPk.toBase58();\n\n const [distState, actualByOwner, trackedByOwner] = await Promise.all([\n this.getDistributionState(),\n this.getActualBalancesByOwner(),\n this.getTrackedBalances(),\n ]);\n\n if (!distState) {\n return {\n needToRegister: false,\n canSucceed: false,\n reason: 'DistributionState not initialized',\n transaction: undefined,\n plan: { deficit: BigInt(0), willFree: BigInt(0), selected: [] },\n };\n }\n\n const availableBalance = BigInt(distState.availableBalance.toString());\n\n const trackedEntry =\n trackedByOwner.get(callerStr) ?? {\n owner: walletPk,\n tracked: BigInt(0),\n };\n\n const actual = actualByOwner.get(callerStr) ?? BigInt(0);\n const tracked = trackedEntry.tracked;\n const untracked = actual - tracked;\n\n // Nothing to register\n if (untracked <= BigInt(0)) {\n return {\n needToRegister: false,\n canSucceed: true,\n reason: 'No untracked liqSOL to register',\n transaction: undefined,\n plan: { deficit: BigInt(0), willFree: BigInt(0), selected: [] },\n };\n }\n\n // Optional user-specified cap on how much to register.\n const targetRegister =\n opts.amount && opts.amount > BigInt(0) ? opts.amount : untracked;\n\n // Simple case: availableBalance already covers what we want to register\n if (availableBalance >= targetRegister) {\n const tx = new Transaction();\n const ix = await this.buildUpdateUserIx(walletPk); // caller only\n tx.add(ix);\n\n return {\n needToRegister: true,\n canSucceed: true,\n transaction: tx,\n plan: { deficit: BigInt(0), willFree: BigInt(0), selected: [] },\n };\n }\n\n // Need to free up more availableBalance by correcting others.\n const deficit = targetRegister - availableBalance;\n\n const allCandidates = await this.deriveMismatchCandidates();\n const maxCandidates = opts.maxCandidates ?? 10;\n\n const selected: MismatchCandidate[] = [];\n let willFree = BigInt(0);\n\n for (const c of allCandidates) {\n if (c.owner.equals(walletPk)) continue; // don't self-correct here\n selected.push(c);\n willFree += c.delta;\n if (willFree >= deficit || selected.length >= maxCandidates) break;\n }\n\n if (willFree < deficit) {\n return {\n needToRegister: true,\n canSucceed: false,\n reason: 'Not enough mismatched candidates to cover deficit',\n transaction: undefined,\n plan: { deficit, willFree, selected },\n };\n }\n\n const tx = new Transaction();\n\n // 1) Correct selected mismatched users.\n for (const c of selected) {\n const ix = await this.buildUpdateUserIx(c.owner);\n tx.add(ix);\n }\n\n // 2) Register caller (updateUser(caller)).\n {\n const ix = await this.buildUpdateUserIx(walletPk);\n tx.add(ix);\n }\n\n return {\n needToRegister: true,\n canSucceed: true,\n transaction: tx,\n plan: { deficit, willFree, selected },\n };\n }\n}","import { AnchorProvider, Program } from '@coral-xyz/anchor';\nimport { PublicKey } from '@solana/web3.js';\n\nimport { SolanaProgramService } from '../program';\nimport type { ValidatorLeaderboard } from '../../../assets/solana/types/validator_leaderboard';\nimport {\n deriveLeaderboardStatePda,\n deriveValidatorRecordPda,\n} from '../constants';\n\n/**\n * Simple read client for the validator_leaderboard program.\n *\n * Adjust account names/fields to match your IDL (state, validatorRecord, etc).\n */\nexport class LeaderboardClient {\n private program: Program<ValidatorLeaderboard>;\n\n constructor(private provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('validatorLeaderboard');\n }\n\n async getState(): Promise<any | null> {\n const pda = deriveLeaderboardStatePda();\n try {\n // Assumes account name \"leaderboardState\"\n return await this.program.account.leaderboardState.fetch(pda);\n } catch {\n return null;\n }\n }\n\n async getValidatorRecord(voteAccount: PublicKey): Promise<any | null> {\n const pda = deriveValidatorRecordPda(voteAccount);\n try {\n // Assumes account name \"validatorRecord\"\n return await this.program.account.validatorRecord.fetchNullable(pda);\n } catch {\n return null;\n }\n }\n\n /**\n * Convenience helper to fetch and sort top validators by score.\n * Assumes `validatorRecord` has a numeric `score` field in the IDL.\n */\n async getTopValidators(limit = 20): Promise<any[]> {\n const records = await (this.program.account as any).validatorRecord.all();\n const sorted = (records as Array<{ publicKey: PublicKey; account: any }>).sort(\n (a, b) => {\n const sa = BigInt(a.account.score?.toString?.() ?? '0');\n const sb = BigInt(b.account.score?.toString?.() ?? '0');\n return sb > sa ? 1 : sb < sa ? -1 : 0;\n },\n );\n return sorted.slice(0, limit);\n }\n}","import {\n Commitment,\n Connection,\n ConnectionConfig,\n PublicKey as SolPubKey,\n Transaction,\n TransactionSignature,\n} from '@solana/web3.js';\nimport { AnchorProvider } from '@coral-xyz/anchor';\nimport { BaseSignerWalletAdapter } from '@solana/wallet-adapter-base';\nimport { getAssociatedTokenAddressSync, TOKEN_2022_PROGRAM_ID } from '@solana/spl-token';\n\nimport { ChainID, ExternalNetwork, KeyType, PublicKey } from '@wireio/core';\nimport { IStakingClient, Portfolio, StakerConfig } from '../../staker/types';\n\nimport { DepositClient } from './clients/deposit.client';\nimport { DistributionClient } from './clients/distribution.client';\nimport {\n deriveLiqsolMintPda,\n deriveReservePoolPda,\n deriveVaultPda,\n} from './constants';\nimport { SolanaTransaction, UserRecord } from './types';\nimport { LeaderboardClient } from './clients/leaderboard.client';\n\nconst commitment: Commitment = 'confirmed';\n\nexport class SolanaStakingClient implements IStakingClient {\n public pubKey: PublicKey;\n public connection: Connection;\n public anchor: AnchorProvider;\n\n private depositClient: DepositClient;\n private distributionClient: DistributionClient;\n private leaderboardClient: LeaderboardClient;\n\n get solPubKey(): SolPubKey {\n return new SolPubKey(this.pubKey.data.array);\n }\n\n get network() {\n return this.config.network;\n }\n\n constructor(private config: StakerConfig) {\n const adapter = config.provider as BaseSignerWalletAdapter;\n if (!adapter.publicKey) {\n throw new Error('Solana wallet adapter not connected');\n }\n if (!config.network.rpcUrls.length) {\n throw new Error('No RPC URLs provided');\n }\n\n const publicKey = adapter.publicKey;\n const wirePub = new PublicKey(KeyType.ED, publicKey.toBytes());\n if (!wirePub.equals(config.pubKey)) {\n throw new Error(\"Passed-in pubKey doesn't match adapter.publicKey\");\n }\n\n const opts: ConnectionConfig = { commitment };\n if (config.network.rpcUrls.length > 1 && config.network.rpcUrls[1].startsWith('ws')) {\n opts.wsEndpoint = config.network.rpcUrls[1];\n }\n\n this.pubKey = wirePub;\n this.connection = new Connection(config.network.rpcUrls[0], opts);\n\n const anchorWallet = {\n publicKey,\n async signTransaction<T extends SolanaTransaction>(tx: T): Promise<T> {\n return adapter.signTransaction(tx);\n },\n async signAllTransactions<T extends SolanaTransaction>(txs: T[]): Promise<T[]> {\n return Promise.all(txs.map((tx) => adapter.signTransaction(tx)));\n },\n };\n\n this.anchor = new AnchorProvider(this.connection, anchorWallet, { commitment });\n\n this.depositClient = new DepositClient(this.anchor);\n this.distributionClient = new DistributionClient(this.anchor);\n this.leaderboardClient = new LeaderboardClient(this.anchor);\n }\n\n /**\n * Resolve the user's liqSOL ATA and balances + key protocol balances.\n * native = SOL in wallet\n * actual = liqSOL token balance (from ATA)\n * tracked = liqSOL tracked balance (from Distribution.userRecord)\n */\n async getPortfolio(): Promise<Portfolio> {\n try {\n const user = this.solPubKey;\n const reservePoolPDA = deriveReservePoolPda();\n const vaultPDA = deriveVaultPda();\n const liqsolMint = deriveLiqsolMintPda();\n const userLiqsolAta = getAssociatedTokenAddressSync(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n const [nativeLamports, actualBalResp, userRecord] = await Promise.all([\n this.connection.getBalance(user),\n this.connection.getTokenAccountBalance(userLiqsolAta).catch(() => null),\n this.distributionClient.getUserRecord(user).catch(() => null),\n ]);\n\n const actualAmountStr = actualBalResp?.value?.amount ?? '0';\n const actualDecimals = actualBalResp?.value?.decimals ?? 9;\n\n const trackedAmountStr = userRecord?.trackedBalance\n ? userRecord.trackedBalance.toString()\n : '0';\n const trackedDecimals = actualDecimals;\n\n const portfolio: Portfolio = {\n native: {\n symbol: 'SOL',\n decimals: 9,\n amount: BigInt(nativeLamports),\n },\n actual: {\n symbol: 'LiqSOL',\n decimals: actualDecimals,\n amount: BigInt(actualAmountStr),\n },\n tracked: {\n symbol: 'LiqSOL',\n decimals: trackedDecimals,\n amount: BigInt(trackedAmountStr),\n },\n extras: {\n userLiqsolAta: userLiqsolAta.toBase58(),\n reservePoolPDA: reservePoolPDA.toBase58(),\n vaultPDA: vaultPDA.toBase58(),\n },\n };\n\n return portfolio;\n }\n catch (error) {\n console.log('Error in getPortfolio:', error);\n throw error;\n }\n }\n\n /**\n * Optional: fetch your Distribution program user record\n * (often contains per-user deposit/claim state).\n * @returns UserRecord or null\n */\n async getUserRecord() {\n return this.distributionClient.getUserRecord(this.solPubKey);\n }\n\n getProtocolFee() {\n // TODO: wire to pay-rate math once we finalize protocol fee API\n }\n\n /**\n * Build, sign, and submit a single transaction that:\n * - Corrects other users (if needed) to free available balance, then\n * - Registers the caller’s untracked liqSOL.\n *\n * @param amount Optional: register a smaller amount than your full untracked balance.\n * @returns signature string\n */\n async register(amount?: bigint): Promise<string> {\n try {\n const build = await this.distributionClient.buildCorrectRegisterTx({ amount });\n if (!build.canSucceed || !build.transaction) {\n throw new Error(build.reason ?? 'Unable to build Correct&Register transaction');\n }\n\n const { tx, blockhash, lastValidBlockHeight } = await this.prepareTx(build.transaction);\n const signed = await this.signTransaction(tx);\n const result = await this.sendAndConfirmHttp(signed, { blockhash, lastValidBlockHeight });\n\n console.log('Registered:', {\n needToRegister: build.needToRegister,\n freed: build.plan.willFree,\n corrected: build.plan.selected.map((c) => ({\n owner: c.owner?.toBase58(),\n delta: c.delta?.toString(),\n })),\n });\n\n return result.signature;\n } catch (error) {\n console.error('Error in register:', error);\n throw error;\n }\n }\n\n /**\n * Deposit funds into the staking pool.\n * @param lamports The amount to deposit (in lamports).\n * @returns The transaction signature.\n */\n async deposit(lamports: number): Promise<string> {\n const { transaction } = await this.depositClient.buildDepositTx(this.solPubKey, lamports);\n const { tx, blockhash, lastValidBlockHeight } = await this.prepareTx(transaction);\n const signed = await this.signTransaction(tx);\n const result = await this.sendAndConfirmHttp(signed, { blockhash, lastValidBlockHeight });\n return result.signature;\n }\n\n private async sendAndConfirmHttp(\n signed: SolanaTransaction,\n ctx: { blockhash: string; lastValidBlockHeight: number },\n ): Promise<TxResult> {\n const signature = await this.connection.sendRawTransaction(signed.serialize(), {\n skipPreflight: false,\n preflightCommitment: commitment,\n maxRetries: 3,\n });\n\n const conf = await this.connection.confirmTransaction(\n { signature, blockhash: ctx.blockhash, lastValidBlockHeight: ctx.lastValidBlockHeight },\n commitment,\n );\n\n const ok = !conf.value.err;\n if (!ok) {\n throw new Error(`Transaction failed: ${JSON.stringify(conf.value.err)}`);\n }\n return { signature, slot: conf.context.slot, confirmed: true };\n }\n\n async signTransaction(tx: SolanaTransaction): Promise<SolanaTransaction> {\n return this.anchor.wallet.signTransaction(tx);\n }\n\n async sendTransaction(signed: SolanaTransaction): Promise<TransactionSignature> {\n return this.anchor.sendAndConfirm(signed);\n }\n\n async prepareTx(\n tx: Transaction,\n ): Promise<{ tx: Transaction; blockhash: string; lastValidBlockHeight: number }> {\n const { blockhash, lastValidBlockHeight } = await this.connection.getLatestBlockhash('confirmed');\n tx.recentBlockhash = blockhash;\n tx.feePayer = this.solPubKey;\n\n return { tx, blockhash, lastValidBlockHeight };\n }\n}\n\nexport interface TxResult {\n signature: string;\n slot: number;\n confirmed: boolean;\n}","/**\n * @module EthereumContractService\n *\n * Provides a unified service for interacting with Ethereum smart contracts using ethers.js.\n */\n// TODO: adjust these import paths to your actual artifact layout\n// import DepositManagerArtifact from '../../assets/ethereum/ABI/liqeth/DepositManager.sol/DepositManager.json';\n// import LiqEthArtifact from '../../assets/ethereum/ABI/liqeth/liqEth.sol/liqEth.json';\n// import LiqEthMintArtifact from '../../assets/ethereum/ABI/liqeth/liqEthMint.sol/liqEthMint.json';\n// import LiqEthBurnArtifact from '../../assets/ethereum/ABI/liqeth/liqEthBurn.sol/liqEthBurn.json';\n// import LiqEthTreasuryArtifact from '../../assets/ethereum/ABI/liqeth/liqEthTreasury.sol/liqEthTreasury.json';\n// import LiqEthCommonArtifact from '../../assets/ethereum/ABI/liqeth/LiqEthCommon.sol/LiqEthCommon.json';\n// import RewardsERC20Artifact from '../../assets/ethereum/ABI/liqeth/RewardsERC20.sol/RewardsERC20.json';\n// import ValidatorBalanceVerifierArtifact from '../../assets/ethereum/ABI/liqeth/ValidatorBalanceVerifier.sol/ValidatorBalanceVerifier.json';\n// import YieldArtifact from '../../assets/ethereum/ABI/liqeth/Yield.sol/Yield.json';\n// import AccountingArtifact from '../../assets/ethereum/ABI/liqeth/accounting.sol/accounting.json';\n// import StakingModuleArtifact from '../../assets/ethereum/ABI/liqeth/stakingModule.sol/stakingModule.json';\n// import WithdrawalQueueArtifact from '../../assets/ethereum/ABI/liqeth/withdrawalQueue.sol/withdrawalQueue.json';\n// import WithdrawalVaultArtifact from '../../assets/ethereum/ABI/liqeth/withdrawalVault.sol/withdrawalVault.json';\n\nimport ERC20Artifact from '../../assets/ethereum/ABI/token/ERC20Token.sol/ERC20Token.json';\nimport ERC721Artifact from '../../assets/ethereum/ABI/token/ERC721Token.sol/ERC721Token.json';\nimport ERC1155Artifact from '../../assets/ethereum/ABI/token/ERC1155Token.sol/ERC1155Token.json';\nimport { AddressBook, ContractName } from './types';\nimport { Contract, ethers, providers, Signer } from 'ethers';\nimport { JsonFragment } from '@ethersproject/abi';\nimport { ErrorDescription } from '@ethersproject/abi/lib/interface';\n\nexport const ERC20Abi = ERC20Artifact.abi;\nexport const ERC721Abi = ERC721Artifact.abi;\nexport const ERC1155Abi = ERC1155Artifact.abi;\n\n// -----------------------------------------------------------------------------\n// Address book\n// -----------------------------------------------------------------------------\n\n// Make sure ContractName in ./types includes all of these keys.\nexport const ADDRESSES: AddressBook = {\n // Outpost/Stake entrypoint\n Stake: '0xEeaCBa95852324eAc63fE2711aFe0283adf3bC93', // TODO\n\n // liqETH protocol suite\n DepositManager: '0xDepositManagerAddress',\n LiqEth: '0xLiqEthTokenAddress',\n LiqEthMint: '0xLiqEthMintAddress',\n LiqEthBurn: '0xLiqEthBurnAddress',\n LiqEthTreasury: '0xLiqEthTreasuryAddress',\n LiqEthCommon: '0xLiqEthCommonAddress',\n RewardsERC20: '0xRewardsErc20Address',\n ValidatorBalanceVerifier: '0xValidatorBalanceVerifierAddress',\n Yield: '0xYieldAddress',\n Accounting: '0xAccountingAddress',\n StakingModule: '0xStakingModuleAddress',\n WithdrawalQueue: '0xWithdrawalQueueAddress',\n WithdrawalVault: '0xWithdrawalVaultAddress',\n};\n\nexport type Contracts<T extends string = ContractName> = Record<T, ContractConfig>;\n\nexport type ContractConfig = {\n address: string;\n abi: JsonFragment[];\n};\n\n// -----------------------------------------------------------------------------\n// Contract config\n// -----------------------------------------------------------------------------\n\nexport const CONTRACTS: Contracts<ContractName> = {\n // Outpost/Stake (wire ABI when available)\n Stake: { address: ADDRESSES.Stake, abi: undefined as any }, // TODO: Stake artifact\n\n // liqETH suite\n LiqEth: {\n address: ADDRESSES.LiqEth,\n abi: undefined as any,\n // abi: LiqEthArtifact.abi as JsonFragment[],\n },\n DepositManager: {\n address: ADDRESSES.DepositManager,\n abi: undefined as any,\n // abi: DepositManagerArtifact.abi as JsonFragment[],\n },\n LiqEthMint: {\n address: ADDRESSES.LiqEthMint,\n abi: undefined as any,\n // abi: LiqEthMintArtifact.abi as JsonFragment[],\n },\n LiqEthBurn: {\n address: ADDRESSES.LiqEthBurn,\n abi: undefined as any,\n // abi: LiqEthBurnArtifact.abi as JsonFragment[],\n },\n LiqEthTreasury: {\n address: ADDRESSES.LiqEthTreasury,\n abi: undefined as any,\n // abi: LiqEthTreasuryArtifact.abi as JsonFragment[],\n },\n LiqEthCommon: {\n address: ADDRESSES.LiqEthCommon,\n abi: undefined as any,\n // abi: LiqEthCommonArtifact.abi as JsonFragment[],\n },\n RewardsERC20: {\n address: ADDRESSES.RewardsERC20,\n abi: undefined as any,\n // abi: RewardsERC20Artifact.abi as JsonFragment[],\n },\n ValidatorBalanceVerifier: {\n address: ADDRESSES.ValidatorBalanceVerifier,\n abi: undefined as any,\n // abi: ValidatorBalanceVerifierArtifact.abi as JsonFragment[],\n },\n Yield: {\n address: ADDRESSES.Yield,\n abi: undefined as any,\n // abi: YieldArtifact.abi as JsonFragment[],\n },\n Accounting: {\n address: ADDRESSES.Accounting,\n abi: undefined as any,\n // abi: AccountingArtifact.abi as JsonFragment[],\n },\n StakingModule: {\n address: ADDRESSES.StakingModule,\n abi: undefined as any,\n // abi: StakingModuleArtifact.abi as JsonFragment[],\n },\n WithdrawalQueue: {\n address: ADDRESSES.WithdrawalQueue,\n abi: undefined as any,\n // abi: WithdrawalQueueArtifact.abi as JsonFragment[],\n },\n WithdrawalVault: {\n address: ADDRESSES.WithdrawalVault,\n abi: undefined as any,\n // abi: WithdrawalVaultArtifact.abi as JsonFragment[],\n },\n};\n\nexport interface ContractOptions {\n /** RPC endpoint or injected EIP-1193 provider */\n provider?: ethers.providers.Provider;\n /** Only required if you need to send txns */\n signer?: Signer;\n}\n\nexport class EthereumContractService {\n private provider?: providers.Provider;\n private signer?: Signer;\n\n public readonly contract: { [N in ContractName]: ethers.Contract } = {} as any;\n public readonly iface: { [N in ContractName]: ethers.utils.Interface } = {} as any;\n\n constructor(opts: ContractOptions) {\n this.provider = opts.provider;\n this.signer = opts.signer;\n\n (Object.keys(CONTRACTS) as ContractName[]).forEach((name) => {\n const { address, abi } = CONTRACTS[name];\n this.iface[name] = new ethers.utils.Interface(abi);\n this.contract[name] = new ethers.Contract(\n address,\n abi,\n this.signer ?? this.provider\n );\n });\n }\n\n /** Get raw address for a contract */\n public getAddress(name: ContractName): string {\n return CONTRACTS[name].address;\n }\n\n /** Utility: get a read-only handle even if signer is present */\n public getReadOnly(name: ContractName): Contract {\n const { address, abi } = CONTRACTS[name];\n return new Contract(address, abi, this.provider);\n }\n\n /** Utility: get a write-enabled handle (throws if no signer) */\n public getWrite(name: ContractName): Contract {\n if (!this.signer) throw new Error('No signer available for write calls');\n const { address, abi } = CONTRACTS[name];\n return new Contract(address, abi, this.signer);\n }\n\n /** Expose network info */\n async getNetwork() {\n return this.provider?.getNetwork();\n }\n\n /** List all known contract names */\n public listContractNames(): ContractName[] {\n return Object.keys(CONTRACTS) as ContractName[];\n }\n\n /** Get Interface instance for a contract */\n public getInterface(name: ContractName): ethers.utils.Interface {\n const iface = this.iface[name];\n if (!iface) throw new Error(`Interface not initialized for ${name}`);\n return iface;\n }\n\n /** Get live Contract instance */\n public getContract(name: ContractName): ethers.Contract {\n const ctr = this.contract[name];\n if (!ctr) throw new Error(`Contract not initialized for ${name}`);\n return ctr;\n }\n\n /** A unified Interface containing all ABIs to parse custom errors or events. */\n public get omniInterface(): ethers.utils.Interface {\n const all: any[] = [];\n\n const allArtifacts = [\n ERC20Artifact,\n ERC721Artifact,\n ERC1155Artifact,\n\n // liqETH suite\n // DepositManagerArtifact,\n // LiqEthArtifact,\n // LiqEthMintArtifact,\n // LiqEthBurnArtifact,\n // LiqEthTreasuryArtifact,\n // LiqEthCommonArtifact,\n // RewardsERC20Artifact,\n // ValidatorBalanceVerifierArtifact,\n // YieldArtifact,\n // AccountingArtifact,\n // StakingModuleArtifact,\n // WithdrawalQueueArtifact,\n // WithdrawalVaultArtifact,\n ];\n\n allArtifacts.forEach(artifact => {\n if (artifact && artifact.abi) {\n all.push(...artifact.abi);\n }\n });\n\n const seen = new Set<string>();\n const dedup: any[] = [];\n for (const item of all) {\n try {\n const frag = ethers.utils.Fragment.from(item);\n const key = `${frag.type}:${frag.format(ethers.utils.FormatTypes.full)}`.toLowerCase();\n if (!seen.has(key)) {\n seen.add(key);\n dedup.push(item);\n }\n } catch {\n // ignore bad fragments\n }\n }\n\n return new ethers.utils.Interface(dedup);\n }\n\n /** Decode a revert or custom error payload */\n public parseError(revertData: string): ErrorDescription {\n try {\n return this.omniInterface.parseError(revertData);\n } catch {\n throw new Error(`Unable to parse error data: ${revertData}`);\n }\n }\n}","// src/networks/ethereum/ethereum.ts\n\nimport { BigNumber, BigNumberish, ethers } from 'ethers';\nimport { IStakingClient, Portfolio, StakerConfig } from '../../staker/types';\nimport { PublicKey as WirePubKey } from '@wireio/core';\nimport { ERC20Abi, EthereumContractService } from './contract'; // TODO replace with staking contract ABI\nimport { DepositEvent, DepositResult } from './types';\n\n// TODO extend to implement ISTAKINGCLIENT\nexport class EthereumStakingClient implements IStakingClient {\n public readonly pubKey: WirePubKey;\n private readonly provider: ethers.providers.Web3Provider;\n private readonly signer: ethers.Signer;\n private readonly contractService: EthereumContractService;\n\n get contract() { return this.contractService.contract; }\n get network() { return this.config.network; }\n\n constructor(private config: StakerConfig) {\n if (!ethers.providers.Web3Provider.isProvider(config.provider)) {\n throw new Error('Expected a Web3Provider for Ethereum');\n }\n this.provider = config.provider as ethers.providers.Web3Provider;\n this.signer = this.provider.getSigner();\n this.pubKey = config.pubKey as WirePubKey;\n\n this.contractService = new EthereumContractService({\n provider: this.provider,\n signer: this.signer,\n });\n }\n\n // ---------------------------------------------------------------------\n // Public IStakingClient.deposit\n // ---------------------------------------------------------------------\n\n /**\n * Deposit native ETH into the liqETH protocol via DepositManager.\n * @param amount Amount in wei (or something convertible to BigNumber).\n * Keep this as a bigint / string in the caller; avoid JS floats.\n * @returns transaction hash\n */\n async deposit(amount: number | string | bigint | BigNumber): Promise<string> {\n const amountWei = BigNumber.isBigNumber(amount)\n ? amount\n : BigNumber.from(amount);\n\n const result = await this.performDeposit(amountWei);\n // For now, IStakingClient contract is: just return tx hash.\n // If/when you extend the interface, you can surface more here.\n return result.txHash;\n }\n /**\n * Simulate a deposit via callStatic.\n *\n * Useful for pre-flight checks; will throw with the same revert\n * reason as a real tx if it would fail.\n */\n async simulateDeposit(amount: number | string | bigint | BigNumber): Promise<void> {\n const amountWei = BigNumber.isBigNumber(amount)\n ? amount\n : BigNumber.from(amount);\n\n // callStatic executes the function locally without sending a tx.\n // deposit() doesn't return anything, so we only care if it reverts.\n await this.contract.DepositManager.callStatic.deposit({\n value: amountWei,\n });\n }\n\n private async performDeposit(amountWei: BigNumber): Promise<DepositResult> {\n // Pre-check minDeposit\n const minDeposit: BigNumber = await this.contract.DepositManager.minDeposit();\n if (amountWei.lt(minDeposit)) {\n throw new Error(\n `Deposit amount below minDeposit: ` +\n `amount=${ethers.utils.formatEther(amountWei)} ETH, ` +\n `min=${ethers.utils.formatEther(minDeposit)} ETH`\n );\n }\n\n // Send the payable tx\n const tx = await this.contract.DepositManager.deposit({\n value: amountWei,\n });\n\n // Wait for 1 confirmation \n const receipt = await tx.wait(1);\n\n // Parse Deposited event if present\n let deposited: DepositEvent | undefined;\n const ev = receipt.events?.find((e) => e.event === 'Deposited');\n\n if (ev && ev.args) {\n const { user, netEth, fee, shares } = ev.args;\n deposited = {\n user,\n netEth: BigNumber.from(netEth),\n fee: BigNumber.from(fee),\n shares: BigNumber.from(shares),\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n deposited,\n };\n }\n\n /**\n * Build, sign, and submit a single transaction that:\n * - Corrects other users (if needed) to free available balance, then\n * - Registers the caller’s untracked liqSOL.\n *\n * @param amount Optional: register a smaller amount than your full untracked balance.\n * @returns signature string\n */\n async register(amount?: bigint): Promise<string> {\n try {\n return 'Not implemented yet for Ethereum';\n } catch (error) {\n console.error('Error in register:', error);\n throw error;\n }\n }\n\n /**\n * Resolve the user's ETH + liqETH balances.\n *\n * native = ETH in wallet\n * actual = liqETH token balance (ERC-20)\n * tracked = liqETH tracked balance (protocol/accounting view)\n */\n async getPortfolio(): Promise<Portfolio> {\n const walletAddress = await this.signer.getAddress();\n\n // 1) Native ETH balance\n const nativeBalance = await this.provider.getBalance(walletAddress);\n const nativeDecimals =\n this.network?.nativeCurrency?.decimals ?? 18;\n const nativeSymbol =\n this.network?.nativeCurrency?.symbol ?? 'ETH';\n\n // 2) liqETH ERC-20 balance (actual)\n const actualBalance: ethers.BigNumber = await this.contract.LiqEth.balanceOf(walletAddress);\n const liqDecimals = 18; // if you want, read decimals() once and cache\n const liqSymbol = 'liqETH';\n\n // 3) Protocol \"tracked\" balance (Accounting)\n let trackedBalance: ethers.BigNumber = actualBalance;\n\n try {\n // Adjust this to your real view method:\n // e.g. function getUserBalance(address user)\n const result = await this.contract.Accounting.getUserBalance(walletAddress);\n\n // Support either struct or plain uint256\n if (result && typeof result === 'object' && 'amount' in result) {\n trackedBalance = result.amount;\n // if result.decimals exists and differs, override liqDecimals if desired\n } else if (result != null) {\n trackedBalance = result;\n }\n } catch (err) {\n console.warn(\n '[EthereumStakingClient] getPortfolio: Accounting view unavailable, using actual balance as tracked.',\n err\n );\n trackedBalance = actualBalance;\n }\n\n return {\n native: {\n amount: nativeBalance,\n decimals: nativeDecimals,\n symbol: nativeSymbol,\n },\n actual: {\n amount: actualBalance,\n decimals: liqDecimals,\n symbol: liqSymbol,\n },\n tracked: {\n amount: trackedBalance,\n decimals: liqDecimals,\n symbol: liqSymbol,\n },\n };\n }\n\n // TODO: implement withdraw, claimRewards, etc.\n}","// src/staker/staker.ts\n\nimport { ChainID, EvmChainID, SolChainID } from '@wireio/core';\nimport { IStakingClient, StakerConfig } from './types';\nimport { SolanaStakingClient } from '../networks/solana/solana';\nimport { EthereumStakingClient } from '../networks/ethereum/ethereum';\n\nexport class Staker {\n public selectedChainID?: ChainID;\n private clients: Map<ChainID, IStakingClient> = new Map();\n\n /**\n * Get the staking client for the currently selected chain.\n * @returns The staking client instance.\n */\n get client(): IStakingClient | undefined {\n return this.selectedChainID && this.isConfigured(this.selectedChainID)\n ? this.clients.get(this.selectedChainID) : undefined;\n }\n\n /** Is there a client configured for this chain? */\n isConfigured(chainId: ChainID): boolean {\n return this.clients.has(chainId);\n }\n\n /** List of configured chains */\n listConfigured(): ChainID[] {\n return [...this.clients.keys()];\n }\n\n constructor(config: StakerConfig | StakerConfig[], selectedChainID?: ChainID) {\n if (!config) throw new Error('StakerConfig is required');\n if (!Array.isArray(config)) config = [config];\n\n config.forEach((cfg) => {\n switch (cfg.network.chainId) {\n case SolChainID.WireTestnet:\n this.clients.set(cfg.network.chainId, new SolanaStakingClient(cfg));\n break;\n\n case EvmChainID.Hoodi:\n this.clients.set(EvmChainID.Hoodi, new EthereumStakingClient(cfg));\n break;\n default:\n // console.log(`No staking client available for chain ${cfg.network.chainId}`);\n // throw new Error(`Unsupported network curve: ${cfg.network.name}`);\n }\n });\n\n this.selectedChainID = selectedChainID;\n }\n\n /**\n * Select a chain. Returns true if a client exists for it, false otherwise.\n * (We still record the selectedChainID so the UI can reflect the chosen chain.)\n */\n setChain(chainID: ChainID): boolean {\n this.selectedChainID = chainID;\n return this.clients.has(chainID);\n }\n}","import { BigNumber, ethers } from 'ethers';\n\nexport const CONTRACT_NAMES = [\n 'Stake',\n 'LiqEth',\n 'DepositManager',\n 'LiqEthMint',\n 'LiqEthBurn',\n 'LiqEthTreasury',\n 'LiqEthCommon',\n 'RewardsERC20',\n 'ValidatorBalanceVerifier',\n 'Yield',\n 'Accounting',\n 'StakingModule',\n 'WithdrawalQueue',\n 'WithdrawalVault',\n] as const;\n\nexport type ContractName = typeof CONTRACT_NAMES[number];\nexport type AddressBook = Record<ContractName, string>;\n\nexport interface DepositEvent {\n user: string;\n netEth: BigNumber;\n fee: BigNumber;\n shares: BigNumber;\n}\n\nexport interface DepositResult {\n /** EVM transaction hash */\n txHash: string;\n /** Full receipt, if you want it */\n receipt: ethers.providers.TransactionReceipt;\n /** Parsed Deposited event, if present */\n deposited?: DepositEvent;\n}","// src/networks/solana/utils.ts\n\nimport { Program, BN, AnchorProvider } from '@coral-xyz/anchor';\n\nimport {\n Connection,\n Keypair,\n PublicKey,\n SystemProgram,\n StakeProgram,\n} from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddress,\n} from '@solana/spl-token';\n\nimport {\n LIQSOL_CORE,\n LIQSOL_TOKEN,\n PAY_RATE_SCALE_FACTOR,\n DEFAULT_AVERAGE_PAY_RATE,\n EPHEMERAL_RENT_EXEMPTION,\n LAMPORTS_PER_SOL,\n lamportsToSol,\n solToLamports,\n deriveDepositAuthorityPda,\n deriveLiqsolMintPda,\n deriveLiqsolMintAuthorityPda,\n deriveVaultPda,\n deriveReservePoolPda,\n deriveStakeControllerStatePda,\n derivePayoutStatePda,\n deriveBucketAuthorityPda,\n deriveDistributionStatePda,\n deriveUserRecordPda,\n derivePayRateHistoryPda,\n deriveStakeControllerVaultPda,\n deriveEphemeralStakeAddress,\n DEFAULT_PAY_RATE_LOOKBACK,\n} from './constants';\n\nimport liqsolCoreIDL from '../../assets/solana/idl/liqsol_core.json';\n\n// -----------------------------------------------------------------------------\n// Read-only liqsol_core Program helper\n// -----------------------------------------------------------------------------\n\nlet _liqsolCoreProgram: Program | null = null;\n\nexport function getLiqsolCoreProgram(\n connection: Connection,\n): Program {\n if (_liqsolCoreProgram && _liqsolCoreProgram.provider.connection === connection) {\n return _liqsolCoreProgram;\n }\n\n // Dummy wallet – we're only doing read-only account fetches here.\n const tmpKeypair = Keypair.generate();\n const wallet : any = { publicKey: tmpKeypair.publicKey, signAllTransactions: async () => [], signTransaction: async () => tmpKeypair };\n\n const provider = new AnchorProvider(connection, wallet, {\n commitment: 'confirmed',\n });\n\n const program = new Program(\n liqsolCoreIDL,\n provider,\n ) as Program;\n\n _liqsolCoreProgram = program;\n return program;\n}\n\n// -----------------------------------------------------------------------------\n// Deposit accounts bundle\n// -----------------------------------------------------------------------------\n\nexport interface DepositAccounts {\n user: PublicKey;\n depositAuthority: PublicKey;\n liqsolMint: PublicKey;\n liqsolMintAuthority: PublicKey;\n userAta: PublicKey;\n stakeControllerVault: PublicKey;\n stakeControllerReservePool: PublicKey;\n stakeControllerState: PublicKey;\n payoutState: PublicKey;\n bucketAuthority: PublicKey;\n bucketTokenAccount: PublicKey;\n distributionState: PublicKey;\n userRecord: PublicKey;\n payRateHistory: PublicKey;\n ephemeralStake: PublicKey;\n ephemeralSeed: string;\n}\n\n/**\n * Build a complete DepositAccounts set for a given user, matching the\n * on-chain PDAs used by the liqSOL core program.\n *\n * The optional `seed` lets you make deposit flows replayable/deterministic.\n * If omitted, a random u32 seed is generated.\n */\nexport async function buildDepositAccounts(\n connection: Connection,\n user: PublicKey,\n): Promise<DepositAccounts> {\n const depositAuthority = deriveDepositAuthorityPda();\n const liqsolMint = deriveLiqsolMintPda();\n const liqsolMintAuthority = deriveLiqsolMintAuthorityPda();\n const stakeControllerVault = deriveStakeControllerVaultPda();\n const stakeControllerReservePool = deriveReservePoolPda();\n const stakeControllerState = deriveStakeControllerStatePda();\n const payoutState = derivePayoutStatePda();\n const bucketAuthority = deriveBucketAuthorityPda();\n const distributionState = deriveDistributionStatePda();\n const userRecord = deriveUserRecordPda(user);\n const payRateHistory = derivePayRateHistoryPda();\n\n const userAta = await getAssociatedTokenAddress(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n const bucketTokenAccount = await getAssociatedTokenAddress(\n liqsolMint,\n bucketAuthority,\n true,\n TOKEN_2022_PROGRAM_ID,\n );\n\n // -------------------------------------------------------------\n // Ephemeral stake\n // -------------------------------------------------------------\n const seed = Math.floor(Math.random() * 2 ** 32);\n const ephemeralSeed = `ephemeral_${seed}`;\n const ephemeralStake = await deriveEphemeralStakeAddress(user, ephemeralSeed);\n\n // `connection` is currently unused, but we keep it in the signature\n // so this helper can evolve to preflight/validate accounts if needed.\n void connection;\n\n return {\n user,\n depositAuthority,\n liqsolMint,\n liqsolMintAuthority,\n userAta,\n stakeControllerVault,\n stakeControllerReservePool,\n stakeControllerState,\n payoutState,\n bucketAuthority,\n bucketTokenAccount,\n distributionState,\n userRecord,\n payRateHistory,\n ephemeralStake,\n ephemeralSeed,\n };\n}\n\n// -----------------------------------------------------------------------------\n// Balance + state getters (UI-friendly)\n// -----------------------------------------------------------------------------\n\nexport async function getUserLiqSolBalance(\n connection: Connection,\n user: PublicKey,\n): Promise<number> {\n const liqsolMint = deriveLiqsolMintPda();\n const ata = await getAssociatedTokenAddress(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n try {\n const bal = await connection.getTokenAccountBalance(ata);\n return Number(bal.value.amount); // raw lamports, not decimals-adjusted\n } catch {\n return 0;\n }\n}\n\nexport async function getBucketLiqSolBalance(\n connection: Connection,\n): Promise<number> {\n const liqsolMint = deriveLiqsolMintPda();\n const bucketAuthority = deriveBucketAuthorityPda();\n const ata = await getAssociatedTokenAddress(\n liqsolMint,\n bucketAuthority,\n true,\n TOKEN_2022_PROGRAM_ID,\n );\n\n try {\n const bal = await connection.getTokenAccountBalance(ata);\n return Number(bal.value.amount);\n } catch {\n return 0;\n }\n}\n\nexport async function getReservePoolBalance(\n connection: Connection,\n): Promise<number> {\n const reservePool = deriveReservePoolPda();\n try {\n const lamports = await connection.getBalance(reservePool);\n return lamports;\n } catch {\n return 0;\n }\n}\n\n/**\n * Raw account info for the stake_controller state (Anchor decode is left\n * to the caller so the SDK can stay IDL-agnostic at this layer).\n */\nexport async function getStakeControllerStateRaw(\n connection: Connection,\n): Promise<Uint8Array | null> {\n const pda = deriveStakeControllerStatePda();\n const info = await connection.getAccountInfo(pda);\n return info?.data ?? null;\n}\n\n/**\n * Raw account info for the payout-state account.\n */\nexport async function getPayoutStateRaw(\n connection: Connection,\n): Promise<Uint8Array | null> {\n const pda = derivePayoutStatePda();\n const info = await connection.getAccountInfo(pda);\n return info?.data ?? null;\n}\n\n/**\n * Raw account info for a user's distribution user_record.\n */\nexport async function getUserRecordRaw(\n connection: Connection,\n user: PublicKey,\n): Promise<Uint8Array | null> {\n const pda = deriveUserRecordPda(user);\n const info = await connection.getAccountInfo(pda);\n return info?.data ?? null;\n}\n\n// -----------------------------------------------------------------------------\n// Pay-rate & fee utilities (on-chain compatible)\n// -----------------------------------------------------------------------------\n\nexport async function getAveragePayRate(\n connection: Connection,\n lookback: number = DEFAULT_PAY_RATE_LOOKBACK,\n): Promise<bigint> {\n const program = getLiqsolCoreProgram(connection);\n const payRateHistoryPda = derivePayRateHistoryPda();\n\n try {\n const anyProgram = program as any;\n const payRateHistoryAccount = await anyProgram.account.payRateHistory.fetch(\n payRateHistoryPda,\n );\n\n const entries: any[] = payRateHistoryAccount.entries ?? [];\n const totalEntriesAdded = Number(\n payRateHistoryAccount.totalEntriesAdded ?? 0,\n );\n const currentIndex: number = payRateHistoryAccount.currentIndex ?? 0;\n const maxEntries: number =\n payRateHistoryAccount.maxEntries ?? entries.length;\n\n if (!entries.length) {\n return DEFAULT_AVERAGE_PAY_RATE;\n }\n\n const entriesToFetch = Math.min(lookback, maxEntries, entries.length);\n\n let idx: number;\n if (totalEntriesAdded === 0) {\n idx = 0;\n } else if (currentIndex === 0) {\n idx = maxEntries - 1;\n } else {\n idx = currentIndex - 1;\n }\n\n let sum = BigInt(0);\n let validCount = BigInt(0);\n\n for (let i = 0; i < entriesToFetch; i++) {\n const entry = entries[idx];\n if (entry && typeof entry.scaledRate !== 'undefined') {\n const rate = BigInt(entry.scaledRate.toString());\n if (rate > BigInt(0)) {\n sum += rate;\n validCount += BigInt(1);\n }\n }\n\n if (totalEntriesAdded === 0) {\n idx = (idx + 1) % maxEntries;\n } else {\n idx = idx === 0 ? maxEntries - 1 : idx - 1;\n }\n }\n\n if (validCount === BigInt(0)) {\n return DEFAULT_AVERAGE_PAY_RATE;\n }\n\n return sum / validCount;\n } catch (err) {\n // Fallback to default when history missing/unavailable\n return DEFAULT_AVERAGE_PAY_RATE;\n }\n}\n/**\n * On-chain fee formula:\n * fee = (average_pay_rate * 4 * deposit_amount_lamports) / 10^12\n */\nexport function calculateExpectedFee(\n depositAmountLamports: BN,\n averagePayRate: BN,\n): BN {\n return averagePayRate\n .mul(new BN(4))\n .mul(depositAmountLamports)\n .div(new BN(1_000_000_000_000)); // 10^12\n}\n\n/**\n * Convenience helper to preview how a deposit splits between user + bucket\n * and how much goes into the reserve, assuming the simple model:\n *\n * - userLiqSol = amount - fee + EPHEMERAL_RENT_EXEMPTION\n * - bucketLiqSol = fee\n * - reserveLamports = amount + EPHEMERAL_RENT_EXEMPTION\n */\nexport function previewDepositEffects(params: {\n depositAmountLamports: BN;\n averagePayRate: BN;\n rentExemptionLamports?: number;\n}): {\n feeLamports: BN;\n userLiqSolLamports: BN;\n bucketLiqSolLamports: BN;\n reserveIncreaseLamports: BN;\n} {\n const { depositAmountLamports, averagePayRate } = params;\n const rent = new BN(\n params.rentExemptionLamports ?? EPHEMERAL_RENT_EXEMPTION,\n );\n\n const fee = calculateExpectedFee(depositAmountLamports, averagePayRate);\n const userLiqSol = depositAmountLamports.sub(fee).add(rent);\n const bucketLiqSol = fee;\n const reserveIncrease = depositAmountLamports.add(rent);\n\n return {\n feeLamports: fee,\n userLiqSolLamports: userLiqSol,\n bucketLiqSolLamports: bucketLiqSol,\n reserveIncreaseLamports: reserveIncrease,\n };\n}\n\n// -----------------------------------------------------------------------------\n// Epoch / scheduling helpers\n// -----------------------------------------------------------------------------\n\nexport type EpochSnapshot = {\n epoch: number;\n slot: number;\n firstSlot: number;\n slotsInEpoch: number;\n slotMs: number;\n};\n\nexport async function getEpochSnapshot(\n connection: Connection,\n): Promise<EpochSnapshot> {\n const info = await connection.getEpochInfo();\n\n // Fallback slot time\n let slotTimeMs = Number(process.env.SLOT_TIME_MS_FALLBACK ?? 400);\n\n try {\n const samples = await connection.getRecentPerformanceSamples(16);\n if (samples.length) {\n const avgMs =\n samples.reduce(\n (acc, s) => acc + (s.samplePeriodSecs * 1000) / s.numSlots,\n 0,\n ) / samples.length;\n if (isFinite(avgMs) && avgMs > 0) {\n slotTimeMs = avgMs;\n }\n }\n } catch {\n // ignore; keep fallback\n }\n\n return {\n epoch: info.epoch,\n slot: info.slotIndex,\n firstSlot: info.absoluteSlot - info.slotIndex,\n slotsInEpoch: info.slotsInEpoch,\n slotMs: slotTimeMs,\n };\n}\n\nexport function msToEpochEnd(snapshot: EpochSnapshot): number {\n const remainingSlots = snapshot.slotsInEpoch - snapshot.slot;\n return remainingSlots * snapshot.slotMs;\n}\n\n/**\n * Generic \"execute around epoch boundaries\" helper:\n *\n * - If current progress is within [early, late], run immediately.\n * - If too early, sleep until `early` percentage into the epoch.\n * - If too late, sleep until `early` percentage into the *next* epoch.\n *\n * This is generic; you can wrap any instruction builder in here (including\n * deposit flows) without baking in program-specific logic.\n */\nexport async function scheduledInstruction<T>(\n connection: Connection,\n config: ScheduleConfig,\n instruction: () => Promise<T>,\n): Promise<T> {\n const early = config.early ?? 0.10;\n const late = config.late ?? 0.90;\n\n const snapshot = await getEpochSnapshot(connection);\n const progress = snapshot.slot / snapshot.slotsInEpoch;\n\n // Case 1: Already in safe zone\n if (progress >= early && progress <= late) {\n return instruction();\n }\n\n // Case 2: Early in epoch → wait until `early`\n if (progress < early) {\n const targetSlot = snapshot.slotsInEpoch * early;\n const slotsRemaining = targetSlot - snapshot.slot;\n const msToWait = slotsRemaining * snapshot.slotMs;\n\n console.log(\n `Epoch early (${(progress * 100).toFixed(\n 2,\n )}%). Sleeping ${(msToWait / 1000).toFixed(1)}s until ${early * 100\n }%...`,\n );\n\n await sleep(Math.max(1000, msToWait));\n return instruction();\n }\n\n // Case 3: Late in epoch → wait for next epoch + early window\n const msToNextEpoch = msToEpochEnd(snapshot);\n const earlyWaitTime = snapshot.slotsInEpoch * early * snapshot.slotMs;\n const totalWaitTime = msToNextEpoch + earlyWaitTime + 1000;\n\n console.log(\n `Epoch late (${(progress * 100).toFixed(\n 2,\n )}%). Sleeping ${(totalWaitTime / 1000).toFixed(\n 1,\n )}s until next epoch + ${early * 100}%...`,\n );\n\n await sleep(totalWaitTime);\n return instruction();\n}\n\n\n// -----------------------------------------------------------------------------\n// Generic helpers (used in tests + can be useful in apps)\n// -----------------------------------------------------------------------------\n\nexport function getErrorMessage(error: any): string {\n return (\n error?.error?.errorCode?.code ||\n error?.error?.errorMessage ||\n error?.message ||\n ''\n );\n}\n\nexport function generateRandomDepositAmount(\n minSol = 2,\n maxSol = 100,\n): BN {\n const randomSol = Math.random() * (maxSol - minSol) + minSol;\n return new BN(solToLamports(randomSol));\n}\n\nexport function generateTestKeypair(): Keypair {\n return Keypair.generate();\n}\n\nexport async function airdropSol(\n connection: Connection,\n publicKey: PublicKey,\n amountSol: number,\n): Promise<void> {\n const lamports = solToLamports(amountSol);\n const sig = await connection.requestAirdrop(publicKey, lamports);\n await connection.confirmTransaction(sig, 'confirmed');\n}\n\nexport async function waitForConfirmation(\n connection: Connection,\n signature: string,\n): Promise<void> {\n await connection.confirmTransaction(signature, 'confirmed');\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Simple helper used in tests: wait until safe zone, no-op.\n */\nexport async function waitUntilSafeToExecuteFunction(\n connection: Connection,\n config: ScheduleConfig = {},\n): Promise<void> {\n await scheduledInstruction(connection, config, async () => {\n // no-op\n return;\n });\n}\n\nexport interface ScheduleConfig {\n early?: number; // fraction of epoch, default 0.10\n late?: number; // fraction of epoch, default 0.90\n}\n\n"],"names":["PublicKey","liqSolTokenIDL","validatorLeaderboardIDL","__async","StakeProgram","liqsolCoreJson","Program","getAssociatedTokenAddressSync","TOKEN_2022_PROGRAM_ID","__pow","BN","SystemProgram","ASSOCIATED_TOKEN_PROGRAM_ID","SYSVAR_INSTRUCTIONS_PUBKEY","SYSVAR_CLOCK_PUBKEY","SYSVAR_STAKE_HISTORY_PUBKEY","SYSVAR_RENT_PUBKEY","Transaction","getAssociatedTokenAddress","tx","KeyType","Connection","AnchorProvider","SolPubKey","_a","ethers","Contract","BigNumber","SolChainID","EvmChainID","Keypair"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBO,MAAM,WAAc,GAAA;AAAA,EACvB,WAAa,EAAA,IAAIA,iBAAU,CAAA,aAAA,CAAc,OAAO,CAAA;AAAA,EAChD,YAAc,EAAA,IAAIA,iBAAU,CAAAC,eAAA,CAAe,OAAO,CAAA;AAAA,EAClD,qBAAuB,EAAA,IAAID,iBAAU,CAAAE,wBAAA,CAAwB,OAAO,CAAA;AACxE,EAAA;AAGa,MAAA;AAAA,EACT,WAAA;AAAA,EACA,YAAA;AAAA,EACA,qBAAA;AACJ,CAAI,GAAA,YAAA;AAWG,MAAM,SAAY,GAAA;AAAA,EAErB,iBAAmB,EAAA,mBAAA;AAAA,EACnB,KAAO,EAAA,OAAA;AAAA,EACP,YAAc,EAAA,cAAA;AAAA,EACd,sBAAwB,EAAA,kBAAA;AAAA,EACxB,YAAc,EAAA,cAAA;AAAA,EAGd,WAAa,EAAA,aAAA;AAAA,EACb,qBAAuB,EAAA,gBAAA;AAAA,EACvB,gBAAkB,EAAA,eAAA;AAAA,EAGlB,kBAAoB,EAAA,oBAAA;AAAA,EACpB,WAAa,EAAA,aAAA;AAAA,EAGb,gBAAkB,EAAA,kBAAA;AAAA,EAGlB,iBAAmB,EAAA,mBAAA;AAAA,EACnB,gBAAkB,EAAA,WAAA;AAAA,EAClB,iBAAmB,EAAA,mBAAA;AACvB,EAAA;AAMa,MAAA,mBAAA,GAAsB,MAC/BF,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,MAAA,CAAO,IAAK,CAAA,SAAA,CAAU,WAAW,CAAC,CAAA;AAAA,EACnC,WAAY,CAAA,YAAA;AAChB,CAAA,CAAE,CAAC,EAAA;AAEM,MAAA,4BAAA,GAA+B,MACxCA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,MAAA,CAAO,IAAK,CAAA,SAAA,CAAU,qBAAqB,CAAC,CAAA;AAAA,EAC7C,WAAY,CAAA,YAAA;AAChB,CAAA,CAAE,CAAC,EAAA;AAEM,MAAA,yBAAA,GAA4B,MACrCA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,MAAA,CAAO,IAAK,CAAA,SAAA,CAAU,iBAAiB,CAAC,CAAA;AAAA,EACzC,WAAY,CAAA,WAAA;AAChB,CAAA,CAAE,CAAC,EAAA;AAEM,MAAA,cAAA,GAAiB,MAC1BA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,MAAA,CAAO,IAAK,CAAA,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,EAC7B,WAAY,CAAA,WAAA;AAChB,CAAA,CAAE,CAAC,EAAA;AAEM,MAAA,oBAAA,GAAuB,MAChCA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,MAAA,CAAO,IAAK,CAAA,SAAA,CAAU,YAAY,CAAC,CAAA;AAAA,EACpC,WAAY,CAAA,WAAA;AAChB,CAAA,CAAE,CAAC,EAAA;AAEM,MAAA,6BAAA,GAAgC,MACzCA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,MAAA,CAAO,IAAK,CAAA,SAAA,CAAU,sBAAsB,CAAC,CAAA;AAAA,EAC9C,WAAY,CAAA,WAAA;AAChB,CAAA,CAAE,CAAC,EAAA;AAEM,MAAA,oBAAA,GAAuB,MAChCA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,MAAA,CAAO,IAAK,CAAA,SAAA,CAAU,YAAY,CAAC,CAAA;AAAA,EACpC,WAAY,CAAA,WAAA;AAChB,CAAA,CAAE,CAAC,EAAA;AAEM,MAAA,wBAAA,GAA2B,MACpCA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,MAAA,CAAO,IAAK,CAAA,SAAA,CAAU,gBAAgB,CAAC,CAAA;AAAA,EACxC,WAAY,CAAA,WAAA;AAChB,CAAA,CAAE,CAAC,EAAA;AAEM,MAAA,0BAAA,GAA6B,MACtCA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,MAAA,CAAO,IAAK,CAAA,SAAA,CAAU,kBAAkB,CAAC,CAAA;AAAA,EAC1C,WAAY,CAAA,WAAA;AAChB,CAAA,CAAE,CAAC,EAAA;AAEM,MAAA,mBAAA,GAAsB,CAAC,IAAA,KAChCA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,OAAO,IAAK,CAAA,SAAA,CAAU,WAAW,CAAG,EAAA,IAAA,CAAK,UAAU,CAAA;AAAA,EACpD,WAAY,CAAA,WAAA;AAChB,CAAA,CAAE,CAAC,EAAA;AAEM,MAAA,uBAAA,GAA0B,MACnCA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,MAAA,CAAO,IAAK,CAAA,SAAA,CAAU,gBAAgB,CAAC,CAAA;AAAA,EACxC,WAAY,CAAA,WAAA;AAChB,CAAA,CAAE,CAAC,EAAA;AAQM,MAAA,yBAAA,GAA4B,MACrCA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,MAAA,CAAO,IAAK,CAAA,SAAA,CAAU,iBAAiB,CAAC,CAAA;AAAA,EACzC,WAAY,CAAA,qBAAA;AAChB,CAAA,CAAE,CAAC,EAAA;AAEM,MAAA,wBAAA,GAA2B,CAAC,WAAA,KACrCA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,OAAO,IAAK,CAAA,SAAA,CAAU,gBAAgB,CAAG,EAAA,WAAA,CAAY,UAAU,CAAA;AAAA,EAChE,WAAY,CAAA,qBAAA;AAChB,CAAA,CAAE,CAAC,EAAA;AAMM,MAAA,6BAAA,GAAgC,MACzCA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,MAAA,CAAO,IAAK,CAAA,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,EAC7B,WAAY,CAAA,WAAA;AAChB,CAAA,CAAE,CAAC,EAAA;AAMM,MAAA,2BAAA,GAA8B,CACvC,IAAA,EACA,IACqB,KAAAG,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AACrB,EAAM,MAAA,OAAA,GAAU,aAAa,IAAI,CAAA,CAAA,CAAA;AACjC,EAAA,OAAO,MAAMH,iBAAU,CAAA,cAAA,CAAe,IAAM,EAAA,OAAA,EAASI,qBAAa,SAAS,CAAA,CAAA;AAC/E,CAAA,EAAA;AAWa,MAAA,qBAAA,GAAwB,OAAO,IAAiB,EAAA;AAGhD,MAAA,wBAAA,GAA2B,OAAO,SAAW,EAAA;AAGnD,MAAM,yBAA4B,GAAA,EAAA;AAIlC,MAAM,wBAA2B,GAAA,QAAA;AAGjC,MAAM,gBAAmB,GAAA,IAAA;AAEzB,MAAM,aAAgB,GAAA,CAAC,QAC1B,KAAA,MAAA,CAAO,QAAQ,CAAI,GAAA,iBAAA;AAEhB,MAAM,gBAAgB,CAAC,GAAA,KAC1B,IAAK,CAAA,KAAA,CAAM,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;AC1LrC,MAAM,QAAW,GAAA;AAAA,EACb,UAAY,EAAA;AAAA,IACR,GAAK,EAAAC,aAAA;AAAA,IACL,OAAA,EAAS,WAAY,CAAA,WAAA,CAAY,QAAS,EAAA;AAAA,GAC9C;AAAA,EACA,WAAa,EAAA;AAAA,IACT,GAAK,EAAA,eAAA;AAAA,IACL,OAAA,EAAS,WAAY,CAAA,YAAA,CAAa,QAAS,EAAA;AAAA,GAC/C;AAAA,EACA,oBAAsB,EAAA;AAAA,IAClB,GAAK,EAAA,wBAAA;AAAA,IACL,OAAA,EAAS,WAAY,CAAA,qBAAA,CAAsB,QAAS,EAAA;AAAA,GACxD;AACJ,CAAA,CAAA;AAIO,MAAM,oBAAqB,CAAA;AAAA,EAC9B,YAAoB,QAA0B,EAAA;AAA1B,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA,CAAA;AAAA,GAA4B;AAAA,EAEhD,WAAwC,IAA+C,EAAA;AACnF,IAAA,MAAM,EAAE,GAAA,EAAK,OAAQ,EAAA,GAAI,SAAS,IAAI,CAAA,CAAA;AACtC,IAAA,MAAM,WAAc,GAAA,aAAA,CAAA,cAAA,CAAA,EAAA,EAAK,GAAL,CAAA,EAAA,EAAU,OAAQ,EAAA,CAAA,CAAA;AACtC,IAAA,OAAO,IAAIC,cAAA,CAAQ,WAAa,EAAA,IAAA,CAAK,QAAQ,CAAA,CAAA;AAAA,GACjD;AAAA,EAEA,gBAAwC,GAAA;AACpC,IAAO,OAAA,MAAA,CAAO,KAAK,QAAQ,CAAA,CAAA;AAAA,GAC/B;AACJ;;;;;;;;;;;;;;;;;;;;;;;ACTO,MAAM,aAAc,CAAA;AAAA,EAGvB,YAAoB,QAA0B,EAAA;AAA1B,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA,CAAA;AAChB,IAAM,MAAA,GAAA,GAAM,IAAI,oBAAA,CAAqB,QAAQ,CAAA,CAAA;AAC7C,IAAK,IAAA,CAAA,OAAA,GAAU,GAAI,CAAA,UAAA,CAAW,YAAY,CAAA,CAAA;AAAA,GAC9C;AAAA,EAEM,cAAA,CACF,MACA,QACgE,EAAA;AAAA,IAAA,OAAAH,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAEhE,MAAA,MAAM,UAAU,IAAK,CAAA,OAAA,CAAA;AAKrB,MAAA,MAAM,mBAAmB,yBAA0B,EAAA,CAAA;AACnD,MAAA,MAAM,aAAa,mBAAoB,EAAA,CAAA;AACvC,MAAA,MAAM,sBAAsB,4BAA6B,EAAA,CAAA;AACzD,MAAA,MAAM,cAAc,oBAAqB,EAAA,CAAA;AACzC,MAAA,MAAM,QAAQ,cAAe,EAAA,CAAA;AAC7B,MAAA,MAAM,kBAAkB,6BAA8B,EAAA,CAAA;AACtD,MAAA,MAAM,cAAc,oBAAqB,EAAA,CAAA;AACzC,MAAA,MAAM,kBAAkB,wBAAyB,EAAA,CAAA;AACjD,MAAA,MAAM,iBAAiB,uBAAwB,EAAA,CAAA;AAC/C,MAAA,MAAM,oBAAoB,0BAA2B,EAAA,CAAA;AACrD,MAAM,MAAA,UAAA,GAAa,oBAAoB,IAAI,CAAA,CAAA;AAK3C,MAAA,MAAM,OAAU,GAAAI,sCAAA;AAAA,QACZ,UAAA;AAAA,QACA,IAAA;AAAA,QACA,KAAA;AAAA,QACAC,8BAAA;AAAA,OACJ,CAAA;AAEA,MAAA,MAAM,kBAAqB,GAAAD,sCAAA;AAAA,QACvB,UAAA;AAAA,QACA,eAAA;AAAA,QACA,IAAA;AAAA,QACAC,8BAAA;AAAA,OACJ,CAAA;AAKA,MAAA,MAAM,OAAO,IAAK,CAAA,KAAA,CAAM,KAAK,MAAO,EAAA,GAAIC,WAAK,EAAE,CAAA,CAAA,CAAA;AAC/C,MAAA,MAAM,cAAiB,GAAA,MAAM,2BAA4B,CAAA,IAAA,EAAM,IAAI,CAAA,CAAA;AAKnE,MAAM,MAAA,EAAA,GAA6B,MAAM,OAAA,CAAQ,OAC5C,CAAA,OAAA,CAAQ,IAAIC,SAAA,CAAG,QAAQ,CAAA,EAAG,IAAI,CAAA,CAC9B,QAAS,CAAA;AAAA,QACN,IAAA;AAAA,QACA,gBAAA;AAAA,QACA,eAAeC,qBAAc,CAAA,SAAA;AAAA,QAC7B,YAAc,EAAAH,8BAAA;AAAA,QACd,sBAAwB,EAAAI,oCAAA;AAAA,QACxB,eAAe,WAAY,CAAA,YAAA;AAAA,QAC3B,cAAcR,oBAAa,CAAA,SAAA;AAAA,QAE3B,UAAA;AAAA,QACA,OAAA;AAAA,QACA,mBAAA;AAAA,QACA,WAAA;AAAA,QACA,KAAA;AAAA,QACA,cAAA;AAAA,QAEA,eAAA;AAAA,QACA,WAAA;AAAA,QACA,eAAA;AAAA,QACA,kBAAA;AAAA,QAEA,UAAA;AAAA,QACA,iBAAA;AAAA,QACA,cAAA;AAAA,QAEA,kBAAoB,EAAAS,kCAAA;AAAA,QACpB,KAAO,EAAAC,2BAAA;AAAA,QACP,YAAc,EAAAC,mCAAA;AAAA,QACd,IAAM,EAAAC,0BAAA;AAAA,OACT,EACA,WAAY,EAAA,CAAA;AAEjB,MAAA,MAAM,EAAK,GAAA,IAAIC,mBAAY,EAAA,CAAE,IAAI,EAAE,CAAA,CAAA;AACnC,MAAO,OAAA,EAAE,WAAa,EAAA,EAAA,EAAI,cAAe,EAAA,CAAA;AAAA,KAC7C,CAAA,CAAA;AAAA,GAAA;AACJ;;;;;;;;;;;;;;;;;;;;;;AC9FO,MAAM,kBAAmB,CAAA;AAAA,EAG5B,YAAoB,QAA0B,EAAA;AAA1B,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA,CAAA;AAChB,IAAM,MAAA,GAAA,GAAM,IAAI,oBAAA,CAAqB,QAAQ,CAAA,CAAA;AAC7C,IAAK,IAAA,CAAA,OAAA,GAAU,GAAI,CAAA,UAAA,CAAW,YAAY,CAAA,CAAA;AAAA,GAC9C;AAAA,EAEA,IAAI,UAAa,GAAA;AACb,IAAA,OAAO,KAAK,QAAS,CAAA,UAAA,CAAA;AAAA,GACzB;AAAA,EAKM,oBAA0D,GAAA;AAAA,IAAA,OAAAd,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAC5D,MAAA,MAAM,MAAM,0BAA2B,EAAA,CAAA;AACvC,MAAI,IAAA;AAEA,QAAA,OAAO,MAAM,IAAK,CAAA,OAAA,CAAQ,OAAQ,CAAA,iBAAA,CAAkB,MAAM,GAAG,CAAA,CAAA;AAAA,OACzD,CAAA,OAAA,CAAA,EAAA;AACJ,QAAO,OAAA,IAAA,CAAA;AAAA,OACX;AAAA,KACJ,CAAA,CAAA;AAAA,GAAA;AAAA,EAKM,cAAc,IAA6C,EAAA;AAAA,IAAA,OAAAA,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAC7D,MAAM,MAAA,GAAA,GAAM,oBAAoB,IAAI,CAAA,CAAA;AACpC,MAAI,IAAA;AACA,QAAA,OAAO,MAAM,IAAK,CAAA,OAAA,CAAQ,OAAQ,CAAA,UAAA,CAAW,cAAc,GAAG,CAAA,CAAA;AAAA,OAC1D,CAAA,OAAA,CAAA,EAAA;AACJ,QAAO,OAAA,IAAA,CAAA;AAAA,OACX;AAAA,KACJ,CAAA,CAAA;AAAA,GAAA;AAAA,EAOc,wBAAyD,GAAA;AAAA,IAAA,OAAAA,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AA9E3E,MAAA,IAAA,EAAA,CAAA;AA+EQ,MAAA,MAAM,aAAa,mBAAoB,EAAA,CAAA;AACvC,MAAM,MAAA,OAAA,GAAU,WAAW,QAAS,EAAA,CAAA;AAEpC,MAAM,MAAA,QAAA,GAAW,MAAM,IAAA,CAAK,UAAW,CAAA,wBAAA;AAAA,QACnCK,8BAAA;AAAA,QACA;AAAA,UACI,OAAS,EAAA;AAAA,YAEL,EAAE,MAAQ,EAAA,EAAE,QAAQ,CAAG,EAAA,KAAA,EAAO,SAAU,EAAA;AAAA,WAC5C;AAAA,UACA,UAAY,EAAA,WAAA;AAAA,SAChB;AAAA,OACJ,CAAA;AAEA,MAAM,MAAA,OAAA,QAAc,GAAoB,EAAA,CAAA;AAExC,MAAA,KAAA,MAAW,QAAQ,QAAU,EAAA;AACzB,QAAM,MAAA,IAAA,GAAO,KAAK,OAAQ,CAAA,IAAA,CAAA;AAC1B,QAAA,MAAM,SAAS,IAAK,CAAA,MAAA,CAAA;AACpB,QAAA,IAAI,CAAC,MAAA,IAAU,MAAO,CAAA,IAAA,KAAS,SAAW,EAAA,SAAA;AAE1C,QAAA,MAAM,OAA0B,MAAO,CAAA,IAAA,CAAA;AACvC,QAAA,MAAM,WAAW,IAAK,CAAA,KAAA,CAAA;AACtB,QAAM,MAAA,SAAA,GAAY,KAAK,WAAY,CAAA,MAAA,CAAA;AACnC,QAAM,MAAA,MAAA,GAAS,OAAO,SAAS,CAAA,CAAA;AAE/B,QAAA,MAAM,QAAO,EAAQ,GAAA,OAAA,CAAA,GAAA,CAAI,QAAQ,CAApB,KAAA,IAAA,GAAA,EAAA,GAAyB,OAAO,CAAC,CAAA,CAAA;AAC9C,QAAQ,OAAA,CAAA,GAAA,CAAI,QAAU,EAAA,IAAA,GAAO,MAAM,CAAA,CAAA;AAAA,OACvC;AAEA,MAAO,OAAA,OAAA,CAAA;AAAA,KACX,CAAA,CAAA;AAAA,GAAA;AAAA,EAac,kBAEZ,GAAA;AAAA,IAAA,OAAAL,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AA7HN,MAAA,IAAA,EAAA,CAAA;AA8HQ,MAAA,MAAM,UAAU,MAAM,IAAA,CAAK,OAAQ,CAAA,OAAA,CAAQ,WAAW,GAAI,EAAA,CAAA;AAC1D,MAAM,MAAA,GAAA,QAAU,GAAmD,EAAA,CAAA;AAEnE,MAAA,KAAA,MAAW,KAAK,OAAS,EAAA;AACrB,QAAA,MAAM,KAAK,CAAE,CAAA,OAAA,CAAA;AACb,QAAA,MAAM,UAAU,EAAG,CAAA,OAAA,CAAA;AAGnB,QAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,UAAA,CAAW,qBAAqB,OAAO,CAAA,CAAA;AAClE,QAAM,MAAA,UAAA,GAAA,CAAa,EAAQ,GAAA,OAAA,CAAA,KAAA,KAAR,IAAe,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA;AAClC,QAAA,IAAI,CAAC,UAAY,EAAA,SAAA;AAEjB,QAAA,MAAM,SAAS,UAAW,CAAA,MAAA,CAAA;AAC1B,QAAA,IAAI,CAAC,MAAA,IAAW,MAAe,CAAA,IAAA,KAAS,SAAW,EAAA,SAAA;AAEnD,QAAA,MAAM,OAA0B,MAAO,CAAA,IAAA,CAAA;AACvC,QAAA,MAAM,WAAW,IAAK,CAAA,KAAA,CAAA;AACtB,QAAM,MAAA,KAAA,GAAQ,IAAIH,iBAAA,CAAU,QAAQ,CAAA,CAAA;AAEpC,QAAA,MAAM,OAAU,GAAA,MAAA,CAAO,EAAG,CAAA,cAAA,CAAe,UAAU,CAAA,CAAA;AACnD,QAAA,GAAA,CAAI,GAAI,CAAA,QAAA,EAAU,EAAE,KAAA,EAAO,SAAS,CAAA,CAAA;AAAA,OACxC;AAEA,MAAO,OAAA,GAAA,CAAA;AAAA,KACX,CAAA,CAAA;AAAA,GAAA;AAAA,EAQc,wBAAyD,GAAA;AAAA,IAAA,OAAAG,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AA9J3E,MAAA,IAAA,EAAA,CAAA;AA+JQ,MAAA,MAAM,CAAC,aAAe,EAAA,cAAc,CAAI,GAAA,MAAM,QAAQ,GAAI,CAAA;AAAA,QACtD,KAAK,wBAAyB,EAAA;AAAA,QAC9B,KAAK,kBAAmB,EAAA;AAAA,OAC3B,CAAA,CAAA;AAED,MAAA,MAAM,MAA2B,EAAC,CAAA;AAElC,MAAW,KAAA,MAAA,CAAC,UAAU,EAAE,KAAA,EAAO,SAAS,CAAA,IAAK,cAAe,CAAA,OAAA,EAAW,EAAA;AACnE,QAAA,MAAM,UAAS,EAAc,GAAA,aAAA,CAAA,GAAA,CAAI,QAAQ,CAA1B,KAAA,IAAA,GAAA,EAAA,GAA+B,OAAO,CAAC,CAAA,CAAA;AACtD,QAAA,MAAM,QAAQ,OAAU,GAAA,MAAA,CAAA;AACxB,QAAI,IAAA,KAAA,GAAQ,MAAO,CAAA,CAAC,CAAG,EAAA;AACnB,UAAA,GAAA,CAAI,KAAK,EAAE,KAAA,EAAO,MAAQ,EAAA,OAAA,EAAS,OAAO,CAAA,CAAA;AAAA,SAC9C;AAAA,OACJ;AAGA,MAAA,GAAA,CAAI,IAAK,CAAA,CAAC,CAAG,EAAA,CAAA,KAAO,EAAE,KAAQ,GAAA,CAAA,CAAE,KAAQ,GAAA,CAAA,GAAI,CAAE,CAAA,KAAA,GAAQ,CAAE,CAAA,KAAA,GAAQ,KAAK,CAAE,CAAA,CAAA;AACvE,MAAO,OAAA,GAAA,CAAA;AAAA,KACX,CAAA,CAAA;AAAA,GAAA;AAAA,EAMc,kBAAkB,UAAuB,EAAA;AAAA,IAAA,OAAAA,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AACnD,MAAM,MAAA,QAAA,GAAW,IAAK,CAAA,QAAA,CAAS,MAAO,CAAA,SAAA,CAAA;AAEtC,MAAA,MAAM,uBAAuB,0BAA2B,EAAA,CAAA;AACxD,MAAM,MAAA,aAAA,GAAgB,oBAAoB,UAAU,CAAA,CAAA;AACpD,MAAA,MAAM,gBAAgB,mBAAoB,EAAA,CAAA;AAC1C,MAAA,MAAM,oBAAoB,uBAAwB,EAAA,CAAA;AAClD,MAAA,MAAM,qBAAqB,wBAAyB,EAAA,CAAA;AAEpD,MAAA,MAAM,UAAU,MAAMe,kCAAA;AAAA,QAClB,aAAA;AAAA,QACA,UAAA;AAAA,QACA,KAAA;AAAA,QACAV,8BAAA;AAAA,OACJ,CAAA;AAEA,MAAA,MAAM,qBAAqB,MAAMU,kCAAA;AAAA,QAC7B,aAAA;AAAA,QACA,kBAAA;AAAA,QACA,IAAA;AAAA,QACAV,8BAAA;AAAA,OACJ,CAAA;AAEA,MAAA,OAAQ,IAAK,CAAA,OAAA,CAAQ,OAChB,CAAA,UAAA,GACA,QAAS,CAAA;AAAA,QACN,IAAM,EAAA,UAAA;AAAA,QACN,OAAA;AAAA,QACA,UAAY,EAAA,aAAA;AAAA,QACZ,SAAW,EAAA,QAAA;AAAA,QACX,KAAO,EAAA,QAAA;AAAA,QACP,iBAAmB,EAAA,oBAAA;AAAA,QACnB,UAAY,EAAA,aAAA;AAAA,QACZ,kBAAoB,EAAAK,kCAAA;AAAA,QACpB,YAAc,EAAAL,8BAAA;AAAA,QACd,eAAiB,EAAA,kBAAA;AAAA,QACjB,kBAAA;AAAA,QACA,cAAgB,EAAA,iBAAA;AAAA,QAChB,eAAeG,qBAAc,CAAA,SAAA;AAAA,OAChC,EACA,WAAY,EAAA,CAAA;AAAA,KACrB,CAAA,CAAA;AAAA,GAAA;AAAA,EAkBM,sBAGuC,GAAA;AAAA,IAHhB,OAAAR,SAAA,CAAA,IAAA,EAAA,SAAA,EAAA,WAAA,IAAA,GAGzB,EAAyC,EAAA;AArPjD,MAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAsPQ,MAAM,MAAA,QAAA,GAAW,IAAK,CAAA,QAAA,CAAS,MAAO,CAAA,SAAA,CAAA;AACtC,MAAM,MAAA,SAAA,GAAY,SAAS,QAAS,EAAA,CAAA;AAEpC,MAAA,MAAM,CAAC,SAAW,EAAA,aAAA,EAAe,cAAc,CAAI,GAAA,MAAM,QAAQ,GAAI,CAAA;AAAA,QACjE,KAAK,oBAAqB,EAAA;AAAA,QAC1B,KAAK,wBAAyB,EAAA;AAAA,QAC9B,KAAK,kBAAmB,EAAA;AAAA,OAC3B,CAAA,CAAA;AAED,MAAA,IAAI,CAAC,SAAW,EAAA;AACZ,QAAO,OAAA;AAAA,UACH,cAAgB,EAAA,KAAA;AAAA,UAChB,UAAY,EAAA,KAAA;AAAA,UACZ,MAAQ,EAAA,mCAAA;AAAA,UACR,WAAa,EAAA,KAAA,CAAA;AAAA,UACb,IAAM,EAAA,EAAE,OAAS,EAAA,MAAA,CAAO,CAAC,CAAA,EAAG,QAAU,EAAA,MAAA,CAAO,CAAC,CAAA,EAAG,QAAU,EAAA,EAAG,EAAA;AAAA,SAClE,CAAA;AAAA,OACJ;AAEA,MAAA,MAAM,gBAAmB,GAAA,MAAA,CAAO,SAAU,CAAA,gBAAA,CAAiB,UAAU,CAAA,CAAA;AAErE,MAAA,MAAM,YACF,GAAA,CAAA,EAAA,GAAA,cAAA,CAAe,GAAI,CAAA,SAAS,MAA5B,IAAiC,GAAA,EAAA,GAAA;AAAA,QAC7B,KAAO,EAAA,QAAA;AAAA,QACP,OAAA,EAAS,OAAO,CAAC,CAAA;AAAA,OACrB,CAAA;AAEJ,MAAA,MAAM,UAAS,EAAc,GAAA,aAAA,CAAA,GAAA,CAAI,SAAS,CAA3B,KAAA,IAAA,GAAA,EAAA,GAAgC,OAAO,CAAC,CAAA,CAAA;AACvD,MAAA,MAAM,UAAU,YAAa,CAAA,OAAA,CAAA;AAC7B,MAAA,MAAM,YAAY,MAAS,GAAA,OAAA,CAAA;AAG3B,MAAI,IAAA,SAAA,IAAa,MAAO,CAAA,CAAC,CAAG,EAAA;AACxB,QAAO,OAAA;AAAA,UACH,cAAgB,EAAA,KAAA;AAAA,UAChB,UAAY,EAAA,IAAA;AAAA,UACZ,MAAQ,EAAA,iCAAA;AAAA,UACR,WAAa,EAAA,KAAA,CAAA;AAAA,UACb,IAAM,EAAA,EAAE,OAAS,EAAA,MAAA,CAAO,CAAC,CAAA,EAAG,QAAU,EAAA,MAAA,CAAO,CAAC,CAAA,EAAG,QAAU,EAAA,EAAG,EAAA;AAAA,SAClE,CAAA;AAAA,OACJ;AAGA,MAAM,MAAA,cAAA,GACF,KAAK,MAAU,IAAA,IAAA,CAAK,SAAS,MAAO,CAAA,CAAC,CAAI,GAAA,IAAA,CAAK,MAAS,GAAA,SAAA,CAAA;AAG3D,MAAA,IAAI,oBAAoB,cAAgB,EAAA;AACpC,QAAMgB,MAAAA,GAAAA,GAAK,IAAIF,mBAAY,EAAA,CAAA;AAC3B,QAAA,MAAM,EAAK,GAAA,MAAM,IAAK,CAAA,iBAAA,CAAkB,QAAQ,CAAA,CAAA;AAChD,QAAAE,GAAAA,CAAG,IAAI,EAAE,CAAA,CAAA;AAET,QAAO,OAAA;AAAA,UACH,cAAgB,EAAA,IAAA;AAAA,UAChB,UAAY,EAAA,IAAA;AAAA,UACZ,WAAaA,EAAAA,GAAAA;AAAA,UACb,IAAM,EAAA,EAAE,OAAS,EAAA,MAAA,CAAO,CAAC,CAAA,EAAG,QAAU,EAAA,MAAA,CAAO,CAAC,CAAA,EAAG,QAAU,EAAA,EAAG,EAAA;AAAA,SAClE,CAAA;AAAA,OACJ;AAGA,MAAA,MAAM,UAAU,cAAiB,GAAA,gBAAA,CAAA;AAEjC,MAAM,MAAA,aAAA,GAAgB,MAAM,IAAA,CAAK,wBAAyB,EAAA,CAAA;AAC1D,MAAM,MAAA,aAAA,GAAA,CAAgB,EAAK,GAAA,IAAA,CAAA,aAAA,KAAL,IAAsB,GAAA,EAAA,GAAA,EAAA,CAAA;AAE5C,MAAA,MAAM,WAAgC,EAAC,CAAA;AACvC,MAAI,IAAA,QAAA,GAAW,OAAO,CAAC,CAAA,CAAA;AAEvB,MAAA,KAAA,MAAW,KAAK,aAAe,EAAA;AAC3B,QAAA,IAAI,CAAE,CAAA,KAAA,CAAM,MAAO,CAAA,QAAQ,CAAG,EAAA,SAAA;AAC9B,QAAA,QAAA,CAAS,KAAK,CAAC,CAAA,CAAA;AACf,QAAA,QAAA,IAAY,CAAE,CAAA,KAAA,CAAA;AACd,QAAA,IAAI,QAAY,IAAA,OAAA,IAAW,QAAS,CAAA,MAAA,IAAU,aAAe,EAAA,MAAA;AAAA,OACjE;AAEA,MAAA,IAAI,WAAW,OAAS,EAAA;AACpB,QAAO,OAAA;AAAA,UACH,cAAgB,EAAA,IAAA;AAAA,UAChB,UAAY,EAAA,KAAA;AAAA,UACZ,MAAQ,EAAA,mDAAA;AAAA,UACR,WAAa,EAAA,KAAA,CAAA;AAAA,UACb,IAAM,EAAA,EAAE,OAAS,EAAA,QAAA,EAAU,QAAS,EAAA;AAAA,SACxC,CAAA;AAAA,OACJ;AAEA,MAAM,MAAA,EAAA,GAAK,IAAIF,mBAAY,EAAA,CAAA;AAG3B,MAAA,KAAA,MAAW,KAAK,QAAU,EAAA;AACtB,QAAA,MAAM,EAAK,GAAA,MAAM,IAAK,CAAA,iBAAA,CAAkB,EAAE,KAAK,CAAA,CAAA;AAC/C,QAAA,EAAA,CAAG,IAAI,EAAE,CAAA,CAAA;AAAA,OACb;AAGA,MAAA;AACI,QAAA,MAAM,EAAK,GAAA,MAAM,IAAK,CAAA,iBAAA,CAAkB,QAAQ,CAAA,CAAA;AAChD,QAAA,EAAA,CAAG,IAAI,EAAE,CAAA,CAAA;AAAA,OACb;AAEA,MAAO,OAAA;AAAA,QACH,cAAgB,EAAA,IAAA;AAAA,QAChB,UAAY,EAAA,IAAA;AAAA,QACZ,WAAa,EAAA,EAAA;AAAA,QACb,IAAM,EAAA,EAAE,OAAS,EAAA,QAAA,EAAU,QAAS,EAAA;AAAA,OACxC,CAAA;AAAA,KACJ,CAAA,CAAA;AAAA,GAAA;AACJ;;;;;;;;;;;;;;;;;;;;;;AClVO,MAAM,iBAAkB,CAAA;AAAA,EAG3B,YAAoB,QAA0B,EAAA;AAA1B,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA,CAAA;AAChB,IAAM,MAAA,GAAA,GAAM,IAAI,oBAAA,CAAqB,QAAQ,CAAA,CAAA;AAC7C,IAAK,IAAA,CAAA,OAAA,GAAU,GAAI,CAAA,UAAA,CAAW,sBAAsB,CAAA,CAAA;AAAA,GACxD;AAAA,EAEM,QAAgC,GAAA;AAAA,IAAA,OAAAd,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAClC,MAAA,MAAM,MAAM,yBAA0B,EAAA,CAAA;AACtC,MAAI,IAAA;AAEA,QAAA,OAAO,MAAM,IAAK,CAAA,OAAA,CAAQ,OAAQ,CAAA,gBAAA,CAAiB,MAAM,GAAG,CAAA,CAAA;AAAA,OACxD,CAAA,OAAA,CAAA,EAAA;AACJ,QAAO,OAAA,IAAA,CAAA;AAAA,OACX;AAAA,KACJ,CAAA,CAAA;AAAA,GAAA;AAAA,EAEM,mBAAmB,WAA6C,EAAA;AAAA,IAAA,OAAAA,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAClE,MAAM,MAAA,GAAA,GAAM,yBAAyB,WAAW,CAAA,CAAA;AAChD,MAAI,IAAA;AAEA,QAAA,OAAO,MAAM,IAAK,CAAA,OAAA,CAAQ,OAAQ,CAAA,eAAA,CAAgB,cAAc,GAAG,CAAA,CAAA;AAAA,OAC/D,CAAA,OAAA,CAAA,EAAA;AACJ,QAAO,OAAA,IAAA,CAAA;AAAA,OACX;AAAA,KACJ,CAAA,CAAA;AAAA,GAAA;AAAA,EAMM,gBAAA,CAAiB,QAAQ,EAAoB,EAAA;AAAA,IAAA,OAAAA,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAC/C,MAAA,MAAM,UAAU,MAAO,IAAA,CAAK,OAAQ,CAAA,OAAA,CAAgB,gBAAgB,GAAI,EAAA,CAAA;AACxE,MAAA,MAAM,SAAU,OAA0D,CAAA,IAAA;AAAA,QACtE,CAAC,GAAG,CAAM,KAAA;AAlDtB,UAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAmDgB,UAAM,MAAA,EAAA,GAAK,QAAO,EAAE,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,CAAA,CAAA,OAAA,CAAQ,UAAV,IAAiB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,QAAA,KAAjB,4CAAiC,GAAG,CAAA,CAAA;AACtD,UAAM,MAAA,EAAA,GAAK,QAAO,EAAE,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,CAAA,CAAA,OAAA,CAAQ,UAAV,IAAiB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,QAAA,KAAjB,4CAAiC,GAAG,CAAA,CAAA;AACtD,UAAA,OAAO,EAAK,GAAA,EAAA,GAAK,CAAI,GAAA,EAAA,GAAK,KAAK,CAAK,CAAA,GAAA,CAAA,CAAA;AAAA,SACxC;AAAA,OACJ,CAAA;AACA,MAAO,OAAA,MAAA,CAAO,KAAM,CAAA,CAAA,EAAG,KAAK,CAAA,CAAA;AAAA,KAChC,CAAA,CAAA;AAAA,GAAA;AACJ;;;;;;;;;;;;;;;;;;;;;;ACjCA,MAAM,UAAyB,GAAA,WAAA,CAAA;AAExB,MAAM,mBAA8C,CAAA;AAAA,EAiBvD,YAAoB,MAAsB,EAAA;AAAtB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA,CAAA;AAChB,IAAA,MAAM,UAAU,MAAO,CAAA,QAAA,CAAA;AACvB,IAAI,IAAA,CAAC,QAAQ,SAAW,EAAA;AACpB,MAAM,MAAA,IAAI,MAAM,qCAAqC,CAAA,CAAA;AAAA,KACzD;AACA,IAAA,IAAI,CAAC,MAAA,CAAO,OAAQ,CAAA,OAAA,CAAQ,MAAQ,EAAA;AAChC,MAAM,MAAA,IAAI,MAAM,sBAAsB,CAAA,CAAA;AAAA,KAC1C;AAEA,IAAA,MAAM,YAAY,OAAQ,CAAA,SAAA,CAAA;AAC1B,IAAA,MAAM,UAAU,IAAIH,cAAA,CAAUoB,aAAQ,EAAI,EAAA,SAAA,CAAU,SAAS,CAAA,CAAA;AAC7D,IAAA,IAAI,CAAC,OAAA,CAAQ,MAAO,CAAA,MAAA,CAAO,MAAM,CAAG,EAAA;AAChC,MAAM,MAAA,IAAI,MAAM,kDAAkD,CAAA,CAAA;AAAA,KACtE;AAEA,IAAM,MAAA,IAAA,GAAyB,EAAE,UAAW,EAAA,CAAA;AAC5C,IAAA,IAAI,MAAO,CAAA,OAAA,CAAQ,OAAQ,CAAA,MAAA,GAAS,CAAK,IAAA,MAAA,CAAO,OAAQ,CAAA,OAAA,CAAQ,CAAC,CAAA,CAAE,UAAW,CAAA,IAAI,CAAG,EAAA;AACjF,MAAA,IAAA,CAAK,UAAa,GAAA,MAAA,CAAO,OAAQ,CAAA,OAAA,CAAQ,CAAC,CAAA,CAAA;AAAA,KAC9C;AAEA,IAAA,IAAA,CAAK,MAAS,GAAA,OAAA,CAAA;AACd,IAAK,IAAA,CAAA,UAAA,GAAa,IAAIC,kBAAW,CAAA,MAAA,CAAO,QAAQ,OAAQ,CAAA,CAAC,GAAG,IAAI,CAAA,CAAA;AAEhE,IAAA,MAAM,YAAe,GAAA;AAAA,MACjB,SAAA;AAAA,MACM,gBAA6C,EAAmB,EAAA;AAAA,QAAA,OAAAlB,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAClE,UAAO,OAAA,OAAA,CAAQ,gBAAgB,EAAE,CAAA,CAAA;AAAA,SACrC,CAAA,CAAA;AAAA,OAAA;AAAA,MACM,oBAAiD,GAAwB,EAAA;AAAA,QAAA,OAAAA,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAC3E,UAAO,OAAA,OAAA,CAAQ,GAAI,CAAA,GAAA,CAAI,GAAI,CAAA,CAAC,OAAO,OAAQ,CAAA,eAAA,CAAgB,EAAE,CAAC,CAAC,CAAA,CAAA;AAAA,SACnE,CAAA,CAAA;AAAA,OAAA;AAAA,KACJ,CAAA;AAEA,IAAK,IAAA,CAAA,MAAA,GAAS,IAAImB,qBAAe,CAAA,IAAA,CAAK,YAAY,YAAc,EAAA,EAAE,YAAY,CAAA,CAAA;AAE9E,IAAA,IAAA,CAAK,aAAgB,GAAA,IAAI,aAAc,CAAA,IAAA,CAAK,MAAM,CAAA,CAAA;AAClD,IAAA,IAAA,CAAK,kBAAqB,GAAA,IAAI,kBAAmB,CAAA,IAAA,CAAK,MAAM,CAAA,CAAA;AAC5D,IAAA,IAAA,CAAK,iBAAoB,GAAA,IAAI,iBAAkB,CAAA,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,GAC9D;AAAA,EA9CA,IAAI,SAAuB,GAAA;AACvB,IAAA,OAAO,IAAIC,iBAAA,CAAU,IAAK,CAAA,MAAA,CAAO,KAAK,KAAK,CAAA,CAAA;AAAA,GAC/C;AAAA,EAEA,IAAI,OAAU,GAAA;AACV,IAAA,OAAO,KAAK,MAAO,CAAA,OAAA,CAAA;AAAA,GACvB;AAAA,EAgDM,YAAmC,GAAA;AAAA,IAAA,OAAApB,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AA1F7C,MAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AA2FQ,MAAI,IAAA;AACA,QAAA,MAAM,OAAO,IAAK,CAAA,SAAA,CAAA;AAClB,QAAA,MAAM,iBAAiB,oBAAqB,EAAA,CAAA;AAC5C,QAAA,MAAM,WAAW,cAAe,EAAA,CAAA;AAChC,QAAA,MAAM,aAAa,mBAAoB,EAAA,CAAA;AACvC,QAAA,MAAM,aAAgB,GAAAI,sCAAA;AAAA,UAClB,UAAA;AAAA,UACA,IAAA;AAAA,UACA,KAAA;AAAA,UACAC,8BAAA;AAAA,SACJ,CAAA;AAEA,QAAA,MAAM,CAAC,cAAgB,EAAA,aAAA,EAAe,UAAU,CAAI,GAAA,MAAM,QAAQ,GAAI,CAAA;AAAA,UAClE,IAAA,CAAK,UAAW,CAAA,UAAA,CAAW,IAAI,CAAA;AAAA,UAC/B,KAAK,UAAW,CAAA,sBAAA,CAAuB,aAAa,CAAE,CAAA,KAAA,CAAM,MAAM,IAAI,CAAA;AAAA,UACtE,KAAK,kBAAmB,CAAA,aAAA,CAAc,IAAI,CAAE,CAAA,KAAA,CAAM,MAAM,IAAI,CAAA;AAAA,SAC/D,CAAA,CAAA;AAED,QAAA,MAAM,eAAkB,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,aAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,aAAA,CAAe,KAAf,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAsB,WAAtB,IAAgC,GAAA,EAAA,GAAA,GAAA,CAAA;AACxD,QAAA,MAAM,cAAiB,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,aAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,aAAA,CAAe,KAAf,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAsB,aAAtB,IAAkC,GAAA,EAAA,GAAA,CAAA,CAAA;AAEzD,QAAA,MAAM,oBAAmB,UAAY,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,UAAA,CAAA,cAAA,IAC/B,UAAW,CAAA,cAAA,CAAe,UAC1B,GAAA,GAAA,CAAA;AACN,QAAA,MAAM,eAAkB,GAAA,cAAA,CAAA;AAExB,QAAA,MAAM,SAAuB,GAAA;AAAA,UACzB,MAAQ,EAAA;AAAA,YACJ,MAAQ,EAAA,KAAA;AAAA,YACR,QAAU,EAAA,CAAA;AAAA,YACV,MAAA,EAAQ,OAAO,cAAc,CAAA;AAAA,WACjC;AAAA,UACA,MAAQ,EAAA;AAAA,YACJ,MAAQ,EAAA,QAAA;AAAA,YACR,QAAU,EAAA,cAAA;AAAA,YACV,MAAA,EAAQ,OAAO,eAAe,CAAA;AAAA,WAClC;AAAA,UACA,OAAS,EAAA;AAAA,YACL,MAAQ,EAAA,QAAA;AAAA,YACR,QAAU,EAAA,eAAA;AAAA,YACV,MAAA,EAAQ,OAAO,gBAAgB,CAAA;AAAA,WACnC;AAAA,UACA,MAAQ,EAAA;AAAA,YACJ,aAAA,EAAe,cAAc,QAAS,EAAA;AAAA,YACtC,cAAA,EAAgB,eAAe,QAAS,EAAA;AAAA,YACxC,QAAA,EAAU,SAAS,QAAS,EAAA;AAAA,WAChC;AAAA,SACJ,CAAA;AAEA,QAAO,OAAA,SAAA,CAAA;AAAA,eAEJ,KAAO,EAAA;AACV,QAAQ,OAAA,CAAA,GAAA,CAAI,0BAA0B,KAAK,CAAA,CAAA;AAC3C,QAAM,MAAA,KAAA,CAAA;AAAA,OACV;AAAA,KACJ,CAAA,CAAA;AAAA,GAAA;AAAA,EAOM,aAAgB,GAAA;AAAA,IAAA,OAAAL,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAClB,MAAA,OAAO,IAAK,CAAA,kBAAA,CAAmB,aAAc,CAAA,IAAA,CAAK,SAAS,CAAA,CAAA;AAAA,KAC/D,CAAA,CAAA;AAAA,GAAA;AAAA,EAEA,cAAiB,GAAA;AAAA,GAEjB;AAAA,EAUM,SAAS,MAAkC,EAAA;AAAA,IAAA,OAAAA,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAzKrD,MAAA,IAAA,EAAA,CAAA;AA0KQ,MAAI,IAAA;AACA,QAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,mBAAmB,sBAAuB,CAAA,EAAE,QAAQ,CAAA,CAAA;AAC7E,QAAA,IAAI,CAAC,KAAA,CAAM,UAAc,IAAA,CAAC,MAAM,WAAa,EAAA;AACzC,UAAA,MAAM,IAAI,KAAA,CAAA,CAAM,EAAM,GAAA,KAAA,CAAA,MAAA,KAAN,YAAgB,8CAA8C,CAAA,CAAA;AAAA,SAClF;AAEA,QAAM,MAAA,EAAE,IAAI,SAAW,EAAA,oBAAA,KAAyB,MAAM,IAAA,CAAK,SAAU,CAAA,KAAA,CAAM,WAAW,CAAA,CAAA;AACtF,QAAA,MAAM,MAAS,GAAA,MAAM,IAAK,CAAA,eAAA,CAAgB,EAAE,CAAA,CAAA;AAC5C,QAAM,MAAA,MAAA,GAAS,MAAM,IAAK,CAAA,kBAAA,CAAmB,QAAQ,EAAE,SAAA,EAAW,sBAAsB,CAAA,CAAA;AAExF,QAAA,OAAA,CAAQ,IAAI,aAAe,EAAA;AAAA,UACvB,gBAAgB,KAAM,CAAA,cAAA;AAAA,UACtB,KAAA,EAAO,MAAM,IAAK,CAAA,QAAA;AAAA,UAClB,WAAW,KAAM,CAAA,IAAA,CAAK,QAAS,CAAA,GAAA,CAAI,CAAC,CAAG,KAAA;AAvLvD,YAAA,IAAAqB,GAAA,EAAA,EAAA,CAAA;AAuL2D,YAAA,OAAA;AAAA,cACvC,KAAOA,EAAAA,CAAAA,GAAAA,GAAA,CAAE,CAAA,KAAA,KAAF,gBAAAA,GAAS,CAAA,QAAA,EAAA;AAAA,cAChB,KAAA,EAAA,CAAO,EAAE,GAAA,CAAA,CAAA,KAAA,KAAF,IAAS,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,QAAA,EAAA;AAAA,aACpB,CAAA;AAAA,WAAE,CAAA;AAAA,SACL,CAAA,CAAA;AAED,QAAA,OAAO,MAAO,CAAA,SAAA,CAAA;AAAA,eACT,KAAO,EAAA;AACZ,QAAQ,OAAA,CAAA,KAAA,CAAM,sBAAsB,KAAK,CAAA,CAAA;AACzC,QAAM,MAAA,KAAA,CAAA;AAAA,OACV;AAAA,KACJ,CAAA,CAAA;AAAA,GAAA;AAAA,EAOM,QAAQ,QAAmC,EAAA;AAAA,IAAA,OAAArB,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAC7C,MAAM,MAAA,EAAE,aAAgB,GAAA,MAAM,KAAK,aAAc,CAAA,cAAA,CAAe,IAAK,CAAA,SAAA,EAAW,QAAQ,CAAA,CAAA;AACxF,MAAM,MAAA,EAAE,IAAI,SAAW,EAAA,oBAAA,KAAyB,MAAM,IAAA,CAAK,UAAU,WAAW,CAAA,CAAA;AAChF,MAAA,MAAM,MAAS,GAAA,MAAM,IAAK,CAAA,eAAA,CAAgB,EAAE,CAAA,CAAA;AAC5C,MAAM,MAAA,MAAA,GAAS,MAAM,IAAK,CAAA,kBAAA,CAAmB,QAAQ,EAAE,SAAA,EAAW,sBAAsB,CAAA,CAAA;AACxF,MAAA,OAAO,MAAO,CAAA,SAAA,CAAA;AAAA,KAClB,CAAA,CAAA;AAAA,GAAA;AAAA,EAEc,kBAAA,CACV,QACA,GACiB,EAAA;AAAA,IAAA,OAAAA,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AACjB,MAAA,MAAM,YAAY,MAAM,IAAA,CAAK,WAAW,kBAAmB,CAAA,MAAA,CAAO,WAAa,EAAA;AAAA,QAC3E,aAAe,EAAA,KAAA;AAAA,QACf,mBAAqB,EAAA,UAAA;AAAA,QACrB,UAAY,EAAA,CAAA;AAAA,OACf,CAAA,CAAA;AAED,MAAM,MAAA,IAAA,GAAO,MAAM,IAAA,CAAK,UAAW,CAAA,kBAAA;AAAA,QAC/B,EAAE,SAAW,EAAA,SAAA,EAAW,IAAI,SAAW,EAAA,oBAAA,EAAsB,IAAI,oBAAqB,EAAA;AAAA,QACtF,UAAA;AAAA,OACJ,CAAA;AAEA,MAAM,MAAA,EAAA,GAAK,CAAC,IAAA,CAAK,KAAM,CAAA,GAAA,CAAA;AACvB,MAAA,IAAI,CAAC,EAAI,EAAA;AACL,QAAM,MAAA,IAAI,MAAM,CAAuB,oBAAA,EAAA,IAAA,CAAK,UAAU,IAAK,CAAA,KAAA,CAAM,GAAG,CAAC,CAAE,CAAA,CAAA,CAAA;AAAA,OAC3E;AACA,MAAA,OAAO,EAAE,SAAW,EAAA,IAAA,EAAM,KAAK,OAAQ,CAAA,IAAA,EAAM,WAAW,IAAK,EAAA,CAAA;AAAA,KACjE,CAAA,CAAA;AAAA,GAAA;AAAA,EAEM,gBAAgB,EAAmD,EAAA;AAAA,IAAA,OAAAA,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AACrE,MAAA,OAAO,IAAK,CAAA,MAAA,CAAO,MAAO,CAAA,eAAA,CAAgB,EAAE,CAAA,CAAA;AAAA,KAChD,CAAA,CAAA;AAAA,GAAA;AAAA,EAEM,gBAAgB,MAA0D,EAAA;AAAA,IAAA,OAAAA,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAC5E,MAAO,OAAA,IAAA,CAAK,MAAO,CAAA,cAAA,CAAe,MAAM,CAAA,CAAA;AAAA,KAC5C,CAAA,CAAA;AAAA,GAAA;AAAA,EAEM,UACF,EAC6E,EAAA;AAAA,IAAA,OAAAA,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAC7E,MAAM,MAAA,EAAE,WAAW,oBAAqB,EAAA,GAAI,MAAM,IAAK,CAAA,UAAA,CAAW,mBAAmB,WAAW,CAAA,CAAA;AAChG,MAAA,EAAA,CAAG,eAAkB,GAAA,SAAA,CAAA;AACrB,MAAA,EAAA,CAAG,WAAW,IAAK,CAAA,SAAA,CAAA;AAEnB,MAAO,OAAA,EAAE,EAAI,EAAA,SAAA,EAAW,oBAAqB,EAAA,CAAA;AAAA,KACjD,CAAA,CAAA;AAAA,GAAA;AACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
|