@wireio/stake 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/stake.browser.js +8 -8
- package/lib/stake.browser.js.map +1 -1
- package/lib/stake.js +8 -8
- package/lib/stake.js.map +1 -1
- package/lib/stake.m.js +8 -8
- package/lib/stake.m.js.map +1 -1
- package/package.json +1 -1
- package/src/networks/ethereum/contract.ts +9 -12
package/lib/stake.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stake.js","sources":["../src/networks/solana/constants.ts","../src/networks/solana/program.ts","../src/networks/solana/clients/deposit.client.ts","../src/networks/solana/clients/distribution.client.ts","../src/networks/solana/clients/leaderboard.client.ts","../src/networks/solana/utils.ts","../src/networks/solana/clients/outpost.client.ts","../src/networks/solana/solana.ts","../src/networks/ethereum/contract.ts","../src/networks/ethereum/clients/deposit.client.ts","../src/networks/ethereum/clients/stake.client.ts","../src/networks/ethereum/ethereum.ts","../src/staker/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\";\n\n/**\n * ---------------------------------------------------------------------------\n * PROGRAM IDS\n * ---------------------------------------------------------------------------\n *\n * These should match:\n * - `metadata.address` in your Anchor IDLs under src/assets/solana/idl/*.json\n * - The program IDs printed by your deploy scripts\n */\n// Extract program IDs from IDL files\nexport const PROGRAM_IDS = {\n LIQSOL_CORE: new PublicKey(liqsolCoreIDL.address),\n LIQSOL_TOKEN: new PublicKey(liqSolTokenIDL.address),\n VALIDATOR_LEADERBOARD: new PublicKey(validatorLeaderboardIDL.address),\n} as const;\n\n// Export individual program IDs for convenience\nexport const {\n LIQSOL_CORE,\n LIQSOL_TOKEN,\n VALIDATOR_LEADERBOARD,\n} = PROGRAM_IDS;\n\n/**\n * ---------------------------------------------------------------------------\n * PDA SEEDS (must match on-chain programs)\n * ---------------------------------------------------------------------------\n *\n * These strings are baked into the on-chain programs and are already used in\n * your test utils. We centralize them here so all clients share them.\n */\n\nexport const PDA_SEEDS = {\n // liqsol_core: deposit / stake controller\n DEPOSIT_AUTHORITY: 'deposit_authority',\n VAULT: 'vault',\n RESERVE_POOL: 'reserve_pool',\n STAKE_CONTROLLER_STATE: 'stake_controller',\n PAYOUT_STATE: 'payout_state',\n\n // liqsol_token: mint + bucket\n LIQSOL_MINT: 'liqsol_mint',\n LIQSOL_MINT_AUTHORITY: 'mint_authority',\n BUCKET_AUTHORITY: 'liqsol_bucket',\n\n // distribution program (embedded in liqsol_core)\n DISTRIBUTION_STATE: 'distribution_state',\n USER_RECORD: 'user_record',\n\n // pay-rate history\n PAY_RATE_HISTORY: 'pay_rate_history',\n\n // validator leaderboard (state + records)\n LEADERBOARD_STATE: 'leaderboard_state',\n VALIDATOR_RECORD: 'validator',\n GLOBAL_STAKE_INFO: 'global_stake_info',\n\n // Outpost\n WARRANT_DEPOSIT_GLOBAL: 'warrant_deposit_global',\n LIQSOL_POOL: 'liqsol_pool',\n WARRANT_DEPOSIT_RECORD: 'warrant_deposit_record',\n WIRE_SOL_BUCKET: 'wire_sol_bucket',\n TRANCHE_STATE: 'tranche_state',\n USER_WARRANT_RECORD: 'user_warrant_record',\n\n // BAR\n BAR_STATE_SEED: 'bar_state',\n BONDED_ACTOR_SEED: 'bonded_actor',\n BOND_LEVEL_SEED: 'bond_level',\n} as const;\n\n/**\n * Helpers for PDA derivation so clients don’t duplicate logic.\n */\nexport const deriveLiqsolMintPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQSOL_MINT)],\n PROGRAM_IDS.LIQSOL_TOKEN,\n )[0];\n\nexport const deriveLiqsolMintAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQSOL_MINT_AUTHORITY)],\n PROGRAM_IDS.LIQSOL_TOKEN,\n )[0];\n\nexport const deriveDepositAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.DEPOSIT_AUTHORITY)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveVaultPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VAULT)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveReservePoolPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.RESERVE_POOL)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveStakeControllerStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.STAKE_CONTROLLER_STATE)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const derivePayoutStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.PAYOUT_STATE)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveBucketAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.BUCKET_AUTHORITY)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveDistributionStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.DISTRIBUTION_STATE)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveUserRecordPda = (user: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.USER_RECORD), user.toBuffer()],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const derivePayRateHistoryPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.PAY_RATE_HISTORY)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveLeaderboardStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LEADERBOARD_STATE)],\n PROGRAM_IDS.VALIDATOR_LEADERBOARD,\n )[0];\n\nexport const deriveValidatorRecordPda = (voteAccount: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VALIDATOR_RECORD), voteAccount.toBuffer()],\n PROGRAM_IDS.VALIDATOR_LEADERBOARD,\n )[0];\n\nexport const deriveStakeControllerVaultPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VAULT)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\n/**\n * OUTPOST \n */\nexport const deriveOutpostGlobalStatePda = () => \n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.WARRANT_DEPOSIT_GLOBAL)],\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 deriveWireReceiptPda = (user: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.WARRANT_DEPOSIT_RECORD), user.toBuffer()],\n LIQSOL_CORE,\n )[0];\n\nexport const derivePoolUserRecordPda = (poolAuthority: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.USER_RECORD), poolAuthority.toBuffer()],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveUserUserRecordPda = (user: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.USER_RECORD), user.toBuffer()],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveSolBucketPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.WIRE_SOL_BUCKET)],\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 deriveUserWarrantRecordPda = (user: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.USER_WARRANT_RECORD), user.toBuffer()],\n LIQSOL_CORE,\n )[0];\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 * Ephemeral stake account address used per-deposit.\n * On-chain convention: seed = `ephemeral_<u32>` under StakeProgram.programId.\n */\nexport const deriveEphemeralStakeAddress = async (\n user: PublicKey,\n seed: any,\n): Promise<PublicKey> => {\n const seedStr = `ephemeral_${seed}`;\n return await PublicKey.createWithSeed(user, seedStr, StakeProgram.programId);\n};\n\n/**\n * Constant keys\n */\n\nexport const CHAINLINK_FEED = new PublicKey(\"99B2bTijsU6f1GCT73HmdR7HCFFjGMBcPZY6jZ96ynrR\");\nexport const CHAINLINK_PROGRAM = new PublicKey(\"HEvSKofvBgfaexv23kMabbYqxasxU3mQ4ibBMEmJWHny\");\n\n/**\n * ---------------------------------------------------------------------------\n * ECONOMICS & MATH CONSTANTS\n * ---------------------------------------------------------------------------\n */\n\n// Same scale factor used on-chain for pay-rate math\nexport const PAY_RATE_SCALE_FACTOR = BigInt(1_000_000_000_000); // 10^12\n\n// Default pay rate fallback used in tests & utils\nexport const DEFAULT_AVERAGE_PAY_RATE = BigInt(191_780_821);\n\n// How many history entries to average when computing expected fee\nexport const DEFAULT_PAY_RATE_LOOKBACK = 5;\n\n// Rent exemption for ephemeral stake account (lamports)\n// Mirrors EPHEMERAL_RENT_EXEMPTION = 2_282_880 used in tests\nexport const EPHEMERAL_RENT_EXEMPTION = 2_282_880;\n\n// For convenience: lamports <-> SOL helpers (no RPC dependency)\nexport const LAMPORTS_PER_SOL = 1_000_000_000;\n\nexport const lamportsToSol = (lamports: number | bigint): number =>\n Number(lamports) / LAMPORTS_PER_SOL;\n\nexport const solToLamports = (sol: number): bigint =>\n BigInt(Math.round(sol * LAMPORTS_PER_SOL));\n","import { AnchorProvider, Program } from '@coral-xyz/anchor';\n\nimport liqsolCoreJson from '../../assets/solana/idl/liqsol_core.json';\nimport liqsolTokenJson from '../../assets/solana/idl/liqsol_token.json';\nimport validatorLeaderboardJson from '../../assets/solana/idl/validator_leaderboard.json';\n\nimport type { LiqsolCore } from '../../assets/solana/types/liqsol_core';\nimport type { LiqsolToken } from '../../assets/solana/types/liqsol_token';\nimport type { ValidatorLeaderboard } from '../../assets/solana/types/validator_leaderboard';\n\nimport { PROGRAM_IDS } from './constants';\n\ntype Entry<IDL> = {\n idl: IDL & { address: string };\n address: string;\n};\n\nconst PROGRAMS = {\n liqsolCore: {\n idl: liqsolCoreJson,\n address: PROGRAM_IDS.LIQSOL_CORE.toBase58(),\n } as Entry<LiqsolCore>,\n liqsolToken: {\n idl: liqsolTokenJson,\n address: PROGRAM_IDS.LIQSOL_TOKEN.toBase58(),\n } as Entry<LiqsolToken>,\n validatorLeaderboard: {\n idl: validatorLeaderboardJson,\n address: PROGRAM_IDS.VALIDATOR_LEADERBOARD.toBase58(),\n } as Entry<ValidatorLeaderboard>,\n} as const;\n\nexport type SolanaProgramName = keyof typeof PROGRAMS;\n\nexport class SolanaProgramService {\n constructor(private provider: AnchorProvider) { }\n\n getProgram<K extends SolanaProgramName>(name: K): Program<(typeof PROGRAMS)[K]['idl']> {\n const { idl, address } = PROGRAMS[name];\n const idlWithAddr = { ...idl, address };\n return new Program(idlWithAddr, this.provider) as Program<(typeof PROGRAMS)[K]['idl']>;\n }\n\n listProgramNames(): SolanaProgramName[] {\n return Object.keys(PROGRAMS) as SolanaProgramName[];\n }\n}","import { AnchorProvider, BN, Program } from '@coral-xyz/anchor';\nimport {\n PublicKey,\n SystemProgram,\n Transaction,\n TransactionInstruction,\n StakeProgram,\n SYSVAR_INSTRUCTIONS_PUBKEY,\n SYSVAR_CLOCK_PUBKEY,\n SYSVAR_RENT_PUBKEY,\n SYSVAR_STAKE_HISTORY_PUBKEY,\n} from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddressSync,\n} from '@solana/spl-token';\n\nimport { SolanaProgramService } from '../program';\nimport type { LiqsolCore } from '../../../assets/solana/types/liqsol_core';\n\nimport {\n PROGRAM_IDS,\n deriveDepositAuthorityPda,\n deriveLiqsolMintPda,\n deriveLiqsolMintAuthorityPda,\n deriveReservePoolPda,\n deriveVaultPda,\n deriveStakeControllerStatePda,\n deriveBucketAuthorityPda,\n derivePayRateHistoryPda,\n deriveDistributionStatePda,\n deriveUserRecordPda,\n derivePayoutStatePda,\n deriveEphemeralStakeAddress,\n} from '../constants';\nimport { WalletLike } from '../types';\n\nexport class DepositClient {\n private program: Program<LiqsolCore>;\n\n get wallet(): WalletLike { return this.provider.wallet; }\n\n constructor(private provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('liqsolCore');\n }\n\n async buildDepositTx(amount: bigint, user = this.wallet.publicKey): Promise<Transaction> {\n // -------------------------------------------------------------\n // PDAs\n // -------------------------------------------------------------\n const depositAuthority = deriveDepositAuthorityPda();\n const liqsolMint = deriveLiqsolMintPda();\n const liqsolMintAuthority = deriveLiqsolMintAuthorityPda();\n const reservePool = deriveReservePoolPda();\n const vault = deriveVaultPda();\n const controllerState = deriveStakeControllerStatePda();\n const payoutState = derivePayoutStatePda();\n const bucketAuthority = deriveBucketAuthorityPda();\n const payRateHistory = derivePayRateHistoryPda();\n const distributionState = deriveDistributionStatePda();\n const userRecord = deriveUserRecordPda(user);\n\n // -------------------------------------------------------------\n // Token-2022 ATAs\n // -------------------------------------------------------------\n const userAta = getAssociatedTokenAddressSync(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID\n );\n\n const bucketTokenAccount = getAssociatedTokenAddressSync(\n liqsolMint,\n bucketAuthority,\n true,\n TOKEN_2022_PROGRAM_ID\n );\n\n // -------------------------------------------------------------\n // Ephemeral stake\n // -------------------------------------------------------------\n const seed = Math.floor(Math.random() * 2 ** 32);\n const ephemeralStake = await deriveEphemeralStakeAddress(user, seed);\n\n // -------------------------------------------------------------\n // BUILD IX (MUST MATCH IDL)\n // -------------------------------------------------------------\n const ix: TransactionInstruction = await 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\n liqsolMint,\n userAta,\n liqsolMintAuthority,\n reservePool,\n vault,\n ephemeralStake,\n\n controllerState,\n payoutState,\n bucketAuthority,\n bucketTokenAccount,\n\n userRecord,\n distributionState,\n payRateHistory,\n\n instructionsSysvar: SYSVAR_INSTRUCTIONS_PUBKEY,\n clock: SYSVAR_CLOCK_PUBKEY,\n stakeHistory: SYSVAR_STAKE_HISTORY_PUBKEY,\n rent: SYSVAR_RENT_PUBKEY,\n })\n .instruction();\n\n return new Transaction().add(ix);\n }\n}","import { AnchorProvider, Program } from '@coral-xyz/anchor';\nimport {\n ParsedAccountData,\n PublicKey,\n SYSVAR_INSTRUCTIONS_PUBKEY,\n Transaction,\n SystemProgram,\n} from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n getAssociatedTokenAddress,\n} from '@solana/spl-token';\n\nimport { SolanaProgramService } from '../program';\nimport type { LiqsolCore } from '../../../assets/solana/types/liqsol_core';\nimport {\n deriveBucketAuthorityPda,\n deriveDistributionStatePda,\n deriveLiqsolMintPda,\n derivePayRateHistoryPda,\n deriveUserRecordPda,\n} from '../constants';\nimport type { CorrectRegisterBuildResult, DistributionState, MismatchCandidate, ParsedAccountInfo, UserRecord } from '../types';\n\n/**\n * Distribution client – wraps the distribution portion of the liqsol_core\n * program. Responsible for:\n * - Reading DistributionState + UserRecord\n * - Computing mismatch candidates (tracked > actual)\n * - Building a \"correct then register\" transaction for the caller\n *\n * Aligned with the on-chain `update_user` script:\n * - Single `updateUser()` entrypoint that:\n * * Can create userRecord if missing\n * * Reconciles tracked vs actual using user, userAta, bucket, pay-rate\n */\nexport class DistributionClient {\n private program: Program<LiqsolCore>;\n\n constructor(private provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('liqsolCore');\n }\n\n get connection() { return this.provider.connection; }\n\n /**\n * Fetch the global distribution state account.\n */\n async getDistributionState(): Promise<DistributionState | null> {\n const pda = deriveDistributionStatePda();\n try {\n // IDL account name: \"distributionState\"\n return await this.program.account.distributionState.fetch(pda);\n } catch {\n return null;\n }\n }\n\n /**\n * Fetch a user's distribution userRecord (or null if missing).\n */\n async getUserRecord(user: PublicKey): Promise<UserRecord | null> {\n const pda = deriveUserRecordPda(user);\n try {\n return await this.program.account.userRecord.fetchNullable(pda);\n } catch {\n return null;\n }\n }\n\n /**\n * Helper: get actual liqSOL balances for all token holders.\n *\n * Returns a map: owner (base58) -> actual balance (BigInt)\n */\n private async getActualBalancesByOwner(): Promise<Map<string, bigint>> {\n const liqsolMint = deriveLiqsolMintPda();\n const mintStr = liqsolMint.toBase58();\n\n const accounts = await this.connection.getParsedProgramAccounts(\n TOKEN_2022_PROGRAM_ID,\n {\n filters: [\n // SPL token layout: mint at offset 0\n { memcmp: { offset: 0, bytes: mintStr } },\n ],\n commitment: 'confirmed',\n },\n );\n\n const byOwner = new Map<string, bigint>();\n\n for (const acct of accounts) {\n const data = acct.account.data as ParsedAccountData;\n const parsed = data.parsed;\n if (!parsed || parsed.type !== 'account') continue;\n\n const info: ParsedAccountInfo = parsed.info;\n const ownerStr = info.owner;\n const amountStr = info.tokenAmount.amount;\n const amount = BigInt(amountStr);\n\n const prev = byOwner.get(ownerStr) ?? BigInt(0);\n byOwner.set(ownerStr, prev + amount);\n }\n\n return byOwner;\n }\n\n /**\n * Helper: get tracked balances from all userRecord accounts,\n * keyed by *actual wallet owner*, not the userRecord PDA.\n *\n * userRecord struct:\n * - userAta: pubkey\n * - trackedBalance: u64\n * - claimBalance: u64\n * - lastClaimTimestamp: i64\n * - bump: u8\n */\n private async getTrackedBalances(): Promise<\n Map<string, { owner: PublicKey; tracked: bigint }>\n > {\n const records = await this.program.account.userRecord.all();\n const map = new Map<string, { owner: PublicKey; tracked: bigint }>();\n\n for (const r of records) {\n const ur = r.account as UserRecord;\n const userAta = ur.userAta as PublicKey;\n\n // Resolve the *wallet* that owns this ATA\n const ataInfo = await this.connection.getParsedAccountInfo(userAta);\n const parsedData = ataInfo.value?.data as ParsedAccountData | undefined;\n if (!parsedData) continue;\n\n const parsed = parsedData.parsed;\n if (!parsed || (parsed as any).type !== 'account') continue;\n\n const info: ParsedAccountInfo = parsed.info;\n const ownerStr = info.owner;\n const owner = new PublicKey(ownerStr);\n\n const tracked = BigInt(ur.trackedBalance.toString());\n map.set(ownerStr, { owner, tracked });\n }\n\n return map;\n }\n\n /**\n * Discover all mismatch candidates where tracked > actual.\n *\n * - actual balances are derived from token accounts for the liqSOL mint\n * - tracked balances come from Distribution.userRecord\n */\n private async deriveMismatchCandidates(): Promise<MismatchCandidate[]> {\n const [actualByOwner, trackedByOwner] = await Promise.all([\n this.getActualBalancesByOwner(),\n this.getTrackedBalances(),\n ]);\n\n const out: MismatchCandidate[] = [];\n\n for (const [ownerStr, { owner, tracked }] of trackedByOwner.entries()) {\n const actual = actualByOwner.get(ownerStr) ?? BigInt(0);\n const delta = tracked - actual;\n if (delta > BigInt(0)) {\n out.push({ owner, actual, tracked, delta });\n }\n }\n\n // Largest discrepancy first\n out.sort((a, b) => (b.delta > a.delta ? 1 : b.delta < a.delta ? -1 : 0));\n return out;\n }\n\n /**\n * Canonical helper to build an `updateUser` instruction for a given user,\n * matching the standalone update-user.ts script.\n */\n private async buildUpdateUserIx(targetUser: PublicKey) {\n const walletPk = this.provider.wallet.publicKey;\n\n const distributionStatePDA = deriveDistributionStatePda();\n const userRecordPDA = deriveUserRecordPda(targetUser);\n const liqsolMintPDA = deriveLiqsolMintPda();\n const payRateHistoryPDA = derivePayRateHistoryPda();\n const bucketAuthorityPDA = deriveBucketAuthorityPda();\n\n const userAta = await getAssociatedTokenAddress(\n liqsolMintPDA,\n targetUser,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n const bucketTokenAccount = await getAssociatedTokenAddress(\n liqsolMintPDA,\n bucketAuthorityPDA,\n true, // allowOwnerOffCurve\n TOKEN_2022_PROGRAM_ID,\n );\n\n return (this.program.methods as any)\n .updateUser()\n .accounts({\n user: targetUser,\n userAta,\n userRecord: userRecordPDA,\n authority: walletPk,\n payer: walletPk,\n distributionState: distributionStatePDA,\n liqsolMint: liqsolMintPDA,\n instructionsSysvar: SYSVAR_INSTRUCTIONS_PUBKEY,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n bucketAuthority: bucketAuthorityPDA,\n bucketTokenAccount,\n payRateHistory: payRateHistoryPDA,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n /**\n * Build the \"correct & register\" transaction.\n *\n * - Fetches DistributionState + all userRecords + token holders\n * - Computes caller's untracked amount (actual - tracked)\n * - If DistributionState.availableBalance already covers that, we only\n * send updateUser(caller).\n * - Otherwise we select top mismatch candidates until their freed deltas\n * cover the shortfall, then build updateUser(target) for each,\n * followed by updateUser(caller).\n *\n * NOTE:\n * - This no longer uses a separate updateSpecificUser; the single\n * updateUser entrypoint accepts any `user` as long as authority/payer\n * are valid, per your script.\n */\n async buildCorrectRegisterTx(opts: {\n amount?: bigint;\n maxCandidates?: number;\n } = {}): Promise<CorrectRegisterBuildResult> {\n const walletPk = this.provider.wallet.publicKey;\n const callerStr = walletPk.toBase58();\n\n const [distState, actualByOwner, trackedByOwner] = await Promise.all([\n this.getDistributionState(),\n this.getActualBalancesByOwner(),\n this.getTrackedBalances(),\n ]);\n\n if (!distState) {\n return {\n needToRegister: false,\n canSucceed: false,\n reason: 'DistributionState not initialized',\n transaction: undefined,\n plan: { deficit: BigInt(0), willFree: BigInt(0), selected: [] },\n };\n }\n\n const availableBalance = BigInt(distState.availableBalance.toString());\n\n const trackedEntry =\n trackedByOwner.get(callerStr) ?? {\n owner: walletPk,\n tracked: BigInt(0),\n };\n\n const actual = actualByOwner.get(callerStr) ?? BigInt(0);\n const tracked = trackedEntry.tracked;\n const untracked = actual - tracked;\n\n // Nothing to register\n if (untracked <= BigInt(0)) {\n return {\n needToRegister: false,\n canSucceed: true,\n reason: 'No untracked liqSOL to register',\n transaction: undefined,\n plan: { deficit: BigInt(0), willFree: BigInt(0), selected: [] },\n };\n }\n\n // Optional user-specified cap on how much to register.\n const targetRegister =\n opts.amount && opts.amount > BigInt(0) ? opts.amount : untracked;\n\n // Simple case: availableBalance already covers what we want to register\n if (availableBalance >= targetRegister) {\n const tx = new Transaction();\n const ix = await this.buildUpdateUserIx(walletPk); // caller only\n tx.add(ix);\n\n return {\n needToRegister: true,\n canSucceed: true,\n transaction: tx,\n plan: { deficit: BigInt(0), willFree: BigInt(0), selected: [] },\n };\n }\n\n // Need to free up more availableBalance by correcting others.\n const deficit = targetRegister - availableBalance;\n\n const allCandidates = await this.deriveMismatchCandidates();\n const maxCandidates = opts.maxCandidates ?? 10;\n\n const selected: MismatchCandidate[] = [];\n let willFree = BigInt(0);\n\n for (const c of allCandidates) {\n if (c.owner.equals(walletPk)) continue; // don't self-correct here\n selected.push(c);\n willFree += c.delta;\n if (willFree >= deficit || selected.length >= maxCandidates) break;\n }\n\n if (willFree < deficit) {\n return {\n needToRegister: true,\n canSucceed: false,\n reason: 'Not enough mismatched candidates to cover deficit',\n transaction: undefined,\n plan: { deficit, willFree, selected },\n };\n }\n\n const tx = new Transaction();\n\n // 1) Correct selected mismatched users.\n for (const c of selected) {\n const ix = await this.buildUpdateUserIx(c.owner);\n tx.add(ix);\n }\n\n // 2) Register caller (updateUser(caller)).\n {\n const ix = await this.buildUpdateUserIx(walletPk);\n tx.add(ix);\n }\n\n return {\n needToRegister: true,\n canSucceed: true,\n transaction: tx,\n plan: { deficit, willFree, selected },\n };\n }\n}","import { AnchorProvider, Program } from '@coral-xyz/anchor';\nimport { PublicKey } from '@solana/web3.js';\n\nimport { SolanaProgramService } from '../program';\nimport type { ValidatorLeaderboard } from '../../../assets/solana/types/validator_leaderboard';\nimport {\n deriveLeaderboardStatePda,\n deriveValidatorRecordPda,\n} from '../constants';\n\n/**\n * Simple read client for the validator_leaderboard program.\n *\n * Adjust account names/fields to match your IDL (state, validatorRecord, etc).\n */\nexport class LeaderboardClient {\n private program: Program<ValidatorLeaderboard>;\n\n constructor(private provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('validatorLeaderboard');\n }\n\n async getState(): Promise<any | null> {\n const pda = deriveLeaderboardStatePda();\n try {\n // Assumes account name \"leaderboardState\"\n return await this.program.account.leaderboardState.fetch(pda);\n } catch {\n return null;\n }\n }\n\n async getValidatorRecord(voteAccount: PublicKey): Promise<any | null> {\n const pda = deriveValidatorRecordPda(voteAccount);\n try {\n // Assumes account name \"validatorRecord\"\n return await this.program.account.validatorRecord.fetchNullable(pda);\n } catch {\n return null;\n }\n }\n\n /**\n * Convenience helper to fetch and sort top validators by score.\n * Assumes `validatorRecord` has a numeric `score` field in the IDL.\n */\n async getTopValidators(limit = 20): Promise<any[]> {\n const records = await (this.program.account as any).validatorRecord.all();\n const sorted = (records as Array<{ publicKey: PublicKey; account: any }>).sort(\n (a, b) => {\n const sa = BigInt(a.account.score?.toString?.() ?? '0');\n const sb = BigInt(b.account.score?.toString?.() ?? '0');\n return sb > sa ? 1 : sb < sa ? -1 : 0;\n },\n );\n return sorted.slice(0, limit);\n }\n}","// src/networks/solana/utils.ts\n\nimport { Program, BN, AnchorProvider } from '@coral-xyz/anchor';\n\nimport {\n Connection,\n Keypair,\n PublicKey,\n SystemProgram,\n StakeProgram,\n} from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddress,\n} from '@solana/spl-token';\n\nimport {\n LIQSOL_CORE,\n LIQSOL_TOKEN,\n PAY_RATE_SCALE_FACTOR,\n DEFAULT_AVERAGE_PAY_RATE,\n EPHEMERAL_RENT_EXEMPTION,\n LAMPORTS_PER_SOL,\n lamportsToSol,\n solToLamports,\n deriveDepositAuthorityPda,\n deriveLiqsolMintPda,\n deriveLiqsolMintAuthorityPda,\n deriveVaultPda,\n deriveReservePoolPda,\n deriveStakeControllerStatePda,\n derivePayoutStatePda,\n deriveBucketAuthorityPda,\n deriveDistributionStatePda,\n deriveUserRecordPda,\n derivePayRateHistoryPda,\n deriveStakeControllerVaultPda,\n deriveEphemeralStakeAddress,\n DEFAULT_PAY_RATE_LOOKBACK,\n deriveOutpostGlobalStatePda,\n deriveOutpostPoolAuthorityPda,\n deriveSolBucketPda,\n deriveTrancheStatePda,\n deriveWireReceiptPda,\n derivePoolUserRecordPda,\n deriveUserUserRecordPda,\n deriveUserWarrantRecordPda,\n CHAINLINK_FEED,\n CHAINLINK_PROGRAM,\n} from './constants';\n\nimport liqsolCoreIDL from '../../assets/solana/idl/liqsol_core.json';\nimport { LiqsolCore } from '../../assets/solana/types/liqsol_core';\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 = { publicKey: tmpKeypair.publicKey, signAllTransactions: async () => [], signTransaction: async () => tmpKeypair };\n\n const provider = new AnchorProvider(connection, wallet, {\n commitment: 'confirmed',\n });\n\n const program = new Program(\n liqsolCoreIDL,\n provider,\n ) as Program<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 */\nexport async function getUserRecordRaw(\n connection: Connection,\n user: PublicKey,\n): Promise<Uint8Array | null> {\n const pda = deriveUserRecordPda(user);\n const info = await connection.getAccountInfo(pda);\n return info?.data ?? null;\n}\n\n// -----------------------------------------------------------------------------\n// Pay-rate & fee utilities (on-chain compatible)\n// -----------------------------------------------------------------------------\n\nexport async function getAveragePayRate(\n connection: Connection,\n lookback: number = DEFAULT_PAY_RATE_LOOKBACK,\n): Promise<bigint> {\n const program = getLiqsolCoreProgram(connection);\n const payRateHistoryPda = derivePayRateHistoryPda();\n\n try {\n const anyProgram = program as any;\n const payRateHistoryAccount = await anyProgram.account.payRateHistory.fetch(\n payRateHistoryPda,\n );\n\n const entries: any[] = payRateHistoryAccount.entries ?? [];\n const totalEntriesAdded = Number(\n payRateHistoryAccount.totalEntriesAdded ?? 0,\n );\n const currentIndex: number = payRateHistoryAccount.currentIndex ?? 0;\n const maxEntries: number =\n payRateHistoryAccount.maxEntries ?? entries.length;\n\n if (!entries.length) {\n return DEFAULT_AVERAGE_PAY_RATE;\n }\n\n const entriesToFetch = Math.min(lookback, maxEntries, entries.length);\n\n let idx: number;\n if (totalEntriesAdded === 0) {\n idx = 0;\n } else if (currentIndex === 0) {\n idx = maxEntries - 1;\n } else {\n idx = currentIndex - 1;\n }\n\n let sum = BigInt(0);\n let validCount = BigInt(0);\n\n for (let i = 0; i < entriesToFetch; i++) {\n const entry = entries[idx];\n if (entry && typeof entry.scaledRate !== 'undefined') {\n const rate = BigInt(entry.scaledRate.toString());\n if (rate > BigInt(0)) {\n sum += rate;\n validCount += BigInt(1);\n }\n }\n\n if (totalEntriesAdded === 0) {\n idx = (idx + 1) % maxEntries;\n } else {\n idx = idx === 0 ? maxEntries - 1 : idx - 1;\n }\n }\n\n if (validCount === BigInt(0)) {\n return DEFAULT_AVERAGE_PAY_RATE;\n }\n\n return sum / validCount;\n } catch (err) {\n // Fallback to default when history missing/unavailable\n return DEFAULT_AVERAGE_PAY_RATE;\n }\n}\n/**\n * On-chain fee formula:\n * fee = (average_pay_rate * 4 * deposit_amount_lamports) / 10^12\n */\nexport function calculateExpectedFee(\n depositAmountLamports: BN,\n averagePayRate: BN,\n): BN {\n return averagePayRate\n .mul(new BN(4))\n .mul(depositAmountLamports)\n .div(new BN(1_000_000_000_000)); // 10^12\n}\n\n/**\n * Convenience helper to preview how a deposit splits between user + bucket\n * and how much goes into the reserve, assuming the simple model:\n *\n * - userLiqSol = amount - fee + EPHEMERAL_RENT_EXEMPTION\n * - bucketLiqSol = fee\n * - reserveLamports = amount + EPHEMERAL_RENT_EXEMPTION\n */\nexport function previewDepositEffects(params: {\n depositAmountLamports: BN;\n averagePayRate: BN;\n rentExemptionLamports?: number;\n}): {\n feeLamports: BN;\n userLiqSolLamports: BN;\n bucketLiqSolLamports: BN;\n reserveIncreaseLamports: BN;\n} {\n const { depositAmountLamports, averagePayRate } = params;\n const rent = new BN(\n params.rentExemptionLamports ?? EPHEMERAL_RENT_EXEMPTION,\n );\n\n const fee = calculateExpectedFee(depositAmountLamports, averagePayRate);\n const userLiqSol = depositAmountLamports.sub(fee).add(rent);\n const bucketLiqSol = fee;\n const reserveIncrease = depositAmountLamports.add(rent);\n\n return {\n feeLamports: fee,\n userLiqSolLamports: userLiqSol,\n bucketLiqSolLamports: bucketLiqSol,\n reserveIncreaseLamports: reserveIncrease,\n };\n}\n\n/**\n * ---------------------------------------------------------------------------\n * Outpost-specific helpers\n * ---------------------------------------------------------------------------\n */\nexport interface OutpostAccounts {\n user: PublicKey;\n\n // Warrant / outpost\n globalState: PublicKey;\n poolAuthority: PublicKey;\n liqsolMint: PublicKey;\n liqsolPoolAta: PublicKey;\n userAta: PublicKey;\n wireReceipt: PublicKey;\n poolUserRecord: PublicKey;\n userUserRecord: PublicKey;\n distributionState: PublicKey;\n payRateHistory: PublicKey;\n bucketAuthority: PublicKey;\n bucketTokenAccount: PublicKey;\n solBucket: PublicKey;\n trancheState: PublicKey;\n userWarrantRecord: PublicKey;\n\n // Chainlink\n chainLinkFeed: PublicKey;\n chainLinkProgram: 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 payRateHistory = derivePayRateHistoryPda();\n const bucketAuthority = deriveBucketAuthorityPda();\n const solBucket = deriveSolBucketPda();\n const trancheState = deriveTrancheStatePda();\n const wireReceipt = deriveWireReceiptPda(user);\n const poolUserRecord = derivePoolUserRecordPda(poolAuthority);\n const userUserRecord = deriveUserUserRecordPda(user);\n const userWarrantRecord = deriveUserWarrantRecordPda(user);\n\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 // Chainlink program feeds\n const chainLinkFeed = CHAINLINK_FEED;\n const chainLinkProgram = CHAINLINK_PROGRAM\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 wireReceipt,\n poolUserRecord,\n userUserRecord,\n distributionState,\n payRateHistory,\n bucketAuthority,\n bucketTokenAccount,\n solBucket,\n trancheState,\n userWarrantRecord,\n chainLinkFeed,\n chainLinkProgram,\n };\n}\n\n// -----------------------------------------------------------------------------\n// Epoch / scheduling helpers\n// -----------------------------------------------------------------------------\n\nexport type EpochSnapshot = {\n epoch: number;\n slot: number;\n firstSlot: number;\n slotsInEpoch: number;\n slotMs: number;\n};\n\nexport async function getEpochSnapshot(\n connection: Connection,\n): Promise<EpochSnapshot> {\n const info = await connection.getEpochInfo();\n\n // Fallback slot time\n let slotTimeMs = Number(process.env.SLOT_TIME_MS_FALLBACK ?? 400);\n\n try {\n const samples = await connection.getRecentPerformanceSamples(16);\n if (samples.length) {\n const avgMs =\n samples.reduce(\n (acc, s) => acc + (s.samplePeriodSecs * 1000) / s.numSlots,\n 0,\n ) / samples.length;\n if (isFinite(avgMs) && avgMs > 0) {\n slotTimeMs = avgMs;\n }\n }\n } catch {\n // ignore; keep fallback\n }\n\n return {\n epoch: info.epoch,\n slot: info.slotIndex,\n firstSlot: info.absoluteSlot - info.slotIndex,\n slotsInEpoch: info.slotsInEpoch,\n slotMs: slotTimeMs,\n };\n}\n\nexport function msToEpochEnd(snapshot: EpochSnapshot): number {\n const remainingSlots = snapshot.slotsInEpoch - snapshot.slot;\n return remainingSlots * snapshot.slotMs;\n}\n\n/**\n * Generic \"execute around epoch boundaries\" helper:\n *\n * - If current progress is within [early, late], run immediately.\n * - If too early, sleep until `early` percentage into the epoch.\n * - If too late, sleep until `early` percentage into the *next* epoch.\n *\n * This is generic; you can wrap any instruction builder in here (including\n * deposit flows) without baking in program-specific logic.\n */\nexport async function scheduledInstruction<T>(\n connection: Connection,\n config: ScheduleConfig,\n instruction: () => Promise<T>,\n): Promise<T> {\n const early = config.early ?? 0.10;\n const late = config.late ?? 0.90;\n\n const snapshot = await getEpochSnapshot(connection);\n const progress = snapshot.slot / snapshot.slotsInEpoch;\n\n // Case 1: Already in safe zone\n if (progress >= early && progress <= late) {\n return instruction();\n }\n\n // Case 2: Early in epoch → wait until `early`\n if (progress < early) {\n const targetSlot = snapshot.slotsInEpoch * early;\n const slotsRemaining = targetSlot - snapshot.slot;\n const msToWait = slotsRemaining * snapshot.slotMs;\n\n console.log(\n `Epoch early (${(progress * 100).toFixed(\n 2,\n )}%). Sleeping ${(msToWait / 1000).toFixed(1)}s until ${early * 100\n }%...`,\n );\n\n await sleep(Math.max(1000, msToWait));\n return instruction();\n }\n\n // Case 3: Late in epoch → wait for next epoch + early window\n const msToNextEpoch = msToEpochEnd(snapshot);\n const earlyWaitTime = snapshot.slotsInEpoch * early * snapshot.slotMs;\n const totalWaitTime = msToNextEpoch + earlyWaitTime + 1000;\n\n console.log(\n `Epoch late (${(progress * 100).toFixed(\n 2,\n )}%). Sleeping ${(totalWaitTime / 1000).toFixed(\n 1,\n )}s until next epoch + ${early * 100}%...`,\n );\n\n await sleep(totalWaitTime);\n return instruction();\n}\n\n\n// -----------------------------------------------------------------------------\n// Generic helpers (used in tests + can be useful in apps)\n// -----------------------------------------------------------------------------\n\nexport function getErrorMessage(error: any): string {\n return (\n error?.error?.errorCode?.code ||\n error?.error?.errorMessage ||\n error?.message ||\n ''\n );\n}\n\nexport function generateRandomDepositAmount(\n minSol = 2,\n maxSol = 100,\n): BN {\n const randomSol = Math.random() * (maxSol - minSol) + minSol;\n return new BN(solToLamports(randomSol));\n}\n\nexport function generateTestKeypair(): Keypair {\n return Keypair.generate();\n}\n\nexport async function airdropSol(\n connection: Connection,\n publicKey: PublicKey,\n amountSol: number,\n): Promise<void> {\n const lamports = solToLamports(amountSol);\n const sig = await connection.requestAirdrop(publicKey, 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\n","import { AnchorProvider, BN, Program } from '@coral-xyz/anchor';\nimport {\n Connection,\n PublicKey,\n SystemProgram,\n Transaction,\n TransactionInstruction,\n} from '@solana/web3.js';\nimport {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n TOKEN_2022_PROGRAM_ID,\n createAssociatedTokenAccountInstruction,\n} from '@solana/spl-token';\nimport {\n buildOutpostAccounts,\n getLiqsolCoreProgram,\n getErrorMessage,\n} from '../utils';\nimport { SolanaProgramService } from '../program';\nimport { LiqsolCore } from '../../../assets/solana/types/liqsol_core';\nimport { WalletLike, OutpostWireStateSnapshot, SharesPreview, UserWarrantRecord, TrancheState, WireReceipt } from '../types';\n\n/**\n * Minimal, user-flow focused OutpostClient.\n * - Read state\n * - Build + (optionally) send user instructions\n *\n * No admin/bootstrap/reset helpers by design.\n */\nexport class OutpostClient {\n private readonly program: Program<LiqsolCore>; \n\n // keep consistent with your tests\n static readonly INDEX_SCALE = new BN('1000000000000');\n\n get connection(): Connection { return this.provider.connection; }\n get wallet(): WalletLike { return this.provider.wallet; }\n\n constructor(private provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('liqsolCore');\n }\n\n /**\n * Read-only Program helper (dummy wallet), useful if you want to do pure reads\n * without requiring a wallet. Kept here as sugar for callers.\n */\n getReadOnlyProgram(): Program<LiqsolCore> {\n return getLiqsolCoreProgram(this.connection);\n }\n\n // ---------------------------------------------------------------------------\n // General-purpose formatting + math (SDK sugar)\n // ---------------------------------------------------------------------------\n\n /**\n * Same rounding logic from your tests: ceil(amount * INDEX_SCALE / currentIndex)\n */\n static tokensToShares(amount: BN, currentIndex: BN): BN {\n const numerator = amount.mul(OutpostClient.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 * UI helper: formats a BN assumed to be scale=1e8 into a decimal string.\n * (Matches your test helper; useful for tranche price, USD price, etc.)\n */\n static formatScale8(value: BN): string {\n const decimals = 8;\n const valueStr = value.toString();\n if (valueStr.length <= decimals) {\n const padding = '0'.repeat(decimals - valueStr.length);\n return `0.${padding}${valueStr}`;\n }\n const intPart = valueStr.slice(0, valueStr.length - decimals);\n const decPart = valueStr.slice(valueStr.length - decimals);\n return `${intPart}.${decPart}`;\n }\n\n /**\n * Previews expected shares for a purchase/stake flow that mints shares\n * relative to globalState.currentIndex.\n */\n async previewExpectedShares(params: {\n amountLamports: BN;\n user?: PublicKey; // optional; defaults to wallet.publicKey\n }): Promise<SharesPreview> {\n const user = params.user ?? this.wallet.publicKey;\n const accounts = await buildOutpostAccounts(this.connection, user);\n const globalState = await this.program.account.globalState.fetch(accounts.globalState);\n const currentIndex = new BN(globalState.currentIndex.toString());\n const expectedShares = OutpostClient.tokensToShares(\n params.amountLamports,\n currentIndex,\n );\n\n return {\n amountLamports: params.amountLamports,\n currentIndex,\n indexScale: OutpostClient.INDEX_SCALE,\n expectedShares,\n };\n }\n\n // ---------------------------------------------------------------------------\n // Account helpers (user-facing, not admin bootstrap)\n // ---------------------------------------------------------------------------\n\n /**\n * Returns whether the user's liqSOL ATA exists.\n * Useful for UX (show \"Create token account\" prompt).\n */\n async doesUserAtaExist(user: PublicKey = this.wallet.publicKey): Promise<boolean> {\n const accounts = await buildOutpostAccounts(this.connection, user);\n const info = await this.connection.getAccountInfo(accounts.userAta);\n return !!info;\n }\n\n /**\n * Builds an instruction to create the user's liqSOL ATA (Token-2022).\n * This is general-purpose sugar for any flow that needs the ATA.\n */\n async buildCreateUserAtaIx(user: PublicKey = this.wallet.publicKey): Promise<TransactionInstruction> {\n const accounts = await buildOutpostAccounts(this.connection, user);\n\n return createAssociatedTokenAccountInstruction(\n this.wallet.publicKey, // payer\n accounts.userAta, // ata\n user, // owner\n accounts.liqsolMint, // mint\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n }\n\n /**\n * Convenience: ensures ATA exists by returning either [] or [createATAIx].\n * (Does NOT send; caller composes tx)\n */\n async maybeBuildCreateUserAtaIx(user: PublicKey = this.wallet.publicKey): Promise<TransactionInstruction[]> {\n const accounts = await buildOutpostAccounts(this.connection, user);\n const info = await this.connection.getAccountInfo(accounts.userAta);\n if (info) return [];\n return [await this.buildCreateUserAtaIx(user)];\n }\n\n // ---------------------------------------------------------------------------\n // Reads (UI-first)\n // ---------------------------------------------------------------------------\n\n async getWireStateSnapshot(user: PublicKey = this.wallet.publicKey): Promise<OutpostWireStateSnapshot> {\n const accounts = await buildOutpostAccounts(this.connection, user);\n\n const [\n globalState,\n wireReceipt,\n distributionState,\n userWarrantRecord,\n trancheState,\n ] = await Promise.all([\n this.program.account.globalState.fetch(accounts.globalState),\n this.program.account.wireReceipt.fetchNullable(accounts.wireReceipt),\n this.program.account.distributionState.fetch(accounts.distributionState),\n this.program.account.userWarrantRecord.fetchNullable(accounts.userWarrantRecord),\n this.program.account.trancheState.fetchNullable(accounts.trancheState),\n ]);\n\n const [\n liqsolPoolBalance,\n solBucketLamports,\n userLiqsolBalance,\n ] = await Promise.all([\n this.getTokenBalanceSafe(accounts.liqsolPoolAta),\n this.connection.getBalance(accounts.solBucket),\n this.getTokenBalanceSafe(accounts.userAta),\n ]);\n\n return {\n globalState,\n distributionState,\n wireReceipt,\n trancheState,\n userWarrantRecord,\n liqsolPoolBalance,\n solBucketLamports,\n userLiqsolBalance,\n };\n }\n\n async getWireReceipt(user: PublicKey = this.wallet.publicKey): Promise<WireReceipt | null> {\n const accounts = await buildOutpostAccounts(this.connection, user);\n return this.program.account.wireReceipt.fetchNullable(accounts.wireReceipt);\n }\n\n async getTrancheState(): Promise<TrancheState | null> {\n const accounts = await buildOutpostAccounts(this.connection, this.wallet.publicKey);\n return this.program.account.trancheState.fetchNullable(accounts.trancheState);\n }\n\n async getUserWarrantRecord(user: PublicKey = this.wallet.publicKey): Promise<UserWarrantRecord | null> {\n const accounts = await buildOutpostAccounts(this.connection, user);\n return this.program.account.userWarrantRecord.fetchNullable(accounts.userWarrantRecord);\n }\n\n // ---------------------------------------------------------------------------\n // Instruction builders (source of truth: your test utils)\n // ---------------------------------------------------------------------------\n\n /**\n * stakeLiqsol(amount)\n * (Outpost staking: liqSOL -> warrant pool)\n */\n async buildStakeLiqsolIx(amountLamports: bigint, userPubKey = this.wallet.publicKey): Promise<TransactionInstruction> {\n const a = await buildOutpostAccounts(this.connection, userPubKey);\n const amount = new BN(amountLamports.toString());\n\n return this.program.methods\n .stakeLiqsol(amount)\n .accounts({\n user: a.user,\n liqsolMint: a.liqsolMint,\n globalState: a.globalState,\n userAta: a.userAta,\n poolAuthority: a.poolAuthority,\n liqsolPoolAta: a.liqsolPoolAta,\n warrantDepositRecord: a.wireReceipt,\n liqsolPoolUserRecord: a.poolUserRecord,\n distributionState: a.distributionState,\n payRateHistory: a.payRateHistory,\n bucketAuthority: a.bucketAuthority,\n bucketTokenAccount: a.bucketTokenAccount,\n solBucket: a.solBucket,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n /**\n * withdrawStake(amount)\n * (Outpost unstake: warrant pool -> user liqSOL)\n */\n async buildWithdrawStakeIx(amountLamports: bigint, userPubKey = this.wallet.publicKey): Promise<TransactionInstruction> {\n const a = await buildOutpostAccounts(this.connection, userPubKey);\n const amount = new BN(amountLamports.toString());\n\n return this.program.methods\n .withdrawStake(amount)\n .accounts({\n user: a.user,\n liqsolMint: a.liqsolMint,\n globalState: a.globalState,\n userAta: a.userAta,\n poolAuthority: a.poolAuthority,\n liqsolPoolAta: a.liqsolPoolAta,\n warrantDepositRecord: a.wireReceipt,\n liqsolPoolUserRecord: a.poolUserRecord,\n distributionState: a.distributionState,\n payRateHistory: a.payRateHistory,\n bucketAuthority: a.bucketAuthority,\n bucketTokenAccount: a.bucketTokenAccount,\n solBucket: a.solBucket,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n /**\n * purchaseWithLiqsol(amount)\n */\n async buildPurchaseWithLiqsolIx(amountLamports: bigint, userPubKey = this.wallet.publicKey): Promise<TransactionInstruction> {\n const a = await buildOutpostAccounts(this.connection, userPubKey);\n const amount = new BN(amountLamports.toString());\n\n return this.program.methods\n .purchaseWithLiqsol(amount)\n .accounts({\n user: a.user,\n liqsolMint: a.liqsolMint,\n globalState: a.globalState,\n buyerAta: a.userAta,\n poolAuthority: a.poolAuthority,\n liqsolPoolAta: a.liqsolPoolAta,\n warrantDepositRecord: a.wireReceipt,\n liqsolPoolUserRecord: a.poolUserRecord,\n distributionState: a.distributionState,\n payRateHistory: a.payRateHistory,\n bucketAuthority: a.bucketAuthority,\n bucketTokenAccount: a.bucketTokenAccount,\n solBucket: a.solBucket,\n trancheState: a.trancheState,\n userWarrantRecord: a.userWarrantRecord,\n chainlinkFeed: a.chainLinkFeed,\n chainlinkProgram: a.chainLinkProgram,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n /**\n * purchaseWithSol(amount)\n */\n async buildPurchaseWithSolIx(amountLamports: bigint, userPubKey = this.wallet.publicKey): Promise<TransactionInstruction> {\n const a = await buildOutpostAccounts(this.connection, userPubKey);\n const amount = new BN(amountLamports.toString());\n\n return this.program.methods\n .purchaseWithSol(amount)\n .accounts({\n user: a.user,\n liqsolMint: a.liqsolMint,\n globalState: a.globalState,\n poolAuthority: a.poolAuthority,\n liqsolPoolAta: a.liqsolPoolAta,\n liqsolPoolUserRecord: a.poolUserRecord,\n distributionState: a.distributionState,\n payRateHistory: a.payRateHistory,\n bucketAuthority: a.bucketAuthority,\n bucketTokenAccount: a.bucketTokenAccount,\n solBucket: a.solBucket,\n warrantDepositRecord: a.wireReceipt,\n trancheState: a.trancheState,\n userWarrantRecord: a.userWarrantRecord,\n chainlinkFeed: a.chainLinkFeed,\n chainlinkProgram: a.chainLinkProgram,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n /**\n * purchaseWarrantsFromYield()\n *\n * Source of truth: your test util executePurchaseFromYield (note: it passed\n * liqsolPoolUserRecord: pdas.userUserRecord, not poolUserRecord).\n */\n async buildPurchaseFromYieldIx(userPubKey = this.wallet.publicKey): Promise<TransactionInstruction> {\n const a = await buildOutpostAccounts(this.connection, userPubKey);\n\n return this.program.methods\n .purchaseWarrantsFromYield()\n .accounts({\n user: a.user,\n globalState: a.globalState,\n liqsolMint: a.liqsolMint,\n poolAuthority: a.poolAuthority,\n liqsolPoolAta: a.liqsolPoolAta,\n solBucket: a.solBucket,\n liqsolPoolUserRecord: a.userUserRecord,\n distributionState: a.distributionState,\n payRateHistory: a.payRateHistory,\n bucketAuthority: a.bucketAuthority,\n bucketTokenAccount: a.bucketTokenAccount,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n trancheState: a.trancheState,\n userWarrantRecord: a.userWarrantRecord,\n chainlinkFeed: a.chainLinkFeed,\n chainlinkProgram: a.chainLinkProgram,\n })\n .instruction();\n }\n\n // ---------------------------------------------------------------------------\n // Optional send helpers (wallet-facing sugar)\n // ---------------------------------------------------------------------------\n\n /**\n * Builds and sends a single-instruction transaction.\n * (Hub can ignore this and use builder methods only.)\n */\n async sendIx(ix: TransactionInstruction, opts?: {\n additionalIxs?: TransactionInstruction[];\n }): Promise<string> {\n const tx = new Transaction();\n if (opts?.additionalIxs?.length) {\n tx.add(...opts.additionalIxs);\n }\n tx.add(ix);\n\n try {\n const sig = await this.provider.sendAndConfirm(tx, [], { commitment: 'confirmed' });\n return sig;\n } catch (e: any) {\n const msg = getErrorMessage(e);\n throw new Error(`OutpostClient sendIx failed: ${msg}`);\n }\n }\n\n /**\n * Convenience: stake liqSOL and (optionally) create ATA first.\n */\n async stakeLiqsol(params: {\n amount: BN;\n user?: PublicKey;\n ensureAta?: boolean; // default true\n }): Promise<string> {\n const user = params.user ?? this.wallet.publicKey;\n const pre: TransactionInstruction[] = [];\n if (params.ensureAta ?? true) {\n pre.push(...(await this.maybeBuildCreateUserAtaIx(user)));\n }\n const ix = await this.buildStakeLiqsolIx(params.amount, user);\n return this.sendIx(ix, { additionalIxs: pre });\n }\n\n async withdrawStake(params: {\n amount: BN;\n user?: PublicKey;\n ensureAta?: boolean; // default true (usually exists, but harmless)\n }): Promise<string> {\n const user = params.user ?? this.wallet.publicKey;\n const pre: TransactionInstruction[] = [];\n if (params.ensureAta ?? true) {\n pre.push(...(await this.maybeBuildCreateUserAtaIx(user)));\n }\n const ix = await this.buildWithdrawStakeIx(params.amount, user);\n return this.sendIx(ix, { additionalIxs: pre });\n }\n\n async purchaseWithLiqsol(params: {\n amount: BN;\n user?: PublicKey;\n ensureAta?: boolean; // default true\n }): Promise<string> {\n const user = params.user ?? this.wallet.publicKey;\n const pre: TransactionInstruction[] = [];\n if (params.ensureAta ?? true) {\n pre.push(...(await this.maybeBuildCreateUserAtaIx(user)));\n }\n const ix = await this.buildPurchaseWithLiqsolIx(params.amount, user);\n return this.sendIx(ix, { additionalIxs: pre });\n }\n\n async purchaseWithSol(params: {\n amount: BN;\n user?: PublicKey;\n }): Promise<string> {\n const user = params.user ?? this.wallet.publicKey;\n const ix = await this.buildPurchaseWithSolIx(params.amount, user);\n return this.sendIx(ix);\n }\n\n async purchaseFromYield(params?: {\n user?: PublicKey;\n }): Promise<string> {\n const user = params?.user ?? this.wallet.publicKey;\n const ix = await this.buildPurchaseFromYieldIx(user);\n return this.sendIx(ix);\n }\n\n // ---------------------------------------------------------------------------\n // Internals\n // ---------------------------------------------------------------------------\n\n /**\n * Token balance helper returning BN(0) if ATA missing.\n */\n private async getTokenBalanceSafe(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}","import {\n Commitment,\n Connection,\n ConnectionConfig,\n PublicKey as SolPubKey,\n Transaction,\n TransactionSignature,\n} from '@solana/web3.js';\nimport { AnchorProvider, BN } from '@coral-xyz/anchor';\nimport { BaseSignerWalletAdapter } from '@solana/wallet-adapter-base';\nimport { ASSOCIATED_TOKEN_PROGRAM_ID, getAssociatedTokenAddressSync, TOKEN_2022_PROGRAM_ID } from '@solana/spl-token';\n\nimport { ChainID, ExternalNetwork, KeyType, PublicKey } from '@wireio/core';\nimport { IStakingClient, Portfolio, StakerConfig } from '../../staker/types';\n\nimport { DepositClient } from './clients/deposit.client';\nimport { DistributionClient } from './clients/distribution.client';\nimport {\n deriveLiqsolMintPda,\n deriveReservePoolPda,\n deriveVaultPda,\n} from './constants';\nimport { SolanaTransaction } from './types';\nimport { LeaderboardClient } from './clients/leaderboard.client';\nimport { OutpostClient } from './clients/outpost.client';\n\nconst commitment: Commitment = 'confirmed';\n\nexport class SolanaStakingClient implements IStakingClient {\n public pubKey: PublicKey;\n public connection: Connection;\n public anchor: AnchorProvider;\n\n private depositClient: DepositClient;\n private distributionClient: DistributionClient;\n private leaderboardClient: LeaderboardClient;\n private outpostClient: OutpostClient;\n\n get solPubKey(): SolPubKey { return new SolPubKey(this.pubKey.data.array); }\n get network() { return this.config.network; }\n\n constructor(private config: StakerConfig) {\n const adapter = config.provider as BaseSignerWalletAdapter;\n if (!adapter?.publicKey) throw new Error('Solana wallet adapter not connected');\n if (!config.network.rpcUrls.length) throw new Error('No RPC URLs provided');\n\n const publicKey = adapter.publicKey;\n const wirePub = new PublicKey(KeyType.ED, publicKey.toBytes());\n if (!wirePub.equals(config.pubKey)) {\n throw new Error(\"Passed-in pubKey doesn't match adapter.publicKey\");\n }\n\n const opts: ConnectionConfig = { commitment };\n if (config.network.rpcUrls.length > 1 && config.network.rpcUrls[1].startsWith('ws')) {\n opts.wsEndpoint = config.network.rpcUrls[1];\n }\n\n const anchorWallet = {\n publicKey,\n async signTransaction<T extends SolanaTransaction>(tx: T): Promise<T> {\n return adapter.signTransaction(tx);\n },\n async signAllTransactions<T extends SolanaTransaction>(txs: T[]): Promise<T[]> {\n return Promise.all(txs.map((tx) => adapter.signTransaction(tx)));\n },\n };\n\n this.pubKey = wirePub;\n this.connection = new Connection(config.network.rpcUrls[0], opts);\n this.anchor = new AnchorProvider(this.connection, anchorWallet, { commitment });\n\n this.depositClient = new DepositClient(this.anchor);\n this.distributionClient = new DistributionClient(this.anchor);\n this.leaderboardClient = new LeaderboardClient(this.anchor);\n this.outpostClient = new OutpostClient(this.anchor);\n }\n\n // ---------------------------------------------------------------------\n // Public IStakingClient Interface Methods\n // ---------------------------------------------------------------------\n\n /**\n * Deposit SOL into liqSOL protocol (liqsol_core deposit flow).\n * @param amountLamports Amount of SOL to deposit (smallest unit)\n * @return Transaction signature\n */\n async deposit(amountLamports: bigint): Promise<string> {\n if (amountLamports <= BigInt(0)) throw new Error('Deposit amount must be greater than zero.');\n // const amount = new BN(amountLamports.toString());\n const tx = await this.depositClient.buildDepositTx(amountLamports);\n const { tx: prepared, blockhash, lastValidBlockHeight } = await this.prepareTx(tx);\n const signed = await this.signTransaction(prepared);\n const result = await this.sendAndConfirmHttp(signed, { blockhash, lastValidBlockHeight });\n return result.signature;\n }\n\n /**\n * Withdraw SOL from liqSOL protocol.\n * (Wire up once you have DepositClient.buildWithdrawTx or equivalent.)\n */\n async withdraw(amountLamports: bigint): Promise<string> {\n throw new Error('Withdraw method not yet implemented.');\n }\n\n /**\n * Stake liqSOL into Outpost (liqSOL -> pool).\n * Matches deposit flow: build -> prepare -> sign -> send/confirm.\n * @param amountLamports Amount of liqSOL to stake (smallest unit)\n */\n async stake(amountLamports: bigint): Promise<string> {\n if (amountLamports <= BigInt(0)) throw new Error('Stake amount must be greater than zero.');\n // const amount = new BN(amountLamports.toString());\n const preIxs = await this.outpostClient.maybeBuildCreateUserAtaIx(this.solPubKey);\n const stakeIx = await this.outpostClient.buildStakeLiqsolIx(amountLamports);\n const tx = new Transaction().add(...preIxs, stakeIx);\n const prepared = await this.prepareTx(tx);\n const signed = await this.signTransaction(prepared.tx);\n const result = await this.sendAndConfirmHttp(signed, prepared);\n return result.signature;\n }\n\n /**\n * Unstake liqSOL from Outpost (pool -> liqSOL).\n * Matches deposit flow: build -> prepare -> sign -> send/confirm.\n * @param amountLamports Amount of liqSOL principal to unstake (smallest unit)\n */\n async unstake(amountLamports: bigint): Promise<string> {\n if (amountLamports <= BigInt(0)) throw new Error('Unstake amount must be greater than zero.');\n const user = this.solPubKey;\n // const amount = new BN(amountLamports.toString());\n const preIxs = await this.outpostClient.maybeBuildCreateUserAtaIx(user);\n const withdrawIx = await this.outpostClient.buildWithdrawStakeIx(amountLamports);\n const tx = new Transaction().add(...preIxs, withdrawIx);\n const prepared = await this.prepareTx(tx);\n const signed = await this.signTransaction(prepared.tx);\n const result = await this.sendAndConfirmHttp(signed, prepared);\n return result.signature;\n }\n\n /**\n * native = SOL in wallet\n * liq = liqSOL token balance (from Token-2022 ATA)\n * staked = Outpost staked liqSOL principal (from wireReceipt.stakedLiqsol)\n * tracked = liqSOL tracked balance (from Distribution.userRecord)\n */\n async getPortfolio(): Promise<Portfolio> {\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 // IMPORTANT: use the SAME read primitive the outpost tests rely on\n const [nativeLamports, actualBalResp, userRecord, snapshot] = await Promise.all([\n this.connection.getBalance(user, \"confirmed\"),\n this.connection.getTokenAccountBalance(userLiqsolAta, \"confirmed\").catch(() => null),\n this.distributionClient.getUserRecord(user).catch(() => null),\n this.outpostClient.getWireStateSnapshot(user).catch(() => null),\n ]);\n\n const LIQSOL_DECIMALS = 9;\n\n const actualAmountStr = actualBalResp?.value?.amount ?? \"0\";\n\n const trackedAmountStr =\n userRecord?.trackedBalance ? userRecord.trackedBalance.toString() : \"0\";\n\n // Snapshot is canonical; receipt may be null if user never staked\n const wireReceipt = snapshot?.wireReceipt ?? null;\n\n const stakedAmountStr =\n wireReceipt?.stakedLiqsol ? wireReceipt.stakedLiqsol.toString() : \"0\";\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 amount: BigInt(stakedAmountStr),\n symbol: \"LiqSOL\",\n decimals: LIQSOL_DECIMALS,\n },\n tracked: {\n amount: BigInt(trackedAmountStr),\n symbol: \"LiqSOL\",\n decimals: LIQSOL_DECIMALS,\n },\n extras: {\n userLiqsolAta: userLiqsolAta.toBase58(),\n reservePoolPDA: reservePoolPDA.toBase58(),\n vaultPDA: vaultPDA.toBase58(),\n wireReceipt,\n },\n chainID: this.network.chainId as ChainID,\n };\n }\n\n // ---------------------------------------------------------------------\n // SOL-only extras\n // ---------------------------------------------------------------------\n\n async getUserRecord() {\n return this.distributionClient.getUserRecord(this.solPubKey);\n }\n\n getProtocolFee() {\n // TODO\n }\n\n async correctBalance(amount?: bigint): Promise<string> {\n const build = await this.distributionClient.buildCorrectRegisterTx({ amount });\n if (!build.canSucceed || !build.transaction) {\n throw new Error(build.reason ?? 'Unable to build Correct&Register transaction');\n }\n\n const { tx, blockhash, lastValidBlockHeight } = await this.prepareTx(build.transaction);\n const signed = await this.signTransaction(tx);\n const result = await this.sendAndConfirmHttp(signed, { blockhash, lastValidBlockHeight });\n return result.signature;\n }\n\n // ---------------------------------------------------------------------\n // Tx helpers\n // ---------------------------------------------------------------------\n\n private async sendAndConfirmHttp(\n signed: SolanaTransaction,\n ctx: { blockhash: string; lastValidBlockHeight: number },\n ): Promise<TxResult> {\n const signature = await this.connection.sendRawTransaction(signed.serialize(), {\n skipPreflight: false,\n preflightCommitment: commitment,\n maxRetries: 3,\n });\n\n const conf = await this.connection.confirmTransaction(\n { signature, blockhash: ctx.blockhash, lastValidBlockHeight: ctx.lastValidBlockHeight },\n commitment,\n );\n\n if (conf.value.err) {\n throw new Error(`Transaction failed: ${JSON.stringify(conf.value.err)}`);\n }\n\n return { signature, slot: conf.context.slot, confirmed: true };\n }\n\n async signTransaction(tx: SolanaTransaction): Promise<SolanaTransaction> {\n return this.anchor.wallet.signTransaction(tx);\n }\n\n async sendTransaction(signed: SolanaTransaction): Promise<TransactionSignature> {\n return this.anchor.sendAndConfirm(signed);\n }\n\n async prepareTx(\n tx: Transaction,\n ): Promise<{ tx: Transaction; blockhash: string; lastValidBlockHeight: number }> {\n const { blockhash, lastValidBlockHeight } = await this.connection.getLatestBlockhash('confirmed');\n tx.recentBlockhash = blockhash;\n tx.feePayer = this.solPubKey;\n return { tx, blockhash, lastValidBlockHeight };\n }\n}\n\nexport interface TxResult {\n signature: string;\n slot: number;\n confirmed: boolean;\n}","/**\n * @module EthereumContractService\n *\n * Provides a unified service for interacting with Ethereum smart contracts using ethers.js.\n */\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';\n// import LiqEthBurnArtifact from '../../assets/ethereum/ABI/liqEth/liqEthBurn.sol/LiqEthBurn.json';\n// import LiqEthMintArtifact from '../../assets/ethereum/ABI/liqEth/liqEthMint.sol/LiqEthMint.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';\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 WarrantArtifact from '../../assets/ethereum/ABI/outpost/Warrant.sol/Warrant.json';\n\n// Currently Unused Artifacts\n// import LiqEthCommonArtifact from '../../assets/ethereum/ABI/liqEth/liqEthCommon.sol/liqEthCommon.json';\n// import RewardsERC20Artifact from '../../assets/ethereum/ABI/liqEth/RewardsERC20.sol/RewardsERC20.json';\n// import ValidatorBalanceArtifact from '../../assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/ValidatorBalanceVerifier.json';\n// import YieldArtifact from '../../assets/ethereum/ABI/liqEth/Yield.sol/YieldOracle.json';\n\nimport ERC20Artifact from '../../assets/ethereum/ABI/token/ERC20Token.sol/ERC20Token.json';\nimport ERC721Artifact from '../../assets/ethereum/ABI/token/ERC721Token.sol/ERC721Token.json';\nimport ERC1155Artifact from '../../assets/ethereum/ABI/token/ERC1155Token.sol/ERC1155Token.json';\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 Accounting: \"0xDf9da63E9CD14c79bD9f0E8F2E797096A40B6031\",\n DepositManager: \"0x3fEd507e554cd0e973CeCAf2168526b1617418d3\",\n LiqEth: \"0x1dA6aB23c2E2fA0a52C74F7f4189F770ED1eF9B3\",\n StakingModule: \"0xBd13C85fdefBBc63904e7301aCdeFE87c9C93234\",\n WithdrawalQueue: \"0xD9A1D38ae4A636DEf20B02F35387a6b126D73fAe\", //aka \"queue\"\n WithdrawalVault: \"0x150334D09a1d3d30EE93d5e6009EB897B5dDF5b2\", //aka withdrawVault\n\n //not in last set of deployments 12/18/25\n // LiqEthMint: \"0xdBAa1539eB7b80C29d825FCda76c0d7F8F0E6cFB\",\n // LiqEthBurn: \"0x02e0A02fE2311FAd661677B7117FDdc801c1216b\",\n\n //Outpost contracts\n Depositor: \"0x0876f5f411651dFc67386Bc3D36315a3B2249F2e\",\n ReceiptNFT: \"0x726c91fB3218A745Bfec0302B4cBaeBeaA023a6d\",\n OutpostManager: \"0xB6Eb20f7916295853a318581eCB51Be4eeb107Fe\",\n BAR: \"0x1936EB941361da83EE0E68FB7Bd0DF210f090B5C\",\n OPP: \"0x2e4cc69D6F8CEC3eEec81F3051AD90fEa71e5D57\",\n OPPCommon: \"0xA79fB9e563cF70190346D66eA20A1F2E09e0f732\",\n OPPInbound: \"0xd63644d0e8c3610eEf9f0Fd5Ea884b962762c469\",\n Warrant: \"0x8613F6Bb9ad883e81338EF97A06c53459250c625\",\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 Accounting: {\n address: ADDRESSES.Accounting,\n abi: AccountingArtifact.abi as JsonFragment[],\n },\n LiqEth: {\n address: ADDRESSES.LiqEth,\n abi: LiqEthArtifact.abi as JsonFragment[],\n },\n DepositManager: {\n address: ADDRESSES.DepositManager,\n abi: DepositManagerArtifact.abi as JsonFragment[],\n },\n // LiqEthMint: {\n // address: ADDRESSES.LiqEthMint,\n // abi: LiqEthMintArtifact.abi as JsonFragment[],\n // },\n // LiqEthBurn: {\n // address: ADDRESSES.LiqEthBurn,\n // abi: LiqEthBurnArtifact.abi as JsonFragment[],\n // },\n // RewardsERC20: {\n // address: ADDRESSES.RewardsERC20,\n // abi: RewardsERC20Artifact.abi as JsonFragment[],\n // },\n StakingModule: {\n address: ADDRESSES.StakingModule,\n abi: StakingModuleArtifact.abi as JsonFragment[],\n },\n // ValidatorBalance: {\n // address: ADDRESSES.ValidatorBalance,\n // abi: ValidatorBalanceArtifact.abi as JsonFragment[],\n // },\n WithdrawalQueue: {\n address: ADDRESSES.WithdrawalQueue,\n abi: WithdrawalQueueArtifact.abi as JsonFragment[],\n },\n WithdrawalVault: {\n address: ADDRESSES.WithdrawalVault,\n abi: WithdrawalVaultArtifact.abi as JsonFragment[],\n },\n // Yield: {\n // address: ADDRESSES.Yield,\n // abi: YieldArtifact.abi as JsonFragment[],\n // },\n\n\n // Outpost Contracts\n Depositor: {\n address: ADDRESSES.Depositor,\n abi: DepositorArtifact.abi as JsonFragment[],\n },\n ReceiptNFT: {\n address: ADDRESSES.ReceiptNFT,\n abi: ReceiptNFTArtifact.abi as JsonFragment[],\n },\n OutpostManager: {\n address: ADDRESSES.OutpostManager,\n abi: OutpostManagerArtifact.abi as JsonFragment[],\n },\n BAR: {\n address: ADDRESSES.BAR,\n abi: BARArtifact.abi as JsonFragment[],\n },\n OPP: {\n address: ADDRESSES.OPP,\n abi: OPPArtifact.abi as JsonFragment[],\n },\n OPPCommon: {\n address: ADDRESSES.OPPCommon,\n abi: OPPCommonArtifact.abi as JsonFragment[],\n },\n OPPInbound: {\n address: ADDRESSES.OPPInbound,\n abi: OPPInboundArtifact.abi as JsonFragment[],\n },\n Warrant: {\n address: ADDRESSES.Warrant,\n abi: WarrantArtifact.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}","import { BigNumber, ethers } from \"ethers\";\nimport { DepositEvent, DepositResult } from \"../types\";\nimport { EthereumContractService } from \"../contract\";\n\nexport class DepositClient {\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 throw new Error(\n `Deposit amount below minDeposit: ` +\n `amount=${ethers.utils.formatEther(amountWei)} ETH, ` +\n `min=${ethers.utils.formatEther(minDeposit)} ETH`\n );\n }\n\n // Send the payable tx\n const tx = await this.contract.DepositManager.deposit({\n value: amountWei,\n });\n\n // Wait for 1 confirmation \n const receipt = await tx.wait(1);\n\n // Parse Deposited event if present\n let deposited: DepositEvent | undefined;\n const ev = receipt.events?.find((e) => e.event === 'Deposited');\n\n if (ev && ev.args) {\n const { user, netEth, fee, shares } = ev.args;\n deposited = {\n user,\n netEth: BigNumber.from(netEth),\n fee: BigNumber.from(fee),\n shares: BigNumber.from(shares),\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n deposited,\n };\n }\n\n\n}","import { BigNumber, ethers } from \"ethers\";\nimport { preLaunchReceipt, StakedEvent, StakedResult, WithdrawnStakeEvent, WithdrawnStakeResult } from \"../types\";\nimport { EthereumContractService } from \"../contract\";\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 * Useful for pre-flight checks; will throw with the same revert\n * reason as a real tx if it would fail.\n */\n async simulateStake(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 // stakeLiqEth() doesn't return anything, so we only care if it reverts.\n await this.contract.Depositor.callStatic.stakeLiqETH(amountWei);\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<StakedResult> {\n const liq = this.contract.LiqEth;\n const depositorAddress = this.contract.Depositor.address;\n \n // check allowance\n const allowance = await liq.allowance(signerAddress, depositorAddress);\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('LiqEth');\n\n // currently requested unlimited amount - potentially change to only request up to the current amount?\n const approveAmount = ethers.constants.MaxUint256;\n\n console.warn(`allowance insufficient (${allowance.toString()} < ${amountWei.toString()}); sending approve(${depositorAddress}, ${approveAmount.toString()})`);\n const approveTx = await liqWrite.approve(depositorAddress, approveAmount);\n await approveTx.wait(1);\n\n // re-read allowance to ensure approval succeeded\n const newAllowance = await liq.allowance(signerAddress, depositorAddress);\n if (newAllowance.lt(amountWei)) {\n throw new Error('Approval failed or allowance still insufficient after approve');\n }\n }\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 async getOwnedTokenIdsFor(\n owner: string,\n fromBlock = 1850820,\n toBlock: number | string = \"latest\"\n ): Promise<BigNumber[]> {\n const receiptContract = this.contract.ReceiptNFT;\n\n // Logs where address received tokens\n const toLogs = await receiptContract.queryFilter(\n receiptContract.filters.Transfer(null, owner),\n fromBlock,\n toBlock\n );\n\n // Logs where address sent tokens (including burns from owner → 0)\n const fromLogs = await receiptContract.queryFilter(\n receiptContract.filters.Transfer(owner, null),\n fromBlock,\n toBlock\n );\n\n const owned = new Set<string>();\n\n // Add all received tokenIds\n for (const e of toLogs) {\n const tokenId = e.args?.tokenId;\n if (!tokenId) continue;\n owned.add(tokenId.toString());\n }\n\n // Remove all sent tokenIds\n for (const e of fromLogs) {\n const tokenId = e.args?.tokenId;\n if (!tokenId) continue;\n owned.delete(tokenId.toString());\n }\n\n // Convert to BigNumbers\n return Array.from(owned).map((id) => BigNumber.from(id));\n }\n\n\n /**\n * \n * @param 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 fetchPreLaunchReceipts(address: string): 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 const formattedReceipt = {\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 results.push({ tokenId: idBN.toBigInt(), receipt: formattedReceipt } as any);\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 * @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 { IStakingClient, Portfolio, StakerConfig } from '../../staker/types';\nimport { PublicKey as WirePubKey } from '@wireio/core';\nimport { EthereumContractService } from './contract';\nimport { preLaunchReceipt, WithdrawRequestedEvent, WithdrawResult } from './types';\nimport { DepositClient } from './clients/deposit.client';\nimport { StakeClient } from './clients/stake.client';\n\n\n\nexport class EthereumStakingClient implements IStakingClient {\n public readonly pubKey: WirePubKey;\n private readonly provider: ethers.providers.Web3Provider;\n private readonly signer: ethers.Signer;\n private readonly contractService: EthereumContractService;\n\n private depositClient: DepositClient;\n private stakeClient: StakeClient;\n\n get contract() { return this.contractService.contract; }\n get network() { return this.config.network; }\n\n constructor(private config: StakerConfig) {\n try {\n this.provider = config.provider as ethers.providers.Web3Provider;\n this.signer = this.provider.getSigner();\n this.pubKey = config.pubKey as WirePubKey;\n \n this.contractService = new EthereumContractService({\n provider: this.provider,\n signer: this.signer,\n });\n this.depositClient = new DepositClient(this.contractService);\n this.stakeClient = new StakeClient(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 const amountWei = BigNumber.isBigNumber(amount)\n ? amount\n : BigNumber.from(amount);\n\n const result = await this.depositClient.performDeposit(amountWei);\n return result.txHash;\n }\n\n\n // TODO - In progress\n async withdraw(amount: number | string | bigint | BigNumber): Promise<string> {\n const amountWei = BigNumber.isBigNumber(amount)\n ? amount\n : BigNumber.from(amount);\n\n const result = await this.requestWithdraw(amountWei);\n return result.txHash;\n }\n\n\n // TODO - In progress\n async stake(amount: bigint): Promise<string> {\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 // TODO\n async unstakePrelaunch(tokenId: bigint, recipient: string): Promise<string> {\n const tokenIdBigNum = BigNumber.from(tokenId)\n const result = await this.stakeClient.performWithdrawStake(tokenIdBigNum, recipient);\n return result.txHash;\n }\n\n\n async fetchPrelaunchReceipts(address?: string): Promise<preLaunchReceipt[]> {\n if(address === undefined) address = await this.signer.getAddress();\n \n let receipts = await this.stakeClient.fetchPreLaunchReceipts(address);\n return receipts\n }\n\n \n \n async getEthStats(): Promise<any> {\n let withdrawDelay = await this.contract.DepositManager.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 /**\n * Resolve the user's ETH + liqETH balances.\n *\n * native = ETH in wallet\n * actual = liqETH token balance (ERC-20)\n * tracked = liqETH tracked balance (protocol/accounting view)\n */\n async getPortfolio(): Promise<Portfolio> {\n const walletAddress = await this.signer.getAddress();\n // console.log('getPortfolio() wallet address', walletAddress)\n\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.LiqEth.balanceOf(walletAddress);\n const liqSymbol = 'Liq' + (this.network?.nativeCurrency?.symbol ?? 'ETH');\n\n // 3) staked liqEth ERC-20 balance (actual)\n const stakedLiqBalance = await this.contract.Depositor.sharesOf(walletAddress);\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 tracked: {\n amount: liqBalance.toBigInt(),\n decimals: nativeDecimals,\n symbol: liqSymbol,\n },\n staked: {\n amount: stakedLiqBalance.toBigInt(),\n decimals: nativeDecimals,\n symbol: liqSymbol,\n },\n chainID: this.network.chainId\n }\n // console.log('ETH PORTFOLIO', portfolio);\n return portfolio;\n }\n\n \n // ---------------------------------------------------------------------\n // Internal ETH Staking client helper functions\n // ---------------------------------------------------------------------\n\n private async requestWithdraw(amountWei: BigNumber): 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 const liqEth = this.contract.LiqEth;\n const owner = await this.signer.getAddress();\n const liqEthAddress = this.contractService.getAddress('LiqEth');\n\n const nonce: BigNumber = await liqEth.nonces(owner);\n const chainId = this.network?.chainId ?? (await this.provider.getNetwork()).chainId;\n const domain = {\n name: await liqEth.name(),\n version: '1',\n chainId,\n verifyingContract: liqEthAddress,\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 (this.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 // TODO: implement claimRewards, etc.\n}","// src/staker/staker.ts\n\nimport { ChainID, EvmChainID, SolChainID } from '@wireio/core';\nimport { IStakingClient, StakerConfig } from './types';\nimport { SolanaStakingClient } from '../networks/solana/solana';\nimport { EthereumStakingClient } from '../networks/ethereum/ethereum';\n\nexport class Staker {\n public selectedChainID?: ChainID;\n private clients: Map<ChainID, IStakingClient> = new Map();\n\n /**\n * Get the staking client for the currently selected chain.\n * @returns The staking client instance.\n */\n get client(): IStakingClient | undefined {\n return this.selectedChainID && this.isConfigured(this.selectedChainID)\n ? this.clients.get(this.selectedChainID) : undefined;\n }\n\n /** Is there a client configured for this chain? */\n isConfigured(chainId: ChainID): boolean {\n return this.clients.has(chainId);\n }\n\n /** List of configured chains */\n listConfigured(): ChainID[] {\n return [...this.clients.keys()];\n }\n\n constructor(config: StakerConfig | StakerConfig[], selectedChainID?: ChainID) {\n if (!config) throw new Error('StakerConfig is required');\n if (!Array.isArray(config)) config = [config];\n\n // console.log('STAKER INIT', config);\n\n config.forEach((cfg) => {\n switch (cfg.network.chainId) {\n case SolChainID.WireTestnet:\n this.clients.set(cfg.network.chainId, new SolanaStakingClient(cfg));\n break;\n\n case EvmChainID.Hoodi:\n this.clients.set(EvmChainID.Hoodi, new EthereumStakingClient(cfg));\n break;\n\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 '../../staker/types';\n\nexport const CONTRACT_NAMES = [\n 'Accounting',\n 'DepositManager',\n 'LiqEth',\n // 'LiqEthBurn',\n // 'LiqEthMint',\n // 'RewardsERC20',\n 'StakingModule',\n // 'ValidatorBalance',\n 'WithdrawalQueue',\n 'WithdrawalVault',\n // 'Yield',\n\n //Outpost contracts\n 'Depositor',\n 'ReceiptNFT',\n 'OutpostManager',\n 'BAR',\n 'OPP',\n 'OPPCommon',\n 'OPPInbound',\n 'Warrant',\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 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":["PublicKey","liqSolTokenIDL","validatorLeaderboardIDL","__async","StakeProgram","liqsolCoreJson","Program","getAssociatedTokenAddressSync","TOKEN_2022_PROGRAM_ID","BN","SystemProgram","ASSOCIATED_TOKEN_PROGRAM_ID","SYSVAR_INSTRUCTIONS_PUBKEY","SYSVAR_CLOCK_PUBKEY","SYSVAR_STAKE_HISTORY_PUBKEY","SYSVAR_RENT_PUBKEY","Transaction","getAssociatedTokenAddress","tx","Keypair","AnchorProvider","createAssociatedTokenAccountInstruction","KeyType","Connection","DepositClient","SolPubKey","ethers","Contract","BigNumber","tokenId","SolChainID","EvmChainID"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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EAAA,CAAA;AAAA,KACjD,CAAA,CAAA;AAAA,GAAA;AACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
|
|
1
|
+
{"version":3,"file":"stake.js","sources":["../src/networks/solana/constants.ts","../src/networks/solana/program.ts","../src/networks/solana/clients/deposit.client.ts","../src/networks/solana/clients/distribution.client.ts","../src/networks/solana/clients/leaderboard.client.ts","../src/networks/solana/utils.ts","../src/networks/solana/clients/outpost.client.ts","../src/networks/solana/solana.ts","../src/networks/ethereum/contract.ts","../src/networks/ethereum/clients/deposit.client.ts","../src/networks/ethereum/clients/stake.client.ts","../src/networks/ethereum/ethereum.ts","../src/staker/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\";\n\n/**\n * ---------------------------------------------------------------------------\n * PROGRAM IDS\n * ---------------------------------------------------------------------------\n *\n * These should match:\n * - `metadata.address` in your Anchor IDLs under src/assets/solana/idl/*.json\n * - The program IDs printed by your deploy scripts\n */\n// Extract program IDs from IDL files\nexport const PROGRAM_IDS = {\n LIQSOL_CORE: new PublicKey(liqsolCoreIDL.address),\n LIQSOL_TOKEN: new PublicKey(liqSolTokenIDL.address),\n VALIDATOR_LEADERBOARD: new PublicKey(validatorLeaderboardIDL.address),\n} as const;\n\n// Export individual program IDs for convenience\nexport const {\n LIQSOL_CORE,\n LIQSOL_TOKEN,\n VALIDATOR_LEADERBOARD,\n} = PROGRAM_IDS;\n\n/**\n * ---------------------------------------------------------------------------\n * PDA SEEDS (must match on-chain programs)\n * ---------------------------------------------------------------------------\n *\n * These strings are baked into the on-chain programs and are already used in\n * your test utils. We centralize them here so all clients share them.\n */\n\nexport const PDA_SEEDS = {\n // liqsol_core: deposit / stake controller\n DEPOSIT_AUTHORITY: 'deposit_authority',\n VAULT: 'vault',\n RESERVE_POOL: 'reserve_pool',\n STAKE_CONTROLLER_STATE: 'stake_controller',\n PAYOUT_STATE: 'payout_state',\n\n // liqsol_token: mint + bucket\n LIQSOL_MINT: 'liqsol_mint',\n LIQSOL_MINT_AUTHORITY: 'mint_authority',\n BUCKET_AUTHORITY: 'liqsol_bucket',\n\n // distribution program (embedded in liqsol_core)\n DISTRIBUTION_STATE: 'distribution_state',\n USER_RECORD: 'user_record',\n\n // pay-rate history\n PAY_RATE_HISTORY: 'pay_rate_history',\n\n // validator leaderboard (state + records)\n LEADERBOARD_STATE: 'leaderboard_state',\n VALIDATOR_RECORD: 'validator',\n GLOBAL_STAKE_INFO: 'global_stake_info',\n\n // Outpost\n WARRANT_DEPOSIT_GLOBAL: 'warrant_deposit_global',\n LIQSOL_POOL: 'liqsol_pool',\n WARRANT_DEPOSIT_RECORD: 'warrant_deposit_record',\n WIRE_SOL_BUCKET: 'wire_sol_bucket',\n TRANCHE_STATE: 'tranche_state',\n USER_WARRANT_RECORD: 'user_warrant_record',\n\n // BAR\n BAR_STATE_SEED: 'bar_state',\n BONDED_ACTOR_SEED: 'bonded_actor',\n BOND_LEVEL_SEED: 'bond_level',\n} as const;\n\n/**\n * Helpers for PDA derivation so clients don’t duplicate logic.\n */\nexport const deriveLiqsolMintPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQSOL_MINT)],\n PROGRAM_IDS.LIQSOL_TOKEN,\n )[0];\n\nexport const deriveLiqsolMintAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQSOL_MINT_AUTHORITY)],\n PROGRAM_IDS.LIQSOL_TOKEN,\n )[0];\n\nexport const deriveDepositAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.DEPOSIT_AUTHORITY)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveVaultPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VAULT)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveReservePoolPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.RESERVE_POOL)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveStakeControllerStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.STAKE_CONTROLLER_STATE)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const derivePayoutStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.PAYOUT_STATE)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveBucketAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.BUCKET_AUTHORITY)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveDistributionStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.DISTRIBUTION_STATE)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveUserRecordPda = (user: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.USER_RECORD), user.toBuffer()],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const derivePayRateHistoryPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.PAY_RATE_HISTORY)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveLeaderboardStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LEADERBOARD_STATE)],\n PROGRAM_IDS.VALIDATOR_LEADERBOARD,\n )[0];\n\nexport const deriveValidatorRecordPda = (voteAccount: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VALIDATOR_RECORD), voteAccount.toBuffer()],\n PROGRAM_IDS.VALIDATOR_LEADERBOARD,\n )[0];\n\nexport const deriveStakeControllerVaultPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VAULT)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\n/**\n * OUTPOST \n */\nexport const deriveOutpostGlobalStatePda = () => \n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.WARRANT_DEPOSIT_GLOBAL)],\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 deriveWireReceiptPda = (user: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.WARRANT_DEPOSIT_RECORD), user.toBuffer()],\n LIQSOL_CORE,\n )[0];\n\nexport const derivePoolUserRecordPda = (poolAuthority: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.USER_RECORD), poolAuthority.toBuffer()],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveUserUserRecordPda = (user: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.USER_RECORD), user.toBuffer()],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveSolBucketPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.WIRE_SOL_BUCKET)],\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 deriveUserWarrantRecordPda = (user: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.USER_WARRANT_RECORD), user.toBuffer()],\n LIQSOL_CORE,\n )[0];\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 * Ephemeral stake account address used per-deposit.\n * On-chain convention: seed = `ephemeral_<u32>` under StakeProgram.programId.\n */\nexport const deriveEphemeralStakeAddress = async (\n user: PublicKey,\n seed: any,\n): Promise<PublicKey> => {\n const seedStr = `ephemeral_${seed}`;\n return await PublicKey.createWithSeed(user, seedStr, StakeProgram.programId);\n};\n\n/**\n * Constant keys\n */\n\nexport const CHAINLINK_FEED = new PublicKey(\"99B2bTijsU6f1GCT73HmdR7HCFFjGMBcPZY6jZ96ynrR\");\nexport const CHAINLINK_PROGRAM = new PublicKey(\"HEvSKofvBgfaexv23kMabbYqxasxU3mQ4ibBMEmJWHny\");\n\n/**\n * ---------------------------------------------------------------------------\n * ECONOMICS & MATH CONSTANTS\n * ---------------------------------------------------------------------------\n */\n\n// Same scale factor used on-chain for pay-rate math\nexport const PAY_RATE_SCALE_FACTOR = BigInt(1_000_000_000_000); // 10^12\n\n// Default pay rate fallback used in tests & utils\nexport const DEFAULT_AVERAGE_PAY_RATE = BigInt(191_780_821);\n\n// How many history entries to average when computing expected fee\nexport const DEFAULT_PAY_RATE_LOOKBACK = 5;\n\n// Rent exemption for ephemeral stake account (lamports)\n// Mirrors EPHEMERAL_RENT_EXEMPTION = 2_282_880 used in tests\nexport const EPHEMERAL_RENT_EXEMPTION = 2_282_880;\n\n// For convenience: lamports <-> SOL helpers (no RPC dependency)\nexport const LAMPORTS_PER_SOL = 1_000_000_000;\n\nexport const lamportsToSol = (lamports: number | bigint): number =>\n Number(lamports) / LAMPORTS_PER_SOL;\n\nexport const solToLamports = (sol: number): bigint =>\n BigInt(Math.round(sol * LAMPORTS_PER_SOL));\n","import { AnchorProvider, Program } from '@coral-xyz/anchor';\n\nimport liqsolCoreJson from '../../assets/solana/idl/liqsol_core.json';\nimport liqsolTokenJson from '../../assets/solana/idl/liqsol_token.json';\nimport validatorLeaderboardJson from '../../assets/solana/idl/validator_leaderboard.json';\n\nimport type { LiqsolCore } from '../../assets/solana/types/liqsol_core';\nimport type { LiqsolToken } from '../../assets/solana/types/liqsol_token';\nimport type { ValidatorLeaderboard } from '../../assets/solana/types/validator_leaderboard';\n\nimport { PROGRAM_IDS } from './constants';\n\ntype Entry<IDL> = {\n idl: IDL & { address: string };\n address: string;\n};\n\nconst PROGRAMS = {\n liqsolCore: {\n idl: liqsolCoreJson,\n address: PROGRAM_IDS.LIQSOL_CORE.toBase58(),\n } as Entry<LiqsolCore>,\n liqsolToken: {\n idl: liqsolTokenJson,\n address: PROGRAM_IDS.LIQSOL_TOKEN.toBase58(),\n } as Entry<LiqsolToken>,\n validatorLeaderboard: {\n idl: validatorLeaderboardJson,\n address: PROGRAM_IDS.VALIDATOR_LEADERBOARD.toBase58(),\n } as Entry<ValidatorLeaderboard>,\n} as const;\n\nexport type SolanaProgramName = keyof typeof PROGRAMS;\n\nexport class SolanaProgramService {\n constructor(private provider: AnchorProvider) { }\n\n getProgram<K extends SolanaProgramName>(name: K): Program<(typeof PROGRAMS)[K]['idl']> {\n const { idl, address } = PROGRAMS[name];\n const idlWithAddr = { ...idl, address };\n return new Program(idlWithAddr, this.provider) as Program<(typeof PROGRAMS)[K]['idl']>;\n }\n\n listProgramNames(): SolanaProgramName[] {\n return Object.keys(PROGRAMS) as SolanaProgramName[];\n }\n}","import { AnchorProvider, BN, Program } from '@coral-xyz/anchor';\nimport {\n PublicKey,\n SystemProgram,\n Transaction,\n TransactionInstruction,\n StakeProgram,\n SYSVAR_INSTRUCTIONS_PUBKEY,\n SYSVAR_CLOCK_PUBKEY,\n SYSVAR_RENT_PUBKEY,\n SYSVAR_STAKE_HISTORY_PUBKEY,\n} from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddressSync,\n} from '@solana/spl-token';\n\nimport { SolanaProgramService } from '../program';\nimport type { LiqsolCore } from '../../../assets/solana/types/liqsol_core';\n\nimport {\n PROGRAM_IDS,\n deriveDepositAuthorityPda,\n deriveLiqsolMintPda,\n deriveLiqsolMintAuthorityPda,\n deriveReservePoolPda,\n deriveVaultPda,\n deriveStakeControllerStatePda,\n deriveBucketAuthorityPda,\n derivePayRateHistoryPda,\n deriveDistributionStatePda,\n deriveUserRecordPda,\n derivePayoutStatePda,\n deriveEphemeralStakeAddress,\n} from '../constants';\nimport { WalletLike } from '../types';\n\nexport class DepositClient {\n private program: Program<LiqsolCore>;\n\n get wallet(): WalletLike { return this.provider.wallet; }\n\n constructor(private provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('liqsolCore');\n }\n\n async buildDepositTx(amount: bigint, user = this.wallet.publicKey): Promise<Transaction> {\n // -------------------------------------------------------------\n // PDAs\n // -------------------------------------------------------------\n const depositAuthority = deriveDepositAuthorityPda();\n const liqsolMint = deriveLiqsolMintPda();\n const liqsolMintAuthority = deriveLiqsolMintAuthorityPda();\n const reservePool = deriveReservePoolPda();\n const vault = deriveVaultPda();\n const controllerState = deriveStakeControllerStatePda();\n const payoutState = derivePayoutStatePda();\n const bucketAuthority = deriveBucketAuthorityPda();\n const payRateHistory = derivePayRateHistoryPda();\n const distributionState = deriveDistributionStatePda();\n const userRecord = deriveUserRecordPda(user);\n\n // -------------------------------------------------------------\n // Token-2022 ATAs\n // -------------------------------------------------------------\n const userAta = getAssociatedTokenAddressSync(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID\n );\n\n const bucketTokenAccount = getAssociatedTokenAddressSync(\n liqsolMint,\n bucketAuthority,\n true,\n TOKEN_2022_PROGRAM_ID\n );\n\n // -------------------------------------------------------------\n // Ephemeral stake\n // -------------------------------------------------------------\n const seed = Math.floor(Math.random() * 2 ** 32);\n const ephemeralStake = await deriveEphemeralStakeAddress(user, seed);\n\n // -------------------------------------------------------------\n // BUILD IX (MUST MATCH IDL)\n // -------------------------------------------------------------\n const ix: TransactionInstruction = await 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\n liqsolMint,\n userAta,\n liqsolMintAuthority,\n reservePool,\n vault,\n ephemeralStake,\n\n controllerState,\n payoutState,\n bucketAuthority,\n bucketTokenAccount,\n\n userRecord,\n distributionState,\n payRateHistory,\n\n instructionsSysvar: SYSVAR_INSTRUCTIONS_PUBKEY,\n clock: SYSVAR_CLOCK_PUBKEY,\n stakeHistory: SYSVAR_STAKE_HISTORY_PUBKEY,\n rent: SYSVAR_RENT_PUBKEY,\n })\n .instruction();\n\n return new Transaction().add(ix);\n }\n}","import { AnchorProvider, Program } from '@coral-xyz/anchor';\nimport {\n ParsedAccountData,\n PublicKey,\n SYSVAR_INSTRUCTIONS_PUBKEY,\n Transaction,\n SystemProgram,\n} from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n getAssociatedTokenAddress,\n} from '@solana/spl-token';\n\nimport { SolanaProgramService } from '../program';\nimport type { LiqsolCore } from '../../../assets/solana/types/liqsol_core';\nimport {\n deriveBucketAuthorityPda,\n deriveDistributionStatePda,\n deriveLiqsolMintPda,\n derivePayRateHistoryPda,\n deriveUserRecordPda,\n} from '../constants';\nimport type { CorrectRegisterBuildResult, DistributionState, MismatchCandidate, ParsedAccountInfo, UserRecord } from '../types';\n\n/**\n * Distribution client – wraps the distribution portion of the liqsol_core\n * program. Responsible for:\n * - Reading DistributionState + UserRecord\n * - Computing mismatch candidates (tracked > actual)\n * - Building a \"correct then register\" transaction for the caller\n *\n * Aligned with the on-chain `update_user` script:\n * - Single `updateUser()` entrypoint that:\n * * Can create userRecord if missing\n * * Reconciles tracked vs actual using user, userAta, bucket, pay-rate\n */\nexport class DistributionClient {\n private program: Program<LiqsolCore>;\n\n constructor(private provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('liqsolCore');\n }\n\n get connection() { return this.provider.connection; }\n\n /**\n * Fetch the global distribution state account.\n */\n async getDistributionState(): Promise<DistributionState | null> {\n const pda = deriveDistributionStatePda();\n try {\n // IDL account name: \"distributionState\"\n return await this.program.account.distributionState.fetch(pda);\n } catch {\n return null;\n }\n }\n\n /**\n * Fetch a user's distribution userRecord (or null if missing).\n */\n async getUserRecord(user: PublicKey): Promise<UserRecord | null> {\n const pda = deriveUserRecordPda(user);\n try {\n return await this.program.account.userRecord.fetchNullable(pda);\n } catch {\n return null;\n }\n }\n\n /**\n * Helper: get actual liqSOL balances for all token holders.\n *\n * Returns a map: owner (base58) -> actual balance (BigInt)\n */\n private async getActualBalancesByOwner(): Promise<Map<string, bigint>> {\n const liqsolMint = deriveLiqsolMintPda();\n const mintStr = liqsolMint.toBase58();\n\n const accounts = await this.connection.getParsedProgramAccounts(\n TOKEN_2022_PROGRAM_ID,\n {\n filters: [\n // SPL token layout: mint at offset 0\n { memcmp: { offset: 0, bytes: mintStr } },\n ],\n commitment: 'confirmed',\n },\n );\n\n const byOwner = new Map<string, bigint>();\n\n for (const acct of accounts) {\n const data = acct.account.data as ParsedAccountData;\n const parsed = data.parsed;\n if (!parsed || parsed.type !== 'account') continue;\n\n const info: ParsedAccountInfo = parsed.info;\n const ownerStr = info.owner;\n const amountStr = info.tokenAmount.amount;\n const amount = BigInt(amountStr);\n\n const prev = byOwner.get(ownerStr) ?? BigInt(0);\n byOwner.set(ownerStr, prev + amount);\n }\n\n return byOwner;\n }\n\n /**\n * Helper: get tracked balances from all userRecord accounts,\n * keyed by *actual wallet owner*, not the userRecord PDA.\n *\n * userRecord struct:\n * - userAta: pubkey\n * - trackedBalance: u64\n * - claimBalance: u64\n * - lastClaimTimestamp: i64\n * - bump: u8\n */\n private async getTrackedBalances(): Promise<\n Map<string, { owner: PublicKey; tracked: bigint }>\n > {\n const records = await this.program.account.userRecord.all();\n const map = new Map<string, { owner: PublicKey; tracked: bigint }>();\n\n for (const r of records) {\n const ur = r.account as UserRecord;\n const userAta = ur.userAta as PublicKey;\n\n // Resolve the *wallet* that owns this ATA\n const ataInfo = await this.connection.getParsedAccountInfo(userAta);\n const parsedData = ataInfo.value?.data as ParsedAccountData | undefined;\n if (!parsedData) continue;\n\n const parsed = parsedData.parsed;\n if (!parsed || (parsed as any).type !== 'account') continue;\n\n const info: ParsedAccountInfo = parsed.info;\n const ownerStr = info.owner;\n const owner = new PublicKey(ownerStr);\n\n const tracked = BigInt(ur.trackedBalance.toString());\n map.set(ownerStr, { owner, tracked });\n }\n\n return map;\n }\n\n /**\n * Discover all mismatch candidates where tracked > actual.\n *\n * - actual balances are derived from token accounts for the liqSOL mint\n * - tracked balances come from Distribution.userRecord\n */\n private async deriveMismatchCandidates(): Promise<MismatchCandidate[]> {\n const [actualByOwner, trackedByOwner] = await Promise.all([\n this.getActualBalancesByOwner(),\n this.getTrackedBalances(),\n ]);\n\n const out: MismatchCandidate[] = [];\n\n for (const [ownerStr, { owner, tracked }] of trackedByOwner.entries()) {\n const actual = actualByOwner.get(ownerStr) ?? BigInt(0);\n const delta = tracked - actual;\n if (delta > BigInt(0)) {\n out.push({ owner, actual, tracked, delta });\n }\n }\n\n // Largest discrepancy first\n out.sort((a, b) => (b.delta > a.delta ? 1 : b.delta < a.delta ? -1 : 0));\n return out;\n }\n\n /**\n * Canonical helper to build an `updateUser` instruction for a given user,\n * matching the standalone update-user.ts script.\n */\n private async buildUpdateUserIx(targetUser: PublicKey) {\n const walletPk = this.provider.wallet.publicKey;\n\n const distributionStatePDA = deriveDistributionStatePda();\n const userRecordPDA = deriveUserRecordPda(targetUser);\n const liqsolMintPDA = deriveLiqsolMintPda();\n const payRateHistoryPDA = derivePayRateHistoryPda();\n const bucketAuthorityPDA = deriveBucketAuthorityPda();\n\n const userAta = await getAssociatedTokenAddress(\n liqsolMintPDA,\n targetUser,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n const bucketTokenAccount = await getAssociatedTokenAddress(\n liqsolMintPDA,\n bucketAuthorityPDA,\n true, // allowOwnerOffCurve\n TOKEN_2022_PROGRAM_ID,\n );\n\n return (this.program.methods as any)\n .updateUser()\n .accounts({\n user: targetUser,\n userAta,\n userRecord: userRecordPDA,\n authority: walletPk,\n payer: walletPk,\n distributionState: distributionStatePDA,\n liqsolMint: liqsolMintPDA,\n instructionsSysvar: SYSVAR_INSTRUCTIONS_PUBKEY,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n bucketAuthority: bucketAuthorityPDA,\n bucketTokenAccount,\n payRateHistory: payRateHistoryPDA,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n /**\n * Build the \"correct & register\" transaction.\n *\n * - Fetches DistributionState + all userRecords + token holders\n * - Computes caller's untracked amount (actual - tracked)\n * - If DistributionState.availableBalance already covers that, we only\n * send updateUser(caller).\n * - Otherwise we select top mismatch candidates until their freed deltas\n * cover the shortfall, then build updateUser(target) for each,\n * followed by updateUser(caller).\n *\n * NOTE:\n * - This no longer uses a separate updateSpecificUser; the single\n * updateUser entrypoint accepts any `user` as long as authority/payer\n * are valid, per your script.\n */\n async buildCorrectRegisterTx(opts: {\n amount?: bigint;\n maxCandidates?: number;\n } = {}): Promise<CorrectRegisterBuildResult> {\n const walletPk = this.provider.wallet.publicKey;\n const callerStr = walletPk.toBase58();\n\n const [distState, actualByOwner, trackedByOwner] = await Promise.all([\n this.getDistributionState(),\n this.getActualBalancesByOwner(),\n this.getTrackedBalances(),\n ]);\n\n if (!distState) {\n return {\n needToRegister: false,\n canSucceed: false,\n reason: 'DistributionState not initialized',\n transaction: undefined,\n plan: { deficit: BigInt(0), willFree: BigInt(0), selected: [] },\n };\n }\n\n const availableBalance = BigInt(distState.availableBalance.toString());\n\n const trackedEntry =\n trackedByOwner.get(callerStr) ?? {\n owner: walletPk,\n tracked: BigInt(0),\n };\n\n const actual = actualByOwner.get(callerStr) ?? BigInt(0);\n const tracked = trackedEntry.tracked;\n const untracked = actual - tracked;\n\n // Nothing to register\n if (untracked <= BigInt(0)) {\n return {\n needToRegister: false,\n canSucceed: true,\n reason: 'No untracked liqSOL to register',\n transaction: undefined,\n plan: { deficit: BigInt(0), willFree: BigInt(0), selected: [] },\n };\n }\n\n // Optional user-specified cap on how much to register.\n const targetRegister =\n opts.amount && opts.amount > BigInt(0) ? opts.amount : untracked;\n\n // Simple case: availableBalance already covers what we want to register\n if (availableBalance >= targetRegister) {\n const tx = new Transaction();\n const ix = await this.buildUpdateUserIx(walletPk); // caller only\n tx.add(ix);\n\n return {\n needToRegister: true,\n canSucceed: true,\n transaction: tx,\n plan: { deficit: BigInt(0), willFree: BigInt(0), selected: [] },\n };\n }\n\n // Need to free up more availableBalance by correcting others.\n const deficit = targetRegister - availableBalance;\n\n const allCandidates = await this.deriveMismatchCandidates();\n const maxCandidates = opts.maxCandidates ?? 10;\n\n const selected: MismatchCandidate[] = [];\n let willFree = BigInt(0);\n\n for (const c of allCandidates) {\n if (c.owner.equals(walletPk)) continue; // don't self-correct here\n selected.push(c);\n willFree += c.delta;\n if (willFree >= deficit || selected.length >= maxCandidates) break;\n }\n\n if (willFree < deficit) {\n return {\n needToRegister: true,\n canSucceed: false,\n reason: 'Not enough mismatched candidates to cover deficit',\n transaction: undefined,\n plan: { deficit, willFree, selected },\n };\n }\n\n const tx = new Transaction();\n\n // 1) Correct selected mismatched users.\n for (const c of selected) {\n const ix = await this.buildUpdateUserIx(c.owner);\n tx.add(ix);\n }\n\n // 2) Register caller (updateUser(caller)).\n {\n const ix = await this.buildUpdateUserIx(walletPk);\n tx.add(ix);\n }\n\n return {\n needToRegister: true,\n canSucceed: true,\n transaction: tx,\n plan: { deficit, willFree, selected },\n };\n }\n}","import { AnchorProvider, Program } from '@coral-xyz/anchor';\nimport { PublicKey } from '@solana/web3.js';\n\nimport { SolanaProgramService } from '../program';\nimport type { ValidatorLeaderboard } from '../../../assets/solana/types/validator_leaderboard';\nimport {\n deriveLeaderboardStatePda,\n deriveValidatorRecordPda,\n} from '../constants';\n\n/**\n * Simple read client for the validator_leaderboard program.\n *\n * Adjust account names/fields to match your IDL (state, validatorRecord, etc).\n */\nexport class LeaderboardClient {\n private program: Program<ValidatorLeaderboard>;\n\n constructor(private provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('validatorLeaderboard');\n }\n\n async getState(): Promise<any | null> {\n const pda = deriveLeaderboardStatePda();\n try {\n // Assumes account name \"leaderboardState\"\n return await this.program.account.leaderboardState.fetch(pda);\n } catch {\n return null;\n }\n }\n\n async getValidatorRecord(voteAccount: PublicKey): Promise<any | null> {\n const pda = deriveValidatorRecordPda(voteAccount);\n try {\n // Assumes account name \"validatorRecord\"\n return await this.program.account.validatorRecord.fetchNullable(pda);\n } catch {\n return null;\n }\n }\n\n /**\n * Convenience helper to fetch and sort top validators by score.\n * Assumes `validatorRecord` has a numeric `score` field in the IDL.\n */\n async getTopValidators(limit = 20): Promise<any[]> {\n const records = await (this.program.account as any).validatorRecord.all();\n const sorted = (records as Array<{ publicKey: PublicKey; account: any }>).sort(\n (a, b) => {\n const sa = BigInt(a.account.score?.toString?.() ?? '0');\n const sb = BigInt(b.account.score?.toString?.() ?? '0');\n return sb > sa ? 1 : sb < sa ? -1 : 0;\n },\n );\n return sorted.slice(0, limit);\n }\n}","// src/networks/solana/utils.ts\n\nimport { Program, BN, AnchorProvider } from '@coral-xyz/anchor';\n\nimport {\n Connection,\n Keypair,\n PublicKey,\n SystemProgram,\n StakeProgram,\n} from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddress,\n} from '@solana/spl-token';\n\nimport {\n LIQSOL_CORE,\n LIQSOL_TOKEN,\n PAY_RATE_SCALE_FACTOR,\n DEFAULT_AVERAGE_PAY_RATE,\n EPHEMERAL_RENT_EXEMPTION,\n LAMPORTS_PER_SOL,\n lamportsToSol,\n solToLamports,\n deriveDepositAuthorityPda,\n deriveLiqsolMintPda,\n deriveLiqsolMintAuthorityPda,\n deriveVaultPda,\n deriveReservePoolPda,\n deriveStakeControllerStatePda,\n derivePayoutStatePda,\n deriveBucketAuthorityPda,\n deriveDistributionStatePda,\n deriveUserRecordPda,\n derivePayRateHistoryPda,\n deriveStakeControllerVaultPda,\n deriveEphemeralStakeAddress,\n DEFAULT_PAY_RATE_LOOKBACK,\n deriveOutpostGlobalStatePda,\n deriveOutpostPoolAuthorityPda,\n deriveSolBucketPda,\n deriveTrancheStatePda,\n deriveWireReceiptPda,\n derivePoolUserRecordPda,\n deriveUserUserRecordPda,\n deriveUserWarrantRecordPda,\n CHAINLINK_FEED,\n CHAINLINK_PROGRAM,\n} from './constants';\n\nimport liqsolCoreIDL from '../../assets/solana/idl/liqsol_core.json';\nimport { LiqsolCore } from '../../assets/solana/types/liqsol_core';\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 = { publicKey: tmpKeypair.publicKey, signAllTransactions: async () => [], signTransaction: async () => tmpKeypair };\n\n const provider = new AnchorProvider(connection, wallet, {\n commitment: 'confirmed',\n });\n\n const program = new Program(\n liqsolCoreIDL,\n provider,\n ) as Program<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 */\nexport async function getUserRecordRaw(\n connection: Connection,\n user: PublicKey,\n): Promise<Uint8Array | null> {\n const pda = deriveUserRecordPda(user);\n const info = await connection.getAccountInfo(pda);\n return info?.data ?? null;\n}\n\n// -----------------------------------------------------------------------------\n// Pay-rate & fee utilities (on-chain compatible)\n// -----------------------------------------------------------------------------\n\nexport async function getAveragePayRate(\n connection: Connection,\n lookback: number = DEFAULT_PAY_RATE_LOOKBACK,\n): Promise<bigint> {\n const program = getLiqsolCoreProgram(connection);\n const payRateHistoryPda = derivePayRateHistoryPda();\n\n try {\n const anyProgram = program as any;\n const payRateHistoryAccount = await anyProgram.account.payRateHistory.fetch(\n payRateHistoryPda,\n );\n\n const entries: any[] = payRateHistoryAccount.entries ?? [];\n const totalEntriesAdded = Number(\n payRateHistoryAccount.totalEntriesAdded ?? 0,\n );\n const currentIndex: number = payRateHistoryAccount.currentIndex ?? 0;\n const maxEntries: number =\n payRateHistoryAccount.maxEntries ?? entries.length;\n\n if (!entries.length) {\n return DEFAULT_AVERAGE_PAY_RATE;\n }\n\n const entriesToFetch = Math.min(lookback, maxEntries, entries.length);\n\n let idx: number;\n if (totalEntriesAdded === 0) {\n idx = 0;\n } else if (currentIndex === 0) {\n idx = maxEntries - 1;\n } else {\n idx = currentIndex - 1;\n }\n\n let sum = BigInt(0);\n let validCount = BigInt(0);\n\n for (let i = 0; i < entriesToFetch; i++) {\n const entry = entries[idx];\n if (entry && typeof entry.scaledRate !== 'undefined') {\n const rate = BigInt(entry.scaledRate.toString());\n if (rate > BigInt(0)) {\n sum += rate;\n validCount += BigInt(1);\n }\n }\n\n if (totalEntriesAdded === 0) {\n idx = (idx + 1) % maxEntries;\n } else {\n idx = idx === 0 ? maxEntries - 1 : idx - 1;\n }\n }\n\n if (validCount === BigInt(0)) {\n return DEFAULT_AVERAGE_PAY_RATE;\n }\n\n return sum / validCount;\n } catch (err) {\n // Fallback to default when history missing/unavailable\n return DEFAULT_AVERAGE_PAY_RATE;\n }\n}\n/**\n * On-chain fee formula:\n * fee = (average_pay_rate * 4 * deposit_amount_lamports) / 10^12\n */\nexport function calculateExpectedFee(\n depositAmountLamports: BN,\n averagePayRate: BN,\n): BN {\n return averagePayRate\n .mul(new BN(4))\n .mul(depositAmountLamports)\n .div(new BN(1_000_000_000_000)); // 10^12\n}\n\n/**\n * Convenience helper to preview how a deposit splits between user + bucket\n * and how much goes into the reserve, assuming the simple model:\n *\n * - userLiqSol = amount - fee + EPHEMERAL_RENT_EXEMPTION\n * - bucketLiqSol = fee\n * - reserveLamports = amount + EPHEMERAL_RENT_EXEMPTION\n */\nexport function previewDepositEffects(params: {\n depositAmountLamports: BN;\n averagePayRate: BN;\n rentExemptionLamports?: number;\n}): {\n feeLamports: BN;\n userLiqSolLamports: BN;\n bucketLiqSolLamports: BN;\n reserveIncreaseLamports: BN;\n} {\n const { depositAmountLamports, averagePayRate } = params;\n const rent = new BN(\n params.rentExemptionLamports ?? EPHEMERAL_RENT_EXEMPTION,\n );\n\n const fee = calculateExpectedFee(depositAmountLamports, averagePayRate);\n const userLiqSol = depositAmountLamports.sub(fee).add(rent);\n const bucketLiqSol = fee;\n const reserveIncrease = depositAmountLamports.add(rent);\n\n return {\n feeLamports: fee,\n userLiqSolLamports: userLiqSol,\n bucketLiqSolLamports: bucketLiqSol,\n reserveIncreaseLamports: reserveIncrease,\n };\n}\n\n/**\n * ---------------------------------------------------------------------------\n * Outpost-specific helpers\n * ---------------------------------------------------------------------------\n */\nexport interface OutpostAccounts {\n user: PublicKey;\n\n // Warrant / outpost\n globalState: PublicKey;\n poolAuthority: PublicKey;\n liqsolMint: PublicKey;\n liqsolPoolAta: PublicKey;\n userAta: PublicKey;\n wireReceipt: PublicKey;\n poolUserRecord: PublicKey;\n userUserRecord: PublicKey;\n distributionState: PublicKey;\n payRateHistory: PublicKey;\n bucketAuthority: PublicKey;\n bucketTokenAccount: PublicKey;\n solBucket: PublicKey;\n trancheState: PublicKey;\n userWarrantRecord: PublicKey;\n\n // Chainlink\n chainLinkFeed: PublicKey;\n chainLinkProgram: 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 payRateHistory = derivePayRateHistoryPda();\n const bucketAuthority = deriveBucketAuthorityPda();\n const solBucket = deriveSolBucketPda();\n const trancheState = deriveTrancheStatePda();\n const wireReceipt = deriveWireReceiptPda(user);\n const poolUserRecord = derivePoolUserRecordPda(poolAuthority);\n const userUserRecord = deriveUserUserRecordPda(user);\n const userWarrantRecord = deriveUserWarrantRecordPda(user);\n\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 // Chainlink program feeds\n const chainLinkFeed = CHAINLINK_FEED;\n const chainLinkProgram = CHAINLINK_PROGRAM\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 wireReceipt,\n poolUserRecord,\n userUserRecord,\n distributionState,\n payRateHistory,\n bucketAuthority,\n bucketTokenAccount,\n solBucket,\n trancheState,\n userWarrantRecord,\n chainLinkFeed,\n chainLinkProgram,\n };\n}\n\n// -----------------------------------------------------------------------------\n// Epoch / scheduling helpers\n// -----------------------------------------------------------------------------\n\nexport type EpochSnapshot = {\n epoch: number;\n slot: number;\n firstSlot: number;\n slotsInEpoch: number;\n slotMs: number;\n};\n\nexport async function getEpochSnapshot(\n connection: Connection,\n): Promise<EpochSnapshot> {\n const info = await connection.getEpochInfo();\n\n // Fallback slot time\n let slotTimeMs = Number(process.env.SLOT_TIME_MS_FALLBACK ?? 400);\n\n try {\n const samples = await connection.getRecentPerformanceSamples(16);\n if (samples.length) {\n const avgMs =\n samples.reduce(\n (acc, s) => acc + (s.samplePeriodSecs * 1000) / s.numSlots,\n 0,\n ) / samples.length;\n if (isFinite(avgMs) && avgMs > 0) {\n slotTimeMs = avgMs;\n }\n }\n } catch {\n // ignore; keep fallback\n }\n\n return {\n epoch: info.epoch,\n slot: info.slotIndex,\n firstSlot: info.absoluteSlot - info.slotIndex,\n slotsInEpoch: info.slotsInEpoch,\n slotMs: slotTimeMs,\n };\n}\n\nexport function msToEpochEnd(snapshot: EpochSnapshot): number {\n const remainingSlots = snapshot.slotsInEpoch - snapshot.slot;\n return remainingSlots * snapshot.slotMs;\n}\n\n/**\n * Generic \"execute around epoch boundaries\" helper:\n *\n * - If current progress is within [early, late], run immediately.\n * - If too early, sleep until `early` percentage into the epoch.\n * - If too late, sleep until `early` percentage into the *next* epoch.\n *\n * This is generic; you can wrap any instruction builder in here (including\n * deposit flows) without baking in program-specific logic.\n */\nexport async function scheduledInstruction<T>(\n connection: Connection,\n config: ScheduleConfig,\n instruction: () => Promise<T>,\n): Promise<T> {\n const early = config.early ?? 0.10;\n const late = config.late ?? 0.90;\n\n const snapshot = await getEpochSnapshot(connection);\n const progress = snapshot.slot / snapshot.slotsInEpoch;\n\n // Case 1: Already in safe zone\n if (progress >= early && progress <= late) {\n return instruction();\n }\n\n // Case 2: Early in epoch → wait until `early`\n if (progress < early) {\n const targetSlot = snapshot.slotsInEpoch * early;\n const slotsRemaining = targetSlot - snapshot.slot;\n const msToWait = slotsRemaining * snapshot.slotMs;\n\n console.log(\n `Epoch early (${(progress * 100).toFixed(\n 2,\n )}%). Sleeping ${(msToWait / 1000).toFixed(1)}s until ${early * 100\n }%...`,\n );\n\n await sleep(Math.max(1000, msToWait));\n return instruction();\n }\n\n // Case 3: Late in epoch → wait for next epoch + early window\n const msToNextEpoch = msToEpochEnd(snapshot);\n const earlyWaitTime = snapshot.slotsInEpoch * early * snapshot.slotMs;\n const totalWaitTime = msToNextEpoch + earlyWaitTime + 1000;\n\n console.log(\n `Epoch late (${(progress * 100).toFixed(\n 2,\n )}%). Sleeping ${(totalWaitTime / 1000).toFixed(\n 1,\n )}s until next epoch + ${early * 100}%...`,\n );\n\n await sleep(totalWaitTime);\n return instruction();\n}\n\n\n// -----------------------------------------------------------------------------\n// Generic helpers (used in tests + can be useful in apps)\n// -----------------------------------------------------------------------------\n\nexport function getErrorMessage(error: any): string {\n return (\n error?.error?.errorCode?.code ||\n error?.error?.errorMessage ||\n error?.message ||\n ''\n );\n}\n\nexport function generateRandomDepositAmount(\n minSol = 2,\n maxSol = 100,\n): BN {\n const randomSol = Math.random() * (maxSol - minSol) + minSol;\n return new BN(solToLamports(randomSol));\n}\n\nexport function generateTestKeypair(): Keypair {\n return Keypair.generate();\n}\n\nexport async function airdropSol(\n connection: Connection,\n publicKey: PublicKey,\n amountSol: number,\n): Promise<void> {\n const lamports = solToLamports(amountSol);\n const sig = await connection.requestAirdrop(publicKey, 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\n","import { AnchorProvider, BN, Program } from '@coral-xyz/anchor';\nimport {\n Connection,\n PublicKey,\n SystemProgram,\n Transaction,\n TransactionInstruction,\n} from '@solana/web3.js';\nimport {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n TOKEN_2022_PROGRAM_ID,\n createAssociatedTokenAccountInstruction,\n} from '@solana/spl-token';\nimport {\n buildOutpostAccounts,\n getLiqsolCoreProgram,\n getErrorMessage,\n} from '../utils';\nimport { SolanaProgramService } from '../program';\nimport { LiqsolCore } from '../../../assets/solana/types/liqsol_core';\nimport { WalletLike, OutpostWireStateSnapshot, SharesPreview, UserWarrantRecord, TrancheState, WireReceipt } from '../types';\n\n/**\n * Minimal, user-flow focused OutpostClient.\n * - Read state\n * - Build + (optionally) send user instructions\n *\n * No admin/bootstrap/reset helpers by design.\n */\nexport class OutpostClient {\n private readonly program: Program<LiqsolCore>; \n\n // keep consistent with your tests\n static readonly INDEX_SCALE = new BN('1000000000000');\n\n get connection(): Connection { return this.provider.connection; }\n get wallet(): WalletLike { return this.provider.wallet; }\n\n constructor(private provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('liqsolCore');\n }\n\n /**\n * Read-only Program helper (dummy wallet), useful if you want to do pure reads\n * without requiring a wallet. Kept here as sugar for callers.\n */\n getReadOnlyProgram(): Program<LiqsolCore> {\n return getLiqsolCoreProgram(this.connection);\n }\n\n // ---------------------------------------------------------------------------\n // General-purpose formatting + math (SDK sugar)\n // ---------------------------------------------------------------------------\n\n /**\n * Same rounding logic from your tests: ceil(amount * INDEX_SCALE / currentIndex)\n */\n static tokensToShares(amount: BN, currentIndex: BN): BN {\n const numerator = amount.mul(OutpostClient.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 * UI helper: formats a BN assumed to be scale=1e8 into a decimal string.\n * (Matches your test helper; useful for tranche price, USD price, etc.)\n */\n static formatScale8(value: BN): string {\n const decimals = 8;\n const valueStr = value.toString();\n if (valueStr.length <= decimals) {\n const padding = '0'.repeat(decimals - valueStr.length);\n return `0.${padding}${valueStr}`;\n }\n const intPart = valueStr.slice(0, valueStr.length - decimals);\n const decPart = valueStr.slice(valueStr.length - decimals);\n return `${intPart}.${decPart}`;\n }\n\n /**\n * Previews expected shares for a purchase/stake flow that mints shares\n * relative to globalState.currentIndex.\n */\n async previewExpectedShares(params: {\n amountLamports: BN;\n user?: PublicKey; // optional; defaults to wallet.publicKey\n }): Promise<SharesPreview> {\n const user = params.user ?? this.wallet.publicKey;\n const accounts = await buildOutpostAccounts(this.connection, user);\n const globalState = await this.program.account.globalState.fetch(accounts.globalState);\n const currentIndex = new BN(globalState.currentIndex.toString());\n const expectedShares = OutpostClient.tokensToShares(\n params.amountLamports,\n currentIndex,\n );\n\n return {\n amountLamports: params.amountLamports,\n currentIndex,\n indexScale: OutpostClient.INDEX_SCALE,\n expectedShares,\n };\n }\n\n // ---------------------------------------------------------------------------\n // Account helpers (user-facing, not admin bootstrap)\n // ---------------------------------------------------------------------------\n\n /**\n * Returns whether the user's liqSOL ATA exists.\n * Useful for UX (show \"Create token account\" prompt).\n */\n async doesUserAtaExist(user: PublicKey = this.wallet.publicKey): Promise<boolean> {\n const accounts = await buildOutpostAccounts(this.connection, user);\n const info = await this.connection.getAccountInfo(accounts.userAta);\n return !!info;\n }\n\n /**\n * Builds an instruction to create the user's liqSOL ATA (Token-2022).\n * This is general-purpose sugar for any flow that needs the ATA.\n */\n async buildCreateUserAtaIx(user: PublicKey = this.wallet.publicKey): Promise<TransactionInstruction> {\n const accounts = await buildOutpostAccounts(this.connection, user);\n\n return createAssociatedTokenAccountInstruction(\n this.wallet.publicKey, // payer\n accounts.userAta, // ata\n user, // owner\n accounts.liqsolMint, // mint\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n }\n\n /**\n * Convenience: ensures ATA exists by returning either [] or [createATAIx].\n * (Does NOT send; caller composes tx)\n */\n async maybeBuildCreateUserAtaIx(user: PublicKey = this.wallet.publicKey): Promise<TransactionInstruction[]> {\n const accounts = await buildOutpostAccounts(this.connection, user);\n const info = await this.connection.getAccountInfo(accounts.userAta);\n if (info) return [];\n return [await this.buildCreateUserAtaIx(user)];\n }\n\n // ---------------------------------------------------------------------------\n // Reads (UI-first)\n // ---------------------------------------------------------------------------\n\n async getWireStateSnapshot(user: PublicKey = this.wallet.publicKey): Promise<OutpostWireStateSnapshot> {\n const accounts = await buildOutpostAccounts(this.connection, user);\n\n const [\n globalState,\n wireReceipt,\n distributionState,\n userWarrantRecord,\n trancheState,\n ] = await Promise.all([\n this.program.account.globalState.fetch(accounts.globalState),\n this.program.account.wireReceipt.fetchNullable(accounts.wireReceipt),\n this.program.account.distributionState.fetch(accounts.distributionState),\n this.program.account.userWarrantRecord.fetchNullable(accounts.userWarrantRecord),\n this.program.account.trancheState.fetchNullable(accounts.trancheState),\n ]);\n\n const [\n liqsolPoolBalance,\n solBucketLamports,\n userLiqsolBalance,\n ] = await Promise.all([\n this.getTokenBalanceSafe(accounts.liqsolPoolAta),\n this.connection.getBalance(accounts.solBucket),\n this.getTokenBalanceSafe(accounts.userAta),\n ]);\n\n return {\n globalState,\n distributionState,\n wireReceipt,\n trancheState,\n userWarrantRecord,\n liqsolPoolBalance,\n solBucketLamports,\n userLiqsolBalance,\n };\n }\n\n async getWireReceipt(user: PublicKey = this.wallet.publicKey): Promise<WireReceipt | null> {\n const accounts = await buildOutpostAccounts(this.connection, user);\n return this.program.account.wireReceipt.fetchNullable(accounts.wireReceipt);\n }\n\n async getTrancheState(): Promise<TrancheState | null> {\n const accounts = await buildOutpostAccounts(this.connection, this.wallet.publicKey);\n return this.program.account.trancheState.fetchNullable(accounts.trancheState);\n }\n\n async getUserWarrantRecord(user: PublicKey = this.wallet.publicKey): Promise<UserWarrantRecord | null> {\n const accounts = await buildOutpostAccounts(this.connection, user);\n return this.program.account.userWarrantRecord.fetchNullable(accounts.userWarrantRecord);\n }\n\n // ---------------------------------------------------------------------------\n // Instruction builders (source of truth: your test utils)\n // ---------------------------------------------------------------------------\n\n /**\n * stakeLiqsol(amount)\n * (Outpost staking: liqSOL -> warrant pool)\n */\n async buildStakeLiqsolIx(amountLamports: bigint, userPubKey = this.wallet.publicKey): Promise<TransactionInstruction> {\n const a = await buildOutpostAccounts(this.connection, userPubKey);\n const amount = new BN(amountLamports.toString());\n\n return this.program.methods\n .stakeLiqsol(amount)\n .accounts({\n user: a.user,\n liqsolMint: a.liqsolMint,\n globalState: a.globalState,\n userAta: a.userAta,\n poolAuthority: a.poolAuthority,\n liqsolPoolAta: a.liqsolPoolAta,\n warrantDepositRecord: a.wireReceipt,\n liqsolPoolUserRecord: a.poolUserRecord,\n distributionState: a.distributionState,\n payRateHistory: a.payRateHistory,\n bucketAuthority: a.bucketAuthority,\n bucketTokenAccount: a.bucketTokenAccount,\n solBucket: a.solBucket,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n /**\n * withdrawStake(amount)\n * (Outpost unstake: warrant pool -> user liqSOL)\n */\n async buildWithdrawStakeIx(amountLamports: bigint, userPubKey = this.wallet.publicKey): Promise<TransactionInstruction> {\n const a = await buildOutpostAccounts(this.connection, userPubKey);\n const amount = new BN(amountLamports.toString());\n\n return this.program.methods\n .withdrawStake(amount)\n .accounts({\n user: a.user,\n liqsolMint: a.liqsolMint,\n globalState: a.globalState,\n userAta: a.userAta,\n poolAuthority: a.poolAuthority,\n liqsolPoolAta: a.liqsolPoolAta,\n warrantDepositRecord: a.wireReceipt,\n liqsolPoolUserRecord: a.poolUserRecord,\n distributionState: a.distributionState,\n payRateHistory: a.payRateHistory,\n bucketAuthority: a.bucketAuthority,\n bucketTokenAccount: a.bucketTokenAccount,\n solBucket: a.solBucket,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n /**\n * purchaseWithLiqsol(amount)\n */\n async buildPurchaseWithLiqsolIx(amountLamports: bigint, userPubKey = this.wallet.publicKey): Promise<TransactionInstruction> {\n const a = await buildOutpostAccounts(this.connection, userPubKey);\n const amount = new BN(amountLamports.toString());\n\n return this.program.methods\n .purchaseWithLiqsol(amount)\n .accounts({\n user: a.user,\n liqsolMint: a.liqsolMint,\n globalState: a.globalState,\n buyerAta: a.userAta,\n poolAuthority: a.poolAuthority,\n liqsolPoolAta: a.liqsolPoolAta,\n warrantDepositRecord: a.wireReceipt,\n liqsolPoolUserRecord: a.poolUserRecord,\n distributionState: a.distributionState,\n payRateHistory: a.payRateHistory,\n bucketAuthority: a.bucketAuthority,\n bucketTokenAccount: a.bucketTokenAccount,\n solBucket: a.solBucket,\n trancheState: a.trancheState,\n userWarrantRecord: a.userWarrantRecord,\n chainlinkFeed: a.chainLinkFeed,\n chainlinkProgram: a.chainLinkProgram,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n /**\n * purchaseWithSol(amount)\n */\n async buildPurchaseWithSolIx(amountLamports: bigint, userPubKey = this.wallet.publicKey): Promise<TransactionInstruction> {\n const a = await buildOutpostAccounts(this.connection, userPubKey);\n const amount = new BN(amountLamports.toString());\n\n return this.program.methods\n .purchaseWithSol(amount)\n .accounts({\n user: a.user,\n liqsolMint: a.liqsolMint,\n globalState: a.globalState,\n poolAuthority: a.poolAuthority,\n liqsolPoolAta: a.liqsolPoolAta,\n liqsolPoolUserRecord: a.poolUserRecord,\n distributionState: a.distributionState,\n payRateHistory: a.payRateHistory,\n bucketAuthority: a.bucketAuthority,\n bucketTokenAccount: a.bucketTokenAccount,\n solBucket: a.solBucket,\n warrantDepositRecord: a.wireReceipt,\n trancheState: a.trancheState,\n userWarrantRecord: a.userWarrantRecord,\n chainlinkFeed: a.chainLinkFeed,\n chainlinkProgram: a.chainLinkProgram,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n /**\n * purchaseWarrantsFromYield()\n *\n * Source of truth: your test util executePurchaseFromYield (note: it passed\n * liqsolPoolUserRecord: pdas.userUserRecord, not poolUserRecord).\n */\n async buildPurchaseFromYieldIx(userPubKey = this.wallet.publicKey): Promise<TransactionInstruction> {\n const a = await buildOutpostAccounts(this.connection, userPubKey);\n\n return this.program.methods\n .purchaseWarrantsFromYield()\n .accounts({\n user: a.user,\n globalState: a.globalState,\n liqsolMint: a.liqsolMint,\n poolAuthority: a.poolAuthority,\n liqsolPoolAta: a.liqsolPoolAta,\n solBucket: a.solBucket,\n liqsolPoolUserRecord: a.userUserRecord,\n distributionState: a.distributionState,\n payRateHistory: a.payRateHistory,\n bucketAuthority: a.bucketAuthority,\n bucketTokenAccount: a.bucketTokenAccount,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n trancheState: a.trancheState,\n userWarrantRecord: a.userWarrantRecord,\n chainlinkFeed: a.chainLinkFeed,\n chainlinkProgram: a.chainLinkProgram,\n })\n .instruction();\n }\n\n // ---------------------------------------------------------------------------\n // Optional send helpers (wallet-facing sugar)\n // ---------------------------------------------------------------------------\n\n /**\n * Builds and sends a single-instruction transaction.\n * (Hub can ignore this and use builder methods only.)\n */\n async sendIx(ix: TransactionInstruction, opts?: {\n additionalIxs?: TransactionInstruction[];\n }): Promise<string> {\n const tx = new Transaction();\n if (opts?.additionalIxs?.length) {\n tx.add(...opts.additionalIxs);\n }\n tx.add(ix);\n\n try {\n const sig = await this.provider.sendAndConfirm(tx, [], { commitment: 'confirmed' });\n return sig;\n } catch (e: any) {\n const msg = getErrorMessage(e);\n throw new Error(`OutpostClient sendIx failed: ${msg}`);\n }\n }\n\n /**\n * Convenience: stake liqSOL and (optionally) create ATA first.\n */\n async stakeLiqsol(params: {\n amount: BN;\n user?: PublicKey;\n ensureAta?: boolean; // default true\n }): Promise<string> {\n const user = params.user ?? this.wallet.publicKey;\n const pre: TransactionInstruction[] = [];\n if (params.ensureAta ?? true) {\n pre.push(...(await this.maybeBuildCreateUserAtaIx(user)));\n }\n const ix = await this.buildStakeLiqsolIx(params.amount, user);\n return this.sendIx(ix, { additionalIxs: pre });\n }\n\n async withdrawStake(params: {\n amount: BN;\n user?: PublicKey;\n ensureAta?: boolean; // default true (usually exists, but harmless)\n }): Promise<string> {\n const user = params.user ?? this.wallet.publicKey;\n const pre: TransactionInstruction[] = [];\n if (params.ensureAta ?? true) {\n pre.push(...(await this.maybeBuildCreateUserAtaIx(user)));\n }\n const ix = await this.buildWithdrawStakeIx(params.amount, user);\n return this.sendIx(ix, { additionalIxs: pre });\n }\n\n async purchaseWithLiqsol(params: {\n amount: BN;\n user?: PublicKey;\n ensureAta?: boolean; // default true\n }): Promise<string> {\n const user = params.user ?? this.wallet.publicKey;\n const pre: TransactionInstruction[] = [];\n if (params.ensureAta ?? true) {\n pre.push(...(await this.maybeBuildCreateUserAtaIx(user)));\n }\n const ix = await this.buildPurchaseWithLiqsolIx(params.amount, user);\n return this.sendIx(ix, { additionalIxs: pre });\n }\n\n async purchaseWithSol(params: {\n amount: BN;\n user?: PublicKey;\n }): Promise<string> {\n const user = params.user ?? this.wallet.publicKey;\n const ix = await this.buildPurchaseWithSolIx(params.amount, user);\n return this.sendIx(ix);\n }\n\n async purchaseFromYield(params?: {\n user?: PublicKey;\n }): Promise<string> {\n const user = params?.user ?? this.wallet.publicKey;\n const ix = await this.buildPurchaseFromYieldIx(user);\n return this.sendIx(ix);\n }\n\n // ---------------------------------------------------------------------------\n // Internals\n // ---------------------------------------------------------------------------\n\n /**\n * Token balance helper returning BN(0) if ATA missing.\n */\n private async getTokenBalanceSafe(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}","import {\n Commitment,\n Connection,\n ConnectionConfig,\n PublicKey as SolPubKey,\n Transaction,\n TransactionSignature,\n} from '@solana/web3.js';\nimport { AnchorProvider, BN } from '@coral-xyz/anchor';\nimport { BaseSignerWalletAdapter } from '@solana/wallet-adapter-base';\nimport { ASSOCIATED_TOKEN_PROGRAM_ID, getAssociatedTokenAddressSync, TOKEN_2022_PROGRAM_ID } from '@solana/spl-token';\n\nimport { ChainID, ExternalNetwork, KeyType, PublicKey } from '@wireio/core';\nimport { IStakingClient, Portfolio, StakerConfig } from '../../staker/types';\n\nimport { DepositClient } from './clients/deposit.client';\nimport { DistributionClient } from './clients/distribution.client';\nimport {\n deriveLiqsolMintPda,\n deriveReservePoolPda,\n deriveVaultPda,\n} from './constants';\nimport { SolanaTransaction } from './types';\nimport { LeaderboardClient } from './clients/leaderboard.client';\nimport { OutpostClient } from './clients/outpost.client';\n\nconst commitment: Commitment = 'confirmed';\n\nexport class SolanaStakingClient implements IStakingClient {\n public pubKey: PublicKey;\n public connection: Connection;\n public anchor: AnchorProvider;\n\n private depositClient: DepositClient;\n private distributionClient: DistributionClient;\n private leaderboardClient: LeaderboardClient;\n private outpostClient: OutpostClient;\n\n get solPubKey(): SolPubKey { return new SolPubKey(this.pubKey.data.array); }\n get network() { return this.config.network; }\n\n constructor(private config: StakerConfig) {\n const adapter = config.provider as BaseSignerWalletAdapter;\n if (!adapter?.publicKey) throw new Error('Solana wallet adapter not connected');\n if (!config.network.rpcUrls.length) throw new Error('No RPC URLs provided');\n\n const publicKey = adapter.publicKey;\n const wirePub = new PublicKey(KeyType.ED, publicKey.toBytes());\n if (!wirePub.equals(config.pubKey)) {\n throw new Error(\"Passed-in pubKey doesn't match adapter.publicKey\");\n }\n\n const opts: ConnectionConfig = { commitment };\n if (config.network.rpcUrls.length > 1 && config.network.rpcUrls[1].startsWith('ws')) {\n opts.wsEndpoint = config.network.rpcUrls[1];\n }\n\n const anchorWallet = {\n publicKey,\n async signTransaction<T extends SolanaTransaction>(tx: T): Promise<T> {\n return adapter.signTransaction(tx);\n },\n async signAllTransactions<T extends SolanaTransaction>(txs: T[]): Promise<T[]> {\n return Promise.all(txs.map((tx) => adapter.signTransaction(tx)));\n },\n };\n\n this.pubKey = wirePub;\n this.connection = new Connection(config.network.rpcUrls[0], opts);\n this.anchor = new AnchorProvider(this.connection, anchorWallet, { commitment });\n\n this.depositClient = new DepositClient(this.anchor);\n this.distributionClient = new DistributionClient(this.anchor);\n this.leaderboardClient = new LeaderboardClient(this.anchor);\n this.outpostClient = new OutpostClient(this.anchor);\n }\n\n // ---------------------------------------------------------------------\n // Public IStakingClient Interface Methods\n // ---------------------------------------------------------------------\n\n /**\n * Deposit SOL into liqSOL protocol (liqsol_core deposit flow).\n * @param amountLamports Amount of SOL to deposit (smallest unit)\n * @return Transaction signature\n */\n async deposit(amountLamports: bigint): Promise<string> {\n if (amountLamports <= BigInt(0)) throw new Error('Deposit amount must be greater than zero.');\n // const amount = new BN(amountLamports.toString());\n const tx = await this.depositClient.buildDepositTx(amountLamports);\n const { tx: prepared, blockhash, lastValidBlockHeight } = await this.prepareTx(tx);\n const signed = await this.signTransaction(prepared);\n const result = await this.sendAndConfirmHttp(signed, { blockhash, lastValidBlockHeight });\n return result.signature;\n }\n\n /**\n * Withdraw SOL from liqSOL protocol.\n * (Wire up once you have DepositClient.buildWithdrawTx or equivalent.)\n */\n async withdraw(amountLamports: bigint): Promise<string> {\n throw new Error('Withdraw method not yet implemented.');\n }\n\n /**\n * Stake liqSOL into Outpost (liqSOL -> pool).\n * Matches deposit flow: build -> prepare -> sign -> send/confirm.\n * @param amountLamports Amount of liqSOL to stake (smallest unit)\n */\n async stake(amountLamports: bigint): Promise<string> {\n if (amountLamports <= BigInt(0)) throw new Error('Stake amount must be greater than zero.');\n // const amount = new BN(amountLamports.toString());\n const preIxs = await this.outpostClient.maybeBuildCreateUserAtaIx(this.solPubKey);\n const stakeIx = await this.outpostClient.buildStakeLiqsolIx(amountLamports);\n const tx = new Transaction().add(...preIxs, stakeIx);\n const prepared = await this.prepareTx(tx);\n const signed = await this.signTransaction(prepared.tx);\n const result = await this.sendAndConfirmHttp(signed, prepared);\n return result.signature;\n }\n\n /**\n * Unstake liqSOL from Outpost (pool -> liqSOL).\n * Matches deposit flow: build -> prepare -> sign -> send/confirm.\n * @param amountLamports Amount of liqSOL principal to unstake (smallest unit)\n */\n async unstake(amountLamports: bigint): Promise<string> {\n if (amountLamports <= BigInt(0)) throw new Error('Unstake amount must be greater than zero.');\n const user = this.solPubKey;\n // const amount = new BN(amountLamports.toString());\n const preIxs = await this.outpostClient.maybeBuildCreateUserAtaIx(user);\n const withdrawIx = await this.outpostClient.buildWithdrawStakeIx(amountLamports);\n const tx = new Transaction().add(...preIxs, withdrawIx);\n const prepared = await this.prepareTx(tx);\n const signed = await this.signTransaction(prepared.tx);\n const result = await this.sendAndConfirmHttp(signed, prepared);\n return result.signature;\n }\n\n /**\n * native = SOL in wallet\n * liq = liqSOL token balance (from Token-2022 ATA)\n * staked = Outpost staked liqSOL principal (from wireReceipt.stakedLiqsol)\n * tracked = liqSOL tracked balance (from Distribution.userRecord)\n */\n async getPortfolio(): Promise<Portfolio> {\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 // IMPORTANT: use the SAME read primitive the outpost tests rely on\n const [nativeLamports, actualBalResp, userRecord, snapshot] = await Promise.all([\n this.connection.getBalance(user, \"confirmed\"),\n this.connection.getTokenAccountBalance(userLiqsolAta, \"confirmed\").catch(() => null),\n this.distributionClient.getUserRecord(user).catch(() => null),\n this.outpostClient.getWireStateSnapshot(user).catch(() => null),\n ]);\n\n const LIQSOL_DECIMALS = 9;\n\n const actualAmountStr = actualBalResp?.value?.amount ?? \"0\";\n\n const trackedAmountStr =\n userRecord?.trackedBalance ? userRecord.trackedBalance.toString() : \"0\";\n\n // Snapshot is canonical; receipt may be null if user never staked\n const wireReceipt = snapshot?.wireReceipt ?? null;\n\n const stakedAmountStr =\n wireReceipt?.stakedLiqsol ? wireReceipt.stakedLiqsol.toString() : \"0\";\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 amount: BigInt(stakedAmountStr),\n symbol: \"LiqSOL\",\n decimals: LIQSOL_DECIMALS,\n },\n tracked: {\n amount: BigInt(trackedAmountStr),\n symbol: \"LiqSOL\",\n decimals: LIQSOL_DECIMALS,\n },\n extras: {\n userLiqsolAta: userLiqsolAta.toBase58(),\n reservePoolPDA: reservePoolPDA.toBase58(),\n vaultPDA: vaultPDA.toBase58(),\n wireReceipt,\n },\n chainID: this.network.chainId as ChainID,\n };\n }\n\n // ---------------------------------------------------------------------\n // SOL-only extras\n // ---------------------------------------------------------------------\n\n async getUserRecord() {\n return this.distributionClient.getUserRecord(this.solPubKey);\n }\n\n getProtocolFee() {\n // TODO\n }\n\n async correctBalance(amount?: bigint): Promise<string> {\n const build = await this.distributionClient.buildCorrectRegisterTx({ amount });\n if (!build.canSucceed || !build.transaction) {\n throw new Error(build.reason ?? 'Unable to build Correct&Register transaction');\n }\n\n const { tx, blockhash, lastValidBlockHeight } = await this.prepareTx(build.transaction);\n const signed = await this.signTransaction(tx);\n const result = await this.sendAndConfirmHttp(signed, { blockhash, lastValidBlockHeight });\n return result.signature;\n }\n\n // ---------------------------------------------------------------------\n // Tx helpers\n // ---------------------------------------------------------------------\n\n private async sendAndConfirmHttp(\n signed: SolanaTransaction,\n ctx: { blockhash: string; lastValidBlockHeight: number },\n ): Promise<TxResult> {\n const signature = await this.connection.sendRawTransaction(signed.serialize(), {\n skipPreflight: false,\n preflightCommitment: commitment,\n maxRetries: 3,\n });\n\n const conf = await this.connection.confirmTransaction(\n { signature, blockhash: ctx.blockhash, lastValidBlockHeight: ctx.lastValidBlockHeight },\n commitment,\n );\n\n if (conf.value.err) {\n throw new Error(`Transaction failed: ${JSON.stringify(conf.value.err)}`);\n }\n\n return { signature, slot: conf.context.slot, confirmed: true };\n }\n\n async signTransaction(tx: SolanaTransaction): Promise<SolanaTransaction> {\n return this.anchor.wallet.signTransaction(tx);\n }\n\n async sendTransaction(signed: SolanaTransaction): Promise<TransactionSignature> {\n return this.anchor.sendAndConfirm(signed);\n }\n\n async prepareTx(\n tx: Transaction,\n ): Promise<{ tx: Transaction; blockhash: string; lastValidBlockHeight: number }> {\n const { blockhash, lastValidBlockHeight } = await this.connection.getLatestBlockhash('confirmed');\n tx.recentBlockhash = blockhash;\n tx.feePayer = this.solPubKey;\n return { tx, blockhash, lastValidBlockHeight };\n }\n}\n\nexport interface TxResult {\n signature: string;\n slot: number;\n confirmed: boolean;\n}","/**\n * @module EthereumContractService\n *\n * Provides a unified service for interacting with Ethereum smart contracts using ethers.js.\n */\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';\n// import LiqEthBurnArtifact from '../../assets/ethereum/ABI/liqEth/liqEthBurn.sol/LiqEthBurn.json';\n// import LiqEthMintArtifact from '../../assets/ethereum/ABI/liqEth/liqEthMint.sol/LiqEthMint.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';\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 WarrantArtifact from '../../assets/ethereum/ABI/outpost/Warrant.sol/Warrant.json';\n\n// Currently Unused Artifacts\n// import LiqEthCommonArtifact from '../../assets/ethereum/ABI/liqEth/liqEthCommon.sol/liqEthCommon.json';\n// import RewardsERC20Artifact from '../../assets/ethereum/ABI/liqEth/RewardsERC20.sol/RewardsERC20.json';\n// import ValidatorBalanceArtifact from '../../assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/ValidatorBalanceVerifier.json';\n// import YieldArtifact from '../../assets/ethereum/ABI/liqEth/Yield.sol/YieldOracle.json';\n\nimport ERC20Artifact from '../../assets/ethereum/ABI/token/ERC20Token.sol/ERC20Token.json';\nimport ERC721Artifact from '../../assets/ethereum/ABI/token/ERC721Token.sol/ERC721Token.json';\nimport ERC1155Artifact from '../../assets/ethereum/ABI/token/ERC1155Token.sol/ERC1155Token.json';\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 Accounting: \"0xDf9da63E9CD14c79bD9f0E8F2E797096A40B6031\",\n DepositManager: \"0x3fEd507e554cd0e973CeCAf2168526b1617418d3\",\n LiqEth: \"0x1dA6aB23c2E2fA0a52C74F7f4189F770ED1eF9B3\",\n StakingModule: \"0xBd13C85fdefBBc63904e7301aCdeFE87c9C93234\",\n WithdrawalQueue: \"0xD9A1D38ae4A636DEf20B02F35387a6b126D73fAe\", //aka \"queue\"\n WithdrawalVault: \"0x150334D09a1d3d30EE93d5e6009EB897B5dDF5b2\", //aka withdrawVault\n \n\n //Outpost contracts\n Depositor: \"0x6aE1D7095B81970654Bd51bCAD42825C6E579088\",\n ReceiptNFT: \"0x38eAEa05cB1FFD0c8426A3f9e77815a251DdC197\",\n OutpostManager: \"0x6512bB8E7f8418A8e3bB73c49E33EcC30F53f221\",\n BAR: \"0x00c128A37598d018Eb8ca4f516688695D83bD413\",\n OPP: \"0x8C5710103Ec6a7608dAC539DC232d3822bA3d14C\",\n OPPCommon: \"0x52C1d7F02B35176F79b03F6eF7E5b74b27d1dB8c\",\n OPPInbound: \"0x39feC7536BaEd4E376b1B5cf2f2e8182ab203418\",\n Warrant: \"0x9190bBcaB5cfeb4b7b6DE5Ae21105F3114753F10\",\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 Accounting: {\n address: ADDRESSES.Accounting,\n abi: AccountingArtifact.abi as JsonFragment[],\n },\n LiqEth: {\n address: ADDRESSES.LiqEth,\n abi: LiqEthArtifact.abi as JsonFragment[],\n },\n DepositManager: {\n address: ADDRESSES.DepositManager,\n abi: DepositManagerArtifact.abi as JsonFragment[],\n },\n // LiqEthMint: {\n // address: ADDRESSES.LiqEthMint,\n // abi: LiqEthMintArtifact.abi as JsonFragment[],\n // },\n // LiqEthBurn: {\n // address: ADDRESSES.LiqEthBurn,\n // abi: LiqEthBurnArtifact.abi as JsonFragment[],\n // },\n // RewardsERC20: {\n // address: ADDRESSES.RewardsERC20,\n // abi: RewardsERC20Artifact.abi as JsonFragment[],\n // },\n StakingModule: {\n address: ADDRESSES.StakingModule,\n abi: StakingModuleArtifact.abi as JsonFragment[],\n },\n // ValidatorBalance: {\n // address: ADDRESSES.ValidatorBalance,\n // abi: ValidatorBalanceArtifact.abi as JsonFragment[],\n // },\n WithdrawalQueue: {\n address: ADDRESSES.WithdrawalQueue,\n abi: WithdrawalQueueArtifact.abi as JsonFragment[],\n },\n WithdrawalVault: {\n address: ADDRESSES.WithdrawalVault,\n abi: WithdrawalVaultArtifact.abi as JsonFragment[],\n },\n // Yield: {\n // address: ADDRESSES.Yield,\n // abi: YieldArtifact.abi as JsonFragment[],\n // },\n\n\n // Outpost Contracts\n Depositor: {\n address: ADDRESSES.Depositor,\n abi: DepositorArtifact.abi as JsonFragment[],\n },\n ReceiptNFT: {\n address: ADDRESSES.ReceiptNFT,\n abi: ReceiptNFTArtifact.abi as JsonFragment[],\n },\n OutpostManager: {\n address: ADDRESSES.OutpostManager,\n abi: OutpostManagerArtifact.abi as JsonFragment[],\n },\n BAR: {\n address: ADDRESSES.BAR,\n abi: BARArtifact.abi as JsonFragment[],\n },\n OPP: {\n address: ADDRESSES.OPP,\n abi: OPPArtifact.abi as JsonFragment[],\n },\n OPPCommon: {\n address: ADDRESSES.OPPCommon,\n abi: OPPCommonArtifact.abi as JsonFragment[],\n },\n OPPInbound: {\n address: ADDRESSES.OPPInbound,\n abi: OPPInboundArtifact.abi as JsonFragment[],\n },\n Warrant: {\n address: ADDRESSES.Warrant,\n abi: WarrantArtifact.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}","import { BigNumber, ethers } from \"ethers\";\nimport { DepositEvent, DepositResult } from \"../types\";\nimport { EthereumContractService } from \"../contract\";\n\nexport class DepositClient {\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 throw new Error(\n `Deposit amount below minDeposit: ` +\n `amount=${ethers.utils.formatEther(amountWei)} ETH, ` +\n `min=${ethers.utils.formatEther(minDeposit)} ETH`\n );\n }\n\n // Send the payable tx\n const tx = await this.contract.DepositManager.deposit({\n value: amountWei,\n });\n\n // Wait for 1 confirmation \n const receipt = await tx.wait(1);\n\n // Parse Deposited event if present\n let deposited: DepositEvent | undefined;\n const ev = receipt.events?.find((e) => e.event === 'Deposited');\n\n if (ev && ev.args) {\n const { user, netEth, fee, shares } = ev.args;\n deposited = {\n user,\n netEth: BigNumber.from(netEth),\n fee: BigNumber.from(fee),\n shares: BigNumber.from(shares),\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n deposited,\n };\n }\n\n\n}","import { BigNumber, ethers } from \"ethers\";\nimport { preLaunchReceipt, StakedEvent, StakedResult, WithdrawnStakeEvent, WithdrawnStakeResult } from \"../types\";\nimport { EthereumContractService } from \"../contract\";\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 * Useful for pre-flight checks; will throw with the same revert\n * reason as a real tx if it would fail.\n */\n async simulateStake(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 // stakeLiqEth() doesn't return anything, so we only care if it reverts.\n await this.contract.Depositor.callStatic.stakeLiqETH(amountWei);\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<StakedResult> {\n const liq = this.contract.LiqEth;\n const depositorAddress = this.contract.Depositor.address;\n \n // check allowance\n const allowance = await liq.allowance(signerAddress, depositorAddress);\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('LiqEth');\n\n // currently requested unlimited amount - potentially change to only request up to the current amount?\n const approveAmount = ethers.constants.MaxUint256;\n\n console.warn(`allowance insufficient (${allowance.toString()} < ${amountWei.toString()}); sending approve(${depositorAddress}, ${approveAmount.toString()})`);\n const approveTx = await liqWrite.approve(depositorAddress, approveAmount);\n await approveTx.wait(1);\n\n // re-read allowance to ensure approval succeeded\n const newAllowance = await liq.allowance(signerAddress, depositorAddress);\n if (newAllowance.lt(amountWei)) {\n throw new Error('Approval failed or allowance still insufficient after approve');\n }\n }\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 async getOwnedTokenIdsFor(\n owner: string,\n fromBlock = 1850820,\n toBlock: number | string = \"latest\"\n ): Promise<BigNumber[]> {\n const receiptContract = this.contract.ReceiptNFT;\n\n // Logs where address received tokens\n const toLogs = await receiptContract.queryFilter(\n receiptContract.filters.Transfer(null, owner),\n fromBlock,\n toBlock\n );\n\n // Logs where address sent tokens (including burns from owner → 0)\n const fromLogs = await receiptContract.queryFilter(\n receiptContract.filters.Transfer(owner, null),\n fromBlock,\n toBlock\n );\n\n const owned = new Set<string>();\n\n // Add all received tokenIds\n for (const e of toLogs) {\n const tokenId = e.args?.tokenId;\n if (!tokenId) continue;\n owned.add(tokenId.toString());\n }\n\n // Remove all sent tokenIds\n for (const e of fromLogs) {\n const tokenId = e.args?.tokenId;\n if (!tokenId) continue;\n owned.delete(tokenId.toString());\n }\n\n // Convert to BigNumbers\n return Array.from(owned).map((id) => BigNumber.from(id));\n }\n\n\n /**\n * \n * @param 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 fetchPreLaunchReceipts(address: string): 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 const formattedReceipt = {\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 results.push({ tokenId: idBN.toBigInt(), receipt: formattedReceipt } as any);\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 * @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 { IStakingClient, Portfolio, StakerConfig } from '../../staker/types';\nimport { PublicKey as WirePubKey } from '@wireio/core';\nimport { EthereumContractService } from './contract';\nimport { preLaunchReceipt, WithdrawRequestedEvent, WithdrawResult } from './types';\nimport { DepositClient } from './clients/deposit.client';\nimport { StakeClient } from './clients/stake.client';\n\n\n\nexport class EthereumStakingClient implements IStakingClient {\n public readonly pubKey: WirePubKey;\n private readonly provider: ethers.providers.Web3Provider;\n private readonly signer: ethers.Signer;\n private readonly contractService: EthereumContractService;\n\n private depositClient: DepositClient;\n private stakeClient: StakeClient;\n\n get contract() { return this.contractService.contract; }\n get network() { return this.config.network; }\n\n constructor(private config: StakerConfig) {\n try {\n this.provider = config.provider as ethers.providers.Web3Provider;\n this.signer = this.provider.getSigner();\n this.pubKey = config.pubKey as WirePubKey;\n \n this.contractService = new EthereumContractService({\n provider: this.provider,\n signer: this.signer,\n });\n this.depositClient = new DepositClient(this.contractService);\n this.stakeClient = new StakeClient(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 const amountWei = BigNumber.isBigNumber(amount)\n ? amount\n : BigNumber.from(amount);\n\n const result = await this.depositClient.performDeposit(amountWei);\n return result.txHash;\n }\n\n\n // TODO - In progress\n async withdraw(amount: number | string | bigint | BigNumber): Promise<string> {\n const amountWei = BigNumber.isBigNumber(amount)\n ? amount\n : BigNumber.from(amount);\n\n const result = await this.requestWithdraw(amountWei);\n return result.txHash;\n }\n\n\n // TODO - In progress\n async stake(amount: bigint): Promise<string> {\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 // TODO\n async unstakePrelaunch(tokenId: bigint, recipient: string): Promise<string> {\n const tokenIdBigNum = BigNumber.from(tokenId)\n const result = await this.stakeClient.performWithdrawStake(tokenIdBigNum, recipient);\n return result.txHash;\n }\n\n\n async fetchPrelaunchReceipts(address?: string): Promise<preLaunchReceipt[]> {\n if(address === undefined) address = await this.signer.getAddress();\n \n let receipts = await this.stakeClient.fetchPreLaunchReceipts(address);\n return receipts\n }\n\n \n \n async getEthStats(): Promise<any> {\n let withdrawDelay = await this.contract.DepositManager.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 /**\n * Resolve the user's ETH + liqETH balances.\n *\n * native = ETH in wallet\n * actual = liqETH token balance (ERC-20)\n * tracked = liqETH tracked balance (protocol/accounting view)\n */\n async getPortfolio(): Promise<Portfolio> {\n const walletAddress = await this.signer.getAddress();\n // console.log('getPortfolio() wallet address', walletAddress)\n\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.LiqEth.balanceOf(walletAddress);\n const liqSymbol = 'Liq' + (this.network?.nativeCurrency?.symbol ?? 'ETH');\n\n // 3) staked liqEth ERC-20 balance (actual)\n const stakedLiqBalance = await this.contract.Depositor.sharesOf(walletAddress);\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 tracked: {\n amount: liqBalance.toBigInt(),\n decimals: nativeDecimals,\n symbol: liqSymbol,\n },\n staked: {\n amount: stakedLiqBalance.toBigInt(),\n decimals: nativeDecimals,\n symbol: liqSymbol,\n },\n chainID: this.network.chainId\n }\n // console.log('ETH PORTFOLIO', portfolio);\n return portfolio;\n }\n\n \n // ---------------------------------------------------------------------\n // Internal ETH Staking client helper functions\n // ---------------------------------------------------------------------\n\n private async requestWithdraw(amountWei: BigNumber): 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 const liqEth = this.contract.LiqEth;\n const owner = await this.signer.getAddress();\n const liqEthAddress = this.contractService.getAddress('LiqEth');\n\n const nonce: BigNumber = await liqEth.nonces(owner);\n const chainId = this.network?.chainId ?? (await this.provider.getNetwork()).chainId;\n const domain = {\n name: await liqEth.name(),\n version: '1',\n chainId,\n verifyingContract: liqEthAddress,\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 (this.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 // TODO: implement claimRewards, etc.\n}","// src/staker/staker.ts\n\nimport { ChainID, EvmChainID, SolChainID } from '@wireio/core';\nimport { IStakingClient, StakerConfig } from './types';\nimport { SolanaStakingClient } from '../networks/solana/solana';\nimport { EthereumStakingClient } from '../networks/ethereum/ethereum';\n\nexport class Staker {\n public selectedChainID?: ChainID;\n private clients: Map<ChainID, IStakingClient> = new Map();\n\n /**\n * Get the staking client for the currently selected chain.\n * @returns The staking client instance.\n */\n get client(): IStakingClient | undefined {\n return this.selectedChainID && this.isConfigured(this.selectedChainID)\n ? this.clients.get(this.selectedChainID) : undefined;\n }\n\n /** Is there a client configured for this chain? */\n isConfigured(chainId: ChainID): boolean {\n return this.clients.has(chainId);\n }\n\n /** List of configured chains */\n listConfigured(): ChainID[] {\n return [...this.clients.keys()];\n }\n\n constructor(config: StakerConfig | StakerConfig[], selectedChainID?: ChainID) {\n if (!config) throw new Error('StakerConfig is required');\n if (!Array.isArray(config)) config = [config];\n\n // console.log('STAKER INIT', config);\n\n config.forEach((cfg) => {\n switch (cfg.network.chainId) {\n case SolChainID.WireTestnet:\n this.clients.set(cfg.network.chainId, new SolanaStakingClient(cfg));\n break;\n\n case EvmChainID.Hoodi:\n this.clients.set(EvmChainID.Hoodi, new EthereumStakingClient(cfg));\n break;\n\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 '../../staker/types';\n\nexport const CONTRACT_NAMES = [\n 'Accounting',\n 'DepositManager',\n 'LiqEth',\n // 'LiqEthBurn',\n // 'LiqEthMint',\n // 'RewardsERC20',\n 'StakingModule',\n // 'ValidatorBalance',\n 'WithdrawalQueue',\n 'WithdrawalVault',\n // 'Yield',\n\n //Outpost contracts\n 'Depositor',\n 'ReceiptNFT',\n 'OutpostManager',\n 'BAR',\n 'OPP',\n 'OPPCommon',\n 'OPPInbound',\n 'Warrant',\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 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":["PublicKey","liqSolTokenIDL","validatorLeaderboardIDL","__async","StakeProgram","liqsolCoreJson","Program","getAssociatedTokenAddressSync","TOKEN_2022_PROGRAM_ID","BN","SystemProgram","ASSOCIATED_TOKEN_PROGRAM_ID","SYSVAR_INSTRUCTIONS_PUBKEY","SYSVAR_CLOCK_PUBKEY","SYSVAR_STAKE_HISTORY_PUBKEY","SYSVAR_RENT_PUBKEY","Transaction","getAssociatedTokenAddress","tx","Keypair","AnchorProvider","createAssociatedTokenAccountInstruction","KeyType","Connection","DepositClient","SolPubKey","ethers","Contract","BigNumber","tokenId","SolChainID","EvmChainID"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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EAAA,CAAA;AAAA,KACjD,CAAA,CAAA;AAAA,GAAA;AACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
|