@wireio/stake 0.7.2 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"stake.browser.js","sources":["../src/networks/solana/constants.ts","../src/networks/solana/program.ts","../src/networks/solana/clients/deposit.client.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/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":["// src/networks/solana/constants.ts\nimport { PublicKey, StakeProgram } from '@solana/web3.js';\n\nimport liqsolCoreIDL from '../../assets/solana/idl/liqsol_core.json';\nimport liqSolTokenIDL from '../../assets/solana/idl/liqsol_token.json';\nimport validatorLeaderboardIDL from '../../assets/solana/idl/validator_leaderboard.json';\nimport transferHookIDL from '../../assets/solana/idl/transfer_hook.json';\n\n/**\n * ---------------------------------------------------------------------------\n * PROGRAM IDS\n * ---------------------------------------------------------------------------\n *\n * These should match:\n * - `metadata.address` in your Anchor IDLs under src/assets/solana/idl/*.json\n * - The program IDs printed by your deploy scripts\n */\nexport const PROGRAM_IDS = {\n LIQSOL_CORE: new PublicKey(liqsolCoreIDL.address),\n LIQSOL_TOKEN: new PublicKey(liqSolTokenIDL.address),\n VALIDATOR_LEADERBOARD: new PublicKey(validatorLeaderboardIDL.address),\n TRANSFER_HOOK: new PublicKey(transferHookIDL.address),\n} as const;\n\nexport const {\n LIQSOL_CORE,\n LIQSOL_TOKEN,\n VALIDATOR_LEADERBOARD,\n TRANSFER_HOOK,\n} = PROGRAM_IDS;\n\n/**\n * ---------------------------------------------------------------------------\n * PDA SEEDS (must match on-chain programs)\n * ---------------------------------------------------------------------------\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 // NOTE: in the current IDL, userRecord is keyed by the USER (wallet), not ATA\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// Global Config PDA\nexport const deriveGlobalConfigPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.GLOBAL_CONFIG)],\n LIQSOL_CORE,\n )[0];\n\n\n/**\n * ---------------------------------------------------------------------------\n * CORE / DISTRIBUTION / DEPOSIT PDAS\n * ---------------------------------------------------------------------------\n */\n\nexport const deriveLiqsolMintPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQSOL_MINT)],\n LIQSOL_TOKEN,\n )[0];\n\nexport const deriveLiqsolMintAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQSOL_MINT_AUTHORITY)],\n LIQSOL_TOKEN,\n )[0];\n\nexport const deriveDepositAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.DEPOSIT_AUTHORITY)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveVaultPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VAULT)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveReservePoolPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.RESERVE_POOL)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveStakeControllerStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.STAKE_CONTROLLER_STATE)],\n LIQSOL_CORE,\n )[0];\n\nexport const derivePayoutStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.PAYOUT_STATE)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveBucketAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.BUCKET_AUTHORITY)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveDistributionStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.DISTRIBUTION_STATE)],\n LIQSOL_CORE,\n )[0];\n\n/**\n * user_record PDA\n *\n * In the current liqsol_core IDL, this is keyed by USER (wallet),\n * not by token account.\n */\nexport const deriveUserRecordPda = (user: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.USER_RECORD), user.toBuffer()],\n LIQSOL_CORE,\n )[0];\n\nexport const derivePayRateHistoryPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.PAY_RATE_HISTORY)],\n LIQSOL_CORE,\n )[0];\n\n/**\n * ---------------------------------------------------------------------------\n * WITHDRAW MODULE / RECEIPTS\n * ---------------------------------------------------------------------------\n */\n\nexport const deriveWithdrawGlobalPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.WITHDRAW_GLOBAL)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveStakeAllocationStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.STAKE_ALLOCATION_STATE)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveStakeMetricsPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.STAKE_METRICS)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveMaintenanceLedgerPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.MAINTENANCE_LEDGER)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveWithdrawMintAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.WITHDRAW_MINT_AUTHORITY)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveWithdrawMintMetadataPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.MINT_METADATA)],\n LIQSOL_CORE,\n )[0];\n\n/**\n * NFT mint for withdrawal receipt, derived from nextReceiptId.\n */\nexport const deriveWithdrawNftMintPda = (receiptId: bigint | number) => {\n const receiptIdBytes = Buffer.alloc(8);\n // receiptId comes in as BN or bigint upstream → normalize\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 LIQSOL_CORE,\n )[0];\n};\n\nexport const deriveLiqReceiptDataPda = (nftMint: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQ_RECEIPT_DATA), nftMint.toBuffer()],\n LIQSOL_CORE,\n )[0];\n\n/**\n * ---------------------------------------------------------------------------\n * VALIDATOR LEADERBOARD\n * ---------------------------------------------------------------------------\n */\n\nexport const deriveLeaderboardStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LEADERBOARD_STATE)],\n VALIDATOR_LEADERBOARD,\n )[0];\n\nexport const deriveValidatorRecordPda = (voteAccount: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VALIDATOR_RECORD), voteAccount.toBuffer()],\n VALIDATOR_LEADERBOARD,\n )[0];\n\nexport const deriveStakeControllerVaultPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VAULT)],\n LIQSOL_CORE,\n )[0];\n\n/**\n * ---------------------------------------------------------------------------\n * OUTPOST / PRETOKENS\n * ---------------------------------------------------------------------------\n */\n\nexport const deriveOutpostGlobalStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.OUTPOST_GLOBAL_STATE)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveOutpostPoolAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQSOL_POOL)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveOutpostAccountPda = (user: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.OUTPOST_ACCOUNT), user.toBuffer()],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveUserPretokenRecordPda = (user: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.USER_PRETOKEN_RECORD), user.toBuffer()],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveTrancheStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.TRANCHE_STATE)],\n LIQSOL_CORE,\n )[0];\n\nexport const derivePriceHistoryPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.PRICE_HISTORY)],\n LIQSOL_CORE,\n )[0];\n\n/**\n * BAR (bonded actor roles)\n */\n\nexport const deriveBarConfigPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.BAR_STATE_SEED)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveBondLevelPda = (bondLevelId: number[]) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.BOND_LEVEL_SEED), Buffer.from(bondLevelId)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveBondedActorPda = (actor: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.BONDED_ACTOR_SEED), actor.toBuffer()],\n LIQSOL_CORE,\n )[0];\n\n/**\n * SPL Transfer-hook: extra-account-metas PDA for the liqSOL mint.\n */\nexport const deriveExtraAccountMetaListPda = (liqsolMint: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.EXTRA_ACCOUNT_METAS), liqsolMint.toBuffer()],\n PROGRAM_IDS.TRANSFER_HOOK,\n )[0];\n\n/**\n * Ephemeral stake account address used per-deposit.\n * On-chain convention: seed = `ephemeral_<u32>` under StakeProgram.programId.\n */\nexport const deriveEphemeralStakeAddress = async (\n user: PublicKey,\n seed: 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 '99B2bTijsU6f1GCT73HmdR7HCFFjGMBcPZY6jZ96ynrR',\n);\nexport const CHAINLINK_PROGRAM = new PublicKey(\n 'HEvSKofvBgfaexv23kMabbYqxasxU3mQ4ibBMEmJWHny',\n);\n\n/**\n * ---------------------------------------------------------------------------\n * ECONOMICS & MATH CONSTANTS\n * ---------------------------------------------------------------------------\n */\n\n// Same scale factor used on-chain for pay-rate math\nexport const PAY_RATE_SCALE_FACTOR = BigInt(1_000_000_000_000); // 10^12\n\n// Default pay rate fallback used in tests & utils\nexport const DEFAULT_AVERAGE_PAY_RATE = BigInt(191_780_821);\n\n// How many history entries to average when computing expected fee\nexport const DEFAULT_PAY_RATE_LOOKBACK = 5;\n\n// Rent exemption for ephemeral stake account (lamports)\nexport const EPHEMERAL_RENT_EXEMPTION = 2_282_880;\n\n// For convenience: lamports <-> SOL helpers (no RPC dependency)\nexport const LAMPORTS_PER_SOL = 1_000_000_000;\n\nexport const 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 { AnchorProvider, Program } from '@coral-xyz/anchor';\n\nimport liqsolCoreJson from '../../assets/solana/idl/liqsol_core.json';\nimport liqsolTokenJson from '../../assets/solana/idl/liqsol_token.json';\nimport validatorLeaderboardJson from '../../assets/solana/idl/validator_leaderboard.json';\n\nimport type { LiqsolCore } from '../../assets/solana/types/liqsol_core';\nimport type { LiqsolToken } from '../../assets/solana/types/liqsol_token';\nimport type { ValidatorLeaderboard } from '../../assets/solana/types/validator_leaderboard';\n\nimport { PROGRAM_IDS } from './constants';\n\ntype Entry<IDL> = {\n idl: IDL & { address: string };\n address: string;\n};\n\nconst PROGRAMS = {\n liqsolCore: {\n idl: liqsolCoreJson,\n address: PROGRAM_IDS.LIQSOL_CORE.toBase58(),\n } as Entry<LiqsolCore>,\n liqsolToken: {\n idl: liqsolTokenJson,\n address: PROGRAM_IDS.LIQSOL_TOKEN.toBase58(),\n } as Entry<LiqsolToken>,\n validatorLeaderboard: {\n idl: validatorLeaderboardJson,\n address: PROGRAM_IDS.VALIDATOR_LEADERBOARD.toBase58(),\n } as Entry<ValidatorLeaderboard>,\n} as const;\n\nexport type SolanaProgramName = keyof typeof PROGRAMS;\n\nexport class SolanaProgramService {\n constructor(private provider: AnchorProvider) { }\n\n getProgram<K extends SolanaProgramName>(name: K): Program<(typeof PROGRAMS)[K]['idl']> {\n const { idl, address } = PROGRAMS[name];\n const idlWithAddr = { ...idl, address };\n return new Program(idlWithAddr, this.provider) as Program<(typeof PROGRAMS)[K]['idl']>;\n }\n\n listProgramNames(): SolanaProgramName[] {\n return Object.keys(PROGRAMS) as SolanaProgramName[];\n }\n}","import { AnchorProvider, BN, Program } from '@coral-xyz/anchor';\nimport {\n SystemProgram,\n Transaction,\n TransactionInstruction,\n StakeProgram,\n SYSVAR_INSTRUCTIONS_PUBKEY,\n SYSVAR_CLOCK_PUBKEY,\n SYSVAR_RENT_PUBKEY,\n SYSVAR_STAKE_HISTORY_PUBKEY,\n} from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddressSync,\n} from '@solana/spl-token';\n\nimport { SolanaProgramService } from '../program';\nimport type { LiqsolCore } from '../../../assets/solana/types/liqsol_core';\n\nimport {\n PROGRAM_IDS,\n deriveDepositAuthorityPda,\n deriveLiqsolMintPda,\n deriveLiqsolMintAuthorityPda,\n deriveReservePoolPda,\n deriveVaultPda,\n deriveStakeControllerStatePda,\n derivePayoutStatePda,\n deriveBucketAuthorityPda,\n derivePayRateHistoryPda,\n deriveDistributionStatePda,\n deriveUserRecordPda,\n deriveEphemeralStakeAddress,\n deriveWithdrawGlobalPda,\n deriveStakeAllocationStatePda,\n deriveStakeMetricsPda,\n deriveMaintenanceLedgerPda,\n deriveWithdrawMintAuthorityPda,\n deriveWithdrawMintMetadataPda,\n deriveWithdrawNftMintPda,\n deriveLiqReceiptDataPda,\n deriveGlobalConfigPda,\n} from '../constants';\nimport { GlobalAccount, WalletLike } from '../types';\n\nexport class DepositClient {\n private program: Program<LiqsolCore>;\n\n get wallet(): WalletLike {\n return this.provider.wallet;\n }\n\n constructor(private provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.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<Transaction> {\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 = deriveDepositAuthorityPda();\n const liqsolMint = deriveLiqsolMintPda();\n const liqsolMintAuthority = deriveLiqsolMintAuthorityPda();\n const reservePool = deriveReservePoolPda();\n const vault = deriveVaultPda();\n const controllerState = deriveStakeControllerStatePda();\n const payoutState = derivePayoutStatePda();\n const bucketAuthority = deriveBucketAuthorityPda();\n const payRateHistory = derivePayRateHistoryPda();\n const globalConfig = deriveGlobalConfigPda();\n\n // -------------------------------------------------------------\n // Token-2022 ATAs\n // -------------------------------------------------------------\n const userAta = getAssociatedTokenAddressSync(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n // -------------------------------------------------------------\n // Distribution state + user_record (KEYED BY TOKEN ACCOUNT)\n // -------------------------------------------------------------\n const distributionState = deriveDistributionStatePda();\n const userRecord = 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 deriveEphemeralStakeAddress(user, seed);\n\n // -------------------------------------------------------------\n // BUILD IX (MUST MATCH IDL)\n // -------------------------------------------------------------\n const ix: TransactionInstruction = 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: 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 return new Transaction().add(ix);\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<Transaction> {\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 = deriveLiqsolMintPda();\n\n const userAta = getAssociatedTokenAddressSync(\n liqsolMint,\n user,\n false,\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 = deriveUserRecordPda(userAta);\n const distributionState = deriveDistributionStatePda();\n\n // Reserve + stake controller PDAs\n const global = deriveWithdrawGlobalPda(); // withdraw operator state\n const reservePool = deriveReservePoolPda();\n const stakeAllocationState = deriveStakeAllocationStatePda();\n const stakeMetrics = deriveStakeMetricsPda();\n const maintenanceLedger = deriveMaintenanceLedgerPda();\n const globalConfig = 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 = deriveWithdrawMintAuthorityPda();\n const metadata = deriveWithdrawMintMetadataPda();\n\n const nftMint = deriveWithdrawNftMintPda(receiptId);\n const receiptData = deriveLiqReceiptDataPda(nftMint);\n\n const owner = user;\n const nftAta = getAssociatedTokenAddressSync(\n nftMint,\n owner,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n // Bucket token account (same bucket used by deposit/distribution)\n const bucketAuthority = 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 const ix: TransactionInstruction = 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 return new Transaction().add(ix);\n }\n}","import { Program, BN, AnchorProvider } from '@coral-xyz/anchor';\n\nimport {\n Connection,\n Keypair,\n PublicKey,\n SystemProgram,\n StakeProgram,\n} from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddress,\n} from '@solana/spl-token';\n\nimport {\n LIQSOL_CORE,\n LIQSOL_TOKEN,\n PAY_RATE_SCALE_FACTOR,\n DEFAULT_AVERAGE_PAY_RATE,\n EPHEMERAL_RENT_EXEMPTION,\n LAMPORTS_PER_SOL,\n lamportsToSol,\n solToLamports,\n deriveDepositAuthorityPda,\n deriveLiqsolMintPda,\n deriveLiqsolMintAuthorityPda,\n deriveVaultPda,\n deriveReservePoolPda,\n deriveStakeControllerStatePda,\n derivePayoutStatePda,\n deriveBucketAuthorityPda,\n deriveDistributionStatePda,\n deriveUserRecordPda,\n derivePayRateHistoryPda,\n deriveStakeControllerVaultPda,\n deriveEphemeralStakeAddress,\n DEFAULT_PAY_RATE_LOOKBACK,\n deriveOutpostGlobalStatePda,\n deriveOutpostPoolAuthorityPda,\n deriveOutpostAccountPda,\n deriveTrancheStatePda,\n deriveUserPretokenRecordPda,\n CHAINLINK_FEED,\n CHAINLINK_PROGRAM,\n deriveExtraAccountMetaListPda,\n} from './constants';\n\nimport liqsolCoreIDL from '../../assets/solana/idl/liqsol_core.json';\nimport { LiqsolCore } from '../../assets/solana/types/liqsol_core';\nimport { GlobalState, TrancheState } from './types';\nimport { TrancheLadderItem, TrancheSnapshot } from '../../types';\nimport { ChainID } from '@wireio/core';\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// Read-only liqsol_core Program helper\n// -----------------------------------------------------------------------------\n\nlet _liqsolCoreProgram: Program<LiqsolCore> | null = null;\n\nexport function getLiqsolCoreProgram(\n connection: Connection,\n): Program<LiqsolCore> {\n if (_liqsolCoreProgram && _liqsolCoreProgram.provider.connection === connection) {\n return _liqsolCoreProgram;\n }\n\n // Dummy wallet – we're only doing read-only account fetches here.\n const tmpKeypair = Keypair.generate();\n const wallet: any = {\n publicKey: tmpKeypair.publicKey,\n signAllTransactions: async () => [],\n signTransaction: async () => tmpKeypair,\n };\n\n const provider = new AnchorProvider(connection, wallet, {\n commitment: 'confirmed',\n });\n\n const program = new Program(\n liqsolCoreIDL,\n provider,\n ) as Program<LiqsolCore>;\n\n _liqsolCoreProgram = program;\n return program;\n}\n\n\n// -----------------------------------------------------------------------------\n// Balance + state getters (UI-friendly)\n// -----------------------------------------------------------------------------\n\nexport async function getUserLiqSolBalance(\n connection: Connection,\n user: PublicKey,\n): Promise<number> {\n const liqsolMint = deriveLiqsolMintPda();\n const ata = await getAssociatedTokenAddress(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n try {\n const bal = await connection.getTokenAccountBalance(ata);\n return Number(bal.value.amount); // raw lamports, not decimals-adjusted\n } catch {\n return 0;\n }\n}\n\nexport async function getBucketLiqSolBalance(\n connection: Connection,\n): Promise<number> {\n const liqsolMint = deriveLiqsolMintPda();\n const bucketAuthority = deriveBucketAuthorityPda();\n const ata = await getAssociatedTokenAddress(\n liqsolMint,\n bucketAuthority,\n true,\n TOKEN_2022_PROGRAM_ID,\n );\n\n try {\n const bal = await connection.getTokenAccountBalance(ata);\n return Number(bal.value.amount);\n } catch {\n return 0;\n }\n}\n\nexport async function getReservePoolBalance(\n connection: Connection,\n): Promise<number> {\n const reservePool = deriveReservePoolPda();\n try {\n const lamports = await connection.getBalance(reservePool);\n return lamports;\n } catch {\n return 0;\n }\n}\n\n/**\n * Raw account info for the stake_controller state (Anchor decode is left\n * to the caller so the SDK can stay IDL-agnostic at this layer).\n */\nexport async function getStakeControllerStateRaw(\n connection: Connection,\n): Promise<Uint8Array | null> {\n const pda = deriveStakeControllerStatePda();\n const info = await connection.getAccountInfo(pda);\n return info?.data ?? null;\n}\n\n/**\n * Raw account info for the payout-state account.\n */\nexport async function getPayoutStateRaw(\n connection: Connection,\n): Promise<Uint8Array | null> {\n const pda = derivePayoutStatePda();\n const info = await connection.getAccountInfo(pda);\n return info?.data ?? null;\n}\n\n/**\n * Raw account info for a user's distribution user_record.\n *\n * NOTE: user_record is keyed by the TOKEN ACCOUNT (ATA), not the wallet.\n * Here we derive the user's liqSOL ATA and then its user_record PDA.\n */\nexport async function getUserRecordRaw(\n connection: Connection,\n user: PublicKey,\n): Promise<Uint8Array | null> {\n const liqsolMint = deriveLiqsolMintPda();\n const userAta = await getAssociatedTokenAddress(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n const pda = deriveUserRecordPda(userAta);\n const info = await connection.getAccountInfo(pda);\n return info?.data ?? null;\n}\n\n\n// -----------------------------------------------------------------------------\n// Pay-rate & fee utilities (on-chain compatible)\n// -----------------------------------------------------------------------------\n\nexport async function getAveragePayRate(\n connection: Connection,\n lookback: number = DEFAULT_PAY_RATE_LOOKBACK,\n): Promise<bigint> {\n const program = getLiqsolCoreProgram(connection);\n const payRateHistoryPda = derivePayRateHistoryPda();\n\n try {\n const anyProgram = program;\n const payRateHistoryAccount = await anyProgram.account.payRateHistory.fetch(\n payRateHistoryPda,\n );\n\n const entries = payRateHistoryAccount.entries ?? [];\n const totalEntriesAdded = Number(\n payRateHistoryAccount.totalEntriesAdded ?? 0,\n );\n const currentIndex: number = payRateHistoryAccount.currentIndex ?? 0;\n const maxEntries: number =\n payRateHistoryAccount.maxEntries ?? entries.length;\n\n if (!entries.length) {\n return DEFAULT_AVERAGE_PAY_RATE;\n }\n\n const entriesToFetch = Math.min(lookback, maxEntries, entries.length);\n\n let idx: number;\n if (totalEntriesAdded === 0) {\n idx = 0;\n } else if (currentIndex === 0) {\n idx = maxEntries - 1;\n } else {\n idx = currentIndex - 1;\n }\n\n let sum = BigInt(0);\n let validCount = BigInt(0);\n\n for (let i = 0; i < entriesToFetch; i++) {\n const entry = entries[idx];\n if (entry && typeof entry.scaledRate !== 'undefined') {\n const rate = BigInt(entry.scaledRate.toString());\n if (rate > BigInt(0)) {\n sum += rate;\n validCount += BigInt(1);\n }\n }\n\n if (totalEntriesAdded === 0) {\n idx = (idx + 1) % maxEntries;\n } else {\n idx = idx === 0 ? maxEntries - 1 : idx - 1;\n }\n }\n\n if (validCount === BigInt(0)) {\n return DEFAULT_AVERAGE_PAY_RATE;\n }\n\n return sum / validCount;\n } catch (err) {\n // Fallback to default when history missing/unavailable\n return DEFAULT_AVERAGE_PAY_RATE;\n }\n}\n\n/**\n * On-chain fee formula:\n * fee = (average_pay_rate * 4 * deposit_amount_lamports) / 10^12\n */\nexport function calculateExpectedFee(\n depositAmountLamports: BN,\n averagePayRate: BN,\n): BN {\n return averagePayRate\n .mul(new BN(4))\n .mul(depositAmountLamports)\n .div(new BN(1_000_000_000_000)); // 10^12\n}\n\n/**\n * Convenience helper to preview how a deposit splits between user + bucket\n * and how much goes into the reserve, assuming the simple model:\n *\n * - userLiqSol = amount - fee + EPHEMERAL_RENT_EXEMPTION\n * - bucketLiqSol = fee\n * - reserveLamports = amount + EPHEMERAL_RENT_EXEMPTION\n */\nexport function previewDepositEffects(params: {\n depositAmountLamports: BN;\n averagePayRate: BN;\n rentExemptionLamports?: number;\n}): {\n feeLamports: BN;\n userLiqSolLamports: BN;\n bucketLiqSolLamports: BN;\n reserveIncreaseLamports: BN;\n} {\n const { depositAmountLamports, averagePayRate } = params;\n const rent = new BN(\n params.rentExemptionLamports ?? EPHEMERAL_RENT_EXEMPTION,\n );\n\n const fee = calculateExpectedFee(depositAmountLamports, averagePayRate);\n const userLiqSol = depositAmountLamports.sub(fee).add(rent);\n const bucketLiqSol = fee;\n const reserveIncrease = depositAmountLamports.add(rent);\n\n return {\n feeLamports: fee,\n userLiqSolLamports: userLiqSol,\n bucketLiqSolLamports: bucketLiqSol,\n reserveIncreaseLamports: reserveIncrease,\n };\n}\n\n/**\n * ---------------------------------------------------------------------------\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): Promise<OutpostAccounts> {\n const globalState = deriveOutpostGlobalStatePda();\n const poolAuthority = deriveOutpostPoolAuthorityPda();\n const liqsolMint = deriveLiqsolMintPda();\n const distributionState = deriveDistributionStatePda();\n const bucketAuthority = deriveBucketAuthorityPda();\n const trancheState = deriveTrancheStatePda();\n\n // Outpost / pretoken PDAs\n const outpostAccount = deriveOutpostAccountPda(user);\n const userPretokenRecord = 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 false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n // user_record PDAs keyed by TOKEN ACCOUNTS (matches capital-staking)\n const bucketUserRecord = deriveUserRecordPda(bucketTokenAccount);\n const liqsolPoolUserRecord = deriveUserRecordPda(liqsolPoolAta);\n const userUserRecord = deriveUserRecordPda(userAta);\n\n const extraAccountMetaList = deriveExtraAccountMetaListPda(liqsolMint);\n\n // Chainlink program feeds\n let chainLinkFeed = CHAINLINK_FEED;\n let chainLinkProgram = CHAINLINK_PROGRAM;\n\n try {\n const program = getLiqsolCoreProgram(connection);\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 { SolanaProgramService } from '../program';\nimport type { LiqsolCore } from '../../../assets/solana/types/liqsol_core';\nimport {\n deriveDistributionStatePda,\n deriveGlobalConfigPda,\n deriveLiqsolMintPda,\n derivePayRateHistoryPda,\n deriveUserRecordPda,\n} from '../constants';\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<LiqsolCore>;\n\n constructor(private provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('liqsolCore');\n }\n\n get connection() {\n return this.provider.connection;\n }\n\n /**\n * Fetch the global distribution state account.\n *\n * IDL account name: \"distributionState\"\n */\n async getDistributionState(): Promise<DistributionState | null> {\n const pda = 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 = 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 = 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 = 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 false,\n TOKEN_2022_PROGRAM_ID,\n );\n const pdaFromWallet = 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 = 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 } from '../program';\nimport type { ValidatorLeaderboard } from '../../../assets/solana/types/validator_leaderboard';\nimport {\n deriveLeaderboardStatePda,\n deriveValidatorRecordPda,\n} from '../constants';\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<ValidatorLeaderboard>;\n\n constructor(private provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('validatorLeaderboard');\n }\n\n async getState(): Promise<LeaderboardState | null> {\n const pda = deriveLeaderboardStatePda();\n try {\n // Assumes account name \"leaderboardState\"\n return await this.program.account.leaderboardState.fetch(pda);\n } catch {\n return null;\n }\n }\n\n async getValidatorRecord(voteAccount: PublicKey): Promise<ValidatorRecord | null> {\n const pda = deriveValidatorRecordPda(voteAccount);\n try {\n // Assumes account name \"validatorRecord\"\n return await this.program.account.validatorRecord.fetchNullable(pda);\n } catch {\n return null;\n }\n }\n\n /**\n * Convenience helper to fetch and 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 = 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 liqsolCoreIDL from '../../../assets/solana/idl/liqsol_core.json';\nimport { LiqsolCore } from '../../../assets/solana/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, PROGRAM_IDS } from '../constants';\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<LiqsolCore>;\n\n constructor(\n private readonly provider: AnchorProvider,\n ) {\n this.program = new Program(liqsolCoreIDL as any, provider);\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 * Expose the raw Program in case callers need to build custom\n * instructions outside this client.\n */\n get liqsolCoreProgram(): Program<LiqsolCore> {\n return this.program;\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);\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,\n ): Promise<TransactionInstruction> {\n const userPk = user ?? this.wallet.publicKey;\n if (!userPk) {\n throw new Error('OutpostClient.buildStakeIx: wallet not connected');\n }\n\n const a = await this.buildAccounts(userPk);\n\n return this.program.methods\n .synd(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.userUserRecord,\n receiverUserRecord: a.liqsolPoolUserRecord,\n extraAccountMetaList: a.extraAccountMetaList,\n liqsolCoreProgram: PROGRAM_IDS.LIQSOL_CORE,\n transferHookProgram: 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: PROGRAM_IDS.LIQSOL_CORE,\n transferHookProgram: PROGRAM_IDS.TRANSFER_HOOK,\n liqsolPoolAta: a.liqsolPoolAta,\n outpostAccount: a.outpostAccount,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\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(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 { SolanaProgramService } from '../program';\nimport type { LiqsolCore } from '../../../assets/solana/types/liqsol_core';\n\nimport {\n GlobalState,\n PriceHistory,\n TrancheState,\n WalletLike,\n OutpostAccount,\n UserPretokenRecord,\n} from '../types';\n\nimport {\n derivePriceHistoryPda,\n CHAINLINK_FEED,\n CHAINLINK_PROGRAM,\n PROGRAM_IDS,\n deriveExtraAccountMetaListPda,\n} from '../constants';\n\n\nexport class TokenClient {\n private readonly program: Program<LiqsolCore>;\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(private readonly provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('liqsolCore');\n }\n\n // ---------------------------------------------------------------------------\n // Account helpers\n // ---------------------------------------------------------------------------\n\n async getAccounts(user: PublicKey): Promise<OutpostAccounts> {\n return buildOutpostAccounts(this.provider.connection, user);\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 const a = await this.getAccounts(user);\n\n const extraAccountMetaList = deriveExtraAccountMetaListPda(a.liqsolMint);\n const liqsolCoreProgram = PROGRAM_IDS.LIQSOL_CORE;\n const transferHookProgram = 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 = 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}","import {\n Commitment,\n ComputeBudgetProgram,\n Connection,\n ConnectionConfig,\n PerfSample,\n PublicKey as SolPubKey,\n SystemProgram,\n Transaction,\n TransactionSignature,\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 getAssociatedTokenAddressSync,\n TOKEN_2022_PROGRAM_ID,\n} from '@solana/spl-token';\n\nimport {\n ChainID,\n ExternalNetwork,\n KeyType,\n PublicKey,\n SolChainID,\n} from '@wireio/core';\n\nimport {\n IStakingClient,\n Portfolio,\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 deriveLiqsolMintPda,\n deriveReservePoolPda,\n deriveStakeMetricsPda,\n deriveVaultPda,\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';\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 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 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.depositClient = new DepositClient(this.anchor);\n this.distributionClient = new DistributionClient(this.anchor);\n this.leaderboardClient = new LeaderboardClient(this.anchor);\n this.outpostClient = new OutpostClient(this.anchor);\n this.tokenClient = new TokenClient(this.anchor);\n this.program = new SolanaProgramService(this.anchor);\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\n const tx = await this.depositClient.buildDepositTx(amountLamports);\n const { tx: prepared, blockhash, lastValidBlockHeight } =\n await this.prepareTx(tx);\n const signed = await this.signTransaction(prepared);\n return await this.sendAndConfirmHttp(signed, {\n blockhash,\n lastValidBlockHeight,\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\n const tx = await this.depositClient.buildWithdrawTx(amountLamports);\n const { tx: prepared, blockhash, lastValidBlockHeight } =\n await this.prepareTx(tx);\n const signed = await this.signTransaction(prepared);\n return await this.sendAndConfirmHttp(signed, {\n blockhash,\n lastValidBlockHeight,\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\n if (!amountLamports || amountLamports <= BigInt(0)) {\n throw new Error('Stake amount must be greater than zero.');\n }\n\n const user = this.solPubKey;\n\n // Build compute budget increase instruction\n const cuIx = ComputeBudgetProgram.setComputeUnitLimit({ units: 400_000 });\n\n // Build the Outpost synd instruction\n const ix = await this.outpostClient.buildStakeIx(amountLamports, user);\n\n // Wrap in a transaction and send\n const tx = new Transaction().add(cuIx, ix);\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 * Unstake liqSOL from Outpost (pool → liqSOL) via liqsol_core::desynd.\n */\n async unstake(amountLamports: bigint): Promise<string> {\n this.ensureUser();\n\n if (!amountLamports || amountLamports <= BigInt(0)) {\n throw new Error('Unstake amount must be greater than zero.');\n }\n\n const user = this.solPubKey;\n\n // Build compute budget increase instruction\n const cuIx = ComputeBudgetProgram.setComputeUnitLimit({ units: 400_000 });\n\n // Build the Outpost desynd instruction\n const ix = await this.outpostClient.buildUnstakeIx(amountLamports, user);\n\n // Wrap in a transaction and send\n const tx = new Transaction().add(cuIx, ix);\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 * 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\n const user = this.solPubKey;\n const cuIx = ComputeBudgetProgram.setComputeUnitLimit({ units: 400_000 });\n const ix = await this.tokenClient.buildPurchaseIx(amountLamports, user);\n const tx = new Transaction().add(cuIx, ix);\n const { tx: prepared, blockhash, lastValidBlockHeight } =\n await this.prepareTx(tx);\n const signed = await this.signTransaction(prepared);\n return await this.sendAndConfirmHttp(signed, {\n blockhash,\n lastValidBlockHeight,\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\n const user = this.solPubKey;\n\n const reservePoolPDA = deriveReservePoolPda();\n const vaultPDA = deriveVaultPda();\n const liqsolMint = deriveLiqsolMintPda();\n\n const userLiqsolAta = getAssociatedTokenAddressSync(\n liqsolMint,\n user,\n false,\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\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 // ---------------------------------------------------------------------\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(options?: {\n chainID?: ChainID;\n windowBefore?: number;\n windowAfter?: number;\n }): Promise<TrancheSnapshot> {\n const {\n chainID = SolChainID.WireTestnet,\n windowBefore,\n windowAfter,\n } = options ?? {};\n\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 ladderWindowBefore: windowBefore,\n ladderWindowAfter: windowAfter,\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 // 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 }\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 stakeMetricsPda = deriveStakeMetricsPda();\n const stakeMetrics =\n await liqSolCoreProgram.account.stakeMetrics.fetch(stakeMetricsPda);\n\n // solSystemPayRate is stored on-chain with PAY_RATE_SCALE_FACTOR (1e12)\n const raw = BigInt(stakeMetrics.solSystemPayRate.toString());\n\n // Convert to JS number in **decimal per epoch** units\n const rateDecimal = Number(raw) / Number(PAY_RATE_SCALE_FACTOR);\n\n return rateDecimal;\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] = 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 const payer = this.solPubKey;\n\n // -------------------------------------------------------------\n // 1) Current wallet balance (prefer caller override)\n // -------------------------------------------------------------\n const balanceLamports: bigint =\n options?.balanceOverrideLamports ??\n BigInt(await this.connection.getBalance(payer, 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.solPubKey;\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 // Tx helpers\n // ---------------------------------------------------------------------\n\n /**\n * Send a signed transaction over HTTP RPC and wait for confirmation.\n * Throws if the transaction fails.\n */\n private async sendAndConfirmHttp(\n signed: SolanaTransaction,\n ctx: { blockhash: string; lastValidBlockHeight: number },\n ): Promise<string> {\n this.ensureUser();\n\n const signature = await this.connection.sendRawTransaction(\n signed.serialize(),\n {\n skipPreflight: false,\n preflightCommitment: commitment,\n maxRetries: 3,\n },\n );\n\n const conf = await this.connection.confirmTransaction(\n {\n signature,\n blockhash: ctx.blockhash,\n lastValidBlockHeight: ctx.lastValidBlockHeight,\n },\n commitment,\n );\n\n if (conf.value.err) {\n throw new Error(\n `Transaction failed: ${JSON.stringify(conf.value.err)}`,\n );\n }\n\n return signature;\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.solPubKey;\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 || !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 * @module EthereumContractService\n *\n * Provides a unified service for interacting with Ethereum smart contracts using ethers.js.\n */\n\n// LiqETH Artifacts\nimport AccountingArtifact from '../../assets/ethereum/ABI/liqEth/accounting.sol/Accounting.json';\nimport DepositManagerArtifact from '../../assets/ethereum/ABI/liqEth/DepositManager.sol/DepositManager.json';\nimport LiqEthArtifact from '../../assets/ethereum/ABI/liqEth/liqEth.sol/LiqEthToken.json';\nimport StakingModuleArtifact from '../../assets/ethereum/ABI/liqEth/stakingModule.sol/StakingModule.json';\nimport WithdrawalQueueArtifact from '../../assets/ethereum/ABI/liqEth/withdrawalQueue.sol/WithdrawalQueue.json';\nimport WithdrawalVaultArtifact from '../../assets/ethereum/ABI/liqEth/withdrawalVault.sol/WithdrawalVault.json';\nimport BeaconStateArtifact from '../../assets/ethereum/ABI/liqEth/BeaconState.sol/BeaconState.json';\nimport YieldOracleArtifact from '../../assets/ethereum/ABI/liqEth/Yield.sol/YieldOracle.json';\n\n// Outpost Artifacts\nimport DepositorArtifact from '../../assets/ethereum/ABI/outpost/Depositor.sol/Depositor.json';\nimport ReceiptNFTArtifact from '../../assets/ethereum/ABI/outpost/ReceiptNFT.sol/ReceiptNFT.json';\nimport OutpostManagerArtifact from '../../assets/ethereum/ABI/outpost/OutpostManager.sol/OutpostManager.json';\nimport BARArtifact from '../../assets/ethereum/ABI/outpost/BAR.sol/BAR.json';\nimport OPPArtifact from '../../assets/ethereum/ABI/outpost/OPP.sol/OPP.json';\nimport OPPCommonArtifact from '../../assets/ethereum/ABI/outpost/OPPCommon.sol/OPPCommon.json';\nimport OPPInboundArtifact from '../../assets/ethereum/ABI/outpost/OPPInbound.sol/OPPInbound.json';\nimport PretokenArtifact from '../../assets/ethereum/ABI/outpost/Pretoken.sol/Pretoken.json';\nimport AggregatorArtifact from '../../assets/ethereum/ABI/outpost/Aggregator.sol/Aggregator.json';\nimport EthUsdPriceConsumerArtifact from '../../assets/ethereum/ABI/outpost/EthUsdPriceConsumer.sol/EthUsdPriceConsumer.json';\nimport PoolArtifact from '../../assets/ethereum/ABI/outpost/Pool.sol/Pool.json';\nimport OutpostManagerAuthorityArtifact from '../../assets/ethereum/ABI/outpost/OutpostManagerAuthority.sol/OutpostManagerAuthority.json';\n\n// Common Artifacts\nimport IodataArtifact from '../../assets/ethereum/ABI/common/iodata.sol/iodata.json';\nimport Base58Artifact from '../../assets/ethereum/ABI/common/Base58.sol/Base58.json';\nimport sysio_merkleArtifact from '../../assets/ethereum/ABI/common/sysio_merkle.sol/sysio_merkle.json';\nimport sysio_writeArtifact from '../../assets/ethereum/ABI/common/sysio_write.sol/sysio_write.json';\n\n// ERC Token Artifacts\nimport ERC20Artifact from '../../assets/ethereum/ABI/token/ERC20Token.sol/ERC20Token.json';\nimport ERC721Artifact from '../../assets/ethereum/ABI/token/ERC721Token.sol/ERC721Token.json';\nimport ERC1155Artifact from '../../assets/ethereum/ABI/token/ERC1155Token.sol/ERC1155Token.json';\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';\n\nexport const ERC20Abi = ERC20Artifact.abi;\nexport const ERC721Abi = ERC721Artifact.abi;\nexport const ERC1155Abi = ERC1155Artifact.abi;\n\n// -----------------------------------------------------------------------------\n// Address book\n// -----------------------------------------------------------------------------\n\n// Make sure ContractName in ./types includes all of these keys.\nexport const ADDRESSES: AddressBook = {\n // 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 MockAggregator: \"0xFCfc3ddd4CBd9Ad3b3af3A374B8bdA1b66eE6FFF\",\n};\n\nexport type Contracts<T extends string = ContractName> = Record<T, ContractConfig>;\n\nexport type ContractConfig = {\n address: string;\n abi: JsonFragment[];\n};\n\n// -----------------------------------------------------------------------------\n// Contract config\n// -----------------------------------------------------------------------------\n\nexport const CONTRACTS: Contracts<ContractName> = {\n // 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 MockAggregator: {\n address: ADDRESSES.MockAggregator,\n abi: AggregatorArtifact.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\nexport interface ContractOptions {\n /** RPC endpoint or injected EIP-1193 provider */\n provider?: ethers.providers.Provider;\n /** Only required if you need to send txns */\n signer?: Signer;\n}\n\nexport class EthereumContractService {\n private provider?: providers.Provider;\n private signer?: Signer;\n\n public readonly contract: { [N in ContractName]: ethers.Contract } = {} as any;\n public readonly iface: { [N in ContractName]: ethers.utils.Interface } = {} as any;\n\n constructor(opts: ContractOptions) {\n this.provider = opts.provider;\n this.signer = opts.signer;\n\n (Object.keys(CONTRACTS) as ContractName[]).forEach((name) => {\n const { address, abi } = CONTRACTS[name];\n this.iface[name] = new ethers.utils.Interface(abi);\n this.contract[name] = new ethers.Contract(\n address,\n abi,\n this.signer ?? this.provider\n );\n });\n }\n\n /** Get raw address for a contract */\n public getAddress(name: ContractName): string {\n return CONTRACTS[name].address;\n }\n\n /** Utility: get a read-only handle even if signer is present */\n public getReadOnly(name: ContractName): Contract {\n const { address, abi } = CONTRACTS[name];\n return new Contract(address, abi, this.provider);\n }\n\n /** Utility: get a write-enabled handle (throws if no signer) */\n public getWrite(name: ContractName): Contract {\n if (!this.signer) throw new Error('No signer available for write calls');\n const { address, abi } = CONTRACTS[name];\n return new Contract(address, abi, this.signer);\n }\n\n /** Expose network info */\n async getNetwork() {\n return this.provider?.getNetwork();\n }\n\n /** List all known contract names */\n public listContractNames(): ContractName[] {\n return Object.keys(CONTRACTS) as ContractName[];\n }\n\n /** Get Interface instance for a contract */\n public getInterface(name: ContractName): ethers.utils.Interface {\n const iface = this.iface[name];\n if (!iface) throw new Error(`Interface not initialized for ${name}`);\n return iface;\n }\n\n /** Get live Contract instance */\n public getContract(name: ContractName): ethers.Contract {\n const ctr = this.contract[name];\n if (!ctr) throw new Error(`Contract not initialized for ${name}`);\n return ctr;\n }\n\n /** A unified Interface containing all ABIs to parse custom errors or events. */\n public get omniInterface(): ethers.utils.Interface {\n const all: any[] = [];\n\n const allArtifacts = [\n ERC20Artifact,\n ERC721Artifact,\n ERC1155Artifact,\n\n // // liqETH suite\n // AccountingArtifact,\n // DepositManagerArtifact,\n // LiqEthArtifact,\n // // LiqEthBurnArtifact,\n // // LiqEthMintArtifact,\n // // RewardsERC20Artifact,\n // StakingModuleArtifact,\n // // ValidatorBalanceArtifact,\n // WithdrawalQueueArtifact,\n // WithdrawalVaultArtifact,\n // YieldArtifact,\n ];\n\n allArtifacts.forEach(artifact => {\n if (artifact && artifact.abi) {\n all.push(...artifact.abi);\n }\n });\n\n const seen = new Set<string>();\n const dedup: any[] = [];\n for (const item of all) {\n try {\n const frag = ethers.utils.Fragment.from(item);\n const key = `${frag.type}:${frag.format(ethers.utils.FormatTypes.full)}`.toLowerCase();\n if (!seen.has(key)) {\n seen.add(key);\n dedup.push(item);\n }\n } catch {\n // ignore bad fragments\n }\n }\n\n return new ethers.utils.Interface(dedup);\n }\n\n /** Decode a revert or custom error payload */\n public parseError(revertData: string): ErrorDescription {\n try {\n return this.omniInterface.parseError(revertData);\n } catch {\n throw new Error(`Unable to parse error data: ${revertData}`);\n }\n }\n}","\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 { 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 \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\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\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 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\n\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, ExternalNetwork, PublicKey } from '@wireio/core';\nimport { ethers } from 'ethers';\n\nexport type StakerConfig = {\n network: ExternalNetwork;\n provider?: BaseSignerWalletAdapter | ethers.providers.Web3Provider;\n pubKey?: PublicKey;\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(options?: {\n chainID?: ChainID;\n windowBefore?: number;\n windowAfter?: number;\n }): 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 } 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 return this.fetchPreLaunchReceipts(address, ReceiptNFTKind.STAKE);\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.getOwnedTokenIdsFor(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 getOwnedTokenIdsFor(\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}","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 } 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 });\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 /**\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 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 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\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 { }\n\n // sharesToTokens(userShares, currentIndex) = userShares * currentIndex / indexScale\n let estimatedClaim = BigInt(0);\n let estimatedYield = BigInt(0);\n\n // started work on estimating the user's personal APY - not necessary at the moment\n // let estimatedAPY: number | null = null;\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 // estimatedAPY = null;\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\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(options?: {\n chainID?: ChainID;\n windowBefore?: number;\n windowAfter?: number;\n }): Promise<TrancheSnapshot> {\n const {\n chainID = EvmChainID.Hoodi,\n windowBefore,\n windowAfter,\n } = options ?? {};\n\n\n try {\n\n const blockNumber = await this.provider.getBlockNumber();\n const blockTag = { blockTag: blockNumber };\n\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\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\n ethPriceUsd,\n nativePriceTimestamp,\n ladderWindowBefore: windowBefore,\n ladderWindowAfter: windowAfter,\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.Devnet:\n case SolChainID.WireTestnet:\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(EvmChainID.Hoodi, 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 this.selectedChainID = chainID;\n return this.clients.has(chainID);\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 \"MockAggregator\",\n \"Pool\",\n \"OutpostManager\",\n \"sysio_write\",\n \"EthUsdPriceConsumer\",\n \"BAR\",\n \"OPPCommon\",\n \"OPP\",\n \"Pretoken\",\n \"OPPInbound\",\n \"Depositor\",\n\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}"],"names":["liqSolTokenIDL","validatorLeaderboardIDL","INDEX_SCALE","liqsolCoreJson","growSupplyOnce","shrinkSupplyOnce","SolPubKey","PublicKey","tokenId","PurchaseAsset","ReceiptNFTKind"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
1
+ {"version":3,"file":"stake.browser.js","sources":["../src/networks/solana/constants.ts","../src/networks/solana/program.ts","../src/networks/solana/clients/deposit.client.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/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":["// src/networks/solana/constants.ts\nimport { PublicKey, StakeProgram } from '@solana/web3.js';\n\nimport liqsolCoreIDL from '../../assets/solana/idl/liqsol_core.json';\nimport liqSolTokenIDL from '../../assets/solana/idl/liqsol_token.json';\nimport validatorLeaderboardIDL from '../../assets/solana/idl/validator_leaderboard.json';\nimport transferHookIDL from '../../assets/solana/idl/transfer_hook.json';\n\n/**\n * ---------------------------------------------------------------------------\n * PROGRAM IDS\n * ---------------------------------------------------------------------------\n *\n * These should match:\n * - `metadata.address` in your Anchor IDLs under src/assets/solana/idl/*.json\n * - The program IDs printed by your deploy scripts\n */\nexport const PROGRAM_IDS = {\n LIQSOL_CORE: new PublicKey(liqsolCoreIDL.address),\n LIQSOL_TOKEN: new PublicKey(liqSolTokenIDL.address),\n VALIDATOR_LEADERBOARD: new PublicKey(validatorLeaderboardIDL.address),\n TRANSFER_HOOK: new PublicKey(transferHookIDL.address),\n} as const;\n\nexport const {\n LIQSOL_CORE,\n LIQSOL_TOKEN,\n VALIDATOR_LEADERBOARD,\n TRANSFER_HOOK,\n} = PROGRAM_IDS;\n\n/**\n * ---------------------------------------------------------------------------\n * PDA SEEDS (must match on-chain programs)\n * ---------------------------------------------------------------------------\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 // NOTE: in the current IDL, userRecord is keyed by the USER (wallet), not ATA\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// Global Config PDA\nexport const deriveGlobalConfigPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.GLOBAL_CONFIG)],\n LIQSOL_CORE,\n )[0];\n\n\n/**\n * ---------------------------------------------------------------------------\n * CORE / DISTRIBUTION / DEPOSIT PDAS\n * ---------------------------------------------------------------------------\n */\n\nexport const deriveLiqsolMintPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQSOL_MINT)],\n LIQSOL_TOKEN,\n )[0];\n\nexport const deriveLiqsolMintAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQSOL_MINT_AUTHORITY)],\n LIQSOL_TOKEN,\n )[0];\n\nexport const deriveDepositAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.DEPOSIT_AUTHORITY)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveVaultPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VAULT)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveReservePoolPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.RESERVE_POOL)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveStakeControllerStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.STAKE_CONTROLLER_STATE)],\n LIQSOL_CORE,\n )[0];\n\nexport const derivePayoutStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.PAYOUT_STATE)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveBucketAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.BUCKET_AUTHORITY)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveDistributionStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.DISTRIBUTION_STATE)],\n LIQSOL_CORE,\n )[0];\n\n/**\n * user_record PDA\n *\n * In the current liqsol_core IDL, this is keyed by USER (wallet),\n * not by token account.\n */\nexport const deriveUserRecordPda = (user: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.USER_RECORD), user.toBuffer()],\n LIQSOL_CORE,\n )[0];\n\nexport const derivePayRateHistoryPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.PAY_RATE_HISTORY)],\n LIQSOL_CORE,\n )[0];\n\n/**\n * ---------------------------------------------------------------------------\n * WITHDRAW MODULE / RECEIPTS\n * ---------------------------------------------------------------------------\n */\n\nexport const deriveWithdrawGlobalPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.WITHDRAW_GLOBAL)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveStakeAllocationStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.STAKE_ALLOCATION_STATE)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveStakeMetricsPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.STAKE_METRICS)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveMaintenanceLedgerPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.MAINTENANCE_LEDGER)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveWithdrawMintAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.WITHDRAW_MINT_AUTHORITY)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveWithdrawMintMetadataPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.MINT_METADATA)],\n LIQSOL_CORE,\n )[0];\n\n/**\n * NFT mint for withdrawal receipt, derived from nextReceiptId.\n */\nexport const deriveWithdrawNftMintPda = (receiptId: bigint | number) => {\n const receiptIdBytes = Buffer.alloc(8);\n // receiptId comes in as BN or bigint upstream → normalize\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 LIQSOL_CORE,\n )[0];\n};\n\nexport const deriveLiqReceiptDataPda = (nftMint: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQ_RECEIPT_DATA), nftMint.toBuffer()],\n LIQSOL_CORE,\n )[0];\n\n/**\n * ---------------------------------------------------------------------------\n * VALIDATOR LEADERBOARD\n * ---------------------------------------------------------------------------\n */\n\nexport const deriveLeaderboardStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LEADERBOARD_STATE)],\n VALIDATOR_LEADERBOARD,\n )[0];\n\nexport const deriveValidatorRecordPda = (voteAccount: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VALIDATOR_RECORD), voteAccount.toBuffer()],\n VALIDATOR_LEADERBOARD,\n )[0];\n\nexport const deriveStakeControllerVaultPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VAULT)],\n LIQSOL_CORE,\n )[0];\n\n/**\n * ---------------------------------------------------------------------------\n * OUTPOST / PRETOKENS\n * ---------------------------------------------------------------------------\n */\n\nexport const deriveOutpostGlobalStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.OUTPOST_GLOBAL_STATE)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveOutpostPoolAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQSOL_POOL)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveOutpostAccountPda = (user: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.OUTPOST_ACCOUNT), user.toBuffer()],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveUserPretokenRecordPda = (user: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.USER_PRETOKEN_RECORD), user.toBuffer()],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveTrancheStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.TRANCHE_STATE)],\n LIQSOL_CORE,\n )[0];\n\nexport const derivePriceHistoryPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.PRICE_HISTORY)],\n LIQSOL_CORE,\n )[0];\n\n/**\n * BAR (bonded actor roles)\n */\n\nexport const deriveBarConfigPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.BAR_STATE_SEED)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveBondLevelPda = (bondLevelId: number[]) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.BOND_LEVEL_SEED), Buffer.from(bondLevelId)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveBondedActorPda = (actor: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.BONDED_ACTOR_SEED), actor.toBuffer()],\n LIQSOL_CORE,\n )[0];\n\n/**\n * SPL Transfer-hook: extra-account-metas PDA for the liqSOL mint.\n */\nexport const deriveExtraAccountMetaListPda = (liqsolMint: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.EXTRA_ACCOUNT_METAS), liqsolMint.toBuffer()],\n PROGRAM_IDS.TRANSFER_HOOK,\n )[0];\n\n/**\n * Ephemeral stake account address used per-deposit.\n * On-chain convention: seed = `ephemeral_<u32>` under StakeProgram.programId.\n */\nexport const deriveEphemeralStakeAddress = async (\n user: PublicKey,\n seed: 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 */\n\n// Same scale factor used on-chain for pay-rate math\nexport const PAY_RATE_SCALE_FACTOR = BigInt(1_000_000_000_000); // 10^12\n\n// Default pay rate fallback used in tests & utils\nexport const DEFAULT_AVERAGE_PAY_RATE = BigInt(191_780_821);\n\n// How many history entries to average when computing expected fee\nexport const DEFAULT_PAY_RATE_LOOKBACK = 5;\n\n// Rent exemption for ephemeral stake account (lamports)\nexport const EPHEMERAL_RENT_EXEMPTION = 2_282_880;\n\n// For convenience: lamports <-> SOL helpers (no RPC dependency)\nexport const LAMPORTS_PER_SOL = 1_000_000_000;\n\nexport const 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 { AnchorProvider, Program } from '@coral-xyz/anchor';\n\nimport liqsolCoreJson from '../../assets/solana/idl/liqsol_core.json';\nimport liqsolTokenJson from '../../assets/solana/idl/liqsol_token.json';\nimport validatorLeaderboardJson from '../../assets/solana/idl/validator_leaderboard.json';\n\nimport type { LiqsolCore } from '../../assets/solana/types/liqsol_core';\nimport type { LiqsolToken } from '../../assets/solana/types/liqsol_token';\nimport type { ValidatorLeaderboard } from '../../assets/solana/types/validator_leaderboard';\n\nimport { PROGRAM_IDS } from './constants';\n\ntype Entry<IDL> = {\n idl: IDL & { address: string };\n address: string;\n};\n\nconst PROGRAMS = {\n liqsolCore: {\n idl: liqsolCoreJson,\n address: PROGRAM_IDS.LIQSOL_CORE.toBase58(),\n } as Entry<LiqsolCore>,\n liqsolToken: {\n idl: liqsolTokenJson,\n address: PROGRAM_IDS.LIQSOL_TOKEN.toBase58(),\n } as Entry<LiqsolToken>,\n validatorLeaderboard: {\n idl: validatorLeaderboardJson,\n address: PROGRAM_IDS.VALIDATOR_LEADERBOARD.toBase58(),\n } as Entry<ValidatorLeaderboard>,\n} as const;\n\nexport type SolanaProgramName = keyof typeof PROGRAMS;\n\nexport class SolanaProgramService {\n constructor(private provider: AnchorProvider) { }\n\n getProgram<K extends SolanaProgramName>(name: K): Program<(typeof PROGRAMS)[K]['idl']> {\n const { idl, address } = PROGRAMS[name];\n const idlWithAddr = { ...idl, address };\n return new Program(idlWithAddr, this.provider) as Program<(typeof PROGRAMS)[K]['idl']>;\n }\n\n listProgramNames(): SolanaProgramName[] {\n return Object.keys(PROGRAMS) as SolanaProgramName[];\n }\n}","import { AnchorProvider, BN, Program } from '@coral-xyz/anchor';\nimport {\n SystemProgram,\n Transaction,\n TransactionInstruction,\n StakeProgram,\n SYSVAR_INSTRUCTIONS_PUBKEY,\n SYSVAR_CLOCK_PUBKEY,\n SYSVAR_RENT_PUBKEY,\n SYSVAR_STAKE_HISTORY_PUBKEY,\n} from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddressSync,\n} from '@solana/spl-token';\n\nimport { SolanaProgramService } from '../program';\nimport type { LiqsolCore } from '../../../assets/solana/types/liqsol_core';\n\nimport {\n PROGRAM_IDS,\n deriveDepositAuthorityPda,\n deriveLiqsolMintPda,\n deriveLiqsolMintAuthorityPda,\n deriveReservePoolPda,\n deriveVaultPda,\n deriveStakeControllerStatePda,\n derivePayoutStatePda,\n deriveBucketAuthorityPda,\n derivePayRateHistoryPda,\n deriveDistributionStatePda,\n deriveUserRecordPda,\n deriveEphemeralStakeAddress,\n deriveWithdrawGlobalPda,\n deriveStakeAllocationStatePda,\n deriveStakeMetricsPda,\n deriveMaintenanceLedgerPda,\n deriveWithdrawMintAuthorityPda,\n deriveWithdrawMintMetadataPda,\n deriveWithdrawNftMintPda,\n deriveLiqReceiptDataPda,\n deriveGlobalConfigPda,\n} from '../constants';\nimport { GlobalAccount, WalletLike } from '../types';\n\nexport class DepositClient {\n private program: Program<LiqsolCore>;\n\n get wallet(): WalletLike {\n return this.provider.wallet;\n }\n\n constructor(private provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.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<Transaction> {\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 = deriveDepositAuthorityPda();\n const liqsolMint = deriveLiqsolMintPda();\n const liqsolMintAuthority = deriveLiqsolMintAuthorityPda();\n const reservePool = deriveReservePoolPda();\n const vault = deriveVaultPda();\n const controllerState = deriveStakeControllerStatePda();\n const payoutState = derivePayoutStatePda();\n const bucketAuthority = deriveBucketAuthorityPda();\n const payRateHistory = derivePayRateHistoryPda();\n const globalConfig = deriveGlobalConfigPda();\n\n // -------------------------------------------------------------\n // Token-2022 ATAs\n // -------------------------------------------------------------\n const userAta = getAssociatedTokenAddressSync(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n // -------------------------------------------------------------\n // Distribution state + user_record (KEYED BY TOKEN ACCOUNT)\n // -------------------------------------------------------------\n const distributionState = deriveDistributionStatePda();\n const userRecord = 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 deriveEphemeralStakeAddress(user, seed);\n\n // -------------------------------------------------------------\n // BUILD IX (MUST MATCH IDL)\n // -------------------------------------------------------------\n const ix: TransactionInstruction = 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: 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 return new Transaction().add(ix);\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<Transaction> {\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 = deriveLiqsolMintPda();\n\n const userAta = getAssociatedTokenAddressSync(\n liqsolMint,\n user,\n false,\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 = deriveUserRecordPda(userAta);\n const distributionState = deriveDistributionStatePda();\n\n // Reserve + stake controller PDAs\n const global = deriveWithdrawGlobalPda(); // withdraw operator state\n const reservePool = deriveReservePoolPda();\n const stakeAllocationState = deriveStakeAllocationStatePda();\n const stakeMetrics = deriveStakeMetricsPda();\n const maintenanceLedger = deriveMaintenanceLedgerPda();\n const globalConfig = 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 = deriveWithdrawMintAuthorityPda();\n const metadata = deriveWithdrawMintMetadataPda();\n\n const nftMint = deriveWithdrawNftMintPda(receiptId);\n const receiptData = deriveLiqReceiptDataPda(nftMint);\n\n const owner = user;\n const nftAta = getAssociatedTokenAddressSync(\n nftMint,\n owner,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n // Bucket token account (same bucket used by deposit/distribution)\n const bucketAuthority = 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 const ix: TransactionInstruction = 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 return new Transaction().add(ix);\n }\n}","import { Program, BN, AnchorProvider } from '@coral-xyz/anchor';\n\nimport {\n Connection,\n Keypair,\n PublicKey,\n SystemProgram,\n StakeProgram,\n} from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddress,\n} from '@solana/spl-token';\n\nimport {\n LIQSOL_CORE,\n LIQSOL_TOKEN,\n PAY_RATE_SCALE_FACTOR,\n DEFAULT_AVERAGE_PAY_RATE,\n EPHEMERAL_RENT_EXEMPTION,\n LAMPORTS_PER_SOL,\n lamportsToSol,\n solToLamports,\n deriveDepositAuthorityPda,\n deriveLiqsolMintPda,\n deriveLiqsolMintAuthorityPda,\n deriveVaultPda,\n deriveReservePoolPda,\n deriveStakeControllerStatePda,\n derivePayoutStatePda,\n deriveBucketAuthorityPda,\n deriveDistributionStatePda,\n deriveUserRecordPda,\n derivePayRateHistoryPda,\n deriveStakeControllerVaultPda,\n deriveEphemeralStakeAddress,\n DEFAULT_PAY_RATE_LOOKBACK,\n deriveOutpostGlobalStatePda,\n deriveOutpostPoolAuthorityPda,\n deriveOutpostAccountPda,\n deriveTrancheStatePda,\n deriveUserPretokenRecordPda,\n CHAINLINK_FEED,\n CHAINLINK_PROGRAM,\n deriveExtraAccountMetaListPda,\n} from './constants';\n\nimport liqsolCoreIDL from '../../assets/solana/idl/liqsol_core.json';\nimport { LiqsolCore } from '../../assets/solana/types/liqsol_core';\nimport { GlobalState, TrancheState } from './types';\nimport { TrancheLadderItem, TrancheSnapshot } from '../../types';\nimport { ChainID } from '@wireio/core';\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// Read-only liqsol_core Program helper\n// -----------------------------------------------------------------------------\n\nlet _liqsolCoreProgram: Program<LiqsolCore> | null = null;\n\nexport function getLiqsolCoreProgram(\n connection: Connection,\n): Program<LiqsolCore> {\n if (_liqsolCoreProgram && _liqsolCoreProgram.provider.connection === connection) {\n return _liqsolCoreProgram;\n }\n\n // Dummy wallet – we're only doing read-only account fetches here.\n const tmpKeypair = Keypair.generate();\n const wallet: any = {\n publicKey: tmpKeypair.publicKey,\n signAllTransactions: async () => [],\n signTransaction: async () => tmpKeypair,\n };\n\n const provider = new AnchorProvider(connection, wallet, {\n commitment: 'confirmed',\n });\n\n const program = new Program(\n liqsolCoreIDL,\n provider,\n ) as Program<LiqsolCore>;\n\n _liqsolCoreProgram = program;\n return program;\n}\n\n\n// -----------------------------------------------------------------------------\n// Balance + state getters (UI-friendly)\n// -----------------------------------------------------------------------------\n\nexport async function getUserLiqSolBalance(\n connection: Connection,\n user: PublicKey,\n): Promise<number> {\n const liqsolMint = deriveLiqsolMintPda();\n const ata = await getAssociatedTokenAddress(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n try {\n const bal = await connection.getTokenAccountBalance(ata);\n return Number(bal.value.amount); // raw lamports, not decimals-adjusted\n } catch {\n return 0;\n }\n}\n\nexport async function getBucketLiqSolBalance(\n connection: Connection,\n): Promise<number> {\n const liqsolMint = deriveLiqsolMintPda();\n const bucketAuthority = deriveBucketAuthorityPda();\n const ata = await getAssociatedTokenAddress(\n liqsolMint,\n bucketAuthority,\n true,\n TOKEN_2022_PROGRAM_ID,\n );\n\n try {\n const bal = await connection.getTokenAccountBalance(ata);\n return Number(bal.value.amount);\n } catch {\n return 0;\n }\n}\n\nexport async function getReservePoolBalance(\n connection: Connection,\n): Promise<number> {\n const reservePool = deriveReservePoolPda();\n try {\n const lamports = await connection.getBalance(reservePool);\n return lamports;\n } catch {\n return 0;\n }\n}\n\n/**\n * Raw account info for the stake_controller state (Anchor decode is left\n * to the caller so the SDK can stay IDL-agnostic at this layer).\n */\nexport async function getStakeControllerStateRaw(\n connection: Connection,\n): Promise<Uint8Array | null> {\n const pda = deriveStakeControllerStatePda();\n const info = await connection.getAccountInfo(pda);\n return info?.data ?? null;\n}\n\n/**\n * Raw account info for the payout-state account.\n */\nexport async function getPayoutStateRaw(\n connection: Connection,\n): Promise<Uint8Array | null> {\n const pda = derivePayoutStatePda();\n const info = await connection.getAccountInfo(pda);\n return info?.data ?? null;\n}\n\n/**\n * Raw account info for a user's distribution user_record.\n *\n * NOTE: user_record is keyed by the TOKEN ACCOUNT (ATA), not the wallet.\n * Here we derive the user's liqSOL ATA and then its user_record PDA.\n */\nexport async function getUserRecordRaw(\n connection: Connection,\n user: PublicKey,\n): Promise<Uint8Array | null> {\n const liqsolMint = deriveLiqsolMintPda();\n const userAta = await getAssociatedTokenAddress(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n const pda = deriveUserRecordPda(userAta);\n const info = await connection.getAccountInfo(pda);\n return info?.data ?? null;\n}\n\n\n// -----------------------------------------------------------------------------\n// Pay-rate & fee utilities (on-chain compatible)\n// -----------------------------------------------------------------------------\n\nexport async function getAveragePayRate(\n connection: Connection,\n lookback: number = DEFAULT_PAY_RATE_LOOKBACK,\n): Promise<bigint> {\n const program = getLiqsolCoreProgram(connection);\n const payRateHistoryPda = derivePayRateHistoryPda();\n\n try {\n const anyProgram = program;\n const payRateHistoryAccount = await anyProgram.account.payRateHistory.fetch(\n payRateHistoryPda,\n );\n\n const entries = payRateHistoryAccount.entries ?? [];\n const totalEntriesAdded = Number(\n payRateHistoryAccount.totalEntriesAdded ?? 0,\n );\n const currentIndex: number = payRateHistoryAccount.currentIndex ?? 0;\n const maxEntries: number =\n payRateHistoryAccount.maxEntries ?? entries.length;\n\n if (!entries.length) {\n return DEFAULT_AVERAGE_PAY_RATE;\n }\n\n const entriesToFetch = Math.min(lookback, maxEntries, entries.length);\n\n let idx: number;\n if (totalEntriesAdded === 0) {\n idx = 0;\n } else if (currentIndex === 0) {\n idx = maxEntries - 1;\n } else {\n idx = currentIndex - 1;\n }\n\n let sum = BigInt(0);\n let validCount = BigInt(0);\n\n for (let i = 0; i < entriesToFetch; i++) {\n const entry = entries[idx];\n if (entry && typeof entry.scaledRate !== 'undefined') {\n const rate = BigInt(entry.scaledRate.toString());\n if (rate > BigInt(0)) {\n sum += rate;\n validCount += BigInt(1);\n }\n }\n\n if (totalEntriesAdded === 0) {\n idx = (idx + 1) % maxEntries;\n } else {\n idx = idx === 0 ? maxEntries - 1 : idx - 1;\n }\n }\n\n if (validCount === BigInt(0)) {\n return DEFAULT_AVERAGE_PAY_RATE;\n }\n\n return sum / validCount;\n } catch (err) {\n // Fallback to default when history missing/unavailable\n return DEFAULT_AVERAGE_PAY_RATE;\n }\n}\n\n/**\n * On-chain fee formula:\n * fee = (average_pay_rate * 4 * deposit_amount_lamports) / 10^12\n */\nexport function calculateExpectedFee(\n depositAmountLamports: BN,\n averagePayRate: BN,\n): BN {\n return averagePayRate\n .mul(new BN(4))\n .mul(depositAmountLamports)\n .div(new BN(1_000_000_000_000)); // 10^12\n}\n\n/**\n * Convenience helper to preview how a deposit splits between user + bucket\n * and how much goes into the reserve, assuming the simple model:\n *\n * - userLiqSol = amount - fee + EPHEMERAL_RENT_EXEMPTION\n * - bucketLiqSol = fee\n * - reserveLamports = amount + EPHEMERAL_RENT_EXEMPTION\n */\nexport function previewDepositEffects(params: {\n depositAmountLamports: BN;\n averagePayRate: BN;\n rentExemptionLamports?: number;\n}): {\n feeLamports: BN;\n userLiqSolLamports: BN;\n bucketLiqSolLamports: BN;\n reserveIncreaseLamports: BN;\n} {\n const { depositAmountLamports, averagePayRate } = params;\n const rent = new BN(\n params.rentExemptionLamports ?? EPHEMERAL_RENT_EXEMPTION,\n );\n\n const fee = calculateExpectedFee(depositAmountLamports, averagePayRate);\n const userLiqSol = depositAmountLamports.sub(fee).add(rent);\n const bucketLiqSol = fee;\n const reserveIncrease = depositAmountLamports.add(rent);\n\n return {\n feeLamports: fee,\n userLiqSolLamports: userLiqSol,\n bucketLiqSolLamports: bucketLiqSol,\n reserveIncreaseLamports: reserveIncrease,\n };\n}\n\n/**\n * ---------------------------------------------------------------------------\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): Promise<OutpostAccounts> {\n const globalState = deriveOutpostGlobalStatePda();\n const poolAuthority = deriveOutpostPoolAuthorityPda();\n const liqsolMint = deriveLiqsolMintPda();\n const distributionState = deriveDistributionStatePda();\n const bucketAuthority = deriveBucketAuthorityPda();\n const trancheState = deriveTrancheStatePda();\n\n // Outpost / pretoken PDAs\n const outpostAccount = deriveOutpostAccountPda(user);\n const userPretokenRecord = 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 false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n // user_record PDAs keyed by TOKEN ACCOUNTS (matches capital-staking)\n const bucketUserRecord = deriveUserRecordPda(bucketTokenAccount);\n const liqsolPoolUserRecord = deriveUserRecordPda(liqsolPoolAta);\n const userUserRecord = deriveUserRecordPda(userAta);\n\n const extraAccountMetaList = deriveExtraAccountMetaListPda(liqsolMint);\n\n // Chainlink program feeds\n let chainLinkFeed = CHAINLINK_FEED;\n let chainLinkProgram = CHAINLINK_PROGRAM;\n\n try {\n const program = getLiqsolCoreProgram(connection);\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 { SolanaProgramService } from '../program';\nimport type { LiqsolCore } from '../../../assets/solana/types/liqsol_core';\nimport {\n deriveDistributionStatePda,\n deriveGlobalConfigPda,\n deriveLiqsolMintPda,\n derivePayRateHistoryPda,\n deriveUserRecordPda,\n} from '../constants';\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<LiqsolCore>;\n\n constructor(private provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('liqsolCore');\n }\n\n get connection() {\n return this.provider.connection;\n }\n\n /**\n * Fetch the global distribution state account.\n *\n * IDL account name: \"distributionState\"\n */\n async getDistributionState(): Promise<DistributionState | null> {\n const pda = 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 = 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 = 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 = 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 false,\n TOKEN_2022_PROGRAM_ID,\n );\n const pdaFromWallet = 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 = 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 } from '../program';\nimport type { ValidatorLeaderboard } from '../../../assets/solana/types/validator_leaderboard';\nimport {\n deriveLeaderboardStatePda,\n deriveValidatorRecordPda,\n} from '../constants';\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<ValidatorLeaderboard>;\n\n constructor(private provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('validatorLeaderboard');\n }\n\n async getState(): Promise<LeaderboardState | null> {\n const pda = deriveLeaderboardStatePda();\n try {\n // Assumes account name \"leaderboardState\"\n return await this.program.account.leaderboardState.fetch(pda);\n } catch {\n return null;\n }\n }\n\n async getValidatorRecord(voteAccount: PublicKey): Promise<ValidatorRecord | null> {\n const pda = deriveValidatorRecordPda(voteAccount);\n try {\n // Assumes account name \"validatorRecord\"\n return await this.program.account.validatorRecord.fetchNullable(pda);\n } catch {\n return null;\n }\n }\n\n /**\n * Convenience helper to fetch and 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 = 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 liqsolCoreIDL from '../../../assets/solana/idl/liqsol_core.json';\nimport { LiqsolCore } from '../../../assets/solana/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, PROGRAM_IDS } from '../constants';\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<LiqsolCore>;\n\n constructor(\n private readonly provider: AnchorProvider,\n ) {\n this.program = new Program(liqsolCoreIDL as any, provider);\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 * Expose the raw Program in case callers need to build custom\n * instructions outside this client.\n */\n get liqsolCoreProgram(): Program<LiqsolCore> {\n return this.program;\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);\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,\n ): Promise<TransactionInstruction> {\n const userPk = user ?? this.wallet.publicKey;\n if (!userPk) {\n throw new Error('OutpostClient.buildStakeIx: wallet not connected');\n }\n\n const a = await this.buildAccounts(userPk);\n\n return this.program.methods\n .synd(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.userUserRecord,\n receiverUserRecord: a.liqsolPoolUserRecord,\n extraAccountMetaList: a.extraAccountMetaList,\n liqsolCoreProgram: PROGRAM_IDS.LIQSOL_CORE,\n transferHookProgram: 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: PROGRAM_IDS.LIQSOL_CORE,\n transferHookProgram: PROGRAM_IDS.TRANSFER_HOOK,\n liqsolPoolAta: a.liqsolPoolAta,\n outpostAccount: a.outpostAccount,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\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(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 { SolanaProgramService } from '../program';\nimport type { LiqsolCore } from '../../../assets/solana/types/liqsol_core';\n\nimport {\n GlobalState,\n PriceHistory,\n TrancheState,\n WalletLike,\n OutpostAccount,\n UserPretokenRecord,\n} from '../types';\n\nimport {\n derivePriceHistoryPda,\n CHAINLINK_FEED,\n CHAINLINK_PROGRAM,\n PROGRAM_IDS,\n deriveExtraAccountMetaListPda,\n} from '../constants';\n\n\nexport class TokenClient {\n private readonly program: Program<LiqsolCore>;\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(private readonly provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('liqsolCore');\n }\n\n // ---------------------------------------------------------------------------\n // Account helpers\n // ---------------------------------------------------------------------------\n\n async getAccounts(user: PublicKey): Promise<OutpostAccounts> {\n return buildOutpostAccounts(this.provider.connection, user);\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 const a = await this.getAccounts(user);\n\n const extraAccountMetaList = deriveExtraAccountMetaListPda(a.liqsolMint);\n const liqsolCoreProgram = PROGRAM_IDS.LIQSOL_CORE;\n const transferHookProgram = 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 = 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}","import {\n Commitment,\n ComputeBudgetProgram,\n Connection,\n ConnectionConfig,\n PerfSample,\n PublicKey as SolPubKey,\n SystemProgram,\n Transaction,\n TransactionSignature,\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 getAssociatedTokenAddressSync,\n TOKEN_2022_PROGRAM_ID,\n} from '@solana/spl-token';\n\nimport {\n ChainID,\n ExternalNetwork,\n KeyType,\n PublicKey,\n SolChainID,\n} from '@wireio/core';\n\nimport {\n IStakingClient,\n Portfolio,\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 deriveLiqsolMintPda,\n deriveReservePoolPda,\n deriveStakeMetricsPda,\n deriveVaultPda,\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';\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 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 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.depositClient = new DepositClient(this.anchor);\n this.distributionClient = new DistributionClient(this.anchor);\n this.leaderboardClient = new LeaderboardClient(this.anchor);\n this.outpostClient = new OutpostClient(this.anchor);\n this.tokenClient = new TokenClient(this.anchor);\n this.program = new SolanaProgramService(this.anchor);\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\n try {\n const tx = await this.depositClient.buildDepositTx(amountLamports);\n const { tx: prepared, blockhash, lastValidBlockHeight } =\n await this.prepareTx(tx);\n const signed = await this.signTransaction(prepared);\n return await this.sendAndConfirmHttp(signed, {\n blockhash,\n lastValidBlockHeight,\n });\n } catch (err) {\n throw new Error(`Failed to deposit Solana: ${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\n try {\n const tx = await this.depositClient.buildWithdrawTx(amountLamports);\n const { tx: prepared, blockhash, lastValidBlockHeight } =\n await this.prepareTx(tx);\n const signed = await this.signTransaction(prepared);\n return await this.sendAndConfirmHttp(signed, {\n blockhash,\n lastValidBlockHeight,\n });\n } catch (err) {\n throw new Error(`Failed to withdraw Solana: ${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\n if (!amountLamports || amountLamports <= BigInt(0)) {\n throw new Error('Stake amount must be greater than zero.');\n }\n\n try {\n const user = this.solPubKey;\n\n // Build compute budget increase instruction\n const cuIx = ComputeBudgetProgram.setComputeUnitLimit({ units: 400_000 });\n\n // Build the Outpost synd instruction\n const ix = await this.outpostClient.buildStakeIx(amountLamports, user);\n\n // Wrap in a transaction and send\n const tx = new Transaction().add(cuIx, ix);\n const prepared = await this.prepareTx(tx);\n const signed = await this.signTransaction(prepared.tx);\n\n return this.sendAndConfirmHttp(signed, prepared);\n } catch (err) {\n throw new Error(`Failed to stake Solana: ${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\n if (!amountLamports || amountLamports <= BigInt(0)) {\n throw new Error('Unstake amount must be greater than zero.');\n }\n\n try {\n const user = this.solPubKey;\n\n // Build compute budget increase instruction\n const cuIx = ComputeBudgetProgram.setComputeUnitLimit({ units: 400_000 });\n\n // Build the Outpost desynd instruction\n const ix = await this.outpostClient.buildUnstakeIx(amountLamports, user);\n\n // Wrap in a transaction and send\n const tx = new Transaction().add(cuIx, ix);\n const prepared = await this.prepareTx(tx);\n const signed = await this.signTransaction(prepared.tx);\n\n return this.sendAndConfirmHttp(signed, prepared);\n }\n catch (err) {\n throw new Error(`Failed to unstake Solana: ${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\n try {\n const user = this.solPubKey;\n const cuIx = ComputeBudgetProgram.setComputeUnitLimit({ units: 400_000 });\n const ix = await this.tokenClient.buildPurchaseIx(amountLamports, user);\n const tx = new Transaction().add(cuIx, ix);\n const { tx: prepared, blockhash, lastValidBlockHeight } =\n await this.prepareTx(tx);\n const signed = await this.signTransaction(prepared);\n return await this.sendAndConfirmHttp(signed, {\n blockhash,\n lastValidBlockHeight,\n });\n }\n catch (err) {\n throw new Error(`Failed to buy liqSOL pretokens: ${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\n try {\n const user = this.solPubKey;\n\n const reservePoolPDA = deriveReservePoolPda();\n const vaultPDA = deriveVaultPda();\n const liqsolMint = deriveLiqsolMintPda();\n\n const userLiqsolAta = getAssociatedTokenAddressSync(\n liqsolMint,\n user,\n false,\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 throw new Error(`Failed to get Solana portfolio: ${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 // ---------------------------------------------------------------------\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(options?: {\n chainID?: ChainID;\n windowBefore?: number;\n windowAfter?: number;\n }): Promise<TrancheSnapshot> {\n try {\n const {\n chainID = SolChainID.WireTestnet,\n windowBefore,\n windowAfter,\n } = options ?? {};\n\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 ladderWindowBefore: windowBefore,\n ladderWindowAfter: windowAfter,\n });\n }\n catch (err) {\n throw new Error(`Failed to build Solana tranche snapshot: ${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 throw new Error(`Failed to compute Solana system APY: ${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 try {\n\n const liqSolCoreProgram = this.program.getProgram('liqsolCore');\n const stakeMetricsPda = deriveStakeMetricsPda();\n const stakeMetrics =\n await liqSolCoreProgram.account.stakeMetrics.fetch(stakeMetricsPda);\n\n // solSystemPayRate is stored on-chain with PAY_RATE_SCALE_FACTOR (1e12)\n const raw = BigInt(stakeMetrics.solSystemPayRate.toString());\n\n // Convert to JS number in **decimal per epoch** units\n const rateDecimal = Number(raw) / Number(PAY_RATE_SCALE_FACTOR);\n\n return rateDecimal;\n }\n catch (err) {\n throw new Error(`Failed to read stakeMetrics from program: ${err}`);\n }\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] = 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 const payer = this.solPubKey;\n\n // -------------------------------------------------------------\n // 1) Current wallet balance (prefer caller override)\n // -------------------------------------------------------------\n const balanceLamports: bigint =\n options?.balanceOverrideLamports ??\n BigInt(await this.connection.getBalance(payer, 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.solPubKey;\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 // Tx helpers\n // ---------------------------------------------------------------------\n\n /**\n * Send a signed transaction over HTTP RPC and wait for confirmation.\n * Throws if the transaction fails.\n */\n private async sendAndConfirmHttp(\n signed: SolanaTransaction,\n ctx: { blockhash: string; lastValidBlockHeight: number },\n ): Promise<string> {\n this.ensureUser();\n\n const signature = await this.connection.sendRawTransaction(\n signed.serialize(),\n {\n skipPreflight: false,\n preflightCommitment: commitment,\n maxRetries: 3,\n },\n );\n\n const conf = await this.connection.confirmTransaction(\n {\n signature,\n blockhash: ctx.blockhash,\n lastValidBlockHeight: ctx.lastValidBlockHeight,\n },\n commitment,\n );\n\n if (conf.value.err) {\n throw new Error(\n `Transaction failed: ${JSON.stringify(conf.value.err)}`,\n );\n }\n\n return signature;\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.solPubKey;\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 || !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 * @module EthereumContractService\n *\n * Provides a unified service for interacting with Ethereum smart contracts using ethers.js.\n */\n\n// LiqETH Artifacts\nimport AccountingArtifact from '../../assets/ethereum/ABI/liqEth/accounting.sol/Accounting.json';\nimport DepositManagerArtifact from '../../assets/ethereum/ABI/liqEth/DepositManager.sol/DepositManager.json';\nimport LiqEthArtifact from '../../assets/ethereum/ABI/liqEth/liqEth.sol/LiqEthToken.json';\nimport StakingModuleArtifact from '../../assets/ethereum/ABI/liqEth/stakingModule.sol/StakingModule.json';\nimport WithdrawalQueueArtifact from '../../assets/ethereum/ABI/liqEth/withdrawalQueue.sol/WithdrawalQueue.json';\nimport WithdrawalVaultArtifact from '../../assets/ethereum/ABI/liqEth/withdrawalVault.sol/WithdrawalVault.json';\nimport BeaconStateArtifact from '../../assets/ethereum/ABI/liqEth/BeaconState.sol/BeaconState.json';\nimport YieldOracleArtifact from '../../assets/ethereum/ABI/liqEth/Yield.sol/YieldOracle.json';\n\n// Outpost Artifacts\nimport DepositorArtifact from '../../assets/ethereum/ABI/outpost/Depositor.sol/Depositor.json';\nimport ReceiptNFTArtifact from '../../assets/ethereum/ABI/outpost/ReceiptNFT.sol/ReceiptNFT.json';\nimport OutpostManagerArtifact from '../../assets/ethereum/ABI/outpost/OutpostManager.sol/OutpostManager.json';\nimport BARArtifact from '../../assets/ethereum/ABI/outpost/BAR.sol/BAR.json';\nimport OPPArtifact from '../../assets/ethereum/ABI/outpost/OPP.sol/OPP.json';\nimport OPPCommonArtifact from '../../assets/ethereum/ABI/outpost/OPPCommon.sol/OPPCommon.json';\nimport OPPInboundArtifact from '../../assets/ethereum/ABI/outpost/OPPInbound.sol/OPPInbound.json';\nimport PretokenArtifact from '../../assets/ethereum/ABI/outpost/Pretoken.sol/Pretoken.json';\nimport AggregatorArtifact from '../../assets/ethereum/ABI/outpost/Aggregator.sol/Aggregator.json';\nimport EthUsdPriceConsumerArtifact from '../../assets/ethereum/ABI/outpost/EthUsdPriceConsumer.sol/EthUsdPriceConsumer.json';\nimport PoolArtifact from '../../assets/ethereum/ABI/outpost/Pool.sol/Pool.json';\nimport OutpostManagerAuthorityArtifact from '../../assets/ethereum/ABI/outpost/OutpostManagerAuthority.sol/OutpostManagerAuthority.json';\n\n// Common Artifacts\nimport IodataArtifact from '../../assets/ethereum/ABI/common/iodata.sol/iodata.json';\nimport Base58Artifact from '../../assets/ethereum/ABI/common/Base58.sol/Base58.json';\nimport sysio_merkleArtifact from '../../assets/ethereum/ABI/common/sysio_merkle.sol/sysio_merkle.json';\nimport sysio_writeArtifact from '../../assets/ethereum/ABI/common/sysio_write.sol/sysio_write.json';\n\n// ERC Token Artifacts\nimport ERC20Artifact from '../../assets/ethereum/ABI/token/ERC20Token.sol/ERC20Token.json';\nimport ERC721Artifact from '../../assets/ethereum/ABI/token/ERC721Token.sol/ERC721Token.json';\nimport ERC1155Artifact from '../../assets/ethereum/ABI/token/ERC1155Token.sol/ERC1155Token.json';\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';\n\nexport const ERC20Abi = ERC20Artifact.abi;\nexport const ERC721Abi = ERC721Artifact.abi;\nexport const ERC1155Abi = ERC1155Artifact.abi;\n\n// -----------------------------------------------------------------------------\n// Address book\n// -----------------------------------------------------------------------------\n\n// Make sure ContractName in ./types includes all of these keys.\nexport const ADDRESSES: AddressBook = {\n /**\n * MAINNET LATEST\n * 1/23/26\n */\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 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 /**\n * HOODI TESTNET LATEST\n * 1/23/26\n */\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 // //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 // MockAggregator: \"0xFCfc3ddd4CBd9Ad3b3af3A374B8bdA1b66eE6FFF\",\n};\n\nexport type Contracts<T extends string = ContractName> = Record<T, ContractConfig>;\n\nexport type ContractConfig = {\n address: string;\n abi: JsonFragment[];\n};\n\n// -----------------------------------------------------------------------------\n// Contract config\n// -----------------------------------------------------------------------------\n\nexport const CONTRACTS: Contracts<ContractName> = {\n // 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 interface ContractOptions {\n /** RPC endpoint or injected EIP-1193 provider */\n provider?: ethers.providers.Provider;\n /** Only required if you need to send txns */\n signer?: Signer;\n}\n\nexport class EthereumContractService {\n private provider?: providers.Provider;\n private signer?: Signer;\n\n public readonly contract: { [N in ContractName]: ethers.Contract } = {} as any;\n public readonly iface: { [N in ContractName]: ethers.utils.Interface } = {} as any;\n\n constructor(opts: ContractOptions) {\n this.provider = opts.provider;\n this.signer = opts.signer;\n\n (Object.keys(CONTRACTS) as ContractName[]).forEach((name) => {\n const { address, abi } = CONTRACTS[name];\n this.iface[name] = new ethers.utils.Interface(abi);\n this.contract[name] = new ethers.Contract(\n address,\n abi,\n this.signer ?? this.provider\n );\n });\n }\n\n /** Get raw address for a contract */\n public getAddress(name: ContractName): string {\n return CONTRACTS[name].address;\n }\n\n /** Utility: get a read-only handle even if signer is present */\n public getReadOnly(name: ContractName): Contract {\n const { address, abi } = CONTRACTS[name];\n return new Contract(address, abi, this.provider);\n }\n\n /** Utility: get a write-enabled handle (throws if no signer) */\n public getWrite(name: ContractName): Contract {\n if (!this.signer) throw new Error('No signer available for write calls');\n const { address, abi } = CONTRACTS[name];\n return new Contract(address, abi, this.signer);\n }\n\n /** Expose network info */\n async getNetwork() {\n return this.provider?.getNetwork();\n }\n\n /** List all known contract names */\n public listContractNames(): ContractName[] {\n return Object.keys(CONTRACTS) as ContractName[];\n }\n\n /** Get Interface instance for a contract */\n public getInterface(name: ContractName): ethers.utils.Interface {\n const iface = this.iface[name];\n if (!iface) throw new Error(`Interface not initialized for ${name}`);\n return iface;\n }\n\n /** Get live Contract instance */\n public getContract(name: ContractName): ethers.Contract {\n const ctr = this.contract[name];\n if (!ctr) throw new Error(`Contract not initialized for ${name}`);\n return ctr;\n }\n\n /** A unified Interface containing all ABIs to parse custom errors or events. */\n public get omniInterface(): ethers.utils.Interface {\n const all: any[] = [];\n\n const allArtifacts = [\n ERC20Artifact,\n ERC721Artifact,\n ERC1155Artifact,\n\n // // liqETH suite\n // AccountingArtifact,\n // DepositManagerArtifact,\n // LiqEthArtifact,\n // // LiqEthBurnArtifact,\n // // LiqEthMintArtifact,\n // // RewardsERC20Artifact,\n // StakingModuleArtifact,\n // // ValidatorBalanceArtifact,\n // WithdrawalQueueArtifact,\n // WithdrawalVaultArtifact,\n // YieldArtifact,\n ];\n\n allArtifacts.forEach(artifact => {\n if (artifact && artifact.abi) {\n all.push(...artifact.abi);\n }\n });\n\n const seen = new Set<string>();\n const dedup: any[] = [];\n for (const item of all) {\n try {\n const frag = ethers.utils.Fragment.from(item);\n const key = `${frag.type}:${frag.format(ethers.utils.FormatTypes.full)}`.toLowerCase();\n if (!seen.has(key)) {\n seen.add(key);\n dedup.push(item);\n }\n } catch {\n // ignore bad fragments\n }\n }\n\n return new ethers.utils.Interface(dedup);\n }\n\n /** Decode a revert or custom error payload */\n public parseError(revertData: string): ErrorDescription {\n try {\n return this.omniInterface.parseError(revertData);\n } catch {\n throw new Error(`Unable to parse error data: ${revertData}`);\n }\n }\n}","\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 { 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 \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\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\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 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\n\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, ExternalNetwork, PublicKey } from '@wireio/core';\nimport { ethers } from 'ethers';\n\nexport type StakerConfig = {\n network: ExternalNetwork;\n provider?: BaseSignerWalletAdapter | ethers.providers.Web3Provider;\n pubKey?: PublicKey;\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(options?: {\n chainID?: ChainID;\n windowBefore?: number;\n windowAfter?: number;\n }): 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 } 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 return this.fetchPreLaunchReceipts(address, ReceiptNFTKind.STAKE);\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.getOwnedTokenIdsFor(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 getOwnedTokenIdsFor(\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}","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 } 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 });\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 /**\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 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 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\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 { }\n\n // sharesToTokens(userShares, currentIndex) = userShares * currentIndex / indexScale\n let estimatedClaim = BigInt(0);\n let estimatedYield = BigInt(0);\n\n // started work on estimating the user's personal APY - not necessary at the moment\n // let estimatedAPY: number | null = null;\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 // estimatedAPY = null;\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\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(options?: {\n chainID?: ChainID;\n windowBefore?: number;\n windowAfter?: number;\n }): Promise<TrancheSnapshot> {\n const {\n chainID = EvmChainID.Ethereum,\n windowBefore,\n windowAfter,\n } = options ?? {};\n\n\n try {\n\n const blockNumber = await this.provider.getBlockNumber();\n const blockTag = { blockTag: blockNumber };\n\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\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\n ethPriceUsd,\n // nativePriceTimestamp,\n ladderWindowBefore: windowBefore,\n ladderWindowAfter: windowAfter,\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 this.clients.set(cfg.network.chainId, new SolanaStakingClient(cfg));\n break;\n\n case EvmChainID.Ethereum:\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 this.selectedChainID = chainID;\n return this.clients.has(chainID);\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}"],"names":["liqSolTokenIDL","validatorLeaderboardIDL","INDEX_SCALE","liqsolCoreJson","growSupplyOnce","shrinkSupplyOnce","SolPubKey","PublicKey","tokenId","PurchaseAsset","ReceiptNFTKind"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}