@wireio/stake 2.2.1 → 2.2.2
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/lib/stake.browser.js +41 -0
- package/lib/stake.browser.js.map +1 -1
- package/lib/stake.d.ts +13 -1
- package/lib/stake.js +161 -95
- package/lib/stake.js.map +1 -1
- package/lib/stake.m.js +41 -0
- package/lib/stake.m.js.map +1 -1
- package/package.json +1 -1
- package/src/networks/ethereum/clients/validator.client.ts +61 -0
- package/src/networks/ethereum/ethereum.ts +20 -0
- package/src/networks/ethereum/types.ts +9 -2
- package/src/types.ts +2 -0
package/lib/stake.m.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stake.m.js","sources":["../src/networks/solana/clients/deposit.client.ts","../src/networks/solana/constants.ts","../src/networks/solana/utils.ts","../src/networks/solana/clients/distribution.client.ts","../src/networks/solana/clients/leaderboard.client.ts","../src/networks/solana/clients/outpost.client.ts","../src/networks/solana/clients/token.client.ts","../src/networks/solana/program.ts","../src/networks/solana/solana.ts","../src/networks/ethereum/contract.ts","../src/networks/ethereum/utils.ts","../src/networks/ethereum/clients/convert.client.ts","../src/networks/ethereum/clients/stake.client.ts","../src/networks/ethereum/clients/pretoken.client.ts","../src/networks/ethereum/clients/opp.client.ts","../src/types.ts","../src/networks/ethereum/clients/receipt.client.ts","../src/networks/ethereum/ethereum.ts","../src/staker.ts","../src/networks/ethereum/types.ts"],"sourcesContent":["import { AnchorProvider, BN, Program, Wallet } from '@coral-xyz/anchor';\nimport {\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 Connection,\n PublicKey,\n TransactionMessage,\n LAMPORTS_PER_SOL,\n Signer,\n} from '@solana/web3.js';\n\nimport {\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddressSync,\n} from '@solana/spl-token';\nimport * as multisig from \"@sqds/multisig\";\n\nimport { LiqsolCoreClientIdl, SolanaProgramService } from '../program';\n\nimport { GlobalAccount, WalletLike } from '../types';\n\nexport class DepositClient {\n private program: Program<LiqsolCoreClientIdl>;\n\n get connection() {\n return this.provider.connection;\n }\n\n get wallet(): WalletLike {\n return this.provider.wallet;\n }\n\n constructor(\n private readonly provider: AnchorProvider,\n private readonly pgs: SolanaProgramService\n ) {\n this.program = pgs.getProgram('liqsolCore');\n }\n\n /**\n * Build a deposit transaction:\n * SOL -> liqSOL via liqsol_core::deposit.\n */\n async buildDepositTx(\n amount: bigint,\n user = this.wallet.publicKey,\n ): Promise<TransactionInstruction> {\n if (!user) {\n throw new Error(\n 'DepositClient.buildDepositTx: wallet not connected',\n );\n }\n if (!amount || amount <= BigInt(0)) {\n throw new Error(\n 'DepositClient.buildDepositTx: amount must be greater than zero.',\n );\n }\n\n // -------------------------------------------------------------\n // PDAs\n // -------------------------------------------------------------\n const depositAuthority = this.pgs.deriveDepositAuthorityPda();\n const liqsolMint = this.pgs.deriveLiqsolMintPda();\n const liqsolMintAuthority = this.pgs.deriveLiqsolMintAuthorityPda();\n const reservePool = this.pgs.deriveReservePoolPda();\n const vault = this.pgs.deriveVaultPda();\n const controllerState = this.pgs.deriveStakeControllerStatePda();\n const payoutState = this.pgs.derivePayoutStatePda();\n const bucketAuthority = this.pgs.deriveBucketAuthorityPda();\n const payRateHistory = this.pgs.derivePayRateHistoryPda();\n const globalConfig = this.pgs.deriveGlobalConfigPda();\n\n // -------------------------------------------------------------\n // Token-2022 ATAs\n // -------------------------------------------------------------\n const userAta = getAssociatedTokenAddressSync(\n liqsolMint,\n user,\n true,\n TOKEN_2022_PROGRAM_ID,\n );\n\n // -------------------------------------------------------------\n // Distribution state + user_record (KEYED BY TOKEN ACCOUNT)\n // -------------------------------------------------------------\n const distributionState = this.pgs.deriveDistributionStatePda();\n const userRecord = this.pgs.deriveUserRecordPda(userAta);\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 this.pgs.deriveEphemeralStakeAddress(user, seed);\n\n // -------------------------------------------------------------\n // BUILD IX (MUST MATCH IDL)\n // -------------------------------------------------------------\n return await this.program.methods\n .deposit(new BN(amount.toString()), 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: this.pgs.PROGRAM_IDS.LIQSOL_TOKEN,\n stakeProgram: StakeProgram.programId,\n liqsolMint,\n userAta,\n liqsolMintAuthority,\n reservePool,\n vault,\n ephemeralStake,\n controllerState,\n payoutState,\n bucketAuthority,\n bucketTokenAccount,\n userRecord,\n distributionState,\n payRateHistory,\n instructionsSysvar: SYSVAR_INSTRUCTIONS_PUBKEY,\n clock: SYSVAR_CLOCK_PUBKEY,\n stakeHistory: SYSVAR_STAKE_HISTORY_PUBKEY,\n rent: SYSVAR_RENT_PUBKEY,\n globalConfig\n })\n .instruction();\n }\n\n /**\n * Build a withdraw-request transaction:\n * liqSOL -> SOL via liqsol_core::requestWithdraw.\n *\n * This:\n * - burns liqSOL from the user\n * - increments totalEncumberedFunds in global state\n * - mints an NFT receipt (liqReceiptData + NFT ATA for owner)\n */\n async buildWithdrawTx(\n amount: bigint,\n user = this.wallet.publicKey,\n ): Promise<TransactionInstruction> {\n if (!user) {\n throw new Error(\n 'DepositClient.buildWithdrawTx: wallet not connected',\n );\n }\n if (!amount || amount <= BigInt(0)) {\n throw new Error(\n 'DepositClient.buildWithdrawTx: amount must be greater than zero.',\n );\n }\n\n // -------------------------------------------------------------\n // Core program + liqSOL mint / user ATA\n // -------------------------------------------------------------\n const liqsolMint = this.pgs.deriveLiqsolMintPda();\n\n const userAta = getAssociatedTokenAddressSync(\n liqsolMint,\n user,\n true,\n TOKEN_2022_PROGRAM_ID,\n );\n\n // Distribution / balance-tracking\n // user_record is keyed by the user’s liqSOL ATA (same convention\n // as deposit/purchase).\n const userRecord = this.pgs.deriveUserRecordPda(userAta);\n const distributionState = this.pgs.deriveDistributionStatePda();\n\n // Reserve + stake controller PDAs\n const global = this.pgs.deriveWithdrawGlobalPda(); // withdraw operator state\n const reservePool = this.pgs.deriveReservePoolPda();\n const stakeAllocationState = this.pgs.deriveStakeAllocationStatePda();\n const stakeMetrics = this.pgs.deriveStakeMetricsPda();\n const maintenanceLedger = this.pgs.deriveMaintenanceLedgerPda();\n const globalConfig = this.pgs.deriveGlobalConfigPda(); // liqSOL config / roles\n\n // -------------------------------------------------------------\n // Need nextReceiptId from withdraw global state\n // -------------------------------------------------------------\n const globalAcct: GlobalAccount = await this.program.account.global.fetch(global);\n\n const rawId = globalAcct.nextReceiptId;\n let receiptId: bigint;\n\n if (typeof rawId === 'bigint') {\n // New-style IDL / accounts returning bigint directly\n receiptId = rawId;\n } else if (rawId != null && typeof rawId === 'object' && 'toString' in rawId) {\n // Anchor BN / bn.js or similar – normalize through string\n receiptId = BigInt(rawId.toString());\n } else if (typeof rawId === 'number') {\n // Just in case someone typed it as a JS number in tests\n receiptId = BigInt(rawId);\n } else {\n throw new Error(\n `DepositClient.buildWithdrawTx: unexpected nextReceiptId type (${typeof rawId})`,\n );\n }\n\n // -------------------------------------------------------------\n // NFT receipt PDAs (mint, metadata, data, ATA)\n // -------------------------------------------------------------\n const mintAuthority = this.pgs.deriveWithdrawMintAuthorityPda();\n const metadata = this.pgs.deriveWithdrawMintMetadataPda();\n\n const nftMint = this.pgs.deriveWithdrawNftMintPda(receiptId);\n const receiptData = this.pgs.deriveLiqReceiptDataPda(nftMint);\n\n const owner = user;\n const nftAta = getAssociatedTokenAddressSync(\n nftMint,\n owner,\n true,\n TOKEN_2022_PROGRAM_ID,\n );\n\n // Bucket token account (same bucket used by deposit/distribution)\n const bucketAuthority = this.pgs.deriveBucketAuthorityPda();\n const bucketTokenAccount = getAssociatedTokenAddressSync(\n liqsolMint,\n bucketAuthority,\n true,\n TOKEN_2022_PROGRAM_ID,\n );\n\n // -------------------------------------------------------------\n // BUILD IX (MUST MATCH requestWithdraw IDL)\n // -------------------------------------------------------------\n return await this.program.methods\n .requestWithdraw(new BN(amount.toString()))\n .accounts({\n user,\n owner,\n global,\n liqsolMint,\n userAta,\n userRecord,\n reservePool,\n stakeAllocationState,\n stakeMetrics,\n maintenanceLedger,\n clock: SYSVAR_CLOCK_PUBKEY,\n mintAuthority,\n receiptData,\n metadata,\n nftMint,\n nftAta,\n distributionState,\n bucketTokenAccount,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n tokenInterface: TOKEN_2022_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n rent: SYSVAR_RENT_PUBKEY,\n globalConfig,\n })\n .instruction();\n\n }\n}\n\n// A “wallet-adapter-like” shape (AnchorProvider.wallet matches this)\ntype WalletLikeSigner = {\n publicKey: PublicKey;\n signTransaction: (tx: Transaction) => Promise<Transaction>;\n};\n\nfunction isKeypairSigner(x: any): x is { publicKey: PublicKey; secretKey: Uint8Array } {\n return !!x && x.publicKey instanceof PublicKey && x.secretKey instanceof Uint8Array;\n}\n\nfunction isWalletLikeSigner(x: any): x is WalletLikeSigner {\n return !!x && x.publicKey instanceof PublicKey && typeof x.signTransaction === \"function\";\n}\n","// src/networks/solana/constants.ts\nimport { PublicKey, StakeProgram } from '@solana/web3.js';\nimport { SolChainID } from '@wireio/core';\n\nimport mainnetLiqsolCoreIDL from '../../assets/solana/mainnet/idl/liqsol_core.json';\nimport mainnetLiqSolTokenIDL from '../../assets/solana/mainnet/idl/liqsol_token.json';\nimport mainnetValidatorLeaderboardIDL from '../../assets/solana/mainnet/idl/validator_leaderboard.json';\nimport mainnetTransferHookIDL from '../../assets/solana/mainnet/idl/transfer_hook.json';\n\nimport devnetLiqsolCoreIDL from '../../assets/solana/devnet/idl/liqsol_core.json';\nimport devnetLiqSolTokenIDL from '../../assets/solana/devnet/idl/liqsol_token.json';\nimport devnetValidatorLeaderboardIDL from '../../assets/solana/devnet/idl/validator_leaderboard.json';\nimport devnetTransferHookIDL from '../../assets/solana/devnet/idl/transfer_hook.json';\nimport { SupportedSolChainID } from '../../types';\n\n/**\n * Per-chain program IDs (NOT global anymore).\n */\nexport type SolanaProgramIds = {\n LIQSOL_CORE: PublicKey;\n LIQSOL_TOKEN: PublicKey;\n VALIDATOR_LEADERBOARD: PublicKey;\n TRANSFER_HOOK: PublicKey;\n ALT_LOOKUP_TABLE: PublicKey;\n};\n\nconst MAINNET_PROGRAM_IDS: SolanaProgramIds = {\n LIQSOL_CORE: new PublicKey(mainnetLiqsolCoreIDL.address),\n LIQSOL_TOKEN: new PublicKey(mainnetLiqSolTokenIDL.address),\n VALIDATOR_LEADERBOARD: new PublicKey(mainnetValidatorLeaderboardIDL.address),\n TRANSFER_HOOK: new PublicKey(mainnetTransferHookIDL.address),\n ALT_LOOKUP_TABLE: new PublicKey(\"AQXTHwkdNBEiXeQuVA5uCoxvzgYUmudRxthQY4vWKCPS\")\n};\n\nconst DEVNET_PROGRAM_IDS: SolanaProgramIds = {\n LIQSOL_CORE: new PublicKey(devnetLiqsolCoreIDL.address),\n LIQSOL_TOKEN: new PublicKey(devnetLiqSolTokenIDL.address),\n VALIDATOR_LEADERBOARD: new PublicKey(devnetValidatorLeaderboardIDL.address),\n TRANSFER_HOOK: new PublicKey(devnetTransferHookIDL.address),\n ALT_LOOKUP_TABLE: new PublicKey(\"3MbupRDxUqPtJzoLLmjEYV3dXJdh1jojQrpDEQUqv7xb\")\n};\n\nexport const PROGRAM_IDS_BY_CHAIN: Record<SupportedSolChainID, SolanaProgramIds> = {\n [SolChainID.Mainnet]: MAINNET_PROGRAM_IDS,\n [SolChainID.Devnet]: DEVNET_PROGRAM_IDS,\n};\n\nexport const getProgramIds = (chainId: SolChainID): SolanaProgramIds => {\n const ids = PROGRAM_IDS_BY_CHAIN[chainId];\n if (!ids) throw new Error(`Unsupported Solana chainId=${chainId}`);\n return ids;\n};\n\n/**\n * ---------------------------------------------------------------------------\n * PDA SEEDS (must match on-chain programs)\n * ---------------------------------------------------------------------------\n */\nexport const PDA_SEEDS = {\n // GLOBAL CONFIG\n GLOBAL_CONFIG: 'global_config',\n\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 / price history\n PAY_RATE_HISTORY: 'pay_rate_history',\n PRICE_HISTORY: 'price_history',\n\n // validator leaderboard (state + records)\n LEADERBOARD_STATE: 'leaderboard_state',\n VALIDATOR_RECORD: 'validator',\n GLOBAL_STAKE_INFO: 'global_stake_info',\n\n // Outpost / Wire pretokens\n OUTPOST_GLOBAL_STATE: 'outpost_global_state',\n LIQSOL_POOL: 'liqsol_pool',\n OUTPOST_ACCOUNT: 'outpost_account',\n USER_PRETOKEN_RECORD: 'user_pretoken_record',\n TRANCHE_STATE: 'tranche_state',\n\n // BAR module (bonded actor roles)\n BAR_STATE_SEED: 'bar_state',\n BONDED_ACTOR_SEED: 'bonded_actor',\n BOND_LEVEL_SEED: 'bond_level',\n\n // SPL transfer-hook extra account metas\n EXTRA_ACCOUNT_METAS: 'extra-account-metas',\n\n // Withdraw module / receipts\n WITHDRAW_GLOBAL: 'global',\n STAKE_ALLOCATION_STATE: 'stake_allocation_state',\n STAKE_METRICS: 'stake_metrics',\n MAINTENANCE_LEDGER: 'maintenance_ledger',\n WITHDRAW_MINT_AUTHORITY: 'mint_authority',\n MINT_METADATA: 'mint_metadata',\n LIQ_RECEIPT_DATA: 'liq_receipt_data',\n WITHDRAW_MINT: 'mint',\n} as const;\n\n/**\n * Ephemeral stake account address seed helper\n * (this one really is global & chain-agnostic).\n */\nexport const deriveEphemeralStakeAddress = async (\n user: PublicKey,\n seed: number,\n): Promise<PublicKey> => {\n const seedStr = `ephemeral_${seed}`;\n return PublicKey.createWithSeed(user, seedStr, StakeProgram.programId);\n};\n\n/**\n * Constant keys (Chainlink)\n */\nexport const CHAINLINK_FEED = new PublicKey(\n 'CH31Xns5z3M1cTAbKW34jcxPPciazARpijcHj9rxtemt',\n);\nexport const CHAINLINK_PROGRAM = new PublicKey(\n 'HEvSKofvBgfaexv23kMabbYqxasxU3mQ4ibBMEmJWHny',\n);\n\n/**\n * ---------------------------------------------------------------------------\n * ECONOMICS & MATH CONSTANTS\n * ---------------------------------------------------------------------------\n */\nexport const PAY_RATE_SCALE_FACTOR = BigInt(1_000_000_000_000); // 10^12\nexport const DEFAULT_AVERAGE_PAY_RATE = BigInt(191_780_821);\nexport const DEFAULT_PAY_RATE_LOOKBACK = 5;\nexport const EPHEMERAL_RENT_EXEMPTION = 2_282_880;\n\nexport const LAMPORTS_PER_SOL = 1_000_000_000;\nexport const INDEX_SCALE = BigInt(1_000_000_000_000); // 1e12\n\nexport const lamportsToSol = (lamports: number | bigint): number =>\n Number(lamports) / LAMPORTS_PER_SOL;\n\nexport const solToLamports = (sol: number): bigint =>\n BigInt(Math.round(sol * LAMPORTS_PER_SOL));","import { Program, BN, AnchorProvider } from '@coral-xyz/anchor';\n\nimport {\n Connection,\n Keypair,\n PublicKey,\n} from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n getAssociatedTokenAddress,\n} from '@solana/spl-token';\n\nimport {\n DEFAULT_AVERAGE_PAY_RATE,\n EPHEMERAL_RENT_EXEMPTION,\n solToLamports,\n DEFAULT_PAY_RATE_LOOKBACK,\n CHAINLINK_FEED,\n CHAINLINK_PROGRAM,\n} from './constants';\n\nimport { LiqsolCore } from '../../assets/solana/devnet/types/liqsol_core';\nimport { GlobalState, TrancheState } from './types';\nimport { TrancheLadderItem, TrancheSnapshot } from '../../types';\nimport { ChainID } from '@wireio/core';\nimport { SolanaProgramService } from './program';\n\n// -----------------------------------------------------------------------------\n// Tranche Support\n// -----------------------------------------------------------------------------\nconst INDEX_SCALE = BigInt(1_000_000_000_000); // 1e12\nconst USD_SCALE = BigInt(100_000_000); // 1e8\nconst BPS = BigInt(10_000);\n\n/**\n * Apply one forward growth step: value * (BPS + growthBps) / BPS.\n * Simple integer round-half-up.\n */\nfunction growSupplyOnce(value: bigint, growthBps: number): bigint {\n const g = BigInt(growthBps);\n return (value * (BPS + g) + BPS / BigInt(2)) / BPS;\n}\n\n/**\n * Apply one backward step: value * BPS / (BPS + growthBps).\n * Also integer round-half-up.\n */\nfunction shrinkSupplyOnce(value: bigint, growthBps: number): bigint {\n const g = BigInt(growthBps);\n return (value * BPS + (BPS + g) / BigInt(2)) / (BPS + g);\n}\n\n/**\n * Price step is expressed in *cents*, while prices are 1e8 USD.\n * 1 cent = 0.01 * 1e8 = 1e6, so:\n * step = priceGrowthCents * 1e6\n */\nfunction priceStepUsd1e8(priceGrowthCents: number): bigint {\n if (!priceGrowthCents) return BigInt(0);\n const CENT_SCALE = USD_SCALE / BigInt(100); // 1e6\n return BigInt(priceGrowthCents) * CENT_SCALE;\n}\n\nfunction growPriceOnceUsd1e8(value: bigint, priceGrowthCents: number): bigint {\n const step = priceStepUsd1e8(priceGrowthCents);\n return value + step;\n}\n\nfunction shrinkPriceOnceUsd1e8(value: bigint, priceGrowthCents: number): bigint {\n const step = priceStepUsd1e8(priceGrowthCents);\n if (step === BigInt(0)) return value;\n if (value <= step) return BigInt(0);\n return value - step;\n}\n\n/** BN | bigint -> bigint helper (keeps code readable) */\nexport function toBigint(x: any): bigint {\n if (typeof x === 'bigint') return x;\n if (typeof x === 'number') return BigInt(x);\n // Anchor BN\n return BigInt(x.toString());\n}\n\n/**\n * Convert token amount -> shares using the same rule as on-chain tests:\n * shares = ceil(amount * INDEX_SCALE / currentIndex)\n */\nexport function tokensToShares(amount: bigint, currentIndex: bigint): bigint {\n if (amount === BigInt(0)) return BigInt(0);\n const num = amount * INDEX_SCALE;\n const q = num / currentIndex;\n const r = num % currentIndex;\n return r === BigInt(0) ? q : q + BigInt(1);\n}\n\n/**\n * Build a local tranche ladder around the current tranche\n * using only on-chain config + current state.\n *\n * Rules (from liqsol_core tests):\n * - past tranches are fully sold\n * - current tranche has (initial - currentSupply) sold\n * - future tranches start with 0 sold\n * - supply/price grow by supplyGrowthBps/priceGrowthBps per tranche\n */\nexport function buildSolanaTrancheLadder(options: {\n currentTranche: number;\n initialTrancheSupply: bigint;\n currentTrancheSupply: bigint;\n currentPriceUsd: bigint; // 1e8 scale\n supplyGrowthBps: number;\n priceGrowthCents: number; // e.g. 2 -> $0.02 per tranche\n windowBefore?: number;\n windowAfter?: number;\n}): TrancheLadderItem[] {\n const {\n currentTranche,\n initialTrancheSupply,\n currentTrancheSupply,\n currentPriceUsd,\n supplyGrowthBps,\n priceGrowthCents,\n windowBefore = 5,\n windowAfter = 5,\n } = options;\n\n const startId = Math.max(0, currentTranche - windowBefore);\n const endId = currentTranche + windowAfter;\n\n const capacity = new Map<number, bigint>();\n const price = new Map<number, bigint>();\n\n // Seed current tranche\n capacity.set(currentTranche, initialTrancheSupply);\n price.set(currentTranche, currentPriceUsd);\n\n // Forward (future tranches): grow supply by BPS, price by +cents (linear)\n for (let id = currentTranche + 1; id <= endId; id++) {\n const prevCap = capacity.get(id - 1)!;\n const prevPrice = price.get(id - 1)!;\n\n capacity.set(id, growSupplyOnce(prevCap, supplyGrowthBps));\n price.set(id, growPriceOnceUsd1e8(prevPrice, priceGrowthCents));\n }\n\n // Backward (past tranches): shrink supply by inverse BPS, price by -cents\n for (let id = currentTranche - 1; id >= startId; id--) {\n const nextCap = capacity.get(id + 1)!;\n const nextPrice = price.get(id + 1)!;\n\n capacity.set(id, shrinkSupplyOnce(nextCap, supplyGrowthBps));\n price.set(id, shrinkPriceOnceUsd1e8(nextPrice, priceGrowthCents));\n }\n\n const ladder: TrancheLadderItem[] = [];\n for (let id = startId; id <= endId; id++) {\n const cap = capacity.get(id)!;\n\n let sold: bigint;\n if (id < currentTranche) {\n // Past tranches fully sold\n sold = cap;\n } else if (id === currentTranche) {\n // Current tranche: cap - remaining\n sold = cap - currentTrancheSupply;\n } else {\n // Future tranches not yet opened\n sold = BigInt(0);\n }\n\n ladder.push({\n id,\n capacity: cap,\n sold,\n remaining: cap - sold,\n priceUsd: price.get(id)!, // still 1e8 scale\n });\n }\n\n return ladder;\n}\n\n/**\n * Turn raw liqsol_core accounts into a chain-agnostic TrancheSnapshot for SOL.\n * All math stays here; TokenClient just wires accounts + connection.\n */\nexport function buildSolanaTrancheSnapshot(options: {\n chainID: ChainID;\n globalState: GlobalState;\n trancheState: TrancheState;\n solPriceUsd?: bigint;\n nativePriceTimestamp?: number;\n ladderWindowBefore?: number;\n ladderWindowAfter?: number;\n}): TrancheSnapshot {\n const {\n chainID,\n globalState,\n trancheState,\n solPriceUsd,\n nativePriceTimestamp,\n ladderWindowBefore,\n ladderWindowAfter,\n } = options;\n\n const currentIndex = toBigint(globalState.currentIndex);\n const totalShares = toBigint(globalState.totalShares);\n const currentTranche = trancheState.currentTrancheNumber.toNumber();\n const currentTrancheSupply = toBigint(trancheState.currentTrancheSupply);\n const initialTrancheSupply = toBigint(trancheState.initialTrancheSupply);\n const totalPretokensSold = toBigint(trancheState.totalPretokensSold);\n const currentPriceUsd = toBigint(trancheState.currentTranchePriceUsd);\n const supplyGrowthBps = trancheState.supplyGrowthBps;\n const priceGrowthCents = trancheState.priceGrowthCents;\n\n const ladder = buildSolanaTrancheLadder({\n currentTranche,\n initialTrancheSupply,\n currentTrancheSupply,\n currentPriceUsd,\n supplyGrowthBps,\n priceGrowthCents,\n windowBefore: ladderWindowBefore,\n windowAfter: ladderWindowAfter,\n });\n\n return {\n chainID,\n currentIndex,\n totalShares,\n currentTranche,\n currentPriceUsd,\n supplyGrowthBps,\n priceGrowthCents,\n totalPretokensSold,\n currentTrancheSupply,\n initialTrancheSupply,\n nativePriceUsd: solPriceUsd,\n nativePriceTimestamp,\n ladder,\n };\n}\n\n/**\n * ---------------------------------------------------------------------------\n * Outpost-specific helpers\n * ---------------------------------------------------------------------------\n *\n * This is the SDK equivalent of `deriveWirePdas` in capital-staking tests.\n * It aggregates all PDAs / ATAs needed for Outpost pretokens + synd/desynd.\n */\nexport interface OutpostAccounts {\n user: PublicKey;\n\n // Outpost / pretoken wiring\n globalState: PublicKey;\n poolAuthority: PublicKey;\n liqsolMint: PublicKey;\n liqsolPoolAta: PublicKey;\n userAta: PublicKey;\n outpostAccount: PublicKey;\n userPretokenRecord: PublicKey;\n\n // Distribution / yield context (user_record keyed by token accounts)\n distributionState: PublicKey;\n bucketAuthority: PublicKey;\n bucketTokenAccount: PublicKey;\n bucketUserRecord: PublicKey;\n liqsolPoolUserRecord: PublicKey;\n userUserRecord: PublicKey;\n\n // Tranche / pricing\n trancheState: PublicKey;\n\n // Chainlink\n chainLinkFeed: PublicKey;\n chainLinkProgram: PublicKey;\n\n // Transfer hook extra accounts\n extraAccountMetaList: PublicKey;\n}\n\nexport async function buildOutpostAccounts(\n connection: Connection,\n user: PublicKey,\n pgs: SolanaProgramService,\n): Promise<OutpostAccounts> {\n const globalState = pgs.deriveOutpostGlobalStatePda();\n const poolAuthority = pgs.deriveOutpostPoolAuthorityPda();\n const liqsolMint = pgs.deriveLiqsolMintPda();\n const distributionState = pgs.deriveDistributionStatePda();\n const bucketAuthority = pgs.deriveBucketAuthorityPda();\n const trancheState = pgs.deriveTrancheStatePda();\n\n // Outpost / pretoken PDAs\n const outpostAccount = pgs.deriveOutpostAccountPda(user);\n const userPretokenRecord = pgs.deriveUserPretokenRecordPda(user);\n\n // ATAs\n const liqsolPoolAta = await getAssociatedTokenAddress(\n liqsolMint,\n poolAuthority,\n true,\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 const userAta = await getAssociatedTokenAddress(\n liqsolMint,\n user,\n true, // allow off curve in case squadsx vault\n TOKEN_2022_PROGRAM_ID,\n );\n\n // user_record PDAs keyed by TOKEN ACCOUNTS (matches capital-staking)\n const bucketUserRecord = pgs.deriveUserRecordPda(bucketTokenAccount);\n const liqsolPoolUserRecord = pgs.deriveUserRecordPda(liqsolPoolAta);\n const userUserRecord = pgs.deriveUserRecordPda(userAta);\n\n const extraAccountMetaList = pgs.deriveExtraAccountMetaListPda(liqsolMint);\n\n // Chainlink program feeds\n let chainLinkFeed = CHAINLINK_FEED;\n let chainLinkProgram = CHAINLINK_PROGRAM;\n\n try {\n const program = pgs.getProgram('liqsolCore');\n const ts: TrancheState =\n await program.account.trancheState.fetch(trancheState);\n\n // If on-chain config overrides are present, prefer those.\n if (ts.chainlinkFeed && ts.chainlinkProgram) {\n chainLinkFeed = ts.chainlinkFeed as PublicKey;\n chainLinkProgram = ts.chainlinkProgram as PublicKey;\n }\n } catch {\n // If trancheState isn't initialized yet, we fall back to the constants.\n // In that case, purchase instructions will still fail, which is the\n // correct behavior until admin initializes TrancheState on-chain.\n }\n\n void connection; // reserved for future extra validation\n\n return {\n user,\n globalState,\n poolAuthority,\n liqsolMint,\n liqsolPoolAta,\n userAta,\n outpostAccount,\n userPretokenRecord,\n distributionState,\n bucketAuthority,\n bucketTokenAccount,\n bucketUserRecord,\n liqsolPoolUserRecord,\n userUserRecord,\n trancheState,\n chainLinkFeed,\n chainLinkProgram,\n extraAccountMetaList\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, Number(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\nexport function ceilDiv(n: BN, d: BN): BN {\n if (d.isZero()) {\n throw new Error('Division by zero in ceilDiv');\n }\n return n.add(d.subn(1)).div(d);\n}","import { AnchorProvider, Program, BN } from '@coral-xyz/anchor';\nimport { PublicKey } from '@solana/web3.js';\n\nimport { LiqsolCoreClientIdl, SolanaProgramService } from '../program';\nimport type { LiqsolCore } from '../../../assets/solana/devnet/types/liqsol_core';\nimport type { DistributionState, DistributionUserRecord, GlobalConfig, PayRateEntry, PayRateHistory } from '../types';\nimport { getAssociatedTokenAddressSync, TOKEN_2022_PROGRAM_ID } from '@solana/spl-token';\nimport { ceilDiv } from '../utils';\n\n/**\n * Distribution client – wraps the distribution portion of the liqsol_core\n * program in the *new* shares-only model.\n *\n * Responsibilities:\n * - Read DistributionState (global index/share pool)\n * - Read per-user UserRecord (shares)\n * - Provide simple helpers for querying user share positions\n *\n * There is no longer any notion of:\n * - tracked vs actual balances\n * - mismatch candidates\n * - updateUser / correct-&-register flow\n *\n * On-chain truth:\n * - User balances live in their liqSOL ATA.\n * - DistributionState + UserRecord track *shares* for yield.\n */\nexport class DistributionClient {\n private program: Program<LiqsolCoreClientIdl>;\n\n constructor(\n private readonly provider: AnchorProvider,\n private readonly pgs: SolanaProgramService\n ) {\n this.program = pgs.getProgram('liqsolCore');\n }\n\n get connection() {\n return this.provider.connection;\n }\n\n /**\n * Fetch the global distribution state account.\n *\n * IDL account name: \"distributionState\"\n */\n async getDistributionState(): Promise<DistributionState | null> {\n const pda = this.pgs.deriveDistributionStatePda();\n try {\n return await this.program.account.distributionState.fetch(pda);\n } catch {\n return null;\n }\n }\n\n\n /**\n * Fetch the global payRateHistory account (circular buffer of scaled pay rates).\n *\n * IDL account name: \"payRateHistory\"\n */\n async getPayRateHistory(): Promise<PayRateHistory | null> {\n const pda = this.pgs.derivePayRateHistoryPda();\n try {\n // Anchor types map directly onto our PayRateHistory TS type\n return (await this.program.account.payRateHistory.fetch(\n pda,\n )) as PayRateHistory;\n } catch {\n return null;\n }\n }\n\n /**\n * Fetch the globalConfig account (contains depositFeeMultiplier, etc).\n *\n * IDL account name: \"globalConfig\"\n */\n async getGlobalConfig(): Promise<GlobalConfig | null> {\n const pda = this.pgs.deriveGlobalConfigPda();\n try {\n return (await this.program.account.globalConfig.fetch(\n pda,\n ));\n } catch {\n return null;\n }\n }\n /**\n * Fetch a user's distribution userRecord (or null if missing).\n *\n * IDL account name: \"userRecord\"\n */\n async getUserRecord(\n ownerOrAta: PublicKey,\n ): Promise<DistributionUserRecord | null> {\n const liqsolMint = this.pgs.deriveLiqsolMintPda();\n\n // 1) Try treating ownerOrAta as a WALLET: derive its liqSOL ATA, then userRecord.\n try {\n const ata = getAssociatedTokenAddressSync(\n liqsolMint,\n ownerOrAta,\n true,\n TOKEN_2022_PROGRAM_ID,\n );\n const pdaFromWallet = this.pgs.deriveUserRecordPda(ata);\n const recFromWallet =\n await this.program.account.userRecord.fetchNullable(pdaFromWallet);\n if (recFromWallet) {\n return recFromWallet;\n }\n } catch {\n // fall through\n }\n\n // 2) Fallback: treat ownerOrAta as already being the TOKEN ACCOUNT.\n try {\n const pdaFromAta = this.pgs.deriveUserRecordPda(ownerOrAta);\n return await this.program.account.userRecord.fetchNullable(pdaFromAta);\n } catch {\n return null;\n }\n }\n\n /**\n * Convenience: get the user's current distribution shares.\n *\n * Returns BN(0) if the user has no userRecord yet.\n */\n async getUserShares(user: PublicKey): Promise<BN> {\n const record = await this.getUserRecord(user);\n return record ? record.shares : new BN(0);\n }\n\n /**\n * Convenience: get both the user's shares and totalShares, plus a\n * floating-point ratio (userShares / totalShares).\n *\n * NOTE: ratio is a JS number and may lose precision for very large values,\n * but is fine for display / percentage UIs.\n */\n async getUserSharePosition(user: PublicKey): Promise<{\n shares: BN;\n totalShares: BN;\n ratio: number;\n }> {\n const [dist, userShares] = await Promise.all([\n this.getDistributionState(),\n this.getUserShares(user),\n ]);\n\n const totalShares = dist ? dist.totalShares : new BN(0);\n\n let ratio = 0;\n if (!totalShares.isZero()) {\n // use toNumber() for UI-friendly ratio; if you need exact math,\n // do it with BN or bigint at the call site instead.\n ratio = userShares.toNumber() / totalShares.toNumber();\n }\n\n return { shares: userShares, totalShares, ratio };\n }\n\n /**\n * Compute an average scaled pay rate over the most recent `windowSize`\n * valid entries in the pay-rate history circular buffer.\n *\n * Returns a BN scaled by 1e12 (same as on-chain).\n */\n async getAverageScaledPayRate(windowSize = 5): Promise<BN> {\n const history = await this.getPayRateHistory();\n if (!history) {\n return new BN(0);\n }\n\n const entries: PayRateEntry[] = history.entries ?? [];\n if (!entries.length) {\n return new BN(0);\n }\n\n const maxEntries: number =\n typeof history.maxEntries === 'number'\n ? history.maxEntries\n : entries.length;\n\n const rawTotalAdded: any = history.totalEntriesAdded ?? 0;\n const totalAddedBn = new BN(rawTotalAdded.toString());\n\n // No valid entries written yet\n if (totalAddedBn.isZero()) {\n return new BN(0);\n }\n\n const totalAdded = Math.min(\n totalAddedBn.toNumber(),\n maxEntries,\n entries.length,\n );\n\n if (!totalAdded) {\n return new BN(0);\n }\n\n const COUNT = Math.max(1, Math.min(windowSize, totalAdded));\n\n const currentIndexNum = Number(history.currentIndex ?? 0);\n\n // Most recently written entry is at currentIndex - 1 (mod maxEntries)\n let idx =\n currentIndexNum === 0\n ? maxEntries - 1\n : currentIndexNum - 1;\n\n let sum = new BN(0);\n let valid = 0;\n const zero = new BN(0);\n\n for (let i = 0; i < COUNT; i++) {\n const entry: any = entries[idx];\n if (entry) {\n // Support both camelCase and snake_case (for safety)\n const rawScaled =\n entry.scaledRate ??\n entry.scaled_rate ??\n 0;\n\n const rate = new BN(rawScaled.toString());\n if (rate.gt(zero)) {\n sum = sum.add(rate);\n valid += 1;\n }\n }\n\n // Walk backwards through the circular buffer\n idx = idx === 0 ? maxEntries - 1 : idx - 1;\n }\n\n if (!valid) {\n return new BN(0);\n }\n\n // Same behavior as the dashboard: use a ceiling-like average\n return ceilDiv(sum, new BN(valid));\n }\n}","import { AnchorProvider, Program } from '@coral-xyz/anchor';\nimport { PublicKey } from '@solana/web3.js';\n\nimport { SolanaProgramService, ValidatorLeaderboardClientIdl } from '../program';\nimport type { ValidatorLeaderboard } from '../../../assets/solana/devnet/types/validator_leaderboard';\nimport { LeaderboardState, ValidatorRecord } from '../types';\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<ValidatorLeaderboardClientIdl>;\n\n constructor(\n private readonly provider: AnchorProvider,\n private readonly pgs: SolanaProgramService\n ) {\n this.program = pgs.getProgram('validatorLeaderboard');\n }\n\n async getState(): Promise<LeaderboardState | null> {\n const pda = this.pgs.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<ValidatorRecord | null> {\n const pda = this.pgs.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 return top validators ordered\n * by the on-chain leaderboard scores.\n *\n * Uses:\n * - `leaderboardState.scores`\n * - `leaderboardState.sortedIndices`\n * - `validatorRecord.registryIndex`\n *\n * Fallback: if leaderboardState can't be fetched, we sort by\n * `creditsObserved` descending.\n */\n async getTopValidators(limit = 20): Promise<ValidatorRecord[]> {\n // Try to use the leaderboard state first\n try {\n const leaderboardPda = this.pgs.deriveLeaderboardStatePda();\n const leaderboard: LeaderboardState \n = await this.program.account.leaderboardState.fetch(leaderboardPda);\n\n const all = await this.program.account.validatorRecord.all();\n const byIndex = new Map<number, ValidatorRecord>();\n\n for (const r of all) {\n const vr = r.account;\n byIndex.set(vr.registryIndex, vr);\n }\n\n const max = Math.min(\n limit,\n leaderboard.numValidators,\n leaderboard.sortedIndices.length,\n );\n\n const top: ValidatorRecord[] = [];\n for (let i = 0; i < max; i++) {\n const idx = leaderboard.sortedIndices[i];\n const rec = byIndex.get(idx);\n if (rec) {\n top.push(rec);\n }\n }\n\n return top;\n } catch (e) {\n // Fallback: no leaderboardState available, sort by creditsObserved.\n const all = await this.program.account.validatorRecord.all();\n\n all.sort((a, b) => {\n const va = a.account;\n const vb = b.account;\n const ca = va.creditsObserved;\n const cb = vb.creditsObserved;\n // BN.cmp: -1 if a < b, 0 if equal, 1 if a > b\n return cb.cmp(ca);\n });\n\n return all.slice(0, limit).map(r => r.account);\n }\n }\n}","import { AnchorProvider, BN, Program } from '@coral-xyz/anchor';\nimport {\n PublicKey,\n SystemProgram,\n TransactionInstruction,\n} from '@solana/web3.js';\nimport {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n TOKEN_2022_PROGRAM_ID,\n} from '@solana/spl-token';\n\nimport { LiqsolCore } from '../../../assets/solana/devnet/types/liqsol_core';\n\nimport {\n OutpostAccounts,\n buildOutpostAccounts,\n} from '../utils';\n\nimport {\n OutpostWireStateSnapshot,\n SharesPreview,\n TrancheState,\n WalletLike,\n} from '../types';\nimport { INDEX_SCALE } from '../constants';\nimport { LiqsolCoreClientIdl, SolanaProgramService } from '../program';\n\n/**\n * OutpostClient\n *\n * Read-only + preview helper for:\n * - Outpost config + per-user pretokens\n * - Tranche ladder snapshot\n * - Pretoken preview math\n *\n * Write helpers:\n * - buildStakeIx → liqsol_core::synd\n * - buildUnstakeIx → liqsol_core::desynd\n *\n * All PDAs / ATAs are sourced via buildOutpostAccounts, which is kept\n * in sync with the on-chain PDAs and capital-staking Wire utils.\n */\nexport class OutpostClient {\n private readonly program: Program<LiqsolCoreClientIdl>;\n\n constructor(\n private readonly provider: AnchorProvider,\n private readonly pgs: SolanaProgramService,\n ) {\n this.program = pgs.getProgram('liqsolCore');\n }\n\n get connection() {\n return this.provider.connection;\n }\n\n get wallet(): WalletLike {\n return this.provider.wallet as unknown as WalletLike;\n }\n\n /**\n * Build all outpost-related PDAs / ATAs for a given user.\n * Defaults to the connected wallet.\n */\n async buildAccounts(user?: PublicKey): Promise<OutpostAccounts> {\n const userPk = user ?? this.wallet.publicKey;\n if (!userPk) {\n throw new Error('OutpostClient.buildAccounts: wallet not connected');\n }\n return buildOutpostAccounts(this.connection, userPk, this.pgs);\n }\n\n /**\n * Internal helper: get raw token balance (BN) for a given ATA.\n */\n private async getTokenBalance(ata: PublicKey): Promise<BN> {\n try {\n const bal = await this.connection.getTokenAccountBalance(ata);\n return new BN(bal.value.amount);\n } catch {\n return new BN(0);\n }\n }\n\n /**\n * Fetch the core \"Wire state\" for Outpost / pretokens for a given user.\n */\n async fetchWireState(user?: PublicKey): Promise<OutpostWireStateSnapshot> {\n const userPk = user ?? this.wallet.publicKey;\n if (!userPk) {\n throw new Error('OutpostClient.fetchWireState: wallet not connected');\n }\n\n const pdas = await this.buildAccounts(userPk);\n\n try {\n const [\n globalState,\n outpostAccount,\n distributionState,\n userPretokenRecord,\n trancheState,\n ] = await Promise.all([\n this.program.account.globalState.fetch(pdas.globalState),\n this.program.account.outpostAccount.fetchNullable(pdas.outpostAccount),\n this.program.account.distributionState.fetchNullable(pdas.distributionState),\n this.program.account.userPretokenRecord.fetchNullable(pdas.userPretokenRecord),\n this.program.account.trancheState.fetchNullable(pdas.trancheState),\n ]);\n\n const [liqsolPoolBalance, userLiqsolBalance] = await Promise.all([\n this.getTokenBalance(pdas.liqsolPoolAta),\n this.getTokenBalance(pdas.userAta),\n ]);\n\n return {\n globalState,\n outpostAccount,\n distributionState,\n trancheState,\n userPretokenRecord,\n liqsolPoolBalance,\n userLiqsolBalance,\n };\n }\n catch (err) {\n console.error('Error fetching Outpost wire state:', err);\n throw err;\n }\n }\n\n // -------------------------------------------------------------------------\n // Outpost stake / unstake builders (synd / desynd)\n // -------------------------------------------------------------------------\n\n /**\n * Build the `synd` (stake) instruction:\n * user liqSOL ATA → liqSOL pool ATA\n */\n async buildStakeIx(\n amountLamports: bigint,\n user: PublicKey = this.wallet.publicKey,\n ): Promise<TransactionInstruction> {\n if (!user) {\n throw new Error('OutpostClient.buildStakeIx: wallet not connected');\n }\n\n const a = await this.buildAccounts(user);\n\n return this.program.methods\n .synd(new BN(amountLamports.toString()))\n .accounts({\n user,\n liqsolMint: a.liqsolMint,\n globalState: a.globalState,\n distributionState: a.distributionState,\n userAta: a.userAta,\n poolAuthority: a.poolAuthority,\n bucketAuthority: a.bucketAuthority,\n bucketTokenAccount: a.bucketTokenAccount,\n bucketUserRecord: a.bucketUserRecord,\n senderUserRecord: a.userUserRecord,\n receiverUserRecord: a.liqsolPoolUserRecord,\n extraAccountMetaList: a.extraAccountMetaList,\n liqsolCoreProgram: this.pgs.PROGRAM_IDS.LIQSOL_CORE,\n transferHookProgram: this.pgs.PROGRAM_IDS.TRANSFER_HOOK,\n liqsolPoolAta: a.liqsolPoolAta,\n outpostAccount: a.outpostAccount,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n /**\n * Build the `desynd` (unstake) instruction:\n * liqSOL pool ATA → user liqSOL ATA\n */\n async buildUnstakeIx(\n amountLamports: bigint,\n user?: PublicKey,\n ): Promise<TransactionInstruction> {\n const userPk = user ?? this.wallet.publicKey;\n if (!userPk) {\n throw new Error('OutpostClient.buildUnstakeIx: wallet not connected');\n }\n\n const a = await this.buildAccounts(userPk);\n\n return this.program.methods\n .desynd(new BN(amountLamports.toString()))\n .accounts({\n user: userPk,\n liqsolMint: a.liqsolMint,\n globalState: a.globalState,\n distributionState: a.distributionState,\n userAta: a.userAta,\n poolAuthority: a.poolAuthority,\n bucketAuthority: a.bucketAuthority,\n bucketTokenAccount: a.bucketTokenAccount,\n bucketUserRecord: a.bucketUserRecord,\n senderUserRecord: a.liqsolPoolUserRecord,\n receiverUserRecord: a.userUserRecord,\n extraAccountMetaList: a.extraAccountMetaList,\n liqsolCoreProgram: this.pgs.PROGRAM_IDS.LIQSOL_CORE,\n transferHookProgram: this.pgs.PROGRAM_IDS.TRANSFER_HOOK,\n liqsolPoolAta: a.liqsolPoolAta,\n outpostAccount: a.outpostAccount,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n })\n .instruction();\n }\n\n // -------------------------------------------------------------------------\n // Pretoken preview helper (unchanged)\n // -------------------------------------------------------------------------\n\n /**\n * Local preview for \"how many pretokens would I get for this liqSOL\n * amount at the current tranche price and SOL/USD price?\"\n *\n * SCALE = 1e8\n * usdValue = solAmountLamports * solPriceUsd / 1e9\n * pretokens = usdValue * SCALE / pretokenPriceUsd\n *\n * All values are BN integers; solPriceUsd and pretokenPriceUsd are 1e8 scaled.\n */\n previewPretokens(params: {\n liqsolAmountLamports: BN;\n solPriceUsd: BN; // 1e8 scale\n trancheState: TrancheState;\n }): SharesPreview {\n const { liqsolAmountLamports, solPriceUsd, trancheState } = params;\n\n // Current tranche price in USD (1e8 scale)\n const pretokenPriceUsd = new BN(\n trancheState.currentTranchePriceUsd.toString(),\n );\n\n const SCALE = new BN('100000000'); // 1e8\n\n // usdValue = (lamports * solPriceUsd) / 1e9\n const usdValue = liqsolAmountLamports\n .mul(solPriceUsd)\n .div(new BN(1_000_000_000));\n\n const estimatedPretokens = usdValue.mul(SCALE).div(pretokenPriceUsd);\n\n return {\n liqsolAmountLamports,\n solPriceUsd,\n pretokenPriceUsd,\n estimatedPretokens,\n };\n }\n\n /**\n * Convert liqSOL tokens (lamports) → Outpost “shares”, rounding UP\n * when there is any remainder.\n *\n * This matches the on-chain logic and the capital-staking helper:\n *\n * INDEX_SCALE = 1e12\n * numerator = amount * INDEX_SCALE\n * shares = numerator / currentIndex\n * remainder = numerator % currentIndex\n * if remainder > 0 → shares + 1\n */\n static tokensToShares(amount: BN, currentIndex: BN): BN {\n const numerator = amount.mul(new BN(INDEX_SCALE));\n const shares = numerator.div(currentIndex);\n const remainder = numerator.mod(currentIndex);\n return remainder.eqn(0) ? shares : shares.addn(1);\n }\n\n /**\n * Format a 1e8-scaled integer (e.g. USD price, pretokens, etc.)\n * into a fixed 8-decimal string.\n *\n * Examples:\n * 0 -> \"0.00000000\"\n * 1 -> \"0.00000001\"\n * 100000000 -> \"1.00000000\"\n * 123456789 -> \"1.23456789\"\n */\n static formatScale8(value: BN): string {\n const decimals = 8;\n const valueStr = value.toString();\n\n if (valueStr.length <= decimals) {\n const padding = '0'.repeat(decimals - valueStr.length);\n return `0.${padding}${valueStr}`;\n }\n\n const intPart = valueStr.slice(0, valueStr.length - decimals);\n const decPart = valueStr.slice(valueStr.length - decimals);\n return `${intPart}.${decPart}`;\n }\n}","import { AnchorProvider, BN, Program } from '@coral-xyz/anchor';\nimport type { TransactionInstruction, Connection } from '@solana/web3.js';\nimport { PublicKey, SystemProgram } from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n} from '@solana/spl-token';\n\nimport {\n buildOutpostAccounts,\n type OutpostAccounts,\n} from '../utils';\n\nimport { LiqsolCoreClientIdl, SolanaProgramService } from '../program';\nimport type { LiqsolCore } from '../../../assets/solana/devnet/types/liqsol_core';\n\nimport {\n GlobalState,\n PriceHistory,\n TrancheState,\n WalletLike,\n OutpostAccount,\n UserPretokenRecord,\n} from '../types';\n\nimport {\n CHAINLINK_FEED,\n CHAINLINK_PROGRAM,\n} from '../constants';\n\nexport class TokenClient {\n private readonly program: Program<LiqsolCoreClientIdl>;\n\n get wallet(): WalletLike {\n return this.provider.wallet;\n }\n\n get connection(): Connection {\n return this.provider.connection;\n }\n\n constructor(\n private readonly provider: AnchorProvider,\n private readonly pgs: SolanaProgramService\n ) {\n this.program = pgs.getProgram('liqsolCore');\n }\n\n // ---------------------------------------------------------------------------\n // Account helpers\n // ---------------------------------------------------------------------------\n\n async getAccounts(user: PublicKey): Promise<OutpostAccounts> {\n return buildOutpostAccounts(this.provider.connection, user, this.pgs);\n }\n\n async fetchGlobalState(): Promise<GlobalState> {\n const { globalState } = await this.getAccounts(this.wallet.publicKey);\n return this.program.account.globalState.fetch(globalState);\n }\n\n async fetchTrancheState(): Promise<TrancheState> {\n const { trancheState } = await this.getAccounts(this.wallet.publicKey);\n return this.program.account.trancheState.fetch(trancheState);\n }\n\n /**\n * Fetch the per-user Outpost account (old \"wire receipt\").\n * Returns null if the user has never interacted with Outpost.\n */\n async fetchOutpostAccount(user: PublicKey): Promise<OutpostAccount | null> {\n const { outpostAccount } = await this.getAccounts(user);\n return this.program.account.outpostAccount.fetchNullable(outpostAccount);\n }\n\n /**\n * Fetch the per-user pretoken purchase record.\n * Returns null if the user has never purchased pretokens.\n */\n async fetchUserPretokenRecord(\n user: PublicKey,\n ): Promise<UserPretokenRecord | null> {\n const { userPretokenRecord } = await this.getAccounts(user);\n return this.program.account.userPretokenRecord.fetchNullable(\n userPretokenRecord,\n );\n }\n\n // ---------------------------------------------------------------------------\n // Instruction builders (no send / confirm)\n // ---------------------------------------------------------------------------\n\n /**\n * Build a pretoken `purchase` instruction using liqSOL from the user’s ATA.\n *\n * This mirrors capital-staking `executePurchase` wiring:\n * - amountLamports: liqSOL amount (raw token-2022 units, not SOL)\n */\n async buildPurchaseIx(\n amountLamports: bigint,\n user = this.wallet.publicKey,\n ): Promise<TransactionInstruction> {\n console.log('build purchase for', user.toBase58());\n \n const a = await this.getAccounts(user);\n\n const extraAccountMetaList = this.pgs.deriveExtraAccountMetaListPda(a.liqsolMint);\n const liqsolCoreProgram = this.pgs.PROGRAM_IDS.LIQSOL_CORE;\n const transferHookProgram = this.pgs.PROGRAM_IDS.TRANSFER_HOOK;\n\n return this.program.methods\n .purchase(new BN(amountLamports.toString()))\n .accounts({\n user: a.user,\n liqsolMint: a.liqsolMint,\n globalState: a.globalState,\n distributionState: a.distributionState,\n\n // buyer’s liqSOL\n buyerAta: a.userAta,\n\n // pool / bucket context\n poolAuthority: a.poolAuthority,\n bucketAuthority: a.bucketAuthority,\n bucketTokenAccount: a.bucketTokenAccount,\n bucketUserRecord: a.bucketUserRecord,\n\n // distribution userRecords (token-account keyed)\n senderUserRecord: a.userUserRecord,\n receiverUserRecord: a.liqsolPoolUserRecord,\n\n // transfer-hook wiring\n extraAccountMetaList,\n liqsolCoreProgram,\n transferHookProgram,\n\n // pool + outpost + tranche\n liqsolPoolAta: a.liqsolPoolAta,\n outpostAccount: a.outpostAccount,\n trancheState: a.trancheState,\n userPretokenRecord: a.userPretokenRecord,\n\n // Chainlink pricing\n chainlinkFeed: a.chainLinkFeed ?? CHAINLINK_FEED,\n chainlinkProgram: a.chainLinkProgram ?? CHAINLINK_PROGRAM,\n\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n // NOTE:\n // - There is no longer `purchaseWithSol` in the IDL - SOL → liqSOL happens\n // through the deposit / liqSOL minting path, not directly in pretokens.\n // - `purchaseFromYield` is an operator-facing / protocol flow and you\n // indicated you’ll trigger it from Wire infra, so we don’t expose a\n // client helper here for now.\n\n // ---------------------------------------------------------------------------\n // Price helpers (SOL/USD via priceHistory account)\n // ---------------------------------------------------------------------------\n\n async getSolPriceUsdSafe(): Promise<{ price?: bigint; timestamp?: number }> {\n try {\n const price = await this.getSolPriceUsd();\n // current priceHistory account has no timestamp; keep optional\n return { price, timestamp: undefined };\n } catch {\n return { price: undefined, timestamp: undefined };\n }\n }\n\n /**\n * Fetch latest SOL/USD price (1e8 scale) from liqsol_core.priceHistory.\n * Uses the ring-buffer semantics from capital-staking.\n */\n async getSolPriceUsd(): Promise<bigint> {\n const priceHistoryPda = this.pgs.derivePriceHistoryPda();\n const history = (await this.program.account.priceHistory.fetch(\n priceHistoryPda,\n )) as PriceHistory;\n\n const { prices, nextIndex, count, windowSize } = history;\n\n if (!prices || prices.length === 0 || !count) {\n throw new Error('Price history is empty - no SOL price available');\n }\n\n const capacity = prices.length || windowSize;\n if (!capacity) {\n throw new Error(\n 'Price history capacity is zero - check account layout',\n );\n }\n\n const lastIndex = nextIndex === 0 ? capacity - 1 : nextIndex - 1;\n const latest = prices[lastIndex];\n\n if (!BN.isBN(latest)) {\n throw new Error(\n 'Latest price entry is not a BN - check IDL/decoder',\n );\n }\n\n return BigInt(latest.toString());\n }\n}","// src/networks/solana/programs.ts\nimport { AnchorProvider, Program } from '@coral-xyz/anchor';\nimport { ChainID, SolChainID } from '@wireio/core';\nimport { PublicKey, StakeProgram } from '@solana/web3.js';\n\nimport {\n PDA_SEEDS,\n getProgramIds,\n SolanaProgramIds,\n} from './constants';\n\n// Mainnet IDLs\nimport liqsolCoreMainnetJson from '../../assets/solana/mainnet/idl/liqsol_core.json';\nimport liqsolTokenMainnetJson from '../../assets/solana/mainnet/idl/liqsol_token.json';\nimport validatorLeaderboardMainnetJson from '../../assets/solana/mainnet/idl/validator_leaderboard.json';\n\n// Devnet IDLs\nimport liqsolCoreDevnetJson from '../../assets/solana/devnet/idl/liqsol_core.json';\nimport liqsolTokenDevnetJson from '../../assets/solana/devnet/idl/liqsol_token.json';\nimport validatorLeaderboardDevnetJson from '../../assets/solana/devnet/idl/validator_leaderboard.json';\n\n// Mainnet types\nimport type { LiqsolCore as LiqSolCoreMainnet } from '../../assets/solana/mainnet/types/liqsol_core';\nimport type { LiqsolToken as LiqsolTokenMainnet } from '../../assets/solana/mainnet/types/liqsol_token';\nimport type { ValidatorLeaderboard as ValidatorLeaderboardMainnet } from '../../assets/solana/mainnet/types/validator_leaderboard';\n\n// Devnet types\nimport type { LiqsolCore as LiqSolCoreDevnet } from '../../assets/solana/devnet/types/liqsol_core';\nimport type { LiqsolToken as LiqsolTokenDevnet } from '../../assets/solana/devnet/types/liqsol_token';\nimport type { ValidatorLeaderboard as ValidatorLeaderboardDevnet } from '../../assets/solana/devnet/types/validator_leaderboard';\n\n// “Client” IDLs = mainnet OR devnet, plus `address` field we add at runtime\n\nexport type LiqsolCoreClientIdl =\n (LiqSolCoreMainnet | LiqSolCoreDevnet) & { address: string };\n\nexport type LiqsolTokenClientIdl =\n (LiqsolTokenMainnet | LiqsolTokenDevnet) & { address: string };\n\nexport type ValidatorLeaderboardClientIdl =\n (ValidatorLeaderboardMainnet | ValidatorLeaderboardDevnet) & { address: string };\n\nexport type SolanaProgramIdlMap = {\n liqsolCore: LiqsolCoreClientIdl;\n liqsolToken: LiqsolTokenClientIdl;\n validatorLeaderboard: ValidatorLeaderboardClientIdl;\n};\n\nexport type SolanaProgramName = keyof SolanaProgramIdlMap;\n\ntype Entry<IDL> = {\n idl: IDL & { address: string };\n address: string;\n};\n\nconst PROGRAMS_BY_CHAIN = {\n [SolChainID.Mainnet]: {\n liqsolCore: {\n idl: liqsolCoreMainnetJson,\n address: liqsolCoreMainnetJson.address,\n } as Entry<LiqSolCoreMainnet>,\n liqsolToken: {\n idl: liqsolTokenMainnetJson,\n address: liqsolTokenMainnetJson.address,\n } as Entry<LiqsolTokenMainnet>,\n validatorLeaderboard: {\n idl: validatorLeaderboardMainnetJson,\n address: validatorLeaderboardMainnetJson.address,\n } as Entry<ValidatorLeaderboardMainnet>,\n },\n [SolChainID.Devnet]: {\n liqsolCore: {\n idl: liqsolCoreDevnetJson,\n address: liqsolCoreDevnetJson.address,\n } as Entry<LiqSolCoreDevnet>,\n liqsolToken: {\n idl: liqsolTokenDevnetJson,\n address: liqsolTokenDevnetJson.address,\n } as Entry<LiqsolTokenDevnet>,\n validatorLeaderboard: {\n idl: validatorLeaderboardDevnetJson,\n address: validatorLeaderboardDevnetJson.address,\n } as Entry<ValidatorLeaderboardDevnet>,\n },\n} as const;\n\nexport class SolanaProgramService {\n private readonly ids: SolanaProgramIds;\n private readonly programs: (typeof PROGRAMS_BY_CHAIN)[SolChainID.Mainnet];\n\n constructor(\n private provider: AnchorProvider,\n private chainId: ChainID,\n ) {\n const solChain = chainId as SolChainID;\n this.ids = getProgramIds(solChain);\n const programs = PROGRAMS_BY_CHAIN[solChain];\n if (!programs) {\n throw new Error(`Unsupported Solana chainId=${chainId}`);\n }\n this.programs = programs;\n }\n\n /** Expose per-chain program IDs */\n get programIds(): SolanaProgramIds {\n return this.ids;\n }\n\n // Generic getProgram, typed by name → union IDL\n getProgram<K extends SolanaProgramName>(\n name: K,\n ): Program<SolanaProgramIdlMap[K]> {\n const { idl, address } = this.programs[name];\n const idlWithAddr = { ...(idl as any), address } as SolanaProgramIdlMap[K];\n\n return new Program(idlWithAddr, this.provider) as Program<SolanaProgramIdlMap[K]>;\n }\n\n listProgramNames(): SolanaProgramName[] {\n return Object.keys(this.programs) as SolanaProgramName[];\n }\n\n get PROGRAM_IDS(): SolanaProgramIds {\n return this.ids;\n }\n\n\n // ---------------------------------------------------------------------\n // PDA helpers (instance methods, no ids passed in)\n // ---------------------------------------------------------------------\n\n // GLOBAL CONFIG\n deriveGlobalConfigPda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.GLOBAL_CONFIG)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n // CORE / DISTRIBUTION / DEPOSIT\n\n deriveLiqsolMintPda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQSOL_MINT)],\n this.ids.LIQSOL_TOKEN,\n )[0];\n }\n\n deriveLiqsolMintAuthorityPda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQSOL_MINT_AUTHORITY)],\n this.ids.LIQSOL_TOKEN,\n )[0];\n }\n\n deriveDepositAuthorityPda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.DEPOSIT_AUTHORITY)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n deriveVaultPda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VAULT)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n deriveReservePoolPda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.RESERVE_POOL)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n deriveStakeControllerStatePda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.STAKE_CONTROLLER_STATE)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n derivePayoutStatePda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.PAYOUT_STATE)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n deriveBucketAuthorityPda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.BUCKET_AUTHORITY)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n deriveDistributionStatePda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.DISTRIBUTION_STATE)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n /**\n * user_record PDA (keyed by USER wallet)\n */\n deriveUserRecordPda(user: PublicKey): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.USER_RECORD), user.toBuffer()],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n derivePayRateHistoryPda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.PAY_RATE_HISTORY)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n // --- Withdraw module / receipts ---\n\n deriveWithdrawGlobalPda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.WITHDRAW_GLOBAL)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n deriveStakeAllocationStatePda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.STAKE_ALLOCATION_STATE)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n deriveStakeMetricsPda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.STAKE_METRICS)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n deriveMaintenanceLedgerPda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.MAINTENANCE_LEDGER)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n deriveWithdrawMintAuthorityPda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.WITHDRAW_MINT_AUTHORITY)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n deriveWithdrawMintMetadataPda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.MINT_METADATA)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n /**\n * NFT mint for withdrawal receipt, derived from nextReceiptId.\n */\n deriveWithdrawNftMintPda(receiptId: bigint | number): PublicKey {\n const receiptIdBytes = Buffer.alloc(8);\n const asBigInt =\n typeof receiptId === 'bigint'\n ? receiptId\n : BigInt(receiptId.toString());\n receiptIdBytes.writeBigUInt64LE(asBigInt);\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.WITHDRAW_MINT), receiptIdBytes],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n deriveLiqReceiptDataPda(nftMint: PublicKey): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQ_RECEIPT_DATA), nftMint.toBuffer()],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n // --- Validator leaderboard ---\n\n deriveLeaderboardStatePda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LEADERBOARD_STATE)],\n this.ids.VALIDATOR_LEADERBOARD,\n )[0];\n }\n\n deriveValidatorRecordPda(voteAccount: PublicKey): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VALIDATOR_RECORD), voteAccount.toBuffer()],\n this.ids.VALIDATOR_LEADERBOARD,\n )[0];\n }\n\n deriveStakeControllerVaultPda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VAULT)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n // --- Outpost / pretokens ---\n\n deriveOutpostGlobalStatePda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.OUTPOST_GLOBAL_STATE)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n deriveOutpostPoolAuthorityPda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQSOL_POOL)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n deriveOutpostAccountPda(user: PublicKey): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.OUTPOST_ACCOUNT), user.toBuffer()],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n deriveUserPretokenRecordPda(user: PublicKey): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.USER_PRETOKEN_RECORD), user.toBuffer()],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n deriveTrancheStatePda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.TRANCHE_STATE)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n derivePriceHistoryPda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.PRICE_HISTORY)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n // --- BAR (bonded actor roles) ---\n\n deriveBarConfigPda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.BAR_STATE_SEED)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n deriveBondLevelPda(bondLevelId: number[]): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.BOND_LEVEL_SEED), Buffer.from(bondLevelId)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n deriveBondedActorPda(actor: PublicKey): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.BONDED_ACTOR_SEED), actor.toBuffer()],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n // --- Transfer-hook extra metas ---\n\n deriveExtraAccountMetaListPda(liqsolMint: PublicKey): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.EXTRA_ACCOUNT_METAS), liqsolMint.toBuffer()],\n this.ids.TRANSFER_HOOK,\n )[0];\n }\n\n // --- Ephemeral stake address (per-deposit) ---\n\n /**\n * Ephemeral stake account address used per-deposit.\n * On-chain convention: seed = `ephemeral_<u32>` under StakeProgram.programId.\n */\n async deriveEphemeralStakeAddress(\n user: PublicKey,\n seed: number,\n ): Promise<PublicKey> {\n const seedStr = `ephemeral_${seed}`;\n return PublicKey.createWithSeed(user, seedStr, StakeProgram.programId);\n }\n}","import {\n AddressLookupTableAccount,\n Commitment,\n ComputeBudgetProgram,\n Connection,\n ConnectionConfig,\n PerfSample,\n SendTransactionError,\n PublicKey as SolPubKey,\n SystemProgram,\n Transaction,\n TransactionInstruction,\n TransactionMessage,\n TransactionSignature,\n VersionedTransaction,\n} from '@solana/web3.js';\nimport { AnchorProvider, BN } from '@coral-xyz/anchor';\nimport { BaseSignerWalletAdapter } from '@solana/wallet-adapter-base';\nimport {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n createAssociatedTokenAccountInstruction,\n getAssociatedTokenAddressSync,\n TOKEN_2022_PROGRAM_ID,\n} from '@solana/spl-token';\n\nimport * as multisig from \"@sqds/multisig\";\n\nimport {\n Base58,\n ChainID,\n ExternalNetwork,\n KeyType,\n PublicKey,\n SolChainID,\n} from '@wireio/core';\n\nimport {\n IStakingClient,\n Portfolio,\n SquadsXConfig,\n StakerConfig,\n TrancheSnapshot,\n} from '../../types';\n\nimport { DepositClient } from './clients/deposit.client';\nimport { DistributionClient } from './clients/distribution.client';\nimport { LeaderboardClient } from './clients/leaderboard.client';\nimport { OutpostClient } from './clients/outpost.client';\nimport { TokenClient } from './clients/token.client';\n\nimport {\n DEFAULT_AVERAGE_PAY_RATE,\n INDEX_SCALE,\n PAY_RATE_SCALE_FACTOR,\n} from './constants';\n\nimport { buildSolanaTrancheSnapshot, ceilDiv } from './utils';\nimport { GlobalConfig, PayRateEntry, SolanaTransaction } from './types';\nimport { SolanaProgramService } from './program';\nimport bs58 from 'bs58';\n\nconst commitment: Commitment = 'confirmed';\n\nexport const SCALE = new BN('1000000000000');\n\n/**\n * Solana implementation of IStakingClient.\n *\n * Responsibilities:\n * - liqSOL deposit (SOL -> liqSOL)\n * - withdraw requests (liqSOL -> NFT receipt / encumbered SOL)\n * - Pretoken (WIRE) buys via liqSOL\n * - Unified portfolio + tranche snapshot + balance correction (later)\n *\n * This composes lower-level clients; it does not know about UI.\n */\nexport class SolanaStakingClient implements IStakingClient {\n public pubKey?: PublicKey; // Wire ED key (optional → read-only)\n public connection: Connection;\n public anchor: AnchorProvider;\n\n public depositClient: DepositClient;\n public distributionClient: DistributionClient;\n public leaderboardClient: LeaderboardClient;\n public outpostClient: OutpostClient;\n public tokenClient: TokenClient;\n public program: SolanaProgramService\n\n private smartAccount?: SolPubKey; // PDA (off-curve)\n private signer?: SolPubKey; // on-curve signer\n\n get solPubKey(): SolPubKey {\n if (!this.pubKey) throw new Error('pubKey is undefined');\n return new SolPubKey(this.pubKey.data.array);\n }\n\n get network(): ExternalNetwork {\n return this.config.network;\n }\n\n get feePayer(): SolPubKey {\n if (this.signer) return this.signer;\n // fallback for normal wallets\n if (this.anchor.wallet.publicKey) return this.anchor.wallet.publicKey;\n throw new Error('No signing authority available');\n }\n\n get squadsX(): SquadsXConfig | null {\n const config = this.config.extras?.squadsX;\n return config ?? null;\n }\n\n constructor(private config: StakerConfig) {\n const adapter = config.provider as BaseSignerWalletAdapter | undefined;\n\n if (!config.network.rpcUrls.length) {\n throw new Error('No RPC URLs provided');\n }\n\n // -------------------------------------------------------------\n // Resolve Solana wallet pubkey (or dummy in read-only mode)\n // -------------------------------------------------------------\n let solWalletPubkey: SolPubKey;\n if (adapter?.publicKey) {\n solWalletPubkey = adapter.publicKey;\n } else {\n // Zeroed pubkey when no wallet (read-only usage)\n solWalletPubkey = new SolPubKey(new Uint8Array(32));\n }\n\n // -------------------------------------------------------------\n // Resolve Wire pubKey\n // -------------------------------------------------------------\n if (config.pubKey) {\n const wirePub = config.pubKey;\n\n if (adapter?.publicKey) {\n const derived = new PublicKey(\n KeyType.ED,\n adapter.publicKey.toBytes(),\n );\n if (!derived.equals(wirePub)) {\n throw new Error(\n \"Passed-in pubKey doesn't match adapter.publicKey\",\n );\n }\n }\n\n this.pubKey = wirePub;\n } else if (adapter?.publicKey) {\n // Derive Wire pubKey from adapter when not explicitly passed\n this.pubKey = new PublicKey(\n KeyType.ED,\n adapter.publicKey.toBytes(),\n );\n }\n\n // -------------------------------------------------------------\n // Connection + AnchorProvider\n // -------------------------------------------------------------\n const opts: ConnectionConfig = { commitment };\n if (\n config.network.rpcUrls.length > 1 &&\n config.network.rpcUrls[1].startsWith('ws')\n ) {\n opts.wsEndpoint = config.network.rpcUrls[1];\n }\n\n const anchorWallet = adapter\n ? {\n publicKey: solWalletPubkey,\n async signTransaction<T extends SolanaTransaction>(\n tx: T,\n ): Promise<T> {\n return adapter.signTransaction(tx);\n },\n async signAllTransactions<T extends SolanaTransaction>(\n txs: T[],\n ): Promise<T[]> {\n if (adapter.signAllTransactions) {\n return adapter.signAllTransactions(txs);\n }\n return Promise.all(\n txs.map((tx) => adapter.signTransaction(tx)),\n );\n },\n }\n : {\n publicKey: solWalletPubkey,\n async signTransaction<T extends SolanaTransaction>(\n _tx: T,\n ): Promise<T> {\n throw new Error(\n 'Wallet not connected: signTransaction not available',\n );\n },\n async signAllTransactions<T extends SolanaTransaction>(\n _txs: T[],\n ): Promise<T[]> {\n throw new Error(\n 'Wallet not connected: signAllTransactions not available',\n );\n },\n };\n\n this.connection = new Connection(config.network.rpcUrls[0], opts);\n this.anchor = new AnchorProvider(this.connection, anchorWallet, {\n commitment,\n });\n\n this.program = new SolanaProgramService(this.anchor, config.network.chainId as SolChainID);\n\n this.depositClient = new DepositClient(this.anchor, this.program);\n this.distributionClient = new DistributionClient(this.anchor, this.program);\n this.leaderboardClient = new LeaderboardClient(this.anchor, this.program);\n this.outpostClient = new OutpostClient(this.anchor, this.program);\n this.tokenClient = new TokenClient(this.anchor, this.program);\n }\n\n // ---------------------------------------------------------------------\n // IStakingClient core methods\n // ---------------------------------------------------------------------\n\n /**\n * Deposit native SOL into liqSOL (liqsol_core::deposit).\n * Handles tx build, sign, send, and confirmation.\n */\n async deposit(amountLamports: bigint): Promise<string> {\n this.ensureUser();\n if (amountLamports <= BigInt(0))\n throw new Error('Deposit amount must be greater than zero.');\n\n try {\n const ix = await this.depositClient.buildDepositTx(amountLamports, this.squadsVaultPDA)\n return !!this.squadsX\n ? await this.sendSquadsIxs(ix)\n : await this.buildAndSendIx(ix)\n\n } catch (err) {\n console.log(`Failed to deposit Solana: ${err}`);\n throw err;\n }\n }\n\n /**\n * Request a withdraw from liqSOL to SOL (liqsol_core::requestWithdraw).\n *\n * This:\n * - burns liqSOL from the user ATA\n * - mints an NFT withdrawal receipt\n * - increases totalEncumberedFunds in global state\n *\n * Actual SOL payout happens later via the operator-side flow.\n */\n async withdraw(amountLamports: bigint): Promise<string> {\n this.ensureUser();\n if (amountLamports <= BigInt(0))\n throw new Error('Withdraw amount must be greater than zero.');\n\n try {\n const ix = await this.depositClient.buildWithdrawTx(amountLamports, this.squadsVaultPDA)\n return !!this.squadsX\n ? await this.sendSquadsIxs(ix)\n : await this.buildAndSendIx(ix)\n\n } catch (err) {\n console.log(`Failed to withdraw Solana: ${err}`);\n throw err;\n }\n }\n\n /**\n * Stake liqSOL into Outpost (liqSOL → pool) via liqsol_core::synd.\n */\n async stake(amountLamports: bigint): Promise<string> {\n this.ensureUser();\n if (!amountLamports || amountLamports <= BigInt(0))\n throw new Error('Stake amount must be greater than zero.');\n\n try {\n const ix = await this.outpostClient.buildStakeIx(amountLamports, this.squadsVaultPDA)\n return !!this.squadsX\n ? await this.sendSquadsIxs(ix)\n : await this.buildAndSendIx(ix)\n\n } catch (err) {\n console.log(`Failed to stake Solana: ${err}`);\n throw err;\n }\n }\n\n /**\n * Unstake liqSOL from Outpost (pool → liqSOL) via liqsol_core::desynd.\n */\n async unstake(amountLamports: bigint): Promise<string> {\n this.ensureUser();\n if (!amountLamports || amountLamports <= BigInt(0))\n throw new Error('Unstake amount must be greater than zero.');\n\n try {\n const ix = await this.outpostClient.buildUnstakeIx(amountLamports, this.squadsVaultPDA)\n return !!this.squadsX\n ? await this.sendSquadsIxs(ix)\n : await this.buildAndSendIx(ix)\n }\n catch (err) {\n console.log(`Failed to unstake Solana: ${err}`);\n throw err;\n }\n }\n\n /**\n * Buy prelaunch WIRE “pretokens” using liqSOL.\n *\n * This delegates to TokenClient, which uses the `purchase`-style\n * instruction under the new IDL (no more native-SOL purchase).\n */\n async buy(amountLamports: bigint): Promise<string> {\n this.ensureUser();\n if (!amountLamports || amountLamports <= BigInt(0))\n throw new Error('liqSOL pretoken purchase requires a positive amount.');\n\n try {\n const ix = await this.tokenClient.buildPurchaseIx(amountLamports, this.squadsVaultPDA)\n return !!this.squadsX\n ? await this.sendSquadsIxs(ix)\n : await this.buildAndSendIx(ix)\n }\n catch (err) {\n console.log(`Failed to buy liqSOL pretokens: ${err}`);\n throw err;\n }\n }\n\n /**\n * Aggregate view of the user’s balances on Solana:\n * - native: SOL wallet balance\n * - liq: liqSOL token balance (Token-2022 ATA)\n * - staked: liqSOL staked in Outpost (synd/desynd) → outpostAccount.stakedLiqsol\n * - wire: total WIRE pretokens purchased (1e8 scale)\n * - yield: on-chain index/shares plus an estimated accrued liqSOL yield\n * - extras: useful internal addresses and raw state for debugging/UX\n */\n async getPortfolio(): Promise<Portfolio> {\n // if (!this.pubKey) throw new Error('User pubKey is undefined');\n try {\n const user = !!this.squadsX ? this.squadsVaultPDA! : this.solPubKey;\n\n const reservePoolPDA = this.program.deriveReservePoolPda();\n const vaultPDA = this.program.deriveVaultPda();\n const liqsolMint = this.program.deriveLiqsolMintPda();\n\n const userLiqsolAta = getAssociatedTokenAddressSync(\n liqsolMint,\n user,\n true,\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n // NOTE:\n // - nativeLamports: wallet SOL\n // - actualBalResp: liqSOL balance in user ATA\n // - snapshot: Outpost + pretokens + global index/shares\n const [nativeLamports, actualBalResp, snapshot] = await Promise.all([\n this.connection.getBalance(user, 'confirmed'),\n this.connection\n .getTokenAccountBalance(userLiqsolAta, 'confirmed')\n .catch(() => null),\n this.outpostClient.fetchWireState(user).catch(() => null),\n ]);\n\n const LIQSOL_DECIMALS = 9;\n\n const actualAmountStr = actualBalResp?.value?.amount ?? '0';\n\n const globalState = snapshot?.globalState ?? null;\n const outpostAccount = snapshot?.outpostAccount ?? null;\n const trancheState = snapshot?.trancheState ?? null;\n const userPretokenRecord = snapshot?.userPretokenRecord ?? null;\n\n // -----------------------------\n // Staked liqSOL (Outpost)\n // -----------------------------\n // This is the liqSOL that has been syndicated into Outpost via `synd`.\n // It lives on the outpost account as `stakedLiqsol`.\n const stakedLiqsolStr =\n outpostAccount?.stakedLiqsol?.toString?.() ?? '0';\n\n // -----------------------------\n // WIRE pretokens (1e8 scale)\n // -----------------------------\n // This is NOT stake — it’s the prelaunch WIRE position.\n const wirePretokensStr =\n userPretokenRecord?.totalPretokensPurchased?.toString?.() ??\n '0';\n\n // -----------------------------\n // Yield view (index + shares)\n // -----------------------------\n // We expose:\n // - currentIndex: globalState.currentIndex (1e12 scale)\n // - totalShares: globalState.totalShares\n // - userShares: outpostAccount.stakedShares\n // - estimatedClaimLiqsol: floor(userShares * index / INDEX_SCALE)\n // - estimatedYield: max(0, estimatedClaim - stakedLiqsol)\n //\n // This matches the capital-staking math:\n // sharesToTokens(shares, index) = shares * index / INDEX_SCALE\n const currentIndexStr =\n globalState?.currentIndex?.toString?.() ?? '0';\n const totalSharesStr =\n globalState?.totalShares?.toString?.() ?? '0';\n const userSharesStr =\n outpostAccount?.stakedShares?.toString?.() ?? '0';\n\n const stakedLiqsol = BigInt(stakedLiqsolStr);\n const currentIndex = BigInt(currentIndexStr);\n const totalShares = BigInt(totalSharesStr);\n const userShares = BigInt(userSharesStr);\n\n let estimatedClaim = BigInt(0);\n let estimatedYield = BigInt(0);\n\n if (userShares > BigInt(0) && currentIndex > BigInt(0)) {\n // sharesToTokens(userShares, currentIndex)\n estimatedClaim = (userShares * currentIndex) / INDEX_SCALE;\n\n if (estimatedClaim > stakedLiqsol) {\n estimatedYield = estimatedClaim - stakedLiqsol;\n }\n }\n\n return {\n native: {\n amount: BigInt(nativeLamports),\n symbol: 'SOL',\n decimals: 9,\n },\n liq: {\n amount: BigInt(actualAmountStr),\n symbol: 'LiqSOL',\n decimals: LIQSOL_DECIMALS,\n ata: userLiqsolAta,\n },\n staked: {\n // liqSOL staked in Outpost via `synd`\n amount: stakedLiqsol,\n symbol: 'LiqSOL',\n decimals: LIQSOL_DECIMALS,\n },\n wire: {\n // Prelaunch WIRE pretokens (1e8 scale)\n amount: BigInt(wirePretokensStr),\n symbol: '$WIRE',\n decimals: 8,\n },\n yield: {\n // Raw primitives so the frontend can display curves, charts, etc.\n currentIndex,\n indexScale: INDEX_SCALE,\n totalShares,\n userShares,\n // liqSOL amounts (lamports) implied by index/shares\n estimatedClaim,\n estimatedYield,\n },\n extras: {\n userLiqsolAta: userLiqsolAta.toBase58(),\n reservePoolPDA: reservePoolPDA.toBase58(),\n vaultPDA: vaultPDA.toBase58(),\n globalIndex: globalState?.currentIndex?.toString(),\n totalShares: globalState?.totalShares?.toString(),\n currentTrancheNumber:\n trancheState?.currentTrancheNumber?.toString(),\n currentTranchePriceUsd:\n trancheState?.currentTranchePriceUsd?.toString(), // 1e8 USD\n },\n chainID: this.network.chainId,\n };\n }\n catch (err) {\n console.log(`Failed to get Solana portfolio: ${err}`);\n throw err;\n }\n }\n\n /**\n * Convenience helper to fetch the distribution userRecord for the current user.\n * Used by balance-correction flows and debugging.\n */\n async getUserRecord() {\n if (!this.pubKey) throw new Error('User pubKey is undefined');\n return this.distributionClient.getUserRecord(this.solPubKey);\n }\n\n // ---------------------------------------------------------------------\n // SquadsX Helpers\n // ---------------------------------------------------------------------\n\n get squadsMultisigPDA(): SolPubKey | undefined {\n if (!this.squadsX) return undefined;\n return new SolPubKey(this.squadsX.multisigPDA);\n }\n\n get squadsVaultPDA(): SolPubKey | undefined {\n if (!this.squadsX || !this.squadsMultisigPDA) return undefined;\n const multisigPda = this.squadsMultisigPDA;\n const index = this.squadsX.vaultIndex ?? 0;\n const pda = multisig.getVaultPda({ multisigPda, index });\n return pda[0];\n }\n\n private async sendSquadsIxs(ix: TransactionInstruction): Promise<string> {\n if (!this.squadsX) throw new Error('Attempting to wrap Squads instruction without SquadsX config');\n\n const multisigPda = this.squadsMultisigPDA!;\n const vaultPda = this.squadsVaultPDA!;\n const vaultIndex = this.squadsX?.vaultIndex ?? 0;\n const creator = this.solPubKey;\n\n const ms = await multisig.accounts.Multisig.fromAccountAddress(this.connection, multisigPda);\n const current = BigInt(ms.transactionIndex?.toString() ?? 0);\n const transactionIndex = current + BigInt(1);\n\n const altAddress = this.program.PROGRAM_IDS.ALT_LOOKUP_TABLE;\n const altAccount = await this.connection.getAddressLookupTable(altAddress);\n if (!altAccount.value) throw new Error(\"ALT not found on-chain or not yet active.\");\n\n const lookupTable: AddressLookupTableAccount = altAccount.value;\n const computeLimitIx = ComputeBudgetProgram.setComputeUnitLimit({ units: 400_000 });\n const computePriceIx = ComputeBudgetProgram.setComputeUnitPrice({ microLamports: 2000 });\n\n const { blockhash } = await this.connection.getLatestBlockhash(\"confirmed\");\n const transactionMessage = new TransactionMessage({\n payerKey: vaultPda,\n recentBlockhash: blockhash,\n instructions: [computeLimitIx, computePriceIx, ix],\n });\n\n const createVaultTxIx = await multisig.instructions.vaultTransactionCreate({\n multisigPda,\n transactionIndex,\n creator,\n vaultIndex,\n transactionMessage,\n ephemeralSigners: 0,\n addressLookupTableAccounts: [lookupTable],\n });\n\n const vaultTransactionCreate = await this.buildAndSendIx(createVaultTxIx)\n console.log('SQUADSX: vaultTransactionCreate', vaultTransactionCreate);\n\n const createProposalIx = await multisig.instructions.proposalCreate({\n multisigPda,\n transactionIndex,\n creator,\n });\n\n const proposalCreate = await this.buildAndSendIx(createProposalIx)\n console.log('SQUADSX: proposalCreate', proposalCreate);\n\n return proposalCreate;\n }\n\n // async finish(multisigPda: string, transactionIndex: number): Promise<void> {\n // const vaultExecute = await multisig.instructions.vaultTransactionExecute({\n // connection: this.connection,\n // multisigPda: new SolPubKey(multisigPda),\n // transactionIndex: BigInt(transactionIndex),\n // member: this.solPubKey\n // });\n\n // const cuIx = ComputeBudgetProgram.setComputeUnitLimit({ units: 400_000 });\n // const tx1 = new Transaction().add(cuIx, vaultExecute.instruction);\n // const prepared1 = await this.prepareTx(tx1);\n // const signed1 = await this.signTransaction(prepared1.tx);\n // const sent1 = await this.sendAndConfirmHttp(signed1, prepared1);\n // console.log('SENT FINISH', sent1);\n // }\n\n // ---------------------------------------------------------------------\n // Tx helpers\n // ---------------------------------------------------------------------\n\n async buildAndSendIx(ix: TransactionInstruction | TransactionInstruction[]): Promise<string> {\n const cuIx = ComputeBudgetProgram.setComputeUnitLimit({ units: 400_000 });\n const ixs = Array.isArray(ix) ? ix : [ix];\n const tx = new Transaction().add(cuIx, ...ixs);\n const prepared = await this.prepareTx(tx);\n const signed = await this.signTransaction(prepared.tx);\n\n return this.sendAndConfirmHttp(signed, prepared);\n }\n\n\n /**\n * Send a signed transaction over HTTP RPC.\n *\n * - Returns immediately on successful sendRawTransaction.\n * - If sendRawTransaction throws a SendTransactionError with\n * \"already been processed\", we treat it as success and\n * just return a derived signature.\n * - No confirmTransaction / polling / blockheight handling.\n */\n private async sendAndConfirmHttp(\n signed: SolanaTransaction,\n _ctx: { blockhash: string; lastValidBlockHeight: number },\n ): Promise<string> {\n this.ensureUser();\n\n const rawTx = signed.serialize();\n\n try {\n // Normal happy path: RPC accepts the tx and returns a signature\n const signature = await this.connection.sendRawTransaction(rawTx, {\n skipPreflight: false,\n preflightCommitment: commitment,\n maxRetries: 3,\n });\n return signature;\n } catch (e: any) {\n const msg = e?.message ?? '';\n const isSendTxError =\n e instanceof SendTransactionError || e?.name === 'SendTransactionError';\n\n // Benign duplicate case: tx is already in the ledger / cache\n if (isSendTxError && msg.includes('already been processed')) {\n console.warn(\n 'sendRawTransaction reports \"already been processed\"; ' +\n 'treating as success without further confirmation.',\n );\n\n // Try to derive a signature from the signed Transaction.\n // If SolanaTransaction is a legacy Transaction, this works.\n const legacy = signed as unknown as Transaction;\n const first = legacy.signatures?.[0]?.signature;\n\n if (first) {\n return bs58.encode(first);\n }\n\n // Fallback: return a dummy string\n return 'already-processed';\n }\n\n // Any other send error is a real failure\n throw e;\n }\n }\n\n /**\n * Sign a single Solana transaction using the connected wallet adapter.\n */\n async signTransaction(\n tx: SolanaTransaction,\n ): Promise<SolanaTransaction> {\n this.ensureUser();\n return this.anchor.wallet.signTransaction(tx);\n }\n\n /**\n * Generic \"fire and forget\" send helper if the caller already\n * prepared and signed the transaction.\n */\n async sendTransaction(\n signed: SolanaTransaction,\n ): Promise<TransactionSignature> {\n this.ensureUser();\n return this.anchor.sendAndConfirm(signed);\n }\n\n /**\n * Attach recent blockhash + fee payer to a transaction.\n * Required before signing and sending.\n */\n async prepareTx(\n tx: Transaction,\n ): Promise<{\n tx: Transaction;\n blockhash: string;\n lastValidBlockHeight: number;\n }> {\n const { blockhash, lastValidBlockHeight } =\n await this.connection.getLatestBlockhash('confirmed');\n tx.recentBlockhash = blockhash;\n tx.feePayer = this.feePayer;\n return { tx, blockhash, lastValidBlockHeight };\n }\n\n /**\n * Guard for all write operations (deposit/withdraw/stake/unstake/buy).\n * Ensures we have a Wire pubKey and an Anchor wallet pubKey, and that they match.\n */\n ensureUser() {\n if (!this.pubKey) throw new Error('User pubKey is undefined');\n\n const wallet = this.anchor?.wallet as any;\n const pk = wallet?.publicKey as SolPubKey | undefined;\n\n if (!pk) throw new Error('Wallet not connected');\n if (typeof wallet.signTransaction !== 'function') {\n throw new Error('Wallet does not support signTransaction');\n }\n\n // if (!this.pubKey || !this.anchor.wallet.publicKey) {\n // throw new Error('User Authorization required: pubKey is undefined');\n // }\n // if (\n // this.solPubKey.toBase58() !==\n // this.anchor.wallet.publicKey.toBase58()\n // ) {\n // throw new Error(\n // 'Write access requires connected wallet to match pubKey',\n // );\n // }\n }\n\n // ---------------------------------------------------------------------\n // READ-ONLY Public Methods\n // ---------------------------------------------------------------------\n\n /**\n * Unified, chain-agnostic tranche snapshot for Solana.\n *\n * Uses:\n * - liqsol_core.globalState (currentIndex, totalShares, etc.)\n * - liqsol_core.trancheState (price, supply, total sold, etc.)\n * - PriceHistory/Chainlink SOL/USD via TokenClient.getSolPriceUsdSafe()\n *\n * This is READ-ONLY and works even with no connected wallet.\n */\n async getTrancheSnapshot(chainID: ChainID): Promise<TrancheSnapshot> {\n try {\n const [globalState, trancheState] = await Promise.all([\n this.tokenClient.fetchGlobalState(),\n this.tokenClient.fetchTrancheState(),\n ]);\n\n const { price: solPriceUsd, timestamp } =\n await this.tokenClient.getSolPriceUsdSafe();\n\n return buildSolanaTrancheSnapshot({\n chainID,\n globalState,\n trancheState,\n solPriceUsd,\n nativePriceTimestamp: timestamp,\n });\n }\n catch (err) {\n console.log(`Failed to build Solana tranche snapshot: ${err}`);\n throw err;\n }\n }\n\n /**\n * Returns the system APY (percent) for Solana,\n * using compound interest per epoch and a\n * cluster-derived epochs-per-year.\n */\n async getSystemAPY(): Promise<number> {\n try {\n // 1) Per-epoch rate (decimal) from on-chain stakeMetrics\n const ratePerEpoch = await this.getEpochRateDecimalFromProgram();\n // 2) Live epochs-per-year estimate from cluster\n const epochsPerYear = await this.getEpochsPerYearFromCluster();\n // 3) Compound: (1 + r)^N - 1\n const apyDecimal = Math.pow(1 + ratePerEpoch, epochsPerYear) - 1;\n // 4) Convert to percent\n const apyPercent = apyDecimal * 100;\n\n return apyPercent;\n } catch (err) {\n console.log(`Failed to compute Solana system APY: ${err}`);\n throw err;\n }\n }\n\n /**\n * Reads the liqsol_core stakeMetrics account and returns the\n * Solana per-epoch system rate as a **decimal** (not BPS),\n * de-scaled using PAY_RATE_SCALE_FACTOR (1e12).\n */\n private async getEpochRateDecimalFromProgram(): Promise<number> {\n const liqSolCoreProgram = this.program.getProgram('liqsolCore');\n const payRateHistoryPda = this.program.derivePayRateHistoryPda();\n\n const payRateHistory =\n await liqSolCoreProgram.account.payRateHistory.fetch(payRateHistoryPda);\n\n const totalEntriesAdded = Number(payRateHistory.totalEntriesAdded);\n const maxEntries = Number(payRateHistory.maxEntries);\n\n if (totalEntriesAdded === 0) {\n // No real entries yet, fall back to default\n return Number(DEFAULT_AVERAGE_PAY_RATE) / Number(PAY_RATE_SCALE_FACTOR);\n }\n\n const currentIndex = Number(payRateHistory.currentIndex);\n\n // Only average entries that have actually been processed (written by add_entry),\n // not the default-initialized slots. After 10+ entries, processedCount === maxEntries.\n const processedCount = Math.min(totalEntriesAdded, maxEntries);\n\n let sum = BigInt(0);\n let validCount = 0;\n // Walk backward from most recent entry\n let idx = (currentIndex - 1 + maxEntries) % maxEntries;\n\n for (let i = 0; i < processedCount; i++) {\n const entry = payRateHistory.entries[idx];\n const scaledRate = BigInt(entry.scaledRate.toString());\n if (scaledRate > BigInt(0)) {\n sum += scaledRate;\n validCount++;\n }\n idx = (idx - 1 + maxEntries) % maxEntries;\n }\n\n if (validCount === 0) {\n return Number(DEFAULT_AVERAGE_PAY_RATE) / Number(PAY_RATE_SCALE_FACTOR);\n }\n\n // Average the processed entries\n const average = Number(sum / BigInt(validCount));\n return average / Number(PAY_RATE_SCALE_FACTOR);\n }\n\n // Simple cache so we don’t hammer RPC\n private epochsPerYearCache?: { value: number; fetchedAt: number };\n private static readonly EPOCHS_PER_YEAR_TTL_MS = 10 * 60 * 1000; // 10 minutes\n\n /**\n * Derive \"epochs per year\" from the live Solana cluster.\n *\n * Uses:\n * - getRecentPerformanceSamples() to estimate slots/second\n * - getEpochInfo() to read slotsInEpoch\n */\n private async getEpochsPerYearFromCluster(): Promise<number> {\n const now = Date.now();\n\n if (\n this.epochsPerYearCache &&\n now - this.epochsPerYearCache.fetchedAt <\n SolanaStakingClient.EPOCHS_PER_YEAR_TTL_MS\n ) {\n return this.epochsPerYearCache.value;\n }\n\n const connection = this.anchor.connection;\n\n // 1) Estimate slots/second from recent performance samples\n const samples: PerfSample[] = await connection.getRecentPerformanceSamples(\n 60,\n );\n if (!samples.length) {\n throw new Error('No performance samples available from cluster');\n }\n\n const totalSlots = samples.reduce((acc, s) => acc + s.numSlots, 0);\n const totalSecs = samples.reduce((acc, s) => acc + s.samplePeriodSecs, 0);\n\n if (totalSecs === 0) {\n throw new Error(\n 'Cluster returned zero samplePeriodSecs in performance samples',\n );\n }\n\n const slotsPerSecond = totalSlots / totalSecs;\n\n // 2) Slots per epoch from cluster\n const epochInfo = await connection.getEpochInfo(); // finalized commitment by default\n const slotsPerEpoch = epochInfo.slotsInEpoch;\n\n const secondsPerEpoch = slotsPerEpoch / slotsPerSecond;\n const secondsPerYear = 365 * 24 * 60 * 60;\n\n const epochsPerYear = secondsPerYear / secondsPerEpoch;\n\n this.epochsPerYearCache = {\n value: epochsPerYear,\n fetchedAt: now,\n };\n\n return epochsPerYear;\n }\n\n // ---------------------------------------------\n // Deposit fee calculation (SOL -> liqSOL)\n // ---------------------------------------------\n\n /**\n * Estimate the protocol deposit fee in lamports for a given SOL amount,\n * based on recent pay rates and globalConfig.depositFeeMultiplier.\n *\n * - amountLamports: deposit notional in lamports\n * - windowSize: how many recent payRate entries to average (default 5)\n *\n * Returns 0n if payRateHistory or globalConfig is missing, or if\n * there are no valid pay-rate entries yet.\n */\n async getDepositFee(\n amountLamports: bigint,\n windowSize = 5,\n ): Promise<bigint> {\n if (amountLamports <= BigInt(0)) {\n return BigInt(0);\n }\n\n const [avgPayRate, globalConfig]: [BN, GlobalConfig | null] = await Promise.all([\n this.distributionClient.getAverageScaledPayRate(windowSize),\n this.distributionClient.getGlobalConfig(),\n ]);\n\n if (!globalConfig || avgPayRate.isZero()) {\n return BigInt(0);\n }\n\n // depositFeeMultiplier may be BN or number depending on your type\n const rawMultiplier = globalConfig.depositFeeMultiplier;\n const multiplier = new BN(\n rawMultiplier?.toString?.() ?? rawMultiplier ?? 0,\n );\n if (multiplier.isZero()) {\n return BigInt(0);\n }\n\n const amountBn = new BN(amountLamports.toString());\n\n // 10^12 scale (matches scaledRate / index scale)\n\n const feeBn = ceilDiv(\n avgPayRate.mul(multiplier).mul(amountBn),\n SCALE,\n );\n\n return BigInt(feeBn.toString());\n }\n\n /**\n * Compute a conservative \"deposit buffer\" in lamports that should be left\n * in the wallet so that a MAX deposit (balance - buffer) will succeed.\n *\n * It accounts for:\n * - Runtime tx fees (via cached dummy self-transfer fee)\n * - Protocol deposit fee (via getDepositFee(amount))\n *\n * Intended UI usage:\n * const buffer = await client.getDepositBuffer();\n * const balance = portfolio.native.amount;\n * const maxDeposit = balance > buffer ? balance - buffer : BigInt(0);\n */\n async getDepositBuffer(options?: {\n txCount?: number; // how many txs to cover in gas buffer (default 2)\n safetyMultiplier?: number; // safety multiplier on per-tx fee (default 3x)\n minBufferLamports?: bigint; // minimum gas buffer (default ~0.01 SOL)\n balanceOverrideLamports?: bigint; // for tests/custom callers\n }): Promise<bigint> {\n this.ensureUser();\n\n // -------------------------------------------------------------\n // 1) Current wallet balance (prefer caller override)\n // -------------------------------------------------------------\n const balanceLamports: bigint =\n options?.balanceOverrideLamports ??\n BigInt(await this.connection.getBalance(this.feePayer, commitment));\n\n if (balanceLamports <= BigInt(0)) {\n return BigInt(0);\n }\n\n // -------------------------------------------------------------\n // 2) Estimate gas buffer (using cached single-tx fee)\n // -------------------------------------------------------------\n let gasBuffer = BigInt(0);\n\n try {\n const singleTxFeeLamports = await this.getSingleTxFeeLamports();\n\n const txCount = BigInt(options?.txCount ?? 2);\n const safetyMultiplier = options?.safetyMultiplier ?? 3;\n const safetyScaled = BigInt(Math.round(safetyMultiplier * 100)); // e.g. 300\n\n let buf =\n (singleTxFeeLamports * txCount * safetyScaled) /\n BigInt(100);\n\n const defaultMinBufferLamports = BigInt(10_000_000); // ~0.01 SOL\n const minBufferLamports =\n options?.minBufferLamports ?? defaultMinBufferLamports;\n\n if (buf < minBufferLamports) {\n buf = minBufferLamports;\n }\n\n gasBuffer = buf;\n } catch {\n // If fee estimation fails, just fall back to \"no gas buffer\".\n gasBuffer = BigInt(0);\n }\n\n // If gas buffer alone eats the whole balance, we just keep everything.\n if (balanceLamports <= gasBuffer) {\n return balanceLamports;\n }\n\n const spendable = balanceLamports - gasBuffer;\n\n // -------------------------------------------------------------\n // 3) If we can't compute deposit fee, buffer == gasBuffer\n // -------------------------------------------------------------\n if (typeof this.getDepositFee !== 'function') {\n return gasBuffer;\n }\n\n // -------------------------------------------------------------\n // 4) Approximate principal using linear fee model from ONE RPC call\n //\n // fee(a) ≈ k * a\n // want: a + k*a <= spendable → a <= spendable / (1 + k)\n //\n // We estimate k from fee(spendable) / spendable.\n // -------------------------------------------------------------\n let feeAtSpendable: bigint;\n\n try {\n feeAtSpendable = await this.getDepositFee(spendable);\n } catch {\n // If protocol fee lookup fails, fall back to gas-only buffer\n return gasBuffer;\n }\n\n // If there is effectively no protocol fee, keep only gas buffer.\n if (feeAtSpendable <= BigInt(0)) {\n return gasBuffer;\n }\n\n const s = spendable;\n const f = feeAtSpendable;\n\n // denom = s + f = s * (1 + k) (since f ≈ k*s)\n const denom = s + f;\n if (denom === BigInt(0)) {\n return gasBuffer;\n }\n\n // a ≈ floor( s^2 / (s + f) )\n let a = (s * s) / denom;\n\n // Tiny safety haircut to avoid edge off-by-one lamports\n const fudge = BigInt(10_000); // ≈ 0.00001 SOL\n let effectivePrincipal =\n a > fudge ? a - fudge : a;\n\n if (effectivePrincipal < BigInt(0)) {\n effectivePrincipal = BigInt(0);\n }\n\n const buffer = balanceLamports > effectivePrincipal\n ? balanceLamports - effectivePrincipal\n : balanceLamports;\n\n // Ensure we never under-reserve gas.\n return buffer < gasBuffer ? gasBuffer : buffer;\n }\n\n private cachedTxFee?: { value: bigint; fetchedAt: number };\n private static readonly FEE_CACHE_TTL_MS = 60_000; // 60s\n\n private async getSingleTxFeeLamports(): Promise<bigint> {\n const now = Date.now();\n\n if (this.cachedTxFee && now - this.cachedTxFee.fetchedAt < SolanaStakingClient.FEE_CACHE_TTL_MS) {\n return this.cachedTxFee.value;\n }\n\n const payer = this.feePayer;\n\n const dummyIx = SystemProgram.transfer({\n fromPubkey: payer,\n toPubkey: payer,\n lamports: 0,\n });\n\n const tx = new Transaction().add(dummyIx);\n const { blockhash } = await this.connection.getLatestBlockhash(commitment);\n tx.recentBlockhash = blockhash;\n tx.feePayer = payer;\n\n const message = tx.compileMessage();\n const feeInfo = await this.connection.getFeeForMessage(message, commitment);\n\n const singleTxFeeLamports = BigInt(feeInfo.value ?? 5000);\n\n this.cachedTxFee = {\n value: singleTxFeeLamports,\n fetchedAt: now,\n };\n\n return singleTxFeeLamports;\n }\n\n\n}","/**\n * @module EthereumContractService\n *\n * Provides a unified service for interacting with Ethereum smart contracts using ethers.js.\n */\n\n// LiqETH Artifacts (for now, used by both mainnet and hoodi)\nimport AccountingArtifact from '../../assets/ethereum/mainnet/liqEth/accounting.sol/Accounting.json';\nimport DepositManagerArtifact from '../../assets/ethereum/mainnet/liqEth/DepositManager.sol/DepositManager.json';\nimport LiqEthArtifact from '../../assets/ethereum/mainnet/liqEth/liqEth.sol/LiqEthToken.json';\nimport StakingModuleArtifact from '../../assets/ethereum/mainnet/liqEth/stakingModule.sol/StakingModule.json';\nimport WithdrawalQueueArtifact from '../../assets/ethereum/mainnet/liqEth/withdrawalQueue.sol/WithdrawalQueue.json';\nimport WithdrawalVaultArtifact from '../../assets/ethereum/mainnet/liqEth/withdrawalVault.sol/WithdrawalVault.json';\nimport BeaconStateArtifact from '../../assets/ethereum/mainnet/liqEth/BeaconState.sol/BeaconState.json';\nimport YieldOracleArtifact from '../../assets/ethereum/mainnet/liqEth/Yield.sol/YieldOracle.json';\n\n// Outpost Artifacts (for now, used by both mainnet and hoodi)\nimport DepositorArtifact from '../../assets/ethereum/mainnet/outpost/Depositor.sol/Depositor.json';\nimport ReceiptNFTArtifact from '../../assets/ethereum/mainnet/outpost/ReceiptNFT.sol/ReceiptNFT.json';\nimport OutpostManagerArtifact from '../../assets/ethereum/mainnet/outpost/OutpostManager.sol/OutpostManager.json';\nimport BARArtifact from '../../assets/ethereum/mainnet/outpost/BAR.sol/BAR.json';\nimport OPPArtifact from '../../assets/ethereum/mainnet/outpost/OPP.sol/OPP.json';\nimport OPPCommonArtifact from '../../assets/ethereum/mainnet/outpost/OPPCommon.sol/OPPCommon.json';\nimport OPPInboundArtifact from '../../assets/ethereum/mainnet/outpost/OPPInbound.sol/OPPInbound.json';\nimport PretokenArtifact from '../../assets/ethereum/mainnet/outpost/Pretoken.sol/Pretoken.json';\nimport AggregatorArtifact from '../../assets/ethereum/mainnet/outpost/Aggregator.sol/Aggregator.json';\nimport EthUsdPriceConsumerArtifact from '../../assets/ethereum/mainnet/outpost/EthUsdPriceConsumer.sol/EthUsdPriceConsumer.json';\nimport PoolArtifact from '../../assets/ethereum/mainnet/outpost/Pool.sol/Pool.json';\nimport OutpostManagerAuthorityArtifact from '../../assets/ethereum/mainnet/outpost/OutpostManagerAuthority.sol/OutpostManagerAuthority.json';\n\n// Common Artifacts (for now, used by both mainnet and hoodi)\nimport IodataArtifact from '../../assets/ethereum/mainnet/common/iodata.sol/iodata.json';\nimport Base58Artifact from '../../assets/ethereum/mainnet/common/Base58.sol/Base58.json';\nimport sysio_merkleArtifact from '../../assets/ethereum/mainnet/common/sysio_merkle.sol/sysio_merkle.json';\nimport sysio_writeArtifact from '../../assets/ethereum/mainnet/common/sysio_write.sol/sysio_write.json';\n\n// ERC Token Artifacts (for now, used by both mainnet and hoodi)\nimport ERC20Artifact from '../../assets/ethereum/mainnet/token/ERC20Token.sol/ERC20Token.json';\nimport ERC721Artifact from '../../assets/ethereum/mainnet/token/ERC721Token.sol/ERC721Token.json';\nimport ERC1155Artifact from '../../assets/ethereum/mainnet/token/ERC1155Token.sol/ERC1155Token.json';\n\nimport { AddressBook, ContractName } from './types';\nimport { Contract, ethers, providers, Signer } from 'ethers';\nimport { JsonFragment } from '@ethersproject/abi';\nimport { ErrorDescription } from '@ethersproject/abi/lib/interface';\nimport { EvmChainID } from '@wireio/core';\nimport { SupportedEvmChainID } from '../../types';\n\nexport const ERC20Abi = ERC20Artifact.abi;\nexport const ERC721Abi = ERC721Artifact.abi;\nexport const ERC1155Abi = ERC1155Artifact.abi;\n\n// -----------------------------------------------------------------------------\n// Address books (per-chain)\n// -----------------------------------------------------------------------------\n\n/**\n * MAINNET LATEST\n * 1/23/26\n */\nexport const MAINNET_ADDRESSES: AddressBook = {\n // LiqETH contracts\n LiqEthAuthority: '0xB8fb7dBA2de501c94EAB723fa48679f698a39Aa4',\n BeaconState: '0x29719E8e76C52F5fD4888DF401579859c305f2DF',\n WithdrawalQueue: '0xce388339bFDAed9cAF536ea7b4F42123b4D755d4',\n LiqEthToken: '0x2C0e75e930Fc72ceD0725854C5E7A55566333F3f',\n Accounting: '0xE31C44d04c7B055afAC9301F55840f030eaF04BC',\n DepositManager: '0x21b339ED55A0f037f91B88044C808CcfCCBbF9A8',\n WithdrawalVault: '0x028743bE7E727aA331A1e952575cb00623B95fE2',\n StakingModule: '0xDe9754Fb58CcD4D74e94DA5682192E4e6eC334b0',\n // YieldOracle: '0x7B7B8894e75b44B6cA7Dc8bE6dED5059621907b2',\n\n // Outpost contracts\n OutpostManagerAuthority: '0xeaE32b94c0F858b3600861aAE4Caeee6B6341751',\n iodata: '0x485Ed153c45189d623Bb37816eD3016A56552273',\n Base58: '0x8bB3856EC1114B1cE45a78620CF174D90a1Fd4e7',\n sysio_merkle: '0x5180a926D71c6d94c5c939Fe7Fed14cD7dcAa541',\n ReceiptNFT: '0x651De616A20b17De1095f9A0694A0e0E68025b78',\n EthUsdPriceConsumer: '0x2d866f8DB6F6c94997b0027Ba24bc64a03627ddc',\n Pool: '0xDA268Adcb90c422C2102A5f713182A42A8b9EA0D',\n OutpostManager: '0x9f279804Cb8539c53709AA37a4C1b30A52A85175',\n sysio_write: '0x3F8c880efd2c8C3aA1f0CE40b886cc6913eEC1d3',\n Pretoken: '0xCabF19Fdb7cD063738dd63a418702Ee3642FFc68',\n BAR: '0x2D8f4D4435509d7b8F93C3Ba93D45447C892f7ED',\n OPPCommon: '0x1716EEC9f1E0c1aF7BbbA8Fed10652138914f766',\n OPP: '0x5e1135cF8987268a3e7F68551558Ae92c454429f',\n Depositor: '0xf4b4ccfD684feB46504D77232FBde23b23d4F774',\n OPPInbound: '0x088484d45fF93AFabC63810FB0b335792E2B24f3',\n\n // MockAggregator is not deployed on mainnet; keep as zero-address placeholder\n MockAggregator: '0x0000000000000000000000000000000000000000',\n};\n\n/**\n * HOODI TESTNET LATEST\n * 1/23/26\n */\nexport const HOODI_ADDRESSES: AddressBook = {\n // LiqETH contracts\n LiqEthAuthority: '0x3Eb66Bb91F7a022FbABc1619Cb6acce7025Bc41F',\n BeaconState: '0x08F879c6D0964E0A17bF688Af23168f654DF372e',\n WithdrawalQueue: '0x74aDeD940369baDDb0F36426F23B08499e45Fe18',\n LiqEthToken: '0x8C974517D038e2e3b8a1da7b1A026bC8132A4b2e',\n Accounting: '0x766CE996B8132b927988c5b2ECAE8108fB1a9307',\n DepositManager: '0xEd391dB5DB11B5eDBE08e69A51D16e84293C09a3',\n WithdrawalVault: '0xbaBc0D5997283ab9886696A0dEaB8A8093436b48',\n StakingModule: '0x4998fBb6Ca5Ee3Db6c339e2962A34791Af643fEa',\n // YieldOracle: '0x61Fe311C57dd9a38Fb7B0c5A8ec521452dB25378',\n\n // Outpost contracts\n OutpostManagerAuthority: '0x3B8705Ba1195AF632b3bd9E46F19348BC828FA3D',\n iodata: '0x4aCABbC74a1cA9B0058d9ADAa0E00Af0f4f73212',\n Base58: '0x1241F36ff30065deD52d51f0d6524EF971259A12',\n sysio_merkle: '0x58ca9b5515266Fd6bF94D5F1268C505b2eC9679c',\n ReceiptNFT: '0x03d6bD46cA9F54B8F8bbA21CfAfe717b36cB8593',\n EthUsdPriceConsumer: '0xdC2DD993A13b3DD6D255B52285625694bd967c9A',\n Pool: '0xd4742757AA61B1Fd3Fcd87980D7D460B12Cd9275',\n OutpostManager: '0x38ec2B56cBCeCaFFe28b535517de1a102C3D74E3',\n sysio_write: '0x0Ec4C1BaB772958aa3Db27459643bfbE7d92E305',\n Pretoken: '0x8c97a51A71640fa411DEfab8feC3401eFfd1a2E4',\n BAR: '0xbAFac13ffd3Aa9aEabaaeb6e4C2cF3dFf3479DC0',\n OPPCommon: '0x12283a6d4E6cE4A0e8AdB319Fc161c7F4f91EA8F',\n OPP: '0x87CE3Fe2CDca39C04aa2c14bbF1E1d9DB6358C4A',\n Depositor: '0x5351B30EA4b75bD9be9Fc0048e88F675f7b3Ac2b',\n OPPInbound: '0x0B1f7FB1c7f01A9cf490a1387E1E100F2bEA6C6d',\n\n // Test-only mock aggregator\n MockAggregator: '0xFCfc3ddd4CBd9Ad3b3af3A374B8bdA1b66eE6FFF',\n};\n\nexport const ADDRESS_BOOK_BY_CHAIN: Record<SupportedEvmChainID, AddressBook> = {\n [EvmChainID.Ethereum]: MAINNET_ADDRESSES,\n [EvmChainID.Hoodi]: HOODI_ADDRESSES,\n};\n\n// Old name kept as a mainnet default (optional convenience)\nexport const ADDRESSES: AddressBook = MAINNET_ADDRESSES;\n\n// -----------------------------------------------------------------------------\n// Contract config\n// -----------------------------------------------------------------------------\n\nexport type ContractConfig = {\n address: string;\n abi: JsonFragment[];\n};\n\nexport type Contracts<T extends string = ContractName> = Record<T, ContractConfig>;\n\nfunction buildContracts(addresses: AddressBook): Contracts<ContractName> {\n return {\n // LiqETH Contracts\n LiqEthAuthority: {\n address: addresses.LiqEthAuthority,\n abi: LiqEthArtifact.abi as JsonFragment[],\n },\n BeaconState: {\n address: addresses.BeaconState,\n abi: BeaconStateArtifact.abi as JsonFragment[],\n },\n WithdrawalQueue: {\n address: addresses.WithdrawalQueue,\n abi: WithdrawalQueueArtifact.abi as JsonFragment[],\n },\n LiqEthToken: {\n address: addresses.LiqEthToken,\n abi: LiqEthArtifact.abi as JsonFragment[],\n },\n Accounting: {\n address: addresses.Accounting,\n abi: AccountingArtifact.abi as JsonFragment[],\n },\n DepositManager: {\n address: addresses.DepositManager,\n abi: DepositManagerArtifact.abi as JsonFragment[],\n },\n WithdrawalVault: {\n address: addresses.WithdrawalVault,\n abi: WithdrawalVaultArtifact.abi as JsonFragment[],\n },\n StakingModule: {\n address: addresses.StakingModule,\n abi: StakingModuleArtifact.abi as JsonFragment[],\n },\n // YieldOracle: {\n // address: addresses.YieldOracle,\n // abi: YieldOracleArtifact.abi as JsonFragment[],\n // },\n\n // Outpost Contracts\n OutpostManagerAuthority: {\n address: addresses.OutpostManagerAuthority,\n abi: OutpostManagerAuthorityArtifact.abi as JsonFragment[],\n },\n iodata: {\n address: addresses.iodata,\n abi: IodataArtifact.abi as JsonFragment[],\n },\n Base58: {\n address: addresses.Base58,\n abi: Base58Artifact.abi as JsonFragment[],\n },\n sysio_merkle: {\n address: addresses.sysio_merkle,\n abi: sysio_merkleArtifact.abi as JsonFragment[],\n },\n ReceiptNFT: {\n address: addresses.ReceiptNFT,\n abi: ReceiptNFTArtifact.abi as JsonFragment[],\n },\n Pool: {\n address: addresses.Pool,\n abi: PoolArtifact.abi as JsonFragment[],\n },\n OutpostManager: {\n address: addresses.OutpostManager,\n abi: OutpostManagerArtifact.abi as JsonFragment[],\n },\n sysio_write: {\n address: addresses.sysio_write,\n abi: sysio_writeArtifact.abi as JsonFragment[],\n },\n EthUsdPriceConsumer: {\n address: addresses.EthUsdPriceConsumer,\n abi: EthUsdPriceConsumerArtifact.abi as JsonFragment[],\n },\n BAR: {\n address: addresses.BAR,\n abi: BARArtifact.abi as JsonFragment[],\n },\n OPPCommon: {\n address: addresses.OPPCommon,\n abi: OPPCommonArtifact.abi as JsonFragment[],\n },\n OPP: {\n address: addresses.OPP,\n abi: OPPArtifact.abi as JsonFragment[],\n },\n Pretoken: {\n address: addresses.Pretoken,\n abi: PretokenArtifact.abi as JsonFragment[],\n },\n OPPInbound: {\n address: addresses.OPPInbound,\n abi: OPPInboundArtifact.abi as JsonFragment[],\n },\n Depositor: {\n address: addresses.Depositor,\n abi: DepositorArtifact.abi as JsonFragment[],\n },\n\n MockAggregator: {\n address: addresses.MockAggregator,\n abi: AggregatorArtifact.abi as JsonFragment[],\n },\n };\n}\n\nexport const CONTRACTS_BY_CHAIN: Record<SupportedEvmChainID, Contracts<ContractName>> = {\n [EvmChainID.Ethereum]: buildContracts(MAINNET_ADDRESSES),\n [EvmChainID.Hoodi]: buildContracts(HOODI_ADDRESSES),\n};\n\n// -----------------------------------------------------------------------------\n// Service\n// -----------------------------------------------------------------------------\n\nexport interface ContractOptions {\n /** EVM chain id to select the correct address/contract set */\n chainId: EvmChainID;\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 private readonly chainId: EvmChainID;\n private readonly contractsConfig: Contracts<ContractName>;\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 this.chainId = opts.chainId;\n\n const contracts = CONTRACTS_BY_CHAIN[this.chainId];\n if (!contracts) {\n throw new Error(`Unsupported EVM chainId=${this.chainId}`);\n }\n this.contractsConfig = contracts;\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 this.contractsConfig[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 } = this.contractsConfig[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 } = this.contractsConfig[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 for this chain */\n public listContractNames(): ContractName[] {\n return Object.keys(this.contractsConfig) 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 // If you want, you can gradually re-enable protocol ABIs here\n // AccountingArtifact,\n // DepositManagerArtifact,\n // LiqEthArtifact,\n // StakingModuleArtifact,\n // WithdrawalQueueArtifact,\n // WithdrawalVaultArtifact,\n // YieldOracleArtifact,\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(\n ethers.utils.FormatTypes.full,\n )}`.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}","\nimport { ethers } from \"ethers\";\nimport { TrancheLadderItem, TrancheSnapshot } from \"../../types\";\nimport { ChainID } from \"@wireio/core\";\n\n\nconst BPS = BigInt(10_000);\n\nexport interface CustomContractError {\n name?: string;\n signature?: string;\n args?: any[];\n data?: any;\n method?: string;\n code?: any;\n raw: string;\n}\n\n\n\nexport function formatContractErrors(err: any): CustomContractError {\n // Extract custom error details if present\n if (err.errorName && err.errorArgs) {\n const errorObj: CustomContractError = {\n name: err.errorName,\n signature: err.errorSignature,\n args: err.errorArgs.map((arg: any) =>\n arg && arg._isBigNumber ? ethers.BigNumber.from(arg).toString() : arg\n ),\n data: err.data,\n method: err.method,\n code: err.code,\n raw: err,\n };\n console.error(\"Custom contract error:\", errorObj);\n return errorObj;\n } else {\n console.error(\"Contract Error:\", err);\n return {\n raw: typeof err === 'string' ? err : (err?.message || String(err))\n };\n }\n}\n\n\n\n/**\n * Finalize an OPP epoch. Optionally accept a gasLimit override (ethers BigNumberish).\n * If gasLimit is not provided, the method will attempt estimateGas.finalizeEpoch()\n * and pad it (1.2x). If estimateGas fails, a conservative fallback is used.\n */\nexport async function sendOPPFinalize(opp: ethers.Contract, gasLimit?: ethers.BigNumberish) {\n const overrides: any = {};\n try {\n if (gasLimit === undefined) {\n try {\n const estimated = await opp.estimateGas.finalizeEpoch();\n const padded = ethers.BigNumber.from(estimated).mul(12).div(10); // 1.2x\n overrides.gasLimit = padded;\n console.log('sendFinalize: estimated gas', estimated.toString(), 'padded to', overrides.gasLimit.toString());\n } catch (estErr) {\n // estimateGas can throw UNPREDICTABLE_GAS_LIMIT; fall back to a safe default\n console.warn('sendFinalize: estimateGas.finalizeEpoch() failed, falling back to hardcoded gasLimit', estErr);\n overrides.gasLimit = ethers.BigNumber.from(8000000);\n }\n } else {\n overrides.gasLimit = ethers.BigNumber.from(gasLimit);\n console.log('sendFinalize: using provided gasLimit override', overrides.gasLimit.toString());\n }\n\n const tx = await opp.finalizeEpoch(overrides); // submit tx with overrides\n console.log('sendFinalize tx hash:', tx.hash, 'overrides:', overrides);\n\n const receipt = await tx.wait(); // wait for mined\n console.log('sendFinalize tx mined, block:', receipt.blockNumber);\n return receipt;\n } catch (err: any) {\n // Verbose error logging to help debugging reverts / provider issues\n console.error('sendFinalize() failed:', err?.message || err);\n\n // Try to extract common raw payload locations used by ethers errors\n const raw = err?.error?.data || err?.data || err?.body || err?.receipt || err?.transaction || err;\n console.error('sendFinalize raw payload:', raw);\n\n // Try parsing with contractService if available\n try {\n const parsed = formatContractErrors(raw);\n console.error('sendFinalize parsed error:', parsed.name, parsed.args);\n } catch (parseErr) {\n // Fallback: decode Error(string) ABI encoded revert (0x08c379a0)\n try {\n const hex = (typeof raw === 'string') ? raw : (raw && raw.data) ? raw.data : null;\n if (hex && typeof hex === 'string' && hex.startsWith('0x08c379a0')) {\n const reason = ethers.utils.defaultAbiCoder.decode(['string'], '0x' + hex.slice(10))[0];\n console.error('sendFinalize revert reason:', reason);\n } else {\n console.error('sendFinalize: unable to decode revert payload (not standard Error(string))');\n }\n } catch (fallbackErr) {\n console.error('sendFinalize: fallback decode failed:', fallbackErr);\n }\n }\n\n // If there is a receipt, print it for extra context\n if (err?.receipt) console.error('sendFinalize receipt:', err.receipt);\n if (err?.transaction) console.error('sendFinalize transaction object:', err.transaction);\n\n // Re-throw so callers can handle it as well\n throw err;\n }\n}\n\n\nconst BPS_DENOM = BigInt(10_000);\n\n// On-chain USD: 1e18 (wei-style)\nconst USD_ONCHAIN_SCALE = BigInt(1_000_000_000_000_000_000); // 1e18\n// Client snapshot USD: 1e8 (to match fromScale8)\nconst USD_CLIENT_SCALE = BigInt(100_000_000); // 1e8\n// Factor to go from 1e18 → 1e8\nconst USD_SCALE_DOWN = USD_ONCHAIN_SCALE / USD_CLIENT_SCALE; // 1e10\n\n/** 2.5% growth in BPS for supply side */\nfunction growSupplyOnce(value: bigint, growthBps: number): bigint {\n const g = BigInt(growthBps);\n return (value * (BPS_DENOM + g)) / BPS_DENOM;\n}\n\nfunction shrinkSupplyOnce(value: bigint, growthBps: number): bigint {\n const g = BigInt(growthBps);\n return (value * BPS_DENOM) / (BPS_DENOM + g);\n}\n\n/** Linear USD price step in on-chain 1e18 scale */\nfunction growPriceOnceUsd1e18(value: bigint, stepUsd1e18: bigint): bigint {\n return value + stepUsd1e18;\n}\n\nfunction shrinkPriceOnceUsd1e18(value: bigint, stepUsd1e18: bigint): bigint {\n if (value <= stepUsd1e18) return BigInt(0);\n return value - stepUsd1e18;\n}\n\n/** Convert on-chain 1e18 USD to client 1e8 USD */\nfunction usd1e18To1e8(raw: bigint): bigint {\n // 1e18 / 1e8 = 1e10 factor difference\n return raw / USD_SCALE_DOWN;\n}\n\n/**\n * Build a local tranche ladder around the current tranche.\n *\n * Inside this function:\n * - `currentPriceUsd` and `priceGrowthCents` are treated as 1e18-scaled USD.\n * - Output `priceUsd` is 1e8-scaled USD (for fromScale8()).\n */\nexport function buildEthereumTrancheLadder(options: {\n currentTranche: number;\n totalTrancheSupply: bigint; // not used in local window, but kept for API parity\n initialTrancheSupply: bigint;\n currentTrancheSupply: bigint; // remaining in current tranche (1e8 scale)\n currentPriceUsd: bigint; // 1e18 scale\n priceGrowthCents: bigint; // 1e18 step, e.g. $0.02 → 2e16\n supplyGrowthBps: number; // 250 = 2.5%\n windowBefore?: number;\n windowAfter?: number;\n}): TrancheLadderItem[] {\n const {\n currentTranche,\n initialTrancheSupply,\n currentTrancheSupply,\n currentPriceUsd,\n priceGrowthCents,\n supplyGrowthBps,\n windowBefore = 5,\n windowAfter = 5,\n } = options;\n\n const startId = Math.max(0, currentTranche - windowBefore);\n const endId = currentTranche + windowAfter;\n\n const capacity = new Map<number, bigint>(); // 1e8 pre-token units\n const priceUsd = new Map<number, bigint>(); // 1e18 USD\n\n // Capacity at the current tranche derived from initial supply & BPS growth\n let currentCap = initialTrancheSupply;\n for (let i = 0; i < currentTranche; i++) {\n currentCap = growSupplyOnce(currentCap, supplyGrowthBps);\n }\n\n capacity.set(currentTranche, currentCap);\n priceUsd.set(currentTranche, currentPriceUsd);\n\n // Forward (future tranches)\n for (let id = currentTranche + 1; id <= endId; id++) {\n const prevCap = capacity.get(id - 1)!;\n const prevPrice = priceUsd.get(id - 1)!;\n\n capacity.set(id, growSupplyOnce(prevCap, supplyGrowthBps));\n priceUsd.set(id, growPriceOnceUsd1e18(prevPrice, priceGrowthCents));\n }\n\n // Backward (past tranches)\n for (let id = currentTranche - 1; id >= startId; id--) {\n const nextCap = capacity.get(id + 1)!;\n const nextPrice = priceUsd.get(id + 1)!;\n\n capacity.set(id, shrinkSupplyOnce(nextCap, supplyGrowthBps));\n priceUsd.set(id, shrinkPriceOnceUsd1e18(nextPrice, priceGrowthCents));\n }\n\n // Build ladder view\n const ladder: TrancheLadderItem[] = [];\n for (let id = startId; id <= endId; id++) {\n const cap = capacity.get(id)!;\n\n let sold: bigint;\n if (id < currentTranche) {\n sold = cap;\n } else if (id === currentTranche) {\n sold = cap - currentTrancheSupply;\n } else {\n sold = BigInt(0);\n }\n\n const remaining = cap - sold;\n const priceClientScale = usd1e18To1e8(priceUsd.get(id)!); // 1e8\n\n ladder.push({\n id,\n capacity: cap,\n sold,\n remaining,\n priceUsd: priceClientScale,\n });\n }\n\n return ladder;\n}\n\n/**\n * Turn raw liqsol_core accounts into a chain-agnostic TrancheSnapshot for SOL.\n * All math stays here; TokenClient just wires accounts + connection.\n */\nexport async function buildEthereumTrancheSnapshot(options: {\n chainID: ChainID;\n totalSharesBn;\n indexBn;\n trancheNumberBn;\n currentTrancheSupply;\n tranchePriceUsdBn;\n totalTrancheSupply;\n initialTrancheSupply;\n supplyGrowthBps;\n priceGrowthCents; // BigNumber from contract (1e18 for $0.02)\n minPriceUsd;\n maxPriceUsd;\n\n ethPriceUsd?: bigint;\n nativePriceTimestamp?: number;\n ladderWindowBefore?: number;\n ladderWindowAfter?: number;\n}): Promise<TrancheSnapshot> {\n const {\n chainID,\n ethPriceUsd,\n nativePriceTimestamp,\n ladderWindowBefore,\n ladderWindowAfter,\n\n totalSharesBn,\n indexBn,\n trancheNumberBn,\n currentTrancheSupply,\n tranchePriceUsdBn,\n totalTrancheSupply,\n initialTrancheSupply,\n supplyGrowthBps,\n priceGrowthCents,\n minPriceUsd,\n maxPriceUsd,\n } = options;\n\n // ---- BigNumber -> bigint conversions ----\n\n // Shares: keep your prior behaviour (1e8 scale) via /1e10\n const totalShares = BigInt(totalSharesBn.toString()) / BigInt(10_000_000_000); // 1e10\n\n const currentIndex = BigInt(indexBn.toString()); // RAY (1e27)\n\n const currentTranche = Number(trancheNumberBn.toString());\n\n // Prices & step in 1e18 scale from contract\n const currentPriceUsd1e18 = BigInt(tranchePriceUsdBn.toString());\n const priceGrowthStepUsd1e18 = BigInt(priceGrowthCents.toString());\n\n // Convert price step to “cents” number for snapshot:\n // 1 USD = 1e18 → 1 cent = 1e16.\n const priceGrowthCentsNumber = Number(\n priceGrowthStepUsd1e18 / BigInt(10_000_000_000_000_000) // 1e16\n );\n\n // Pre-token supplies (already 1e8-ish scale on-chain)\n const currentTrancheSupplyBig = BigInt(currentTrancheSupply.toString());\n const totalTrancheSupplyBig = BigInt(totalTrancheSupply.toString());\n const initialTrancheSupplyBig = BigInt(initialTrancheSupply.toString());\n\n // UI-current price (1e8 scale)\n const currentPriceUsd = currentPriceUsd1e18 / BigInt(10_000_000_000); // 1e10\n\n // ---- Build ladder ----\n\n const ladder = buildEthereumTrancheLadder({\n currentTranche,\n totalTrancheSupply: totalTrancheSupplyBig,\n initialTrancheSupply: initialTrancheSupplyBig,\n currentTrancheSupply: currentTrancheSupplyBig,\n currentPriceUsd: currentPriceUsd1e18, // 1e18\n priceGrowthCents: priceGrowthStepUsd1e18, // 1e18 step\n supplyGrowthBps,\n windowBefore: ladderWindowBefore,\n windowAfter: ladderWindowAfter,\n });\n\n return {\n chainID,\n currentIndex,\n totalShares,\n currentTranche,\n currentPriceUsd, // 1e8\n supplyGrowthBps,\n priceGrowthCents: priceGrowthCentsNumber, // <-- number as required\n totalPretokensSold: totalTrancheSupplyBig,\n currentTrancheSupply: currentTrancheSupplyBig,\n initialTrancheSupply: initialTrancheSupplyBig,\n nativePriceUsd: ethPriceUsd,\n nativePriceTimestamp,\n ladder,\n };\n}","import { BigNumber, ethers } from \"ethers\";\nimport { ClaimedEvent, DepositEvent, DepositResult, SharesBurnedEvent } from \"../types\";\nimport { EthereumContractService } from \"../contract\";\nimport { formatContractErrors } from \"../utils\";\n\nexport class ConvertClient {\n\n private readonly contractService: EthereumContractService;\n \n get contract() { return this.contractService.contract; }\n\n constructor(contract: EthereumContractService) {\n this.contractService = contract;\n }\n \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\n\n /**\n * \n * @param amountWei an amount of WEI to deposit in exchange for liqETH\n * @returns the hash of the transaction\n */\n 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 console.warn('less than min deposit');\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 let tx, receipt;\n try {\n tx = await this.contract.DepositManager.deposit({ value: amountWei });\n receipt = await tx.wait(1);\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n\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 public async performWithdraw(signerAddress: string, amountWei: BigNumber): Promise<any> {\n let tx, receipt;\n try {\n tx = await this.contract.LiqEthToken.safeBurn(signerAddress, amountWei);\n receipt = await tx.wait(1);\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n\n // Parse SharesBurned event if present\n let event: SharesBurnedEvent | undefined;\n const ev = receipt.events?.find((e) => e.event === 'SharesBurned');\n\n if (ev && ev.args) {\n const { from, shares, tokenValue } = ev.args;\n event = {\n from,\n shares: BigNumber.from(shares),\n tokenValue: BigNumber.from(tokenValue),\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n event,\n };\n }\n\n\n public async claimWithdraw(tokenId: BigNumber): Promise<any> {\n let tx, receipt;\n try {\n tx = await this.contract.DepositManager.claim(tokenId);\n receipt = await tx.wait(1);\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n\n // Parse Claimed event if present\n let event: ClaimedEvent | undefined;\n const ev = receipt.events?.find((e) => e.event === 'Claimed');\n\n if (ev && ev.args) {\n const { user, amount } = ev.args;\n event = {\n user,\n amount: BigNumber.from(amount),\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n event,\n };\n }\n \n \n /*\n // OLD - this was replaced with LiqEth.safeBurn() on 1/13/26\n async requestWithdraw(amountWei: BigNumber, signer: Signer, chainId: ChainID): Promise<WithdrawResult> {\n // deadline is a period of time in the future that the signature is valid for\n const deadline = Math.floor(Date.now() / 1000) + 3600;\n\n const liqEth = this.contract.LiqEth;\n const owner = await signer.getAddress();\n \n const nonce: BigNumber = await liqEth.nonces(owner);\n const domain = {\n name: await liqEth.name(),\n version: '1',\n chainId,\n verifyingContract: this.contract.LiqEthToken.address,\n } as any;\n\n const types = {\n Permit: [\n { name: 'owner', type: 'address' },\n { name: 'spender', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'nonce', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n ],\n } as any;\n\n const values = {\n owner,\n spender: this.contractService.getAddress('DepositManager'),\n value: amountWei,\n nonce: nonce,\n deadline,\n } as any;\n\n const signature = await (signer as any)._signTypedData(domain, types, values);\n const split = ethers.utils.splitSignature(signature);\n\n const tx = await this.contract.DepositManager.requestWithdrawal(\n amountWei,\n deadline,\n split.v,\n split.r,\n split.s\n );\n\n // wait for 1 confirmation\n const receipt = await tx.wait(1);\n\n // if WithdrawRequested event exists, parse it and get arguments\n let withdrawRequested: WithdrawRequestedEvent | undefined;\n const ev = receipt.events?.find((e) => e.event === 'WithdrawRequested');\n\n if (ev && ev.args) {\n const { user, ethAmount, nftId, readyAt } = ev.args;\n withdrawRequested = {\n user,\n ethAmount: BigNumber.from(ethAmount),\n nftId: BigNumber.from(nftId),\n readyAt: readyAt,\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n withdrawRequested,\n } as WithdrawResult;\n }\n */\n\n\n\n\n}","import { BigNumber, ethers } from \"ethers\";\nimport { StakedEvent, WithdrawnStakeEvent, WithdrawnStakeResult } from \"../types\";\nimport { EthereumContractService } from \"../contract\";\nimport { formatContractErrors } from \"../utils\";\n\nexport class StakeClient {\n\n private readonly contractService: EthereumContractService;\n \n get contract() { return this.contractService.contract; }\n\n constructor(contract: EthereumContractService) {\n this.contractService = contract;\n }\n \n\n\n /**\n * Simulate a stake via callStatic\n */\n async simulateStake(amountWei: BigNumber): Promise<void> {\n try {\n await this.contract.Depositor.callStatic.stakeLiqETH(amountWei);\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n }\n\n\n\n /**\n * \n * @param amountWei an amount of liqETH (in WEI) to stake to the Outpost\n * @returns txHash (hash of the transaction), receipt, Staked event\n */\n async performStake(amountWei: BigNumber, signerAddress: string): Promise<any> {\n const depositor = this.contract.Depositor.address;\n const liqRead = this.contract.LiqEthToken;\n const bal = await liqRead.balanceOf(signerAddress);\n const allowance = await liqRead.allowance(signerAddress, depositor);\n\n const paused = await this.contract.Depositor.paused();\n if(paused) {\n throw new Error(\"Error - Depositor is in a paused state\");\n }\n\n if (bal.lt(amountWei)) throw new Error(\"Insufficient LiqETH balance\");\n\n // if allowance is less than the requested stake amount, request permission to spend LiqEth\n if (allowance.lt(amountWei)) {\n const liqWrite = this.contractService.getWrite('LiqEthToken');\n\n console.warn(`allowance insufficient (${allowance.toString()} < ${amountWei.toString()}); sending approve(${depositor}, ${amountWei.toString()})`);\n const approveTx = await liqWrite.approve(depositor, amountWei);\n await approveTx.wait(1);\n\n // re-read allowance to ensure approval succeeded\n const newAllowance = await liqRead.allowance(signerAddress, depositor);\n if (newAllowance.lt(amountWei)) {\n throw new Error('Approval failed or allowance still insufficient after approve');\n }\n }\n \n \n await this.simulateStake(amountWei);\n\n\n // send the tx to stake liqeth\n const tx = await this.contract.Depositor.stakeLiqETH(amountWei);\n\n // Wait for 1 confirmation \n const receipt = await tx.wait(1);\n\n // Parse Staked event if present\n let staked: StakedEvent | undefined;\n const ev = receipt.events?.find((e) => e.event === 'Staked');\n\n if (ev && ev.args) {\n const { user, amountLiq, shares, tokenId } = ev.args;\n staked = {\n user,\n amountLiq: BigNumber.from(amountLiq),\n shares: BigNumber.from(shares),\n tokenId: BigNumber.from(tokenId)\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n staked,\n };\n }\n\n\n\n /**\n * \n * @param amountWei an amount of liqETH (in WEI) to stake to the Outpost\n * @returns txHash (hash of the transaction), receipt, WithdrawnStake event\n */\n async performWithdrawStake(tokenId: BigNumber, recipient: string): Promise<WithdrawnStakeResult> {\n // Send the payable tx\n const tx = await this.contract.Depositor.withdrawStake(tokenId, recipient);\n\n // Wait for 1 confirmation \n const receipt = await tx.wait(1);\n\n // Parse Staked event if present\n let withdrawnstake: WithdrawnStakeEvent | undefined;\n const ev = receipt.events?.find((e) => e.event === 'WithdrawnStake');\n\n if (ev && ev.args) {\n const { user, tokenOut, tokenId } = ev.args;\n withdrawnstake = {\n user: user,\n tokenOut: BigNumber.from(tokenOut),\n tokenId: BigNumber.from(tokenId)\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n withdrawnstake,\n };\n }\n}","import { BigNumber, ethers } from \"ethers\";\nimport { EthereumContractService } from \"../contract\";\nimport { formatContractErrors, sendOPPFinalize } from \"../utils\";\n\nexport class PretokenClient {\n private readonly contractService: EthereumContractService;\n \n get contract() { return this.contractService.contract; }\n\n constructor(contract: EthereumContractService) {\n this.contractService = contract;\n }\n \n\n\n /**\n * Purchase pretokens by transferring liqETH into the pool (ERC-20) and calling Depositor.purchasePretokensWithLiqETH(amountLiq, buyer).\n * Returns txHash, receipt and parsed PurchasedWithLiqETH event (if present).\n */\n async purchasePretokensWithLiqETH(amountLiq: bigint, buyer: string): Promise<any> {\n\n const bal = await this.contract.LiqEthToken.balanceOf(buyer);\n const paused = await this.contract.Depositor.paused();\n if(paused) {\n throw new Error(\"Error - Depositor is in a paused state\");\n }\n\n // if current liq balance is less than the requested buy amount, throw an error\n if (bal.lt(amountLiq)) {\n throw new Error(`Balance insufficient for pre-token purchase`);\n }\n\n //check that the contract has allowance for the token\n const depositorAddr = this.contract.Depositor.address;\n const allowance = await this.contract.LiqEthToken.allowance(buyer, depositorAddr);\n\n // if allowance is less than the requested stake amount, request permission to spend LiqEth\n if (allowance.lt(amountLiq)) {\n const liqWrite = this.contractService.getWrite('LiqEthToken');\n\n console.warn(`allowance insufficient (${allowance.toString()} < ${amountLiq.toString()}); sending approve(${depositorAddr}, ${amountLiq.toString()})`);\n\n const approveTx = await liqWrite.approve(depositorAddr, amountLiq);\n await approveTx.wait(1);\n\n // re-read allowance to ensure approval succeeded\n const newAllowance = await this.contract.LiqEthToken.allowance(buyer, depositorAddr);\n if (newAllowance.lt(amountLiq)) {\n throw new Error('Approval failed or allowance still insufficient after approve');\n }\n }\n \n // attempt a simulation of the purchase call\n try {\n const amountLiqBN = BigNumber.from(amountLiq)\n await this.contract.Depositor.callStatic.purchasePretokensWithLiqETH(amountLiqBN, buyer);\n } catch (err: any) {\n console.log('err', err);\n \n let errorObj = formatContractErrors(err);\n\n // ! TEMP for testing\n if(errorObj.name == \"OPP_PreviousEpochUnsent\") {\n console.error(\"OPP Previous Epoch is unsent - trigger OPP finalizeEpoch()\")\n await sendOPPFinalize(this.contract.OPP);\n throw new Error(errorObj.name+` - triggering OPP finalizeEpoch() please try again`);\n }\n\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n\n // attempt the real purchase call\n let tx, receipt;\n try {\n tx = await this.contract.Depositor.purchasePretokensWithLiqETH(amountLiq, buyer);\n receipt = await tx.wait(1);\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n\n\n // Attempt to parse PurchasedWithLiqETH event\n let purchased: any | undefined;\n const ev = receipt.events?.find((e) => e.event === 'PurchasedWithLiqETH' || (e.event && e.event.toString().startsWith('PurchasedWithLiqETH')));\n\n if (ev && ev.args) {\n // Event shape: PurchasedWithLiqETH(buyer, amountLiq, ethEqWei, shares, tokenId)\n const args: any = ev.args;\n // try named fields first, fallback to positional\n const evtBuyer = args.buyer ?? args[0];\n const evtAmountLiq = (args.amountLiq ?? args[1]) ? BigNumber.from(args.amountLiq ?? args[1]) : undefined;\n const evtEthEqWei = (args.ethEqWei ?? args[2]) ? BigNumber.from(args.ethEqWei ?? args[2]) : undefined;\n const evtShares = (args.shares ?? args[3]) ? BigNumber.from(args.shares ?? args[3]) : undefined;\n const evtTokenId = (args.tokenId ?? args[4]) ? BigNumber.from(args.tokenId ?? args[4]) : undefined;\n\n purchased = {\n buyer: evtBuyer,\n amountLiq: evtAmountLiq,\n ethEqWei: evtEthEqWei,\n shares: evtShares,\n tokenId: evtTokenId,\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n purchased,\n };\n }\n\n\n\n\n /**\n * Purchase pretokens by sending ETH to the Depositor.purchasePretokensWithETH(buyer) payable function.\n * Returns txHash, receipt and parsed PurchasedWithETH event (if present).\n async purchasePretokensWithETH(amountWei: BigNumber, buyer: string): Promise<any> {\n // attempt a simulation of the purchase call\n try {\n await this.contract.Depositor.callStatic.purchasePretokensWithETH(buyer, { value: amountWei });\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n\n // attempt the real purchase call\n let tx, receipt;\n try {\n tx = await this.contract.Depositor.purchasePretokensWithETH(buyer, { value: amountWei });\n receipt = await tx.wait(1);\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n\n\n // Attempt to parse PurchasedWithETH event\n let purchased: any | undefined;\n const ev = receipt.events?.find((e) => e.event === 'PurchasedWithETH' || e.event === 'PurchasedWithETH(address,uint256,uint256,uint256)');\n\n if (ev && ev.args) {\n // event signature: PurchasedWithETH(address indexed user, uint256 ethIn, uint256 shares, uint256 tokenId)\n const { user, ethIn, shares, tokenId } = ev.args as any;\n\n purchased = {\n buyer: user,\n amount: BigNumber.from(ethIn),\n shares: BigNumber.from(shares),\n tokenId: BigNumber.from(tokenId),\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n purchased,\n };\n }\n */\n\n \n\n}","import { ethers } from \"ethers\";\nimport { EthereumContractService } from \"../contract\";\nimport { OPPAssertion } from \"../../../types\";\n\n\nexport class OPPClient {\n\n \n private readonly decoders: Record<number, Decoder> = {\n 2001: (d) => this.decode2001(d),\n 2002: (d) => this.decode2002(d),\n\n 3001: (d) => this.decodeStake3001(d),\n 3002: (d) => this.decodeUnstake3002(d),\n // 3003 not implemented\n 3004: (d) => this.decodeLiqPretoken3004(d),\n 3005: (d) => this.decodePretoken3005(d),\n 3006: (d) => this.decodeYieldPretoken3006(d),\n };\n \n private readonly contractService: EthereumContractService;\n \n get contract() { return this.contractService.contract; }\n\n constructor(contract: EthereumContractService) {\n this.contractService = contract;\n }\n \n\n\n /**\n * Read OPP / Outpost state used by the Depositor to decide whether staking is allowed.\n * Returns various data\n */\n async getStatus(): Promise<any> {\n const depositor = this.contract.Depositor;\n const opp = this.contract.OPP;\n\n \n const oppAddress: string = await depositor.oppAddress();\n const oppInboundAddress: string = await depositor.oppInboundAddress();\n const prevEpochSent = await opp.prevEpochSent();\n \n\n const inbound = this.contractService.getReadOnly('OPPInbound');\n\n // Query useful getters\n const nextEpochBN: any = await inbound.nextEpochNum();\n const pendingEpochRaw: any = await inbound.pendingEpoch();\n const pendingMessageCount: any = await inbound.pendingMessageCount();\n const previousEpochHash: string = await inbound.previousEpochHash();\n const nextEpochNum = (nextEpochBN && typeof nextEpochBN.toNumber === 'function') ? nextEpochBN.toNumber() : Number(nextEpochBN || 0);\n\n const pendingEpoch = (pendingEpochRaw && pendingEpochRaw.epochNumber !== undefined)\n ? {\n epochNumber: (pendingEpochRaw.epochNumber && typeof pendingEpochRaw.epochNumber.toNumber === 'function') ? pendingEpochRaw.epochNumber.toNumber() : Number(pendingEpochRaw.epochNumber || 0),\n timestamp: (pendingEpochRaw.timestamp && typeof pendingEpochRaw.timestamp.toNumber === 'function') ? pendingEpochRaw.timestamp.toNumber() : Number(pendingEpochRaw.timestamp || 0),\n prevEpochHash: pendingEpochRaw.prevEpochHash,\n merkleRoot: pendingEpochRaw.merkleRoot,\n firstMessageID: pendingEpochRaw.firstMessageID,\n lastMessageID: pendingEpochRaw.lastMessageID,\n }\n : null;\n\n const pendingMessagesBN = pendingMessageCount;\n const pendingMessages = (pendingMessagesBN && typeof pendingMessagesBN.toString === 'function') ? pendingMessagesBN.toString() : String(pendingMessagesBN || '0');\n\n const hasPendingMessages = (pendingMessagesBN && typeof pendingMessagesBN.gt === 'function') ? pendingMessagesBN.gt(0) : (Number(pendingMessages) > 0);\n\n return {\n oppAddress,\n prevEpochSent,\n oppInboundAddress,\n nextEpochNum,\n pendingEpoch,\n pendingMessageCount: pendingMessages,\n previousEpochHash,\n hasPendingMessages,\n raw: {\n nextEpochBN,\n pendingEpochRaw,\n pendingMessageCount: pendingMessagesBN,\n },\n };\n }\n\n /**\n * Fetches all OPPMessage events and flattens all assertions into a single OPPAssertion[] array.\n */\n async getMessages(address: string): Promise<OPPAssertion[]> {\n try {\n const oppMessageFilter = this.contract.OPP.filters.OPPMessage();\n const events = await this.contract.OPP.queryFilter(oppMessageFilter, 0, \"latest\");\n const allAssertions: OPPAssertion[] = [];\n for (const event of events) {\n const assertions = await this.extractAssertionsFromEvent(event);\n allAssertions.push(...assertions);\n }\n\n // ! Current implementation is not ideal - no current way to filter OPP Messages by a single user\n const normalized = address ? address.toLowerCase() : null;\n const filtered = allAssertions.filter(a =>\n (a.from && a.from.toLowerCase() === normalized) ||\n (a.to && a.to.toLowerCase() === normalized)\n );\n return filtered.reverse();\n }\n catch (error) {\n // console.log('Error fetching OPP messages:', error);\n return [];\n }\n }\n\n /**\n * Extracts all OPPAssertions from a single OPPMessage event, attaching event metadata to each.\n */\n private async extractAssertionsFromEvent(event: any): Promise<OPPAssertion[]> {\n const header = event.args.header;\n const payloadAssertions = event.args.payload.assertions;\n\n const timestamp = header.timestamp ? Number(header.timestamp) : null;\n const from = event.address || null;\n const txHash = event.transactionHash;\n const chain = 'ETH';\n\n const assertionList: OPPAssertion[] = [];\n\n if (payloadAssertions && payloadAssertions.length > 0) {\n for (let a of payloadAssertions) {\n const assertionType = a[0] as number;\n const assertionData = a[1] as string;\n\n\n let type: OPPAssertion[\"type\"] = \"unknown\";\n let data: any = {};\n let to: string | null = null;\n\n const decoder = this.decoders[assertionType];\n\n if (decoder) {\n try {\n const decoded = decoder(assertionData);\n type = decoded.type;\n data = decoded.data;\n to = decoded.to ?? null;\n } catch (e: any) {\n // catch a bad assertion so it doesn't fail the entire function\n type = \"unknown\";\n data = {\n decodeError: e?.message ?? String(e),\n assertionType,\n rawHex: assertionData,\n };\n }\n } else {\n // Unknown assertion type\n data = { assertionType, rawHex: assertionData };\n }\n\n assertionList.push({\n type,\n data,\n chain,\n timestamp,\n from,\n to,\n txHash,\n raw: event,\n });\n }\n }\n return assertionList;\n }\n \n\n\n private decode2001(assertionData: string): DecoderResult {\n const hex = this.strip0x(assertionData);\n\n let cursor = 0;\n const r1 = this.readAddress(hex, cursor); cursor = r1.next;\n const r2 = this.readAddress(hex, cursor); cursor = r2.next;\n const r3 = this.readBytes32(hex, cursor); cursor = r3.next;\n const r4 = this.readUint256LE(hex, cursor); cursor = r4.next;\n const r5 = this.readUint64LE(hex, cursor); cursor = r5.next;\n\n const data = {\n actor: r1.addr,\n owner: r2.addr,\n bondLevelId: r3.value,\n tokenId: r4.value,\n bondedAt: r5.value,\n };\n\n return { type: \"bonded_actor\", data, to: r1.addr };\n }\n private decode2002(assertionData: string): DecoderResult {\n const hex = this.strip0x(assertionData);\n\n let cursor = 0;\n const r1 = this.readAddress(hex, cursor); cursor = r1.next;\n const r2 = this.readBytes32(hex, cursor); cursor = r2.next;\n const r3 = this.readUint256LE(hex, cursor); cursor = r3.next;\n const r4 = this.readUint64LE(hex, cursor); cursor = r4.next;\n\n const data = {\n actor: r1.addr,\n bondLevelId: r2.value,\n tokenId: r3.value,\n unbondedAt: r4.value,\n };\n\n return { type: \"unbonded_actor\", data, to: r1.addr };\n }\n\n\n private decodeStake3001(assertionData: string): DecoderResult {\n const { addr, nums } = this.decodeAddrPlusU256(assertionData, 3);\n const [principal, shares, indexAtMint] = nums;\n\n return {\n type: \"stake\",\n data: { \n staker: addr, \n principal: ethers.utils.formatUnits(principal, 18),\n shares: ethers.utils.formatUnits(shares, 18),\n indexAtMint \n },\n to: addr,\n };\n }\n private decodeUnstake3002(assertionData: string): DecoderResult {\n const { addr, nums } = this.decodeAddrPlusU256(assertionData, 4);\n const [unstakeAmount, shares, indexAtBurn, tokenId] = nums;\n\n return {\n type: \"unstake\",\n data: { \n unstaker: addr, \n unstakeAmount: ethers.utils.formatUnits(unstakeAmount, 18),\n shares, \n indexAtBurn, \n tokenId \n },\n to: addr,\n };\n }\n private decodeLiqPretoken3004(assertionData: string): DecoderResult {\n const { addr, nums } = this.decodeAddrPlusU256(assertionData, 3);\n const [principal, shares, indexAtMint] = nums;\n\n return {\n type: \"liq_pretoken_purchase\",\n data: { \n purchaser: addr, \n principal: ethers.utils.formatUnits(principal, 18),\n shares: ethers.utils.formatUnits(shares, 18),\n indexAtMint \n },\n to: addr,\n };\n }\n private decodePretoken3005(assertionData: string): DecoderResult {\n const { addr, nums } = this.decodeAddrPlusU256(assertionData, 3);\n const [ethInWei, usdValue, pretokensOut] = nums;\n\n return {\n type: \"pretoken_purchase\",\n data: {\n buyer: addr,\n ethInWei,\n ethIn: ethers.utils.formatUnits(ethInWei, 18),\n usdValue: ethers.utils.formatUnits(usdValue, 18),\n pretokensOut: ethers.utils.formatUnits(pretokensOut, 18),\n },\n to: addr,\n };\n }\n private decodeYieldPretoken3006(assertionData: string): DecoderResult {\n const { addr, nums } = this.decodeAddrPlusU256(assertionData, 2);\n const [principal, indexAtMint] = nums;\n\n return {\n type: \"yield_pretoken_purchase\",\n data: { purchaser: addr, principal, indexAtMint },\n to: addr,\n };\n }\n\n\n\n\n /**\n * \n * @param hex string to check\n * @returns the passed string, without a prefixed 0x if it existed\n */\n private strip0x(hex: string): string {\n return hex.startsWith(\"0x\") ? hex.slice(2) : hex;\n }\n\n private decodeAddrPlusU256(assertionData: string, count: number): { addr: string; nums: string[] } {\n const hex = this.strip0x(assertionData);\n let cursor = 0;\n\n const { addr, next } = this.readAddress(hex, cursor);\n cursor = next;\n\n const nums: string[] = [];\n for (let i = 0; i < count; i++) {\n const r = this.readUint256LE(hex, cursor);\n nums.push(r.value);\n cursor = r.next;\n }\n return { addr, nums };\n }\n\n private uint256FromLE(hexNo0x: string): ethers.BigNumber {\n if (hexNo0x.length !== 64) {\n throw new Error(`uint256 LE must be 32 bytes (64 hex chars), got ${hexNo0x.length}`);\n }\n const bytes = ethers.utils.arrayify(\"0x\" + hexNo0x);\n const reversed = Uint8Array.from(bytes).reverse(); // little -> big endian\n return ethers.BigNumber.from(ethers.utils.hexlify(reversed));\n }\n\n\n /**\n * Parses \"0x14 + <addr>\" and returns addr + next cursor (in hex chars, excluding 0x)\n * @param payload full payload\n * @param cursor place to start\n * @returns string\n */\n private readAddress(payload: string, cursor: number): { addr: string; next: number } {\n const lenByteHex = payload.slice(cursor, cursor + 2);\n const len = parseInt(lenByteHex, 16);\n if (!Number.isFinite(len) || len <= 0) throw new Error(`Bad address len byte: ${lenByteHex}`);\n const start = cursor + 2;\n const end = start + len * 2;\n const addrHex = payload.slice(start, end);\n if (addrHex.length !== len * 2) throw new Error(`Truncated address bytes`);\n return { addr: ethers.utils.getAddress(\"0x\" + addrHex), next: end };\n }\n\n /**\n * Reads 32-byte uint256 little-endian from payload at cursor (hex chars, excluding 0x)\n * @param payload \n * @param cursor \n * @returns \n */\n private readUint256LE(payload: string, cursor: number): { value: string; next: number } {\n const word = payload.slice(cursor, cursor + 64);\n if (word.length !== 64) throw new Error(`Truncated uint256 at ${cursor}`);\n return { value: this.uint256FromLE(word).toString(), next: cursor + 64 };\n }\n\n /**\n * Reads 8-byte uint64 little-endian from payload at cursor (hex chars, excluding 0x)\n * @param payload \n * @param cursor \n * @returns \n */\n private readUint64LE(payload: string, cursor: number): { value: number; next: number } {\n const word = payload.slice(cursor, cursor + 16);\n if (word.length !== 16) throw new Error(`Truncated uint64 at ${cursor}`);\n const bytes = ethers.utils.arrayify(\"0x\" + word);\n const reversed = Uint8Array.from(bytes).reverse();\n const bn = ethers.BigNumber.from(ethers.utils.hexlify(reversed));\n return { value: bn.toNumber(), next: cursor + 16 };\n }\n\n /**\n * Reads bytes32 from payload at cursor (hex chars, excluding 0x)\n * @param payload \n * @param cursor \n * @returns \n */\n private readBytes32(payload: string, cursor: number): { value: string; next: number } {\n const word = payload.slice(cursor, cursor + 64);\n if (word.length !== 64) throw new Error(`Truncated bytes32 at ${cursor}`);\n return { value: \"0x\" + word, next: cursor + 64 };\n }\n\n\n}\n\n\ntype DecoderResult = { type: OPPAssertion[\"type\"]; data: any; to?: string | null };\ntype Decoder = (assertionData: string) => DecoderResult;","import { BaseSignerWalletAdapter } from '@solana/wallet-adapter-base';\nimport { PublicKey as SolPubKey } from '@solana/web3.js';\nimport { ChainID, EvmChainID, ExternalNetwork, PublicKey, SolChainID } from '@wireio/core';\nimport { ethers } from 'ethers';\n\nexport type StakerConfig = {\n network: ExternalNetwork;\n provider?: BaseSignerWalletAdapter | ethers.providers.Web3Provider;\n pubKey?: PublicKey;\n extras?: {\n squadsX?: SquadsXConfig;\n }\n}\n\nexport type SquadsXConfig = {\n multisigPDA: string; // REQUIRED, base58 multisig address string\n vaultIndex?: number; // default 0\n};\n\nexport enum SupportedEvmChainID {\n Ethereum = EvmChainID.Ethereum,\n Hoodi = EvmChainID.Hoodi,\n}\nexport enum SupportedSolChainID {\n Mainnet = SolChainID.Mainnet,\n Devnet = SolChainID.Devnet,\n}\n\nexport interface IStakingClient {\n pubKey?: PublicKey;\n network: ExternalNetwork;\n\n /** Amount is in the chain's smallest unit (lamports/wei, etc.) */\n deposit(amount: bigint): Promise<string>;\n withdraw(amount: bigint): Promise<string>;\n stake(amount: bigint): Promise<string>;\n unstake(amount: bigint): Promise<string>;\n buy(amount: bigint): Promise<string>;\n\n /** Fetch the complete user portfolio */\n getPortfolio(): Promise<Portfolio | null>;\n\n // Estimated total APY for staking yeild\n getSystemAPY(): Promise<number>;\n\n /**\n * Program-level prelaunch WIRE/tranche snapshot for this chain.\n *\n * Returns:\n * - `TrancheSnapshot` when the chain supports pretoken/tranches\n * - `null` if this chain has no WIRE/pretoken integration\n */\n getTrancheSnapshot(chainId: ChainID): Promise<TrancheSnapshot | null>;\n\n /**\n * Protocol fee charged for deposit from Native to LIQ\n * in Solana: amount in lamports\n * in Ethereum: amount in wei\n */\n getDepositFee(amount: bigint): Promise<bigint>;\n\n /**\n * Estimate a conservative ETH(wei) / SOL(lamports) buffer to leave in the wallet\n * so the user can pay fees for the current deposit and at least one\n * more transaction, plus a bit extra for future interactions.\n */\n getDepositBuffer(options?: {\n txCount?: number; // how many txs to cover in gas buffer (default 2)\n safetyMultiplier?: number; // safety multiplier on per-tx fee (default 3x)\n minBufferLamports?: bigint; // minimum gas buffer (default ~0.01 SOL)\n balanceOverrideLamports?: bigint; // for tests/custom callers\n }): Promise<bigint>\n}\n\n/**\n * Cross-chain portfolio view for a single account/wallet.\n *\n * On Solana (liqSOL + Outpost + pretokens) we fill:\n * - native: SOL wallet lamports\n * - liq: liqSOL in user ATA\n * - staked: liqSOL staked into Outpost (stakedLiqsol)\n * - wire: WIRE pretokens purchased (1e8 scale)\n * - yield: Outpost yield view (index/shares + implied claim/yield)\n *\n * On other chains:\n * - native/liq/wire/staked can still be populated as appropriate\n * - yield may be undefined if no index/shares concept exists.\n */\nexport interface Portfolio {\n /** Native balance on chain: ETH, SOL, etc. */\n native: BalanceView;\n\n /** Liquid staking token balance (LiqETH, LiqSOL, etc.). */\n liq: BalanceView;\n\n /**\n * Outpost-staked balance:\n * - On Solana: liqSOL staked via `synd` (stakedLiqsol, in lamports).\n * - On other chains: protocol-specific staked principal, if any.\n */\n staked: BalanceView;\n\n /**\n * Prelaunch WIRE “shares” (pretokens).\n * - On Solana: totalPretokensPurchased (1e8 scale).\n * - On other chains: analogous pretoken balance if supported.\n */\n wire: BalanceView;\n\n /**\n * Yield / index-based view (SOL + Outpost only for now).\n *\n * If the connected chain doesn’t expose an index+shares model,\n * this will be undefined.\n */\n yield?: YieldView;\n\n /**\n * Extra PDAs, account addresses, and raw state useful for debugging\n * and advanced UI (e.g. tranche price, global index, PDAs).\n */\n extras?: Record<string, any>;\n\n /** Chain ID of the network from which this portfolio was fetched. */\n chainID: ChainID;\n}\n\n/**\n * Canonical view of a single balance on a given chain.\n *\n * amount – integer base units (wei, lamports, token base units)\n * symbol – display symbol (“SOL”, “LiqSOL”, “$WIRE”, etc.)\n * decimals – how many decimal places to use when formatting\n * ata – optional SPL ATA / ERC-20 address (where applicable)\n */\nexport interface BalanceView {\n amount: bigint;\n symbol: string;\n decimals: number;\n ata?: SolPubKey;\n}\n\n/**\n * Outpost yield view.\n *\n * All amounts are integers in base units (lamports for liqSOL, wei for liqETH).\n *\n * Math matches capital-staking:\n * INDEX_SCALE = 1e12\n * sharesToTokens = shares * currentIndex / INDEX_SCALE\n */\nexport interface YieldView {\n /**\n * Current global index for the Outpost pool.\n * - 1e12 scale (INDEX_SCALE)\n * - sharesToTokens(shares) = shares * currentIndex / indexScale\n */\n currentIndex: bigint;\n\n /**\n * Fixed scale factor used for index math.\n * - Always 1_000_000_000_000n (1e12) on Solana Outpost.\n */\n indexScale: bigint;\n\n /** Total shares outstanding in the Outpost pool (all users). */\n totalShares: bigint;\n\n /** User’s staked shares in the Outpost pool. */\n userShares: bigint;\n\n /**\n * Total liq (wei/lamports) the user could claim right now if they fully\n * unwound their stake:\n * estimatedClaim = userShares * currentIndex / indexScale\n */\n estimatedClaim?: bigint;\n\n /**\n * Portion of estimatedClaim that is “yield” above principal:\n * estimatedYield = max(0, estimatedClaim - staked)\n *\n * NOTE: staked principal itself is surfaced separately as\n * Portfolio.staked.amount.\n */\n estimatedYield?: bigint;\n}\n\nexport interface TrancheLadderItem {\n /** On-chain tranche id, 0-based (0,1,2,...) */\n id: number;\n /** Total capacity for this tranche (pretokens, 1e8 scale) */\n capacity: bigint;\n /** Sold amount in this tranche (1e8 scale) */\n sold: bigint;\n /** Remaining = capacity - sold (1e8 scale) */\n remaining: bigint;\n /** Price for this tranche in USD (1e8 scale) */\n priceUsd: bigint;\n}\n\nexport interface TrancheLadderItem {\n /** On-chain tranche id, 0-based (0,1,2,...) */\n id: number;\n /** Total capacity for this tranche (pretokens, 1e8 scale) */\n capacity: bigint;\n /** Sold amount in this tranche (1e8 scale) */\n sold: bigint;\n /** Remaining = capacity - sold (1e8 scale) */\n remaining: bigint;\n /** Price for this tranche in USD (1e8 scale) */\n priceUsd: bigint;\n}\n\n/**\n * Unified pretoken/tranche snapshot for any chain.\n * ETH / other chains just fill the same shape from their own contracts.\n */\nexport interface TrancheSnapshot {\n chainID: ChainID;\n\n /** Global share index (1e12 on Sol today; other chains can use their own scale) */\n currentIndex: bigint;\n /** Total accounting shares (wire pretoken “shares”) */\n totalShares: bigint;\n\n /** Current tranche id as stored on chain (0-based) */\n currentTranche: number;\n\n /** Current tranche price in USD (1e8 scale) */\n currentPriceUsd: bigint;\n\n supplyGrowthBps: number; // 2.5% growth per tranche\n\n priceGrowthCents: number; // $0.02 USD growth per tranche\n\n totalPretokensSold: bigint; // total pretokens sold across all tranches (1e8 scale)\n\n /** Current tranche supply state (1e8 scale) */\n currentTrancheSupply: bigint; // remaining in current tranche\n initialTrancheSupply: bigint; // capacity for current tranche\n\n /** Native token → USD price if available (SOL/USD, ETH/USD, etc, 1e8 scale) */\n nativePriceUsd?: bigint;\n /** Optional timestamp (sec) for the last recorded native price */\n nativePriceTimestamp?: number;\n\n /**\n * Local window of tranche “rows” centered around current.\n * Used directly by the frontend for ladder graphs.\n */\n ladder: TrancheLadderItem[];\n}\n\n\n// Enum describing which asset is being used to buy pretoken\nexport enum PurchaseAsset {\n SOL = 'SOL',\n LIQSOL = 'LIQSOL',\n ETH = 'ETH',\n LIQETH = 'LIQETH',\n YIELD = 'YIELD',\n}\n\nexport interface PurchaseQuote {\n purchaseAsset: PurchaseAsset;\n amountIn: bigint; // lamports / wei / token units\n\n /** Expected pretoken “shares” (pretokens) and decimals */\n wireShares: bigint; // 1e8 scale\n wireDecimals: number; // always 8 for now\n\n /** Current price + notional in USD (1e8 scale) */\n wirePriceUsd: bigint;\n notionalUsd: bigint;\n}\n\n// export interface OPPEvent {\n// type: 'liq_pretoken_purchase' | 'yield_pretoken_purchase' | 'pretoken_purchase' | 'stake' | 'unstake' | 'unknown';\n// amount: bigint | null;\n// chain: 'ETH' | 'SOL';\n// timestamp: number | null;\n// from: string | null;\n// to: string | null;\n// txHash: string;\n// raw: any;\n// assertions: OPPAssertion[]\n// }\n\nexport interface OPPAssertion {\n type: 'liq_pretoken_purchase' | 'yield_pretoken_purchase' | 'pretoken_purchase' | 'stake' | 'unstake' | 'bonded_actor' | 'unbonded_actor' | 'unknown',\n data: any\n chain: 'ETH' | 'SOL';\n timestamp: number | null;\n from: string | null;\n to: string | null;\n txHash: string;\n raw: any;\n}\n\n\n\nexport enum ReceiptNFTKind {\n STAKE = 0,\n PRETOKEN_PURCHASE = 1,\n}","import { BigNumber } from \"ethers\";\nimport { preLaunchReceipt, WithdrawReceipt } from \"../types\";\nimport { EthereumContractService } from \"../contract\";\nimport { ReceiptNFTKind } from \"../../../types\";\n\nexport class ReceiptClient {\n\n private readonly contractService: EthereumContractService;\n \n get contract() { return this.contractService.contract; }\n\n constructor(contract: EthereumContractService) {\n this.contractService = contract;\n }\n\n\n\n async allReceipts(address: string): Promise<preLaunchReceipt[]> {\n return this.fetchPreLaunchReceipts(address);\n }\n\n async stakeReceipts(address: string): Promise<preLaunchReceipt[]> {\n try {\n const receipts = await this.fetchPreLaunchReceipts(address, ReceiptNFTKind.STAKE);\n return receipts;\n }\n catch (err) {\n // console.log('Error fetching stake receipts:', err);\n return [];\n }\n }\n \n async pretokenReceipts(address: string): Promise<preLaunchReceipt[]> {\n return this.fetchPreLaunchReceipts(address, ReceiptNFTKind.PRETOKEN_PURCHASE);\n }\n\n\n\n /**\n * \n * @param address (string) to fetch receipts for\n * @returns preLaunchReceipt[]\n */\n async fetchPreLaunchReceipts(address: string, type?: ReceiptNFTKind): Promise<preLaunchReceipt[]> {\n const receiptContract = this.contract.ReceiptNFT;\n\n // first figure out which tokenIds this address owns, from events\n const tokenIds = await this.getOwnedReceiptNFTsFor(address);\n\n const results: preLaunchReceipt[] = [];\n\n // next fetch on-chain receipt data just for those ids\n for (const idBN of tokenIds) {\n try {\n const receiptData = await receiptContract.getReceipt(idBN);\n\n //skip any receipt not of the requested type\n if(type !== undefined && receiptData.kind !== type) continue;\n\n results.push({ \n tokenId: idBN.toBigInt(), \n receipt: {\n account: receiptData.account,\n currency: receiptData.currency,\n kind: receiptData.kind,\n indexAtMint: receiptData.indexAtMint.toBigInt(),\n principal: {\n amount: receiptData.principal.toBigInt(),\n decimals: 18,\n symbol: \"LiqETH\"\n },\n shares: {\n amount: receiptData.shares.toBigInt(),\n decimals: 18,\n symbol: \"LiqETH\"\n },\n timestamp: new Date(Number(receiptData.timestamp.toString()) * 1000).toLocaleString(),\n }\n });\n } catch (err) {\n // in case of any mismatch or race, just skip this id\n console.warn(`Failed to load receipt for tokenId=${idBN.toString()}`, err);\n continue;\n }\n }\n\n return results;\n }\n\n\n\n\n private async getOwnedReceiptNFTsFor(\n owner: string,\n fromBlock = 0,\n toBlock: number | string = \"latest\"\n ): Promise<BigNumber[]> {\n const receiptContract = this.contract.ReceiptNFT;\n\n // Logs where address received tokens\n const toLogs = await receiptContract.queryFilter(\n receiptContract.filters.Transfer(null, owner),\n fromBlock,\n toBlock\n );\n\n // Logs where address sent tokens (including burns from owner → 0)\n const fromLogs = await receiptContract.queryFilter(\n receiptContract.filters.Transfer(owner, null),\n fromBlock,\n toBlock\n );\n\n const owned = new Set<string>();\n\n // Add all received tokenIds\n for (const e of toLogs) {\n const tokenId = e.args?.tokenId;\n if (!tokenId) continue;\n owned.add(tokenId.toString());\n }\n\n // Remove all sent tokenIds\n for (const e of fromLogs) {\n const tokenId = e.args?.tokenId;\n if (!tokenId) continue;\n owned.delete(tokenId.toString());\n }\n\n // Convert to BigNumbers\n return Array.from(owned).map((id) => BigNumber.from(id));\n }\n\n\n /**\n * \n * @param address (string) to fetch receipts for\n * @returns preLaunchReceipt[]\n */\n async fetchWithdrawReceipts(address: string): Promise<WithdrawReceipt[]> {\n // first figure out which tokenIds this address owns, from events\n const tokenIds = await this.getOwnedWithdrawReceiptsFor(address);\n const results: WithdrawReceipt[] = [];\n\n // next fetch on-chain token data just for those ids\n for (const idBN of tokenIds) {\n try {\n const receiptData = await this.contract.WithdrawalQueue.info(idBN);\n\n results.push({ \n tokenId: idBN.toBigInt(), \n receipt: {\n ethAmount: receiptData.ethAmount,\n ethBalance: {\n amount: receiptData.ethAmount.toBigInt(),\n decimals: 18,\n symbol: \"ETH\"\n },\n readyAt: new Date(Number(receiptData.readyAt.toString()) * 1000).valueOf(),\n }\n });\n } catch (err) {\n // in case of any mismatch or race, just skip this id\n console.warn(`Failed to load receipt for tokenId=${idBN.toString()}`, err);\n continue;\n }\n }\n\n return results;\n }\n\n\n\n private async getOwnedWithdrawReceiptsFor(\n owner: string,\n fromBlock = 0,\n toBlock: number | string = \"latest\"\n ): Promise<BigNumber[]> {\n const contract = this.contract.WithdrawalQueue;\n\n // Logs where address received tokens\n const toLogs = await contract.queryFilter(\n contract.filters.Transfer(null, owner),\n fromBlock,\n toBlock\n );\n\n // Logs where address sent tokens (including burns from owner → 0)\n const fromLogs = await contract.queryFilter(\n contract.filters.Transfer(owner, null),\n fromBlock,\n toBlock\n );\n\n const owned = new Set<string>();\n\n // Add all received tokenIds\n for (const e of toLogs) {\n const tokenId = e.args?.tokenId;\n if (!tokenId) continue;\n owned.add(tokenId.toString());\n }\n\n // Remove all sent tokenIds\n for (const e of fromLogs) {\n const tokenId = e.args?.tokenId;\n if (!tokenId) continue;\n owned.delete(tokenId.toString());\n }\n\n // Convert to BigNumbers\n return Array.from(owned).map((id) => BigNumber.from(id));\n }\n}","import { BigNumber, ethers } from 'ethers';\nimport { ChainID, EvmChainID, PublicKey as WirePubKey } from '@wireio/core';\nimport {\n IStakingClient,\n OPPAssertion,\n Portfolio,\n StakerConfig,\n TrancheSnapshot\n} from '../../types';\nimport { EthereumContractService } from './contract';\nimport { preLaunchReceipt, WithdrawReceipt } from './types';\nimport { buildEthereumTrancheSnapshot } from './utils';\nimport { ConvertClient } from './clients/convert.client';\nimport { StakeClient } from './clients/stake.client';\nimport { PretokenClient } from './clients/pretoken.client';\nimport { OPPClient } from './clients/opp.client';\nimport { ReceiptClient } from './clients/receipt.client';\n\nexport const INITIAL_TRANCHE_SUPPLY = 35000;\n\nexport class EthereumStakingClient implements IStakingClient {\n private readonly provider: ethers.providers.Web3Provider | ethers.providers.JsonRpcProvider;\n public readonly pubKey?: WirePubKey;\n private readonly signer?: ethers.Signer;\n private readonly contractService: EthereumContractService;\n\n private convertClient: ConvertClient;\n private pretokenClient: PretokenClient;\n private stakeClient: StakeClient;\n private oppClient: OPPClient;\n private receiptClient: ReceiptClient;\n\n\n get contract() { return this.contractService.contract; }\n get network() { return this.config.network; }\n\n constructor(private config: StakerConfig) {\n try {\n if (config.provider) {\n this.provider = config.provider as ethers.providers.Web3Provider;\n this.signer = this.provider.getSigner();\n }\n else {\n this.provider = new ethers.providers.JsonRpcProvider(config.network.rpcUrls[0]);\n }\n this.pubKey = config.pubKey;\n\n this.contractService = new EthereumContractService({\n provider: this.provider,\n signer: this.signer,\n chainId: config.network.chainId as EvmChainID,\n });\n\n this.convertClient = new ConvertClient(this.contractService);\n this.pretokenClient = new PretokenClient(this.contractService);\n this.stakeClient = new StakeClient(this.contractService);\n this.oppClient = new OPPClient(this.contractService);\n this.receiptClient = new ReceiptClient(this.contractService);\n }\n catch (error) {\n // console.error('Error initializing EthereumStakingClient:', error);\n throw error;\n }\n }\n\n // ---------------------------------------------------------------------\n // Public IStakingClient Interface Methods\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 this.ensureUser();\n\n const amountWei = BigNumber.isBigNumber(amount)\n ? amount\n : BigNumber.from(amount);\n\n const result = await this.convertClient.performDeposit(amountWei);\n return result.txHash;\n }\n\n /**\n * Withdraw native ETH from the liqETH protocol via the liqeth safeBurn function, which burns the LiqETH and adds the user to the withdrawal queue.\n * @param amount Amount in wei (or something convertible to BigNumber).\n * @returns transaction hash\n */\n async withdraw(amount: bigint): Promise<string> {\n this.ensureUser();\n\n const address = await this.signer!.getAddress();\n const amountWei = BigNumber.from(amount);\n\n const result = await this.convertClient.performWithdraw(address, amountWei)\n return result.txHash;\n }\n\n /**\n * Withdraw native ETH from the liqETH protocol via the liqeth safeBurn function, which burns the LiqETH and adds the user to the withdrawal queue.\n * @param amount Amount in wei (or something convertible to BigNumber).\n * @returns transaction hash\n */\n async loadPendingWithdraws(): Promise<WithdrawReceipt[]> {\n this.ensureUser();\n const address = await this.signer!.getAddress();\n\n return await this.receiptClient.fetchWithdrawReceipts(address);\n }\n\n /**\n * Withdraw native ETH from the liqETH protocol via the liqeth safeBurn function, which burns the LiqETH and adds the user to the withdrawal queue.\n * @param tokenId The ID of the withdrawal request NFT\n * @returns transaction hash\n */\n async claimWithdraw(tokenId: bigint): Promise<string> {\n this.ensureUser();\n\n const tokenIdBigNum = BigNumber.from(tokenId)\n const result = await this.convertClient.claimWithdraw(tokenIdBigNum)\n return result.txHash;\n }\n\n\n /**\n * Stake liqETH via DepositManager.\n * @param amount Amount in wei - Keep this as a bigint / string in the caller; avoid JS floats.\n * @returns transaction hash\n */\n async stake(amount: bigint): Promise<string> {\n this.ensureUser();\n\n const walletAddress = await this.signer!.getAddress();\n const amountWei = BigNumber.from(amount);\n\n const result = await this.stakeClient.performStake(amountWei, walletAddress);\n return result.txHash;\n }\n\n\n // TODO\n async unstake(): Promise<string> {\n throw new Error(\"Method not yet implemented.\");\n }\n\n\n /**\n * ETH Prelaunch function to unstake liqEth\n * @param tokenId ReceiptNFT tokenId for the owned NFT that will be burned\n * @param recipient Address to receive the liqEth funds linked to the burned NFT\n * @returns the transaction hash\n */\n async unstakePrelaunch(tokenId: bigint, recipient: string): Promise<string> {\n this.ensureUser();\n\n const tokenIdBigNum = BigNumber.from(tokenId)\n const result = await this.stakeClient.performWithdrawStake(tokenIdBigNum, recipient);\n return result.txHash;\n }\n\n\n async buy(amount: bigint): Promise<string> {\n this.ensureUser();\n\n const buyer = await this.signer!.getAddress();\n\n // ! Hoodi only - check if the mock aggregator price is stale, and if so, update it before submitting the buy request\n // const network = await this.provider.getNetwork();\n // const chainId = network.chainId;\n // const allowedTestChains = new Set([560048]);\n // if (allowedTestChains.has(chainId)) await this.updateMockAggregatorPrice();\n\n let result = await this.pretokenClient.purchasePretokensWithLiqETH(amount, buyer);\n return result && result.txHash ? result.txHash : \"Error - no resulting txHash\";\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 | null> {\n\n try {\n if (!this.signer) return Promise.resolve(null);\n\n const walletAddress = await this.signer!.getAddress();\n\n // 1) Native ETH balance\n const nativeBalance = await this.provider.getBalance(walletAddress);\n const nativeDecimals = this.network?.nativeCurrency?.decimals ?? 18;\n const nativeSymbol = this.network?.nativeCurrency?.symbol ?? 'ETH';\n\n // 2) liqETH ERC-20 balance (actual)\n const liqBalance: ethers.BigNumber = await this.contract.LiqEthToken.balanceOf(walletAddress);\n const liqSymbol = 'Liq' + (this.network?.nativeCurrency?.symbol ?? 'ETH');\n\n // 3) staked liqEth ERC-20 balance (calculate from receipts)\n let stakeReceipts = await this.receiptClient.stakeReceipts(walletAddress);\n\n let stakeBalanceBN = BigNumber.from(0);\n for (let r of stakeReceipts) {\n stakeBalanceBN = stakeBalanceBN.add(BigNumber.from(r.receipt.principal.amount));\n }\n let stakeSharesBN = BigNumber.from(0);\n for (let r of stakeReceipts) {\n stakeSharesBN = stakeSharesBN.add(BigNumber.from(r.receipt.shares.amount));\n }\n\n // 4) WIRE pretoken balance\n const wireBalance: ethers.BigNumber = await this.contract.Pretoken.balanceOf(walletAddress);\n\n // 5) Calculate staking yield \n let currentIndex = BigInt(0);\n let totalShares = BigInt(0);\n let userShares = BigInt(0);\n const indexScale = BigInt(1e27);\n try {\n // These may throw if not implemented on contract\n const [indexBn, totalSharesBn] = await Promise.all([\n this.contract.Depositor.index().catch(() => BigNumber.from(0)),\n this.contract.Depositor.totalShares().catch(() => BigNumber.from(0)),\n ]);\n\n const userSharesBn = stakeSharesBN;\n currentIndex = BigInt(indexBn.toString());\n totalShares = BigInt(totalSharesBn.toString());\n userShares = BigInt(userSharesBn.toString());\n } catch (error) {\n console.log('Error fetching staking index/shares:', error);\n }\n\n // sharesToTokens(userShares, currentIndex) = userShares * currentIndex / indexScale\n let estimatedClaim = BigInt(0);\n let estimatedYield = BigInt(0);\n \n if (userShares > BigInt(0) && currentIndex > BigInt(0)) {\n estimatedClaim = (userShares * currentIndex) / indexScale;\n if (estimatedClaim > stakeBalanceBN.toBigInt()) {\n estimatedYield = estimatedClaim - stakeBalanceBN.toBigInt();\n }\n }\n\n\n const portfolio: Portfolio = {\n native: {\n amount: nativeBalance.toBigInt(),\n decimals: nativeDecimals,\n symbol: nativeSymbol,\n },\n liq: {\n amount: liqBalance.toBigInt(),\n decimals: nativeDecimals,\n symbol: liqSymbol,\n },\n staked: {\n amount: stakeBalanceBN.toBigInt(),\n decimals: nativeDecimals,\n symbol: liqSymbol,\n },\n wire: {\n amount: wireBalance.toBigInt(),\n decimals: 18,\n symbol: '$WIRE',\n },\n\n yield: {\n currentIndex,\n indexScale,\n totalShares,\n userShares,\n estimatedClaim,\n estimatedYield,\n },\n chainID: this.network.chainId\n }\n return portfolio;\n }\n catch (error) {\n // console.log('Error fetching Ethereum portfolio:', error);\n throw error;\n }\n }\n\n /**\n * ETH Prelaunch function to list the Stake ReceiptNFTs owned by a specific user\n * @param address address to query the receipts for\n * @returns array of receipts\n */\n async fetchPrelaunchReceipts(address?: string): Promise<preLaunchReceipt[]> {\n this.ensureUser();\n\n if (address === undefined) address = await this.signer!.getAddress();\n\n //default to stake receipts\n return await this.receiptClient.stakeReceipts(address);\n }\n\n async getOPPMessages(address?: string): Promise<OPPAssertion[]> {\n this.ensureUser();\n\n if (!address) address = await this.signer!.getAddress();\n\n return await this.oppClient.getMessages(address);\n }\n\n // Ensure that signer wallet is available for write operations\n private ensureUser() {\n if (!this.signer) {\n throw new Error(\n 'EthereumStakingClient: write operation requires a wallet-connected Web3 provider',\n );\n }\n }\n\n\n // ---------------------------------------------------------------------\n // READ-ONLY Public Methods\n // ---------------------------------------------------------------------\n\n // Protocol-wide ETH staking APY in percent, e.g. 3.0 => \"3.00%\"\n async getSystemAPY(): Promise<number> {\n // NOTE: despite the name, this value is effectively *annual* BPS on-chain.\n // e.g. 300 => 3% APY\n const annualBpsBn = await this.contract.DepositManager.dailyRateBPS();\n const annualBps = annualBpsBn.toNumber(); // e.g. 300 for 3%\n\n // Convert basis points (1/100 of 1%) to percent:\n // 10,000 bps = 100% ⇒ 100 bps = 1% ⇒ divide by 100.\n const apyPercent = annualBps / 100;\n\n return apyPercent; // 3 => \"3.00%\"\n }\n\n // Protocol fee charged for deposit from Native to LIQ\n async getDepositFee(amountWei: bigint): Promise<bigint> {\n const feeBn: BigNumber = await this.contract.DepositManager.procFee(amountWei);\n return BigInt(feeBn.toString());\n }\n\n async getOPPStatus(): Promise<any> {\n return await this.oppClient.getStatus();\n }\n\n async getEthStats(): Promise<any> {\n let withdrawDelay = await this.contract.WithdrawalQueue.withdrawDelay();\n let minDeposit = await this.contract.DepositManager.minDeposit();\n let rewardCooldown = await this.contract.DepositManager.rewardCooldown();\n\n return {\n withdrawDelay,\n minDeposit,\n rewardCooldown,\n }\n }\n\n /**\n * Program-level prelaunch WIRE / tranche snapshot for Ethereum\n * \n * SUPPORTS READ-ONLY ACcESS\n */\n async getTrancheSnapshot(chainID: ChainID): Promise<TrancheSnapshot> {\n try {\n const blockNumber = await this.provider.getBlockNumber();\n const blockTag = { blockTag: blockNumber };\n\n // Fetch all required contract data\n const [totalSharesBn, indexBn, trancheNumberBn, trancheSupplyBn, tranchePriceUsdBn, totalSupplyBn, supplyGrowthBps, priceGrowthCents, minPriceUsd, maxPriceUsd] = await Promise.all([\n this.contract.Depositor.totalShares(blockTag),\n this.contract.Depositor.index(blockTag),\n this.contract.Pretoken.trancheNumber(blockTag),\n this.contract.Pretoken.trancheSupply(blockTag),\n this.contract.Pretoken.tranchePriceUsd(blockTag),\n this.contract.Pretoken.totalSupply(blockTag),\n this.contract.Pretoken.supplyGrowthBps(blockTag),\n this.contract.Pretoken.priceIncrementUsd(blockTag),\n this.contract.EthUsdPriceConsumer.MIN_PRICE(),\n this.contract.EthUsdPriceConsumer.MAX_PRICE(),\n ]);\n\n const totalTrancheSupply = BigInt(totalSupplyBn.toString()) / BigInt(1e10);\n const currentTrancheSupply = BigInt(trancheSupplyBn.toString()) / BigInt(1e10);\n\n // fetch price and timestamp from aggregator\n // const [roundId, answer, startedAt, updatedAt, answeredInRound] = await this.contract.MockAggregator.latestRoundData();\n //originally fetched ethPrice from aggregator - pulling from EthUsdPriceConsumer instead - this is where the actual price gets pulled from when purchasing pretokens.\n // let ethPriceUsd: bigint = BigInt(answer.toString());)\n\n let ethPriceUsdBn = await this.contract.EthUsdPriceConsumer.getPrice18Decimals();\n let ethPriceUsd: bigint = BigInt(ethPriceUsdBn.toString()) / BigInt(1e10);\n\n // let nativePriceTimestamp: number = Number(updatedAt);\n\n const initialTrancheSupply = BigInt(INITIAL_TRANCHE_SUPPLY) * BigInt(1e8);\n\n return buildEthereumTrancheSnapshot({\n chainID,\n totalSharesBn,\n indexBn,\n trancheNumberBn,\n currentTrancheSupply,\n tranchePriceUsdBn,\n totalTrancheSupply,\n initialTrancheSupply,\n supplyGrowthBps,\n priceGrowthCents,\n minPriceUsd,\n maxPriceUsd,\n ethPriceUsd,\n });\n }\n catch (err: any) {\n throw new Error(`Error fetching Ethereum tranche snapshot: ${err?.message || err}`);\n }\n }\n\n /**\n * Estimate a conservative native ETH buffer (in wei) to leave in the wallet\n * so the user can pay gas for the current deposit and at least one more tx.\n *\n * Typical usage in UI:\n * const buffer = await client.estimateGasBuffer();\n * const maxSpendable = balanceWei > buffer ? balanceWei - buffer : 0n;\n *\n * @param options.txCount How many transactions to cover (default 2: deposit + 1 more)\n * @param options.safetyMultiplier Additional safety multiplier on top of txCount (default 1.5x)\n * @param options.minBufferWei Optional override minimum buffer (defaults ~0.002 ETH)\n */\n async getDepositBuffer(options?: {\n txCount?: number;\n safetyMultiplier?: number;\n minBufferWei?: bigint;\n balanceOverrideLamports?: bigint;\n }): Promise<bigint> {\n this.ensureUser();\n\n const walletAddress = await this.signer!.getAddress();\n\n // 1) Estimate a baseline gas usage using a simple self-transfer.\n // This is cheap and doesn't depend on your contract ABI at all.\n const baseGas = await this.provider.estimateGas({\n from: walletAddress,\n to: walletAddress,\n value: ethers.constants.Zero,\n });\n\n // 2) Fetch current gas price / max fee per gas.\n const feeData = await this.provider.getFeeData();\n let gasPrice =\n feeData.maxFeePerGas ??\n feeData.gasPrice ??\n ethers.utils.parseUnits('20', 'gwei'); // conservative fallback\n\n // 3) How many txs do we want to cover?\n // Default: 2 (deposit + one extra action such as stake or small follow-up).\n const txCount = options?.txCount ?? 2;\n\n // We also assume that contract interactions are more expensive than a simple transfer.\n // Use a multiplier (e.g., 5x) on baseGas to approximate a more complex tx.\n const COMPLEX_TX_MULTIPLIER = 5; // tuning knob\n const totalGasUnits = baseGas\n .mul(COMPLEX_TX_MULTIPLIER)\n .mul(txCount);\n\n const baseCost = totalGasUnits.mul(gasPrice);\n\n // 4) Safety multiplier on top of that (e.g. 1.5x).\n const safetyMultiplier = options?.safetyMultiplier ?? 1.5;\n const safetyScaled = Math.round(safetyMultiplier * 100); // e.g. 150\n\n const bufferedCost = baseCost\n .mul(safetyScaled)\n .div(100); // apply safety factor\n\n let bufferWei = bufferedCost.toBigInt();\n\n // 5) Enforce a minimum floor (e.g. ~0.002 ETH).\n const defaultMinBufferWei = BigInt(2_000_000_000_000_000); // 0.002 ETH\n const minBufferWei = options?.minBufferWei ?? defaultMinBufferWei;\n\n if (bufferWei < minBufferWei) {\n bufferWei = minBufferWei;\n }\n\n return bufferWei;\n }\n\n // ---------------------------------------------------------------------\n // Internal ETH Staking client helper functions\n // ---------------------------------------------------------------------\n\n // ! This is a temporary measure for Hoodi testnet because there is no aggregator deployed\n // private async updateMockAggregatorPrice() {\n // const aggregator = this.contract.MockAggregator;\n\n // // read latest round & compute age\n // const [roundId, answer, startedAt, updatedAt, answeredInRound] = await aggregator.latestRoundData();\n // const now = (await this.provider.getBlock(\"latest\")).timestamp;\n // const ageSec = Number(now) - Number(updatedAt);\n\n // const ONE_HOUR = 1 * 3600;\n // // const ONE_HOUR = 10;\n // if (ageSec > ONE_HOUR) {\n // // safety check - only run in non-production contexts\n // const network = await this.provider.getNetwork();\n // const chainId = network.chainId;\n // const allowedTestChains = new Set([560048]);\n // if (!allowedTestChains.has(chainId)) {\n // console.warn(`MockAggregator is stale (${ageSec}s) but chainId ${chainId} is not a test/local network — skipping update.`);\n // return;\n // }\n\n\n // //fetch the current ETH / USD price\n // const res = await fetch('https://api.coingecko.com/api/v3/simple/price?ids=ethereum&vs_currencies=usd');\n // const data = await res.json();\n // const ethUsd = data.ethereum.usd;\n\n // const currentEthPrice = ethers.utils.parseUnits(ethUsd.toString(), 8);\n\n // try {\n // //update to be intentionally stale\n // // const alttx = await aggregator.updateStale(currentEthPrice, now - 7200);\n // // const altreceipt = await alttx.wait(1);\n // // console.log('stale update receipt', altreceipt)\n\n // //update answer with current timestamp\n // const tx = await aggregator.updateAnswer(currentEthPrice);\n // const txreceipt = await tx.wait(1);\n // // console.log('MockAggregator answer updated - receipt:', txreceipt)\n // } catch (err: any) {\n // console.error('MockAggregator updateAnswer failed', err?.message || err);\n // }\n // } else {\n // console.log(`MockAggregator updated ${ageSec}s ago — no update needed`);\n // }\n // }\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 // console.log('STAKER INIT', config);\n\n config.forEach((cfg) => {\n switch (cfg.network.chainId) {\n case SolChainID.Mainnet:\n case SolChainID.Devnet:\n this.clients.set(cfg.network.chainId, new SolanaStakingClient(cfg));\n break;\n\n case EvmChainID.Ethereum:\n case EvmChainID.Hoodi:\n this.clients.set(cfg.network.chainId, new EthereumStakingClient(cfg));\n break;\n\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 const hasClient = this.clients.has(chainID);\n\n if (!hasClient) {\n console.warn(`[Staker] setChain: no client configured for chain ${chainID}`);\n return false;\n }\n\n this.selectedChainID = chainID;\n return true;\n }\n}","import { BigNumber, ethers } from 'ethers';\nimport { BalanceView } from '../../types';\n\nexport const CONTRACT_NAMES = [\n // LiqETH contracts\n \"LiqEthAuthority\",\n \"BeaconState\",\n \"WithdrawalQueue\",\n \"LiqEthToken\",\n \"Accounting\",\n \"DepositManager\",\n \"WithdrawalVault\",\n \"StakingModule\",\n // \"YieldOracle\",\n\n //Outpost contracts\n \"OutpostManagerAuthority\",\n \"iodata\",\n \"Base58\",\n \"sysio_merkle\",\n \"ReceiptNFT\",\n \"Pool\",\n \"OutpostManager\",\n \"sysio_write\",\n \"EthUsdPriceConsumer\",\n \"BAR\",\n \"OPPCommon\",\n \"OPP\",\n \"Pretoken\",\n \"OPPInbound\",\n \"Depositor\",\n \"MockAggregator\",\n] as const;\n\nexport type ContractName = typeof CONTRACT_NAMES[number];\nexport type AddressBook = Record<ContractName, string>;\n\n\ninterface Result {\n /** EVM transaction hash */\n txHash: string;\n /** Full receipt, if you want it */\n receipt: ethers.providers.TransactionReceipt;\n}\n\n\nexport interface DepositEvent {\n user: string;\n netEth: BigNumber;\n fee: BigNumber;\n shares: BigNumber;\n}\n\nexport interface DepositResult extends Result {\n /** Parsed Deposited event, if present */\n deposited?: DepositEvent;\n}\n\nexport interface WithdrawRequestedEvent {\n user: string;\n ethAmount: BigNumber;\n nftId: BigNumber;\n readyAt: string;\n}\n\nexport interface WithdrawResult extends Result {\n /** Parsed WithdrawRequested event, if present */\n withdrawRequested?: WithdrawRequestedEvent;\n}\n\n\nexport interface StakedEvent {\n user: string;\n amountLiq: BigNumber;\n shares: BigNumber;\n tokenId: BigNumber;\n}\n\nexport interface StakedResult extends Result {\n /** Parsed Staked event, if present */\n staked?: StakedEvent;\n}\n\n\nexport interface WithdrawnStakeEvent {\n user: string;\n tokenId: BigNumber;\n tokenOut: BigNumber;\n}\nexport interface WithdrawnStakeResult extends Result {\n /** Parsed WithdrawnStake event, if present */\n withdrawnstake?: WithdrawnStakeEvent;\n\n}\n\nexport interface SharesBurnedEvent {\n from: string;\n shares: BigNumber;\n tokenValue: BigNumber;\n}\n\nexport interface preLaunchReceipt {\n tokenId: bigint;\n receipt: {\n account: string,\n currency: number,\n kind: number,\n indexAtMint: BalanceView,\n principal: BalanceView,\n shares: BalanceView,\n timestamp: string,\n }\n}\n\nexport interface ClaimedEvent {\n user: string;\n amount: BigNumber;\n}\n\n\nexport interface WithdrawReceipt {\n tokenId: bigint;\n receipt: {\n ethAmount: BigNumber;\n ethBalance: BalanceView;\n readyAt: number;\n }\n}"],"names":["mainnetLiqsolCoreIDL","mainnetLiqSolTokenIDL","mainnetValidatorLeaderboardIDL","devnetLiqsolCoreIDL","devnetLiqSolTokenIDL","devnetValidatorLeaderboardIDL","INDEX_SCALE","growSupplyOnce","shrinkSupplyOnce","SolPubKey","PublicKey","tokenId","SupportedEvmChainID","SupportedSolChainID","PurchaseAsset","ReceiptNFTKind"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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AA;AAj+BxC,IAAM,mBAAN,GAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC5BA,MAAM,WAAW,aAAc,CAAA,IAAA;AAC/B,MAAM,YAAY,cAAe,CAAA,IAAA;AACjC,MAAM,aAAa,eAAgB,CAAA,IAAA;AAUnC,MAAM,iBAAiC,GAAA;AAAA,EAE1C,eAAiB,EAAA,4CAAA;AAAA,EACjB,WAAa,EAAA,4CAAA;AAAA,EACb,eAAiB,EAAA,4CAAA;AAAA,EACjB,WAAa,EAAA,4CAAA;AAAA,EACb,UAAY,EAAA,4CAAA;AAAA,EACZ,cAAgB,EAAA,4CAAA;AAAA,EAChB,eAAiB,EAAA,4CAAA;AAAA,EACjB,aAAe,EAAA,4CAAA;AAAA,EAIf,uBAAyB,EAAA,4CAAA;AAAA,EACzB,MAAQ,EAAA,4CAAA;AAAA,EACR,MAAQ,EAAA,4CAAA;AAAA,EACR,YAAc,EAAA,4CAAA;AAAA,EACd,UAAY,EAAA,4CAAA;AAAA,EACZ,mBAAqB,EAAA,4CAAA;AAAA,EACrB,IAAM,EAAA,4CAAA;AAAA,EACN,cAAgB,EAAA,4CAAA;AAAA,EAChB,WAAa,EAAA,4CAAA;AAAA,EACb,QAAU,EAAA,4CAAA;AAAA,EACV,GAAK,EAAA,4CAAA;AAAA,EACL,SAAW,EAAA,4CAAA;AAAA,EACX,GAAK,EAAA,4CAAA;AAAA,EACL,SAAW,EAAA,4CAAA;AAAA,EACX,UAAY,EAAA,4CAAA;AAAA,EAGZ,cAAgB,EAAA,4CAAA;AACpB,EAAA;AAMO,MAAM,eAA+B,GAAA;AAAA,EAExC,eAAiB,EAAA,4CAAA;AAAA,EACjB,WAAa,EAAA,4CAAA;AAAA,EACb,eAAiB,EAAA,4CAAA;AAAA,EACjB,WAAa,EAAA,4CAAA;AAAA,EACb,UAAY,EAAA,4CAAA;AAAA,EACZ,cAAgB,EAAA,4CAAA;AAAA,EAChB,eAAiB,EAAA,4CAAA;AAAA,EACjB,aAAe,EAAA,4CAAA;AAAA,EAIf,uBAAyB,EAAA,4CAAA;AAAA,EACzB,MAAQ,EAAA,4CAAA;AAAA,EACR,MAAQ,EAAA,4CAAA;AAAA,EACR,YAAc,EAAA,4CAAA;AAAA,EACd,UAAY,EAAA,4CAAA;AAAA,EACZ,mBAAqB,EAAA,4CAAA;AAAA,EACrB,IAAM,EAAA,4CAAA;AAAA,EACN,cAAgB,EAAA,4CAAA;AAAA,EAChB,WAAa,EAAA,4CAAA;AAAA,EACb,QAAU,EAAA,4CAAA;AAAA,EACV,GAAK,EAAA,4CAAA;AAAA,EACL,SAAW,EAAA,4CAAA;AAAA,EACX,GAAK,EAAA,4CAAA;AAAA,EACL,SAAW,EAAA,4CAAA;AAAA,EACX,UAAY,EAAA,4CAAA;AAAA,EAGZ,cAAgB,EAAA,4CAAA;AACpB,EAAA;AAEO,MAAM,qBAAkE,GAAA;AAAA,EAC3E,CAAC,UAAW,CAAA,QAAQ,GAAG,iBAAA;AAAA,EACvB,CAAC,UAAW,CAAA,KAAK,GAAG,eAAA;AACxB,EAAA;AAGO,MAAM,SAAyB,GAAA,kBAAA;AAatC,SAAS,eAAe,SAAiD,EAAA;AACrE,EAAO,OAAA;AAAA,IAEH,eAAiB,EAAA;AAAA,MACb,SAAS,SAAU,CAAA,eAAA;AAAA,MACnB,KAAK,cAAe,CAAA,GAAA;AAAA,KACxB;AAAA,IACA,WAAa,EAAA;AAAA,MACT,SAAS,SAAU,CAAA,WAAA;AAAA,MACnB,KAAK,mBAAoB,CAAA,GAAA;AAAA,KAC7B;AAAA,IACA,eAAiB,EAAA;AAAA,MACb,SAAS,SAAU,CAAA,eAAA;AAAA,MACnB,KAAK,uBAAwB,CAAA,GAAA;AAAA,KACjC;AAAA,IACA,WAAa,EAAA;AAAA,MACT,SAAS,SAAU,CAAA,WAAA;AAAA,MACnB,KAAK,cAAe,CAAA,GAAA;AAAA,KACxB;AAAA,IACA,UAAY,EAAA;AAAA,MACR,SAAS,SAAU,CAAA,UAAA;AAAA,MACnB,KAAK,kBAAmB,CAAA,GAAA;AAAA,KAC5B;AAAA,IACA,cAAgB,EAAA;AAAA,MACZ,SAAS,SAAU,CAAA,cAAA;AAAA,MACnB,KAAK,sBAAuB,CAAA,GAAA;AAAA,KAChC;AAAA,IACA,eAAiB,EAAA;AAAA,MACb,SAAS,SAAU,CAAA,eAAA;AAAA,MACnB,KAAK,uBAAwB,CAAA,GAAA;AAAA,KACjC;AAAA,IACA,aAAe,EAAA;AAAA,MACX,SAAS,SAAU,CAAA,aAAA;AAAA,MACnB,KAAK,qBAAsB,CAAA,GAAA;AAAA,KAC/B;AAAA,IAOA,uBAAyB,EAAA;AAAA,MACrB,SAAS,SAAU,CAAA,uBAAA;AAAA,MACnB,KAAK,+BAAgC,CAAA,GAAA;AAAA,KACzC;AAAA,IACA,MAAQ,EAAA;AAAA,MACJ,SAAS,SAAU,CAAA,MAAA;AAAA,MACnB,KAAK,cAAe,CAAA,GAAA;AAAA,KACxB;AAAA,IACA,MAAQ,EAAA;AAAA,MACJ,SAAS,SAAU,CAAA,MAAA;AAAA,MACnB,KAAK,cAAe,CAAA,GAAA;AAAA,KACxB;AAAA,IACA,YAAc,EAAA;AAAA,MACV,SAAS,SAAU,CAAA,YAAA;AAAA,MACnB,KAAK,oBAAqB,CAAA,GAAA;AAAA,KAC9B;AAAA,IACA,UAAY,EAAA;AAAA,MACR,SAAS,SAAU,CAAA,UAAA;AAAA,MACnB,KAAK,kBAAmB,CAAA,GAAA;AAAA,KAC5B;AAAA,IACA,IAAM,EAAA;AAAA,MACF,SAAS,SAAU,CAAA,IAAA;AAAA,MACnB,KAAK,YAAa,CAAA,GAAA;AAAA,KACtB;AAAA,IACA,cAAgB,EAAA;AAAA,MACZ,SAAS,SAAU,CAAA,cAAA;AAAA,MACnB,KAAK,sBAAuB,CAAA,GAAA;AAAA,KAChC;AAAA,IACA,WAAa,EAAA;AAAA,MACT,SAAS,SAAU,CAAA,WAAA;AAAA,MACnB,KAAK,mBAAoB,CAAA,GAAA;AAAA,KAC7B;AAAA,IACA,mBAAqB,EAAA;AAAA,MACjB,SAAS,SAAU,CAAA,mBAAA;AAAA,MACnB,KAAK,2BAA4B,CAAA,GAAA;AAAA,KACrC;AAAA,IACA,GAAK,EAAA;AAAA,MACD,SAAS,SAAU,CAAA,GAAA;AAAA,MACnB,KAAK,WAAY,CAAA,GAAA;AAAA,KACrB;AAAA,IACA,SAAW,EAAA;AAAA,MACP,SAAS,SAAU,CAAA,SAAA;AAAA,MACnB,KAAK,iBAAkB,CAAA,GAAA;AAAA,KAC3B;AAAA,IACA,GAAK,EAAA;AAAA,MACD,SAAS,SAAU,CAAA,GAAA;AAAA,MACnB,KAAK,WAAY,CAAA,GAAA;AAAA,KACrB;AAAA,IACA,QAAU,EAAA;AAAA,MACN,SAAS,SAAU,CAAA,QAAA;AAAA,MACnB,KAAK,gBAAiB,CAAA,GAAA;AAAA,KAC1B;AAAA,IACA,UAAY,EAAA;AAAA,MACR,SAAS,SAAU,CAAA,UAAA;AAAA,MACnB,KAAK,kBAAmB,CAAA,GAAA;AAAA,KAC5B;AAAA,IACA,SAAW,EAAA;AAAA,MACP,SAAS,SAAU,CAAA,SAAA;AAAA,MACnB,KAAK,iBAAkB,CAAA,GAAA;AAAA,KAC3B;AAAA,IAEA,cAAgB,EAAA;AAAA,MACZ,SAAS,SAAU,CAAA,cAAA;AAAA,MACnB,KAAK,kBAAmB,CAAA,GAAA;AAAA,KAC5B;AAAA,GACJ,CAAA;AACJ,CAAA;AAEO,MAAM,kBAA2E,GAAA;AAAA,EACpF,CAAC,UAAA,CAAW,QAAQ,GAAG,eAAe,iBAAiB,CAAA;AAAA,EACvD,CAAC,UAAA,CAAW,KAAK,GAAG,eAAe,eAAe,CAAA;AACtD,EAAA;AAeO,MAAM,uBAAwB,CAAA;AAAA,EASjC,YAAY,IAAuB,EAAA;AAHnC,IAAA,IAAA,CAAgB,WAAqD,EAAC,CAAA;AACtE,IAAA,IAAA,CAAgB,QAAyD,EAAC,CAAA;AAGtE,IAAA,IAAA,CAAK,WAAW,IAAK,CAAA,QAAA,CAAA;AACrB,IAAA,IAAA,CAAK,SAAS,IAAK,CAAA,MAAA,CAAA;AACnB,IAAA,IAAA,CAAK,UAAU,IAAK,CAAA,OAAA,CAAA;AAEpB,IAAM,MAAA,SAAA,GAAY,kBAAmB,CAAA,IAAA,CAAK,OAAO,CAAA,CAAA;AACjD,IAAA,IAAI,CAAC,SAAW,EAAA;AACZ,MAAA,MAAM,IAAI,KAAA,CAAM,CAA2B,wBAAA,EAAA,IAAA,CAAK,OAAO,CAAE,CAAA,CAAA,CAAA;AAAA,KAC7D;AACA,IAAA,IAAA,CAAK,eAAkB,GAAA,SAAA,CAAA;AAEvB,IAAC,OAAO,IAAK,CAAA,SAAS,CAAqB,CAAA,OAAA,CAAQ,CAAC,IAAS,KAAA;AACzD,MAAA,MAAM,EAAE,OAAA,EAAS,GAAI,EAAA,GAAI,UAAU,IAAI,CAAA,CAAA;AACvC,MAAA,IAAA,CAAK,MAAM,IAAI,CAAA,GAAI,IAAI,MAAO,CAAA,KAAA,CAAM,UAAU,GAAG,CAAA,CAAA;AACjD,MAAA,IAAA,CAAK,QAAS,CAAA,IAAI,CAAI,GAAA,IAAI,MAAO,CAAA,QAAA;AAAA,QAC7B,OAAA;AAAA,QACA,GAAA;AAAA,QACA,IAAA,CAAK,UAAU,IAAK,CAAA,QAAA;AAAA,OACxB,CAAA;AAAA,KACH,CAAA,CAAA;AAAA,GACL;AAAA,EAGO,WAAW,IAA4B,EAAA;AAC1C,IAAO,OAAA,IAAA,CAAK,eAAgB,CAAA,IAAI,CAAE,CAAA,OAAA,CAAA;AAAA,GACtC;AAAA,EAGO,YAAY,IAA8B,EAAA;AAC7C,IAAA,MAAM,EAAE,OAAS,EAAA,GAAA,EAAQ,GAAA,IAAA,CAAK,gBAAgB,IAAI,CAAA,CAAA;AAClD,IAAA,OAAO,IAAI,QAAA,CAAS,OAAS,EAAA,GAAA,EAAK,KAAK,QAAQ,CAAA,CAAA;AAAA,GACnD;AAAA,EAGO,SAAS,IAA8B,EAAA;AAC1C,IAAA,IAAI,CAAC,IAAK,CAAA,MAAA,EAAc,MAAA,IAAI,MAAM,qCAAqC,CAAA,CAAA;AACvE,IAAA,MAAM,EAAE,OAAS,EAAA,GAAA,EAAQ,GAAA,IAAA,CAAK,gBAAgB,IAAI,CAAA,CAAA;AAClD,IAAA,OAAO,IAAI,QAAA,CAAS,OAAS,EAAA,GAAA,EAAK,KAAK,MAAM,CAAA,CAAA;AAAA,GACjD;AAAA,EAGA,MAAM,UAAa,GAAA;AACf,IAAO,OAAA,IAAA,CAAK,UAAU,UAAW,EAAA,CAAA;AAAA,GACrC;AAAA,EAGO,iBAAoC,GAAA;AACvC,IAAO,OAAA,MAAA,CAAO,IAAK,CAAA,IAAA,CAAK,eAAe,CAAA,CAAA;AAAA,GAC3C;AAAA,EAGO,aAAa,IAA4C,EAAA;AAC5D,IAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,KAAA,CAAM,IAAI,CAAA,CAAA;AAC7B,IAAA,IAAI,CAAC,KAAO,EAAA,MAAM,IAAI,KAAM,CAAA,CAAA,8BAAA,EAAiC,IAAI,CAAE,CAAA,CAAA,CAAA;AACnE,IAAO,OAAA,KAAA,CAAA;AAAA,GACX;AAAA,EAGO,YAAY,IAAqC,EAAA;AACpD,IAAM,MAAA,GAAA,GAAM,IAAK,CAAA,QAAA,CAAS,IAAI,CAAA,CAAA;AAC9B,IAAA,IAAI,CAAC,GAAK,EAAA,MAAM,IAAI,KAAM,CAAA,CAAA,6BAAA,EAAgC,IAAI,CAAE,CAAA,CAAA,CAAA;AAChE,IAAO,OAAA,GAAA,CAAA;AAAA,GACX;AAAA,EAGA,IAAW,aAAwC,GAAA;AAC/C,IAAA,MAAM,MAAa,EAAC,CAAA;AAEpB,IAAA,MAAM,YAAe,GAAA;AAAA,MACjB,aAAA;AAAA,MACA,cAAA;AAAA,MACA,eAAA;AAAA,KAUJ,CAAA;AAEA,IAAa,YAAA,CAAA,OAAA,CAAQ,CAAC,QAAa,KAAA;AAC/B,MAAI,IAAA,QAAA,IAAY,SAAS,GAAK,EAAA;AAC1B,QAAI,GAAA,CAAA,IAAA,CAAK,GAAG,QAAA,CAAS,GAAG,CAAA,CAAA;AAAA,OAC5B;AAAA,KACH,CAAA,CAAA;AAED,IAAM,MAAA,IAAA,QAAW,GAAY,EAAA,CAAA;AAC7B,IAAA,MAAM,QAAe,EAAC,CAAA;AACtB,IAAA,KAAA,MAAW,QAAQ,GAAK,EAAA;AACpB,MAAI,IAAA;AACA,QAAA,MAAM,IAAO,GAAA,MAAA,CAAO,KAAM,CAAA,QAAA,CAAS,KAAK,IAAI,CAAA,CAAA;AAC5C,QAAA,MAAM,GAAM,GAAA,CAAA,EAAG,IAAK,CAAA,IAAI,IAAI,IAAK,CAAA,MAAA;AAAA,UAC7B,MAAA,CAAO,MAAM,WAAY,CAAA,IAAA;AAAA,SAC5B,GAAG,WAAY,EAAA,CAAA;AAChB,QAAA,IAAI,CAAC,IAAA,CAAK,GAAI,CAAA,GAAG,CAAG,EAAA;AAChB,UAAA,IAAA,CAAK,IAAI,GAAG,CAAA,CAAA;AACZ,UAAA,KAAA,CAAM,KAAK,IAAI,CAAA,CAAA;AAAA,SACnB;AAAA,OACI,CAAA,MAAA;AAAA,OAER;AAAA,KACJ;AAEA,IAAA,OAAO,IAAI,MAAA,CAAO,KAAM,CAAA,SAAA,CAAU,KAAK,CAAA,CAAA;AAAA,GAC3C;AAAA,EAGO,WAAW,UAAsC,EAAA;AACpD,IAAI,IAAA;AACA,MAAO,OAAA,IAAA,CAAK,aAAc,CAAA,UAAA,CAAW,UAAU,CAAA,CAAA;AAAA,KAC3C,CAAA,MAAA;AACJ,MAAA,MAAM,IAAI,KAAA,CAAM,CAA+B,4BAAA,EAAA,UAAU,CAAE,CAAA,CAAA,CAAA;AAAA,KAC/D;AAAA,GACJ;AACJ;;AC5YY,OAAO,GAAM,EAAA;AAclB,SAAS,qBAAqB,GAA+B,EAAA;AAEhE,EAAI,IAAA,GAAA,CAAI,SAAa,IAAA,GAAA,CAAI,SAAW,EAAA;AAChC,IAAA,MAAM,QAAgC,GAAA;AAAA,MAClC,MAAM,GAAI,CAAA,SAAA;AAAA,MACV,WAAW,GAAI,CAAA,cAAA;AAAA,MACf,IAAA,EAAM,IAAI,SAAU,CAAA,GAAA;AAAA,QAAI,CAAC,GACrB,KAAA,GAAA,IAAO,GAAI,CAAA,YAAA,GAAe,MAAO,CAAA,SAAA,CAAU,IAAK,CAAA,GAAG,CAAE,CAAA,QAAA,EAAa,GAAA,GAAA;AAAA,OACtE;AAAA,MACA,MAAM,GAAI,CAAA,IAAA;AAAA,MACV,QAAQ,GAAI,CAAA,MAAA;AAAA,MACZ,MAAM,GAAI,CAAA,IAAA;AAAA,MACV,GAAK,EAAA,GAAA;AAAA,KACT,CAAA;AACA,IAAQ,OAAA,CAAA,KAAA,CAAM,0BAA0B,QAAQ,CAAA,CAAA;AAChD,IAAO,OAAA,QAAA,CAAA;AAAA,GACJ,MAAA;AACH,IAAQ,OAAA,CAAA,KAAA,CAAM,mBAAmB,GAAG,CAAA,CAAA;AACpC,IAAO,OAAA;AAAA,MACH,GAAA,EAAK,OAAO,GAAQ,KAAA,QAAA,GAAW,MAAO,GAAK,EAAA,OAAA,IAAW,OAAO,GAAG,CAAA;AAAA,KACpE,CAAA;AAAA,GACJ;AACJ,CAAA;AASsB,eAAA,eAAA,CAAgB,KAAsB,QAAgC,EAAA;AACxF,EAAA,MAAM,YAAiB,EAAC,CAAA;AACxB,EAAI,IAAA;AACA,IAAA,IAAI,aAAa,KAAW,CAAA,EAAA;AACxB,MAAI,IAAA;AACA,QAAA,MAAM,SAAY,GAAA,MAAM,GAAI,CAAA,WAAA,CAAY,aAAc,EAAA,CAAA;AACtD,QAAM,MAAA,MAAA,GAAS,MAAO,CAAA,SAAA,CAAU,IAAK,CAAA,SAAS,EAAE,GAAI,CAAA,EAAE,CAAE,CAAA,GAAA,CAAI,EAAE,CAAA,CAAA;AAC9D,QAAA,SAAA,CAAU,QAAW,GAAA,MAAA,CAAA;AACrB,QAAQ,OAAA,CAAA,GAAA,CAAI,+BAA+B,SAAU,CAAA,QAAA,IAAY,WAAa,EAAA,SAAA,CAAU,QAAS,CAAA,QAAA,EAAU,CAAA,CAAA;AAAA,eACtG,MAAQ,EAAA;AAEb,QAAQ,OAAA,CAAA,IAAA,CAAK,wFAAwF,MAAM,CAAA,CAAA;AAC3G,QAAA,SAAA,CAAU,QAAW,GAAA,MAAA,CAAO,SAAU,CAAA,IAAA,CAAK,GAAO,CAAA,CAAA;AAAA,OACtD;AAAA,KACG,MAAA;AACH,MAAA,SAAA,CAAU,QAAW,GAAA,MAAA,CAAO,SAAU,CAAA,IAAA,CAAK,QAAQ,CAAA,CAAA;AACnD,MAAA,OAAA,CAAQ,GAAI,CAAA,gDAAA,EAAkD,SAAU,CAAA,QAAA,CAAS,UAAU,CAAA,CAAA;AAAA,KAC/F;AAEA,IAAA,MAAM,EAAK,GAAA,MAAM,GAAI,CAAA,aAAA,CAAc,SAAS,CAAA,CAAA;AAC5C,IAAA,OAAA,CAAQ,GAAI,CAAA,uBAAA,EAAyB,EAAG,CAAA,IAAA,EAAM,cAAc,SAAS,CAAA,CAAA;AAErE,IAAM,MAAA,OAAA,GAAU,MAAM,EAAA,CAAG,IAAK,EAAA,CAAA;AAC9B,IAAQ,OAAA,CAAA,GAAA,CAAI,+BAAiC,EAAA,OAAA,CAAQ,WAAW,CAAA,CAAA;AAChE,IAAO,OAAA,OAAA,CAAA;AAAA,WACF,GAAU,EAAA;AAEf,IAAA,OAAA,CAAQ,KAAM,CAAA,wBAAA,EAA0B,GAAK,EAAA,OAAA,IAAW,GAAG,CAAA,CAAA;AAG3D,IAAM,MAAA,GAAA,GAAM,GAAK,EAAA,KAAA,EAAO,IAAQ,IAAA,GAAA,EAAK,IAAQ,IAAA,GAAA,EAAK,IAAQ,IAAA,GAAA,EAAK,OAAW,IAAA,GAAA,EAAK,WAAe,IAAA,GAAA,CAAA;AAC9F,IAAQ,OAAA,CAAA,KAAA,CAAM,6BAA6B,GAAG,CAAA,CAAA;AAG9C,IAAI,IAAA;AACA,MAAM,MAAA,MAAA,GAAS,qBAAqB,GAAG,CAAA,CAAA;AACvC,MAAA,OAAA,CAAQ,KAAM,CAAA,4BAAA,EAA8B,MAAO,CAAA,IAAA,EAAM,OAAO,IAAI,CAAA,CAAA;AAAA,aAC/D,QAAU,EAAA;AAEf,MAAI,IAAA;AACA,QAAM,MAAA,GAAA,GAAO,OAAO,GAAQ,KAAA,QAAA,GAAY,MAAO,GAAO,IAAA,GAAA,CAAI,IAAQ,GAAA,GAAA,CAAI,IAAO,GAAA,IAAA,CAAA;AAC7E,QAAA,IAAI,OAAO,OAAO,GAAA,KAAQ,YAAY,GAAI,CAAA,UAAA,CAAW,YAAY,CAAG,EAAA;AAChE,UAAA,MAAM,MAAS,GAAA,MAAA,CAAO,KAAM,CAAA,eAAA,CAAgB,OAAO,CAAC,QAAQ,CAAG,EAAA,IAAA,GAAO,GAAI,CAAA,KAAA,CAAM,EAAE,CAAC,EAAE,CAAC,CAAA,CAAA;AACtF,UAAQ,OAAA,CAAA,KAAA,CAAM,+BAA+B,MAAM,CAAA,CAAA;AAAA,SAChD,MAAA;AACH,UAAA,OAAA,CAAQ,MAAM,4EAA4E,CAAA,CAAA;AAAA,SAC9F;AAAA,eACK,WAAa,EAAA;AAClB,QAAQ,OAAA,CAAA,KAAA,CAAM,yCAAyC,WAAW,CAAA,CAAA;AAAA,OACtE;AAAA,KACJ;AAGA,IAAA,IAAI,KAAK,OAAS,EAAA,OAAA,CAAQ,KAAM,CAAA,uBAAA,EAAyB,IAAI,OAAO,CAAA,CAAA;AACpE,IAAA,IAAI,KAAK,WAAa,EAAA,OAAA,CAAQ,KAAM,CAAA,kCAAA,EAAoC,IAAI,WAAW,CAAA,CAAA;AAGvF,IAAM,MAAA,GAAA,CAAA;AAAA,GACV;AACJ,CAAA;AAGA,MAAM,SAAA,GAAY,OAAO,GAAM,CAAA,CAAA;AAG/B,MAAM,iBAAA,GAAoB,OAAO,IAAyB,CAAA,CAAA;AAE1D,MAAM,gBAAA,GAAmB,OAAO,GAAW,CAAA,CAAA;AAE3C,MAAM,iBAAiB,iBAAoB,GAAA,gBAAA,CAAA;AAG3C,SAAS,cAAA,CAAe,OAAe,SAA2B,EAAA;AAC9D,EAAM,MAAA,CAAA,GAAI,OAAO,SAAS,CAAA,CAAA;AAC1B,EAAQ,OAAA,KAAA,IAAS,YAAY,CAAM,CAAA,GAAA,SAAA,CAAA;AACvC,CAAA;AAEA,SAAS,gBAAA,CAAiB,OAAe,SAA2B,EAAA;AAChE,EAAM,MAAA,CAAA,GAAI,OAAO,SAAS,CAAA,CAAA;AAC1B,EAAQ,OAAA,KAAA,GAAQ,aAAc,SAAY,GAAA,CAAA,CAAA,CAAA;AAC9C,CAAA;AAGA,SAAS,oBAAA,CAAqB,OAAe,WAA6B,EAAA;AACtE,EAAA,OAAO,KAAQ,GAAA,WAAA,CAAA;AACnB,CAAA;AAEA,SAAS,sBAAA,CAAuB,OAAe,WAA6B,EAAA;AACxE,EAAA,IAAI,KAAS,IAAA,WAAA,EAAoB,OAAA,MAAA,CAAO,CAAC,CAAA,CAAA;AACzC,EAAA,OAAO,KAAQ,GAAA,WAAA,CAAA;AACnB,CAAA;AAGA,SAAS,aAAa,GAAqB,EAAA;AAEvC,EAAA,OAAO,GAAM,GAAA,cAAA,CAAA;AACjB,CAAA;AASO,SAAS,2BAA2B,OAUnB,EAAA;AACpB,EAAM,MAAA;AAAA,IACF,cAAA;AAAA,IACA,oBAAA;AAAA,IACA,oBAAA;AAAA,IACA,eAAA;AAAA,IACA,gBAAA;AAAA,IACA,eAAA;AAAA,IACA,YAAe,GAAA,CAAA;AAAA,IACf,WAAc,GAAA,CAAA;AAAA,GACd,GAAA,OAAA,CAAA;AAEJ,EAAA,MAAM,OAAU,GAAA,IAAA,CAAK,GAAI,CAAA,CAAA,EAAG,iBAAiB,YAAY,CAAA,CAAA;AACzD,EAAA,MAAM,QAAQ,cAAiB,GAAA,WAAA,CAAA;AAE/B,EAAM,MAAA,QAAA,QAAe,GAAoB,EAAA,CAAA;AACzC,EAAM,MAAA,QAAA,QAAe,GAAoB,EAAA,CAAA;AAGzC,EAAA,IAAI,UAAa,GAAA,oBAAA,CAAA;AACjB,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,cAAA,EAAgB,CAAK,EAAA,EAAA;AACrC,IAAa,UAAA,GAAA,cAAA,CAAe,YAAY,eAAe,CAAA,CAAA;AAAA,GAC3D;AAEA,EAAS,QAAA,CAAA,GAAA,CAAI,gBAAgB,UAAU,CAAA,CAAA;AACvC,EAAS,QAAA,CAAA,GAAA,CAAI,gBAAgB,eAAe,CAAA,CAAA;AAG5C,EAAA,KAAA,IAAS,EAAK,GAAA,cAAA,GAAiB,CAAG,EAAA,EAAA,IAAM,OAAO,EAAM,EAAA,EAAA;AACjD,IAAA,MAAM,OAAU,GAAA,QAAA,CAAS,GAAI,CAAA,EAAA,GAAK,CAAC,CAAA,CAAA;AACnC,IAAA,MAAM,SAAY,GAAA,QAAA,CAAS,GAAI,CAAA,EAAA,GAAK,CAAC,CAAA,CAAA;AAErC,IAAA,QAAA,CAAS,GAAI,CAAA,EAAA,EAAI,cAAe,CAAA,OAAA,EAAS,eAAe,CAAC,CAAA,CAAA;AACzD,IAAA,QAAA,CAAS,GAAI,CAAA,EAAA,EAAI,oBAAqB,CAAA,SAAA,EAAW,gBAAgB,CAAC,CAAA,CAAA;AAAA,GACtE;AAGA,EAAA,KAAA,IAAS,EAAK,GAAA,cAAA,GAAiB,CAAG,EAAA,EAAA,IAAM,SAAS,EAAM,EAAA,EAAA;AACnD,IAAA,MAAM,OAAU,GAAA,QAAA,CAAS,GAAI,CAAA,EAAA,GAAK,CAAC,CAAA,CAAA;AACnC,IAAA,MAAM,SAAY,GAAA,QAAA,CAAS,GAAI,CAAA,EAAA,GAAK,CAAC,CAAA,CAAA;AAErC,IAAA,QAAA,CAAS,GAAI,CAAA,EAAA,EAAI,gBAAiB,CAAA,OAAA,EAAS,eAAe,CAAC,CAAA,CAAA;AAC3D,IAAA,QAAA,CAAS,GAAI,CAAA,EAAA,EAAI,sBAAuB,CAAA,SAAA,EAAW,gBAAgB,CAAC,CAAA,CAAA;AAAA,GACxE;AAGA,EAAA,MAAM,SAA8B,EAAC,CAAA;AACrC,EAAA,KAAA,IAAS,EAAK,GAAA,OAAA,EAAS,EAAM,IAAA,KAAA,EAAO,EAAM,EAAA,EAAA;AACtC,IAAM,MAAA,GAAA,GAAM,QAAS,CAAA,GAAA,CAAI,EAAE,CAAA,CAAA;AAE3B,IAAI,IAAA,IAAA,CAAA;AACJ,IAAA,IAAI,KAAK,cAAgB,EAAA;AACrB,MAAO,IAAA,GAAA,GAAA,CAAA;AAAA,KACX,MAAA,IAAW,OAAO,cAAgB,EAAA;AAC9B,MAAA,IAAA,GAAO,GAAM,GAAA,oBAAA,CAAA;AAAA,KACV,MAAA;AACH,MAAA,IAAA,GAAO,OAAO,CAAC,CAAA,CAAA;AAAA,KACnB;AAEA,IAAA,MAAM,YAAY,GAAM,GAAA,IAAA,CAAA;AACxB,IAAA,MAAM,gBAAmB,GAAA,YAAA,CAAa,QAAS,CAAA,GAAA,CAAI,EAAE,CAAE,CAAA,CAAA;AAEvD,IAAA,MAAA,CAAO,IAAK,CAAA;AAAA,MACR,EAAA;AAAA,MACA,QAAU,EAAA,GAAA;AAAA,MACV,IAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAU,EAAA,gBAAA;AAAA,KACb,CAAA,CAAA;AAAA,GACL;AAEA,EAAO,OAAA,MAAA,CAAA;AACX,CAAA;AAMA,eAAsB,6BAA6B,OAkBtB,EAAA;AACzB,EAAM,MAAA;AAAA,IACF,OAAA;AAAA,IACA,WAAA;AAAA,IACA,oBAAA;AAAA,IACA,kBAAA;AAAA,IACA,iBAAA;AAAA,IAEA,aAAA;AAAA,IACA,OAAA;AAAA,IACA,eAAA;AAAA,IACA,oBAAA;AAAA,IACA,iBAAA;AAAA,IACA,kBAAA;AAAA,IACA,oBAAA;AAAA,IACA,eAAA;AAAA,IACA,gBAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,GACA,GAAA,OAAA,CAAA;AAKJ,EAAA,MAAM,cAAc,MAAO,CAAA,aAAA,CAAc,UAAU,CAAA,GAAI,OAAO,IAAc,CAAA,CAAA;AAE5E,EAAA,MAAM,YAAe,GAAA,MAAA,CAAO,OAAQ,CAAA,QAAA,EAAU,CAAA,CAAA;AAE9C,EAAA,MAAM,cAAiB,GAAA,MAAA,CAAO,eAAgB,CAAA,QAAA,EAAU,CAAA,CAAA;AAGxD,EAAA,MAAM,mBAAsB,GAAA,MAAA,CAAO,iBAAkB,CAAA,QAAA,EAAU,CAAA,CAAA;AAC/D,EAAA,MAAM,sBAAyB,GAAA,MAAA,CAAO,gBAAiB,CAAA,QAAA,EAAU,CAAA,CAAA;AAIjE,EAAA,MAAM,sBAAyB,GAAA,MAAA;AAAA,IAC3B,sBAAA,GAAyB,OAAO,IAAsB,CAAA;AAAA,GAC1D,CAAA;AAGA,EAAA,MAAM,uBAA0B,GAAA,MAAA,CAAO,oBAAqB,CAAA,QAAA,EAAU,CAAA,CAAA;AACtE,EAAA,MAAM,qBAAwB,GAAA,MAAA,CAAO,kBAAmB,CAAA,QAAA,EAAU,CAAA,CAAA;AAClE,EAAA,MAAM,uBAA0B,GAAA,MAAA,CAAO,oBAAqB,CAAA,QAAA,EAAU,CAAA,CAAA;AAGtE,EAAM,MAAA,eAAA,GAAkB,mBAAsB,GAAA,MAAA,CAAO,IAAc,CAAA,CAAA;AAInE,EAAA,MAAM,SAAS,0BAA2B,CAAA;AAAA,IACtC,cAAA;AAAA,IACA,kBAAoB,EAAA,qBAAA;AAAA,IACpB,oBAAsB,EAAA,uBAAA;AAAA,IACtB,oBAAsB,EAAA,uBAAA;AAAA,IACtB,eAAiB,EAAA,mBAAA;AAAA,IACjB,gBAAkB,EAAA,sBAAA;AAAA,IAClB,eAAA;AAAA,IACA,YAAc,EAAA,kBAAA;AAAA,IACd,WAAa,EAAA,iBAAA;AAAA,GAChB,CAAA,CAAA;AAED,EAAO,OAAA;AAAA,IACH,OAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA;AAAA,IACA,gBAAkB,EAAA,sBAAA;AAAA,IAClB,kBAAoB,EAAA,qBAAA;AAAA,IACpB,oBAAsB,EAAA,uBAAA;AAAA,IACtB,oBAAsB,EAAA,uBAAA;AAAA,IACtB,cAAgB,EAAA,WAAA;AAAA,IAChB,oBAAA;AAAA,IACA,MAAA;AAAA,GACJ,CAAA;AACJ;;AC9UO,MAAM,aAAc,CAAA;AAAA,EAIvB,IAAI,QAAW,GAAA;AAAE,IAAA,OAAO,KAAK,eAAgB,CAAA,QAAA,CAAA;AAAA,GAAU;AAAA,EAEvD,YAAY,QAAmC,EAAA;AAC3C,IAAA,IAAA,CAAK,eAAkB,GAAA,QAAA,CAAA;AAAA,GAC3B;AAAA,EASA,MAAM,gBAAgB,MAA6D,EAAA;AAC/E,IAAM,MAAA,SAAA,GAAY,UAAU,WAAY,CAAA,MAAM,IACxC,MACA,GAAA,SAAA,CAAU,KAAK,MAAM,CAAA,CAAA;AAI3B,IAAA,MAAM,IAAK,CAAA,QAAA,CAAS,cAAe,CAAA,UAAA,CAAW,OAAQ,CAAA;AAAA,MAClD,KAAO,EAAA,SAAA;AAAA,KACV,CAAA,CAAA;AAAA,GACL;AAAA,EASA,MAAM,eAAe,SAA8C,EAAA;AAE/D,IAAA,MAAM,UAAwB,GAAA,MAAM,IAAK,CAAA,QAAA,CAAS,eAAe,UAAW,EAAA,CAAA;AAC5E,IAAI,IAAA,SAAA,CAAU,EAAG,CAAA,UAAU,CAAG,EAAA;AAC1B,MAAA,OAAA,CAAQ,KAAK,uBAAuB,CAAA,CAAA;AACpC,MAAA,MAAM,IAAI,KAAA;AAAA,QACN,CAAA,wCAAA,EACU,MAAO,CAAA,KAAA,CAAM,WAAY,CAAA,SAAS,CAAC,CAAA,UAAA,EACtC,MAAO,CAAA,KAAA,CAAM,WAAY,CAAA,UAAU,CAAC,CAAA,IAAA,CAAA;AAAA,OAC/C,CAAA;AAAA,KACJ;AAEA,IAAA,IAAI,EAAI,EAAA,OAAA,CAAA;AACR,IAAI,IAAA;AACA,MAAK,EAAA,GAAA,MAAM,KAAK,QAAS,CAAA,cAAA,CAAe,QAAQ,EAAE,KAAA,EAAO,WAAW,CAAA,CAAA;AACpE,MAAU,OAAA,GAAA,MAAM,EAAG,CAAA,IAAA,CAAK,CAAC,CAAA,CAAA;AAAA,aACpB,GAAU,EAAA;AACf,MAAI,IAAA,QAAA,GAAW,qBAAqB,GAAG,CAAA,CAAA;AACvC,MAAA,MAAM,IAAI,KAAA,CAAM,QAAS,CAAA,IAAA,IAAQ,SAAS,GAAG,CAAA,CAAA;AAAA,KACjD;AAIA,IAAI,IAAA,SAAA,CAAA;AACJ,IAAM,MAAA,EAAA,GAAK,QAAQ,MAAQ,EAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,UAAU,WAAW,CAAA,CAAA;AAE9D,IAAI,IAAA,EAAA,IAAM,GAAG,IAAM,EAAA;AACf,MAAA,MAAM,EAAE,IAAM,EAAA,MAAA,EAAQ,GAAK,EAAA,MAAA,KAAW,EAAG,CAAA,IAAA,CAAA;AACzC,MAAY,SAAA,GAAA;AAAA,QACR,IAAA;AAAA,QACA,MAAA,EAAQ,SAAU,CAAA,IAAA,CAAK,MAAM,CAAA;AAAA,QAC7B,GAAA,EAAK,SAAU,CAAA,IAAA,CAAK,GAAG,CAAA;AAAA,QACvB,MAAA,EAAQ,SAAU,CAAA,IAAA,CAAK,MAAM,CAAA;AAAA,OACjC,CAAA;AAAA,KACJ;AAEA,IAAO,OAAA;AAAA,MACH,QAAQ,EAAG,CAAA,IAAA;AAAA,MACX,OAAA;AAAA,MACA,SAAA;AAAA,KACJ,CAAA;AAAA,GACJ;AAAA,EAGA,MAAa,eAAgB,CAAA,aAAA,EAAuB,SAAoC,EAAA;AACpF,IAAA,IAAI,EAAI,EAAA,OAAA,CAAA;AACR,IAAI,IAAA;AACA,MAAA,EAAA,GAAK,MAAM,IAAK,CAAA,QAAA,CAAS,WAAY,CAAA,QAAA,CAAS,eAAe,SAAS,CAAA,CAAA;AACtE,MAAU,OAAA,GAAA,MAAM,EAAG,CAAA,IAAA,CAAK,CAAC,CAAA,CAAA;AAAA,aACpB,GAAU,EAAA;AACf,MAAI,IAAA,QAAA,GAAW,qBAAqB,GAAG,CAAA,CAAA;AACvC,MAAA,MAAM,IAAI,KAAA,CAAM,QAAS,CAAA,IAAA,IAAQ,SAAS,GAAG,CAAA,CAAA;AAAA,KACjD;AAGA,IAAI,IAAA,KAAA,CAAA;AACJ,IAAM,MAAA,EAAA,GAAK,QAAQ,MAAQ,EAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,UAAU,cAAc,CAAA,CAAA;AAEjE,IAAI,IAAA,EAAA,IAAM,GAAG,IAAM,EAAA;AACf,MAAA,MAAM,EAAE,IAAA,EAAM,MAAQ,EAAA,UAAA,KAAe,EAAG,CAAA,IAAA,CAAA;AACxC,MAAQ,KAAA,GAAA;AAAA,QACJ,IAAA;AAAA,QACA,MAAA,EAAQ,SAAU,CAAA,IAAA,CAAK,MAAM,CAAA;AAAA,QAC7B,UAAA,EAAY,SAAU,CAAA,IAAA,CAAK,UAAU,CAAA;AAAA,OACzC,CAAA;AAAA,KACJ;AAEA,IAAO,OAAA;AAAA,MACH,QAAQ,EAAG,CAAA,IAAA;AAAA,MACX,OAAA;AAAA,MACA,KAAA;AAAA,KACJ,CAAA;AAAA,GACJ;AAAA,EAGA,MAAa,cAAc,OAAkC,EAAA;AACzD,IAAA,IAAI,EAAI,EAAA,OAAA,CAAA;AACR,IAAI,IAAA;AACA,MAAA,EAAA,GAAK,MAAM,IAAA,CAAK,QAAS,CAAA,cAAA,CAAe,MAAM,OAAO,CAAA,CAAA;AACrD,MAAU,OAAA,GAAA,MAAM,EAAG,CAAA,IAAA,CAAK,CAAC,CAAA,CAAA;AAAA,aACpB,GAAU,EAAA;AACf,MAAI,IAAA,QAAA,GAAW,qBAAqB,GAAG,CAAA,CAAA;AACvC,MAAA,MAAM,IAAI,KAAA,CAAM,QAAS,CAAA,IAAA,IAAQ,SAAS,GAAG,CAAA,CAAA;AAAA,KACjD;AAGA,IAAI,IAAA,KAAA,CAAA;AACJ,IAAM,MAAA,EAAA,GAAK,QAAQ,MAAQ,EAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,UAAU,SAAS,CAAA,CAAA;AAE5D,IAAI,IAAA,EAAA,IAAM,GAAG,IAAM,EAAA;AACf,MAAA,MAAM,EAAE,IAAA,EAAM,MAAO,EAAA,GAAI,EAAG,CAAA,IAAA,CAAA;AAC5B,MAAQ,KAAA,GAAA;AAAA,QACJ,IAAA;AAAA,QACA,MAAA,EAAQ,SAAU,CAAA,IAAA,CAAK,MAAM,CAAA;AAAA,OACjC,CAAA;AAAA,KACJ;AAEA,IAAO,OAAA;AAAA,MACH,QAAQ,EAAG,CAAA,IAAA;AAAA,MACX,OAAA;AAAA,MACA,KAAA;AAAA,KACJ,CAAA;AAAA,GACJ;AA6EJ;;ACvNO,MAAM,WAAY,CAAA;AAAA,EAIrB,IAAI,QAAW,GAAA;AAAE,IAAA,OAAO,KAAK,eAAgB,CAAA,QAAA,CAAA;AAAA,GAAU;AAAA,EAEvD,YAAY,QAAmC,EAAA;AAC3C,IAAA,IAAA,CAAK,eAAkB,GAAA,QAAA,CAAA;AAAA,GAC3B;AAAA,EAOA,MAAM,cAAc,SAAqC,EAAA;AACrD,IAAI,IAAA;AACA,MAAA,MAAM,IAAK,CAAA,QAAA,CAAS,SAAU,CAAA,UAAA,CAAW,YAAY,SAAS,CAAA,CAAA;AAAA,aACzD,GAAU,EAAA;AACf,MAAI,IAAA,QAAA,GAAW,qBAAqB,GAAG,CAAA,CAAA;AACvC,MAAA,MAAM,IAAI,KAAA,CAAM,QAAS,CAAA,IAAA,IAAQ,SAAS,GAAG,CAAA,CAAA;AAAA,KACjD;AAAA,GACJ;AAAA,EASA,MAAM,YAAa,CAAA,SAAA,EAAsB,aAAqC,EAAA;AAC1E,IAAM,MAAA,SAAA,GAAY,IAAK,CAAA,QAAA,CAAS,SAAU,CAAA,OAAA,CAAA;AAC1C,IAAM,MAAA,OAAA,GAAU,KAAK,QAAS,CAAA,WAAA,CAAA;AAC9B,IAAA,MAAM,GAAM,GAAA,MAAM,OAAQ,CAAA,SAAA,CAAU,aAAa,CAAA,CAAA;AACjD,IAAA,MAAM,SAAY,GAAA,MAAM,OAAQ,CAAA,SAAA,CAAU,eAAe,SAAS,CAAA,CAAA;AAElE,IAAA,MAAM,MAAS,GAAA,MAAM,IAAK,CAAA,QAAA,CAAS,UAAU,MAAO,EAAA,CAAA;AACpD,IAAA,IAAG,MAAQ,EAAA;AACP,MAAM,MAAA,IAAI,MAAM,wCAAwC,CAAA,CAAA;AAAA,KAC5D;AAEA,IAAA,IAAI,IAAI,EAAG,CAAA,SAAS,GAAS,MAAA,IAAI,MAAM,6BAA6B,CAAA,CAAA;AAGpE,IAAI,IAAA,SAAA,CAAU,EAAG,CAAA,SAAS,CAAG,EAAA;AACzB,MAAA,MAAM,QAAW,GAAA,IAAA,CAAK,eAAgB,CAAA,QAAA,CAAS,aAAa,CAAA,CAAA;AAE5D,MAAA,OAAA,CAAQ,IAAK,CAAA,CAAA,wBAAA,EAA2B,SAAU,CAAA,QAAA,EAAU,CAAM,GAAA,EAAA,SAAA,CAAU,QAAS,EAAC,sBAAsB,SAAS,CAAA,EAAA,EAAK,SAAU,CAAA,QAAA,EAAU,CAAG,CAAA,CAAA,CAAA,CAAA;AACjJ,MAAA,MAAM,SAAY,GAAA,MAAM,QAAS,CAAA,OAAA,CAAQ,WAAW,SAAS,CAAA,CAAA;AAC7D,MAAM,MAAA,SAAA,CAAU,KAAK,CAAC,CAAA,CAAA;AAGtB,MAAA,MAAM,YAAe,GAAA,MAAM,OAAQ,CAAA,SAAA,CAAU,eAAe,SAAS,CAAA,CAAA;AACrE,MAAI,IAAA,YAAA,CAAa,EAAG,CAAA,SAAS,CAAG,EAAA;AAC5B,QAAM,MAAA,IAAI,MAAM,+DAA+D,CAAA,CAAA;AAAA,OACnF;AAAA,KACJ;AAGA,IAAM,MAAA,IAAA,CAAK,cAAc,SAAS,CAAA,CAAA;AAIlC,IAAA,MAAM,KAAK,MAAM,IAAA,CAAK,QAAS,CAAA,SAAA,CAAU,YAAY,SAAS,CAAA,CAAA;AAG9D,IAAA,MAAM,OAAU,GAAA,MAAM,EAAG,CAAA,IAAA,CAAK,CAAC,CAAA,CAAA;AAG/B,IAAI,IAAA,MAAA,CAAA;AACJ,IAAM,MAAA,EAAA,GAAK,QAAQ,MAAQ,EAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,UAAU,QAAQ,CAAA,CAAA;AAE3D,IAAI,IAAA,EAAA,IAAM,GAAG,IAAM,EAAA;AACf,MAAA,MAAM,EAAE,IAAM,EAAA,SAAA,EAAW,MAAQ,EAAA,OAAA,KAAY,EAAG,CAAA,IAAA,CAAA;AAChD,MAAS,MAAA,GAAA;AAAA,QACL,IAAA;AAAA,QACA,SAAA,EAAW,SAAU,CAAA,IAAA,CAAK,SAAS,CAAA;AAAA,QACnC,MAAA,EAAQ,SAAU,CAAA,IAAA,CAAK,MAAM,CAAA;AAAA,QAC7B,OAAA,EAAS,SAAU,CAAA,IAAA,CAAK,OAAO,CAAA;AAAA,OACnC,CAAA;AAAA,KACJ;AAEA,IAAO,OAAA;AAAA,MACH,QAAQ,EAAG,CAAA,IAAA;AAAA,MACX,OAAA;AAAA,MACA,MAAA;AAAA,KACJ,CAAA;AAAA,GACJ;AAAA,EASA,MAAM,oBAAqB,CAAA,OAAA,EAAoB,SAAkD,EAAA;AAE7F,IAAA,MAAM,KAAK,MAAM,IAAA,CAAK,SAAS,SAAU,CAAA,aAAA,CAAc,SAAS,SAAS,CAAA,CAAA;AAGzE,IAAA,MAAM,OAAU,GAAA,MAAM,EAAG,CAAA,IAAA,CAAK,CAAC,CAAA,CAAA;AAG/B,IAAI,IAAA,cAAA,CAAA;AACJ,IAAM,MAAA,EAAA,GAAK,QAAQ,MAAQ,EAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,UAAU,gBAAgB,CAAA,CAAA;AAEnE,IAAI,IAAA,EAAA,IAAM,GAAG,IAAM,EAAA;AACf,MAAA,MAAM,EAAE,IAAM,EAAA,QAAA,EAAU,OAAAE,EAAAA,QAAAA,KAAY,EAAG,CAAA,IAAA,CAAA;AACvC,MAAiB,cAAA,GAAA;AAAA,QACb,IAAA;AAAA,QACA,QAAA,EAAU,SAAU,CAAA,IAAA,CAAK,QAAQ,CAAA;AAAA,QACjC,OAAA,EAAS,SAAU,CAAA,IAAA,CAAKA,QAAO,CAAA;AAAA,OACnC,CAAA;AAAA,KACJ;AAEA,IAAO,OAAA;AAAA,MACH,QAAQ,EAAG,CAAA,IAAA;AAAA,MACX,OAAA;AAAA,MACA,cAAA;AAAA,KACJ,CAAA;AAAA,GACJ;AACJ;;AC5HO,MAAM,cAAe,CAAA;AAAA,EAGxB,IAAI,QAAW,GAAA;AAAE,IAAA,OAAO,KAAK,eAAgB,CAAA,QAAA,CAAA;AAAA,GAAU;AAAA,EAEvD,YAAY,QAAmC,EAAA;AAC3C,IAAA,IAAA,CAAK,eAAkB,GAAA,QAAA,CAAA;AAAA,GAC3B;AAAA,EAQA,MAAM,2BAA4B,CAAA,SAAA,EAAmB,KAA6B,EAAA;AAE9E,IAAA,MAAM,MAAM,MAAM,IAAA,CAAK,QAAS,CAAA,WAAA,CAAY,UAAU,KAAK,CAAA,CAAA;AAC3D,IAAA,MAAM,MAAS,GAAA,MAAM,IAAK,CAAA,QAAA,CAAS,UAAU,MAAO,EAAA,CAAA;AACpD,IAAA,IAAG,MAAQ,EAAA;AACP,MAAM,MAAA,IAAI,MAAM,wCAAwC,CAAA,CAAA;AAAA,KAC5D;AAGA,IAAI,IAAA,GAAA,CAAI,EAAG,CAAA,SAAS,CAAG,EAAA;AACnB,MAAM,MAAA,IAAI,MAAM,CAA6C,2CAAA,CAAA,CAAA,CAAA;AAAA,KACjE;AAGA,IAAM,MAAA,aAAA,GAAgB,IAAK,CAAA,QAAA,CAAS,SAAU,CAAA,OAAA,CAAA;AAC9C,IAAA,MAAM,YAAY,MAAM,IAAA,CAAK,SAAS,WAAY,CAAA,SAAA,CAAU,OAAO,aAAa,CAAA,CAAA;AAGhF,IAAI,IAAA,SAAA,CAAU,EAAG,CAAA,SAAS,CAAG,EAAA;AACzB,MAAA,MAAM,QAAW,GAAA,IAAA,CAAK,eAAgB,CAAA,QAAA,CAAS,aAAa,CAAA,CAAA;AAE5D,MAAA,OAAA,CAAQ,IAAK,CAAA,CAAA,wBAAA,EAA2B,SAAU,CAAA,QAAA,EAAU,CAAM,GAAA,EAAA,SAAA,CAAU,QAAS,EAAC,sBAAsB,aAAa,CAAA,EAAA,EAAK,SAAU,CAAA,QAAA,EAAU,CAAG,CAAA,CAAA,CAAA,CAAA;AAErJ,MAAA,MAAM,SAAY,GAAA,MAAM,QAAS,CAAA,OAAA,CAAQ,eAAe,SAAS,CAAA,CAAA;AACjE,MAAM,MAAA,SAAA,CAAU,KAAK,CAAC,CAAA,CAAA;AAGtB,MAAA,MAAM,eAAe,MAAM,IAAA,CAAK,SAAS,WAAY,CAAA,SAAA,CAAU,OAAO,aAAa,CAAA,CAAA;AACnF,MAAI,IAAA,YAAA,CAAa,EAAG,CAAA,SAAS,CAAG,EAAA;AAC5B,QAAM,MAAA,IAAI,MAAM,+DAA+D,CAAA,CAAA;AAAA,OACnF;AAAA,KACJ;AAGA,IAAI,IAAA;AACA,MAAM,MAAA,WAAA,GAAc,SAAU,CAAA,IAAA,CAAK,SAAS,CAAA,CAAA;AAC5C,MAAA,MAAM,KAAK,QAAS,CAAA,SAAA,CAAU,UAAW,CAAA,2BAAA,CAA4B,aAAa,KAAK,CAAA,CAAA;AAAA,aAClF,GAAU,EAAA;AACf,MAAQ,OAAA,CAAA,GAAA,CAAI,OAAO,GAAG,CAAA,CAAA;AAEtB,MAAI,IAAA,QAAA,GAAW,qBAAqB,GAAG,CAAA,CAAA;AAGvC,MAAG,IAAA,QAAA,CAAS,QAAQ,yBAA2B,EAAA;AAC3C,QAAA,OAAA,CAAQ,MAAM,4DAA4D,CAAA,CAAA;AAC1E,QAAM,MAAA,eAAA,CAAgB,IAAK,CAAA,QAAA,CAAS,GAAG,CAAA,CAAA;AACvC,QAAA,MAAM,IAAI,KAAA,CAAM,QAAS,CAAA,IAAA,GAAK,CAAoD,kDAAA,CAAA,CAAA,CAAA;AAAA,OACtF;AAEA,MAAA,MAAM,IAAI,KAAA,CAAM,QAAS,CAAA,IAAA,IAAQ,SAAS,GAAG,CAAA,CAAA;AAAA,KACjD;AAGA,IAAA,IAAI,EAAI,EAAA,OAAA,CAAA;AACR,IAAI,IAAA;AACA,MAAA,EAAA,GAAK,MAAM,IAAK,CAAA,QAAA,CAAS,SAAU,CAAA,2BAAA,CAA4B,WAAW,KAAK,CAAA,CAAA;AAC/E,MAAU,OAAA,GAAA,MAAM,EAAG,CAAA,IAAA,CAAK,CAAC,CAAA,CAAA;AAAA,aACpB,GAAU,EAAA;AACf,MAAI,IAAA,QAAA,GAAW,qBAAqB,GAAG,CAAA,CAAA;AACvC,MAAA,MAAM,IAAI,KAAA,CAAM,QAAS,CAAA,IAAA,IAAQ,SAAS,GAAG,CAAA,CAAA;AAAA,KACjD;AAIA,IAAI,IAAA,SAAA,CAAA;AACJ,IAAA,MAAM,KAAK,OAAQ,CAAA,MAAA,EAAQ,IAAK,CAAA,CAAC,MAAM,CAAE,CAAA,KAAA,KAAU,qBAA0B,IAAA,CAAA,CAAE,SAAS,CAAE,CAAA,KAAA,CAAM,UAAW,CAAA,UAAA,CAAW,qBAAqB,CAAE,CAAA,CAAA;AAE7I,IAAI,IAAA,EAAA,IAAM,GAAG,IAAM,EAAA;AAEf,MAAA,MAAM,OAAY,EAAG,CAAA,IAAA,CAAA;AAErB,MAAA,MAAM,QAAW,GAAA,IAAA,CAAK,KAAS,IAAA,IAAA,CAAK,CAAC,CAAA,CAAA;AACrC,MAAA,MAAM,YAAgB,GAAA,IAAA,CAAK,SAAa,IAAA,IAAA,CAAK,CAAC,CAAA,GAAK,SAAU,CAAA,IAAA,CAAK,IAAK,CAAA,SAAA,IAAa,IAAK,CAAA,CAAC,CAAC,CAAI,GAAA,KAAA,CAAA,CAAA;AAC/F,MAAA,MAAM,WAAe,GAAA,IAAA,CAAK,QAAY,IAAA,IAAA,CAAK,CAAC,CAAA,GAAK,SAAU,CAAA,IAAA,CAAK,IAAK,CAAA,QAAA,IAAY,IAAK,CAAA,CAAC,CAAC,CAAI,GAAA,KAAA,CAAA,CAAA;AAC5F,MAAA,MAAM,SAAa,GAAA,IAAA,CAAK,MAAU,IAAA,IAAA,CAAK,CAAC,CAAA,GAAK,SAAU,CAAA,IAAA,CAAK,IAAK,CAAA,MAAA,IAAU,IAAK,CAAA,CAAC,CAAC,CAAI,GAAA,KAAA,CAAA,CAAA;AACtF,MAAA,MAAM,UAAc,GAAA,IAAA,CAAK,OAAW,IAAA,IAAA,CAAK,CAAC,CAAA,GAAK,SAAU,CAAA,IAAA,CAAK,IAAK,CAAA,OAAA,IAAW,IAAK,CAAA,CAAC,CAAC,CAAI,GAAA,KAAA,CAAA,CAAA;AAEzF,MAAY,SAAA,GAAA;AAAA,QACR,KAAO,EAAA,QAAA;AAAA,QACP,SAAW,EAAA,YAAA;AAAA,QACX,QAAU,EAAA,WAAA;AAAA,QACV,MAAQ,EAAA,SAAA;AAAA,QACR,OAAS,EAAA,UAAA;AAAA,OACb,CAAA;AAAA,KACJ;AAEA,IAAO,OAAA;AAAA,MACH,QAAQ,EAAG,CAAA,IAAA;AAAA,MACX,OAAA;AAAA,MACA,SAAA;AAAA,KACJ,CAAA;AAAA,GACJ;AAsDJ;;AC/JO,MAAM,SAAU,CAAA;AAAA,EAmBnB,YAAY,QAAmC,EAAA;AAhB/C,IAAA,IAAA,CAAiB,QAAoC,GAAA;AAAA,MACjD,IAAM,EAAA,CAAC,CAAM,KAAA,IAAA,CAAK,WAAW,CAAC,CAAA;AAAA,MAC9B,IAAM,EAAA,CAAC,CAAM,KAAA,IAAA,CAAK,WAAW,CAAC,CAAA;AAAA,MAE9B,IAAM,EAAA,CAAC,CAAM,KAAA,IAAA,CAAK,gBAAgB,CAAC,CAAA;AAAA,MACnC,IAAM,EAAA,CAAC,CAAM,KAAA,IAAA,CAAK,kBAAkB,CAAC,CAAA;AAAA,MAErC,IAAM,EAAA,CAAC,CAAM,KAAA,IAAA,CAAK,sBAAsB,CAAC,CAAA;AAAA,MACzC,IAAM,EAAA,CAAC,CAAM,KAAA,IAAA,CAAK,mBAAmB,CAAC,CAAA;AAAA,MACtC,IAAM,EAAA,CAAC,CAAM,KAAA,IAAA,CAAK,wBAAwB,CAAC,CAAA;AAAA,KAC/C,CAAA;AAOI,IAAA,IAAA,CAAK,eAAkB,GAAA,QAAA,CAAA;AAAA,GAC3B;AAAA,EAJA,IAAI,QAAW,GAAA;AAAE,IAAA,OAAO,KAAK,eAAgB,CAAA,QAAA,CAAA;AAAA,GAAU;AAAA,EAYvD,MAAM,SAA0B,GAAA;AAC5B,IAAM,MAAA,SAAA,GAAY,KAAK,QAAS,CAAA,SAAA,CAAA;AAChC,IAAM,MAAA,GAAA,GAAM,KAAK,QAAS,CAAA,GAAA,CAAA;AAG1B,IAAM,MAAA,UAAA,GAAqB,MAAM,SAAA,CAAU,UAAW,EAAA,CAAA;AACtD,IAAM,MAAA,iBAAA,GAA4B,MAAM,SAAA,CAAU,iBAAkB,EAAA,CAAA;AACpE,IAAM,MAAA,aAAA,GAAgB,MAAM,GAAA,CAAI,aAAc,EAAA,CAAA;AAG9C,IAAA,MAAM,OAAU,GAAA,IAAA,CAAK,eAAgB,CAAA,WAAA,CAAY,YAAY,CAAA,CAAA;AAG7D,IAAM,MAAA,WAAA,GAAmB,MAAM,OAAA,CAAQ,YAAa,EAAA,CAAA;AACpD,IAAM,MAAA,eAAA,GAAuB,MAAM,OAAA,CAAQ,YAAa,EAAA,CAAA;AACxD,IAAM,MAAA,mBAAA,GAA2B,MAAM,OAAA,CAAQ,mBAAoB,EAAA,CAAA;AACnE,IAAM,MAAA,iBAAA,GAA4B,MAAM,OAAA,CAAQ,iBAAkB,EAAA,CAAA;AAClE,IAAM,MAAA,YAAA,GAAgB,WAAe,IAAA,OAAO,WAAY,CAAA,QAAA,KAAa,UAAc,GAAA,WAAA,CAAY,QAAS,EAAA,GAAI,MAAO,CAAA,WAAA,IAAe,CAAC,CAAA,CAAA;AAEnI,IAAA,MAAM,YAAgB,GAAA,eAAA,IAAmB,eAAgB,CAAA,WAAA,KAAgB,KACnE,CAAA,GAAA;AAAA,MACE,WAAc,EAAA,eAAA,CAAgB,WAAe,IAAA,OAAO,gBAAgB,WAAY,CAAA,QAAA,KAAa,UAAc,GAAA,eAAA,CAAgB,YAAY,QAAS,EAAA,GAAI,MAAO,CAAA,eAAA,CAAgB,eAAe,CAAC,CAAA;AAAA,MAC3L,SAAY,EAAA,eAAA,CAAgB,SAAa,IAAA,OAAO,gBAAgB,SAAU,CAAA,QAAA,KAAa,UAAc,GAAA,eAAA,CAAgB,UAAU,QAAS,EAAA,GAAI,MAAO,CAAA,eAAA,CAAgB,aAAa,CAAC,CAAA;AAAA,MACjL,eAAe,eAAgB,CAAA,aAAA;AAAA,MAC/B,YAAY,eAAgB,CAAA,UAAA;AAAA,MAC5B,gBAAgB,eAAgB,CAAA,cAAA;AAAA,MAChC,eAAe,eAAgB,CAAA,aAAA;AAAA,KAEjC,GAAA,IAAA,CAAA;AAEN,IAAA,MAAM,iBAAoB,GAAA,mBAAA,CAAA;AAC1B,IAAM,MAAA,eAAA,GAAmB,iBAAqB,IAAA,OAAO,iBAAkB,CAAA,QAAA,KAAa,UAAc,GAAA,iBAAA,CAAkB,QAAS,EAAA,GAAI,MAAO,CAAA,iBAAA,IAAqB,GAAG,CAAA,CAAA;AAEhK,IAAA,MAAM,kBAAsB,GAAA,iBAAA,IAAqB,OAAO,iBAAA,CAAkB,EAAO,KAAA,UAAA,GAAc,iBAAkB,CAAA,EAAA,CAAG,CAAC,CAAA,GAAK,MAAO,CAAA,eAAe,CAAI,GAAA,CAAA,CAAA;AAEpJ,IAAO,OAAA;AAAA,MACH,UAAA;AAAA,MACA,aAAA;AAAA,MACA,iBAAA;AAAA,MACA,YAAA;AAAA,MACA,YAAA;AAAA,MACA,mBAAqB,EAAA,eAAA;AAAA,MACrB,iBAAA;AAAA,MACA,kBAAA;AAAA,MACA,GAAK,EAAA;AAAA,QACD,WAAA;AAAA,QACA,eAAA;AAAA,QACA,mBAAqB,EAAA,iBAAA;AAAA,OACzB;AAAA,KACJ,CAAA;AAAA,GACJ;AAAA,EAKA,MAAM,YAAY,OAA0C,EAAA;AACxD,IAAI,IAAA;AACA,MAAA,MAAM,gBAAmB,GAAA,IAAA,CAAK,QAAS,CAAA,GAAA,CAAI,QAAQ,UAAW,EAAA,CAAA;AAC9D,MAAM,MAAA,MAAA,GAAS,MAAM,IAAK,CAAA,QAAA,CAAS,IAAI,WAAY,CAAA,gBAAA,EAAkB,GAAG,QAAQ,CAAA,CAAA;AAChF,MAAA,MAAM,gBAAgC,EAAC,CAAA;AACvC,MAAA,KAAA,MAAW,SAAS,MAAQ,EAAA;AACxB,QAAA,MAAM,UAAa,GAAA,MAAM,IAAK,CAAA,0BAAA,CAA2B,KAAK,CAAA,CAAA;AAC9D,QAAc,aAAA,CAAA,IAAA,CAAK,GAAG,UAAU,CAAA,CAAA;AAAA,OACpC;AAGA,MAAA,MAAM,UAAa,GAAA,OAAA,GAAU,OAAQ,CAAA,WAAA,EAAgB,GAAA,IAAA,CAAA;AACrD,MAAA,MAAM,WAAW,aAAc,CAAA,MAAA;AAAA,QAAO,CACjC,CAAA,KAAA,CAAA,CAAE,IAAQ,IAAA,CAAA,CAAE,IAAK,CAAA,WAAA,EAAkB,KAAA,UAAA,IACnC,CAAE,CAAA,EAAA,IAAM,CAAE,CAAA,EAAA,CAAG,aAAkB,KAAA,UAAA;AAAA,OACpC,CAAA;AACA,MAAA,OAAO,SAAS,OAAQ,EAAA,CAAA;AAAA,aAErB,KAAO,EAAA;AAEV,MAAA,OAAO,EAAC,CAAA;AAAA,KACZ;AAAA,GACJ;AAAA,EAKA,MAAc,2BAA2B,KAAqC,EAAA;AAC1E,IAAM,MAAA,MAAA,GAAS,MAAM,IAAK,CAAA,MAAA,CAAA;AAC1B,IAAM,MAAA,iBAAA,GAAoB,KAAM,CAAA,IAAA,CAAK,OAAQ,CAAA,UAAA,CAAA;AAE7C,IAAA,MAAM,YAAY,MAAO,CAAA,SAAA,GAAY,MAAO,CAAA,MAAA,CAAO,SAAS,CAAI,GAAA,IAAA,CAAA;AAChE,IAAM,MAAA,IAAA,GAAO,MAAM,OAAW,IAAA,IAAA,CAAA;AAC9B,IAAA,MAAM,SAAS,KAAM,CAAA,eAAA,CAAA;AACrB,IAAA,MAAM,KAAQ,GAAA,KAAA,CAAA;AAEd,IAAA,MAAM,gBAAgC,EAAC,CAAA;AAEvC,IAAI,IAAA,iBAAA,IAAqB,iBAAkB,CAAA,MAAA,GAAS,CAAG,EAAA;AACnD,MAAA,KAAA,IAAS,KAAK,iBAAmB,EAAA;AAC7B,QAAM,MAAA,aAAA,GAAgB,EAAE,CAAC,CAAA,CAAA;AACzB,QAAM,MAAA,aAAA,GAAgB,EAAE,CAAC,CAAA,CAAA;AAGzB,QAAA,IAAI,IAA6B,GAAA,SAAA,CAAA;AACjC,QAAA,IAAI,OAAY,EAAC,CAAA;AACjB,QAAA,IAAI,EAAoB,GAAA,IAAA,CAAA;AAExB,QAAM,MAAA,OAAA,GAAU,IAAK,CAAA,QAAA,CAAS,aAAa,CAAA,CAAA;AAE3C,QAAA,IAAI,OAAS,EAAA;AACT,UAAI,IAAA;AACA,YAAM,MAAA,OAAA,GAAU,QAAQ,aAAa,CAAA,CAAA;AACrC,YAAA,IAAA,GAAO,OAAQ,CAAA,IAAA,CAAA;AACf,YAAA,IAAA,GAAO,OAAQ,CAAA,IAAA,CAAA;AACf,YAAA,EAAA,GAAK,QAAQ,EAAM,IAAA,IAAA,CAAA;AAAA,mBACd,CAAQ,EAAA;AAEb,YAAO,IAAA,GAAA,SAAA,CAAA;AACP,YAAO,IAAA,GAAA;AAAA,cACH,WAAa,EAAA,CAAA,EAAG,OAAW,IAAA,MAAA,CAAO,CAAC,CAAA;AAAA,cACnC,aAAA;AAAA,cACA,MAAQ,EAAA,aAAA;AAAA,aACZ,CAAA;AAAA,WACJ;AAAA,SACG,MAAA;AAEH,UAAO,IAAA,GAAA,EAAE,aAAe,EAAA,MAAA,EAAQ,aAAc,EAAA,CAAA;AAAA,SAClD;AAEA,QAAA,aAAA,CAAc,IAAK,CAAA;AAAA,UACf,IAAA;AAAA,UACA,IAAA;AAAA,UACA,KAAA;AAAA,UACA,SAAA;AAAA,UACA,IAAA;AAAA,UACA,EAAA;AAAA,UACA,MAAA;AAAA,UACA,GAAK,EAAA,KAAA;AAAA,SACR,CAAA,CAAA;AAAA,OACL;AAAA,KACJ;AACA,IAAO,OAAA,aAAA,CAAA;AAAA,GACX;AAAA,EAIQ,WAAW,aAAsC,EAAA;AACrD,IAAM,MAAA,GAAA,GAAM,IAAK,CAAA,OAAA,CAAQ,aAAa,CAAA,CAAA;AAEtC,IAAA,IAAI,MAAS,GAAA,CAAA,CAAA;AACb,IAAA,MAAM,EAAK,GAAA,IAAA,CAAK,WAAY,CAAA,GAAA,EAAK,MAAM,CAAA,CAAA;AAAG,IAAA,MAAA,GAAS,EAAG,CAAA,IAAA,CAAA;AACtD,IAAA,MAAM,EAAK,GAAA,IAAA,CAAK,WAAY,CAAA,GAAA,EAAK,MAAM,CAAA,CAAA;AAAG,IAAA,MAAA,GAAS,EAAG,CAAA,IAAA,CAAA;AACtD,IAAA,MAAM,EAAK,GAAA,IAAA,CAAK,WAAY,CAAA,GAAA,EAAK,MAAM,CAAA,CAAA;AAAG,IAAA,MAAA,GAAS,EAAG,CAAA,IAAA,CAAA;AACtD,IAAA,MAAM,EAAK,GAAA,IAAA,CAAK,aAAc,CAAA,GAAA,EAAK,MAAM,CAAA,CAAA;AAAG,IAAA,MAAA,GAAS,EAAG,CAAA,IAAA,CAAA;AACxD,IAAA,MAAM,EAAK,GAAA,IAAA,CAAK,YAAa,CAAA,GAAA,EAAK,MAAM,CAAA,CAAA;AAAG,IAAA,MAAA,GAAS,EAAG,CAAA,IAAA,CAAA;AAEvD,IAAA,MAAM,IAAO,GAAA;AAAA,MACT,OAAO,EAAG,CAAA,IAAA;AAAA,MACV,OAAO,EAAG,CAAA,IAAA;AAAA,MACV,aAAa,EAAG,CAAA,KAAA;AAAA,MAChB,SAAS,EAAG,CAAA,KAAA;AAAA,MACZ,UAAU,EAAG,CAAA,KAAA;AAAA,KACjB,CAAA;AAEA,IAAA,OAAO,EAAE,IAAM,EAAA,cAAA,EAAgB,IAAM,EAAA,EAAA,EAAI,GAAG,IAAK,EAAA,CAAA;AAAA,GACrD;AAAA,EACQ,WAAW,aAAsC,EAAA;AACrD,IAAM,MAAA,GAAA,GAAM,IAAK,CAAA,OAAA,CAAQ,aAAa,CAAA,CAAA;AAEtC,IAAA,IAAI,MAAS,GAAA,CAAA,CAAA;AACb,IAAA,MAAM,EAAK,GAAA,IAAA,CAAK,WAAY,CAAA,GAAA,EAAK,MAAM,CAAA,CAAA;AAAG,IAAA,MAAA,GAAS,EAAG,CAAA,IAAA,CAAA;AACtD,IAAA,MAAM,EAAK,GAAA,IAAA,CAAK,WAAY,CAAA,GAAA,EAAK,MAAM,CAAA,CAAA;AAAG,IAAA,MAAA,GAAS,EAAG,CAAA,IAAA,CAAA;AACtD,IAAA,MAAM,EAAK,GAAA,IAAA,CAAK,aAAc,CAAA,GAAA,EAAK,MAAM,CAAA,CAAA;AAAG,IAAA,MAAA,GAAS,EAAG,CAAA,IAAA,CAAA;AACxD,IAAA,MAAM,EAAK,GAAA,IAAA,CAAK,YAAa,CAAA,GAAA,EAAK,MAAM,CAAA,CAAA;AAAG,IAAA,MAAA,GAAS,EAAG,CAAA,IAAA,CAAA;AAEvD,IAAA,MAAM,IAAO,GAAA;AAAA,MACT,OAAO,EAAG,CAAA,IAAA;AAAA,MACV,aAAa,EAAG,CAAA,KAAA;AAAA,MAChB,SAAS,EAAG,CAAA,KAAA;AAAA,MACZ,YAAY,EAAG,CAAA,KAAA;AAAA,KACnB,CAAA;AAEA,IAAA,OAAO,EAAE,IAAM,EAAA,gBAAA,EAAkB,IAAM,EAAA,EAAA,EAAI,GAAG,IAAK,EAAA,CAAA;AAAA,GACvD;AAAA,EAGQ,gBAAgB,aAAsC,EAAA;AAC1D,IAAA,MAAM,EAAE,IAAM,EAAA,IAAA,KAAS,IAAK,CAAA,kBAAA,CAAmB,eAAe,CAAC,CAAA,CAAA;AAC/D,IAAA,MAAM,CAAC,SAAA,EAAW,MAAQ,EAAA,WAAW,CAAI,GAAA,IAAA,CAAA;AAEzC,IAAO,OAAA;AAAA,MACH,IAAM,EAAA,OAAA;AAAA,MACN,IAAM,EAAA;AAAA,QACF,MAAQ,EAAA,IAAA;AAAA,QACR,SAAW,EAAA,MAAA,CAAO,KAAM,CAAA,WAAA,CAAY,WAAW,EAAE,CAAA;AAAA,QACjD,MAAQ,EAAA,MAAA,CAAO,KAAM,CAAA,WAAA,CAAY,QAAQ,EAAE,CAAA;AAAA,QAC3C,WAAA;AAAA,OACJ;AAAA,MACA,EAAI,EAAA,IAAA;AAAA,KACR,CAAA;AAAA,GACJ;AAAA,EACQ,kBAAkB,aAAsC,EAAA;AAC5D,IAAA,MAAM,EAAE,IAAM,EAAA,IAAA,KAAS,IAAK,CAAA,kBAAA,CAAmB,eAAe,CAAC,CAAA,CAAA;AAC/D,IAAA,MAAM,CAAC,aAAA,EAAe,MAAQ,EAAA,WAAA,EAAa,OAAO,CAAI,GAAA,IAAA,CAAA;AAEtD,IAAO,OAAA;AAAA,MACH,IAAM,EAAA,SAAA;AAAA,MACN,IAAM,EAAA;AAAA,QACF,QAAU,EAAA,IAAA;AAAA,QACV,aAAe,EAAA,MAAA,CAAO,KAAM,CAAA,WAAA,CAAY,eAAe,EAAE,CAAA;AAAA,QACzD,MAAA;AAAA,QACA,WAAA;AAAA,QACA,OAAA;AAAA,OACJ;AAAA,MACA,EAAI,EAAA,IAAA;AAAA,KACR,CAAA;AAAA,GACJ;AAAA,EACQ,sBAAsB,aAAsC,EAAA;AAChE,IAAA,MAAM,EAAE,IAAM,EAAA,IAAA,KAAS,IAAK,CAAA,kBAAA,CAAmB,eAAe,CAAC,CAAA,CAAA;AAC/D,IAAA,MAAM,CAAC,SAAA,EAAW,MAAQ,EAAA,WAAW,CAAI,GAAA,IAAA,CAAA;AAEzC,IAAO,OAAA;AAAA,MACH,IAAM,EAAA,uBAAA;AAAA,MACN,IAAM,EAAA;AAAA,QACF,SAAW,EAAA,IAAA;AAAA,QACX,SAAW,EAAA,MAAA,CAAO,KAAM,CAAA,WAAA,CAAY,WAAW,EAAE,CAAA;AAAA,QACjD,MAAQ,EAAA,MAAA,CAAO,KAAM,CAAA,WAAA,CAAY,QAAQ,EAAE,CAAA;AAAA,QAC3C,WAAA;AAAA,OACJ;AAAA,MACA,EAAI,EAAA,IAAA;AAAA,KACR,CAAA;AAAA,GACJ;AAAA,EACQ,mBAAmB,aAAsC,EAAA;AAC7D,IAAA,MAAM,EAAE,IAAM,EAAA,IAAA,KAAS,IAAK,CAAA,kBAAA,CAAmB,eAAe,CAAC,CAAA,CAAA;AAC/D,IAAA,MAAM,CAAC,QAAA,EAAU,QAAU,EAAA,YAAY,CAAI,GAAA,IAAA,CAAA;AAE3C,IAAO,OAAA;AAAA,MACH,IAAM,EAAA,mBAAA;AAAA,MACN,IAAM,EAAA;AAAA,QACF,KAAO,EAAA,IAAA;AAAA,QACP,QAAA;AAAA,QACA,KAAO,EAAA,MAAA,CAAO,KAAM,CAAA,WAAA,CAAY,UAAU,EAAE,CAAA;AAAA,QAC5C,QAAU,EAAA,MAAA,CAAO,KAAM,CAAA,WAAA,CAAY,UAAU,EAAE,CAAA;AAAA,QAC/C,YAAc,EAAA,MAAA,CAAO,KAAM,CAAA,WAAA,CAAY,cAAc,EAAE,CAAA;AAAA,OAC3D;AAAA,MACA,EAAI,EAAA,IAAA;AAAA,KACR,CAAA;AAAA,GACJ;AAAA,EACQ,wBAAwB,aAAsC,EAAA;AAClE,IAAA,MAAM,EAAE,IAAM,EAAA,IAAA,KAAS,IAAK,CAAA,kBAAA,CAAmB,eAAe,CAAC,CAAA,CAAA;AAC/D,IAAM,MAAA,CAAC,SAAW,EAAA,WAAW,CAAI,GAAA,IAAA,CAAA;AAEjC,IAAO,OAAA;AAAA,MACH,IAAM,EAAA,yBAAA;AAAA,MACN,IAAM,EAAA,EAAE,SAAW,EAAA,IAAA,EAAM,WAAW,WAAY,EAAA;AAAA,MAChD,EAAI,EAAA,IAAA;AAAA,KACR,CAAA;AAAA,GACJ;AAAA,EAUQ,QAAQ,GAAqB,EAAA;AACjC,IAAA,OAAO,IAAI,UAAW,CAAA,IAAI,IAAI,GAAI,CAAA,KAAA,CAAM,CAAC,CAAI,GAAA,GAAA,CAAA;AAAA,GACjD;AAAA,EAEQ,kBAAA,CAAmB,eAAuB,KAAiD,EAAA;AAC/F,IAAM,MAAA,GAAA,GAAM,IAAK,CAAA,OAAA,CAAQ,aAAa,CAAA,CAAA;AACtC,IAAA,IAAI,MAAS,GAAA,CAAA,CAAA;AAEb,IAAA,MAAM,EAAE,IAAM,EAAA,IAAA,KAAS,IAAK,CAAA,WAAA,CAAY,KAAK,MAAM,CAAA,CAAA;AACnD,IAAS,MAAA,GAAA,IAAA,CAAA;AAET,IAAA,MAAM,OAAiB,EAAC,CAAA;AACxB,IAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,KAAA,EAAO,CAAK,EAAA,EAAA;AAC5B,MAAA,MAAM,CAAI,GAAA,IAAA,CAAK,aAAc,CAAA,GAAA,EAAK,MAAM,CAAA,CAAA;AACxC,MAAK,IAAA,CAAA,IAAA,CAAK,EAAE,KAAK,CAAA,CAAA;AACjB,MAAA,MAAA,GAAS,CAAE,CAAA,IAAA,CAAA;AAAA,KACf;AACA,IAAO,OAAA,EAAE,MAAM,IAAK,EAAA,CAAA;AAAA,GACxB;AAAA,EAEQ,cAAc,OAAmC,EAAA;AACrD,IAAI,IAAA,OAAA,CAAQ,WAAW,EAAI,EAAA;AACvB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAmD,gDAAA,EAAA,OAAA,CAAQ,MAAM,CAAE,CAAA,CAAA,CAAA;AAAA,KACvF;AACA,IAAA,MAAM,KAAQ,GAAA,MAAA,CAAO,KAAM,CAAA,QAAA,CAAS,OAAO,OAAO,CAAA,CAAA;AAClD,IAAA,MAAM,QAAW,GAAA,UAAA,CAAW,IAAK,CAAA,KAAK,EAAE,OAAQ,EAAA,CAAA;AAChD,IAAA,OAAO,OAAO,SAAU,CAAA,IAAA,CAAK,OAAO,KAAM,CAAA,OAAA,CAAQ,QAAQ,CAAC,CAAA,CAAA;AAAA,GAC/D;AAAA,EASQ,WAAA,CAAY,SAAiB,MAAgD,EAAA;AACjF,IAAA,MAAM,UAAa,GAAA,OAAA,CAAQ,KAAM,CAAA,MAAA,EAAQ,SAAS,CAAC,CAAA,CAAA;AACnD,IAAM,MAAA,GAAA,GAAM,QAAS,CAAA,UAAA,EAAY,EAAE,CAAA,CAAA;AACnC,IAAA,IAAI,CAAC,MAAA,CAAO,QAAS,CAAA,GAAG,CAAK,IAAA,GAAA,IAAO,CAAG,EAAA,MAAM,IAAI,KAAA,CAAM,CAAyB,sBAAA,EAAA,UAAU,CAAE,CAAA,CAAA,CAAA;AAC5F,IAAA,MAAM,QAAQ,MAAS,GAAA,CAAA,CAAA;AACvB,IAAM,MAAA,GAAA,GAAM,QAAQ,GAAM,GAAA,CAAA,CAAA;AAC1B,IAAA,MAAM,OAAU,GAAA,OAAA,CAAQ,KAAM,CAAA,KAAA,EAAO,GAAG,CAAA,CAAA;AACxC,IAAA,IAAI,QAAQ,MAAW,KAAA,GAAA,GAAM,GAAS,MAAA,IAAI,MAAM,CAAyB,uBAAA,CAAA,CAAA,CAAA;AACzE,IAAO,OAAA,EAAE,MAAM,MAAO,CAAA,KAAA,CAAM,WAAW,IAAO,GAAA,OAAO,CAAG,EAAA,IAAA,EAAM,GAAI,EAAA,CAAA;AAAA,GACtE;AAAA,EAQQ,aAAA,CAAc,SAAiB,MAAiD,EAAA;AACpF,IAAA,MAAM,IAAO,GAAA,OAAA,CAAQ,KAAM,CAAA,MAAA,EAAQ,SAAS,EAAE,CAAA,CAAA;AAC9C,IAAI,IAAA,IAAA,CAAK,WAAW,EAAI,EAAA,MAAM,IAAI,KAAM,CAAA,CAAA,qBAAA,EAAwB,MAAM,CAAE,CAAA,CAAA,CAAA;AACxE,IAAO,OAAA,EAAE,KAAO,EAAA,IAAA,CAAK,aAAc,CAAA,IAAI,EAAE,QAAS,EAAA,EAAG,IAAM,EAAA,MAAA,GAAS,EAAG,EAAA,CAAA;AAAA,GAC3E;AAAA,EAQQ,YAAA,CAAa,SAAiB,MAAiD,EAAA;AACnF,IAAA,MAAM,IAAO,GAAA,OAAA,CAAQ,KAAM,CAAA,MAAA,EAAQ,SAAS,EAAE,CAAA,CAAA;AAC9C,IAAI,IAAA,IAAA,CAAK,WAAW,EAAI,EAAA,MAAM,IAAI,KAAM,CAAA,CAAA,oBAAA,EAAuB,MAAM,CAAE,CAAA,CAAA,CAAA;AACvE,IAAA,MAAM,KAAQ,GAAA,MAAA,CAAO,KAAM,CAAA,QAAA,CAAS,OAAO,IAAI,CAAA,CAAA;AAC/C,IAAA,MAAM,QAAW,GAAA,UAAA,CAAW,IAAK,CAAA,KAAK,EAAE,OAAQ,EAAA,CAAA;AAChD,IAAM,MAAA,EAAA,GAAK,OAAO,SAAU,CAAA,IAAA,CAAK,OAAO,KAAM,CAAA,OAAA,CAAQ,QAAQ,CAAC,CAAA,CAAA;AAC/D,IAAA,OAAO,EAAE,KAAO,EAAA,EAAA,CAAG,UAAY,EAAA,IAAA,EAAM,SAAS,EAAG,EAAA,CAAA;AAAA,GACrD;AAAA,EAQQ,WAAA,CAAY,SAAiB,MAAiD,EAAA;AAClF,IAAA,MAAM,IAAO,GAAA,OAAA,CAAQ,KAAM,CAAA,MAAA,EAAQ,SAAS,EAAE,CAAA,CAAA;AAC9C,IAAI,IAAA,IAAA,CAAK,WAAW,EAAI,EAAA,MAAM,IAAI,KAAM,CAAA,CAAA,qBAAA,EAAwB,MAAM,CAAE,CAAA,CAAA,CAAA;AACxE,IAAA,OAAO,EAAE,KAAO,EAAA,IAAA,GAAO,IAAM,EAAA,IAAA,EAAM,SAAS,EAAG,EAAA,CAAA;AAAA,GACnD;AAGJ;;AC7WY,IAAA,mBAAA,GAAA,CAAL,CAAKC,oBAAL,KAAA;AACH,EAAAA,oBAAAA,CAAAA,oBAAAA,CAAA,UAAW,CAAA,GAAA,UAAA,CAAW,QAAtB,CAAA,GAAA,UAAA,CAAA;AACA,EAAAA,oBAAAA,CAAAA,oBAAAA,CAAA,OAAQ,CAAA,GAAA,UAAA,CAAW,KAAnB,CAAA,GAAA,OAAA,CAAA;AAFQ,EAAAA,OAAAA,oBAAAA,CAAAA;AAAA,CAAA,EAAA,mBAAA,IAAA,EAAA,EAAA;AAIA,IAAA,mBAAA,GAAA,CAAL,CAAKC,oBAAL,KAAA;AACH,EAAAA,oBAAAA,CAAAA,oBAAAA,CAAA,SAAU,CAAA,GAAA,UAAA,CAAW,OAArB,CAAA,GAAA,SAAA,CAAA;AACA,EAAAA,oBAAAA,CAAAA,oBAAAA,CAAA,QAAS,CAAA,GAAA,UAAA,CAAW,MAApB,CAAA,GAAA,QAAA,CAAA;AAFQ,EAAAA,OAAAA,oBAAAA,CAAAA;AAAA,CAAA,EAAA,mBAAA,IAAA,EAAA,EAAA;AAyOA,IAAA,aAAA,MAAAC,cAAL,KAAA;AACH,EAAAA,eAAA,KAAM,CAAA,GAAA,KAAA,CAAA;AACN,EAAAA,eAAA,QAAS,CAAA,GAAA,QAAA,CAAA;AACT,EAAAA,eAAA,KAAM,CAAA,GAAA,KAAA,CAAA;AACN,EAAAA,eAAA,QAAS,CAAA,GAAA,QAAA,CAAA;AACT,EAAAA,eAAA,OAAQ,CAAA,GAAA,OAAA,CAAA;AALA,EAAAA,OAAAA,cAAAA,CAAAA;AAAA,CAAA,EAAA,aAAA,IAAA,EAAA,EAAA;AA8CA,IAAA,cAAA,MAAAC,eAAL,KAAA;AACH,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,WAAQ,CAAR,CAAA,GAAA,OAAA,CAAA;AACA,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,uBAAoB,CAApB,CAAA,GAAA,mBAAA,CAAA;AAFQ,EAAAA,OAAAA,eAAAA,CAAAA;AAAA,CAAA,EAAA,cAAA,IAAA,EAAA;;ACzSL,MAAM,aAAc,CAAA;AAAA,EAIvB,IAAI,QAAW,GAAA;AAAE,IAAA,OAAO,KAAK,eAAgB,CAAA,QAAA,CAAA;AAAA,GAAU;AAAA,EAEvD,YAAY,QAAmC,EAAA;AAC3C,IAAA,IAAA,CAAK,eAAkB,GAAA,QAAA,CAAA;AAAA,GAC3B;AAAA,EAIA,MAAM,YAAY,OAA8C,EAAA;AAC5D,IAAO,OAAA,IAAA,CAAK,uBAAuB,OAAO,CAAA,CAAA;AAAA,GAC9C;AAAA,EAEA,MAAM,cAAc,OAA8C,EAAA;AAC9D,IAAI,IAAA;AACA,MAAA,MAAM,WAAW,MAAM,IAAA,CAAK,sBAAuB,CAAA,OAAA,EAAS,eAAe,KAAK,CAAA,CAAA;AAChF,MAAO,OAAA,QAAA,CAAA;AAAA,aAEJ,GAAK,EAAA;AAER,MAAA,OAAO,EAAC,CAAA;AAAA,KACZ;AAAA,GACJ;AAAA,EAEA,MAAM,iBAAiB,OAA8C,EAAA;AACjE,IAAA,OAAO,IAAK,CAAA,sBAAA,CAAuB,OAAS,EAAA,cAAA,CAAe,iBAAiB,CAAA,CAAA;AAAA,GAChF;AAAA,EASA,MAAM,sBAAuB,CAAA,OAAA,EAAiB,IAAoD,EAAA;AAC9F,IAAM,MAAA,eAAA,GAAkB,KAAK,QAAS,CAAA,UAAA,CAAA;AAGtC,IAAA,MAAM,QAAW,GAAA,MAAM,IAAK,CAAA,sBAAA,CAAuB,OAAO,CAAA,CAAA;AAE1D,IAAA,MAAM,UAA8B,EAAC,CAAA;AAGrC,IAAA,KAAA,MAAW,QAAQ,QAAU,EAAA;AACzB,MAAI,IAAA;AACA,QAAA,MAAM,WAAc,GAAA,MAAM,eAAgB,CAAA,UAAA,CAAW,IAAI,CAAA,CAAA;AAGzD,QAAA,IAAG,IAAS,KAAA,KAAA,CAAA,IAAa,WAAY,CAAA,IAAA,KAAS,IAAM,EAAA,SAAA;AAEpD,QAAA,OAAA,CAAQ,IAAK,CAAA;AAAA,UACT,OAAA,EAAS,KAAK,QAAS,EAAA;AAAA,UACvB,OAAS,EAAA;AAAA,YACL,SAAS,WAAY,CAAA,OAAA;AAAA,YACrB,UAAU,WAAY,CAAA,QAAA;AAAA,YACtB,MAAM,WAAY,CAAA,IAAA;AAAA,YAClB,WAAA,EAAa,WAAY,CAAA,WAAA,CAAY,QAAS,EAAA;AAAA,YAC9C,SAAW,EAAA;AAAA,cACP,MAAA,EAAQ,WAAY,CAAA,SAAA,CAAU,QAAS,EAAA;AAAA,cACvC,QAAU,EAAA,EAAA;AAAA,cACV,MAAQ,EAAA,QAAA;AAAA,aACZ;AAAA,YACA,MAAQ,EAAA;AAAA,cACJ,MAAA,EAAQ,WAAY,CAAA,MAAA,CAAO,QAAS,EAAA;AAAA,cACpC,QAAU,EAAA,EAAA;AAAA,cACV,MAAQ,EAAA,QAAA;AAAA,aACZ;AAAA,YACA,SAAA,EAAW,IAAI,IAAA,CAAK,MAAO,CAAA,WAAA,CAAY,SAAU,CAAA,QAAA,EAAU,CAAA,GAAI,GAAI,CAAA,CAAE,cAAe,EAAA;AAAA,WACxF;AAAA,SACH,CAAA,CAAA;AAAA,eACI,GAAK,EAAA;AAEV,QAAA,OAAA,CAAQ,KAAK,CAAsC,mCAAA,EAAA,IAAA,CAAK,QAAS,EAAC,IAAI,GAAG,CAAA,CAAA;AACzE,QAAA,SAAA;AAAA,OACJ;AAAA,KACJ;AAEA,IAAO,OAAA,OAAA,CAAA;AAAA,GACX;AAAA,EAKA,MAAc,sBACV,CAAA,KAAA,EACA,SAAY,GAAA,CAAA,EACZ,UAA2B,QACP,EAAA;AACpB,IAAM,MAAA,eAAA,GAAkB,KAAK,QAAS,CAAA,UAAA,CAAA;AAGtC,IAAM,MAAA,MAAA,GAAS,MAAM,eAAgB,CAAA,WAAA;AAAA,MACjC,eAAgB,CAAA,OAAA,CAAQ,QAAS,CAAA,IAAA,EAAM,KAAK,CAAA;AAAA,MAC5C,SAAA;AAAA,MACA,OAAA;AAAA,KACJ,CAAA;AAGA,IAAM,MAAA,QAAA,GAAW,MAAM,eAAgB,CAAA,WAAA;AAAA,MACnC,eAAgB,CAAA,OAAA,CAAQ,QAAS,CAAA,KAAA,EAAO,IAAI,CAAA;AAAA,MAC5C,SAAA;AAAA,MACA,OAAA;AAAA,KACJ,CAAA;AAEA,IAAM,MAAA,KAAA,QAAY,GAAY,EAAA,CAAA;AAG9B,IAAA,KAAA,MAAW,KAAK,MAAQ,EAAA;AACpB,MAAM,MAAA,OAAA,GAAU,EAAE,IAAM,EAAA,OAAA,CAAA;AACxB,MAAA,IAAI,CAAC,OAAS,EAAA,SAAA;AACd,MAAM,KAAA,CAAA,GAAA,CAAI,OAAQ,CAAA,QAAA,EAAU,CAAA,CAAA;AAAA,KAChC;AAGA,IAAA,KAAA,MAAW,KAAK,QAAU,EAAA;AACtB,MAAM,MAAA,OAAA,GAAU,EAAE,IAAM,EAAA,OAAA,CAAA;AACxB,MAAA,IAAI,CAAC,OAAS,EAAA,SAAA;AACd,MAAM,KAAA,CAAA,MAAA,CAAO,OAAQ,CAAA,QAAA,EAAU,CAAA,CAAA;AAAA,KACnC;AAGA,IAAO,OAAA,KAAA,CAAM,IAAK,CAAA,KAAK,CAAE,CAAA,GAAA,CAAI,CAAC,EAAO,KAAA,SAAA,CAAU,IAAK,CAAA,EAAE,CAAC,CAAA,CAAA;AAAA,GAC3D;AAAA,EAQA,MAAM,sBAAsB,OAA6C,EAAA;AAErE,IAAA,MAAM,QAAW,GAAA,MAAM,IAAK,CAAA,2BAAA,CAA4B,OAAO,CAAA,CAAA;AAC/D,IAAA,MAAM,UAA6B,EAAC,CAAA;AAGpC,IAAA,KAAA,MAAW,QAAQ,QAAU,EAAA;AACzB,MAAI,IAAA;AACA,QAAA,MAAM,cAAc,MAAM,IAAA,CAAK,QAAS,CAAA,eAAA,CAAgB,KAAK,IAAI,CAAA,CAAA;AAEjE,QAAA,OAAA,CAAQ,IAAK,CAAA;AAAA,UACT,OAAA,EAAS,KAAK,QAAS,EAAA;AAAA,UACvB,OAAS,EAAA;AAAA,YACL,WAAW,WAAY,CAAA,SAAA;AAAA,YACvB,UAAY,EAAA;AAAA,cACR,MAAA,EAAQ,WAAY,CAAA,SAAA,CAAU,QAAS,EAAA;AAAA,cACvC,QAAU,EAAA,EAAA;AAAA,cACV,MAAQ,EAAA,KAAA;AAAA,aACZ;AAAA,YACA,OAAA,EAAS,IAAI,IAAA,CAAK,MAAO,CAAA,WAAA,CAAY,OAAQ,CAAA,QAAA,EAAU,CAAA,GAAI,GAAI,CAAA,CAAE,OAAQ,EAAA;AAAA,WAC7E;AAAA,SACH,CAAA,CAAA;AAAA,eACI,GAAK,EAAA;AAEV,QAAA,OAAA,CAAQ,KAAK,CAAsC,mCAAA,EAAA,IAAA,CAAK,QAAS,EAAC,IAAI,GAAG,CAAA,CAAA;AACzE,QAAA,SAAA;AAAA,OACJ;AAAA,KACJ;AAEA,IAAO,OAAA,OAAA,CAAA;AAAA,GACX;AAAA,EAIA,MAAc,2BACV,CAAA,KAAA,EACA,SAAY,GAAA,CAAA,EACZ,UAA2B,QACP,EAAA;AACpB,IAAM,MAAA,QAAA,GAAW,KAAK,QAAS,CAAA,eAAA,CAAA;AAG/B,IAAM,MAAA,MAAA,GAAS,MAAM,QAAS,CAAA,WAAA;AAAA,MAC1B,QAAS,CAAA,OAAA,CAAQ,QAAS,CAAA,IAAA,EAAM,KAAK,CAAA;AAAA,MACrC,SAAA;AAAA,MACA,OAAA;AAAA,KACJ,CAAA;AAGA,IAAM,MAAA,QAAA,GAAW,MAAM,QAAS,CAAA,WAAA;AAAA,MAC5B,QAAS,CAAA,OAAA,CAAQ,QAAS,CAAA,KAAA,EAAO,IAAI,CAAA;AAAA,MACrC,SAAA;AAAA,MACA,OAAA;AAAA,KACJ,CAAA;AAEA,IAAM,MAAA,KAAA,QAAY,GAAY,EAAA,CAAA;AAG9B,IAAA,KAAA,MAAW,KAAK,MAAQ,EAAA;AACpB,MAAM,MAAA,OAAA,GAAU,EAAE,IAAM,EAAA,OAAA,CAAA;AACxB,MAAA,IAAI,CAAC,OAAS,EAAA,SAAA;AACd,MAAM,KAAA,CAAA,GAAA,CAAI,OAAQ,CAAA,QAAA,EAAU,CAAA,CAAA;AAAA,KAChC;AAGA,IAAA,KAAA,MAAW,KAAK,QAAU,EAAA;AACtB,MAAM,MAAA,OAAA,GAAU,EAAE,IAAM,EAAA,OAAA,CAAA;AACxB,MAAA,IAAI,CAAC,OAAS,EAAA,SAAA;AACd,MAAM,KAAA,CAAA,MAAA,CAAO,OAAQ,CAAA,QAAA,EAAU,CAAA,CAAA;AAAA,KACnC;AAGA,IAAO,OAAA,KAAA,CAAM,IAAK,CAAA,KAAK,CAAE,CAAA,GAAA,CAAI,CAAC,EAAO,KAAA,SAAA,CAAU,IAAK,CAAA,EAAE,CAAC,CAAA,CAAA;AAAA,GAC3D;AACJ;;ACnMO,MAAM,sBAAyB,GAAA,KAAA;AAE/B,MAAM,qBAAgD,CAAA;AAAA,EAgBzD,YAAoB,MAAsB,EAAA;AAAtB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA,CAAA;AAChB,IAAI,IAAA;AACA,MAAA,IAAI,OAAO,QAAU,EAAA;AACjB,QAAA,IAAA,CAAK,WAAW,MAAO,CAAA,QAAA,CAAA;AACvB,QAAK,IAAA,CAAA,MAAA,GAAS,IAAK,CAAA,QAAA,CAAS,SAAU,EAAA,CAAA;AAAA,OAErC,MAAA;AACD,QAAK,IAAA,CAAA,QAAA,GAAW,IAAI,MAAO,CAAA,SAAA,CAAU,gBAAgB,MAAO,CAAA,OAAA,CAAQ,OAAQ,CAAA,CAAC,CAAC,CAAA,CAAA;AAAA,OAClF;AACA,MAAA,IAAA,CAAK,SAAS,MAAO,CAAA,MAAA,CAAA;AAErB,MAAK,IAAA,CAAA,eAAA,GAAkB,IAAI,uBAAwB,CAAA;AAAA,QAC/C,UAAU,IAAK,CAAA,QAAA;AAAA,QACf,QAAQ,IAAK,CAAA,MAAA;AAAA,QACb,OAAA,EAAS,OAAO,OAAQ,CAAA,OAAA;AAAA,OAC3B,CAAA,CAAA;AAED,MAAA,IAAA,CAAK,aAAgB,GAAA,IAAI,aAAc,CAAA,IAAA,CAAK,eAAe,CAAA,CAAA;AAC3D,MAAA,IAAA,CAAK,cAAiB,GAAA,IAAI,cAAe,CAAA,IAAA,CAAK,eAAe,CAAA,CAAA;AAC7D,MAAA,IAAA,CAAK,WAAc,GAAA,IAAI,WAAY,CAAA,IAAA,CAAK,eAAe,CAAA,CAAA;AACvD,MAAA,IAAA,CAAK,SAAY,GAAA,IAAI,SAAU,CAAA,IAAA,CAAK,eAAe,CAAA,CAAA;AACnD,MAAA,IAAA,CAAK,aAAgB,GAAA,IAAI,aAAc,CAAA,IAAA,CAAK,eAAe,CAAA,CAAA;AAAA,aAExD,KAAO,EAAA;AAEV,MAAM,MAAA,KAAA,CAAA;AAAA,KACV;AAAA,GACJ;AAAA,EA9BA,IAAI,QAAW,GAAA;AAAE,IAAA,OAAO,KAAK,eAAgB,CAAA,QAAA,CAAA;AAAA,GAAU;AAAA,EACvD,IAAI,OAAU,GAAA;AAAE,IAAA,OAAO,KAAK,MAAO,CAAA,OAAA,CAAA;AAAA,GAAS;AAAA,EAyC5C,MAAM,QAAQ,MAA+D,EAAA;AACzE,IAAA,IAAA,CAAK,UAAW,EAAA,CAAA;AAEhB,IAAM,MAAA,SAAA,GAAY,UAAU,WAAY,CAAA,MAAM,IACxC,MACA,GAAA,SAAA,CAAU,KAAK,MAAM,CAAA,CAAA;AAE3B,IAAA,MAAM,MAAS,GAAA,MAAM,IAAK,CAAA,aAAA,CAAc,eAAe,SAAS,CAAA,CAAA;AAChE,IAAA,OAAO,MAAO,CAAA,MAAA,CAAA;AAAA,GAClB;AAAA,EAOA,MAAM,SAAS,MAAiC,EAAA;AAC5C,IAAA,IAAA,CAAK,UAAW,EAAA,CAAA;AAEhB,IAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,MAAA,CAAQ,UAAW,EAAA,CAAA;AAC9C,IAAM,MAAA,SAAA,GAAY,SAAU,CAAA,IAAA,CAAK,MAAM,CAAA,CAAA;AAEvC,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,aAAc,CAAA,eAAA,CAAgB,SAAS,SAAS,CAAA,CAAA;AAC1E,IAAA,OAAO,MAAO,CAAA,MAAA,CAAA;AAAA,GAClB;AAAA,EAOA,MAAM,oBAAmD,GAAA;AACrD,IAAA,IAAA,CAAK,UAAW,EAAA,CAAA;AAChB,IAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,MAAA,CAAQ,UAAW,EAAA,CAAA;AAE9C,IAAA,OAAO,MAAM,IAAA,CAAK,aAAc,CAAA,qBAAA,CAAsB,OAAO,CAAA,CAAA;AAAA,GACjE;AAAA,EAOA,MAAM,cAAc,OAAkC,EAAA;AAClD,IAAA,IAAA,CAAK,UAAW,EAAA,CAAA;AAEhB,IAAM,MAAA,aAAA,GAAgB,SAAU,CAAA,IAAA,CAAK,OAAO,CAAA,CAAA;AAC5C,IAAA,MAAM,MAAS,GAAA,MAAM,IAAK,CAAA,aAAA,CAAc,cAAc,aAAa,CAAA,CAAA;AACnE,IAAA,OAAO,MAAO,CAAA,MAAA,CAAA;AAAA,GAClB;AAAA,EAQA,MAAM,MAAM,MAAiC,EAAA;AACzC,IAAA,IAAA,CAAK,UAAW,EAAA,CAAA;AAEhB,IAAA,MAAM,aAAgB,GAAA,MAAM,IAAK,CAAA,MAAA,CAAQ,UAAW,EAAA,CAAA;AACpD,IAAM,MAAA,SAAA,GAAY,SAAU,CAAA,IAAA,CAAK,MAAM,CAAA,CAAA;AAEvC,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,WAAY,CAAA,YAAA,CAAa,WAAW,aAAa,CAAA,CAAA;AAC3E,IAAA,OAAO,MAAO,CAAA,MAAA,CAAA;AAAA,GAClB;AAAA,EAIA,MAAM,OAA2B,GAAA;AAC7B,IAAM,MAAA,IAAI,MAAM,6BAA6B,CAAA,CAAA;AAAA,GACjD;AAAA,EASA,MAAM,gBAAiB,CAAA,OAAA,EAAiB,SAAoC,EAAA;AACxE,IAAA,IAAA,CAAK,UAAW,EAAA,CAAA;AAEhB,IAAM,MAAA,aAAA,GAAgB,SAAU,CAAA,IAAA,CAAK,OAAO,CAAA,CAAA;AAC5C,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,WAAY,CAAA,oBAAA,CAAqB,eAAe,SAAS,CAAA,CAAA;AACnF,IAAA,OAAO,MAAO,CAAA,MAAA,CAAA;AAAA,GAClB;AAAA,EAGA,MAAM,IAAI,MAAiC,EAAA;AACvC,IAAA,IAAA,CAAK,UAAW,EAAA,CAAA;AAEhB,IAAA,MAAM,KAAQ,GAAA,MAAM,IAAK,CAAA,MAAA,CAAQ,UAAW,EAAA,CAAA;AAQ5C,IAAA,IAAI,SAAS,MAAM,IAAA,CAAK,cAAe,CAAA,2BAAA,CAA4B,QAAQ,KAAK,CAAA,CAAA;AAChF,IAAA,OAAO,MAAU,IAAA,MAAA,CAAO,MAAS,GAAA,MAAA,CAAO,MAAS,GAAA,6BAAA,CAAA;AAAA,GACrD;AAAA,EAUA,MAAM,YAA0C,GAAA;AAE5C,IAAI,IAAA;AACA,MAAA,IAAI,CAAC,IAAK,CAAA,MAAA,EAAe,OAAA,OAAA,CAAQ,QAAQ,IAAI,CAAA,CAAA;AAE7C,MAAA,MAAM,aAAgB,GAAA,MAAM,IAAK,CAAA,MAAA,CAAQ,UAAW,EAAA,CAAA;AAGpD,MAAA,MAAM,aAAgB,GAAA,MAAM,IAAK,CAAA,QAAA,CAAS,WAAW,aAAa,CAAA,CAAA;AAClE,MAAA,MAAM,cAAiB,GAAA,IAAA,CAAK,OAAS,EAAA,cAAA,EAAgB,QAAY,IAAA,EAAA,CAAA;AACjE,MAAA,MAAM,YAAe,GAAA,IAAA,CAAK,OAAS,EAAA,cAAA,EAAgB,MAAU,IAAA,KAAA,CAAA;AAG7D,MAAA,MAAM,aAA+B,MAAM,IAAA,CAAK,QAAS,CAAA,WAAA,CAAY,UAAU,aAAa,CAAA,CAAA;AAC5F,MAAA,MAAM,SAAY,GAAA,KAAA,IAAS,IAAK,CAAA,OAAA,EAAS,gBAAgB,MAAU,IAAA,KAAA,CAAA,CAAA;AAGnE,MAAA,IAAI,aAAgB,GAAA,MAAM,IAAK,CAAA,aAAA,CAAc,cAAc,aAAa,CAAA,CAAA;AAExE,MAAI,IAAA,cAAA,GAAiB,SAAU,CAAA,IAAA,CAAK,CAAC,CAAA,CAAA;AACrC,MAAA,KAAA,IAAS,KAAK,aAAe,EAAA;AACzB,QAAiB,cAAA,GAAA,cAAA,CAAe,IAAI,SAAU,CAAA,IAAA,CAAK,EAAE,OAAQ,CAAA,SAAA,CAAU,MAAM,CAAC,CAAA,CAAA;AAAA,OAClF;AACA,MAAI,IAAA,aAAA,GAAgB,SAAU,CAAA,IAAA,CAAK,CAAC,CAAA,CAAA;AACpC,MAAA,KAAA,IAAS,KAAK,aAAe,EAAA;AACzB,QAAgB,aAAA,GAAA,aAAA,CAAc,IAAI,SAAU,CAAA,IAAA,CAAK,EAAE,OAAQ,CAAA,MAAA,CAAO,MAAM,CAAC,CAAA,CAAA;AAAA,OAC7E;AAGA,MAAA,MAAM,cAAgC,MAAM,IAAA,CAAK,QAAS,CAAA,QAAA,CAAS,UAAU,aAAa,CAAA,CAAA;AAG1F,MAAI,IAAA,YAAA,GAAe,OAAO,CAAC,CAAA,CAAA;AAC3B,MAAI,IAAA,WAAA,GAAc,OAAO,CAAC,CAAA,CAAA;AAC1B,MAAI,IAAA,UAAA,GAAa,OAAO,CAAC,CAAA,CAAA;AACzB,MAAM,MAAA,UAAA,GAAa,OAAO,IAAI,CAAA,CAAA;AAC9B,MAAI,IAAA;AAEA,QAAA,MAAM,CAAC,OAAS,EAAA,aAAa,CAAI,GAAA,MAAM,QAAQ,GAAI,CAAA;AAAA,UAC/C,IAAA,CAAK,QAAS,CAAA,SAAA,CAAU,KAAM,EAAA,CAAE,MAAM,MAAM,SAAA,CAAU,IAAK,CAAA,CAAC,CAAC,CAAA;AAAA,UAC7D,IAAA,CAAK,QAAS,CAAA,SAAA,CAAU,WAAY,EAAA,CAAE,MAAM,MAAM,SAAA,CAAU,IAAK,CAAA,CAAC,CAAC,CAAA;AAAA,SACtE,CAAA,CAAA;AAED,QAAA,MAAM,YAAe,GAAA,aAAA,CAAA;AACrB,QAAe,YAAA,GAAA,MAAA,CAAO,OAAQ,CAAA,QAAA,EAAU,CAAA,CAAA;AACxC,QAAc,WAAA,GAAA,MAAA,CAAO,aAAc,CAAA,QAAA,EAAU,CAAA,CAAA;AAC7C,QAAa,UAAA,GAAA,MAAA,CAAO,YAAa,CAAA,QAAA,EAAU,CAAA,CAAA;AAAA,eACtC,KAAO,EAAA;AACZ,QAAQ,OAAA,CAAA,GAAA,CAAI,wCAAwC,KAAK,CAAA,CAAA;AAAA,OAC7D;AAGA,MAAI,IAAA,cAAA,GAAiB,OAAO,CAAC,CAAA,CAAA;AAC7B,MAAI,IAAA,cAAA,GAAiB,OAAO,CAAC,CAAA,CAAA;AAE7B,MAAA,IAAI,aAAa,MAAO,CAAA,CAAC,KAAK,YAAe,GAAA,MAAA,CAAO,CAAC,CAAG,EAAA;AACpD,QAAA,cAAA,GAAkB,aAAa,YAAgB,GAAA,UAAA,CAAA;AAC/C,QAAI,IAAA,cAAA,GAAiB,cAAe,CAAA,QAAA,EAAY,EAAA;AAC5C,UAAiB,cAAA,GAAA,cAAA,GAAiB,eAAe,QAAS,EAAA,CAAA;AAAA,SAC9D;AAAA,OACJ;AAGA,MAAA,MAAM,SAAuB,GAAA;AAAA,QACzB,MAAQ,EAAA;AAAA,UACJ,MAAA,EAAQ,cAAc,QAAS,EAAA;AAAA,UAC/B,QAAU,EAAA,cAAA;AAAA,UACV,MAAQ,EAAA,YAAA;AAAA,SACZ;AAAA,QACA,GAAK,EAAA;AAAA,UACD,MAAA,EAAQ,WAAW,QAAS,EAAA;AAAA,UAC5B,QAAU,EAAA,cAAA;AAAA,UACV,MAAQ,EAAA,SAAA;AAAA,SACZ;AAAA,QACA,MAAQ,EAAA;AAAA,UACJ,MAAA,EAAQ,eAAe,QAAS,EAAA;AAAA,UAChC,QAAU,EAAA,cAAA;AAAA,UACV,MAAQ,EAAA,SAAA;AAAA,SACZ;AAAA,QACA,IAAM,EAAA;AAAA,UACF,MAAA,EAAQ,YAAY,QAAS,EAAA;AAAA,UAC7B,QAAU,EAAA,EAAA;AAAA,UACV,MAAQ,EAAA,OAAA;AAAA,SACZ;AAAA,QAEA,KAAO,EAAA;AAAA,UACH,YAAA;AAAA,UACA,UAAA;AAAA,UACA,WAAA;AAAA,UACA,UAAA;AAAA,UACA,cAAA;AAAA,UACA,cAAA;AAAA,SACJ;AAAA,QACA,OAAA,EAAS,KAAK,OAAQ,CAAA,OAAA;AAAA,OAC1B,CAAA;AACA,MAAO,OAAA,SAAA,CAAA;AAAA,aAEJ,KAAO,EAAA;AAEV,MAAM,MAAA,KAAA,CAAA;AAAA,KACV;AAAA,GACJ;AAAA,EAOA,MAAM,uBAAuB,OAA+C,EAAA;AACxE,IAAA,IAAA,CAAK,UAAW,EAAA,CAAA;AAEhB,IAAA,IAAI,YAAY,KAAW,CAAA,EAAA,OAAA,GAAU,MAAM,IAAA,CAAK,OAAQ,UAAW,EAAA,CAAA;AAGnE,IAAA,OAAO,MAAM,IAAA,CAAK,aAAc,CAAA,aAAA,CAAc,OAAO,CAAA,CAAA;AAAA,GACzD;AAAA,EAEA,MAAM,eAAe,OAA2C,EAAA;AAC5D,IAAA,IAAA,CAAK,UAAW,EAAA,CAAA;AAEhB,IAAA,IAAI,CAAC,OAAS,EAAA,OAAA,GAAU,MAAM,IAAA,CAAK,OAAQ,UAAW,EAAA,CAAA;AAEtD,IAAA,OAAO,MAAM,IAAA,CAAK,SAAU,CAAA,WAAA,CAAY,OAAO,CAAA,CAAA;AAAA,GACnD;AAAA,EAGQ,UAAa,GAAA;AACjB,IAAI,IAAA,CAAC,KAAK,MAAQ,EAAA;AACd,MAAA,MAAM,IAAI,KAAA;AAAA,QACN,kFAAA;AAAA,OACJ,CAAA;AAAA,KACJ;AAAA,GACJ;AAAA,EAQA,MAAM,YAAgC,GAAA;AAGlC,IAAA,MAAM,WAAc,GAAA,MAAM,IAAK,CAAA,QAAA,CAAS,eAAe,YAAa,EAAA,CAAA;AACpE,IAAM,MAAA,SAAA,GAAY,YAAY,QAAS,EAAA,CAAA;AAIvC,IAAA,MAAM,aAAa,SAAY,GAAA,GAAA,CAAA;AAE/B,IAAO,OAAA,UAAA,CAAA;AAAA,GACX;AAAA,EAGA,MAAM,cAAc,SAAoC,EAAA;AACpD,IAAA,MAAM,QAAmB,MAAM,IAAA,CAAK,QAAS,CAAA,cAAA,CAAe,QAAQ,SAAS,CAAA,CAAA;AAC7E,IAAO,OAAA,MAAA,CAAO,KAAM,CAAA,QAAA,EAAU,CAAA,CAAA;AAAA,GAClC;AAAA,EAEA,MAAM,YAA6B,GAAA;AAC/B,IAAO,OAAA,MAAM,IAAK,CAAA,SAAA,CAAU,SAAU,EAAA,CAAA;AAAA,GAC1C;AAAA,EAEA,MAAM,WAA4B,GAAA;AAC9B,IAAA,IAAI,aAAgB,GAAA,MAAM,IAAK,CAAA,QAAA,CAAS,gBAAgB,aAAc,EAAA,CAAA;AACtE,IAAA,IAAI,UAAa,GAAA,MAAM,IAAK,CAAA,QAAA,CAAS,eAAe,UAAW,EAAA,CAAA;AAC/D,IAAA,IAAI,cAAiB,GAAA,MAAM,IAAK,CAAA,QAAA,CAAS,eAAe,cAAe,EAAA,CAAA;AAEvE,IAAO,OAAA;AAAA,MACH,aAAA;AAAA,MACA,UAAA;AAAA,MACA,cAAA;AAAA,KACJ,CAAA;AAAA,GACJ;AAAA,EAOA,MAAM,mBAAmB,OAA4C,EAAA;AACjE,IAAI,IAAA;AACA,MAAA,MAAM,WAAc,GAAA,MAAM,IAAK,CAAA,QAAA,CAAS,cAAe,EAAA,CAAA;AACvD,MAAM,MAAA,QAAA,GAAW,EAAE,QAAA,EAAU,WAAY,EAAA,CAAA;AAGzC,MAAA,MAAM,CAAC,aAAA,EAAe,OAAS,EAAA,eAAA,EAAiB,iBAAiB,iBAAmB,EAAA,aAAA,EAAe,eAAiB,EAAA,gBAAA,EAAkB,WAAa,EAAA,WAAW,CAAI,GAAA,MAAM,QAAQ,GAAI,CAAA;AAAA,QAChL,IAAK,CAAA,QAAA,CAAS,SAAU,CAAA,WAAA,CAAY,QAAQ,CAAA;AAAA,QAC5C,IAAK,CAAA,QAAA,CAAS,SAAU,CAAA,KAAA,CAAM,QAAQ,CAAA;AAAA,QACtC,IAAK,CAAA,QAAA,CAAS,QAAS,CAAA,aAAA,CAAc,QAAQ,CAAA;AAAA,QAC7C,IAAK,CAAA,QAAA,CAAS,QAAS,CAAA,aAAA,CAAc,QAAQ,CAAA;AAAA,QAC7C,IAAK,CAAA,QAAA,CAAS,QAAS,CAAA,eAAA,CAAgB,QAAQ,CAAA;AAAA,QAC/C,IAAK,CAAA,QAAA,CAAS,QAAS,CAAA,WAAA,CAAY,QAAQ,CAAA;AAAA,QAC3C,IAAK,CAAA,QAAA,CAAS,QAAS,CAAA,eAAA,CAAgB,QAAQ,CAAA;AAAA,QAC/C,IAAK,CAAA,QAAA,CAAS,QAAS,CAAA,iBAAA,CAAkB,QAAQ,CAAA;AAAA,QACjD,IAAA,CAAK,QAAS,CAAA,mBAAA,CAAoB,SAAU,EAAA;AAAA,QAC5C,IAAA,CAAK,QAAS,CAAA,mBAAA,CAAoB,SAAU,EAAA;AAAA,OAC/C,CAAA,CAAA;AAED,MAAA,MAAM,qBAAqB,MAAO,CAAA,aAAA,CAAc,UAAU,CAAA,GAAI,OAAO,IAAI,CAAA,CAAA;AACzE,MAAA,MAAM,uBAAuB,MAAO,CAAA,eAAA,CAAgB,UAAU,CAAA,GAAI,OAAO,IAAI,CAAA,CAAA;AAO7E,MAAA,IAAI,aAAgB,GAAA,MAAM,IAAK,CAAA,QAAA,CAAS,oBAAoB,kBAAmB,EAAA,CAAA;AAC/E,MAAA,IAAI,cAAsB,MAAO,CAAA,aAAA,CAAc,UAAU,CAAA,GAAI,OAAO,IAAI,CAAA,CAAA;AAIxE,MAAA,MAAM,oBAAuB,GAAA,MAAA,CAAO,sBAAsB,CAAA,GAAI,OAAO,GAAG,CAAA,CAAA;AAExE,MAAA,OAAO,4BAA6B,CAAA;AAAA,QAChC,OAAA;AAAA,QACA,aAAA;AAAA,QACA,OAAA;AAAA,QACA,eAAA;AAAA,QACA,oBAAA;AAAA,QACA,iBAAA;AAAA,QACA,kBAAA;AAAA,QACA,oBAAA;AAAA,QACA,eAAA;AAAA,QACA,gBAAA;AAAA,QACA,WAAA;AAAA,QACA,WAAA;AAAA,QACA,WAAA;AAAA,OACH,CAAA,CAAA;AAAA,aAEE,GAAU,EAAA;AACb,MAAA,MAAM,IAAI,KAAM,CAAA,CAAA,0CAAA,EAA6C,GAAK,EAAA,OAAA,IAAW,GAAG,CAAE,CAAA,CAAA,CAAA;AAAA,KACtF;AAAA,GACJ;AAAA,EAcA,MAAM,iBAAiB,OAKH,EAAA;AAChB,IAAA,IAAA,CAAK,UAAW,EAAA,CAAA;AAEhB,IAAA,MAAM,aAAgB,GAAA,MAAM,IAAK,CAAA,MAAA,CAAQ,UAAW,EAAA,CAAA;AAIpD,IAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,QAAA,CAAS,WAAY,CAAA;AAAA,MAC5C,IAAM,EAAA,aAAA;AAAA,MACN,EAAI,EAAA,aAAA;AAAA,MACJ,KAAA,EAAO,OAAO,SAAU,CAAA,IAAA;AAAA,KAC3B,CAAA,CAAA;AAGD,IAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,QAAA,CAAS,UAAW,EAAA,CAAA;AAC/C,IAAI,IAAA,QAAA,GACA,QAAQ,YACR,IAAA,OAAA,CAAQ,YACR,MAAO,CAAA,KAAA,CAAM,UAAW,CAAA,IAAA,EAAM,MAAM,CAAA,CAAA;AAIxC,IAAM,MAAA,OAAA,GAAU,SAAS,OAAW,IAAA,CAAA,CAAA;AAIpC,IAAA,MAAM,qBAAwB,GAAA,CAAA,CAAA;AAC9B,IAAA,MAAM,gBAAgB,OACjB,CAAA,GAAA,CAAI,qBAAqB,CAAA,CACzB,IAAI,OAAO,CAAA,CAAA;AAEhB,IAAM,MAAA,QAAA,GAAW,aAAc,CAAA,GAAA,CAAI,QAAQ,CAAA,CAAA;AAG3C,IAAM,MAAA,gBAAA,GAAmB,SAAS,gBAAoB,IAAA,GAAA,CAAA;AACtD,IAAA,MAAM,YAAe,GAAA,IAAA,CAAK,KAAM,CAAA,gBAAA,GAAmB,GAAG,CAAA,CAAA;AAEtD,IAAA,MAAM,eAAe,QAChB,CAAA,GAAA,CAAI,YAAY,CAAA,CAChB,IAAI,GAAG,CAAA,CAAA;AAEZ,IAAI,IAAA,SAAA,GAAY,aAAa,QAAS,EAAA,CAAA;AAGtC,IAAM,MAAA,mBAAA,GAAsB,OAAO,IAAqB,CAAA,CAAA;AACxD,IAAM,MAAA,YAAA,GAAe,SAAS,YAAgB,IAAA,mBAAA,CAAA;AAE9C,IAAA,IAAI,YAAY,YAAc,EAAA;AAC1B,MAAY,SAAA,GAAA,YAAA,CAAA;AAAA,KAChB;AAEA,IAAO,OAAA,SAAA,CAAA;AAAA,GACX;AAoDJ;;ACxhBO,MAAM,MAAO,CAAA;AAAA,EAuBhB,WAAA,CAAY,QAAuC,eAA2B,EAAA;AArB9E,IAAQ,IAAA,CAAA,OAAA,QAA4C,GAAI,EAAA,CAAA;AAsBpD,IAAA,IAAI,CAAC,MAAA,EAAc,MAAA,IAAI,MAAM,0BAA0B,CAAA,CAAA;AACvD,IAAA,IAAI,CAAC,KAAM,CAAA,OAAA,CAAQ,MAAM,CAAG,EAAA,MAAA,GAAS,CAAC,MAAM,CAAA,CAAA;AAI5C,IAAO,MAAA,CAAA,OAAA,CAAQ,CAAC,GAAQ,KAAA;AACpB,MAAQ,QAAA,GAAA,CAAI,QAAQ,OAAS;AAAA,QACzB,KAAK,UAAW,CAAA,OAAA,CAAA;AAAA,QAChB,KAAK,UAAW,CAAA,MAAA;AACZ,UAAK,IAAA,CAAA,OAAA,CAAQ,IAAI,GAAI,CAAA,OAAA,CAAQ,SAAS,IAAI,mBAAA,CAAoB,GAAG,CAAC,CAAA,CAAA;AAClE,UAAA,MAAA;AAAA,QAEJ,KAAK,UAAW,CAAA,QAAA,CAAA;AAAA,QAChB,KAAK,UAAW,CAAA,KAAA;AACZ,UAAK,IAAA,CAAA,OAAA,CAAQ,IAAI,GAAI,CAAA,OAAA,CAAQ,SAAS,IAAI,qBAAA,CAAsB,GAAG,CAAC,CAAA,CAAA;AACpE,UAAA,MAAA;AAAA,QAEJ;AACI,UAAA,OAAA,CAAQ,GAAI,CAAA,CAAA,sCAAA,EAAyC,GAAI,CAAA,OAAA,CAAQ,OAAO,CAAE,CAAA,CAAA,CAAA;AAC1E,UAAA,MAAM,IAAI,KAAM,CAAA,CAAA,2BAAA,EAA8B,GAAI,CAAA,OAAA,CAAQ,IAAI,CAAE,CAAA,CAAA,CAAA;AAAA,OACxE;AAAA,KACH,CAAA,CAAA;AAED,IAAA,IAAA,CAAK,eAAkB,GAAA,eAAA,CAAA;AAAA,GAC3B;AAAA,EAxCA,IAAI,MAAqC,GAAA;AACrC,IAAA,OAAO,IAAK,CAAA,eAAA,IAAmB,IAAK,CAAA,YAAA,CAAa,IAAK,CAAA,eAAe,CAC/D,GAAA,IAAA,CAAK,OAAQ,CAAA,GAAA,CAAI,IAAK,CAAA,eAAe,CAAI,GAAA,KAAA,CAAA,CAAA;AAAA,GACnD;AAAA,EAGA,aAAa,OAA2B,EAAA;AACpC,IAAO,OAAA,IAAA,CAAK,OAAQ,CAAA,GAAA,CAAI,OAAO,CAAA,CAAA;AAAA,GACnC;AAAA,EAGA,cAA4B,GAAA;AACxB,IAAA,OAAO,CAAC,GAAG,IAAK,CAAA,OAAA,CAAQ,MAAM,CAAA,CAAA;AAAA,GAClC;AAAA,EAiCA,SAAS,OAA2B,EAAA;AAChC,IAAA,MAAM,SAAY,GAAA,IAAA,CAAK,OAAQ,CAAA,GAAA,CAAI,OAAO,CAAA,CAAA;AAE1C,IAAA,IAAI,CAAC,SAAW,EAAA;AACZ,MAAQ,OAAA,CAAA,IAAA,CAAK,CAAqD,kDAAA,EAAA,OAAO,CAAE,CAAA,CAAA,CAAA;AAC3E,MAAO,OAAA,KAAA,CAAA;AAAA,KACX;AAEA,IAAA,IAAA,CAAK,eAAkB,GAAA,OAAA,CAAA;AACvB,IAAO,OAAA,IAAA,CAAA;AAAA,GACX;AACJ;;ACrEO,MAAM,cAAiB,GAAA;AAAA,EAE1B,iBAAA;AAAA,EACA,aAAA;AAAA,EACA,iBAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA,iBAAA;AAAA,EACA,eAAA;AAAA,EAIA,yBAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,gBAAA;AAAA,EACA,aAAA;AAAA,EACA,qBAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,gBAAA;AACJ,CAAA;;;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"stake.m.js","sources":["../src/networks/solana/clients/deposit.client.ts","../src/networks/solana/constants.ts","../src/networks/solana/utils.ts","../src/networks/solana/clients/distribution.client.ts","../src/networks/solana/clients/leaderboard.client.ts","../src/networks/solana/clients/outpost.client.ts","../src/networks/solana/clients/token.client.ts","../src/networks/solana/program.ts","../src/networks/solana/solana.ts","../src/networks/ethereum/contract.ts","../src/networks/ethereum/utils.ts","../src/networks/ethereum/clients/convert.client.ts","../src/networks/ethereum/clients/stake.client.ts","../src/networks/ethereum/clients/pretoken.client.ts","../src/networks/ethereum/clients/opp.client.ts","../src/types.ts","../src/networks/ethereum/clients/receipt.client.ts","../src/networks/ethereum/clients/validator.client.ts","../src/networks/ethereum/ethereum.ts","../src/staker.ts","../src/networks/ethereum/types.ts"],"sourcesContent":["import { AnchorProvider, BN, Program, Wallet } from '@coral-xyz/anchor';\nimport {\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 Connection,\n PublicKey,\n TransactionMessage,\n LAMPORTS_PER_SOL,\n Signer,\n} from '@solana/web3.js';\n\nimport {\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddressSync,\n} from '@solana/spl-token';\nimport * as multisig from \"@sqds/multisig\";\n\nimport { LiqsolCoreClientIdl, SolanaProgramService } from '../program';\n\nimport { GlobalAccount, WalletLike } from '../types';\n\nexport class DepositClient {\n private program: Program<LiqsolCoreClientIdl>;\n\n get connection() {\n return this.provider.connection;\n }\n\n get wallet(): WalletLike {\n return this.provider.wallet;\n }\n\n constructor(\n private readonly provider: AnchorProvider,\n private readonly pgs: SolanaProgramService\n ) {\n this.program = pgs.getProgram('liqsolCore');\n }\n\n /**\n * Build a deposit transaction:\n * SOL -> liqSOL via liqsol_core::deposit.\n */\n async buildDepositTx(\n amount: bigint,\n user = this.wallet.publicKey,\n ): Promise<TransactionInstruction> {\n if (!user) {\n throw new Error(\n 'DepositClient.buildDepositTx: wallet not connected',\n );\n }\n if (!amount || amount <= BigInt(0)) {\n throw new Error(\n 'DepositClient.buildDepositTx: amount must be greater than zero.',\n );\n }\n\n // -------------------------------------------------------------\n // PDAs\n // -------------------------------------------------------------\n const depositAuthority = this.pgs.deriveDepositAuthorityPda();\n const liqsolMint = this.pgs.deriveLiqsolMintPda();\n const liqsolMintAuthority = this.pgs.deriveLiqsolMintAuthorityPda();\n const reservePool = this.pgs.deriveReservePoolPda();\n const vault = this.pgs.deriveVaultPda();\n const controllerState = this.pgs.deriveStakeControllerStatePda();\n const payoutState = this.pgs.derivePayoutStatePda();\n const bucketAuthority = this.pgs.deriveBucketAuthorityPda();\n const payRateHistory = this.pgs.derivePayRateHistoryPda();\n const globalConfig = this.pgs.deriveGlobalConfigPda();\n\n // -------------------------------------------------------------\n // Token-2022 ATAs\n // -------------------------------------------------------------\n const userAta = getAssociatedTokenAddressSync(\n liqsolMint,\n user,\n true,\n TOKEN_2022_PROGRAM_ID,\n );\n\n // -------------------------------------------------------------\n // Distribution state + user_record (KEYED BY TOKEN ACCOUNT)\n // -------------------------------------------------------------\n const distributionState = this.pgs.deriveDistributionStatePda();\n const userRecord = this.pgs.deriveUserRecordPda(userAta);\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 this.pgs.deriveEphemeralStakeAddress(user, seed);\n\n // -------------------------------------------------------------\n // BUILD IX (MUST MATCH IDL)\n // -------------------------------------------------------------\n return await this.program.methods\n .deposit(new BN(amount.toString()), 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: this.pgs.PROGRAM_IDS.LIQSOL_TOKEN,\n stakeProgram: StakeProgram.programId,\n liqsolMint,\n userAta,\n liqsolMintAuthority,\n reservePool,\n vault,\n ephemeralStake,\n controllerState,\n payoutState,\n bucketAuthority,\n bucketTokenAccount,\n userRecord,\n distributionState,\n payRateHistory,\n instructionsSysvar: SYSVAR_INSTRUCTIONS_PUBKEY,\n clock: SYSVAR_CLOCK_PUBKEY,\n stakeHistory: SYSVAR_STAKE_HISTORY_PUBKEY,\n rent: SYSVAR_RENT_PUBKEY,\n globalConfig\n })\n .instruction();\n }\n\n /**\n * Build a withdraw-request transaction:\n * liqSOL -> SOL via liqsol_core::requestWithdraw.\n *\n * This:\n * - burns liqSOL from the user\n * - increments totalEncumberedFunds in global state\n * - mints an NFT receipt (liqReceiptData + NFT ATA for owner)\n */\n async buildWithdrawTx(\n amount: bigint,\n user = this.wallet.publicKey,\n ): Promise<TransactionInstruction> {\n if (!user) {\n throw new Error(\n 'DepositClient.buildWithdrawTx: wallet not connected',\n );\n }\n if (!amount || amount <= BigInt(0)) {\n throw new Error(\n 'DepositClient.buildWithdrawTx: amount must be greater than zero.',\n );\n }\n\n // -------------------------------------------------------------\n // Core program + liqSOL mint / user ATA\n // -------------------------------------------------------------\n const liqsolMint = this.pgs.deriveLiqsolMintPda();\n\n const userAta = getAssociatedTokenAddressSync(\n liqsolMint,\n user,\n true,\n TOKEN_2022_PROGRAM_ID,\n );\n\n // Distribution / balance-tracking\n // user_record is keyed by the user’s liqSOL ATA (same convention\n // as deposit/purchase).\n const userRecord = this.pgs.deriveUserRecordPda(userAta);\n const distributionState = this.pgs.deriveDistributionStatePda();\n\n // Reserve + stake controller PDAs\n const global = this.pgs.deriveWithdrawGlobalPda(); // withdraw operator state\n const reservePool = this.pgs.deriveReservePoolPda();\n const stakeAllocationState = this.pgs.deriveStakeAllocationStatePda();\n const stakeMetrics = this.pgs.deriveStakeMetricsPda();\n const maintenanceLedger = this.pgs.deriveMaintenanceLedgerPda();\n const globalConfig = this.pgs.deriveGlobalConfigPda(); // liqSOL config / roles\n\n // -------------------------------------------------------------\n // Need nextReceiptId from withdraw global state\n // -------------------------------------------------------------\n const globalAcct: GlobalAccount = await this.program.account.global.fetch(global);\n\n const rawId = globalAcct.nextReceiptId;\n let receiptId: bigint;\n\n if (typeof rawId === 'bigint') {\n // New-style IDL / accounts returning bigint directly\n receiptId = rawId;\n } else if (rawId != null && typeof rawId === 'object' && 'toString' in rawId) {\n // Anchor BN / bn.js or similar – normalize through string\n receiptId = BigInt(rawId.toString());\n } else if (typeof rawId === 'number') {\n // Just in case someone typed it as a JS number in tests\n receiptId = BigInt(rawId);\n } else {\n throw new Error(\n `DepositClient.buildWithdrawTx: unexpected nextReceiptId type (${typeof rawId})`,\n );\n }\n\n // -------------------------------------------------------------\n // NFT receipt PDAs (mint, metadata, data, ATA)\n // -------------------------------------------------------------\n const mintAuthority = this.pgs.deriveWithdrawMintAuthorityPda();\n const metadata = this.pgs.deriveWithdrawMintMetadataPda();\n\n const nftMint = this.pgs.deriveWithdrawNftMintPda(receiptId);\n const receiptData = this.pgs.deriveLiqReceiptDataPda(nftMint);\n\n const owner = user;\n const nftAta = getAssociatedTokenAddressSync(\n nftMint,\n owner,\n true,\n TOKEN_2022_PROGRAM_ID,\n );\n\n // Bucket token account (same bucket used by deposit/distribution)\n const bucketAuthority = this.pgs.deriveBucketAuthorityPda();\n const bucketTokenAccount = getAssociatedTokenAddressSync(\n liqsolMint,\n bucketAuthority,\n true,\n TOKEN_2022_PROGRAM_ID,\n );\n\n // -------------------------------------------------------------\n // BUILD IX (MUST MATCH requestWithdraw IDL)\n // -------------------------------------------------------------\n return await this.program.methods\n .requestWithdraw(new BN(amount.toString()))\n .accounts({\n user,\n owner,\n global,\n liqsolMint,\n userAta,\n userRecord,\n reservePool,\n stakeAllocationState,\n stakeMetrics,\n maintenanceLedger,\n clock: SYSVAR_CLOCK_PUBKEY,\n mintAuthority,\n receiptData,\n metadata,\n nftMint,\n nftAta,\n distributionState,\n bucketTokenAccount,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n tokenInterface: TOKEN_2022_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n rent: SYSVAR_RENT_PUBKEY,\n globalConfig,\n })\n .instruction();\n\n }\n}\n\n// A “wallet-adapter-like” shape (AnchorProvider.wallet matches this)\ntype WalletLikeSigner = {\n publicKey: PublicKey;\n signTransaction: (tx: Transaction) => Promise<Transaction>;\n};\n\nfunction isKeypairSigner(x: any): x is { publicKey: PublicKey; secretKey: Uint8Array } {\n return !!x && x.publicKey instanceof PublicKey && x.secretKey instanceof Uint8Array;\n}\n\nfunction isWalletLikeSigner(x: any): x is WalletLikeSigner {\n return !!x && x.publicKey instanceof PublicKey && typeof x.signTransaction === \"function\";\n}\n","// src/networks/solana/constants.ts\nimport { PublicKey, StakeProgram } from '@solana/web3.js';\nimport { SolChainID } from '@wireio/core';\n\nimport mainnetLiqsolCoreIDL from '../../assets/solana/mainnet/idl/liqsol_core.json';\nimport mainnetLiqSolTokenIDL from '../../assets/solana/mainnet/idl/liqsol_token.json';\nimport mainnetValidatorLeaderboardIDL from '../../assets/solana/mainnet/idl/validator_leaderboard.json';\nimport mainnetTransferHookIDL from '../../assets/solana/mainnet/idl/transfer_hook.json';\n\nimport devnetLiqsolCoreIDL from '../../assets/solana/devnet/idl/liqsol_core.json';\nimport devnetLiqSolTokenIDL from '../../assets/solana/devnet/idl/liqsol_token.json';\nimport devnetValidatorLeaderboardIDL from '../../assets/solana/devnet/idl/validator_leaderboard.json';\nimport devnetTransferHookIDL from '../../assets/solana/devnet/idl/transfer_hook.json';\nimport { SupportedSolChainID } from '../../types';\n\n/**\n * Per-chain program IDs (NOT global anymore).\n */\nexport type SolanaProgramIds = {\n LIQSOL_CORE: PublicKey;\n LIQSOL_TOKEN: PublicKey;\n VALIDATOR_LEADERBOARD: PublicKey;\n TRANSFER_HOOK: PublicKey;\n ALT_LOOKUP_TABLE: PublicKey;\n};\n\nconst MAINNET_PROGRAM_IDS: SolanaProgramIds = {\n LIQSOL_CORE: new PublicKey(mainnetLiqsolCoreIDL.address),\n LIQSOL_TOKEN: new PublicKey(mainnetLiqSolTokenIDL.address),\n VALIDATOR_LEADERBOARD: new PublicKey(mainnetValidatorLeaderboardIDL.address),\n TRANSFER_HOOK: new PublicKey(mainnetTransferHookIDL.address),\n ALT_LOOKUP_TABLE: new PublicKey(\"AQXTHwkdNBEiXeQuVA5uCoxvzgYUmudRxthQY4vWKCPS\")\n};\n\nconst DEVNET_PROGRAM_IDS: SolanaProgramIds = {\n LIQSOL_CORE: new PublicKey(devnetLiqsolCoreIDL.address),\n LIQSOL_TOKEN: new PublicKey(devnetLiqSolTokenIDL.address),\n VALIDATOR_LEADERBOARD: new PublicKey(devnetValidatorLeaderboardIDL.address),\n TRANSFER_HOOK: new PublicKey(devnetTransferHookIDL.address),\n ALT_LOOKUP_TABLE: new PublicKey(\"3MbupRDxUqPtJzoLLmjEYV3dXJdh1jojQrpDEQUqv7xb\")\n};\n\nexport const PROGRAM_IDS_BY_CHAIN: Record<SupportedSolChainID, SolanaProgramIds> = {\n [SolChainID.Mainnet]: MAINNET_PROGRAM_IDS,\n [SolChainID.Devnet]: DEVNET_PROGRAM_IDS,\n};\n\nexport const getProgramIds = (chainId: SolChainID): SolanaProgramIds => {\n const ids = PROGRAM_IDS_BY_CHAIN[chainId];\n if (!ids) throw new Error(`Unsupported Solana chainId=${chainId}`);\n return ids;\n};\n\n/**\n * ---------------------------------------------------------------------------\n * PDA SEEDS (must match on-chain programs)\n * ---------------------------------------------------------------------------\n */\nexport const PDA_SEEDS = {\n // GLOBAL CONFIG\n GLOBAL_CONFIG: 'global_config',\n\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 / price history\n PAY_RATE_HISTORY: 'pay_rate_history',\n PRICE_HISTORY: 'price_history',\n\n // validator leaderboard (state + records)\n LEADERBOARD_STATE: 'leaderboard_state',\n VALIDATOR_RECORD: 'validator',\n GLOBAL_STAKE_INFO: 'global_stake_info',\n\n // Outpost / Wire pretokens\n OUTPOST_GLOBAL_STATE: 'outpost_global_state',\n LIQSOL_POOL: 'liqsol_pool',\n OUTPOST_ACCOUNT: 'outpost_account',\n USER_PRETOKEN_RECORD: 'user_pretoken_record',\n TRANCHE_STATE: 'tranche_state',\n\n // BAR module (bonded actor roles)\n BAR_STATE_SEED: 'bar_state',\n BONDED_ACTOR_SEED: 'bonded_actor',\n BOND_LEVEL_SEED: 'bond_level',\n\n // SPL transfer-hook extra account metas\n EXTRA_ACCOUNT_METAS: 'extra-account-metas',\n\n // Withdraw module / receipts\n WITHDRAW_GLOBAL: 'global',\n STAKE_ALLOCATION_STATE: 'stake_allocation_state',\n STAKE_METRICS: 'stake_metrics',\n MAINTENANCE_LEDGER: 'maintenance_ledger',\n WITHDRAW_MINT_AUTHORITY: 'mint_authority',\n MINT_METADATA: 'mint_metadata',\n LIQ_RECEIPT_DATA: 'liq_receipt_data',\n WITHDRAW_MINT: 'mint',\n} as const;\n\n/**\n * Ephemeral stake account address seed helper\n * (this one really is global & chain-agnostic).\n */\nexport const deriveEphemeralStakeAddress = async (\n user: PublicKey,\n seed: number,\n): Promise<PublicKey> => {\n const seedStr = `ephemeral_${seed}`;\n return PublicKey.createWithSeed(user, seedStr, StakeProgram.programId);\n};\n\n/**\n * Constant keys (Chainlink)\n */\nexport const CHAINLINK_FEED = new PublicKey(\n 'CH31Xns5z3M1cTAbKW34jcxPPciazARpijcHj9rxtemt',\n);\nexport const CHAINLINK_PROGRAM = new PublicKey(\n 'HEvSKofvBgfaexv23kMabbYqxasxU3mQ4ibBMEmJWHny',\n);\n\n/**\n * ---------------------------------------------------------------------------\n * ECONOMICS & MATH CONSTANTS\n * ---------------------------------------------------------------------------\n */\nexport const PAY_RATE_SCALE_FACTOR = BigInt(1_000_000_000_000); // 10^12\nexport const DEFAULT_AVERAGE_PAY_RATE = BigInt(191_780_821);\nexport const DEFAULT_PAY_RATE_LOOKBACK = 5;\nexport const EPHEMERAL_RENT_EXEMPTION = 2_282_880;\n\nexport const LAMPORTS_PER_SOL = 1_000_000_000;\nexport const INDEX_SCALE = BigInt(1_000_000_000_000); // 1e12\n\nexport const lamportsToSol = (lamports: number | bigint): number =>\n Number(lamports) / LAMPORTS_PER_SOL;\n\nexport const solToLamports = (sol: number): bigint =>\n BigInt(Math.round(sol * LAMPORTS_PER_SOL));","import { Program, BN, AnchorProvider } from '@coral-xyz/anchor';\n\nimport {\n Connection,\n Keypair,\n PublicKey,\n} from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n getAssociatedTokenAddress,\n} from '@solana/spl-token';\n\nimport {\n DEFAULT_AVERAGE_PAY_RATE,\n EPHEMERAL_RENT_EXEMPTION,\n solToLamports,\n DEFAULT_PAY_RATE_LOOKBACK,\n CHAINLINK_FEED,\n CHAINLINK_PROGRAM,\n} from './constants';\n\nimport { LiqsolCore } from '../../assets/solana/devnet/types/liqsol_core';\nimport { GlobalState, TrancheState } from './types';\nimport { TrancheLadderItem, TrancheSnapshot } from '../../types';\nimport { ChainID } from '@wireio/core';\nimport { SolanaProgramService } from './program';\n\n// -----------------------------------------------------------------------------\n// Tranche Support\n// -----------------------------------------------------------------------------\nconst INDEX_SCALE = BigInt(1_000_000_000_000); // 1e12\nconst USD_SCALE = BigInt(100_000_000); // 1e8\nconst BPS = BigInt(10_000);\n\n/**\n * Apply one forward growth step: value * (BPS + growthBps) / BPS.\n * Simple integer round-half-up.\n */\nfunction growSupplyOnce(value: bigint, growthBps: number): bigint {\n const g = BigInt(growthBps);\n return (value * (BPS + g) + BPS / BigInt(2)) / BPS;\n}\n\n/**\n * Apply one backward step: value * BPS / (BPS + growthBps).\n * Also integer round-half-up.\n */\nfunction shrinkSupplyOnce(value: bigint, growthBps: number): bigint {\n const g = BigInt(growthBps);\n return (value * BPS + (BPS + g) / BigInt(2)) / (BPS + g);\n}\n\n/**\n * Price step is expressed in *cents*, while prices are 1e8 USD.\n * 1 cent = 0.01 * 1e8 = 1e6, so:\n * step = priceGrowthCents * 1e6\n */\nfunction priceStepUsd1e8(priceGrowthCents: number): bigint {\n if (!priceGrowthCents) return BigInt(0);\n const CENT_SCALE = USD_SCALE / BigInt(100); // 1e6\n return BigInt(priceGrowthCents) * CENT_SCALE;\n}\n\nfunction growPriceOnceUsd1e8(value: bigint, priceGrowthCents: number): bigint {\n const step = priceStepUsd1e8(priceGrowthCents);\n return value + step;\n}\n\nfunction shrinkPriceOnceUsd1e8(value: bigint, priceGrowthCents: number): bigint {\n const step = priceStepUsd1e8(priceGrowthCents);\n if (step === BigInt(0)) return value;\n if (value <= step) return BigInt(0);\n return value - step;\n}\n\n/** BN | bigint -> bigint helper (keeps code readable) */\nexport function toBigint(x: any): bigint {\n if (typeof x === 'bigint') return x;\n if (typeof x === 'number') return BigInt(x);\n // Anchor BN\n return BigInt(x.toString());\n}\n\n/**\n * Convert token amount -> shares using the same rule as on-chain tests:\n * shares = ceil(amount * INDEX_SCALE / currentIndex)\n */\nexport function tokensToShares(amount: bigint, currentIndex: bigint): bigint {\n if (amount === BigInt(0)) return BigInt(0);\n const num = amount * INDEX_SCALE;\n const q = num / currentIndex;\n const r = num % currentIndex;\n return r === BigInt(0) ? q : q + BigInt(1);\n}\n\n/**\n * Build a local tranche ladder around the current tranche\n * using only on-chain config + current state.\n *\n * Rules (from liqsol_core tests):\n * - past tranches are fully sold\n * - current tranche has (initial - currentSupply) sold\n * - future tranches start with 0 sold\n * - supply/price grow by supplyGrowthBps/priceGrowthBps per tranche\n */\nexport function buildSolanaTrancheLadder(options: {\n currentTranche: number;\n initialTrancheSupply: bigint;\n currentTrancheSupply: bigint;\n currentPriceUsd: bigint; // 1e8 scale\n supplyGrowthBps: number;\n priceGrowthCents: number; // e.g. 2 -> $0.02 per tranche\n windowBefore?: number;\n windowAfter?: number;\n}): TrancheLadderItem[] {\n const {\n currentTranche,\n initialTrancheSupply,\n currentTrancheSupply,\n currentPriceUsd,\n supplyGrowthBps,\n priceGrowthCents,\n windowBefore = 5,\n windowAfter = 5,\n } = options;\n\n const startId = Math.max(0, currentTranche - windowBefore);\n const endId = currentTranche + windowAfter;\n\n const capacity = new Map<number, bigint>();\n const price = new Map<number, bigint>();\n\n // Seed current tranche\n capacity.set(currentTranche, initialTrancheSupply);\n price.set(currentTranche, currentPriceUsd);\n\n // Forward (future tranches): grow supply by BPS, price by +cents (linear)\n for (let id = currentTranche + 1; id <= endId; id++) {\n const prevCap = capacity.get(id - 1)!;\n const prevPrice = price.get(id - 1)!;\n\n capacity.set(id, growSupplyOnce(prevCap, supplyGrowthBps));\n price.set(id, growPriceOnceUsd1e8(prevPrice, priceGrowthCents));\n }\n\n // Backward (past tranches): shrink supply by inverse BPS, price by -cents\n for (let id = currentTranche - 1; id >= startId; id--) {\n const nextCap = capacity.get(id + 1)!;\n const nextPrice = price.get(id + 1)!;\n\n capacity.set(id, shrinkSupplyOnce(nextCap, supplyGrowthBps));\n price.set(id, shrinkPriceOnceUsd1e8(nextPrice, priceGrowthCents));\n }\n\n const ladder: TrancheLadderItem[] = [];\n for (let id = startId; id <= endId; id++) {\n const cap = capacity.get(id)!;\n\n let sold: bigint;\n if (id < currentTranche) {\n // Past tranches fully sold\n sold = cap;\n } else if (id === currentTranche) {\n // Current tranche: cap - remaining\n sold = cap - currentTrancheSupply;\n } else {\n // Future tranches not yet opened\n sold = BigInt(0);\n }\n\n ladder.push({\n id,\n capacity: cap,\n sold,\n remaining: cap - sold,\n priceUsd: price.get(id)!, // still 1e8 scale\n });\n }\n\n return ladder;\n}\n\n/**\n * Turn raw liqsol_core accounts into a chain-agnostic TrancheSnapshot for SOL.\n * All math stays here; TokenClient just wires accounts + connection.\n */\nexport function buildSolanaTrancheSnapshot(options: {\n chainID: ChainID;\n globalState: GlobalState;\n trancheState: TrancheState;\n solPriceUsd?: bigint;\n nativePriceTimestamp?: number;\n ladderWindowBefore?: number;\n ladderWindowAfter?: number;\n}): TrancheSnapshot {\n const {\n chainID,\n globalState,\n trancheState,\n solPriceUsd,\n nativePriceTimestamp,\n ladderWindowBefore,\n ladderWindowAfter,\n } = options;\n\n const currentIndex = toBigint(globalState.currentIndex);\n const totalShares = toBigint(globalState.totalShares);\n const currentTranche = trancheState.currentTrancheNumber.toNumber();\n const currentTrancheSupply = toBigint(trancheState.currentTrancheSupply);\n const initialTrancheSupply = toBigint(trancheState.initialTrancheSupply);\n const totalPretokensSold = toBigint(trancheState.totalPretokensSold);\n const currentPriceUsd = toBigint(trancheState.currentTranchePriceUsd);\n const supplyGrowthBps = trancheState.supplyGrowthBps;\n const priceGrowthCents = trancheState.priceGrowthCents;\n\n const ladder = buildSolanaTrancheLadder({\n currentTranche,\n initialTrancheSupply,\n currentTrancheSupply,\n currentPriceUsd,\n supplyGrowthBps,\n priceGrowthCents,\n windowBefore: ladderWindowBefore,\n windowAfter: ladderWindowAfter,\n });\n\n return {\n chainID,\n currentIndex,\n totalShares,\n currentTranche,\n currentPriceUsd,\n supplyGrowthBps,\n priceGrowthCents,\n totalPretokensSold,\n currentTrancheSupply,\n initialTrancheSupply,\n nativePriceUsd: solPriceUsd,\n nativePriceTimestamp,\n ladder,\n };\n}\n\n/**\n * ---------------------------------------------------------------------------\n * Outpost-specific helpers\n * ---------------------------------------------------------------------------\n *\n * This is the SDK equivalent of `deriveWirePdas` in capital-staking tests.\n * It aggregates all PDAs / ATAs needed for Outpost pretokens + synd/desynd.\n */\nexport interface OutpostAccounts {\n user: PublicKey;\n\n // Outpost / pretoken wiring\n globalState: PublicKey;\n poolAuthority: PublicKey;\n liqsolMint: PublicKey;\n liqsolPoolAta: PublicKey;\n userAta: PublicKey;\n outpostAccount: PublicKey;\n userPretokenRecord: PublicKey;\n\n // Distribution / yield context (user_record keyed by token accounts)\n distributionState: PublicKey;\n bucketAuthority: PublicKey;\n bucketTokenAccount: PublicKey;\n bucketUserRecord: PublicKey;\n liqsolPoolUserRecord: PublicKey;\n userUserRecord: PublicKey;\n\n // Tranche / pricing\n trancheState: PublicKey;\n\n // Chainlink\n chainLinkFeed: PublicKey;\n chainLinkProgram: PublicKey;\n\n // Transfer hook extra accounts\n extraAccountMetaList: PublicKey;\n}\n\nexport async function buildOutpostAccounts(\n connection: Connection,\n user: PublicKey,\n pgs: SolanaProgramService,\n): Promise<OutpostAccounts> {\n const globalState = pgs.deriveOutpostGlobalStatePda();\n const poolAuthority = pgs.deriveOutpostPoolAuthorityPda();\n const liqsolMint = pgs.deriveLiqsolMintPda();\n const distributionState = pgs.deriveDistributionStatePda();\n const bucketAuthority = pgs.deriveBucketAuthorityPda();\n const trancheState = pgs.deriveTrancheStatePda();\n\n // Outpost / pretoken PDAs\n const outpostAccount = pgs.deriveOutpostAccountPda(user);\n const userPretokenRecord = pgs.deriveUserPretokenRecordPda(user);\n\n // ATAs\n const liqsolPoolAta = await getAssociatedTokenAddress(\n liqsolMint,\n poolAuthority,\n true,\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 const userAta = await getAssociatedTokenAddress(\n liqsolMint,\n user,\n true, // allow off curve in case squadsx vault\n TOKEN_2022_PROGRAM_ID,\n );\n\n // user_record PDAs keyed by TOKEN ACCOUNTS (matches capital-staking)\n const bucketUserRecord = pgs.deriveUserRecordPda(bucketTokenAccount);\n const liqsolPoolUserRecord = pgs.deriveUserRecordPda(liqsolPoolAta);\n const userUserRecord = pgs.deriveUserRecordPda(userAta);\n\n const extraAccountMetaList = pgs.deriveExtraAccountMetaListPda(liqsolMint);\n\n // Chainlink program feeds\n let chainLinkFeed = CHAINLINK_FEED;\n let chainLinkProgram = CHAINLINK_PROGRAM;\n\n try {\n const program = pgs.getProgram('liqsolCore');\n const ts: TrancheState =\n await program.account.trancheState.fetch(trancheState);\n\n // If on-chain config overrides are present, prefer those.\n if (ts.chainlinkFeed && ts.chainlinkProgram) {\n chainLinkFeed = ts.chainlinkFeed as PublicKey;\n chainLinkProgram = ts.chainlinkProgram as PublicKey;\n }\n } catch {\n // If trancheState isn't initialized yet, we fall back to the constants.\n // In that case, purchase instructions will still fail, which is the\n // correct behavior until admin initializes TrancheState on-chain.\n }\n\n void connection; // reserved for future extra validation\n\n return {\n user,\n globalState,\n poolAuthority,\n liqsolMint,\n liqsolPoolAta,\n userAta,\n outpostAccount,\n userPretokenRecord,\n distributionState,\n bucketAuthority,\n bucketTokenAccount,\n bucketUserRecord,\n liqsolPoolUserRecord,\n userUserRecord,\n trancheState,\n chainLinkFeed,\n chainLinkProgram,\n extraAccountMetaList\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, Number(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\nexport function ceilDiv(n: BN, d: BN): BN {\n if (d.isZero()) {\n throw new Error('Division by zero in ceilDiv');\n }\n return n.add(d.subn(1)).div(d);\n}","import { AnchorProvider, Program, BN } from '@coral-xyz/anchor';\nimport { PublicKey } from '@solana/web3.js';\n\nimport { LiqsolCoreClientIdl, SolanaProgramService } from '../program';\nimport type { LiqsolCore } from '../../../assets/solana/devnet/types/liqsol_core';\nimport type { DistributionState, DistributionUserRecord, GlobalConfig, PayRateEntry, PayRateHistory } from '../types';\nimport { getAssociatedTokenAddressSync, TOKEN_2022_PROGRAM_ID } from '@solana/spl-token';\nimport { ceilDiv } from '../utils';\n\n/**\n * Distribution client – wraps the distribution portion of the liqsol_core\n * program in the *new* shares-only model.\n *\n * Responsibilities:\n * - Read DistributionState (global index/share pool)\n * - Read per-user UserRecord (shares)\n * - Provide simple helpers for querying user share positions\n *\n * There is no longer any notion of:\n * - tracked vs actual balances\n * - mismatch candidates\n * - updateUser / correct-&-register flow\n *\n * On-chain truth:\n * - User balances live in their liqSOL ATA.\n * - DistributionState + UserRecord track *shares* for yield.\n */\nexport class DistributionClient {\n private program: Program<LiqsolCoreClientIdl>;\n\n constructor(\n private readonly provider: AnchorProvider,\n private readonly pgs: SolanaProgramService\n ) {\n this.program = pgs.getProgram('liqsolCore');\n }\n\n get connection() {\n return this.provider.connection;\n }\n\n /**\n * Fetch the global distribution state account.\n *\n * IDL account name: \"distributionState\"\n */\n async getDistributionState(): Promise<DistributionState | null> {\n const pda = this.pgs.deriveDistributionStatePda();\n try {\n return await this.program.account.distributionState.fetch(pda);\n } catch {\n return null;\n }\n }\n\n\n /**\n * Fetch the global payRateHistory account (circular buffer of scaled pay rates).\n *\n * IDL account name: \"payRateHistory\"\n */\n async getPayRateHistory(): Promise<PayRateHistory | null> {\n const pda = this.pgs.derivePayRateHistoryPda();\n try {\n // Anchor types map directly onto our PayRateHistory TS type\n return (await this.program.account.payRateHistory.fetch(\n pda,\n )) as PayRateHistory;\n } catch {\n return null;\n }\n }\n\n /**\n * Fetch the globalConfig account (contains depositFeeMultiplier, etc).\n *\n * IDL account name: \"globalConfig\"\n */\n async getGlobalConfig(): Promise<GlobalConfig | null> {\n const pda = this.pgs.deriveGlobalConfigPda();\n try {\n return (await this.program.account.globalConfig.fetch(\n pda,\n ));\n } catch {\n return null;\n }\n }\n /**\n * Fetch a user's distribution userRecord (or null if missing).\n *\n * IDL account name: \"userRecord\"\n */\n async getUserRecord(\n ownerOrAta: PublicKey,\n ): Promise<DistributionUserRecord | null> {\n const liqsolMint = this.pgs.deriveLiqsolMintPda();\n\n // 1) Try treating ownerOrAta as a WALLET: derive its liqSOL ATA, then userRecord.\n try {\n const ata = getAssociatedTokenAddressSync(\n liqsolMint,\n ownerOrAta,\n true,\n TOKEN_2022_PROGRAM_ID,\n );\n const pdaFromWallet = this.pgs.deriveUserRecordPda(ata);\n const recFromWallet =\n await this.program.account.userRecord.fetchNullable(pdaFromWallet);\n if (recFromWallet) {\n return recFromWallet;\n }\n } catch {\n // fall through\n }\n\n // 2) Fallback: treat ownerOrAta as already being the TOKEN ACCOUNT.\n try {\n const pdaFromAta = this.pgs.deriveUserRecordPda(ownerOrAta);\n return await this.program.account.userRecord.fetchNullable(pdaFromAta);\n } catch {\n return null;\n }\n }\n\n /**\n * Convenience: get the user's current distribution shares.\n *\n * Returns BN(0) if the user has no userRecord yet.\n */\n async getUserShares(user: PublicKey): Promise<BN> {\n const record = await this.getUserRecord(user);\n return record ? record.shares : new BN(0);\n }\n\n /**\n * Convenience: get both the user's shares and totalShares, plus a\n * floating-point ratio (userShares / totalShares).\n *\n * NOTE: ratio is a JS number and may lose precision for very large values,\n * but is fine for display / percentage UIs.\n */\n async getUserSharePosition(user: PublicKey): Promise<{\n shares: BN;\n totalShares: BN;\n ratio: number;\n }> {\n const [dist, userShares] = await Promise.all([\n this.getDistributionState(),\n this.getUserShares(user),\n ]);\n\n const totalShares = dist ? dist.totalShares : new BN(0);\n\n let ratio = 0;\n if (!totalShares.isZero()) {\n // use toNumber() for UI-friendly ratio; if you need exact math,\n // do it with BN or bigint at the call site instead.\n ratio = userShares.toNumber() / totalShares.toNumber();\n }\n\n return { shares: userShares, totalShares, ratio };\n }\n\n /**\n * Compute an average scaled pay rate over the most recent `windowSize`\n * valid entries in the pay-rate history circular buffer.\n *\n * Returns a BN scaled by 1e12 (same as on-chain).\n */\n async getAverageScaledPayRate(windowSize = 5): Promise<BN> {\n const history = await this.getPayRateHistory();\n if (!history) {\n return new BN(0);\n }\n\n const entries: PayRateEntry[] = history.entries ?? [];\n if (!entries.length) {\n return new BN(0);\n }\n\n const maxEntries: number =\n typeof history.maxEntries === 'number'\n ? history.maxEntries\n : entries.length;\n\n const rawTotalAdded: any = history.totalEntriesAdded ?? 0;\n const totalAddedBn = new BN(rawTotalAdded.toString());\n\n // No valid entries written yet\n if (totalAddedBn.isZero()) {\n return new BN(0);\n }\n\n const totalAdded = Math.min(\n totalAddedBn.toNumber(),\n maxEntries,\n entries.length,\n );\n\n if (!totalAdded) {\n return new BN(0);\n }\n\n const COUNT = Math.max(1, Math.min(windowSize, totalAdded));\n\n const currentIndexNum = Number(history.currentIndex ?? 0);\n\n // Most recently written entry is at currentIndex - 1 (mod maxEntries)\n let idx =\n currentIndexNum === 0\n ? maxEntries - 1\n : currentIndexNum - 1;\n\n let sum = new BN(0);\n let valid = 0;\n const zero = new BN(0);\n\n for (let i = 0; i < COUNT; i++) {\n const entry: any = entries[idx];\n if (entry) {\n // Support both camelCase and snake_case (for safety)\n const rawScaled =\n entry.scaledRate ??\n entry.scaled_rate ??\n 0;\n\n const rate = new BN(rawScaled.toString());\n if (rate.gt(zero)) {\n sum = sum.add(rate);\n valid += 1;\n }\n }\n\n // Walk backwards through the circular buffer\n idx = idx === 0 ? maxEntries - 1 : idx - 1;\n }\n\n if (!valid) {\n return new BN(0);\n }\n\n // Same behavior as the dashboard: use a ceiling-like average\n return ceilDiv(sum, new BN(valid));\n }\n}","import { AnchorProvider, Program } from '@coral-xyz/anchor';\nimport { PublicKey } from '@solana/web3.js';\n\nimport { SolanaProgramService, ValidatorLeaderboardClientIdl } from '../program';\nimport type { ValidatorLeaderboard } from '../../../assets/solana/devnet/types/validator_leaderboard';\nimport { LeaderboardState, ValidatorRecord } from '../types';\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<ValidatorLeaderboardClientIdl>;\n\n constructor(\n private readonly provider: AnchorProvider,\n private readonly pgs: SolanaProgramService\n ) {\n this.program = pgs.getProgram('validatorLeaderboard');\n }\n\n async getState(): Promise<LeaderboardState | null> {\n const pda = this.pgs.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<ValidatorRecord | null> {\n const pda = this.pgs.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 return top validators ordered\n * by the on-chain leaderboard scores.\n *\n * Uses:\n * - `leaderboardState.scores`\n * - `leaderboardState.sortedIndices`\n * - `validatorRecord.registryIndex`\n *\n * Fallback: if leaderboardState can't be fetched, we sort by\n * `creditsObserved` descending.\n */\n async getTopValidators(limit = 20): Promise<ValidatorRecord[]> {\n // Try to use the leaderboard state first\n try {\n const leaderboardPda = this.pgs.deriveLeaderboardStatePda();\n const leaderboard: LeaderboardState \n = await this.program.account.leaderboardState.fetch(leaderboardPda);\n\n const all = await this.program.account.validatorRecord.all();\n const byIndex = new Map<number, ValidatorRecord>();\n\n for (const r of all) {\n const vr = r.account;\n byIndex.set(vr.registryIndex, vr);\n }\n\n const max = Math.min(\n limit,\n leaderboard.numValidators,\n leaderboard.sortedIndices.length,\n );\n\n const top: ValidatorRecord[] = [];\n for (let i = 0; i < max; i++) {\n const idx = leaderboard.sortedIndices[i];\n const rec = byIndex.get(idx);\n if (rec) {\n top.push(rec);\n }\n }\n\n return top;\n } catch (e) {\n // Fallback: no leaderboardState available, sort by creditsObserved.\n const all = await this.program.account.validatorRecord.all();\n\n all.sort((a, b) => {\n const va = a.account;\n const vb = b.account;\n const ca = va.creditsObserved;\n const cb = vb.creditsObserved;\n // BN.cmp: -1 if a < b, 0 if equal, 1 if a > b\n return cb.cmp(ca);\n });\n\n return all.slice(0, limit).map(r => r.account);\n }\n }\n}","import { AnchorProvider, BN, Program } from '@coral-xyz/anchor';\nimport {\n PublicKey,\n SystemProgram,\n TransactionInstruction,\n} from '@solana/web3.js';\nimport {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n TOKEN_2022_PROGRAM_ID,\n} from '@solana/spl-token';\n\nimport { LiqsolCore } from '../../../assets/solana/devnet/types/liqsol_core';\n\nimport {\n OutpostAccounts,\n buildOutpostAccounts,\n} from '../utils';\n\nimport {\n OutpostWireStateSnapshot,\n SharesPreview,\n TrancheState,\n WalletLike,\n} from '../types';\nimport { INDEX_SCALE } from '../constants';\nimport { LiqsolCoreClientIdl, SolanaProgramService } from '../program';\n\n/**\n * OutpostClient\n *\n * Read-only + preview helper for:\n * - Outpost config + per-user pretokens\n * - Tranche ladder snapshot\n * - Pretoken preview math\n *\n * Write helpers:\n * - buildStakeIx → liqsol_core::synd\n * - buildUnstakeIx → liqsol_core::desynd\n *\n * All PDAs / ATAs are sourced via buildOutpostAccounts, which is kept\n * in sync with the on-chain PDAs and capital-staking Wire utils.\n */\nexport class OutpostClient {\n private readonly program: Program<LiqsolCoreClientIdl>;\n\n constructor(\n private readonly provider: AnchorProvider,\n private readonly pgs: SolanaProgramService,\n ) {\n this.program = pgs.getProgram('liqsolCore');\n }\n\n get connection() {\n return this.provider.connection;\n }\n\n get wallet(): WalletLike {\n return this.provider.wallet as unknown as WalletLike;\n }\n\n /**\n * Build all outpost-related PDAs / ATAs for a given user.\n * Defaults to the connected wallet.\n */\n async buildAccounts(user?: PublicKey): Promise<OutpostAccounts> {\n const userPk = user ?? this.wallet.publicKey;\n if (!userPk) {\n throw new Error('OutpostClient.buildAccounts: wallet not connected');\n }\n return buildOutpostAccounts(this.connection, userPk, this.pgs);\n }\n\n /**\n * Internal helper: get raw token balance (BN) for a given ATA.\n */\n private async getTokenBalance(ata: PublicKey): Promise<BN> {\n try {\n const bal = await this.connection.getTokenAccountBalance(ata);\n return new BN(bal.value.amount);\n } catch {\n return new BN(0);\n }\n }\n\n /**\n * Fetch the core \"Wire state\" for Outpost / pretokens for a given user.\n */\n async fetchWireState(user?: PublicKey): Promise<OutpostWireStateSnapshot> {\n const userPk = user ?? this.wallet.publicKey;\n if (!userPk) {\n throw new Error('OutpostClient.fetchWireState: wallet not connected');\n }\n\n const pdas = await this.buildAccounts(userPk);\n\n try {\n const [\n globalState,\n outpostAccount,\n distributionState,\n userPretokenRecord,\n trancheState,\n ] = await Promise.all([\n this.program.account.globalState.fetch(pdas.globalState),\n this.program.account.outpostAccount.fetchNullable(pdas.outpostAccount),\n this.program.account.distributionState.fetchNullable(pdas.distributionState),\n this.program.account.userPretokenRecord.fetchNullable(pdas.userPretokenRecord),\n this.program.account.trancheState.fetchNullable(pdas.trancheState),\n ]);\n\n const [liqsolPoolBalance, userLiqsolBalance] = await Promise.all([\n this.getTokenBalance(pdas.liqsolPoolAta),\n this.getTokenBalance(pdas.userAta),\n ]);\n\n return {\n globalState,\n outpostAccount,\n distributionState,\n trancheState,\n userPretokenRecord,\n liqsolPoolBalance,\n userLiqsolBalance,\n };\n }\n catch (err) {\n console.error('Error fetching Outpost wire state:', err);\n throw err;\n }\n }\n\n // -------------------------------------------------------------------------\n // Outpost stake / unstake builders (synd / desynd)\n // -------------------------------------------------------------------------\n\n /**\n * Build the `synd` (stake) instruction:\n * user liqSOL ATA → liqSOL pool ATA\n */\n async buildStakeIx(\n amountLamports: bigint,\n user: PublicKey = this.wallet.publicKey,\n ): Promise<TransactionInstruction> {\n if (!user) {\n throw new Error('OutpostClient.buildStakeIx: wallet not connected');\n }\n\n const a = await this.buildAccounts(user);\n\n return this.program.methods\n .synd(new BN(amountLamports.toString()))\n .accounts({\n user,\n liqsolMint: a.liqsolMint,\n globalState: a.globalState,\n distributionState: a.distributionState,\n userAta: a.userAta,\n poolAuthority: a.poolAuthority,\n bucketAuthority: a.bucketAuthority,\n bucketTokenAccount: a.bucketTokenAccount,\n bucketUserRecord: a.bucketUserRecord,\n senderUserRecord: a.userUserRecord,\n receiverUserRecord: a.liqsolPoolUserRecord,\n extraAccountMetaList: a.extraAccountMetaList,\n liqsolCoreProgram: this.pgs.PROGRAM_IDS.LIQSOL_CORE,\n transferHookProgram: this.pgs.PROGRAM_IDS.TRANSFER_HOOK,\n liqsolPoolAta: a.liqsolPoolAta,\n outpostAccount: a.outpostAccount,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n /**\n * Build the `desynd` (unstake) instruction:\n * liqSOL pool ATA → user liqSOL ATA\n */\n async buildUnstakeIx(\n amountLamports: bigint,\n user?: PublicKey,\n ): Promise<TransactionInstruction> {\n const userPk = user ?? this.wallet.publicKey;\n if (!userPk) {\n throw new Error('OutpostClient.buildUnstakeIx: wallet not connected');\n }\n\n const a = await this.buildAccounts(userPk);\n\n return this.program.methods\n .desynd(new BN(amountLamports.toString()))\n .accounts({\n user: userPk,\n liqsolMint: a.liqsolMint,\n globalState: a.globalState,\n distributionState: a.distributionState,\n userAta: a.userAta,\n poolAuthority: a.poolAuthority,\n bucketAuthority: a.bucketAuthority,\n bucketTokenAccount: a.bucketTokenAccount,\n bucketUserRecord: a.bucketUserRecord,\n senderUserRecord: a.liqsolPoolUserRecord,\n receiverUserRecord: a.userUserRecord,\n extraAccountMetaList: a.extraAccountMetaList,\n liqsolCoreProgram: this.pgs.PROGRAM_IDS.LIQSOL_CORE,\n transferHookProgram: this.pgs.PROGRAM_IDS.TRANSFER_HOOK,\n liqsolPoolAta: a.liqsolPoolAta,\n outpostAccount: a.outpostAccount,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n })\n .instruction();\n }\n\n // -------------------------------------------------------------------------\n // Pretoken preview helper (unchanged)\n // -------------------------------------------------------------------------\n\n /**\n * Local preview for \"how many pretokens would I get for this liqSOL\n * amount at the current tranche price and SOL/USD price?\"\n *\n * SCALE = 1e8\n * usdValue = solAmountLamports * solPriceUsd / 1e9\n * pretokens = usdValue * SCALE / pretokenPriceUsd\n *\n * All values are BN integers; solPriceUsd and pretokenPriceUsd are 1e8 scaled.\n */\n previewPretokens(params: {\n liqsolAmountLamports: BN;\n solPriceUsd: BN; // 1e8 scale\n trancheState: TrancheState;\n }): SharesPreview {\n const { liqsolAmountLamports, solPriceUsd, trancheState } = params;\n\n // Current tranche price in USD (1e8 scale)\n const pretokenPriceUsd = new BN(\n trancheState.currentTranchePriceUsd.toString(),\n );\n\n const SCALE = new BN('100000000'); // 1e8\n\n // usdValue = (lamports * solPriceUsd) / 1e9\n const usdValue = liqsolAmountLamports\n .mul(solPriceUsd)\n .div(new BN(1_000_000_000));\n\n const estimatedPretokens = usdValue.mul(SCALE).div(pretokenPriceUsd);\n\n return {\n liqsolAmountLamports,\n solPriceUsd,\n pretokenPriceUsd,\n estimatedPretokens,\n };\n }\n\n /**\n * Convert liqSOL tokens (lamports) → Outpost “shares”, rounding UP\n * when there is any remainder.\n *\n * This matches the on-chain logic and the capital-staking helper:\n *\n * INDEX_SCALE = 1e12\n * numerator = amount * INDEX_SCALE\n * shares = numerator / currentIndex\n * remainder = numerator % currentIndex\n * if remainder > 0 → shares + 1\n */\n static tokensToShares(amount: BN, currentIndex: BN): BN {\n const numerator = amount.mul(new BN(INDEX_SCALE));\n const shares = numerator.div(currentIndex);\n const remainder = numerator.mod(currentIndex);\n return remainder.eqn(0) ? shares : shares.addn(1);\n }\n\n /**\n * Format a 1e8-scaled integer (e.g. USD price, pretokens, etc.)\n * into a fixed 8-decimal string.\n *\n * Examples:\n * 0 -> \"0.00000000\"\n * 1 -> \"0.00000001\"\n * 100000000 -> \"1.00000000\"\n * 123456789 -> \"1.23456789\"\n */\n static formatScale8(value: BN): string {\n const decimals = 8;\n const valueStr = value.toString();\n\n if (valueStr.length <= decimals) {\n const padding = '0'.repeat(decimals - valueStr.length);\n return `0.${padding}${valueStr}`;\n }\n\n const intPart = valueStr.slice(0, valueStr.length - decimals);\n const decPart = valueStr.slice(valueStr.length - decimals);\n return `${intPart}.${decPart}`;\n }\n}","import { AnchorProvider, BN, Program } from '@coral-xyz/anchor';\nimport type { TransactionInstruction, Connection } from '@solana/web3.js';\nimport { PublicKey, SystemProgram } from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n} from '@solana/spl-token';\n\nimport {\n buildOutpostAccounts,\n type OutpostAccounts,\n} from '../utils';\n\nimport { LiqsolCoreClientIdl, SolanaProgramService } from '../program';\nimport type { LiqsolCore } from '../../../assets/solana/devnet/types/liqsol_core';\n\nimport {\n GlobalState,\n PriceHistory,\n TrancheState,\n WalletLike,\n OutpostAccount,\n UserPretokenRecord,\n} from '../types';\n\nimport {\n CHAINLINK_FEED,\n CHAINLINK_PROGRAM,\n} from '../constants';\n\nexport class TokenClient {\n private readonly program: Program<LiqsolCoreClientIdl>;\n\n get wallet(): WalletLike {\n return this.provider.wallet;\n }\n\n get connection(): Connection {\n return this.provider.connection;\n }\n\n constructor(\n private readonly provider: AnchorProvider,\n private readonly pgs: SolanaProgramService\n ) {\n this.program = pgs.getProgram('liqsolCore');\n }\n\n // ---------------------------------------------------------------------------\n // Account helpers\n // ---------------------------------------------------------------------------\n\n async getAccounts(user: PublicKey): Promise<OutpostAccounts> {\n return buildOutpostAccounts(this.provider.connection, user, this.pgs);\n }\n\n async fetchGlobalState(): Promise<GlobalState> {\n const { globalState } = await this.getAccounts(this.wallet.publicKey);\n return this.program.account.globalState.fetch(globalState);\n }\n\n async fetchTrancheState(): Promise<TrancheState> {\n const { trancheState } = await this.getAccounts(this.wallet.publicKey);\n return this.program.account.trancheState.fetch(trancheState);\n }\n\n /**\n * Fetch the per-user Outpost account (old \"wire receipt\").\n * Returns null if the user has never interacted with Outpost.\n */\n async fetchOutpostAccount(user: PublicKey): Promise<OutpostAccount | null> {\n const { outpostAccount } = await this.getAccounts(user);\n return this.program.account.outpostAccount.fetchNullable(outpostAccount);\n }\n\n /**\n * Fetch the per-user pretoken purchase record.\n * Returns null if the user has never purchased pretokens.\n */\n async fetchUserPretokenRecord(\n user: PublicKey,\n ): Promise<UserPretokenRecord | null> {\n const { userPretokenRecord } = await this.getAccounts(user);\n return this.program.account.userPretokenRecord.fetchNullable(\n userPretokenRecord,\n );\n }\n\n // ---------------------------------------------------------------------------\n // Instruction builders (no send / confirm)\n // ---------------------------------------------------------------------------\n\n /**\n * Build a pretoken `purchase` instruction using liqSOL from the user’s ATA.\n *\n * This mirrors capital-staking `executePurchase` wiring:\n * - amountLamports: liqSOL amount (raw token-2022 units, not SOL)\n */\n async buildPurchaseIx(\n amountLamports: bigint,\n user = this.wallet.publicKey,\n ): Promise<TransactionInstruction> {\n console.log('build purchase for', user.toBase58());\n \n const a = await this.getAccounts(user);\n\n const extraAccountMetaList = this.pgs.deriveExtraAccountMetaListPda(a.liqsolMint);\n const liqsolCoreProgram = this.pgs.PROGRAM_IDS.LIQSOL_CORE;\n const transferHookProgram = this.pgs.PROGRAM_IDS.TRANSFER_HOOK;\n\n return this.program.methods\n .purchase(new BN(amountLamports.toString()))\n .accounts({\n user: a.user,\n liqsolMint: a.liqsolMint,\n globalState: a.globalState,\n distributionState: a.distributionState,\n\n // buyer’s liqSOL\n buyerAta: a.userAta,\n\n // pool / bucket context\n poolAuthority: a.poolAuthority,\n bucketAuthority: a.bucketAuthority,\n bucketTokenAccount: a.bucketTokenAccount,\n bucketUserRecord: a.bucketUserRecord,\n\n // distribution userRecords (token-account keyed)\n senderUserRecord: a.userUserRecord,\n receiverUserRecord: a.liqsolPoolUserRecord,\n\n // transfer-hook wiring\n extraAccountMetaList,\n liqsolCoreProgram,\n transferHookProgram,\n\n // pool + outpost + tranche\n liqsolPoolAta: a.liqsolPoolAta,\n outpostAccount: a.outpostAccount,\n trancheState: a.trancheState,\n userPretokenRecord: a.userPretokenRecord,\n\n // Chainlink pricing\n chainlinkFeed: a.chainLinkFeed ?? CHAINLINK_FEED,\n chainlinkProgram: a.chainLinkProgram ?? CHAINLINK_PROGRAM,\n\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n // NOTE:\n // - There is no longer `purchaseWithSol` in the IDL - SOL → liqSOL happens\n // through the deposit / liqSOL minting path, not directly in pretokens.\n // - `purchaseFromYield` is an operator-facing / protocol flow and you\n // indicated you’ll trigger it from Wire infra, so we don’t expose a\n // client helper here for now.\n\n // ---------------------------------------------------------------------------\n // Price helpers (SOL/USD via priceHistory account)\n // ---------------------------------------------------------------------------\n\n async getSolPriceUsdSafe(): Promise<{ price?: bigint; timestamp?: number }> {\n try {\n const price = await this.getSolPriceUsd();\n // current priceHistory account has no timestamp; keep optional\n return { price, timestamp: undefined };\n } catch {\n return { price: undefined, timestamp: undefined };\n }\n }\n\n /**\n * Fetch latest SOL/USD price (1e8 scale) from liqsol_core.priceHistory.\n * Uses the ring-buffer semantics from capital-staking.\n */\n async getSolPriceUsd(): Promise<bigint> {\n const priceHistoryPda = this.pgs.derivePriceHistoryPda();\n const history = (await this.program.account.priceHistory.fetch(\n priceHistoryPda,\n )) as PriceHistory;\n\n const { prices, nextIndex, count, windowSize } = history;\n\n if (!prices || prices.length === 0 || !count) {\n throw new Error('Price history is empty - no SOL price available');\n }\n\n const capacity = prices.length || windowSize;\n if (!capacity) {\n throw new Error(\n 'Price history capacity is zero - check account layout',\n );\n }\n\n const lastIndex = nextIndex === 0 ? capacity - 1 : nextIndex - 1;\n const latest = prices[lastIndex];\n\n if (!BN.isBN(latest)) {\n throw new Error(\n 'Latest price entry is not a BN - check IDL/decoder',\n );\n }\n\n return BigInt(latest.toString());\n }\n}","// src/networks/solana/programs.ts\nimport { AnchorProvider, Program } from '@coral-xyz/anchor';\nimport { ChainID, SolChainID } from '@wireio/core';\nimport { PublicKey, StakeProgram } from '@solana/web3.js';\n\nimport {\n PDA_SEEDS,\n getProgramIds,\n SolanaProgramIds,\n} from './constants';\n\n// Mainnet IDLs\nimport liqsolCoreMainnetJson from '../../assets/solana/mainnet/idl/liqsol_core.json';\nimport liqsolTokenMainnetJson from '../../assets/solana/mainnet/idl/liqsol_token.json';\nimport validatorLeaderboardMainnetJson from '../../assets/solana/mainnet/idl/validator_leaderboard.json';\n\n// Devnet IDLs\nimport liqsolCoreDevnetJson from '../../assets/solana/devnet/idl/liqsol_core.json';\nimport liqsolTokenDevnetJson from '../../assets/solana/devnet/idl/liqsol_token.json';\nimport validatorLeaderboardDevnetJson from '../../assets/solana/devnet/idl/validator_leaderboard.json';\n\n// Mainnet types\nimport type { LiqsolCore as LiqSolCoreMainnet } from '../../assets/solana/mainnet/types/liqsol_core';\nimport type { LiqsolToken as LiqsolTokenMainnet } from '../../assets/solana/mainnet/types/liqsol_token';\nimport type { ValidatorLeaderboard as ValidatorLeaderboardMainnet } from '../../assets/solana/mainnet/types/validator_leaderboard';\n\n// Devnet types\nimport type { LiqsolCore as LiqSolCoreDevnet } from '../../assets/solana/devnet/types/liqsol_core';\nimport type { LiqsolToken as LiqsolTokenDevnet } from '../../assets/solana/devnet/types/liqsol_token';\nimport type { ValidatorLeaderboard as ValidatorLeaderboardDevnet } from '../../assets/solana/devnet/types/validator_leaderboard';\n\n// “Client” IDLs = mainnet OR devnet, plus `address` field we add at runtime\n\nexport type LiqsolCoreClientIdl =\n (LiqSolCoreMainnet | LiqSolCoreDevnet) & { address: string };\n\nexport type LiqsolTokenClientIdl =\n (LiqsolTokenMainnet | LiqsolTokenDevnet) & { address: string };\n\nexport type ValidatorLeaderboardClientIdl =\n (ValidatorLeaderboardMainnet | ValidatorLeaderboardDevnet) & { address: string };\n\nexport type SolanaProgramIdlMap = {\n liqsolCore: LiqsolCoreClientIdl;\n liqsolToken: LiqsolTokenClientIdl;\n validatorLeaderboard: ValidatorLeaderboardClientIdl;\n};\n\nexport type SolanaProgramName = keyof SolanaProgramIdlMap;\n\ntype Entry<IDL> = {\n idl: IDL & { address: string };\n address: string;\n};\n\nconst PROGRAMS_BY_CHAIN = {\n [SolChainID.Mainnet]: {\n liqsolCore: {\n idl: liqsolCoreMainnetJson,\n address: liqsolCoreMainnetJson.address,\n } as Entry<LiqSolCoreMainnet>,\n liqsolToken: {\n idl: liqsolTokenMainnetJson,\n address: liqsolTokenMainnetJson.address,\n } as Entry<LiqsolTokenMainnet>,\n validatorLeaderboard: {\n idl: validatorLeaderboardMainnetJson,\n address: validatorLeaderboardMainnetJson.address,\n } as Entry<ValidatorLeaderboardMainnet>,\n },\n [SolChainID.Devnet]: {\n liqsolCore: {\n idl: liqsolCoreDevnetJson,\n address: liqsolCoreDevnetJson.address,\n } as Entry<LiqSolCoreDevnet>,\n liqsolToken: {\n idl: liqsolTokenDevnetJson,\n address: liqsolTokenDevnetJson.address,\n } as Entry<LiqsolTokenDevnet>,\n validatorLeaderboard: {\n idl: validatorLeaderboardDevnetJson,\n address: validatorLeaderboardDevnetJson.address,\n } as Entry<ValidatorLeaderboardDevnet>,\n },\n} as const;\n\nexport class SolanaProgramService {\n private readonly ids: SolanaProgramIds;\n private readonly programs: (typeof PROGRAMS_BY_CHAIN)[SolChainID.Mainnet];\n\n constructor(\n private provider: AnchorProvider,\n private chainId: ChainID,\n ) {\n const solChain = chainId as SolChainID;\n this.ids = getProgramIds(solChain);\n const programs = PROGRAMS_BY_CHAIN[solChain];\n if (!programs) {\n throw new Error(`Unsupported Solana chainId=${chainId}`);\n }\n this.programs = programs;\n }\n\n /** Expose per-chain program IDs */\n get programIds(): SolanaProgramIds {\n return this.ids;\n }\n\n // Generic getProgram, typed by name → union IDL\n getProgram<K extends SolanaProgramName>(\n name: K,\n ): Program<SolanaProgramIdlMap[K]> {\n const { idl, address } = this.programs[name];\n const idlWithAddr = { ...(idl as any), address } as SolanaProgramIdlMap[K];\n\n return new Program(idlWithAddr, this.provider) as Program<SolanaProgramIdlMap[K]>;\n }\n\n listProgramNames(): SolanaProgramName[] {\n return Object.keys(this.programs) as SolanaProgramName[];\n }\n\n get PROGRAM_IDS(): SolanaProgramIds {\n return this.ids;\n }\n\n\n // ---------------------------------------------------------------------\n // PDA helpers (instance methods, no ids passed in)\n // ---------------------------------------------------------------------\n\n // GLOBAL CONFIG\n deriveGlobalConfigPda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.GLOBAL_CONFIG)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n // CORE / DISTRIBUTION / DEPOSIT\n\n deriveLiqsolMintPda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQSOL_MINT)],\n this.ids.LIQSOL_TOKEN,\n )[0];\n }\n\n deriveLiqsolMintAuthorityPda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQSOL_MINT_AUTHORITY)],\n this.ids.LIQSOL_TOKEN,\n )[0];\n }\n\n deriveDepositAuthorityPda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.DEPOSIT_AUTHORITY)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n deriveVaultPda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VAULT)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n deriveReservePoolPda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.RESERVE_POOL)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n deriveStakeControllerStatePda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.STAKE_CONTROLLER_STATE)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n derivePayoutStatePda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.PAYOUT_STATE)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n deriveBucketAuthorityPda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.BUCKET_AUTHORITY)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n deriveDistributionStatePda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.DISTRIBUTION_STATE)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n /**\n * user_record PDA (keyed by USER wallet)\n */\n deriveUserRecordPda(user: PublicKey): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.USER_RECORD), user.toBuffer()],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n derivePayRateHistoryPda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.PAY_RATE_HISTORY)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n // --- Withdraw module / receipts ---\n\n deriveWithdrawGlobalPda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.WITHDRAW_GLOBAL)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n deriveStakeAllocationStatePda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.STAKE_ALLOCATION_STATE)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n deriveStakeMetricsPda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.STAKE_METRICS)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n deriveMaintenanceLedgerPda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.MAINTENANCE_LEDGER)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n deriveWithdrawMintAuthorityPda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.WITHDRAW_MINT_AUTHORITY)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n deriveWithdrawMintMetadataPda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.MINT_METADATA)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n /**\n * NFT mint for withdrawal receipt, derived from nextReceiptId.\n */\n deriveWithdrawNftMintPda(receiptId: bigint | number): PublicKey {\n const receiptIdBytes = Buffer.alloc(8);\n const asBigInt =\n typeof receiptId === 'bigint'\n ? receiptId\n : BigInt(receiptId.toString());\n receiptIdBytes.writeBigUInt64LE(asBigInt);\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.WITHDRAW_MINT), receiptIdBytes],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n deriveLiqReceiptDataPda(nftMint: PublicKey): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQ_RECEIPT_DATA), nftMint.toBuffer()],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n // --- Validator leaderboard ---\n\n deriveLeaderboardStatePda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LEADERBOARD_STATE)],\n this.ids.VALIDATOR_LEADERBOARD,\n )[0];\n }\n\n deriveValidatorRecordPda(voteAccount: PublicKey): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VALIDATOR_RECORD), voteAccount.toBuffer()],\n this.ids.VALIDATOR_LEADERBOARD,\n )[0];\n }\n\n deriveStakeControllerVaultPda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VAULT)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n // --- Outpost / pretokens ---\n\n deriveOutpostGlobalStatePda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.OUTPOST_GLOBAL_STATE)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n deriveOutpostPoolAuthorityPda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQSOL_POOL)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n deriveOutpostAccountPda(user: PublicKey): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.OUTPOST_ACCOUNT), user.toBuffer()],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n deriveUserPretokenRecordPda(user: PublicKey): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.USER_PRETOKEN_RECORD), user.toBuffer()],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n deriveTrancheStatePda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.TRANCHE_STATE)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n derivePriceHistoryPda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.PRICE_HISTORY)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n // --- BAR (bonded actor roles) ---\n\n deriveBarConfigPda(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.BAR_STATE_SEED)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n deriveBondLevelPda(bondLevelId: number[]): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.BOND_LEVEL_SEED), Buffer.from(bondLevelId)],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n deriveBondedActorPda(actor: PublicKey): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.BONDED_ACTOR_SEED), actor.toBuffer()],\n this.ids.LIQSOL_CORE,\n )[0];\n }\n\n // --- Transfer-hook extra metas ---\n\n deriveExtraAccountMetaListPda(liqsolMint: PublicKey): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.EXTRA_ACCOUNT_METAS), liqsolMint.toBuffer()],\n this.ids.TRANSFER_HOOK,\n )[0];\n }\n\n // --- Ephemeral stake address (per-deposit) ---\n\n /**\n * Ephemeral stake account address used per-deposit.\n * On-chain convention: seed = `ephemeral_<u32>` under StakeProgram.programId.\n */\n async deriveEphemeralStakeAddress(\n user: PublicKey,\n seed: number,\n ): Promise<PublicKey> {\n const seedStr = `ephemeral_${seed}`;\n return PublicKey.createWithSeed(user, seedStr, StakeProgram.programId);\n }\n}","import {\n AddressLookupTableAccount,\n Commitment,\n ComputeBudgetProgram,\n Connection,\n ConnectionConfig,\n PerfSample,\n SendTransactionError,\n PublicKey as SolPubKey,\n SystemProgram,\n Transaction,\n TransactionInstruction,\n TransactionMessage,\n TransactionSignature,\n VersionedTransaction,\n} from '@solana/web3.js';\nimport { AnchorProvider, BN } from '@coral-xyz/anchor';\nimport { BaseSignerWalletAdapter } from '@solana/wallet-adapter-base';\nimport {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n createAssociatedTokenAccountInstruction,\n getAssociatedTokenAddressSync,\n TOKEN_2022_PROGRAM_ID,\n} from '@solana/spl-token';\n\nimport * as multisig from \"@sqds/multisig\";\n\nimport {\n Base58,\n ChainID,\n ExternalNetwork,\n KeyType,\n PublicKey,\n SolChainID,\n} from '@wireio/core';\n\nimport {\n IStakingClient,\n Portfolio,\n SquadsXConfig,\n StakerConfig,\n TrancheSnapshot,\n} from '../../types';\n\nimport { DepositClient } from './clients/deposit.client';\nimport { DistributionClient } from './clients/distribution.client';\nimport { LeaderboardClient } from './clients/leaderboard.client';\nimport { OutpostClient } from './clients/outpost.client';\nimport { TokenClient } from './clients/token.client';\n\nimport {\n DEFAULT_AVERAGE_PAY_RATE,\n INDEX_SCALE,\n PAY_RATE_SCALE_FACTOR,\n} from './constants';\n\nimport { buildSolanaTrancheSnapshot, ceilDiv } from './utils';\nimport { GlobalConfig, PayRateEntry, SolanaTransaction } from './types';\nimport { SolanaProgramService } from './program';\nimport bs58 from 'bs58';\n\nconst commitment: Commitment = 'confirmed';\n\nexport const SCALE = new BN('1000000000000');\n\n/**\n * Solana implementation of IStakingClient.\n *\n * Responsibilities:\n * - liqSOL deposit (SOL -> liqSOL)\n * - withdraw requests (liqSOL -> NFT receipt / encumbered SOL)\n * - Pretoken (WIRE) buys via liqSOL\n * - Unified portfolio + tranche snapshot + balance correction (later)\n *\n * This composes lower-level clients; it does not know about UI.\n */\nexport class SolanaStakingClient implements IStakingClient {\n public pubKey?: PublicKey; // Wire ED key (optional → read-only)\n public connection: Connection;\n public anchor: AnchorProvider;\n\n public depositClient: DepositClient;\n public distributionClient: DistributionClient;\n public leaderboardClient: LeaderboardClient;\n public outpostClient: OutpostClient;\n public tokenClient: TokenClient;\n public program: SolanaProgramService\n\n private smartAccount?: SolPubKey; // PDA (off-curve)\n private signer?: SolPubKey; // on-curve signer\n\n get solPubKey(): SolPubKey {\n if (!this.pubKey) throw new Error('pubKey is undefined');\n return new SolPubKey(this.pubKey.data.array);\n }\n\n get network(): ExternalNetwork {\n return this.config.network;\n }\n\n get feePayer(): SolPubKey {\n if (this.signer) return this.signer;\n // fallback for normal wallets\n if (this.anchor.wallet.publicKey) return this.anchor.wallet.publicKey;\n throw new Error('No signing authority available');\n }\n\n get squadsX(): SquadsXConfig | null {\n const config = this.config.extras?.squadsX;\n return config ?? null;\n }\n\n constructor(private config: StakerConfig) {\n const adapter = config.provider as BaseSignerWalletAdapter | undefined;\n\n if (!config.network.rpcUrls.length) {\n throw new Error('No RPC URLs provided');\n }\n\n // -------------------------------------------------------------\n // Resolve Solana wallet pubkey (or dummy in read-only mode)\n // -------------------------------------------------------------\n let solWalletPubkey: SolPubKey;\n if (adapter?.publicKey) {\n solWalletPubkey = adapter.publicKey;\n } else {\n // Zeroed pubkey when no wallet (read-only usage)\n solWalletPubkey = new SolPubKey(new Uint8Array(32));\n }\n\n // -------------------------------------------------------------\n // Resolve Wire pubKey\n // -------------------------------------------------------------\n if (config.pubKey) {\n const wirePub = config.pubKey;\n\n if (adapter?.publicKey) {\n const derived = new PublicKey(\n KeyType.ED,\n adapter.publicKey.toBytes(),\n );\n if (!derived.equals(wirePub)) {\n throw new Error(\n \"Passed-in pubKey doesn't match adapter.publicKey\",\n );\n }\n }\n\n this.pubKey = wirePub;\n } else if (adapter?.publicKey) {\n // Derive Wire pubKey from adapter when not explicitly passed\n this.pubKey = new PublicKey(\n KeyType.ED,\n adapter.publicKey.toBytes(),\n );\n }\n\n // -------------------------------------------------------------\n // Connection + AnchorProvider\n // -------------------------------------------------------------\n const opts: ConnectionConfig = { commitment };\n if (\n config.network.rpcUrls.length > 1 &&\n config.network.rpcUrls[1].startsWith('ws')\n ) {\n opts.wsEndpoint = config.network.rpcUrls[1];\n }\n\n const anchorWallet = adapter\n ? {\n publicKey: solWalletPubkey,\n async signTransaction<T extends SolanaTransaction>(\n tx: T,\n ): Promise<T> {\n return adapter.signTransaction(tx);\n },\n async signAllTransactions<T extends SolanaTransaction>(\n txs: T[],\n ): Promise<T[]> {\n if (adapter.signAllTransactions) {\n return adapter.signAllTransactions(txs);\n }\n return Promise.all(\n txs.map((tx) => adapter.signTransaction(tx)),\n );\n },\n }\n : {\n publicKey: solWalletPubkey,\n async signTransaction<T extends SolanaTransaction>(\n _tx: T,\n ): Promise<T> {\n throw new Error(\n 'Wallet not connected: signTransaction not available',\n );\n },\n async signAllTransactions<T extends SolanaTransaction>(\n _txs: T[],\n ): Promise<T[]> {\n throw new Error(\n 'Wallet not connected: signAllTransactions not available',\n );\n },\n };\n\n this.connection = new Connection(config.network.rpcUrls[0], opts);\n this.anchor = new AnchorProvider(this.connection, anchorWallet, {\n commitment,\n });\n\n this.program = new SolanaProgramService(this.anchor, config.network.chainId as SolChainID);\n\n this.depositClient = new DepositClient(this.anchor, this.program);\n this.distributionClient = new DistributionClient(this.anchor, this.program);\n this.leaderboardClient = new LeaderboardClient(this.anchor, this.program);\n this.outpostClient = new OutpostClient(this.anchor, this.program);\n this.tokenClient = new TokenClient(this.anchor, this.program);\n }\n\n // ---------------------------------------------------------------------\n // IStakingClient core methods\n // ---------------------------------------------------------------------\n\n /**\n * Deposit native SOL into liqSOL (liqsol_core::deposit).\n * Handles tx build, sign, send, and confirmation.\n */\n async deposit(amountLamports: bigint): Promise<string> {\n this.ensureUser();\n if (amountLamports <= BigInt(0))\n throw new Error('Deposit amount must be greater than zero.');\n\n try {\n const ix = await this.depositClient.buildDepositTx(amountLamports, this.squadsVaultPDA)\n return !!this.squadsX\n ? await this.sendSquadsIxs(ix)\n : await this.buildAndSendIx(ix)\n\n } catch (err) {\n console.log(`Failed to deposit Solana: ${err}`);\n throw err;\n }\n }\n\n /**\n * Request a withdraw from liqSOL to SOL (liqsol_core::requestWithdraw).\n *\n * This:\n * - burns liqSOL from the user ATA\n * - mints an NFT withdrawal receipt\n * - increases totalEncumberedFunds in global state\n *\n * Actual SOL payout happens later via the operator-side flow.\n */\n async withdraw(amountLamports: bigint): Promise<string> {\n this.ensureUser();\n if (amountLamports <= BigInt(0))\n throw new Error('Withdraw amount must be greater than zero.');\n\n try {\n const ix = await this.depositClient.buildWithdrawTx(amountLamports, this.squadsVaultPDA)\n return !!this.squadsX\n ? await this.sendSquadsIxs(ix)\n : await this.buildAndSendIx(ix)\n\n } catch (err) {\n console.log(`Failed to withdraw Solana: ${err}`);\n throw err;\n }\n }\n\n /**\n * Stake liqSOL into Outpost (liqSOL → pool) via liqsol_core::synd.\n */\n async stake(amountLamports: bigint): Promise<string> {\n this.ensureUser();\n if (!amountLamports || amountLamports <= BigInt(0))\n throw new Error('Stake amount must be greater than zero.');\n\n try {\n const ix = await this.outpostClient.buildStakeIx(amountLamports, this.squadsVaultPDA)\n return !!this.squadsX\n ? await this.sendSquadsIxs(ix)\n : await this.buildAndSendIx(ix)\n\n } catch (err) {\n console.log(`Failed to stake Solana: ${err}`);\n throw err;\n }\n }\n\n /**\n * Unstake liqSOL from Outpost (pool → liqSOL) via liqsol_core::desynd.\n */\n async unstake(amountLamports: bigint): Promise<string> {\n this.ensureUser();\n if (!amountLamports || amountLamports <= BigInt(0))\n throw new Error('Unstake amount must be greater than zero.');\n\n try {\n const ix = await this.outpostClient.buildUnstakeIx(amountLamports, this.squadsVaultPDA)\n return !!this.squadsX\n ? await this.sendSquadsIxs(ix)\n : await this.buildAndSendIx(ix)\n }\n catch (err) {\n console.log(`Failed to unstake Solana: ${err}`);\n throw err;\n }\n }\n\n /**\n * Buy prelaunch WIRE “pretokens” using liqSOL.\n *\n * This delegates to TokenClient, which uses the `purchase`-style\n * instruction under the new IDL (no more native-SOL purchase).\n */\n async buy(amountLamports: bigint): Promise<string> {\n this.ensureUser();\n if (!amountLamports || amountLamports <= BigInt(0))\n throw new Error('liqSOL pretoken purchase requires a positive amount.');\n\n try {\n const ix = await this.tokenClient.buildPurchaseIx(amountLamports, this.squadsVaultPDA)\n return !!this.squadsX\n ? await this.sendSquadsIxs(ix)\n : await this.buildAndSendIx(ix)\n }\n catch (err) {\n console.log(`Failed to buy liqSOL pretokens: ${err}`);\n throw err;\n }\n }\n\n /**\n * Aggregate view of the user’s balances on Solana:\n * - native: SOL wallet balance\n * - liq: liqSOL token balance (Token-2022 ATA)\n * - staked: liqSOL staked in Outpost (synd/desynd) → outpostAccount.stakedLiqsol\n * - wire: total WIRE pretokens purchased (1e8 scale)\n * - yield: on-chain index/shares plus an estimated accrued liqSOL yield\n * - extras: useful internal addresses and raw state for debugging/UX\n */\n async getPortfolio(): Promise<Portfolio> {\n // if (!this.pubKey) throw new Error('User pubKey is undefined');\n try {\n const user = !!this.squadsX ? this.squadsVaultPDA! : this.solPubKey;\n\n const reservePoolPDA = this.program.deriveReservePoolPda();\n const vaultPDA = this.program.deriveVaultPda();\n const liqsolMint = this.program.deriveLiqsolMintPda();\n\n const userLiqsolAta = getAssociatedTokenAddressSync(\n liqsolMint,\n user,\n true,\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n // NOTE:\n // - nativeLamports: wallet SOL\n // - actualBalResp: liqSOL balance in user ATA\n // - snapshot: Outpost + pretokens + global index/shares\n const [nativeLamports, actualBalResp, snapshot] = await Promise.all([\n this.connection.getBalance(user, 'confirmed'),\n this.connection\n .getTokenAccountBalance(userLiqsolAta, 'confirmed')\n .catch(() => null),\n this.outpostClient.fetchWireState(user).catch(() => null),\n ]);\n\n const LIQSOL_DECIMALS = 9;\n\n const actualAmountStr = actualBalResp?.value?.amount ?? '0';\n\n const globalState = snapshot?.globalState ?? null;\n const outpostAccount = snapshot?.outpostAccount ?? null;\n const trancheState = snapshot?.trancheState ?? null;\n const userPretokenRecord = snapshot?.userPretokenRecord ?? null;\n\n // -----------------------------\n // Staked liqSOL (Outpost)\n // -----------------------------\n // This is the liqSOL that has been syndicated into Outpost via `synd`.\n // It lives on the outpost account as `stakedLiqsol`.\n const stakedLiqsolStr =\n outpostAccount?.stakedLiqsol?.toString?.() ?? '0';\n\n // -----------------------------\n // WIRE pretokens (1e8 scale)\n // -----------------------------\n // This is NOT stake — it’s the prelaunch WIRE position.\n const wirePretokensStr =\n userPretokenRecord?.totalPretokensPurchased?.toString?.() ??\n '0';\n\n // -----------------------------\n // Yield view (index + shares)\n // -----------------------------\n // We expose:\n // - currentIndex: globalState.currentIndex (1e12 scale)\n // - totalShares: globalState.totalShares\n // - userShares: outpostAccount.stakedShares\n // - estimatedClaimLiqsol: floor(userShares * index / INDEX_SCALE)\n // - estimatedYield: max(0, estimatedClaim - stakedLiqsol)\n //\n // This matches the capital-staking math:\n // sharesToTokens(shares, index) = shares * index / INDEX_SCALE\n const currentIndexStr =\n globalState?.currentIndex?.toString?.() ?? '0';\n const totalSharesStr =\n globalState?.totalShares?.toString?.() ?? '0';\n const userSharesStr =\n outpostAccount?.stakedShares?.toString?.() ?? '0';\n\n const stakedLiqsol = BigInt(stakedLiqsolStr);\n const currentIndex = BigInt(currentIndexStr);\n const totalShares = BigInt(totalSharesStr);\n const userShares = BigInt(userSharesStr);\n\n let estimatedClaim = BigInt(0);\n let estimatedYield = BigInt(0);\n\n if (userShares > BigInt(0) && currentIndex > BigInt(0)) {\n // sharesToTokens(userShares, currentIndex)\n estimatedClaim = (userShares * currentIndex) / INDEX_SCALE;\n\n if (estimatedClaim > stakedLiqsol) {\n estimatedYield = estimatedClaim - stakedLiqsol;\n }\n }\n\n return {\n native: {\n amount: BigInt(nativeLamports),\n symbol: 'SOL',\n decimals: 9,\n },\n liq: {\n amount: BigInt(actualAmountStr),\n symbol: 'LiqSOL',\n decimals: LIQSOL_DECIMALS,\n ata: userLiqsolAta,\n },\n staked: {\n // liqSOL staked in Outpost via `synd`\n amount: stakedLiqsol,\n symbol: 'LiqSOL',\n decimals: LIQSOL_DECIMALS,\n },\n wire: {\n // Prelaunch WIRE pretokens (1e8 scale)\n amount: BigInt(wirePretokensStr),\n symbol: '$WIRE',\n decimals: 8,\n },\n yield: {\n // Raw primitives so the frontend can display curves, charts, etc.\n currentIndex,\n indexScale: INDEX_SCALE,\n totalShares,\n userShares,\n // liqSOL amounts (lamports) implied by index/shares\n estimatedClaim,\n estimatedYield,\n },\n extras: {\n userLiqsolAta: userLiqsolAta.toBase58(),\n reservePoolPDA: reservePoolPDA.toBase58(),\n vaultPDA: vaultPDA.toBase58(),\n globalIndex: globalState?.currentIndex?.toString(),\n totalShares: globalState?.totalShares?.toString(),\n currentTrancheNumber:\n trancheState?.currentTrancheNumber?.toString(),\n currentTranchePriceUsd:\n trancheState?.currentTranchePriceUsd?.toString(), // 1e8 USD\n },\n chainID: this.network.chainId,\n };\n }\n catch (err) {\n console.log(`Failed to get Solana portfolio: ${err}`);\n throw err;\n }\n }\n\n /**\n * Convenience helper to fetch the distribution userRecord for the current user.\n * Used by balance-correction flows and debugging.\n */\n async getUserRecord() {\n if (!this.pubKey) throw new Error('User pubKey is undefined');\n return this.distributionClient.getUserRecord(this.solPubKey);\n }\n\n // ---------------------------------------------------------------------\n // SquadsX Helpers\n // ---------------------------------------------------------------------\n\n get squadsMultisigPDA(): SolPubKey | undefined {\n if (!this.squadsX) return undefined;\n return new SolPubKey(this.squadsX.multisigPDA);\n }\n\n get squadsVaultPDA(): SolPubKey | undefined {\n if (!this.squadsX || !this.squadsMultisigPDA) return undefined;\n const multisigPda = this.squadsMultisigPDA;\n const index = this.squadsX.vaultIndex ?? 0;\n const pda = multisig.getVaultPda({ multisigPda, index });\n return pda[0];\n }\n\n private async sendSquadsIxs(ix: TransactionInstruction): Promise<string> {\n if (!this.squadsX) throw new Error('Attempting to wrap Squads instruction without SquadsX config');\n\n const multisigPda = this.squadsMultisigPDA!;\n const vaultPda = this.squadsVaultPDA!;\n const vaultIndex = this.squadsX?.vaultIndex ?? 0;\n const creator = this.solPubKey;\n\n const ms = await multisig.accounts.Multisig.fromAccountAddress(this.connection, multisigPda);\n const current = BigInt(ms.transactionIndex?.toString() ?? 0);\n const transactionIndex = current + BigInt(1);\n\n const altAddress = this.program.PROGRAM_IDS.ALT_LOOKUP_TABLE;\n const altAccount = await this.connection.getAddressLookupTable(altAddress);\n if (!altAccount.value) throw new Error(\"ALT not found on-chain or not yet active.\");\n\n const lookupTable: AddressLookupTableAccount = altAccount.value;\n const computeLimitIx = ComputeBudgetProgram.setComputeUnitLimit({ units: 400_000 });\n const computePriceIx = ComputeBudgetProgram.setComputeUnitPrice({ microLamports: 2000 });\n\n const { blockhash } = await this.connection.getLatestBlockhash(\"confirmed\");\n const transactionMessage = new TransactionMessage({\n payerKey: vaultPda,\n recentBlockhash: blockhash,\n instructions: [computeLimitIx, computePriceIx, ix],\n });\n\n const createVaultTxIx = await multisig.instructions.vaultTransactionCreate({\n multisigPda,\n transactionIndex,\n creator,\n vaultIndex,\n transactionMessage,\n ephemeralSigners: 0,\n addressLookupTableAccounts: [lookupTable],\n });\n\n const vaultTransactionCreate = await this.buildAndSendIx(createVaultTxIx)\n console.log('SQUADSX: vaultTransactionCreate', vaultTransactionCreate);\n\n const createProposalIx = await multisig.instructions.proposalCreate({\n multisigPda,\n transactionIndex,\n creator,\n });\n\n const proposalCreate = await this.buildAndSendIx(createProposalIx)\n console.log('SQUADSX: proposalCreate', proposalCreate);\n\n return proposalCreate;\n }\n\n // async finish(multisigPda: string, transactionIndex: number): Promise<void> {\n // const vaultExecute = await multisig.instructions.vaultTransactionExecute({\n // connection: this.connection,\n // multisigPda: new SolPubKey(multisigPda),\n // transactionIndex: BigInt(transactionIndex),\n // member: this.solPubKey\n // });\n\n // const cuIx = ComputeBudgetProgram.setComputeUnitLimit({ units: 400_000 });\n // const tx1 = new Transaction().add(cuIx, vaultExecute.instruction);\n // const prepared1 = await this.prepareTx(tx1);\n // const signed1 = await this.signTransaction(prepared1.tx);\n // const sent1 = await this.sendAndConfirmHttp(signed1, prepared1);\n // console.log('SENT FINISH', sent1);\n // }\n\n // ---------------------------------------------------------------------\n // Tx helpers\n // ---------------------------------------------------------------------\n\n async buildAndSendIx(ix: TransactionInstruction | TransactionInstruction[]): Promise<string> {\n const cuIx = ComputeBudgetProgram.setComputeUnitLimit({ units: 400_000 });\n const ixs = Array.isArray(ix) ? ix : [ix];\n const tx = new Transaction().add(cuIx, ...ixs);\n const prepared = await this.prepareTx(tx);\n const signed = await this.signTransaction(prepared.tx);\n\n return this.sendAndConfirmHttp(signed, prepared);\n }\n\n\n /**\n * Send a signed transaction over HTTP RPC.\n *\n * - Returns immediately on successful sendRawTransaction.\n * - If sendRawTransaction throws a SendTransactionError with\n * \"already been processed\", we treat it as success and\n * just return a derived signature.\n * - No confirmTransaction / polling / blockheight handling.\n */\n private async sendAndConfirmHttp(\n signed: SolanaTransaction,\n _ctx: { blockhash: string; lastValidBlockHeight: number },\n ): Promise<string> {\n this.ensureUser();\n\n const rawTx = signed.serialize();\n\n try {\n // Normal happy path: RPC accepts the tx and returns a signature\n const signature = await this.connection.sendRawTransaction(rawTx, {\n skipPreflight: false,\n preflightCommitment: commitment,\n maxRetries: 3,\n });\n return signature;\n } catch (e: any) {\n const msg = e?.message ?? '';\n const isSendTxError =\n e instanceof SendTransactionError || e?.name === 'SendTransactionError';\n\n // Benign duplicate case: tx is already in the ledger / cache\n if (isSendTxError && msg.includes('already been processed')) {\n console.warn(\n 'sendRawTransaction reports \"already been processed\"; ' +\n 'treating as success without further confirmation.',\n );\n\n // Try to derive a signature from the signed Transaction.\n // If SolanaTransaction is a legacy Transaction, this works.\n const legacy = signed as unknown as Transaction;\n const first = legacy.signatures?.[0]?.signature;\n\n if (first) {\n return bs58.encode(first);\n }\n\n // Fallback: return a dummy string\n return 'already-processed';\n }\n\n // Any other send error is a real failure\n throw e;\n }\n }\n\n /**\n * Sign a single Solana transaction using the connected wallet adapter.\n */\n async signTransaction(\n tx: SolanaTransaction,\n ): Promise<SolanaTransaction> {\n this.ensureUser();\n return this.anchor.wallet.signTransaction(tx);\n }\n\n /**\n * Generic \"fire and forget\" send helper if the caller already\n * prepared and signed the transaction.\n */\n async sendTransaction(\n signed: SolanaTransaction,\n ): Promise<TransactionSignature> {\n this.ensureUser();\n return this.anchor.sendAndConfirm(signed);\n }\n\n /**\n * Attach recent blockhash + fee payer to a transaction.\n * Required before signing and sending.\n */\n async prepareTx(\n tx: Transaction,\n ): Promise<{\n tx: Transaction;\n blockhash: string;\n lastValidBlockHeight: number;\n }> {\n const { blockhash, lastValidBlockHeight } =\n await this.connection.getLatestBlockhash('confirmed');\n tx.recentBlockhash = blockhash;\n tx.feePayer = this.feePayer;\n return { tx, blockhash, lastValidBlockHeight };\n }\n\n /**\n * Guard for all write operations (deposit/withdraw/stake/unstake/buy).\n * Ensures we have a Wire pubKey and an Anchor wallet pubKey, and that they match.\n */\n ensureUser() {\n if (!this.pubKey) throw new Error('User pubKey is undefined');\n\n const wallet = this.anchor?.wallet as any;\n const pk = wallet?.publicKey as SolPubKey | undefined;\n\n if (!pk) throw new Error('Wallet not connected');\n if (typeof wallet.signTransaction !== 'function') {\n throw new Error('Wallet does not support signTransaction');\n }\n\n // if (!this.pubKey || !this.anchor.wallet.publicKey) {\n // throw new Error('User Authorization required: pubKey is undefined');\n // }\n // if (\n // this.solPubKey.toBase58() !==\n // this.anchor.wallet.publicKey.toBase58()\n // ) {\n // throw new Error(\n // 'Write access requires connected wallet to match pubKey',\n // );\n // }\n }\n\n // ---------------------------------------------------------------------\n // READ-ONLY Public Methods\n // ---------------------------------------------------------------------\n\n /**\n * Unified, chain-agnostic tranche snapshot for Solana.\n *\n * Uses:\n * - liqsol_core.globalState (currentIndex, totalShares, etc.)\n * - liqsol_core.trancheState (price, supply, total sold, etc.)\n * - PriceHistory/Chainlink SOL/USD via TokenClient.getSolPriceUsdSafe()\n *\n * This is READ-ONLY and works even with no connected wallet.\n */\n async getTrancheSnapshot(chainID: ChainID): Promise<TrancheSnapshot> {\n try {\n const [globalState, trancheState] = await Promise.all([\n this.tokenClient.fetchGlobalState(),\n this.tokenClient.fetchTrancheState(),\n ]);\n\n const { price: solPriceUsd, timestamp } =\n await this.tokenClient.getSolPriceUsdSafe();\n\n return buildSolanaTrancheSnapshot({\n chainID,\n globalState,\n trancheState,\n solPriceUsd,\n nativePriceTimestamp: timestamp,\n });\n }\n catch (err) {\n console.log(`Failed to build Solana tranche snapshot: ${err}`);\n throw err;\n }\n }\n\n /**\n * Returns the system APY (percent) for Solana,\n * using compound interest per epoch and a\n * cluster-derived epochs-per-year.\n */\n async getSystemAPY(): Promise<number> {\n try {\n // 1) Per-epoch rate (decimal) from on-chain stakeMetrics\n const ratePerEpoch = await this.getEpochRateDecimalFromProgram();\n // 2) Live epochs-per-year estimate from cluster\n const epochsPerYear = await this.getEpochsPerYearFromCluster();\n // 3) Compound: (1 + r)^N - 1\n const apyDecimal = Math.pow(1 + ratePerEpoch, epochsPerYear) - 1;\n // 4) Convert to percent\n const apyPercent = apyDecimal * 100;\n\n return apyPercent;\n } catch (err) {\n console.log(`Failed to compute Solana system APY: ${err}`);\n throw err;\n }\n }\n\n /**\n * Reads the liqsol_core stakeMetrics account and returns the\n * Solana per-epoch system rate as a **decimal** (not BPS),\n * de-scaled using PAY_RATE_SCALE_FACTOR (1e12).\n */\n private async getEpochRateDecimalFromProgram(): Promise<number> {\n const liqSolCoreProgram = this.program.getProgram('liqsolCore');\n const payRateHistoryPda = this.program.derivePayRateHistoryPda();\n\n const payRateHistory =\n await liqSolCoreProgram.account.payRateHistory.fetch(payRateHistoryPda);\n\n const totalEntriesAdded = Number(payRateHistory.totalEntriesAdded);\n const maxEntries = Number(payRateHistory.maxEntries);\n\n if (totalEntriesAdded === 0) {\n // No real entries yet, fall back to default\n return Number(DEFAULT_AVERAGE_PAY_RATE) / Number(PAY_RATE_SCALE_FACTOR);\n }\n\n const currentIndex = Number(payRateHistory.currentIndex);\n\n // Only average entries that have actually been processed (written by add_entry),\n // not the default-initialized slots. After 10+ entries, processedCount === maxEntries.\n const processedCount = Math.min(totalEntriesAdded, maxEntries);\n\n let sum = BigInt(0);\n let validCount = 0;\n // Walk backward from most recent entry\n let idx = (currentIndex - 1 + maxEntries) % maxEntries;\n\n for (let i = 0; i < processedCount; i++) {\n const entry = payRateHistory.entries[idx];\n const scaledRate = BigInt(entry.scaledRate.toString());\n if (scaledRate > BigInt(0)) {\n sum += scaledRate;\n validCount++;\n }\n idx = (idx - 1 + maxEntries) % maxEntries;\n }\n\n if (validCount === 0) {\n return Number(DEFAULT_AVERAGE_PAY_RATE) / Number(PAY_RATE_SCALE_FACTOR);\n }\n\n // Average the processed entries\n const average = Number(sum / BigInt(validCount));\n return average / Number(PAY_RATE_SCALE_FACTOR);\n }\n\n // Simple cache so we don’t hammer RPC\n private epochsPerYearCache?: { value: number; fetchedAt: number };\n private static readonly EPOCHS_PER_YEAR_TTL_MS = 10 * 60 * 1000; // 10 minutes\n\n /**\n * Derive \"epochs per year\" from the live Solana cluster.\n *\n * Uses:\n * - getRecentPerformanceSamples() to estimate slots/second\n * - getEpochInfo() to read slotsInEpoch\n */\n private async getEpochsPerYearFromCluster(): Promise<number> {\n const now = Date.now();\n\n if (\n this.epochsPerYearCache &&\n now - this.epochsPerYearCache.fetchedAt <\n SolanaStakingClient.EPOCHS_PER_YEAR_TTL_MS\n ) {\n return this.epochsPerYearCache.value;\n }\n\n const connection = this.anchor.connection;\n\n // 1) Estimate slots/second from recent performance samples\n const samples: PerfSample[] = await connection.getRecentPerformanceSamples(\n 60,\n );\n if (!samples.length) {\n throw new Error('No performance samples available from cluster');\n }\n\n const totalSlots = samples.reduce((acc, s) => acc + s.numSlots, 0);\n const totalSecs = samples.reduce((acc, s) => acc + s.samplePeriodSecs, 0);\n\n if (totalSecs === 0) {\n throw new Error(\n 'Cluster returned zero samplePeriodSecs in performance samples',\n );\n }\n\n const slotsPerSecond = totalSlots / totalSecs;\n\n // 2) Slots per epoch from cluster\n const epochInfo = await connection.getEpochInfo(); // finalized commitment by default\n const slotsPerEpoch = epochInfo.slotsInEpoch;\n\n const secondsPerEpoch = slotsPerEpoch / slotsPerSecond;\n const secondsPerYear = 365 * 24 * 60 * 60;\n\n const epochsPerYear = secondsPerYear / secondsPerEpoch;\n\n this.epochsPerYearCache = {\n value: epochsPerYear,\n fetchedAt: now,\n };\n\n return epochsPerYear;\n }\n\n // ---------------------------------------------\n // Deposit fee calculation (SOL -> liqSOL)\n // ---------------------------------------------\n\n /**\n * Estimate the protocol deposit fee in lamports for a given SOL amount,\n * based on recent pay rates and globalConfig.depositFeeMultiplier.\n *\n * - amountLamports: deposit notional in lamports\n * - windowSize: how many recent payRate entries to average (default 5)\n *\n * Returns 0n if payRateHistory or globalConfig is missing, or if\n * there are no valid pay-rate entries yet.\n */\n async getDepositFee(\n amountLamports: bigint,\n windowSize = 5,\n ): Promise<bigint> {\n if (amountLamports <= BigInt(0)) {\n return BigInt(0);\n }\n\n const [avgPayRate, globalConfig]: [BN, GlobalConfig | null] = await Promise.all([\n this.distributionClient.getAverageScaledPayRate(windowSize),\n this.distributionClient.getGlobalConfig(),\n ]);\n\n if (!globalConfig || avgPayRate.isZero()) {\n return BigInt(0);\n }\n\n // depositFeeMultiplier may be BN or number depending on your type\n const rawMultiplier = globalConfig.depositFeeMultiplier;\n const multiplier = new BN(\n rawMultiplier?.toString?.() ?? rawMultiplier ?? 0,\n );\n if (multiplier.isZero()) {\n return BigInt(0);\n }\n\n const amountBn = new BN(amountLamports.toString());\n\n // 10^12 scale (matches scaledRate / index scale)\n\n const feeBn = ceilDiv(\n avgPayRate.mul(multiplier).mul(amountBn),\n SCALE,\n );\n\n return BigInt(feeBn.toString());\n }\n\n /**\n * Compute a conservative \"deposit buffer\" in lamports that should be left\n * in the wallet so that a MAX deposit (balance - buffer) will succeed.\n *\n * It accounts for:\n * - Runtime tx fees (via cached dummy self-transfer fee)\n * - Protocol deposit fee (via getDepositFee(amount))\n *\n * Intended UI usage:\n * const buffer = await client.getDepositBuffer();\n * const balance = portfolio.native.amount;\n * const maxDeposit = balance > buffer ? balance - buffer : BigInt(0);\n */\n async getDepositBuffer(options?: {\n txCount?: number; // how many txs to cover in gas buffer (default 2)\n safetyMultiplier?: number; // safety multiplier on per-tx fee (default 3x)\n minBufferLamports?: bigint; // minimum gas buffer (default ~0.01 SOL)\n balanceOverrideLamports?: bigint; // for tests/custom callers\n }): Promise<bigint> {\n this.ensureUser();\n\n // -------------------------------------------------------------\n // 1) Current wallet balance (prefer caller override)\n // -------------------------------------------------------------\n const balanceLamports: bigint =\n options?.balanceOverrideLamports ??\n BigInt(await this.connection.getBalance(this.feePayer, commitment));\n\n if (balanceLamports <= BigInt(0)) {\n return BigInt(0);\n }\n\n // -------------------------------------------------------------\n // 2) Estimate gas buffer (using cached single-tx fee)\n // -------------------------------------------------------------\n let gasBuffer = BigInt(0);\n\n try {\n const singleTxFeeLamports = await this.getSingleTxFeeLamports();\n\n const txCount = BigInt(options?.txCount ?? 2);\n const safetyMultiplier = options?.safetyMultiplier ?? 3;\n const safetyScaled = BigInt(Math.round(safetyMultiplier * 100)); // e.g. 300\n\n let buf =\n (singleTxFeeLamports * txCount * safetyScaled) /\n BigInt(100);\n\n const defaultMinBufferLamports = BigInt(10_000_000); // ~0.01 SOL\n const minBufferLamports =\n options?.minBufferLamports ?? defaultMinBufferLamports;\n\n if (buf < minBufferLamports) {\n buf = minBufferLamports;\n }\n\n gasBuffer = buf;\n } catch {\n // If fee estimation fails, just fall back to \"no gas buffer\".\n gasBuffer = BigInt(0);\n }\n\n // If gas buffer alone eats the whole balance, we just keep everything.\n if (balanceLamports <= gasBuffer) {\n return balanceLamports;\n }\n\n const spendable = balanceLamports - gasBuffer;\n\n // -------------------------------------------------------------\n // 3) If we can't compute deposit fee, buffer == gasBuffer\n // -------------------------------------------------------------\n if (typeof this.getDepositFee !== 'function') {\n return gasBuffer;\n }\n\n // -------------------------------------------------------------\n // 4) Approximate principal using linear fee model from ONE RPC call\n //\n // fee(a) ≈ k * a\n // want: a + k*a <= spendable → a <= spendable / (1 + k)\n //\n // We estimate k from fee(spendable) / spendable.\n // -------------------------------------------------------------\n let feeAtSpendable: bigint;\n\n try {\n feeAtSpendable = await this.getDepositFee(spendable);\n } catch {\n // If protocol fee lookup fails, fall back to gas-only buffer\n return gasBuffer;\n }\n\n // If there is effectively no protocol fee, keep only gas buffer.\n if (feeAtSpendable <= BigInt(0)) {\n return gasBuffer;\n }\n\n const s = spendable;\n const f = feeAtSpendable;\n\n // denom = s + f = s * (1 + k) (since f ≈ k*s)\n const denom = s + f;\n if (denom === BigInt(0)) {\n return gasBuffer;\n }\n\n // a ≈ floor( s^2 / (s + f) )\n let a = (s * s) / denom;\n\n // Tiny safety haircut to avoid edge off-by-one lamports\n const fudge = BigInt(10_000); // ≈ 0.00001 SOL\n let effectivePrincipal =\n a > fudge ? a - fudge : a;\n\n if (effectivePrincipal < BigInt(0)) {\n effectivePrincipal = BigInt(0);\n }\n\n const buffer = balanceLamports > effectivePrincipal\n ? balanceLamports - effectivePrincipal\n : balanceLamports;\n\n // Ensure we never under-reserve gas.\n return buffer < gasBuffer ? gasBuffer : buffer;\n }\n\n private cachedTxFee?: { value: bigint; fetchedAt: number };\n private static readonly FEE_CACHE_TTL_MS = 60_000; // 60s\n\n private async getSingleTxFeeLamports(): Promise<bigint> {\n const now = Date.now();\n\n if (this.cachedTxFee && now - this.cachedTxFee.fetchedAt < SolanaStakingClient.FEE_CACHE_TTL_MS) {\n return this.cachedTxFee.value;\n }\n\n const payer = this.feePayer;\n\n const dummyIx = SystemProgram.transfer({\n fromPubkey: payer,\n toPubkey: payer,\n lamports: 0,\n });\n\n const tx = new Transaction().add(dummyIx);\n const { blockhash } = await this.connection.getLatestBlockhash(commitment);\n tx.recentBlockhash = blockhash;\n tx.feePayer = payer;\n\n const message = tx.compileMessage();\n const feeInfo = await this.connection.getFeeForMessage(message, commitment);\n\n const singleTxFeeLamports = BigInt(feeInfo.value ?? 5000);\n\n this.cachedTxFee = {\n value: singleTxFeeLamports,\n fetchedAt: now,\n };\n\n return singleTxFeeLamports;\n }\n\n\n}","/**\n * @module EthereumContractService\n *\n * Provides a unified service for interacting with Ethereum smart contracts using ethers.js.\n */\n\n// LiqETH Artifacts (for now, used by both mainnet and hoodi)\nimport AccountingArtifact from '../../assets/ethereum/mainnet/liqEth/accounting.sol/Accounting.json';\nimport DepositManagerArtifact from '../../assets/ethereum/mainnet/liqEth/DepositManager.sol/DepositManager.json';\nimport LiqEthArtifact from '../../assets/ethereum/mainnet/liqEth/liqEth.sol/LiqEthToken.json';\nimport StakingModuleArtifact from '../../assets/ethereum/mainnet/liqEth/stakingModule.sol/StakingModule.json';\nimport WithdrawalQueueArtifact from '../../assets/ethereum/mainnet/liqEth/withdrawalQueue.sol/WithdrawalQueue.json';\nimport WithdrawalVaultArtifact from '../../assets/ethereum/mainnet/liqEth/withdrawalVault.sol/WithdrawalVault.json';\nimport BeaconStateArtifact from '../../assets/ethereum/mainnet/liqEth/BeaconState.sol/BeaconState.json';\nimport YieldOracleArtifact from '../../assets/ethereum/mainnet/liqEth/Yield.sol/YieldOracle.json';\n\n// Outpost Artifacts (for now, used by both mainnet and hoodi)\nimport DepositorArtifact from '../../assets/ethereum/mainnet/outpost/Depositor.sol/Depositor.json';\nimport ReceiptNFTArtifact from '../../assets/ethereum/mainnet/outpost/ReceiptNFT.sol/ReceiptNFT.json';\nimport OutpostManagerArtifact from '../../assets/ethereum/mainnet/outpost/OutpostManager.sol/OutpostManager.json';\nimport BARArtifact from '../../assets/ethereum/mainnet/outpost/BAR.sol/BAR.json';\nimport OPPArtifact from '../../assets/ethereum/mainnet/outpost/OPP.sol/OPP.json';\nimport OPPCommonArtifact from '../../assets/ethereum/mainnet/outpost/OPPCommon.sol/OPPCommon.json';\nimport OPPInboundArtifact from '../../assets/ethereum/mainnet/outpost/OPPInbound.sol/OPPInbound.json';\nimport PretokenArtifact from '../../assets/ethereum/mainnet/outpost/Pretoken.sol/Pretoken.json';\nimport AggregatorArtifact from '../../assets/ethereum/mainnet/outpost/Aggregator.sol/Aggregator.json';\nimport EthUsdPriceConsumerArtifact from '../../assets/ethereum/mainnet/outpost/EthUsdPriceConsumer.sol/EthUsdPriceConsumer.json';\nimport PoolArtifact from '../../assets/ethereum/mainnet/outpost/Pool.sol/Pool.json';\nimport OutpostManagerAuthorityArtifact from '../../assets/ethereum/mainnet/outpost/OutpostManagerAuthority.sol/OutpostManagerAuthority.json';\n\n// Common Artifacts (for now, used by both mainnet and hoodi)\nimport IodataArtifact from '../../assets/ethereum/mainnet/common/iodata.sol/iodata.json';\nimport Base58Artifact from '../../assets/ethereum/mainnet/common/Base58.sol/Base58.json';\nimport sysio_merkleArtifact from '../../assets/ethereum/mainnet/common/sysio_merkle.sol/sysio_merkle.json';\nimport sysio_writeArtifact from '../../assets/ethereum/mainnet/common/sysio_write.sol/sysio_write.json';\n\n// ERC Token Artifacts (for now, used by both mainnet and hoodi)\nimport ERC20Artifact from '../../assets/ethereum/mainnet/token/ERC20Token.sol/ERC20Token.json';\nimport ERC721Artifact from '../../assets/ethereum/mainnet/token/ERC721Token.sol/ERC721Token.json';\nimport ERC1155Artifact from '../../assets/ethereum/mainnet/token/ERC1155Token.sol/ERC1155Token.json';\n\nimport { AddressBook, ContractName } from './types';\nimport { Contract, ethers, providers, Signer } from 'ethers';\nimport { JsonFragment } from '@ethersproject/abi';\nimport { ErrorDescription } from '@ethersproject/abi/lib/interface';\nimport { EvmChainID } from '@wireio/core';\nimport { SupportedEvmChainID } from '../../types';\n\nexport const ERC20Abi = ERC20Artifact.abi;\nexport const ERC721Abi = ERC721Artifact.abi;\nexport const ERC1155Abi = ERC1155Artifact.abi;\n\n// -----------------------------------------------------------------------------\n// Address books (per-chain)\n// -----------------------------------------------------------------------------\n\n/**\n * MAINNET LATEST\n * 1/23/26\n */\nexport const MAINNET_ADDRESSES: AddressBook = {\n // LiqETH contracts\n LiqEthAuthority: '0xB8fb7dBA2de501c94EAB723fa48679f698a39Aa4',\n BeaconState: '0x29719E8e76C52F5fD4888DF401579859c305f2DF',\n WithdrawalQueue: '0xce388339bFDAed9cAF536ea7b4F42123b4D755d4',\n LiqEthToken: '0x2C0e75e930Fc72ceD0725854C5E7A55566333F3f',\n Accounting: '0xE31C44d04c7B055afAC9301F55840f030eaF04BC',\n DepositManager: '0x21b339ED55A0f037f91B88044C808CcfCCBbF9A8',\n WithdrawalVault: '0x028743bE7E727aA331A1e952575cb00623B95fE2',\n StakingModule: '0xDe9754Fb58CcD4D74e94DA5682192E4e6eC334b0',\n // YieldOracle: '0x7B7B8894e75b44B6cA7Dc8bE6dED5059621907b2',\n\n // Outpost contracts\n OutpostManagerAuthority: '0xeaE32b94c0F858b3600861aAE4Caeee6B6341751',\n iodata: '0x485Ed153c45189d623Bb37816eD3016A56552273',\n Base58: '0x8bB3856EC1114B1cE45a78620CF174D90a1Fd4e7',\n sysio_merkle: '0x5180a926D71c6d94c5c939Fe7Fed14cD7dcAa541',\n ReceiptNFT: '0x651De616A20b17De1095f9A0694A0e0E68025b78',\n EthUsdPriceConsumer: '0x2d866f8DB6F6c94997b0027Ba24bc64a03627ddc',\n Pool: '0xDA268Adcb90c422C2102A5f713182A42A8b9EA0D',\n OutpostManager: '0x9f279804Cb8539c53709AA37a4C1b30A52A85175',\n sysio_write: '0x3F8c880efd2c8C3aA1f0CE40b886cc6913eEC1d3',\n Pretoken: '0xCabF19Fdb7cD063738dd63a418702Ee3642FFc68',\n BAR: '0x2D8f4D4435509d7b8F93C3Ba93D45447C892f7ED',\n OPPCommon: '0x1716EEC9f1E0c1aF7BbbA8Fed10652138914f766',\n OPP: '0x5e1135cF8987268a3e7F68551558Ae92c454429f',\n Depositor: '0xf4b4ccfD684feB46504D77232FBde23b23d4F774',\n OPPInbound: '0x088484d45fF93AFabC63810FB0b335792E2B24f3',\n\n // MockAggregator is not deployed on mainnet; keep as zero-address placeholder\n MockAggregator: '0x0000000000000000000000000000000000000000',\n};\n\n/**\n * HOODI TESTNET LATEST\n * 1/23/26\n */\nexport const HOODI_ADDRESSES: AddressBook = {\n // LiqETH contracts\n LiqEthAuthority: '0x3Eb66Bb91F7a022FbABc1619Cb6acce7025Bc41F',\n BeaconState: '0x08F879c6D0964E0A17bF688Af23168f654DF372e',\n WithdrawalQueue: '0x74aDeD940369baDDb0F36426F23B08499e45Fe18',\n LiqEthToken: '0x8C974517D038e2e3b8a1da7b1A026bC8132A4b2e',\n Accounting: '0x766CE996B8132b927988c5b2ECAE8108fB1a9307',\n DepositManager: '0xEd391dB5DB11B5eDBE08e69A51D16e84293C09a3',\n WithdrawalVault: '0xbaBc0D5997283ab9886696A0dEaB8A8093436b48',\n StakingModule: '0x4998fBb6Ca5Ee3Db6c339e2962A34791Af643fEa',\n // YieldOracle: '0x61Fe311C57dd9a38Fb7B0c5A8ec521452dB25378',\n\n // Outpost contracts\n OutpostManagerAuthority: '0x3B8705Ba1195AF632b3bd9E46F19348BC828FA3D',\n iodata: '0x4aCABbC74a1cA9B0058d9ADAa0E00Af0f4f73212',\n Base58: '0x1241F36ff30065deD52d51f0d6524EF971259A12',\n sysio_merkle: '0x58ca9b5515266Fd6bF94D5F1268C505b2eC9679c',\n ReceiptNFT: '0x03d6bD46cA9F54B8F8bbA21CfAfe717b36cB8593',\n EthUsdPriceConsumer: '0xdC2DD993A13b3DD6D255B52285625694bd967c9A',\n Pool: '0xd4742757AA61B1Fd3Fcd87980D7D460B12Cd9275',\n OutpostManager: '0x38ec2B56cBCeCaFFe28b535517de1a102C3D74E3',\n sysio_write: '0x0Ec4C1BaB772958aa3Db27459643bfbE7d92E305',\n Pretoken: '0x8c97a51A71640fa411DEfab8feC3401eFfd1a2E4',\n BAR: '0xbAFac13ffd3Aa9aEabaaeb6e4C2cF3dFf3479DC0',\n OPPCommon: '0x12283a6d4E6cE4A0e8AdB319Fc161c7F4f91EA8F',\n OPP: '0x87CE3Fe2CDca39C04aa2c14bbF1E1d9DB6358C4A',\n Depositor: '0x5351B30EA4b75bD9be9Fc0048e88F675f7b3Ac2b',\n OPPInbound: '0x0B1f7FB1c7f01A9cf490a1387E1E100F2bEA6C6d',\n\n // Test-only mock aggregator\n MockAggregator: '0xFCfc3ddd4CBd9Ad3b3af3A374B8bdA1b66eE6FFF',\n};\n\nexport const ADDRESS_BOOK_BY_CHAIN: Record<SupportedEvmChainID, AddressBook> = {\n [EvmChainID.Ethereum]: MAINNET_ADDRESSES,\n [EvmChainID.Hoodi]: HOODI_ADDRESSES,\n};\n\n// Old name kept as a mainnet default (optional convenience)\nexport const ADDRESSES: AddressBook = MAINNET_ADDRESSES;\n\n// -----------------------------------------------------------------------------\n// Contract config\n// -----------------------------------------------------------------------------\n\nexport type ContractConfig = {\n address: string;\n abi: JsonFragment[];\n};\n\nexport type Contracts<T extends string = ContractName> = Record<T, ContractConfig>;\n\nfunction buildContracts(addresses: AddressBook): Contracts<ContractName> {\n return {\n // LiqETH Contracts\n LiqEthAuthority: {\n address: addresses.LiqEthAuthority,\n abi: LiqEthArtifact.abi as JsonFragment[],\n },\n BeaconState: {\n address: addresses.BeaconState,\n abi: BeaconStateArtifact.abi as JsonFragment[],\n },\n WithdrawalQueue: {\n address: addresses.WithdrawalQueue,\n abi: WithdrawalQueueArtifact.abi as JsonFragment[],\n },\n LiqEthToken: {\n address: addresses.LiqEthToken,\n abi: LiqEthArtifact.abi as JsonFragment[],\n },\n Accounting: {\n address: addresses.Accounting,\n abi: AccountingArtifact.abi as JsonFragment[],\n },\n DepositManager: {\n address: addresses.DepositManager,\n abi: DepositManagerArtifact.abi as JsonFragment[],\n },\n WithdrawalVault: {\n address: addresses.WithdrawalVault,\n abi: WithdrawalVaultArtifact.abi as JsonFragment[],\n },\n StakingModule: {\n address: addresses.StakingModule,\n abi: StakingModuleArtifact.abi as JsonFragment[],\n },\n // YieldOracle: {\n // address: addresses.YieldOracle,\n // abi: YieldOracleArtifact.abi as JsonFragment[],\n // },\n\n // Outpost Contracts\n OutpostManagerAuthority: {\n address: addresses.OutpostManagerAuthority,\n abi: OutpostManagerAuthorityArtifact.abi as JsonFragment[],\n },\n iodata: {\n address: addresses.iodata,\n abi: IodataArtifact.abi as JsonFragment[],\n },\n Base58: {\n address: addresses.Base58,\n abi: Base58Artifact.abi as JsonFragment[],\n },\n sysio_merkle: {\n address: addresses.sysio_merkle,\n abi: sysio_merkleArtifact.abi as JsonFragment[],\n },\n ReceiptNFT: {\n address: addresses.ReceiptNFT,\n abi: ReceiptNFTArtifact.abi as JsonFragment[],\n },\n Pool: {\n address: addresses.Pool,\n abi: PoolArtifact.abi as JsonFragment[],\n },\n OutpostManager: {\n address: addresses.OutpostManager,\n abi: OutpostManagerArtifact.abi as JsonFragment[],\n },\n sysio_write: {\n address: addresses.sysio_write,\n abi: sysio_writeArtifact.abi as JsonFragment[],\n },\n EthUsdPriceConsumer: {\n address: addresses.EthUsdPriceConsumer,\n abi: EthUsdPriceConsumerArtifact.abi as JsonFragment[],\n },\n BAR: {\n address: addresses.BAR,\n abi: BARArtifact.abi as JsonFragment[],\n },\n OPPCommon: {\n address: addresses.OPPCommon,\n abi: OPPCommonArtifact.abi as JsonFragment[],\n },\n OPP: {\n address: addresses.OPP,\n abi: OPPArtifact.abi as JsonFragment[],\n },\n Pretoken: {\n address: addresses.Pretoken,\n abi: PretokenArtifact.abi as JsonFragment[],\n },\n OPPInbound: {\n address: addresses.OPPInbound,\n abi: OPPInboundArtifact.abi as JsonFragment[],\n },\n Depositor: {\n address: addresses.Depositor,\n abi: DepositorArtifact.abi as JsonFragment[],\n },\n\n MockAggregator: {\n address: addresses.MockAggregator,\n abi: AggregatorArtifact.abi as JsonFragment[],\n },\n };\n}\n\nexport const CONTRACTS_BY_CHAIN: Record<SupportedEvmChainID, Contracts<ContractName>> = {\n [EvmChainID.Ethereum]: buildContracts(MAINNET_ADDRESSES),\n [EvmChainID.Hoodi]: buildContracts(HOODI_ADDRESSES),\n};\n\n// -----------------------------------------------------------------------------\n// Service\n// -----------------------------------------------------------------------------\n\nexport interface ContractOptions {\n /** EVM chain id to select the correct address/contract set */\n chainId: EvmChainID;\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 private readonly chainId: EvmChainID;\n private readonly contractsConfig: Contracts<ContractName>;\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 this.chainId = opts.chainId;\n\n const contracts = CONTRACTS_BY_CHAIN[this.chainId];\n if (!contracts) {\n throw new Error(`Unsupported EVM chainId=${this.chainId}`);\n }\n this.contractsConfig = contracts;\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 this.contractsConfig[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 } = this.contractsConfig[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 } = this.contractsConfig[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 for this chain */\n public listContractNames(): ContractName[] {\n return Object.keys(this.contractsConfig) 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 // If you want, you can gradually re-enable protocol ABIs here\n // AccountingArtifact,\n // DepositManagerArtifact,\n // LiqEthArtifact,\n // StakingModuleArtifact,\n // WithdrawalQueueArtifact,\n // WithdrawalVaultArtifact,\n // YieldOracleArtifact,\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(\n ethers.utils.FormatTypes.full,\n )}`.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}","\nimport { ethers } from \"ethers\";\nimport { TrancheLadderItem, TrancheSnapshot } from \"../../types\";\nimport { ChainID } from \"@wireio/core\";\n\n\nconst BPS = BigInt(10_000);\n\nexport interface CustomContractError {\n name?: string;\n signature?: string;\n args?: any[];\n data?: any;\n method?: string;\n code?: any;\n raw: string;\n}\n\n\n\nexport function formatContractErrors(err: any): CustomContractError {\n // Extract custom error details if present\n if (err.errorName && err.errorArgs) {\n const errorObj: CustomContractError = {\n name: err.errorName,\n signature: err.errorSignature,\n args: err.errorArgs.map((arg: any) =>\n arg && arg._isBigNumber ? ethers.BigNumber.from(arg).toString() : arg\n ),\n data: err.data,\n method: err.method,\n code: err.code,\n raw: err,\n };\n console.error(\"Custom contract error:\", errorObj);\n return errorObj;\n } else {\n console.error(\"Contract Error:\", err);\n return {\n raw: typeof err === 'string' ? err : (err?.message || String(err))\n };\n }\n}\n\n\n\n/**\n * Finalize an OPP epoch. Optionally accept a gasLimit override (ethers BigNumberish).\n * If gasLimit is not provided, the method will attempt estimateGas.finalizeEpoch()\n * and pad it (1.2x). If estimateGas fails, a conservative fallback is used.\n */\nexport async function sendOPPFinalize(opp: ethers.Contract, gasLimit?: ethers.BigNumberish) {\n const overrides: any = {};\n try {\n if (gasLimit === undefined) {\n try {\n const estimated = await opp.estimateGas.finalizeEpoch();\n const padded = ethers.BigNumber.from(estimated).mul(12).div(10); // 1.2x\n overrides.gasLimit = padded;\n console.log('sendFinalize: estimated gas', estimated.toString(), 'padded to', overrides.gasLimit.toString());\n } catch (estErr) {\n // estimateGas can throw UNPREDICTABLE_GAS_LIMIT; fall back to a safe default\n console.warn('sendFinalize: estimateGas.finalizeEpoch() failed, falling back to hardcoded gasLimit', estErr);\n overrides.gasLimit = ethers.BigNumber.from(8000000);\n }\n } else {\n overrides.gasLimit = ethers.BigNumber.from(gasLimit);\n console.log('sendFinalize: using provided gasLimit override', overrides.gasLimit.toString());\n }\n\n const tx = await opp.finalizeEpoch(overrides); // submit tx with overrides\n console.log('sendFinalize tx hash:', tx.hash, 'overrides:', overrides);\n\n const receipt = await tx.wait(); // wait for mined\n console.log('sendFinalize tx mined, block:', receipt.blockNumber);\n return receipt;\n } catch (err: any) {\n // Verbose error logging to help debugging reverts / provider issues\n console.error('sendFinalize() failed:', err?.message || err);\n\n // Try to extract common raw payload locations used by ethers errors\n const raw = err?.error?.data || err?.data || err?.body || err?.receipt || err?.transaction || err;\n console.error('sendFinalize raw payload:', raw);\n\n // Try parsing with contractService if available\n try {\n const parsed = formatContractErrors(raw);\n console.error('sendFinalize parsed error:', parsed.name, parsed.args);\n } catch (parseErr) {\n // Fallback: decode Error(string) ABI encoded revert (0x08c379a0)\n try {\n const hex = (typeof raw === 'string') ? raw : (raw && raw.data) ? raw.data : null;\n if (hex && typeof hex === 'string' && hex.startsWith('0x08c379a0')) {\n const reason = ethers.utils.defaultAbiCoder.decode(['string'], '0x' + hex.slice(10))[0];\n console.error('sendFinalize revert reason:', reason);\n } else {\n console.error('sendFinalize: unable to decode revert payload (not standard Error(string))');\n }\n } catch (fallbackErr) {\n console.error('sendFinalize: fallback decode failed:', fallbackErr);\n }\n }\n\n // If there is a receipt, print it for extra context\n if (err?.receipt) console.error('sendFinalize receipt:', err.receipt);\n if (err?.transaction) console.error('sendFinalize transaction object:', err.transaction);\n\n // Re-throw so callers can handle it as well\n throw err;\n }\n}\n\n\nconst BPS_DENOM = BigInt(10_000);\n\n// On-chain USD: 1e18 (wei-style)\nconst USD_ONCHAIN_SCALE = BigInt(1_000_000_000_000_000_000); // 1e18\n// Client snapshot USD: 1e8 (to match fromScale8)\nconst USD_CLIENT_SCALE = BigInt(100_000_000); // 1e8\n// Factor to go from 1e18 → 1e8\nconst USD_SCALE_DOWN = USD_ONCHAIN_SCALE / USD_CLIENT_SCALE; // 1e10\n\n/** 2.5% growth in BPS for supply side */\nfunction growSupplyOnce(value: bigint, growthBps: number): bigint {\n const g = BigInt(growthBps);\n return (value * (BPS_DENOM + g)) / BPS_DENOM;\n}\n\nfunction shrinkSupplyOnce(value: bigint, growthBps: number): bigint {\n const g = BigInt(growthBps);\n return (value * BPS_DENOM) / (BPS_DENOM + g);\n}\n\n/** Linear USD price step in on-chain 1e18 scale */\nfunction growPriceOnceUsd1e18(value: bigint, stepUsd1e18: bigint): bigint {\n return value + stepUsd1e18;\n}\n\nfunction shrinkPriceOnceUsd1e18(value: bigint, stepUsd1e18: bigint): bigint {\n if (value <= stepUsd1e18) return BigInt(0);\n return value - stepUsd1e18;\n}\n\n/** Convert on-chain 1e18 USD to client 1e8 USD */\nfunction usd1e18To1e8(raw: bigint): bigint {\n // 1e18 / 1e8 = 1e10 factor difference\n return raw / USD_SCALE_DOWN;\n}\n\n/**\n * Build a local tranche ladder around the current tranche.\n *\n * Inside this function:\n * - `currentPriceUsd` and `priceGrowthCents` are treated as 1e18-scaled USD.\n * - Output `priceUsd` is 1e8-scaled USD (for fromScale8()).\n */\nexport function buildEthereumTrancheLadder(options: {\n currentTranche: number;\n totalTrancheSupply: bigint; // not used in local window, but kept for API parity\n initialTrancheSupply: bigint;\n currentTrancheSupply: bigint; // remaining in current tranche (1e8 scale)\n currentPriceUsd: bigint; // 1e18 scale\n priceGrowthCents: bigint; // 1e18 step, e.g. $0.02 → 2e16\n supplyGrowthBps: number; // 250 = 2.5%\n windowBefore?: number;\n windowAfter?: number;\n}): TrancheLadderItem[] {\n const {\n currentTranche,\n initialTrancheSupply,\n currentTrancheSupply,\n currentPriceUsd,\n priceGrowthCents,\n supplyGrowthBps,\n windowBefore = 5,\n windowAfter = 5,\n } = options;\n\n const startId = Math.max(0, currentTranche - windowBefore);\n const endId = currentTranche + windowAfter;\n\n const capacity = new Map<number, bigint>(); // 1e8 pre-token units\n const priceUsd = new Map<number, bigint>(); // 1e18 USD\n\n // Capacity at the current tranche derived from initial supply & BPS growth\n let currentCap = initialTrancheSupply;\n for (let i = 0; i < currentTranche; i++) {\n currentCap = growSupplyOnce(currentCap, supplyGrowthBps);\n }\n\n capacity.set(currentTranche, currentCap);\n priceUsd.set(currentTranche, currentPriceUsd);\n\n // Forward (future tranches)\n for (let id = currentTranche + 1; id <= endId; id++) {\n const prevCap = capacity.get(id - 1)!;\n const prevPrice = priceUsd.get(id - 1)!;\n\n capacity.set(id, growSupplyOnce(prevCap, supplyGrowthBps));\n priceUsd.set(id, growPriceOnceUsd1e18(prevPrice, priceGrowthCents));\n }\n\n // Backward (past tranches)\n for (let id = currentTranche - 1; id >= startId; id--) {\n const nextCap = capacity.get(id + 1)!;\n const nextPrice = priceUsd.get(id + 1)!;\n\n capacity.set(id, shrinkSupplyOnce(nextCap, supplyGrowthBps));\n priceUsd.set(id, shrinkPriceOnceUsd1e18(nextPrice, priceGrowthCents));\n }\n\n // Build ladder view\n const ladder: TrancheLadderItem[] = [];\n for (let id = startId; id <= endId; id++) {\n const cap = capacity.get(id)!;\n\n let sold: bigint;\n if (id < currentTranche) {\n sold = cap;\n } else if (id === currentTranche) {\n sold = cap - currentTrancheSupply;\n } else {\n sold = BigInt(0);\n }\n\n const remaining = cap - sold;\n const priceClientScale = usd1e18To1e8(priceUsd.get(id)!); // 1e8\n\n ladder.push({\n id,\n capacity: cap,\n sold,\n remaining,\n priceUsd: priceClientScale,\n });\n }\n\n return ladder;\n}\n\n/**\n * Turn raw liqsol_core accounts into a chain-agnostic TrancheSnapshot for SOL.\n * All math stays here; TokenClient just wires accounts + connection.\n */\nexport async function buildEthereumTrancheSnapshot(options: {\n chainID: ChainID;\n totalSharesBn;\n indexBn;\n trancheNumberBn;\n currentTrancheSupply;\n tranchePriceUsdBn;\n totalTrancheSupply;\n initialTrancheSupply;\n supplyGrowthBps;\n priceGrowthCents; // BigNumber from contract (1e18 for $0.02)\n minPriceUsd;\n maxPriceUsd;\n\n ethPriceUsd?: bigint;\n nativePriceTimestamp?: number;\n ladderWindowBefore?: number;\n ladderWindowAfter?: number;\n}): Promise<TrancheSnapshot> {\n const {\n chainID,\n ethPriceUsd,\n nativePriceTimestamp,\n ladderWindowBefore,\n ladderWindowAfter,\n\n totalSharesBn,\n indexBn,\n trancheNumberBn,\n currentTrancheSupply,\n tranchePriceUsdBn,\n totalTrancheSupply,\n initialTrancheSupply,\n supplyGrowthBps,\n priceGrowthCents,\n minPriceUsd,\n maxPriceUsd,\n } = options;\n\n // ---- BigNumber -> bigint conversions ----\n\n // Shares: keep your prior behaviour (1e8 scale) via /1e10\n const totalShares = BigInt(totalSharesBn.toString()) / BigInt(10_000_000_000); // 1e10\n\n const currentIndex = BigInt(indexBn.toString()); // RAY (1e27)\n\n const currentTranche = Number(trancheNumberBn.toString());\n\n // Prices & step in 1e18 scale from contract\n const currentPriceUsd1e18 = BigInt(tranchePriceUsdBn.toString());\n const priceGrowthStepUsd1e18 = BigInt(priceGrowthCents.toString());\n\n // Convert price step to “cents” number for snapshot:\n // 1 USD = 1e18 → 1 cent = 1e16.\n const priceGrowthCentsNumber = Number(\n priceGrowthStepUsd1e18 / BigInt(10_000_000_000_000_000) // 1e16\n );\n\n // Pre-token supplies (already 1e8-ish scale on-chain)\n const currentTrancheSupplyBig = BigInt(currentTrancheSupply.toString());\n const totalTrancheSupplyBig = BigInt(totalTrancheSupply.toString());\n const initialTrancheSupplyBig = BigInt(initialTrancheSupply.toString());\n\n // UI-current price (1e8 scale)\n const currentPriceUsd = currentPriceUsd1e18 / BigInt(10_000_000_000); // 1e10\n\n // ---- Build ladder ----\n\n const ladder = buildEthereumTrancheLadder({\n currentTranche,\n totalTrancheSupply: totalTrancheSupplyBig,\n initialTrancheSupply: initialTrancheSupplyBig,\n currentTrancheSupply: currentTrancheSupplyBig,\n currentPriceUsd: currentPriceUsd1e18, // 1e18\n priceGrowthCents: priceGrowthStepUsd1e18, // 1e18 step\n supplyGrowthBps,\n windowBefore: ladderWindowBefore,\n windowAfter: ladderWindowAfter,\n });\n\n return {\n chainID,\n currentIndex,\n totalShares,\n currentTranche,\n currentPriceUsd, // 1e8\n supplyGrowthBps,\n priceGrowthCents: priceGrowthCentsNumber, // <-- number as required\n totalPretokensSold: totalTrancheSupplyBig,\n currentTrancheSupply: currentTrancheSupplyBig,\n initialTrancheSupply: initialTrancheSupplyBig,\n nativePriceUsd: ethPriceUsd,\n nativePriceTimestamp,\n ladder,\n };\n}","import { BigNumber, ethers } from \"ethers\";\nimport { ClaimedEvent, DepositEvent, DepositResult, SharesBurnedEvent } from \"../types\";\nimport { EthereumContractService } from \"../contract\";\nimport { formatContractErrors } from \"../utils\";\n\nexport class ConvertClient {\n\n private readonly contractService: EthereumContractService;\n \n get contract() { return this.contractService.contract; }\n\n constructor(contract: EthereumContractService) {\n this.contractService = contract;\n }\n \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\n\n /**\n * \n * @param amountWei an amount of WEI to deposit in exchange for liqETH\n * @returns the hash of the transaction\n */\n 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 console.warn('less than min deposit');\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 let tx, receipt;\n try {\n tx = await this.contract.DepositManager.deposit({ value: amountWei });\n receipt = await tx.wait(1);\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n\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 public async performWithdraw(signerAddress: string, amountWei: BigNumber): Promise<any> {\n let tx, receipt;\n try {\n tx = await this.contract.LiqEthToken.safeBurn(signerAddress, amountWei);\n receipt = await tx.wait(1);\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n\n // Parse SharesBurned event if present\n let event: SharesBurnedEvent | undefined;\n const ev = receipt.events?.find((e) => e.event === 'SharesBurned');\n\n if (ev && ev.args) {\n const { from, shares, tokenValue } = ev.args;\n event = {\n from,\n shares: BigNumber.from(shares),\n tokenValue: BigNumber.from(tokenValue),\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n event,\n };\n }\n\n\n public async claimWithdraw(tokenId: BigNumber): Promise<any> {\n let tx, receipt;\n try {\n tx = await this.contract.DepositManager.claim(tokenId);\n receipt = await tx.wait(1);\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n\n // Parse Claimed event if present\n let event: ClaimedEvent | undefined;\n const ev = receipt.events?.find((e) => e.event === 'Claimed');\n\n if (ev && ev.args) {\n const { user, amount } = ev.args;\n event = {\n user,\n amount: BigNumber.from(amount),\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n event,\n };\n }\n \n \n /*\n // OLD - this was replaced with LiqEth.safeBurn() on 1/13/26\n async requestWithdraw(amountWei: BigNumber, signer: Signer, chainId: ChainID): Promise<WithdrawResult> {\n // deadline is a period of time in the future that the signature is valid for\n const deadline = Math.floor(Date.now() / 1000) + 3600;\n\n const liqEth = this.contract.LiqEth;\n const owner = await signer.getAddress();\n \n const nonce: BigNumber = await liqEth.nonces(owner);\n const domain = {\n name: await liqEth.name(),\n version: '1',\n chainId,\n verifyingContract: this.contract.LiqEthToken.address,\n } as any;\n\n const types = {\n Permit: [\n { name: 'owner', type: 'address' },\n { name: 'spender', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'nonce', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n ],\n } as any;\n\n const values = {\n owner,\n spender: this.contractService.getAddress('DepositManager'),\n value: amountWei,\n nonce: nonce,\n deadline,\n } as any;\n\n const signature = await (signer as any)._signTypedData(domain, types, values);\n const split = ethers.utils.splitSignature(signature);\n\n const tx = await this.contract.DepositManager.requestWithdrawal(\n amountWei,\n deadline,\n split.v,\n split.r,\n split.s\n );\n\n // wait for 1 confirmation\n const receipt = await tx.wait(1);\n\n // if WithdrawRequested event exists, parse it and get arguments\n let withdrawRequested: WithdrawRequestedEvent | undefined;\n const ev = receipt.events?.find((e) => e.event === 'WithdrawRequested');\n\n if (ev && ev.args) {\n const { user, ethAmount, nftId, readyAt } = ev.args;\n withdrawRequested = {\n user,\n ethAmount: BigNumber.from(ethAmount),\n nftId: BigNumber.from(nftId),\n readyAt: readyAt,\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n withdrawRequested,\n } as WithdrawResult;\n }\n */\n\n\n\n\n}","import { BigNumber, ethers } from \"ethers\";\nimport { StakedEvent, WithdrawnStakeEvent, WithdrawnStakeResult } from \"../types\";\nimport { EthereumContractService } from \"../contract\";\nimport { formatContractErrors } from \"../utils\";\n\nexport class StakeClient {\n\n private readonly contractService: EthereumContractService;\n \n get contract() { return this.contractService.contract; }\n\n constructor(contract: EthereumContractService) {\n this.contractService = contract;\n }\n \n\n\n /**\n * Simulate a stake via callStatic\n */\n async simulateStake(amountWei: BigNumber): Promise<void> {\n try {\n await this.contract.Depositor.callStatic.stakeLiqETH(amountWei);\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n }\n\n\n\n /**\n * \n * @param amountWei an amount of liqETH (in WEI) to stake to the Outpost\n * @returns txHash (hash of the transaction), receipt, Staked event\n */\n async performStake(amountWei: BigNumber, signerAddress: string): Promise<any> {\n const depositor = this.contract.Depositor.address;\n const liqRead = this.contract.LiqEthToken;\n const bal = await liqRead.balanceOf(signerAddress);\n const allowance = await liqRead.allowance(signerAddress, depositor);\n\n const paused = await this.contract.Depositor.paused();\n if(paused) {\n throw new Error(\"Error - Depositor is in a paused state\");\n }\n\n if (bal.lt(amountWei)) throw new Error(\"Insufficient LiqETH balance\");\n\n // if allowance is less than the requested stake amount, request permission to spend LiqEth\n if (allowance.lt(amountWei)) {\n const liqWrite = this.contractService.getWrite('LiqEthToken');\n\n console.warn(`allowance insufficient (${allowance.toString()} < ${amountWei.toString()}); sending approve(${depositor}, ${amountWei.toString()})`);\n const approveTx = await liqWrite.approve(depositor, amountWei);\n await approveTx.wait(1);\n\n // re-read allowance to ensure approval succeeded\n const newAllowance = await liqRead.allowance(signerAddress, depositor);\n if (newAllowance.lt(amountWei)) {\n throw new Error('Approval failed or allowance still insufficient after approve');\n }\n }\n \n \n await this.simulateStake(amountWei);\n\n\n // send the tx to stake liqeth\n const tx = await this.contract.Depositor.stakeLiqETH(amountWei);\n\n // Wait for 1 confirmation \n const receipt = await tx.wait(1);\n\n // Parse Staked event if present\n let staked: StakedEvent | undefined;\n const ev = receipt.events?.find((e) => e.event === 'Staked');\n\n if (ev && ev.args) {\n const { user, amountLiq, shares, tokenId } = ev.args;\n staked = {\n user,\n amountLiq: BigNumber.from(amountLiq),\n shares: BigNumber.from(shares),\n tokenId: BigNumber.from(tokenId)\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n staked,\n };\n }\n\n\n\n /**\n * \n * @param amountWei an amount of liqETH (in WEI) to stake to the Outpost\n * @returns txHash (hash of the transaction), receipt, WithdrawnStake event\n */\n async performWithdrawStake(tokenId: BigNumber, recipient: string): Promise<WithdrawnStakeResult> {\n // Send the payable tx\n const tx = await this.contract.Depositor.withdrawStake(tokenId, recipient);\n\n // Wait for 1 confirmation \n const receipt = await tx.wait(1);\n\n // Parse Staked event if present\n let withdrawnstake: WithdrawnStakeEvent | undefined;\n const ev = receipt.events?.find((e) => e.event === 'WithdrawnStake');\n\n if (ev && ev.args) {\n const { user, tokenOut, tokenId } = ev.args;\n withdrawnstake = {\n user: user,\n tokenOut: BigNumber.from(tokenOut),\n tokenId: BigNumber.from(tokenId)\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n withdrawnstake,\n };\n }\n}","import { BigNumber, ethers } from \"ethers\";\nimport { EthereumContractService } from \"../contract\";\nimport { formatContractErrors, sendOPPFinalize } from \"../utils\";\n\nexport class PretokenClient {\n private readonly contractService: EthereumContractService;\n \n get contract() { return this.contractService.contract; }\n\n constructor(contract: EthereumContractService) {\n this.contractService = contract;\n }\n \n\n\n /**\n * Purchase pretokens by transferring liqETH into the pool (ERC-20) and calling Depositor.purchasePretokensWithLiqETH(amountLiq, buyer).\n * Returns txHash, receipt and parsed PurchasedWithLiqETH event (if present).\n */\n async purchasePretokensWithLiqETH(amountLiq: bigint, buyer: string): Promise<any> {\n\n const bal = await this.contract.LiqEthToken.balanceOf(buyer);\n const paused = await this.contract.Depositor.paused();\n if(paused) {\n throw new Error(\"Error - Depositor is in a paused state\");\n }\n\n // if current liq balance is less than the requested buy amount, throw an error\n if (bal.lt(amountLiq)) {\n throw new Error(`Balance insufficient for pre-token purchase`);\n }\n\n //check that the contract has allowance for the token\n const depositorAddr = this.contract.Depositor.address;\n const allowance = await this.contract.LiqEthToken.allowance(buyer, depositorAddr);\n\n // if allowance is less than the requested stake amount, request permission to spend LiqEth\n if (allowance.lt(amountLiq)) {\n const liqWrite = this.contractService.getWrite('LiqEthToken');\n\n console.warn(`allowance insufficient (${allowance.toString()} < ${amountLiq.toString()}); sending approve(${depositorAddr}, ${amountLiq.toString()})`);\n\n const approveTx = await liqWrite.approve(depositorAddr, amountLiq);\n await approveTx.wait(1);\n\n // re-read allowance to ensure approval succeeded\n const newAllowance = await this.contract.LiqEthToken.allowance(buyer, depositorAddr);\n if (newAllowance.lt(amountLiq)) {\n throw new Error('Approval failed or allowance still insufficient after approve');\n }\n }\n \n // attempt a simulation of the purchase call\n try {\n const amountLiqBN = BigNumber.from(amountLiq)\n await this.contract.Depositor.callStatic.purchasePretokensWithLiqETH(amountLiqBN, buyer);\n } catch (err: any) {\n console.log('err', err);\n \n let errorObj = formatContractErrors(err);\n\n // ! TEMP for testing\n if(errorObj.name == \"OPP_PreviousEpochUnsent\") {\n console.error(\"OPP Previous Epoch is unsent - trigger OPP finalizeEpoch()\")\n await sendOPPFinalize(this.contract.OPP);\n throw new Error(errorObj.name+` - triggering OPP finalizeEpoch() please try again`);\n }\n\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n\n // attempt the real purchase call\n let tx, receipt;\n try {\n tx = await this.contract.Depositor.purchasePretokensWithLiqETH(amountLiq, buyer);\n receipt = await tx.wait(1);\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n\n\n // Attempt to parse PurchasedWithLiqETH event\n let purchased: any | undefined;\n const ev = receipt.events?.find((e) => e.event === 'PurchasedWithLiqETH' || (e.event && e.event.toString().startsWith('PurchasedWithLiqETH')));\n\n if (ev && ev.args) {\n // Event shape: PurchasedWithLiqETH(buyer, amountLiq, ethEqWei, shares, tokenId)\n const args: any = ev.args;\n // try named fields first, fallback to positional\n const evtBuyer = args.buyer ?? args[0];\n const evtAmountLiq = (args.amountLiq ?? args[1]) ? BigNumber.from(args.amountLiq ?? args[1]) : undefined;\n const evtEthEqWei = (args.ethEqWei ?? args[2]) ? BigNumber.from(args.ethEqWei ?? args[2]) : undefined;\n const evtShares = (args.shares ?? args[3]) ? BigNumber.from(args.shares ?? args[3]) : undefined;\n const evtTokenId = (args.tokenId ?? args[4]) ? BigNumber.from(args.tokenId ?? args[4]) : undefined;\n\n purchased = {\n buyer: evtBuyer,\n amountLiq: evtAmountLiq,\n ethEqWei: evtEthEqWei,\n shares: evtShares,\n tokenId: evtTokenId,\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n purchased,\n };\n }\n\n\n\n\n /**\n * Purchase pretokens by sending ETH to the Depositor.purchasePretokensWithETH(buyer) payable function.\n * Returns txHash, receipt and parsed PurchasedWithETH event (if present).\n async purchasePretokensWithETH(amountWei: BigNumber, buyer: string): Promise<any> {\n // attempt a simulation of the purchase call\n try {\n await this.contract.Depositor.callStatic.purchasePretokensWithETH(buyer, { value: amountWei });\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n\n // attempt the real purchase call\n let tx, receipt;\n try {\n tx = await this.contract.Depositor.purchasePretokensWithETH(buyer, { value: amountWei });\n receipt = await tx.wait(1);\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n\n\n // Attempt to parse PurchasedWithETH event\n let purchased: any | undefined;\n const ev = receipt.events?.find((e) => e.event === 'PurchasedWithETH' || e.event === 'PurchasedWithETH(address,uint256,uint256,uint256)');\n\n if (ev && ev.args) {\n // event signature: PurchasedWithETH(address indexed user, uint256 ethIn, uint256 shares, uint256 tokenId)\n const { user, ethIn, shares, tokenId } = ev.args as any;\n\n purchased = {\n buyer: user,\n amount: BigNumber.from(ethIn),\n shares: BigNumber.from(shares),\n tokenId: BigNumber.from(tokenId),\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n purchased,\n };\n }\n */\n\n \n\n}","import { ethers } from \"ethers\";\nimport { EthereumContractService } from \"../contract\";\nimport { OPPAssertion } from \"../../../types\";\n\n\nexport class OPPClient {\n\n \n private readonly decoders: Record<number, Decoder> = {\n 2001: (d) => this.decode2001(d),\n 2002: (d) => this.decode2002(d),\n\n 3001: (d) => this.decodeStake3001(d),\n 3002: (d) => this.decodeUnstake3002(d),\n // 3003 not implemented\n 3004: (d) => this.decodeLiqPretoken3004(d),\n 3005: (d) => this.decodePretoken3005(d),\n 3006: (d) => this.decodeYieldPretoken3006(d),\n };\n \n private readonly contractService: EthereumContractService;\n \n get contract() { return this.contractService.contract; }\n\n constructor(contract: EthereumContractService) {\n this.contractService = contract;\n }\n \n\n\n /**\n * Read OPP / Outpost state used by the Depositor to decide whether staking is allowed.\n * Returns various data\n */\n async getStatus(): Promise<any> {\n const depositor = this.contract.Depositor;\n const opp = this.contract.OPP;\n\n \n const oppAddress: string = await depositor.oppAddress();\n const oppInboundAddress: string = await depositor.oppInboundAddress();\n const prevEpochSent = await opp.prevEpochSent();\n \n\n const inbound = this.contractService.getReadOnly('OPPInbound');\n\n // Query useful getters\n const nextEpochBN: any = await inbound.nextEpochNum();\n const pendingEpochRaw: any = await inbound.pendingEpoch();\n const pendingMessageCount: any = await inbound.pendingMessageCount();\n const previousEpochHash: string = await inbound.previousEpochHash();\n const nextEpochNum = (nextEpochBN && typeof nextEpochBN.toNumber === 'function') ? nextEpochBN.toNumber() : Number(nextEpochBN || 0);\n\n const pendingEpoch = (pendingEpochRaw && pendingEpochRaw.epochNumber !== undefined)\n ? {\n epochNumber: (pendingEpochRaw.epochNumber && typeof pendingEpochRaw.epochNumber.toNumber === 'function') ? pendingEpochRaw.epochNumber.toNumber() : Number(pendingEpochRaw.epochNumber || 0),\n timestamp: (pendingEpochRaw.timestamp && typeof pendingEpochRaw.timestamp.toNumber === 'function') ? pendingEpochRaw.timestamp.toNumber() : Number(pendingEpochRaw.timestamp || 0),\n prevEpochHash: pendingEpochRaw.prevEpochHash,\n merkleRoot: pendingEpochRaw.merkleRoot,\n firstMessageID: pendingEpochRaw.firstMessageID,\n lastMessageID: pendingEpochRaw.lastMessageID,\n }\n : null;\n\n const pendingMessagesBN = pendingMessageCount;\n const pendingMessages = (pendingMessagesBN && typeof pendingMessagesBN.toString === 'function') ? pendingMessagesBN.toString() : String(pendingMessagesBN || '0');\n\n const hasPendingMessages = (pendingMessagesBN && typeof pendingMessagesBN.gt === 'function') ? pendingMessagesBN.gt(0) : (Number(pendingMessages) > 0);\n\n return {\n oppAddress,\n prevEpochSent,\n oppInboundAddress,\n nextEpochNum,\n pendingEpoch,\n pendingMessageCount: pendingMessages,\n previousEpochHash,\n hasPendingMessages,\n raw: {\n nextEpochBN,\n pendingEpochRaw,\n pendingMessageCount: pendingMessagesBN,\n },\n };\n }\n\n /**\n * Fetches all OPPMessage events and flattens all assertions into a single OPPAssertion[] array.\n */\n async getMessages(address: string): Promise<OPPAssertion[]> {\n try {\n const oppMessageFilter = this.contract.OPP.filters.OPPMessage();\n const events = await this.contract.OPP.queryFilter(oppMessageFilter, 0, \"latest\");\n const allAssertions: OPPAssertion[] = [];\n for (const event of events) {\n const assertions = await this.extractAssertionsFromEvent(event);\n allAssertions.push(...assertions);\n }\n\n // ! Current implementation is not ideal - no current way to filter OPP Messages by a single user\n const normalized = address ? address.toLowerCase() : null;\n const filtered = allAssertions.filter(a =>\n (a.from && a.from.toLowerCase() === normalized) ||\n (a.to && a.to.toLowerCase() === normalized)\n );\n return filtered.reverse();\n }\n catch (error) {\n // console.log('Error fetching OPP messages:', error);\n return [];\n }\n }\n\n /**\n * Extracts all OPPAssertions from a single OPPMessage event, attaching event metadata to each.\n */\n private async extractAssertionsFromEvent(event: any): Promise<OPPAssertion[]> {\n const header = event.args.header;\n const payloadAssertions = event.args.payload.assertions;\n\n const timestamp = header.timestamp ? Number(header.timestamp) : null;\n const from = event.address || null;\n const txHash = event.transactionHash;\n const chain = 'ETH';\n\n const assertionList: OPPAssertion[] = [];\n\n if (payloadAssertions && payloadAssertions.length > 0) {\n for (let a of payloadAssertions) {\n const assertionType = a[0] as number;\n const assertionData = a[1] as string;\n\n\n let type: OPPAssertion[\"type\"] = \"unknown\";\n let data: any = {};\n let to: string | null = null;\n\n const decoder = this.decoders[assertionType];\n\n if (decoder) {\n try {\n const decoded = decoder(assertionData);\n type = decoded.type;\n data = decoded.data;\n to = decoded.to ?? null;\n } catch (e: any) {\n // catch a bad assertion so it doesn't fail the entire function\n type = \"unknown\";\n data = {\n decodeError: e?.message ?? String(e),\n assertionType,\n rawHex: assertionData,\n };\n }\n } else {\n // Unknown assertion type\n data = { assertionType, rawHex: assertionData };\n }\n\n assertionList.push({\n type,\n data,\n chain,\n timestamp,\n from,\n to,\n txHash,\n raw: event,\n });\n }\n }\n return assertionList;\n }\n \n\n\n private decode2001(assertionData: string): DecoderResult {\n const hex = this.strip0x(assertionData);\n\n let cursor = 0;\n const r1 = this.readAddress(hex, cursor); cursor = r1.next;\n const r2 = this.readAddress(hex, cursor); cursor = r2.next;\n const r3 = this.readBytes32(hex, cursor); cursor = r3.next;\n const r4 = this.readUint256LE(hex, cursor); cursor = r4.next;\n const r5 = this.readUint64LE(hex, cursor); cursor = r5.next;\n\n const data = {\n actor: r1.addr,\n owner: r2.addr,\n bondLevelId: r3.value,\n tokenId: r4.value,\n bondedAt: r5.value,\n };\n\n return { type: \"bonded_actor\", data, to: r1.addr };\n }\n private decode2002(assertionData: string): DecoderResult {\n const hex = this.strip0x(assertionData);\n\n let cursor = 0;\n const r1 = this.readAddress(hex, cursor); cursor = r1.next;\n const r2 = this.readBytes32(hex, cursor); cursor = r2.next;\n const r3 = this.readUint256LE(hex, cursor); cursor = r3.next;\n const r4 = this.readUint64LE(hex, cursor); cursor = r4.next;\n\n const data = {\n actor: r1.addr,\n bondLevelId: r2.value,\n tokenId: r3.value,\n unbondedAt: r4.value,\n };\n\n return { type: \"unbonded_actor\", data, to: r1.addr };\n }\n\n\n private decodeStake3001(assertionData: string): DecoderResult {\n const { addr, nums } = this.decodeAddrPlusU256(assertionData, 3);\n const [principal, shares, indexAtMint] = nums;\n\n return {\n type: \"stake\",\n data: { \n staker: addr, \n principal: ethers.utils.formatUnits(principal, 18),\n shares: ethers.utils.formatUnits(shares, 18),\n indexAtMint \n },\n to: addr,\n };\n }\n private decodeUnstake3002(assertionData: string): DecoderResult {\n const { addr, nums } = this.decodeAddrPlusU256(assertionData, 4);\n const [unstakeAmount, shares, indexAtBurn, tokenId] = nums;\n\n return {\n type: \"unstake\",\n data: { \n unstaker: addr, \n unstakeAmount: ethers.utils.formatUnits(unstakeAmount, 18),\n shares, \n indexAtBurn, \n tokenId \n },\n to: addr,\n };\n }\n private decodeLiqPretoken3004(assertionData: string): DecoderResult {\n const { addr, nums } = this.decodeAddrPlusU256(assertionData, 3);\n const [principal, shares, indexAtMint] = nums;\n\n return {\n type: \"liq_pretoken_purchase\",\n data: { \n purchaser: addr, \n principal: ethers.utils.formatUnits(principal, 18),\n shares: ethers.utils.formatUnits(shares, 18),\n indexAtMint \n },\n to: addr,\n };\n }\n private decodePretoken3005(assertionData: string): DecoderResult {\n const { addr, nums } = this.decodeAddrPlusU256(assertionData, 3);\n const [ethInWei, usdValue, pretokensOut] = nums;\n\n return {\n type: \"pretoken_purchase\",\n data: {\n buyer: addr,\n ethInWei,\n ethIn: ethers.utils.formatUnits(ethInWei, 18),\n usdValue: ethers.utils.formatUnits(usdValue, 18),\n pretokensOut: ethers.utils.formatUnits(pretokensOut, 18),\n },\n to: addr,\n };\n }\n private decodeYieldPretoken3006(assertionData: string): DecoderResult {\n const { addr, nums } = this.decodeAddrPlusU256(assertionData, 2);\n const [principal, indexAtMint] = nums;\n\n return {\n type: \"yield_pretoken_purchase\",\n data: { purchaser: addr, principal, indexAtMint },\n to: addr,\n };\n }\n\n\n\n\n /**\n * \n * @param hex string to check\n * @returns the passed string, without a prefixed 0x if it existed\n */\n private strip0x(hex: string): string {\n return hex.startsWith(\"0x\") ? hex.slice(2) : hex;\n }\n\n private decodeAddrPlusU256(assertionData: string, count: number): { addr: string; nums: string[] } {\n const hex = this.strip0x(assertionData);\n let cursor = 0;\n\n const { addr, next } = this.readAddress(hex, cursor);\n cursor = next;\n\n const nums: string[] = [];\n for (let i = 0; i < count; i++) {\n const r = this.readUint256LE(hex, cursor);\n nums.push(r.value);\n cursor = r.next;\n }\n return { addr, nums };\n }\n\n private uint256FromLE(hexNo0x: string): ethers.BigNumber {\n if (hexNo0x.length !== 64) {\n throw new Error(`uint256 LE must be 32 bytes (64 hex chars), got ${hexNo0x.length}`);\n }\n const bytes = ethers.utils.arrayify(\"0x\" + hexNo0x);\n const reversed = Uint8Array.from(bytes).reverse(); // little -> big endian\n return ethers.BigNumber.from(ethers.utils.hexlify(reversed));\n }\n\n\n /**\n * Parses \"0x14 + <addr>\" and returns addr + next cursor (in hex chars, excluding 0x)\n * @param payload full payload\n * @param cursor place to start\n * @returns string\n */\n private readAddress(payload: string, cursor: number): { addr: string; next: number } {\n const lenByteHex = payload.slice(cursor, cursor + 2);\n const len = parseInt(lenByteHex, 16);\n if (!Number.isFinite(len) || len <= 0) throw new Error(`Bad address len byte: ${lenByteHex}`);\n const start = cursor + 2;\n const end = start + len * 2;\n const addrHex = payload.slice(start, end);\n if (addrHex.length !== len * 2) throw new Error(`Truncated address bytes`);\n return { addr: ethers.utils.getAddress(\"0x\" + addrHex), next: end };\n }\n\n /**\n * Reads 32-byte uint256 little-endian from payload at cursor (hex chars, excluding 0x)\n * @param payload \n * @param cursor \n * @returns \n */\n private readUint256LE(payload: string, cursor: number): { value: string; next: number } {\n const word = payload.slice(cursor, cursor + 64);\n if (word.length !== 64) throw new Error(`Truncated uint256 at ${cursor}`);\n return { value: this.uint256FromLE(word).toString(), next: cursor + 64 };\n }\n\n /**\n * Reads 8-byte uint64 little-endian from payload at cursor (hex chars, excluding 0x)\n * @param payload \n * @param cursor \n * @returns \n */\n private readUint64LE(payload: string, cursor: number): { value: number; next: number } {\n const word = payload.slice(cursor, cursor + 16);\n if (word.length !== 16) throw new Error(`Truncated uint64 at ${cursor}`);\n const bytes = ethers.utils.arrayify(\"0x\" + word);\n const reversed = Uint8Array.from(bytes).reverse();\n const bn = ethers.BigNumber.from(ethers.utils.hexlify(reversed));\n return { value: bn.toNumber(), next: cursor + 16 };\n }\n\n /**\n * Reads bytes32 from payload at cursor (hex chars, excluding 0x)\n * @param payload \n * @param cursor \n * @returns \n */\n private readBytes32(payload: string, cursor: number): { value: string; next: number } {\n const word = payload.slice(cursor, cursor + 64);\n if (word.length !== 64) throw new Error(`Truncated bytes32 at ${cursor}`);\n return { value: \"0x\" + word, next: cursor + 64 };\n }\n\n\n}\n\n\ntype DecoderResult = { type: OPPAssertion[\"type\"]; data: any; to?: string | null };\ntype Decoder = (assertionData: string) => DecoderResult;","import { BaseSignerWalletAdapter } from '@solana/wallet-adapter-base';\nimport { PublicKey as SolPubKey } from '@solana/web3.js';\nimport { ChainID, EvmChainID, ExternalNetwork, PublicKey, SolChainID } from '@wireio/core';\nimport { ethers } from 'ethers';\n\nexport type StakerConfig = {\n network: ExternalNetwork;\n provider?: BaseSignerWalletAdapter | ethers.providers.Web3Provider;\n pubKey?: PublicKey;\n extras?: {\n squadsX?: SquadsXConfig;\n }\n}\n\nexport type SquadsXConfig = {\n multisigPDA: string; // REQUIRED, base58 multisig address string\n vaultIndex?: number; // default 0\n};\n\nexport enum SupportedEvmChainID {\n Ethereum = EvmChainID.Ethereum,\n Hoodi = EvmChainID.Hoodi,\n}\nexport enum SupportedSolChainID {\n Mainnet = SolChainID.Mainnet,\n Devnet = SolChainID.Devnet,\n}\n\nexport interface IStakingClient {\n pubKey?: PublicKey;\n network: ExternalNetwork;\n\n /** Amount is in the chain's smallest unit (lamports/wei, etc.) */\n deposit(amount: bigint): Promise<string>;\n withdraw(amount: bigint): Promise<string>;\n stake(amount: bigint): Promise<string>;\n unstake(amount: bigint): Promise<string>;\n buy(amount: bigint): Promise<string>;\n\n /** Fetch the complete user portfolio */\n getPortfolio(): Promise<Portfolio | null>;\n\n // Estimated total APY for staking yeild\n getSystemAPY(): Promise<number>;\n\n /**\n * Program-level prelaunch WIRE/tranche snapshot for this chain.\n *\n * Returns:\n * - `TrancheSnapshot` when the chain supports pretoken/tranches\n * - `null` if this chain has no WIRE/pretoken integration\n */\n getTrancheSnapshot(chainId: ChainID): Promise<TrancheSnapshot | null>;\n\n /**\n * Protocol fee charged for deposit from Native to LIQ\n * in Solana: amount in lamports\n * in Ethereum: amount in wei\n */\n getDepositFee(amount: bigint): Promise<bigint>;\n\n /**\n * Estimate a conservative ETH(wei) / SOL(lamports) buffer to leave in the wallet\n * so the user can pay fees for the current deposit and at least one\n * more transaction, plus a bit extra for future interactions.\n */\n getDepositBuffer(options?: {\n txCount?: number; // how many txs to cover in gas buffer (default 2)\n safetyMultiplier?: number; // safety multiplier on per-tx fee (default 3x)\n minBufferLamports?: bigint; // minimum gas buffer (default ~0.01 SOL)\n balanceOverrideLamports?: bigint; // for tests/custom callers\n }): Promise<bigint>\n\n validatorDeposit(): Promise<string>\n}\n\n/**\n * Cross-chain portfolio view for a single account/wallet.\n *\n * On Solana (liqSOL + Outpost + pretokens) we fill:\n * - native: SOL wallet lamports\n * - liq: liqSOL in user ATA\n * - staked: liqSOL staked into Outpost (stakedLiqsol)\n * - wire: WIRE pretokens purchased (1e8 scale)\n * - yield: Outpost yield view (index/shares + implied claim/yield)\n *\n * On other chains:\n * - native/liq/wire/staked can still be populated as appropriate\n * - yield may be undefined if no index/shares concept exists.\n */\nexport interface Portfolio {\n /** Native balance on chain: ETH, SOL, etc. */\n native: BalanceView;\n\n /** Liquid staking token balance (LiqETH, LiqSOL, etc.). */\n liq: BalanceView;\n\n /**\n * Outpost-staked balance:\n * - On Solana: liqSOL staked via `synd` (stakedLiqsol, in lamports).\n * - On other chains: protocol-specific staked principal, if any.\n */\n staked: BalanceView;\n\n /**\n * Prelaunch WIRE “shares” (pretokens).\n * - On Solana: totalPretokensPurchased (1e8 scale).\n * - On other chains: analogous pretoken balance if supported.\n */\n wire: BalanceView;\n\n /**\n * Yield / index-based view (SOL + Outpost only for now).\n *\n * If the connected chain doesn’t expose an index+shares model,\n * this will be undefined.\n */\n yield?: YieldView;\n\n /**\n * Extra PDAs, account addresses, and raw state useful for debugging\n * and advanced UI (e.g. tranche price, global index, PDAs).\n */\n extras?: Record<string, any>;\n\n /** Chain ID of the network from which this portfolio was fetched. */\n chainID: ChainID;\n}\n\n/**\n * Canonical view of a single balance on a given chain.\n *\n * amount – integer base units (wei, lamports, token base units)\n * symbol – display symbol (“SOL”, “LiqSOL”, “$WIRE”, etc.)\n * decimals – how many decimal places to use when formatting\n * ata – optional SPL ATA / ERC-20 address (where applicable)\n */\nexport interface BalanceView {\n amount: bigint;\n symbol: string;\n decimals: number;\n ata?: SolPubKey;\n}\n\n/**\n * Outpost yield view.\n *\n * All amounts are integers in base units (lamports for liqSOL, wei for liqETH).\n *\n * Math matches capital-staking:\n * INDEX_SCALE = 1e12\n * sharesToTokens = shares * currentIndex / INDEX_SCALE\n */\nexport interface YieldView {\n /**\n * Current global index for the Outpost pool.\n * - 1e12 scale (INDEX_SCALE)\n * - sharesToTokens(shares) = shares * currentIndex / indexScale\n */\n currentIndex: bigint;\n\n /**\n * Fixed scale factor used for index math.\n * - Always 1_000_000_000_000n (1e12) on Solana Outpost.\n */\n indexScale: bigint;\n\n /** Total shares outstanding in the Outpost pool (all users). */\n totalShares: bigint;\n\n /** User’s staked shares in the Outpost pool. */\n userShares: bigint;\n\n /**\n * Total liq (wei/lamports) the user could claim right now if they fully\n * unwound their stake:\n * estimatedClaim = userShares * currentIndex / indexScale\n */\n estimatedClaim?: bigint;\n\n /**\n * Portion of estimatedClaim that is “yield” above principal:\n * estimatedYield = max(0, estimatedClaim - staked)\n *\n * NOTE: staked principal itself is surfaced separately as\n * Portfolio.staked.amount.\n */\n estimatedYield?: bigint;\n}\n\nexport interface TrancheLadderItem {\n /** On-chain tranche id, 0-based (0,1,2,...) */\n id: number;\n /** Total capacity for this tranche (pretokens, 1e8 scale) */\n capacity: bigint;\n /** Sold amount in this tranche (1e8 scale) */\n sold: bigint;\n /** Remaining = capacity - sold (1e8 scale) */\n remaining: bigint;\n /** Price for this tranche in USD (1e8 scale) */\n priceUsd: bigint;\n}\n\nexport interface TrancheLadderItem {\n /** On-chain tranche id, 0-based (0,1,2,...) */\n id: number;\n /** Total capacity for this tranche (pretokens, 1e8 scale) */\n capacity: bigint;\n /** Sold amount in this tranche (1e8 scale) */\n sold: bigint;\n /** Remaining = capacity - sold (1e8 scale) */\n remaining: bigint;\n /** Price for this tranche in USD (1e8 scale) */\n priceUsd: bigint;\n}\n\n/**\n * Unified pretoken/tranche snapshot for any chain.\n * ETH / other chains just fill the same shape from their own contracts.\n */\nexport interface TrancheSnapshot {\n chainID: ChainID;\n\n /** Global share index (1e12 on Sol today; other chains can use their own scale) */\n currentIndex: bigint;\n /** Total accounting shares (wire pretoken “shares”) */\n totalShares: bigint;\n\n /** Current tranche id as stored on chain (0-based) */\n currentTranche: number;\n\n /** Current tranche price in USD (1e8 scale) */\n currentPriceUsd: bigint;\n\n supplyGrowthBps: number; // 2.5% growth per tranche\n\n priceGrowthCents: number; // $0.02 USD growth per tranche\n\n totalPretokensSold: bigint; // total pretokens sold across all tranches (1e8 scale)\n\n /** Current tranche supply state (1e8 scale) */\n currentTrancheSupply: bigint; // remaining in current tranche\n initialTrancheSupply: bigint; // capacity for current tranche\n\n /** Native token → USD price if available (SOL/USD, ETH/USD, etc, 1e8 scale) */\n nativePriceUsd?: bigint;\n /** Optional timestamp (sec) for the last recorded native price */\n nativePriceTimestamp?: number;\n\n /**\n * Local window of tranche “rows” centered around current.\n * Used directly by the frontend for ladder graphs.\n */\n ladder: TrancheLadderItem[];\n}\n\n\n// Enum describing which asset is being used to buy pretoken\nexport enum PurchaseAsset {\n SOL = 'SOL',\n LIQSOL = 'LIQSOL',\n ETH = 'ETH',\n LIQETH = 'LIQETH',\n YIELD = 'YIELD',\n}\n\nexport interface PurchaseQuote {\n purchaseAsset: PurchaseAsset;\n amountIn: bigint; // lamports / wei / token units\n\n /** Expected pretoken “shares” (pretokens) and decimals */\n wireShares: bigint; // 1e8 scale\n wireDecimals: number; // always 8 for now\n\n /** Current price + notional in USD (1e8 scale) */\n wirePriceUsd: bigint;\n notionalUsd: bigint;\n}\n\n// export interface OPPEvent {\n// type: 'liq_pretoken_purchase' | 'yield_pretoken_purchase' | 'pretoken_purchase' | 'stake' | 'unstake' | 'unknown';\n// amount: bigint | null;\n// chain: 'ETH' | 'SOL';\n// timestamp: number | null;\n// from: string | null;\n// to: string | null;\n// txHash: string;\n// raw: any;\n// assertions: OPPAssertion[]\n// }\n\nexport interface OPPAssertion {\n type: 'liq_pretoken_purchase' | 'yield_pretoken_purchase' | 'pretoken_purchase' | 'stake' | 'unstake' | 'bonded_actor' | 'unbonded_actor' | 'unknown',\n data: any\n chain: 'ETH' | 'SOL';\n timestamp: number | null;\n from: string | null;\n to: string | null;\n txHash: string;\n raw: any;\n}\n\n\n\nexport enum ReceiptNFTKind {\n STAKE = 0,\n PRETOKEN_PURCHASE = 1,\n}","import { BigNumber } from \"ethers\";\nimport { preLaunchReceipt, WithdrawReceipt } from \"../types\";\nimport { EthereumContractService } from \"../contract\";\nimport { ReceiptNFTKind } from \"../../../types\";\n\nexport class ReceiptClient {\n\n private readonly contractService: EthereumContractService;\n \n get contract() { return this.contractService.contract; }\n\n constructor(contract: EthereumContractService) {\n this.contractService = contract;\n }\n\n\n\n async allReceipts(address: string): Promise<preLaunchReceipt[]> {\n return this.fetchPreLaunchReceipts(address);\n }\n\n async stakeReceipts(address: string): Promise<preLaunchReceipt[]> {\n try {\n const receipts = await this.fetchPreLaunchReceipts(address, ReceiptNFTKind.STAKE);\n return receipts;\n }\n catch (err) {\n // console.log('Error fetching stake receipts:', err);\n return [];\n }\n }\n \n async pretokenReceipts(address: string): Promise<preLaunchReceipt[]> {\n return this.fetchPreLaunchReceipts(address, ReceiptNFTKind.PRETOKEN_PURCHASE);\n }\n\n\n\n /**\n * \n * @param address (string) to fetch receipts for\n * @returns preLaunchReceipt[]\n */\n async fetchPreLaunchReceipts(address: string, type?: ReceiptNFTKind): Promise<preLaunchReceipt[]> {\n const receiptContract = this.contract.ReceiptNFT;\n\n // first figure out which tokenIds this address owns, from events\n const tokenIds = await this.getOwnedReceiptNFTsFor(address);\n\n const results: preLaunchReceipt[] = [];\n\n // next fetch on-chain receipt data just for those ids\n for (const idBN of tokenIds) {\n try {\n const receiptData = await receiptContract.getReceipt(idBN);\n\n //skip any receipt not of the requested type\n if(type !== undefined && receiptData.kind !== type) continue;\n\n results.push({ \n tokenId: idBN.toBigInt(), \n receipt: {\n account: receiptData.account,\n currency: receiptData.currency,\n kind: receiptData.kind,\n indexAtMint: receiptData.indexAtMint.toBigInt(),\n principal: {\n amount: receiptData.principal.toBigInt(),\n decimals: 18,\n symbol: \"LiqETH\"\n },\n shares: {\n amount: receiptData.shares.toBigInt(),\n decimals: 18,\n symbol: \"LiqETH\"\n },\n timestamp: new Date(Number(receiptData.timestamp.toString()) * 1000).toLocaleString(),\n }\n });\n } catch (err) {\n // in case of any mismatch or race, just skip this id\n console.warn(`Failed to load receipt for tokenId=${idBN.toString()}`, err);\n continue;\n }\n }\n\n return results;\n }\n\n\n\n\n private async getOwnedReceiptNFTsFor(\n owner: string,\n fromBlock = 0,\n toBlock: number | string = \"latest\"\n ): Promise<BigNumber[]> {\n const receiptContract = this.contract.ReceiptNFT;\n\n // Logs where address received tokens\n const toLogs = await receiptContract.queryFilter(\n receiptContract.filters.Transfer(null, owner),\n fromBlock,\n toBlock\n );\n\n // Logs where address sent tokens (including burns from owner → 0)\n const fromLogs = await receiptContract.queryFilter(\n receiptContract.filters.Transfer(owner, null),\n fromBlock,\n toBlock\n );\n\n const owned = new Set<string>();\n\n // Add all received tokenIds\n for (const e of toLogs) {\n const tokenId = e.args?.tokenId;\n if (!tokenId) continue;\n owned.add(tokenId.toString());\n }\n\n // Remove all sent tokenIds\n for (const e of fromLogs) {\n const tokenId = e.args?.tokenId;\n if (!tokenId) continue;\n owned.delete(tokenId.toString());\n }\n\n // Convert to BigNumbers\n return Array.from(owned).map((id) => BigNumber.from(id));\n }\n\n\n /**\n * \n * @param address (string) to fetch receipts for\n * @returns preLaunchReceipt[]\n */\n async fetchWithdrawReceipts(address: string): Promise<WithdrawReceipt[]> {\n // first figure out which tokenIds this address owns, from events\n const tokenIds = await this.getOwnedWithdrawReceiptsFor(address);\n const results: WithdrawReceipt[] = [];\n\n // next fetch on-chain token data just for those ids\n for (const idBN of tokenIds) {\n try {\n const receiptData = await this.contract.WithdrawalQueue.info(idBN);\n\n results.push({ \n tokenId: idBN.toBigInt(), \n receipt: {\n ethAmount: receiptData.ethAmount,\n ethBalance: {\n amount: receiptData.ethAmount.toBigInt(),\n decimals: 18,\n symbol: \"ETH\"\n },\n readyAt: new Date(Number(receiptData.readyAt.toString()) * 1000).valueOf(),\n }\n });\n } catch (err) {\n // in case of any mismatch or race, just skip this id\n console.warn(`Failed to load receipt for tokenId=${idBN.toString()}`, err);\n continue;\n }\n }\n\n return results;\n }\n\n\n\n private async getOwnedWithdrawReceiptsFor(\n owner: string,\n fromBlock = 0,\n toBlock: number | string = \"latest\"\n ): Promise<BigNumber[]> {\n const contract = this.contract.WithdrawalQueue;\n\n // Logs where address received tokens\n const toLogs = await contract.queryFilter(\n contract.filters.Transfer(null, owner),\n fromBlock,\n toBlock\n );\n\n // Logs where address sent tokens (including burns from owner → 0)\n const fromLogs = await contract.queryFilter(\n contract.filters.Transfer(owner, null),\n fromBlock,\n toBlock\n );\n\n const owned = new Set<string>();\n\n // Add all received tokenIds\n for (const e of toLogs) {\n const tokenId = e.args?.tokenId;\n if (!tokenId) continue;\n owned.add(tokenId.toString());\n }\n\n // Remove all sent tokenIds\n for (const e of fromLogs) {\n const tokenId = e.args?.tokenId;\n if (!tokenId) continue;\n owned.delete(tokenId.toString());\n }\n\n // Convert to BigNumbers\n return Array.from(owned).map((id) => BigNumber.from(id));\n }\n}","import { BigNumber, ethers } from \"ethers\";\nimport { ClaimedEvent, DepositEvent, DepositResult, SharesBurnedEvent, ValidatorDepositedEvent } from \"../types\";\nimport { EthereumContractService } from \"../contract\";\nimport { formatContractErrors } from \"../utils\";\n\nexport class ValidatorClient {\n\n private readonly contractService: EthereumContractService;\n \n get contract() { return this.contractService.contract; }\n\n constructor(contract: EthereumContractService) {\n this.contractService = contract;\n }\n\n\n /**\n * \n * @param amountWei an amount of liqETH (in WEI) to stake to the Outpost\n * @returns txHash (hash of the transaction), receipt, Staked event\n */\n async validatorDepositAndLockBond(): Promise<any> {\n const amountWei: BigNumber = ethers.utils.parseEther(\"32\");\n\n // simulate call first\n try {\n await this.contract.DepositManager.callStatic.validatorDepositAndLockBond({ value: amountWei });\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n\n\n // send the tx to stake liqeth\n const tx = await this.contract.DepositManager.validatorDepositAndLockBond({ value: amountWei });\n\n // Wait for 1 confirmation \n const receipt = await tx.wait(1);\n\n // Parse ValidatorDeposited event if present\n let staked: ValidatorDepositedEvent | undefined;\n const ev = receipt.events?.find((e) => e.event === 'Staked');\n\n if (ev && ev.args) {\n const { sender, amount, shares } = ev.args;\n staked = {\n sender,\n amount: BigNumber.from(amount),\n shares: BigNumber.from(shares),\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n staked,\n };\n }\n\n\n}","import { BigNumber, ethers } from 'ethers';\nimport { ChainID, EvmChainID, PublicKey as WirePubKey } from '@wireio/core';\nimport {\n IStakingClient,\n OPPAssertion,\n Portfolio,\n StakerConfig,\n TrancheSnapshot\n} from '../../types';\nimport { EthereumContractService } from './contract';\nimport { preLaunchReceipt, WithdrawReceipt } from './types';\nimport { buildEthereumTrancheSnapshot } from './utils';\nimport { ConvertClient } from './clients/convert.client';\nimport { StakeClient } from './clients/stake.client';\nimport { PretokenClient } from './clients/pretoken.client';\nimport { OPPClient } from './clients/opp.client';\nimport { ReceiptClient } from './clients/receipt.client';\nimport { ValidatorClient } from './clients/validator.client';\n\nexport const INITIAL_TRANCHE_SUPPLY = 35000;\n\nexport class EthereumStakingClient implements IStakingClient {\n private readonly provider: ethers.providers.Web3Provider | ethers.providers.JsonRpcProvider;\n public readonly pubKey?: WirePubKey;\n private readonly signer?: ethers.Signer;\n private readonly contractService: EthereumContractService;\n\n private convertClient: ConvertClient;\n private pretokenClient: PretokenClient;\n private stakeClient: StakeClient;\n private oppClient: OPPClient;\n private receiptClient: ReceiptClient;\n private validatorClient: ValidatorClient;\n\n\n get contract() { return this.contractService.contract; }\n get network() { return this.config.network; }\n\n constructor(private config: StakerConfig) {\n try {\n if (config.provider) {\n this.provider = config.provider as ethers.providers.Web3Provider;\n this.signer = this.provider.getSigner();\n }\n else {\n this.provider = new ethers.providers.JsonRpcProvider(config.network.rpcUrls[0]);\n }\n this.pubKey = config.pubKey;\n\n this.contractService = new EthereumContractService({\n provider: this.provider,\n signer: this.signer,\n chainId: config.network.chainId as EvmChainID,\n });\n\n this.convertClient = new ConvertClient(this.contractService);\n this.pretokenClient = new PretokenClient(this.contractService);\n this.stakeClient = new StakeClient(this.contractService);\n this.oppClient = new OPPClient(this.contractService);\n this.receiptClient = new ReceiptClient(this.contractService);\n this.validatorClient = new ValidatorClient(this.contractService)\n }\n catch (error) {\n // console.error('Error initializing EthereumStakingClient:', error);\n throw error;\n }\n }\n\n // ---------------------------------------------------------------------\n // Public IStakingClient Interface Methods\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 this.ensureUser();\n\n const amountWei = BigNumber.isBigNumber(amount)\n ? amount\n : BigNumber.from(amount);\n\n const result = await this.convertClient.performDeposit(amountWei);\n return result.txHash;\n }\n\n /**\n * Withdraw native ETH from the liqETH protocol via the liqeth safeBurn function, which burns the LiqETH and adds the user to the withdrawal queue.\n * @param amount Amount in wei (or something convertible to BigNumber).\n * @returns transaction hash\n */\n async withdraw(amount: bigint): Promise<string> {\n this.ensureUser();\n\n const address = await this.signer!.getAddress();\n const amountWei = BigNumber.from(amount);\n\n const result = await this.convertClient.performWithdraw(address, amountWei)\n return result.txHash;\n }\n\n /**\n * Withdraw native ETH from the liqETH protocol via the liqeth safeBurn function, which burns the LiqETH and adds the user to the withdrawal queue.\n * @param amount Amount in wei (or something convertible to BigNumber).\n * @returns transaction hash\n */\n async loadPendingWithdraws(): Promise<WithdrawReceipt[]> {\n this.ensureUser();\n const address = await this.signer!.getAddress();\n\n return await this.receiptClient.fetchWithdrawReceipts(address);\n }\n\n /**\n * Withdraw native ETH from the liqETH protocol via the liqeth safeBurn function, which burns the LiqETH and adds the user to the withdrawal queue.\n * @param tokenId The ID of the withdrawal request NFT\n * @returns transaction hash\n */\n async claimWithdraw(tokenId: bigint): Promise<string> {\n this.ensureUser();\n\n const tokenIdBigNum = BigNumber.from(tokenId)\n const result = await this.convertClient.claimWithdraw(tokenIdBigNum)\n return result.txHash;\n }\n\n\n /**\n * Stake liqETH via DepositManager.\n * @param amount Amount in wei - Keep this as a bigint / string in the caller; avoid JS floats.\n * @returns transaction hash\n */\n async stake(amount: bigint): Promise<string> {\n this.ensureUser();\n\n const walletAddress = await this.signer!.getAddress();\n const amountWei = BigNumber.from(amount);\n\n const result = await this.stakeClient.performStake(amountWei, walletAddress);\n return result.txHash;\n }\n\n\n // TODO\n async unstake(): Promise<string> {\n throw new Error(\"Method not yet implemented.\");\n }\n\n\n /**\n * ETH Prelaunch function to unstake liqEth\n * @param tokenId ReceiptNFT tokenId for the owned NFT that will be burned\n * @param recipient Address to receive the liqEth funds linked to the burned NFT\n * @returns the transaction hash\n */\n async unstakePrelaunch(tokenId: bigint, recipient: string): Promise<string> {\n this.ensureUser();\n\n const tokenIdBigNum = BigNumber.from(tokenId)\n const result = await this.stakeClient.performWithdrawStake(tokenIdBigNum, recipient);\n return result.txHash;\n }\n\n\n async buy(amount: bigint): Promise<string> {\n this.ensureUser();\n\n const buyer = await this.signer!.getAddress();\n\n // ! Hoodi only - check if the mock aggregator price is stale, and if so, update it before submitting the buy request\n // const network = await this.provider.getNetwork();\n // const chainId = network.chainId;\n // const allowedTestChains = new Set([560048]);\n // if (allowedTestChains.has(chainId)) await this.updateMockAggregatorPrice();\n\n let result = await this.pretokenClient.purchasePretokensWithLiqETH(amount, buyer);\n return result && result.txHash ? result.txHash : \"Error - no resulting txHash\";\n }\n\n\n /**\n * Validator functions\n */\n async validatorDeposit(): Promise<string> {\n this.ensureUser();\n\n let result = await this.validatorClient.validatorDepositAndLockBond();\n return result && result.txHash ? result.txHash : \"Error - no resulting txHash\";\n }\n \n\n\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 | null> {\n\n try {\n if (!this.signer) return Promise.resolve(null);\n\n const walletAddress = await this.signer!.getAddress();\n\n // 1) Native ETH balance\n const nativeBalance = await this.provider.getBalance(walletAddress);\n const nativeDecimals = this.network?.nativeCurrency?.decimals ?? 18;\n const nativeSymbol = this.network?.nativeCurrency?.symbol ?? 'ETH';\n\n // 2) liqETH ERC-20 balance (actual)\n const liqBalance: ethers.BigNumber = await this.contract.LiqEthToken.balanceOf(walletAddress);\n const liqSymbol = 'Liq' + (this.network?.nativeCurrency?.symbol ?? 'ETH');\n\n // 3) staked liqEth ERC-20 balance (calculate from receipts)\n let stakeReceipts = await this.receiptClient.stakeReceipts(walletAddress);\n\n let stakeBalanceBN = BigNumber.from(0);\n for (let r of stakeReceipts) {\n stakeBalanceBN = stakeBalanceBN.add(BigNumber.from(r.receipt.principal.amount));\n }\n let stakeSharesBN = BigNumber.from(0);\n for (let r of stakeReceipts) {\n stakeSharesBN = stakeSharesBN.add(BigNumber.from(r.receipt.shares.amount));\n }\n\n // 4) WIRE pretoken balance\n const wireBalance: ethers.BigNumber = await this.contract.Pretoken.balanceOf(walletAddress);\n\n // 5) Calculate staking yield \n let currentIndex = BigInt(0);\n let totalShares = BigInt(0);\n let userShares = BigInt(0);\n const indexScale = BigInt(1e27);\n try {\n // These may throw if not implemented on contract\n const [indexBn, totalSharesBn] = await Promise.all([\n this.contract.Depositor.index().catch(() => BigNumber.from(0)),\n this.contract.Depositor.totalShares().catch(() => BigNumber.from(0)),\n ]);\n\n const userSharesBn = stakeSharesBN;\n currentIndex = BigInt(indexBn.toString());\n totalShares = BigInt(totalSharesBn.toString());\n userShares = BigInt(userSharesBn.toString());\n } catch (error) {\n console.log('Error fetching staking index/shares:', error);\n }\n\n // sharesToTokens(userShares, currentIndex) = userShares * currentIndex / indexScale\n let estimatedClaim = BigInt(0);\n let estimatedYield = BigInt(0);\n \n if (userShares > BigInt(0) && currentIndex > BigInt(0)) {\n estimatedClaim = (userShares * currentIndex) / indexScale;\n if (estimatedClaim > stakeBalanceBN.toBigInt()) {\n estimatedYield = estimatedClaim - stakeBalanceBN.toBigInt();\n }\n }\n\n\n const portfolio: Portfolio = {\n native: {\n amount: nativeBalance.toBigInt(),\n decimals: nativeDecimals,\n symbol: nativeSymbol,\n },\n liq: {\n amount: liqBalance.toBigInt(),\n decimals: nativeDecimals,\n symbol: liqSymbol,\n },\n staked: {\n amount: stakeBalanceBN.toBigInt(),\n decimals: nativeDecimals,\n symbol: liqSymbol,\n },\n wire: {\n amount: wireBalance.toBigInt(),\n decimals: 18,\n symbol: '$WIRE',\n },\n\n yield: {\n currentIndex,\n indexScale,\n totalShares,\n userShares,\n estimatedClaim,\n estimatedYield,\n },\n chainID: this.network.chainId\n }\n return portfolio;\n }\n catch (error) {\n // console.log('Error fetching Ethereum portfolio:', error);\n throw error;\n }\n }\n\n /**\n * ETH Prelaunch function to list the Stake ReceiptNFTs owned by a specific user\n * @param address address to query the receipts for\n * @returns array of receipts\n */\n async fetchPrelaunchReceipts(address?: string): Promise<preLaunchReceipt[]> {\n this.ensureUser();\n\n if (address === undefined) address = await this.signer!.getAddress();\n\n //default to stake receipts\n return await this.receiptClient.stakeReceipts(address);\n }\n\n async getOPPMessages(address?: string): Promise<OPPAssertion[]> {\n this.ensureUser();\n\n if (!address) address = await this.signer!.getAddress();\n\n return await this.oppClient.getMessages(address);\n }\n\n\n\n // Ensure that signer wallet is available for write operations\n private ensureUser() {\n if (!this.signer) {\n throw new Error(\n 'EthereumStakingClient: write operation requires a wallet-connected Web3 provider',\n );\n }\n }\n\n\n // ---------------------------------------------------------------------\n // READ-ONLY Public Methods\n // ---------------------------------------------------------------------\n\n // Protocol-wide ETH staking APY in percent, e.g. 3.0 => \"3.00%\"\n async getSystemAPY(): Promise<number> {\n // NOTE: despite the name, this value is effectively *annual* BPS on-chain.\n // e.g. 300 => 3% APY\n const annualBpsBn = await this.contract.DepositManager.dailyRateBPS();\n const annualBps = annualBpsBn.toNumber(); // e.g. 300 for 3%\n\n // Convert basis points (1/100 of 1%) to percent:\n // 10,000 bps = 100% ⇒ 100 bps = 1% ⇒ divide by 100.\n const apyPercent = annualBps / 100;\n\n return apyPercent; // 3 => \"3.00%\"\n }\n\n // Protocol fee charged for deposit from Native to LIQ\n async getDepositFee(amountWei: bigint): Promise<bigint> {\n const feeBn: BigNumber = await this.contract.DepositManager.procFee(amountWei);\n return BigInt(feeBn.toString());\n }\n\n async getOPPStatus(): Promise<any> {\n return await this.oppClient.getStatus();\n }\n\n async getEthStats(): Promise<any> {\n let withdrawDelay = await this.contract.WithdrawalQueue.withdrawDelay();\n let minDeposit = await this.contract.DepositManager.minDeposit();\n let rewardCooldown = await this.contract.DepositManager.rewardCooldown();\n\n return {\n withdrawDelay,\n minDeposit,\n rewardCooldown,\n }\n }\n\n /**\n * Program-level prelaunch WIRE / tranche snapshot for Ethereum\n * \n * SUPPORTS READ-ONLY ACcESS\n */\n async getTrancheSnapshot(chainID: ChainID): Promise<TrancheSnapshot> {\n try {\n const blockNumber = await this.provider.getBlockNumber();\n const blockTag = { blockTag: blockNumber };\n\n // Fetch all required contract data\n const [totalSharesBn, indexBn, trancheNumberBn, trancheSupplyBn, tranchePriceUsdBn, totalSupplyBn, supplyGrowthBps, priceGrowthCents, minPriceUsd, maxPriceUsd] = await Promise.all([\n this.contract.Depositor.totalShares(blockTag),\n this.contract.Depositor.index(blockTag),\n this.contract.Pretoken.trancheNumber(blockTag),\n this.contract.Pretoken.trancheSupply(blockTag),\n this.contract.Pretoken.tranchePriceUsd(blockTag),\n this.contract.Pretoken.totalSupply(blockTag),\n this.contract.Pretoken.supplyGrowthBps(blockTag),\n this.contract.Pretoken.priceIncrementUsd(blockTag),\n this.contract.EthUsdPriceConsumer.MIN_PRICE(),\n this.contract.EthUsdPriceConsumer.MAX_PRICE(),\n ]);\n\n const totalTrancheSupply = BigInt(totalSupplyBn.toString()) / BigInt(1e10);\n const currentTrancheSupply = BigInt(trancheSupplyBn.toString()) / BigInt(1e10);\n\n // fetch price and timestamp from aggregator\n // const [roundId, answer, startedAt, updatedAt, answeredInRound] = await this.contract.MockAggregator.latestRoundData();\n //originally fetched ethPrice from aggregator - pulling from EthUsdPriceConsumer instead - this is where the actual price gets pulled from when purchasing pretokens.\n // let ethPriceUsd: bigint = BigInt(answer.toString());)\n\n let ethPriceUsdBn = await this.contract.EthUsdPriceConsumer.getPrice18Decimals();\n let ethPriceUsd: bigint = BigInt(ethPriceUsdBn.toString()) / BigInt(1e10);\n\n // let nativePriceTimestamp: number = Number(updatedAt);\n\n const initialTrancheSupply = BigInt(INITIAL_TRANCHE_SUPPLY) * BigInt(1e8);\n\n return buildEthereumTrancheSnapshot({\n chainID,\n totalSharesBn,\n indexBn,\n trancheNumberBn,\n currentTrancheSupply,\n tranchePriceUsdBn,\n totalTrancheSupply,\n initialTrancheSupply,\n supplyGrowthBps,\n priceGrowthCents,\n minPriceUsd,\n maxPriceUsd,\n ethPriceUsd,\n });\n }\n catch (err: any) {\n throw new Error(`Error fetching Ethereum tranche snapshot: ${err?.message || err}`);\n }\n }\n\n /**\n * Estimate a conservative native ETH buffer (in wei) to leave in the wallet\n * so the user can pay gas for the current deposit and at least one more tx.\n *\n * Typical usage in UI:\n * const buffer = await client.estimateGasBuffer();\n * const maxSpendable = balanceWei > buffer ? balanceWei - buffer : 0n;\n *\n * @param options.txCount How many transactions to cover (default 2: deposit + 1 more)\n * @param options.safetyMultiplier Additional safety multiplier on top of txCount (default 1.5x)\n * @param options.minBufferWei Optional override minimum buffer (defaults ~0.002 ETH)\n */\n async getDepositBuffer(options?: {\n txCount?: number;\n safetyMultiplier?: number;\n minBufferWei?: bigint;\n balanceOverrideLamports?: bigint;\n }): Promise<bigint> {\n this.ensureUser();\n\n const walletAddress = await this.signer!.getAddress();\n\n // 1) Estimate a baseline gas usage using a simple self-transfer.\n // This is cheap and doesn't depend on your contract ABI at all.\n const baseGas = await this.provider.estimateGas({\n from: walletAddress,\n to: walletAddress,\n value: ethers.constants.Zero,\n });\n\n // 2) Fetch current gas price / max fee per gas.\n const feeData = await this.provider.getFeeData();\n let gasPrice =\n feeData.maxFeePerGas ??\n feeData.gasPrice ??\n ethers.utils.parseUnits('20', 'gwei'); // conservative fallback\n\n // 3) How many txs do we want to cover?\n // Default: 2 (deposit + one extra action such as stake or small follow-up).\n const txCount = options?.txCount ?? 2;\n\n // We also assume that contract interactions are more expensive than a simple transfer.\n // Use a multiplier (e.g., 5x) on baseGas to approximate a more complex tx.\n const COMPLEX_TX_MULTIPLIER = 5; // tuning knob\n const totalGasUnits = baseGas\n .mul(COMPLEX_TX_MULTIPLIER)\n .mul(txCount);\n\n const baseCost = totalGasUnits.mul(gasPrice);\n\n // 4) Safety multiplier on top of that (e.g. 1.5x).\n const safetyMultiplier = options?.safetyMultiplier ?? 1.5;\n const safetyScaled = Math.round(safetyMultiplier * 100); // e.g. 150\n\n const bufferedCost = baseCost\n .mul(safetyScaled)\n .div(100); // apply safety factor\n\n let bufferWei = bufferedCost.toBigInt();\n\n // 5) Enforce a minimum floor (e.g. ~0.002 ETH).\n const defaultMinBufferWei = BigInt(2_000_000_000_000_000); // 0.002 ETH\n const minBufferWei = options?.minBufferWei ?? defaultMinBufferWei;\n\n if (bufferWei < minBufferWei) {\n bufferWei = minBufferWei;\n }\n\n return bufferWei;\n }\n\n // ---------------------------------------------------------------------\n // Internal ETH Staking client helper functions\n // ---------------------------------------------------------------------\n\n // ! This is a temporary measure for Hoodi testnet because there is no aggregator deployed\n // private async updateMockAggregatorPrice() {\n // const aggregator = this.contract.MockAggregator;\n\n // // read latest round & compute age\n // const [roundId, answer, startedAt, updatedAt, answeredInRound] = await aggregator.latestRoundData();\n // const now = (await this.provider.getBlock(\"latest\")).timestamp;\n // const ageSec = Number(now) - Number(updatedAt);\n\n // const ONE_HOUR = 1 * 3600;\n // // const ONE_HOUR = 10;\n // if (ageSec > ONE_HOUR) {\n // // safety check - only run in non-production contexts\n // const network = await this.provider.getNetwork();\n // const chainId = network.chainId;\n // const allowedTestChains = new Set([560048]);\n // if (!allowedTestChains.has(chainId)) {\n // console.warn(`MockAggregator is stale (${ageSec}s) but chainId ${chainId} is not a test/local network — skipping update.`);\n // return;\n // }\n\n\n // //fetch the current ETH / USD price\n // const res = await fetch('https://api.coingecko.com/api/v3/simple/price?ids=ethereum&vs_currencies=usd');\n // const data = await res.json();\n // const ethUsd = data.ethereum.usd;\n\n // const currentEthPrice = ethers.utils.parseUnits(ethUsd.toString(), 8);\n\n // try {\n // //update to be intentionally stale\n // // const alttx = await aggregator.updateStale(currentEthPrice, now - 7200);\n // // const altreceipt = await alttx.wait(1);\n // // console.log('stale update receipt', altreceipt)\n\n // //update answer with current timestamp\n // const tx = await aggregator.updateAnswer(currentEthPrice);\n // const txreceipt = await tx.wait(1);\n // // console.log('MockAggregator answer updated - receipt:', txreceipt)\n // } catch (err: any) {\n // console.error('MockAggregator updateAnswer failed', err?.message || err);\n // }\n // } else {\n // console.log(`MockAggregator updated ${ageSec}s ago — no update needed`);\n // }\n // }\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 // console.log('STAKER INIT', config);\n\n config.forEach((cfg) => {\n switch (cfg.network.chainId) {\n case SolChainID.Mainnet:\n case SolChainID.Devnet:\n this.clients.set(cfg.network.chainId, new SolanaStakingClient(cfg));\n break;\n\n case EvmChainID.Ethereum:\n case EvmChainID.Hoodi:\n this.clients.set(cfg.network.chainId, new EthereumStakingClient(cfg));\n break;\n\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 const hasClient = this.clients.has(chainID);\n\n if (!hasClient) {\n console.warn(`[Staker] setChain: no client configured for chain ${chainID}`);\n return false;\n }\n\n this.selectedChainID = chainID;\n return true;\n }\n}","import { BigNumber, ethers } from 'ethers';\nimport { BalanceView } from '../../types';\n\nexport const CONTRACT_NAMES = [\n // LiqETH contracts\n \"LiqEthAuthority\",\n \"BeaconState\",\n \"WithdrawalQueue\",\n \"LiqEthToken\",\n \"Accounting\",\n \"DepositManager\",\n \"WithdrawalVault\",\n \"StakingModule\",\n // \"YieldOracle\",\n\n //Outpost contracts\n \"OutpostManagerAuthority\",\n \"iodata\",\n \"Base58\",\n \"sysio_merkle\",\n \"ReceiptNFT\",\n \"Pool\",\n \"OutpostManager\",\n \"sysio_write\",\n \"EthUsdPriceConsumer\",\n \"BAR\",\n \"OPPCommon\",\n \"OPP\",\n \"Pretoken\",\n \"OPPInbound\",\n \"Depositor\",\n \"MockAggregator\",\n] as const;\n\nexport type ContractName = typeof CONTRACT_NAMES[number];\nexport type AddressBook = Record<ContractName, string>;\n\n\ninterface Result {\n /** EVM transaction hash */\n txHash: string;\n /** Full receipt, if you want it */\n receipt: ethers.providers.TransactionReceipt;\n}\n\n\nexport interface DepositEvent {\n user: string;\n netEth: BigNumber;\n fee: BigNumber;\n shares: BigNumber;\n}\n\nexport interface DepositResult extends Result {\n /** Parsed Deposited event, if present */\n deposited?: DepositEvent;\n}\n\nexport interface WithdrawRequestedEvent {\n user: string;\n ethAmount: BigNumber;\n nftId: BigNumber;\n readyAt: string;\n}\n\nexport interface WithdrawResult extends Result {\n /** Parsed WithdrawRequested event, if present */\n withdrawRequested?: WithdrawRequestedEvent;\n}\n\n\nexport interface StakedEvent {\n user: string;\n amountLiq: BigNumber;\n shares: BigNumber;\n tokenId: BigNumber;\n}\n\nexport interface StakedResult extends Result {\n /** Parsed Staked event, if present */\n staked?: StakedEvent;\n}\n\n\nexport interface WithdrawnStakeEvent {\n user: string;\n tokenId: BigNumber;\n tokenOut: BigNumber;\n}\nexport interface WithdrawnStakeResult extends Result {\n /** Parsed WithdrawnStake event, if present */\n withdrawnstake?: WithdrawnStakeEvent;\n\n}\n\nexport interface SharesBurnedEvent {\n from: string;\n shares: BigNumber;\n tokenValue: BigNumber;\n}\n\nexport interface preLaunchReceipt {\n tokenId: bigint;\n receipt: {\n account: string,\n currency: number,\n kind: number,\n indexAtMint: BalanceView,\n principal: BalanceView,\n shares: BalanceView,\n timestamp: string,\n }\n}\n\nexport interface ClaimedEvent {\n user: string;\n amount: BigNumber;\n}\n\nexport interface WithdrawReceipt {\n tokenId: bigint;\n receipt: {\n ethAmount: BigNumber;\n ethBalance: BalanceView;\n readyAt: number;\n }\n}\n\n\n\nexport interface ValidatorDepositedEvent {\n sender: string;\n amount: BigNumber;\n shares: BigNumber\n}\n"],"names":["mainnetLiqsolCoreIDL","mainnetLiqSolTokenIDL","mainnetValidatorLeaderboardIDL","devnetLiqsolCoreIDL","devnetLiqSolTokenIDL","devnetValidatorLeaderboardIDL","INDEX_SCALE","growSupplyOnce","shrinkSupplyOnce","SolPubKey","PublicKey","tokenId","SupportedEvmChainID","SupportedSolChainID","PurchaseAsset","ReceiptNFTKind"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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AA;AAj+BxC,IAAM,mBAAN,GAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
|