@wireio/stake 0.1.1 → 0.1.3

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.
Files changed (69) hide show
  1. package/lib/stake.browser.js +6681 -115
  2. package/lib/stake.browser.js.map +1 -1
  3. package/lib/stake.d.ts +23 -40
  4. package/lib/stake.js +6684 -120
  5. package/lib/stake.js.map +1 -1
  6. package/lib/stake.m.js +6681 -115
  7. package/lib/stake.m.js.map +1 -1
  8. package/package.json +1 -1
  9. package/src/assets/ethereum/ABI/liqEth/DepositManager.sol/DepositManager.dbg.json +4 -0
  10. package/src/assets/ethereum/ABI/liqEth/DepositManager.sol/DepositManager.json +1153 -0
  11. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IAccounting.dbg.json +4 -0
  12. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IAccounting.json +172 -0
  13. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IDepositContract.dbg.json +4 -0
  14. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IDepositContract.json +39 -0
  15. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IDepositManager.dbg.json +4 -0
  16. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IDepositManager.json +64 -0
  17. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/ILiqEthBurn.dbg.json +4 -0
  18. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/ILiqEthBurn.json +24 -0
  19. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/ILiqEthMint.dbg.json +4 -0
  20. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/ILiqEthMint.json +35 -0
  21. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IRewardsERC20.dbg.json +4 -0
  22. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IRewardsERC20.json +213 -0
  23. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IStakingModule.dbg.json +4 -0
  24. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IStakingModule.json +138 -0
  25. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IValidatorBalanceVerifier.dbg.json +4 -0
  26. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IValidatorBalanceVerifier.json +70 -0
  27. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IWithdrawalRecord.dbg.json +4 -0
  28. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IWithdrawalRecord.json +64 -0
  29. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/LiqEthCommon.dbg.json +4 -0
  30. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/LiqEthCommon.json +10 -0
  31. package/src/assets/ethereum/ABI/liqEth/RewardsERC20.sol/RewardsERC20.dbg.json +4 -0
  32. package/src/assets/ethereum/ABI/liqEth/RewardsERC20.sol/RewardsERC20.json +749 -0
  33. package/src/assets/ethereum/ABI/liqEth/RewardsERC20Pausable.sol/RewardsERC20Pausable.dbg.json +4 -0
  34. package/src/assets/ethereum/ABI/liqEth/RewardsERC20Pausable.sol/RewardsERC20Pausable.json +812 -0
  35. package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/BeaconRoots.dbg.json +4 -0
  36. package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/BeaconRoots.json +10 -0
  37. package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/SSZ.dbg.json +4 -0
  38. package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/SSZ.json +10 -0
  39. package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/ValidatorBalanceVerifier.dbg.json +4 -0
  40. package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/ValidatorBalanceVerifier.json +225 -0
  41. package/src/assets/ethereum/ABI/liqEth/Yield.sol/BeaconRoots.dbg.json +4 -0
  42. package/src/assets/ethereum/ABI/liqEth/Yield.sol/BeaconRoots.json +10 -0
  43. package/src/assets/ethereum/ABI/liqEth/Yield.sol/SSZ.dbg.json +4 -0
  44. package/src/assets/ethereum/ABI/liqEth/Yield.sol/SSZ.json +10 -0
  45. package/src/assets/ethereum/ABI/liqEth/Yield.sol/YieldOracle.dbg.json +4 -0
  46. package/src/assets/ethereum/ABI/liqEth/Yield.sol/YieldOracle.json +813 -0
  47. package/src/assets/ethereum/ABI/liqEth/accounting.sol/Accounting.dbg.json +4 -0
  48. package/src/assets/ethereum/ABI/liqEth/accounting.sol/Accounting.json +651 -0
  49. package/src/assets/ethereum/ABI/liqEth/liqEth.sol/LiqEthToken.dbg.json +4 -0
  50. package/src/assets/ethereum/ABI/liqEth/liqEth.sol/LiqEthToken.json +1110 -0
  51. package/src/assets/ethereum/ABI/liqEth/liqEthBurn.sol/LiqEthBurn.dbg.json +4 -0
  52. package/src/assets/ethereum/ABI/liqEth/liqEthBurn.sol/LiqEthBurn.json +391 -0
  53. package/src/assets/ethereum/ABI/liqEth/liqEthMint.sol/LiqEthMint.dbg.json +4 -0
  54. package/src/assets/ethereum/ABI/liqEth/liqEthMint.sol/LiqEthMint.json +402 -0
  55. package/src/assets/ethereum/ABI/liqEth/stakingModule.sol/StakingModule.dbg.json +4 -0
  56. package/src/assets/ethereum/ABI/liqEth/stakingModule.sol/StakingModule.json +1225 -0
  57. package/src/assets/ethereum/ABI/liqEth/withdrawalQueue.sol/WithdrawalQueue.dbg.json +4 -0
  58. package/src/assets/ethereum/ABI/liqEth/withdrawalQueue.sol/WithdrawalQueue.json +927 -0
  59. package/src/assets/ethereum/ABI/liqEth/withdrawalVault.sol/Uint64BE.dbg.json +4 -0
  60. package/src/assets/ethereum/ABI/liqEth/withdrawalVault.sol/Uint64BE.json +10 -0
  61. package/src/assets/ethereum/ABI/liqEth/withdrawalVault.sol/WithdrawalVault.dbg.json +4 -0
  62. package/src/assets/ethereum/ABI/liqEth/withdrawalVault.sol/WithdrawalVault.json +447 -0
  63. package/src/index.ts +1 -1
  64. package/src/networks/ethereum/contract.ts +53 -90
  65. package/src/networks/ethereum/ethereum.ts +40 -65
  66. package/src/networks/ethereum/types.ts +6 -9
  67. package/src/networks/solana/solana.ts +36 -32
  68. package/src/staker/staker.ts +6 -3
  69. package/src/staker/types.ts +14 -9
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/solana.ts","../src/networks/ethereum/contract.ts","../src/networks/ethereum/ethereum.ts","../src/staker/staker.ts","../src/networks/ethereum/types.ts","../src/networks/solana/utils.ts"],"sourcesContent":["// src/networks/solana/constants.ts\nimport { PublicKey, StakeProgram } from '@solana/web3.js';\n\nimport liqsolCoreIDL from \"../../assets/solana/idl/liqsol_core.json\";\nimport liqSolTokenIDL from \"../../assets/solana/idl/liqsol_token.json\";\nimport validatorLeaderboardIDL from \"../../assets/solana/idl/validator_leaderboard.json\";\n\n/**\n * ---------------------------------------------------------------------------\n * PROGRAM IDS\n * ---------------------------------------------------------------------------\n *\n * These should match:\n * - `metadata.address` in your Anchor IDLs under src/assets/solana/idl/*.json\n * - The program IDs printed by your deploy scripts\n */\n// Extract program IDs from IDL files\nexport const PROGRAM_IDS = {\n LIQSOL_CORE: new PublicKey(liqsolCoreIDL.address),\n LIQSOL_TOKEN: new PublicKey(liqSolTokenIDL.address),\n VALIDATOR_LEADERBOARD: new PublicKey(validatorLeaderboardIDL.address),\n} as const;\n\n// Export individual program IDs for convenience\nexport const {\n LIQSOL_CORE,\n LIQSOL_TOKEN,\n VALIDATOR_LEADERBOARD,\n} = PROGRAM_IDS;\n\n/**\n * ---------------------------------------------------------------------------\n * PDA SEEDS (must match on-chain programs)\n * ---------------------------------------------------------------------------\n *\n * These strings are baked into the on-chain programs and are already used in\n * your test utils. We centralize them here so all clients share them.\n */\n\nexport const PDA_SEEDS = {\n // liqsol_core: deposit / stake controller\n DEPOSIT_AUTHORITY: 'deposit_authority',\n VAULT: 'vault',\n RESERVE_POOL: 'reserve_pool',\n STAKE_CONTROLLER_STATE: 'stake_controller',\n PAYOUT_STATE: 'payout-state',\n\n // liqsol_token: mint + bucket\n LIQSOL_MINT: 'liqsol_mint',\n LIQSOL_MINT_AUTHORITY: 'mint_authority',\n BUCKET_AUTHORITY: 'liqsol_bucket',\n\n // distribution program (embedded in liqsol_core)\n DISTRIBUTION_STATE: 'distribution_state',\n USER_RECORD: 'user_record',\n\n // pay-rate history\n PAY_RATE_HISTORY: 'pay_rate_history',\n\n // validator leaderboard (state + records)\n LEADERBOARD_STATE: 'leaderboard_state',\n VALIDATOR_RECORD: 'validator',\n GLOBAL_STAKE_INFO: 'global_stake_info',\n} as const;\n\n/**\n * Helpers for PDA derivation so clients don’t duplicate logic.\n */\n\nexport const deriveLiqsolMintPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQSOL_MINT)],\n PROGRAM_IDS.LIQSOL_TOKEN,\n )[0];\n\nexport const deriveLiqsolMintAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQSOL_MINT_AUTHORITY)],\n PROGRAM_IDS.LIQSOL_TOKEN,\n )[0];\n\nexport const deriveDepositAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.DEPOSIT_AUTHORITY)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveVaultPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VAULT)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveReservePoolPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.RESERVE_POOL)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveStakeControllerStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.STAKE_CONTROLLER_STATE)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const derivePayoutStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.PAYOUT_STATE)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveBucketAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.BUCKET_AUTHORITY)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveDistributionStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.DISTRIBUTION_STATE)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveUserRecordPda = (user: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.USER_RECORD), user.toBuffer()],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const derivePayRateHistoryPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.PAY_RATE_HISTORY)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\n// export const deriveGlobalStakeInfoPda = () =>\n// PublicKey.findProgramAddressSync(\n// [Buffer.from(PDA_SEEDS.GLOBAL_STAKE_INFO)],\n// PROGRAM_IDS.LIQSOL_CORE,\n// )[0];\n\nexport const deriveLeaderboardStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LEADERBOARD_STATE)],\n PROGRAM_IDS.VALIDATOR_LEADERBOARD,\n )[0];\n\nexport const deriveValidatorRecordPda = (voteAccount: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VALIDATOR_RECORD), voteAccount.toBuffer()],\n PROGRAM_IDS.VALIDATOR_LEADERBOARD,\n )[0];\n\n/**\n* Stake controller vault PDA (reserve pool SOL vault).\n* This is the same as VAULT, but named more explicitly for SDK callers.\n*/\nexport const deriveStakeControllerVaultPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VAULT)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\n/**\n * Ephemeral stake account address used per-deposit.\n * On-chain convention: seed = `ephemeral_<u32>` under StakeProgram.programId.\n */\nexport const deriveEphemeralStakeAddress = async (\n user: PublicKey,\n seed: any,\n): Promise<PublicKey> => {\n const seedStr = `ephemeral_${seed}`;\n return await PublicKey.createWithSeed(user, seedStr, StakeProgram.programId);\n};\n\n\n\n/**\n * ---------------------------------------------------------------------------\n * ECONOMICS & MATH CONSTANTS\n * ---------------------------------------------------------------------------\n */\n\n// Same scale factor used on-chain for pay-rate math\nexport const PAY_RATE_SCALE_FACTOR = BigInt(1_000_000_000_000); // 10^12\n\n// Default pay rate fallback used in tests & utils\nexport const DEFAULT_AVERAGE_PAY_RATE = BigInt(191_780_821);\n\n// How many history entries to average when computing expected fee\nexport const DEFAULT_PAY_RATE_LOOKBACK = 5;\n\n// Rent exemption for ephemeral stake account (lamports)\n// Mirrors EPHEMERAL_RENT_EXEMPTION = 2_282_880 used in tests\nexport const EPHEMERAL_RENT_EXEMPTION = 2_282_880;\n\n// For convenience: lamports <-> SOL helpers (no RPC dependency)\nexport const LAMPORTS_PER_SOL = 1_000_000_000;\n\nexport const lamportsToSol = (lamports: number | bigint): number =>\n Number(lamports) / LAMPORTS_PER_SOL;\n\nexport const solToLamports = (sol: number): number =>\n Math.round(sol * LAMPORTS_PER_SOL);\n\n/**\n * ---------------------------------------------------------------------------\n * CLUSTER / ENVIRONMENT CONFIG (optional but handy)\n * ---------------------------------------------------------------------------\n */\n\nexport type SolanaCluster = 'localnet' | 'devnet' | 'mainnet';\n\n// export interface SolanaStakeProgramAddresses {\n// liqsolCore: PublicKey;\n// liqsolToken: PublicKey;\n// validatorLeaderboard: PublicKey;\n// }\n\n// export const PROGRAMS_BY_CLUSTER: Record<SolanaCluster, SolanaStakeProgramAddresses> = {\n// localnet: {\n// liqsolCore: PROGRAM_IDS.LIQSOL_CORE,\n// liqsolToken: PROGRAM_IDS.LIQSOL_TOKEN,\n// validatorLeaderboard: PROGRAM_IDS.VALIDATOR_LEADERBOARD,\n// },\n// devnet: {\n// liqsolCore: PROGRAM_IDS.LIQSOL_CORE,\n// liqsolToken: PROGRAM_IDS.LIQSOL_TOKEN,\n// validatorLeaderboard: PROGRAM_IDS.VALIDATOR_LEADERBOARD,\n// },\n// mainnet: {\n// liqsolCore: PROGRAM_IDS.LIQSOL_CORE,\n// liqsolToken: PROGRAM_IDS.LIQSOL_TOKEN,\n// validatorLeaderboard: PROGRAM_IDS.VALIDATOR_LEADERBOARD,\n// },\n// };\n\n// export const DEFAULT_CLUSTER: SolanaCluster = 'localnet';\n\n// export function getProgramIds(cluster: SolanaCluster = DEFAULT_CLUSTER): SolanaStakeProgramAddresses {\n// return PROGRAMS_BY_CLUSTER[cluster];\n// }","import { AnchorProvider, Program } from '@coral-xyz/anchor';\n\nimport liqsolCoreJson from '../../assets/solana/idl/liqsol_core.json';\nimport liqsolTokenJson from '../../assets/solana/idl/liqsol_token.json';\nimport validatorLeaderboardJson from '../../assets/solana/idl/validator_leaderboard.json';\n\nimport type { LiqsolCore } from '../../assets/solana/types/liqsol_core';\nimport type { LiqsolToken } from '../../assets/solana/types/liqsol_token';\nimport type { ValidatorLeaderboard } from '../../assets/solana/types/validator_leaderboard';\n\nimport { PROGRAM_IDS } from './constants';\n\ntype Entry<IDL> = {\n idl: IDL & { address: string };\n address: string;\n};\n\nconst PROGRAMS = {\n liqsolCore: {\n idl: liqsolCoreJson,\n address: PROGRAM_IDS.LIQSOL_CORE.toBase58(),\n } as Entry<LiqsolCore>,\n liqsolToken: {\n idl: liqsolTokenJson,\n address: PROGRAM_IDS.LIQSOL_TOKEN.toBase58(),\n } as Entry<LiqsolToken>,\n validatorLeaderboard: {\n idl: validatorLeaderboardJson,\n address: PROGRAM_IDS.VALIDATOR_LEADERBOARD.toBase58(),\n } as Entry<ValidatorLeaderboard>,\n} as const;\n\nexport type SolanaProgramName = keyof typeof PROGRAMS;\n\nexport class SolanaProgramService {\n constructor(private provider: AnchorProvider) { }\n\n getProgram<K extends SolanaProgramName>(name: K): Program<(typeof PROGRAMS)[K]['idl']> {\n const { idl, address } = PROGRAMS[name];\n const idlWithAddr = { ...idl, address };\n return new Program(idlWithAddr, this.provider) as Program<(typeof PROGRAMS)[K]['idl']>;\n }\n\n listProgramNames(): SolanaProgramName[] {\n return Object.keys(PROGRAMS) as SolanaProgramName[];\n }\n}","import { AnchorProvider, BN, Program } from '@coral-xyz/anchor';\nimport {\n PublicKey,\n SystemProgram,\n Transaction,\n TransactionInstruction,\n StakeProgram,\n SYSVAR_INSTRUCTIONS_PUBKEY,\n SYSVAR_CLOCK_PUBKEY,\n SYSVAR_RENT_PUBKEY,\n SYSVAR_STAKE_HISTORY_PUBKEY,\n} from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddressSync,\n} from '@solana/spl-token';\n\nimport { SolanaProgramService } from '../program';\nimport type { LiqsolCore } from '../../../assets/solana/types/liqsol_core';\n\nimport {\n PROGRAM_IDS,\n deriveDepositAuthorityPda,\n deriveLiqsolMintPda,\n deriveLiqsolMintAuthorityPda,\n deriveReservePoolPda,\n deriveVaultPda,\n deriveStakeControllerStatePda,\n deriveBucketAuthorityPda,\n derivePayRateHistoryPda,\n deriveDistributionStatePda,\n deriveUserRecordPda,\n derivePayoutStatePda,\n deriveEphemeralStakeAddress,\n} from '../constants';\n\nexport class DepositClient {\n private program: Program<LiqsolCore>;\n\n constructor(private provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('liqsolCore');\n }\n\n async buildDepositTx(\n user: PublicKey,\n lamports: number\n ): Promise<{ transaction: Transaction; ephemeralStake: PublicKey }> {\n\n const program = this.program;\n\n // -------------------------------------------------------------\n // PDAs\n // -------------------------------------------------------------\n const depositAuthority = deriveDepositAuthorityPda();\n const liqsolMint = deriveLiqsolMintPda();\n const liqsolMintAuthority = deriveLiqsolMintAuthorityPda();\n const reservePool = deriveReservePoolPda();\n const vault = deriveVaultPda();\n const controllerState = deriveStakeControllerStatePda();\n const payoutState = derivePayoutStatePda();\n const bucketAuthority = deriveBucketAuthorityPda();\n const payRateHistory = derivePayRateHistoryPda();\n const distributionState = deriveDistributionStatePda();\n const userRecord = deriveUserRecordPda(user);\n\n // -------------------------------------------------------------\n // Token-2022 ATAs\n // -------------------------------------------------------------\n const userAta = getAssociatedTokenAddressSync(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID\n );\n\n const bucketTokenAccount = getAssociatedTokenAddressSync(\n liqsolMint,\n bucketAuthority,\n true,\n TOKEN_2022_PROGRAM_ID\n );\n\n // -------------------------------------------------------------\n // Ephemeral stake\n // -------------------------------------------------------------\n const seed = Math.floor(Math.random() * 2 ** 32);\n const ephemeralStake = await deriveEphemeralStakeAddress(user, seed);\n\n // -------------------------------------------------------------\n // BUILD IX (MUST MATCH IDL)\n // -------------------------------------------------------------\n const ix: TransactionInstruction = await program.methods\n .deposit(new BN(lamports), seed)\n .accounts({\n user,\n depositAuthority,\n systemProgram: SystemProgram.programId,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n liqsolProgram: PROGRAM_IDS.LIQSOL_TOKEN,\n stakeProgram: StakeProgram.programId,\n\n liqsolMint,\n userAta,\n liqsolMintAuthority,\n reservePool,\n vault,\n ephemeralStake,\n\n controllerState,\n payoutState,\n bucketAuthority,\n bucketTokenAccount,\n\n userRecord,\n distributionState,\n payRateHistory,\n\n instructionsSysvar: SYSVAR_INSTRUCTIONS_PUBKEY,\n clock: SYSVAR_CLOCK_PUBKEY,\n stakeHistory: SYSVAR_STAKE_HISTORY_PUBKEY,\n rent: SYSVAR_RENT_PUBKEY,\n })\n .instruction();\n\n const tx = new Transaction().add(ix);\n return { transaction: tx, ephemeralStake };\n }\n}","import { AnchorProvider, Program } from '@coral-xyz/anchor';\nimport {\n ParsedAccountData,\n PublicKey,\n SYSVAR_INSTRUCTIONS_PUBKEY,\n Transaction,\n SystemProgram,\n} from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n getAssociatedTokenAddress,\n} from '@solana/spl-token';\n\nimport { SolanaProgramService } from '../program';\nimport type { LiqsolCore } from '../../../assets/solana/types/liqsol_core';\nimport {\n deriveBucketAuthorityPda,\n deriveDistributionStatePda,\n deriveLiqsolMintPda,\n derivePayRateHistoryPda,\n deriveUserRecordPda,\n} from '../constants';\nimport type { CorrectRegisterBuildResult, DistributionState, MismatchCandidate, ParsedAccountInfo, UserRecord } from '../types';\n\n/**\n * Distribution client – wraps the distribution portion of the liqsol_core\n * program. Responsible for:\n * - Reading DistributionState + UserRecord\n * - Computing mismatch candidates (tracked > actual)\n * - Building a \"correct then register\" transaction for the caller\n *\n * Aligned with the on-chain `update_user` script:\n * - Single `updateUser()` entrypoint that:\n * * Can create userRecord if missing\n * * Reconciles tracked vs actual using user, userAta, bucket, pay-rate\n */\nexport class DistributionClient {\n private program: Program<LiqsolCore>;\n\n constructor(private provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('liqsolCore');\n }\n\n get connection() {\n return this.provider.connection;\n }\n\n /**\n * Fetch the global distribution state account.\n */\n async getDistributionState(): Promise<DistributionState | null> {\n const pda = deriveDistributionStatePda();\n try {\n // IDL account name: \"distributionState\"\n return await this.program.account.distributionState.fetch(pda);\n } catch {\n return null;\n }\n }\n\n /**\n * Fetch a user's distribution userRecord (or null if missing).\n */\n async getUserRecord(user: PublicKey): Promise<UserRecord | null> {\n const pda = deriveUserRecordPda(user);\n try {\n return await this.program.account.userRecord.fetchNullable(pda);\n } catch {\n return null;\n }\n }\n\n /**\n * Helper: get actual liqSOL balances for all token holders.\n *\n * Returns a map: owner (base58) -> actual balance (BigInt)\n */\n private async getActualBalancesByOwner(): Promise<Map<string, bigint>> {\n const liqsolMint = deriveLiqsolMintPda();\n const mintStr = liqsolMint.toBase58();\n\n const accounts = await this.connection.getParsedProgramAccounts(\n TOKEN_2022_PROGRAM_ID,\n {\n filters: [\n // SPL token layout: mint at offset 0\n { memcmp: { offset: 0, bytes: mintStr } },\n ],\n commitment: 'confirmed',\n },\n );\n\n const byOwner = new Map<string, bigint>();\n\n for (const acct of accounts) {\n const data = acct.account.data as ParsedAccountData;\n const parsed = data.parsed;\n if (!parsed || parsed.type !== 'account') continue;\n\n const info: ParsedAccountInfo = parsed.info;\n const ownerStr = info.owner;\n const amountStr = info.tokenAmount.amount;\n const amount = BigInt(amountStr);\n\n const prev = byOwner.get(ownerStr) ?? BigInt(0);\n byOwner.set(ownerStr, prev + amount);\n }\n\n return byOwner;\n }\n\n /**\n * Helper: get tracked balances from all userRecord accounts,\n * keyed by *actual wallet owner*, not the userRecord PDA.\n *\n * userRecord struct:\n * - userAta: pubkey\n * - trackedBalance: u64\n * - claimBalance: u64\n * - lastClaimTimestamp: i64\n * - bump: u8\n */\n private async getTrackedBalances(): Promise<\n Map<string, { owner: PublicKey; tracked: bigint }>\n > {\n const records = await this.program.account.userRecord.all();\n const map = new Map<string, { owner: PublicKey; tracked: bigint }>();\n\n for (const r of records) {\n const ur = r.account as UserRecord;\n const userAta = ur.userAta as PublicKey;\n\n // Resolve the *wallet* that owns this ATA\n const ataInfo = await this.connection.getParsedAccountInfo(userAta);\n const parsedData = ataInfo.value?.data as ParsedAccountData | undefined;\n if (!parsedData) continue;\n\n const parsed = parsedData.parsed;\n if (!parsed || (parsed as any).type !== 'account') continue;\n\n const info: ParsedAccountInfo = parsed.info;\n const ownerStr = info.owner;\n const owner = new PublicKey(ownerStr);\n\n const tracked = BigInt(ur.trackedBalance.toString());\n map.set(ownerStr, { owner, tracked });\n }\n\n return map;\n }\n\n /**\n * Discover all mismatch candidates where tracked > actual.\n *\n * - actual balances are derived from token accounts for the liqSOL mint\n * - tracked balances come from Distribution.userRecord\n */\n private async deriveMismatchCandidates(): Promise<MismatchCandidate[]> {\n const [actualByOwner, trackedByOwner] = await Promise.all([\n this.getActualBalancesByOwner(),\n this.getTrackedBalances(),\n ]);\n\n const out: MismatchCandidate[] = [];\n\n for (const [ownerStr, { owner, tracked }] of trackedByOwner.entries()) {\n const actual = actualByOwner.get(ownerStr) ?? BigInt(0);\n const delta = tracked - actual;\n if (delta > BigInt(0)) {\n out.push({ owner, actual, tracked, delta });\n }\n }\n\n // Largest discrepancy first\n out.sort((a, b) => (b.delta > a.delta ? 1 : b.delta < a.delta ? -1 : 0));\n return out;\n }\n\n /**\n * Canonical helper to build an `updateUser` instruction for a given user,\n * matching the standalone update-user.ts script.\n */\n private async buildUpdateUserIx(targetUser: PublicKey) {\n const walletPk = this.provider.wallet.publicKey;\n\n const distributionStatePDA = deriveDistributionStatePda();\n const userRecordPDA = deriveUserRecordPda(targetUser);\n const liqsolMintPDA = deriveLiqsolMintPda();\n const payRateHistoryPDA = derivePayRateHistoryPda();\n const bucketAuthorityPDA = deriveBucketAuthorityPda();\n\n const userAta = await getAssociatedTokenAddress(\n liqsolMintPDA,\n targetUser,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n const bucketTokenAccount = await getAssociatedTokenAddress(\n liqsolMintPDA,\n bucketAuthorityPDA,\n true, // allowOwnerOffCurve\n TOKEN_2022_PROGRAM_ID,\n );\n\n return (this.program.methods as any)\n .updateUser()\n .accounts({\n user: targetUser,\n userAta,\n userRecord: userRecordPDA,\n authority: walletPk,\n payer: walletPk,\n distributionState: distributionStatePDA,\n liqsolMint: liqsolMintPDA,\n instructionsSysvar: SYSVAR_INSTRUCTIONS_PUBKEY,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n bucketAuthority: bucketAuthorityPDA,\n bucketTokenAccount,\n payRateHistory: payRateHistoryPDA,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n /**\n * Build the \"correct & register\" transaction.\n *\n * - Fetches DistributionState + all userRecords + token holders\n * - Computes caller's untracked amount (actual - tracked)\n * - If DistributionState.availableBalance already covers that, we only\n * send updateUser(caller).\n * - Otherwise we select top mismatch candidates until their freed deltas\n * cover the shortfall, then build updateUser(target) for each,\n * followed by updateUser(caller).\n *\n * NOTE:\n * - This no longer uses a separate updateSpecificUser; the single\n * updateUser entrypoint accepts any `user` as long as authority/payer\n * are valid, per your script.\n */\n async buildCorrectRegisterTx(opts: {\n amount?: bigint;\n maxCandidates?: number;\n } = {}): Promise<CorrectRegisterBuildResult> {\n const walletPk = this.provider.wallet.publicKey;\n const callerStr = walletPk.toBase58();\n\n const [distState, actualByOwner, trackedByOwner] = await Promise.all([\n this.getDistributionState(),\n this.getActualBalancesByOwner(),\n this.getTrackedBalances(),\n ]);\n\n if (!distState) {\n return {\n needToRegister: false,\n canSucceed: false,\n reason: 'DistributionState not initialized',\n transaction: undefined,\n plan: { deficit: BigInt(0), willFree: BigInt(0), selected: [] },\n };\n }\n\n const availableBalance = BigInt(distState.availableBalance.toString());\n\n const trackedEntry =\n trackedByOwner.get(callerStr) ?? {\n owner: walletPk,\n tracked: BigInt(0),\n };\n\n const actual = actualByOwner.get(callerStr) ?? BigInt(0);\n const tracked = trackedEntry.tracked;\n const untracked = actual - tracked;\n\n // Nothing to register\n if (untracked <= BigInt(0)) {\n return {\n needToRegister: false,\n canSucceed: true,\n reason: 'No untracked liqSOL to register',\n transaction: undefined,\n plan: { deficit: BigInt(0), willFree: BigInt(0), selected: [] },\n };\n }\n\n // Optional user-specified cap on how much to register.\n const targetRegister =\n opts.amount && opts.amount > BigInt(0) ? opts.amount : untracked;\n\n // Simple case: availableBalance already covers what we want to register\n if (availableBalance >= targetRegister) {\n const tx = new Transaction();\n const ix = await this.buildUpdateUserIx(walletPk); // caller only\n tx.add(ix);\n\n return {\n needToRegister: true,\n canSucceed: true,\n transaction: tx,\n plan: { deficit: BigInt(0), willFree: BigInt(0), selected: [] },\n };\n }\n\n // Need to free up more availableBalance by correcting others.\n const deficit = targetRegister - availableBalance;\n\n const allCandidates = await this.deriveMismatchCandidates();\n const maxCandidates = opts.maxCandidates ?? 10;\n\n const selected: MismatchCandidate[] = [];\n let willFree = BigInt(0);\n\n for (const c of allCandidates) {\n if (c.owner.equals(walletPk)) continue; // don't self-correct here\n selected.push(c);\n willFree += c.delta;\n if (willFree >= deficit || selected.length >= maxCandidates) break;\n }\n\n if (willFree < deficit) {\n return {\n needToRegister: true,\n canSucceed: false,\n reason: 'Not enough mismatched candidates to cover deficit',\n transaction: undefined,\n plan: { deficit, willFree, selected },\n };\n }\n\n const tx = new Transaction();\n\n // 1) Correct selected mismatched users.\n for (const c of selected) {\n const ix = await this.buildUpdateUserIx(c.owner);\n tx.add(ix);\n }\n\n // 2) Register caller (updateUser(caller)).\n {\n const ix = await this.buildUpdateUserIx(walletPk);\n tx.add(ix);\n }\n\n return {\n needToRegister: true,\n canSucceed: true,\n transaction: tx,\n plan: { deficit, willFree, selected },\n };\n }\n}","import { AnchorProvider, Program } from '@coral-xyz/anchor';\nimport { PublicKey } from '@solana/web3.js';\n\nimport { SolanaProgramService } from '../program';\nimport type { ValidatorLeaderboard } from '../../../assets/solana/types/validator_leaderboard';\nimport {\n deriveLeaderboardStatePda,\n deriveValidatorRecordPda,\n} from '../constants';\n\n/**\n * Simple read client for the validator_leaderboard program.\n *\n * Adjust account names/fields to match your IDL (state, validatorRecord, etc).\n */\nexport class LeaderboardClient {\n private program: Program<ValidatorLeaderboard>;\n\n constructor(private provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('validatorLeaderboard');\n }\n\n async getState(): Promise<any | null> {\n const pda = deriveLeaderboardStatePda();\n try {\n // Assumes account name \"leaderboardState\"\n return await this.program.account.leaderboardState.fetch(pda);\n } catch {\n return null;\n }\n }\n\n async getValidatorRecord(voteAccount: PublicKey): Promise<any | null> {\n const pda = deriveValidatorRecordPda(voteAccount);\n try {\n // Assumes account name \"validatorRecord\"\n return await this.program.account.validatorRecord.fetchNullable(pda);\n } catch {\n return null;\n }\n }\n\n /**\n * Convenience helper to fetch and sort top validators by score.\n * Assumes `validatorRecord` has a numeric `score` field in the IDL.\n */\n async getTopValidators(limit = 20): Promise<any[]> {\n const records = await (this.program.account as any).validatorRecord.all();\n const sorted = (records as Array<{ publicKey: PublicKey; account: any }>).sort(\n (a, b) => {\n const sa = BigInt(a.account.score?.toString?.() ?? '0');\n const sb = BigInt(b.account.score?.toString?.() ?? '0');\n return sb > sa ? 1 : sb < sa ? -1 : 0;\n },\n );\n return sorted.slice(0, limit);\n }\n}","import {\n Commitment,\n Connection,\n ConnectionConfig,\n PublicKey as SolPubKey,\n Transaction,\n TransactionSignature,\n} from '@solana/web3.js';\nimport { AnchorProvider } from '@coral-xyz/anchor';\nimport { BaseSignerWalletAdapter } from '@solana/wallet-adapter-base';\nimport { getAssociatedTokenAddressSync, TOKEN_2022_PROGRAM_ID } from '@solana/spl-token';\n\nimport { ChainID, ExternalNetwork, KeyType, PublicKey } from '@wireio/core';\nimport { IStakingClient, Portfolio, StakerConfig } from '../../staker/types';\n\nimport { DepositClient } from './clients/deposit.client';\nimport { DistributionClient } from './clients/distribution.client';\nimport {\n deriveLiqsolMintPda,\n deriveReservePoolPda,\n deriveVaultPda,\n} from './constants';\nimport { SolanaTransaction, UserRecord } from './types';\nimport { LeaderboardClient } from './clients/leaderboard.client';\n\nconst commitment: Commitment = 'confirmed';\n\nexport class SolanaStakingClient implements IStakingClient {\n public pubKey: PublicKey;\n public connection: Connection;\n public anchor: AnchorProvider;\n\n private depositClient: DepositClient;\n private distributionClient: DistributionClient;\n private leaderboardClient: LeaderboardClient;\n\n get solPubKey(): SolPubKey {\n return new SolPubKey(this.pubKey.data.array);\n }\n\n get network() {\n return this.config.network;\n }\n\n constructor(private config: StakerConfig) {\n const adapter = config.provider as BaseSignerWalletAdapter;\n if (!adapter.publicKey) {\n throw new Error('Solana wallet adapter not connected');\n }\n if (!config.network.rpcUrls.length) {\n throw new Error('No RPC URLs provided');\n }\n\n const publicKey = adapter.publicKey;\n const wirePub = new PublicKey(KeyType.ED, publicKey.toBytes());\n if (!wirePub.equals(config.pubKey)) {\n throw new Error(\"Passed-in pubKey doesn't match adapter.publicKey\");\n }\n\n const opts: ConnectionConfig = { commitment };\n if (config.network.rpcUrls.length > 1 && config.network.rpcUrls[1].startsWith('ws')) {\n opts.wsEndpoint = config.network.rpcUrls[1];\n }\n\n this.pubKey = wirePub;\n this.connection = new Connection(config.network.rpcUrls[0], opts);\n\n const anchorWallet = {\n publicKey,\n async signTransaction<T extends SolanaTransaction>(tx: T): Promise<T> {\n return adapter.signTransaction(tx);\n },\n async signAllTransactions<T extends SolanaTransaction>(txs: T[]): Promise<T[]> {\n return Promise.all(txs.map((tx) => adapter.signTransaction(tx)));\n },\n };\n\n this.anchor = new AnchorProvider(this.connection, anchorWallet, { commitment });\n\n this.depositClient = new DepositClient(this.anchor);\n this.distributionClient = new DistributionClient(this.anchor);\n this.leaderboardClient = new LeaderboardClient(this.anchor);\n }\n\n /**\n * Resolve the user's liqSOL ATA and balances + key protocol balances.\n * native = SOL in wallet\n * actual = liqSOL token balance (from ATA)\n * tracked = liqSOL tracked balance (from Distribution.userRecord)\n */\n async getPortfolio(): Promise<Portfolio> {\n try {\n const user = this.solPubKey;\n const reservePoolPDA = deriveReservePoolPda();\n const vaultPDA = deriveVaultPda();\n const liqsolMint = deriveLiqsolMintPda();\n const userLiqsolAta = getAssociatedTokenAddressSync(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n const [nativeLamports, actualBalResp, userRecord] = await Promise.all([\n this.connection.getBalance(user),\n this.connection.getTokenAccountBalance(userLiqsolAta).catch(() => null),\n this.distributionClient.getUserRecord(user).catch(() => null),\n ]);\n\n const actualAmountStr = actualBalResp?.value?.amount ?? '0';\n const actualDecimals = actualBalResp?.value?.decimals ?? 9;\n\n const trackedAmountStr = userRecord?.trackedBalance\n ? userRecord.trackedBalance.toString()\n : '0';\n const trackedDecimals = actualDecimals;\n\n const portfolio: Portfolio = {\n native: {\n symbol: 'SOL',\n decimals: 9,\n amount: BigInt(nativeLamports),\n },\n actual: {\n symbol: 'LiqSOL',\n decimals: actualDecimals,\n amount: BigInt(actualAmountStr),\n },\n tracked: {\n symbol: 'LiqSOL',\n decimals: trackedDecimals,\n amount: BigInt(trackedAmountStr),\n },\n extras: {\n userLiqsolAta: userLiqsolAta.toBase58(),\n reservePoolPDA: reservePoolPDA.toBase58(),\n vaultPDA: vaultPDA.toBase58(),\n },\n };\n\n return portfolio;\n }\n catch (error) {\n console.log('Error in getPortfolio:', error);\n throw error;\n }\n }\n\n /**\n * Optional: fetch your Distribution program user record\n * (often contains per-user deposit/claim state).\n * @returns UserRecord or null\n */\n async getUserRecord() {\n return this.distributionClient.getUserRecord(this.solPubKey);\n }\n\n getProtocolFee() {\n // TODO: wire to pay-rate math once we finalize protocol fee API\n }\n\n /**\n * Build, sign, and submit a single transaction that:\n * - Corrects other users (if needed) to free available balance, then\n * - Registers the caller’s untracked liqSOL.\n *\n * @param amount Optional: register a smaller amount than your full untracked balance.\n * @returns signature string\n */\n async register(amount?: bigint): Promise<string> {\n try {\n const build = await this.distributionClient.buildCorrectRegisterTx({ amount });\n if (!build.canSucceed || !build.transaction) {\n throw new Error(build.reason ?? 'Unable to build Correct&Register transaction');\n }\n\n const { tx, blockhash, lastValidBlockHeight } = await this.prepareTx(build.transaction);\n const signed = await this.signTransaction(tx);\n const result = await this.sendAndConfirmHttp(signed, { blockhash, lastValidBlockHeight });\n\n console.log('Registered:', {\n needToRegister: build.needToRegister,\n freed: build.plan.willFree,\n corrected: build.plan.selected.map((c) => ({\n owner: c.owner?.toBase58(),\n delta: c.delta?.toString(),\n })),\n });\n\n return result.signature;\n } catch (error) {\n console.error('Error in register:', error);\n throw error;\n }\n }\n\n /**\n * Deposit funds into the staking pool.\n * @param lamports The amount to deposit (in lamports).\n * @returns The transaction signature.\n */\n async deposit(lamports: number): Promise<string> {\n const { transaction } = await this.depositClient.buildDepositTx(this.solPubKey, lamports);\n const { tx, blockhash, lastValidBlockHeight } = await this.prepareTx(transaction);\n const signed = await this.signTransaction(tx);\n const result = await this.sendAndConfirmHttp(signed, { blockhash, lastValidBlockHeight });\n return result.signature;\n }\n\n private async sendAndConfirmHttp(\n signed: SolanaTransaction,\n ctx: { blockhash: string; lastValidBlockHeight: number },\n ): Promise<TxResult> {\n const signature = await this.connection.sendRawTransaction(signed.serialize(), {\n skipPreflight: false,\n preflightCommitment: commitment,\n maxRetries: 3,\n });\n\n const conf = await this.connection.confirmTransaction(\n { signature, blockhash: ctx.blockhash, lastValidBlockHeight: ctx.lastValidBlockHeight },\n commitment,\n );\n\n const ok = !conf.value.err;\n if (!ok) {\n throw new Error(`Transaction failed: ${JSON.stringify(conf.value.err)}`);\n }\n return { signature, slot: conf.context.slot, confirmed: true };\n }\n\n async signTransaction(tx: SolanaTransaction): Promise<SolanaTransaction> {\n return this.anchor.wallet.signTransaction(tx);\n }\n\n async sendTransaction(signed: SolanaTransaction): Promise<TransactionSignature> {\n return this.anchor.sendAndConfirm(signed);\n }\n\n async prepareTx(\n tx: Transaction,\n ): Promise<{ tx: Transaction; blockhash: string; lastValidBlockHeight: number }> {\n const { blockhash, lastValidBlockHeight } = await this.connection.getLatestBlockhash('confirmed');\n tx.recentBlockhash = blockhash;\n tx.feePayer = this.solPubKey;\n\n return { tx, blockhash, lastValidBlockHeight };\n }\n}\n\nexport interface TxResult {\n signature: string;\n slot: number;\n confirmed: boolean;\n}","/**\n * @module EthereumContractService\n *\n * Provides a unified service for interacting with Ethereum smart contracts using ethers.js.\n */\n// TODO: adjust these import paths to your actual artifact layout\n// import DepositManagerArtifact from '../../assets/ethereum/ABI/liqeth/DepositManager.sol/DepositManager.json';\n// import LiqEthArtifact from '../../assets/ethereum/ABI/liqeth/liqEth.sol/liqEth.json';\n// import LiqEthMintArtifact from '../../assets/ethereum/ABI/liqeth/liqEthMint.sol/liqEthMint.json';\n// import LiqEthBurnArtifact from '../../assets/ethereum/ABI/liqeth/liqEthBurn.sol/liqEthBurn.json';\n// import LiqEthTreasuryArtifact from '../../assets/ethereum/ABI/liqeth/liqEthTreasury.sol/liqEthTreasury.json';\n// import LiqEthCommonArtifact from '../../assets/ethereum/ABI/liqeth/LiqEthCommon.sol/LiqEthCommon.json';\n// import RewardsERC20Artifact from '../../assets/ethereum/ABI/liqeth/RewardsERC20.sol/RewardsERC20.json';\n// import ValidatorBalanceVerifierArtifact from '../../assets/ethereum/ABI/liqeth/ValidatorBalanceVerifier.sol/ValidatorBalanceVerifier.json';\n// import YieldArtifact from '../../assets/ethereum/ABI/liqeth/Yield.sol/Yield.json';\n// import AccountingArtifact from '../../assets/ethereum/ABI/liqeth/accounting.sol/accounting.json';\n// import StakingModuleArtifact from '../../assets/ethereum/ABI/liqeth/stakingModule.sol/stakingModule.json';\n// import WithdrawalQueueArtifact from '../../assets/ethereum/ABI/liqeth/withdrawalQueue.sol/withdrawalQueue.json';\n// import WithdrawalVaultArtifact from '../../assets/ethereum/ABI/liqeth/withdrawalVault.sol/withdrawalVault.json';\n\nimport ERC20Artifact from '../../assets/ethereum/ABI/token/ERC20Token.sol/ERC20Token.json';\nimport ERC721Artifact from '../../assets/ethereum/ABI/token/ERC721Token.sol/ERC721Token.json';\nimport ERC1155Artifact from '../../assets/ethereum/ABI/token/ERC1155Token.sol/ERC1155Token.json';\nimport { AddressBook, ContractName } from './types';\nimport { Contract, ethers, providers, Signer } from 'ethers';\nimport { JsonFragment } from '@ethersproject/abi';\nimport { ErrorDescription } from '@ethersproject/abi/lib/interface';\n\nexport const ERC20Abi = ERC20Artifact.abi;\nexport const ERC721Abi = ERC721Artifact.abi;\nexport const ERC1155Abi = ERC1155Artifact.abi;\n\n// -----------------------------------------------------------------------------\n// Address book\n// -----------------------------------------------------------------------------\n\n// Make sure ContractName in ./types includes all of these keys.\nexport const ADDRESSES: AddressBook = {\n // Outpost/Stake entrypoint\n Stake: '0xEeaCBa95852324eAc63fE2711aFe0283adf3bC93', // TODO\n\n // liqETH protocol suite\n DepositManager: '0xDepositManagerAddress',\n LiqEth: '0xLiqEthTokenAddress',\n LiqEthMint: '0xLiqEthMintAddress',\n LiqEthBurn: '0xLiqEthBurnAddress',\n LiqEthTreasury: '0xLiqEthTreasuryAddress',\n LiqEthCommon: '0xLiqEthCommonAddress',\n RewardsERC20: '0xRewardsErc20Address',\n ValidatorBalanceVerifier: '0xValidatorBalanceVerifierAddress',\n Yield: '0xYieldAddress',\n Accounting: '0xAccountingAddress',\n StakingModule: '0xStakingModuleAddress',\n WithdrawalQueue: '0xWithdrawalQueueAddress',\n WithdrawalVault: '0xWithdrawalVaultAddress',\n};\n\nexport type Contracts<T extends string = ContractName> = Record<T, ContractConfig>;\n\nexport type ContractConfig = {\n address: string;\n abi: JsonFragment[];\n};\n\n// -----------------------------------------------------------------------------\n// Contract config\n// -----------------------------------------------------------------------------\n\nexport const CONTRACTS: Contracts<ContractName> = {\n // Outpost/Stake (wire ABI when available)\n Stake: { address: ADDRESSES.Stake, abi: undefined as any }, // TODO: Stake artifact\n\n // liqETH suite\n LiqEth: {\n address: ADDRESSES.LiqEth,\n abi: undefined as any,\n // abi: LiqEthArtifact.abi as JsonFragment[],\n },\n DepositManager: {\n address: ADDRESSES.DepositManager,\n abi: undefined as any,\n // abi: DepositManagerArtifact.abi as JsonFragment[],\n },\n LiqEthMint: {\n address: ADDRESSES.LiqEthMint,\n abi: undefined as any,\n // abi: LiqEthMintArtifact.abi as JsonFragment[],\n },\n LiqEthBurn: {\n address: ADDRESSES.LiqEthBurn,\n abi: undefined as any,\n // abi: LiqEthBurnArtifact.abi as JsonFragment[],\n },\n LiqEthTreasury: {\n address: ADDRESSES.LiqEthTreasury,\n abi: undefined as any,\n // abi: LiqEthTreasuryArtifact.abi as JsonFragment[],\n },\n LiqEthCommon: {\n address: ADDRESSES.LiqEthCommon,\n abi: undefined as any,\n // abi: LiqEthCommonArtifact.abi as JsonFragment[],\n },\n RewardsERC20: {\n address: ADDRESSES.RewardsERC20,\n abi: undefined as any,\n // abi: RewardsERC20Artifact.abi as JsonFragment[],\n },\n ValidatorBalanceVerifier: {\n address: ADDRESSES.ValidatorBalanceVerifier,\n abi: undefined as any,\n // abi: ValidatorBalanceVerifierArtifact.abi as JsonFragment[],\n },\n Yield: {\n address: ADDRESSES.Yield,\n abi: undefined as any,\n // abi: YieldArtifact.abi as JsonFragment[],\n },\n Accounting: {\n address: ADDRESSES.Accounting,\n abi: undefined as any,\n // abi: AccountingArtifact.abi as JsonFragment[],\n },\n StakingModule: {\n address: ADDRESSES.StakingModule,\n abi: undefined as any,\n // abi: StakingModuleArtifact.abi as JsonFragment[],\n },\n WithdrawalQueue: {\n address: ADDRESSES.WithdrawalQueue,\n abi: undefined as any,\n // abi: WithdrawalQueueArtifact.abi as JsonFragment[],\n },\n WithdrawalVault: {\n address: ADDRESSES.WithdrawalVault,\n abi: undefined as any,\n // abi: WithdrawalVaultArtifact.abi as JsonFragment[],\n },\n};\n\nexport interface ContractOptions {\n /** RPC endpoint or injected EIP-1193 provider */\n provider?: ethers.providers.Provider;\n /** Only required if you need to send txns */\n signer?: Signer;\n}\n\nexport class EthereumContractService {\n private provider?: providers.Provider;\n private signer?: Signer;\n\n public readonly contract: { [N in ContractName]: ethers.Contract } = {} as any;\n public readonly iface: { [N in ContractName]: ethers.utils.Interface } = {} as any;\n\n constructor(opts: ContractOptions) {\n this.provider = opts.provider;\n this.signer = opts.signer;\n\n (Object.keys(CONTRACTS) as ContractName[]).forEach((name) => {\n const { address, abi } = CONTRACTS[name];\n this.iface[name] = new ethers.utils.Interface(abi);\n this.contract[name] = new ethers.Contract(\n address,\n abi,\n this.signer ?? this.provider\n );\n });\n }\n\n /** Get raw address for a contract */\n public getAddress(name: ContractName): string {\n return CONTRACTS[name].address;\n }\n\n /** Utility: get a read-only handle even if signer is present */\n public getReadOnly(name: ContractName): Contract {\n const { address, abi } = CONTRACTS[name];\n return new Contract(address, abi, this.provider);\n }\n\n /** Utility: get a write-enabled handle (throws if no signer) */\n public getWrite(name: ContractName): Contract {\n if (!this.signer) throw new Error('No signer available for write calls');\n const { address, abi } = CONTRACTS[name];\n return new Contract(address, abi, this.signer);\n }\n\n /** Expose network info */\n async getNetwork() {\n return this.provider?.getNetwork();\n }\n\n /** List all known contract names */\n public listContractNames(): ContractName[] {\n return Object.keys(CONTRACTS) as ContractName[];\n }\n\n /** Get Interface instance for a contract */\n public getInterface(name: ContractName): ethers.utils.Interface {\n const iface = this.iface[name];\n if (!iface) throw new Error(`Interface not initialized for ${name}`);\n return iface;\n }\n\n /** Get live Contract instance */\n public getContract(name: ContractName): ethers.Contract {\n const ctr = this.contract[name];\n if (!ctr) throw new Error(`Contract not initialized for ${name}`);\n return ctr;\n }\n\n /** A unified Interface containing all ABIs to parse custom errors or events. */\n public get omniInterface(): ethers.utils.Interface {\n const all: any[] = [];\n\n const allArtifacts = [\n ERC20Artifact,\n ERC721Artifact,\n ERC1155Artifact,\n\n // liqETH suite\n // DepositManagerArtifact,\n // LiqEthArtifact,\n // LiqEthMintArtifact,\n // LiqEthBurnArtifact,\n // LiqEthTreasuryArtifact,\n // LiqEthCommonArtifact,\n // RewardsERC20Artifact,\n // ValidatorBalanceVerifierArtifact,\n // YieldArtifact,\n // AccountingArtifact,\n // StakingModuleArtifact,\n // WithdrawalQueueArtifact,\n // WithdrawalVaultArtifact,\n ];\n\n allArtifacts.forEach(artifact => {\n if (artifact && artifact.abi) {\n all.push(...artifact.abi);\n }\n });\n\n const seen = new Set<string>();\n const dedup: any[] = [];\n for (const item of all) {\n try {\n const frag = ethers.utils.Fragment.from(item);\n const key = `${frag.type}:${frag.format(ethers.utils.FormatTypes.full)}`.toLowerCase();\n if (!seen.has(key)) {\n seen.add(key);\n dedup.push(item);\n }\n } catch {\n // ignore bad fragments\n }\n }\n\n return new ethers.utils.Interface(dedup);\n }\n\n /** Decode a revert or custom error payload */\n public parseError(revertData: string): ErrorDescription {\n try {\n return this.omniInterface.parseError(revertData);\n } catch {\n throw new Error(`Unable to parse error data: ${revertData}`);\n }\n }\n}","// src/networks/ethereum/ethereum.ts\n\nimport { BigNumber, BigNumberish, ethers } from 'ethers';\nimport { IStakingClient, Portfolio, StakerConfig } from '../../staker/types';\nimport { PublicKey as WirePubKey } from '@wireio/core';\nimport { ERC20Abi, EthereumContractService } from './contract'; // TODO replace with staking contract ABI\nimport { DepositEvent, DepositResult } from './types';\n\n// TODO extend to implement ISTAKINGCLIENT\nexport class EthereumStakingClient implements IStakingClient {\n public readonly pubKey: WirePubKey;\n private readonly provider: ethers.providers.Web3Provider;\n private readonly signer: ethers.Signer;\n private readonly contractService: EthereumContractService;\n\n get contract() { return this.contractService.contract; }\n get network() { return this.config.network; }\n\n constructor(private config: StakerConfig) {\n if (!ethers.providers.Web3Provider.isProvider(config.provider)) {\n throw new Error('Expected a Web3Provider for Ethereum');\n }\n this.provider = config.provider as ethers.providers.Web3Provider;\n this.signer = this.provider.getSigner();\n this.pubKey = config.pubKey as WirePubKey;\n\n this.contractService = new EthereumContractService({\n provider: this.provider,\n signer: this.signer,\n });\n }\n\n // ---------------------------------------------------------------------\n // Public IStakingClient.deposit\n // ---------------------------------------------------------------------\n\n /**\n * Deposit native ETH into the liqETH protocol via DepositManager.\n * @param amount Amount in wei (or something convertible to BigNumber).\n * Keep this as a bigint / string in the caller; avoid JS floats.\n * @returns transaction hash\n */\n async deposit(amount: number | string | bigint | BigNumber): Promise<string> {\n const amountWei = BigNumber.isBigNumber(amount)\n ? amount\n : BigNumber.from(amount);\n\n const result = await this.performDeposit(amountWei);\n // For now, IStakingClient contract is: just return tx hash.\n // If/when you extend the interface, you can surface more here.\n return result.txHash;\n }\n /**\n * Simulate a deposit via callStatic.\n *\n * Useful for pre-flight checks; will throw with the same revert\n * reason as a real tx if it would fail.\n */\n async simulateDeposit(amount: number | string | bigint | BigNumber): Promise<void> {\n const amountWei = BigNumber.isBigNumber(amount)\n ? amount\n : BigNumber.from(amount);\n\n // callStatic executes the function locally without sending a tx.\n // deposit() doesn't return anything, so we only care if it reverts.\n await this.contract.DepositManager.callStatic.deposit({\n value: amountWei,\n });\n }\n\n private async performDeposit(amountWei: BigNumber): Promise<DepositResult> {\n // Pre-check minDeposit\n const minDeposit: BigNumber = await this.contract.DepositManager.minDeposit();\n if (amountWei.lt(minDeposit)) {\n throw new Error(\n `Deposit amount below minDeposit: ` +\n `amount=${ethers.utils.formatEther(amountWei)} ETH, ` +\n `min=${ethers.utils.formatEther(minDeposit)} ETH`\n );\n }\n\n // Send the payable tx\n const tx = await this.contract.DepositManager.deposit({\n value: amountWei,\n });\n\n // Wait for 1 confirmation \n const receipt = await tx.wait(1);\n\n // Parse Deposited event if present\n let deposited: DepositEvent | undefined;\n const ev = receipt.events?.find((e) => e.event === 'Deposited');\n\n if (ev && ev.args) {\n const { user, netEth, fee, shares } = ev.args;\n deposited = {\n user,\n netEth: BigNumber.from(netEth),\n fee: BigNumber.from(fee),\n shares: BigNumber.from(shares),\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n deposited,\n };\n }\n\n /**\n * Build, sign, and submit a single transaction that:\n * - Corrects other users (if needed) to free available balance, then\n * - Registers the caller’s untracked liqSOL.\n *\n * @param amount Optional: register a smaller amount than your full untracked balance.\n * @returns signature string\n */\n async register(amount?: bigint): Promise<string> {\n try {\n return 'Not implemented yet for Ethereum';\n } catch (error) {\n console.error('Error in register:', error);\n throw error;\n }\n }\n\n /**\n * Resolve the user's ETH + liqETH balances.\n *\n * native = ETH in wallet\n * actual = liqETH token balance (ERC-20)\n * tracked = liqETH tracked balance (protocol/accounting view)\n */\n async getPortfolio(): Promise<Portfolio> {\n const walletAddress = await this.signer.getAddress();\n\n // 1) Native ETH balance\n const nativeBalance = await this.provider.getBalance(walletAddress);\n const nativeDecimals =\n this.network?.nativeCurrency?.decimals ?? 18;\n const nativeSymbol =\n this.network?.nativeCurrency?.symbol ?? 'ETH';\n\n // 2) liqETH ERC-20 balance (actual)\n const actualBalance: ethers.BigNumber = await this.contract.LiqEth.balanceOf(walletAddress);\n const liqDecimals = 18; // if you want, read decimals() once and cache\n const liqSymbol = 'liqETH';\n\n // 3) Protocol \"tracked\" balance (Accounting)\n let trackedBalance: ethers.BigNumber = actualBalance;\n\n try {\n // Adjust this to your real view method:\n // e.g. function getUserBalance(address user)\n const result = await this.contract.Accounting.getUserBalance(walletAddress);\n\n // Support either struct or plain uint256\n if (result && typeof result === 'object' && 'amount' in result) {\n trackedBalance = result.amount;\n // if result.decimals exists and differs, override liqDecimals if desired\n } else if (result != null) {\n trackedBalance = result;\n }\n } catch (err) {\n console.warn(\n '[EthereumStakingClient] getPortfolio: Accounting view unavailable, using actual balance as tracked.',\n err\n );\n trackedBalance = actualBalance;\n }\n\n return {\n native: {\n amount: nativeBalance,\n decimals: nativeDecimals,\n symbol: nativeSymbol,\n },\n actual: {\n amount: actualBalance,\n decimals: liqDecimals,\n symbol: liqSymbol,\n },\n tracked: {\n amount: trackedBalance,\n decimals: liqDecimals,\n symbol: liqSymbol,\n },\n };\n }\n\n // TODO: implement withdraw, claimRewards, etc.\n}","// src/staker/staker.ts\n\nimport { ChainID, EvmChainID, SolChainID } from '@wireio/core';\nimport { IStakingClient, StakerConfig } from './types';\nimport { SolanaStakingClient } from '../networks/solana/solana';\nimport { EthereumStakingClient } from '../networks/ethereum/ethereum';\n\nexport class Staker {\n public selectedChainID?: ChainID;\n private clients: Map<ChainID, IStakingClient> = new Map();\n\n /**\n * Get the staking client for the currently selected chain.\n * @returns The staking client instance.\n */\n get client(): IStakingClient | undefined {\n return this.selectedChainID && this.isConfigured(this.selectedChainID)\n ? this.clients.get(this.selectedChainID) : undefined;\n }\n\n /** Is there a client configured for this chain? */\n isConfigured(chainId: ChainID): boolean {\n return this.clients.has(chainId);\n }\n\n /** List of configured chains */\n listConfigured(): ChainID[] {\n return [...this.clients.keys()];\n }\n\n constructor(config: StakerConfig | StakerConfig[], selectedChainID?: ChainID) {\n if (!config) throw new Error('StakerConfig is required');\n if (!Array.isArray(config)) config = [config];\n\n config.forEach((cfg) => {\n switch (cfg.network.chainId) {\n case SolChainID.WireTestnet:\n this.clients.set(cfg.network.chainId, new SolanaStakingClient(cfg));\n break;\n\n case EvmChainID.Hoodi:\n this.clients.set(EvmChainID.Hoodi, new EthereumStakingClient(cfg));\n break;\n default:\n // console.log(`No staking client available for chain ${cfg.network.chainId}`);\n // throw new Error(`Unsupported network curve: ${cfg.network.name}`);\n }\n });\n\n this.selectedChainID = selectedChainID;\n }\n\n /**\n * Select a chain. Returns true if a client exists for it, false otherwise.\n * (We still record the selectedChainID so the UI can reflect the chosen chain.)\n */\n setChain(chainID: ChainID): boolean {\n this.selectedChainID = chainID;\n return this.clients.has(chainID);\n }\n}","import { BigNumber, ethers } from 'ethers';\n\nexport const CONTRACT_NAMES = [\n 'Stake',\n 'LiqEth',\n 'DepositManager',\n 'LiqEthMint',\n 'LiqEthBurn',\n 'LiqEthTreasury',\n 'LiqEthCommon',\n 'RewardsERC20',\n 'ValidatorBalanceVerifier',\n 'Yield',\n 'Accounting',\n 'StakingModule',\n 'WithdrawalQueue',\n 'WithdrawalVault',\n] as const;\n\nexport type ContractName = typeof CONTRACT_NAMES[number];\nexport type AddressBook = Record<ContractName, string>;\n\nexport interface DepositEvent {\n user: string;\n netEth: BigNumber;\n fee: BigNumber;\n shares: BigNumber;\n}\n\nexport interface DepositResult {\n /** EVM transaction hash */\n txHash: string;\n /** Full receipt, if you want it */\n receipt: ethers.providers.TransactionReceipt;\n /** Parsed Deposited event, if present */\n deposited?: DepositEvent;\n}","// src/networks/solana/utils.ts\n\nimport { Program, BN, AnchorProvider } from '@coral-xyz/anchor';\n\nimport {\n Connection,\n Keypair,\n PublicKey,\n SystemProgram,\n StakeProgram,\n} from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddress,\n} from '@solana/spl-token';\n\nimport {\n LIQSOL_CORE,\n LIQSOL_TOKEN,\n PAY_RATE_SCALE_FACTOR,\n DEFAULT_AVERAGE_PAY_RATE,\n EPHEMERAL_RENT_EXEMPTION,\n LAMPORTS_PER_SOL,\n lamportsToSol,\n solToLamports,\n deriveDepositAuthorityPda,\n deriveLiqsolMintPda,\n deriveLiqsolMintAuthorityPda,\n deriveVaultPda,\n deriveReservePoolPda,\n deriveStakeControllerStatePda,\n derivePayoutStatePda,\n deriveBucketAuthorityPda,\n deriveDistributionStatePda,\n deriveUserRecordPda,\n derivePayRateHistoryPda,\n deriveStakeControllerVaultPda,\n deriveEphemeralStakeAddress,\n DEFAULT_PAY_RATE_LOOKBACK,\n} from './constants';\n\nimport liqsolCoreIDL from '../../assets/solana/idl/liqsol_core.json';\n\n// -----------------------------------------------------------------------------\n// Read-only liqsol_core Program helper\n// -----------------------------------------------------------------------------\n\nlet _liqsolCoreProgram: Program | null = null;\n\nexport function getLiqsolCoreProgram(\n connection: Connection,\n): Program {\n if (_liqsolCoreProgram && _liqsolCoreProgram.provider.connection === connection) {\n return _liqsolCoreProgram;\n }\n\n // Dummy wallet – we're only doing read-only account fetches here.\n const tmpKeypair = Keypair.generate();\n const wallet : any = { publicKey: tmpKeypair.publicKey, signAllTransactions: async () => [], signTransaction: async () => tmpKeypair };\n\n const provider = new AnchorProvider(connection, wallet, {\n commitment: 'confirmed',\n });\n\n const program = new Program(\n liqsolCoreIDL,\n provider,\n ) as Program;\n\n _liqsolCoreProgram = program;\n return program;\n}\n\n// -----------------------------------------------------------------------------\n// Deposit accounts bundle\n// -----------------------------------------------------------------------------\n\nexport interface DepositAccounts {\n user: PublicKey;\n depositAuthority: PublicKey;\n liqsolMint: PublicKey;\n liqsolMintAuthority: PublicKey;\n userAta: PublicKey;\n stakeControllerVault: PublicKey;\n stakeControllerReservePool: PublicKey;\n stakeControllerState: PublicKey;\n payoutState: PublicKey;\n bucketAuthority: PublicKey;\n bucketTokenAccount: PublicKey;\n distributionState: PublicKey;\n userRecord: PublicKey;\n payRateHistory: PublicKey;\n ephemeralStake: PublicKey;\n ephemeralSeed: string;\n}\n\n/**\n * Build a complete DepositAccounts set for a given user, matching the\n * on-chain PDAs used by the liqSOL core program.\n *\n * The optional `seed` lets you make deposit flows replayable/deterministic.\n * If omitted, a random u32 seed is generated.\n */\nexport async function buildDepositAccounts(\n connection: Connection,\n user: PublicKey,\n): Promise<DepositAccounts> {\n const depositAuthority = deriveDepositAuthorityPda();\n const liqsolMint = deriveLiqsolMintPda();\n const liqsolMintAuthority = deriveLiqsolMintAuthorityPda();\n const stakeControllerVault = deriveStakeControllerVaultPda();\n const stakeControllerReservePool = deriveReservePoolPda();\n const stakeControllerState = deriveStakeControllerStatePda();\n const payoutState = derivePayoutStatePda();\n const bucketAuthority = deriveBucketAuthorityPda();\n const distributionState = deriveDistributionStatePda();\n const userRecord = deriveUserRecordPda(user);\n const payRateHistory = derivePayRateHistoryPda();\n\n const userAta = await getAssociatedTokenAddress(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n const bucketTokenAccount = await getAssociatedTokenAddress(\n liqsolMint,\n bucketAuthority,\n true,\n TOKEN_2022_PROGRAM_ID,\n );\n\n // -------------------------------------------------------------\n // Ephemeral stake\n // -------------------------------------------------------------\n const seed = Math.floor(Math.random() * 2 ** 32);\n const ephemeralSeed = `ephemeral_${seed}`;\n const ephemeralStake = await deriveEphemeralStakeAddress(user, ephemeralSeed);\n\n // `connection` is currently unused, but we keep it in the signature\n // so this helper can evolve to preflight/validate accounts if needed.\n void connection;\n\n return {\n user,\n depositAuthority,\n liqsolMint,\n liqsolMintAuthority,\n userAta,\n stakeControllerVault,\n stakeControllerReservePool,\n stakeControllerState,\n payoutState,\n bucketAuthority,\n bucketTokenAccount,\n distributionState,\n userRecord,\n payRateHistory,\n ephemeralStake,\n ephemeralSeed,\n };\n}\n\n// -----------------------------------------------------------------------------\n// Balance + state getters (UI-friendly)\n// -----------------------------------------------------------------------------\n\nexport async function getUserLiqSolBalance(\n connection: Connection,\n user: PublicKey,\n): Promise<number> {\n const liqsolMint = deriveLiqsolMintPda();\n const ata = await getAssociatedTokenAddress(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n try {\n const bal = await connection.getTokenAccountBalance(ata);\n return Number(bal.value.amount); // raw lamports, not decimals-adjusted\n } catch {\n return 0;\n }\n}\n\nexport async function getBucketLiqSolBalance(\n connection: Connection,\n): Promise<number> {\n const liqsolMint = deriveLiqsolMintPda();\n const bucketAuthority = deriveBucketAuthorityPda();\n const ata = await getAssociatedTokenAddress(\n liqsolMint,\n bucketAuthority,\n true,\n TOKEN_2022_PROGRAM_ID,\n );\n\n try {\n const bal = await connection.getTokenAccountBalance(ata);\n return Number(bal.value.amount);\n } catch {\n return 0;\n }\n}\n\nexport async function getReservePoolBalance(\n connection: Connection,\n): Promise<number> {\n const reservePool = deriveReservePoolPda();\n try {\n const lamports = await connection.getBalance(reservePool);\n return lamports;\n } catch {\n return 0;\n }\n}\n\n/**\n * Raw account info for the stake_controller state (Anchor decode is left\n * to the caller so the SDK can stay IDL-agnostic at this layer).\n */\nexport async function getStakeControllerStateRaw(\n connection: Connection,\n): Promise<Uint8Array | null> {\n const pda = deriveStakeControllerStatePda();\n const info = await connection.getAccountInfo(pda);\n return info?.data ?? null;\n}\n\n/**\n * Raw account info for the payout-state account.\n */\nexport async function getPayoutStateRaw(\n connection: Connection,\n): Promise<Uint8Array | null> {\n const pda = derivePayoutStatePda();\n const info = await connection.getAccountInfo(pda);\n return info?.data ?? null;\n}\n\n/**\n * Raw account info for a user's distribution user_record.\n */\nexport async function getUserRecordRaw(\n connection: Connection,\n user: PublicKey,\n): Promise<Uint8Array | null> {\n const pda = deriveUserRecordPda(user);\n const info = await connection.getAccountInfo(pda);\n return info?.data ?? null;\n}\n\n// -----------------------------------------------------------------------------\n// Pay-rate & fee utilities (on-chain compatible)\n// -----------------------------------------------------------------------------\n\nexport async function getAveragePayRate(\n connection: Connection,\n lookback: number = DEFAULT_PAY_RATE_LOOKBACK,\n): Promise<bigint> {\n const program = getLiqsolCoreProgram(connection);\n const payRateHistoryPda = derivePayRateHistoryPda();\n\n try {\n const anyProgram = program as any;\n const payRateHistoryAccount = await anyProgram.account.payRateHistory.fetch(\n payRateHistoryPda,\n );\n\n const entries: any[] = payRateHistoryAccount.entries ?? [];\n const totalEntriesAdded = Number(\n payRateHistoryAccount.totalEntriesAdded ?? 0,\n );\n const currentIndex: number = payRateHistoryAccount.currentIndex ?? 0;\n const maxEntries: number =\n payRateHistoryAccount.maxEntries ?? entries.length;\n\n if (!entries.length) {\n return DEFAULT_AVERAGE_PAY_RATE;\n }\n\n const entriesToFetch = Math.min(lookback, maxEntries, entries.length);\n\n let idx: number;\n if (totalEntriesAdded === 0) {\n idx = 0;\n } else if (currentIndex === 0) {\n idx = maxEntries - 1;\n } else {\n idx = currentIndex - 1;\n }\n\n let sum = BigInt(0);\n let validCount = BigInt(0);\n\n for (let i = 0; i < entriesToFetch; i++) {\n const entry = entries[idx];\n if (entry && typeof entry.scaledRate !== 'undefined') {\n const rate = BigInt(entry.scaledRate.toString());\n if (rate > BigInt(0)) {\n sum += rate;\n validCount += BigInt(1);\n }\n }\n\n if (totalEntriesAdded === 0) {\n idx = (idx + 1) % maxEntries;\n } else {\n idx = idx === 0 ? maxEntries - 1 : idx - 1;\n }\n }\n\n if (validCount === BigInt(0)) {\n return DEFAULT_AVERAGE_PAY_RATE;\n }\n\n return sum / validCount;\n } catch (err) {\n // Fallback to default when history missing/unavailable\n return DEFAULT_AVERAGE_PAY_RATE;\n }\n}\n/**\n * On-chain fee formula:\n * fee = (average_pay_rate * 4 * deposit_amount_lamports) / 10^12\n */\nexport function calculateExpectedFee(\n depositAmountLamports: BN,\n averagePayRate: BN,\n): BN {\n return averagePayRate\n .mul(new BN(4))\n .mul(depositAmountLamports)\n .div(new BN(1_000_000_000_000)); // 10^12\n}\n\n/**\n * Convenience helper to preview how a deposit splits between user + bucket\n * and how much goes into the reserve, assuming the simple model:\n *\n * - userLiqSol = amount - fee + EPHEMERAL_RENT_EXEMPTION\n * - bucketLiqSol = fee\n * - reserveLamports = amount + EPHEMERAL_RENT_EXEMPTION\n */\nexport function previewDepositEffects(params: {\n depositAmountLamports: BN;\n averagePayRate: BN;\n rentExemptionLamports?: number;\n}): {\n feeLamports: BN;\n userLiqSolLamports: BN;\n bucketLiqSolLamports: BN;\n reserveIncreaseLamports: BN;\n} {\n const { depositAmountLamports, averagePayRate } = params;\n const rent = new BN(\n params.rentExemptionLamports ?? EPHEMERAL_RENT_EXEMPTION,\n );\n\n const fee = calculateExpectedFee(depositAmountLamports, averagePayRate);\n const userLiqSol = depositAmountLamports.sub(fee).add(rent);\n const bucketLiqSol = fee;\n const reserveIncrease = depositAmountLamports.add(rent);\n\n return {\n feeLamports: fee,\n userLiqSolLamports: userLiqSol,\n bucketLiqSolLamports: bucketLiqSol,\n reserveIncreaseLamports: reserveIncrease,\n };\n}\n\n// -----------------------------------------------------------------------------\n// Epoch / scheduling helpers\n// -----------------------------------------------------------------------------\n\nexport type EpochSnapshot = {\n epoch: number;\n slot: number;\n firstSlot: number;\n slotsInEpoch: number;\n slotMs: number;\n};\n\nexport async function getEpochSnapshot(\n connection: Connection,\n): Promise<EpochSnapshot> {\n const info = await connection.getEpochInfo();\n\n // Fallback slot time\n let slotTimeMs = Number(process.env.SLOT_TIME_MS_FALLBACK ?? 400);\n\n try {\n const samples = await connection.getRecentPerformanceSamples(16);\n if (samples.length) {\n const avgMs =\n samples.reduce(\n (acc, s) => acc + (s.samplePeriodSecs * 1000) / s.numSlots,\n 0,\n ) / samples.length;\n if (isFinite(avgMs) && avgMs > 0) {\n slotTimeMs = avgMs;\n }\n }\n } catch {\n // ignore; keep fallback\n }\n\n return {\n epoch: info.epoch,\n slot: info.slotIndex,\n firstSlot: info.absoluteSlot - info.slotIndex,\n slotsInEpoch: info.slotsInEpoch,\n slotMs: slotTimeMs,\n };\n}\n\nexport function msToEpochEnd(snapshot: EpochSnapshot): number {\n const remainingSlots = snapshot.slotsInEpoch - snapshot.slot;\n return remainingSlots * snapshot.slotMs;\n}\n\n/**\n * Generic \"execute around epoch boundaries\" helper:\n *\n * - If current progress is within [early, late], run immediately.\n * - If too early, sleep until `early` percentage into the epoch.\n * - If too late, sleep until `early` percentage into the *next* epoch.\n *\n * This is generic; you can wrap any instruction builder in here (including\n * deposit flows) without baking in program-specific logic.\n */\nexport async function scheduledInstruction<T>(\n connection: Connection,\n config: ScheduleConfig,\n instruction: () => Promise<T>,\n): Promise<T> {\n const early = config.early ?? 0.10;\n const late = config.late ?? 0.90;\n\n const snapshot = await getEpochSnapshot(connection);\n const progress = snapshot.slot / snapshot.slotsInEpoch;\n\n // Case 1: Already in safe zone\n if (progress >= early && progress <= late) {\n return instruction();\n }\n\n // Case 2: Early in epoch → wait until `early`\n if (progress < early) {\n const targetSlot = snapshot.slotsInEpoch * early;\n const slotsRemaining = targetSlot - snapshot.slot;\n const msToWait = slotsRemaining * snapshot.slotMs;\n\n console.log(\n `Epoch early (${(progress * 100).toFixed(\n 2,\n )}%). Sleeping ${(msToWait / 1000).toFixed(1)}s until ${early * 100\n }%...`,\n );\n\n await sleep(Math.max(1000, msToWait));\n return instruction();\n }\n\n // Case 3: Late in epoch → wait for next epoch + early window\n const msToNextEpoch = msToEpochEnd(snapshot);\n const earlyWaitTime = snapshot.slotsInEpoch * early * snapshot.slotMs;\n const totalWaitTime = msToNextEpoch + earlyWaitTime + 1000;\n\n console.log(\n `Epoch late (${(progress * 100).toFixed(\n 2,\n )}%). Sleeping ${(totalWaitTime / 1000).toFixed(\n 1,\n )}s until next epoch + ${early * 100}%...`,\n );\n\n await sleep(totalWaitTime);\n return instruction();\n}\n\n\n// -----------------------------------------------------------------------------\n// Generic helpers (used in tests + can be useful in apps)\n// -----------------------------------------------------------------------------\n\nexport function getErrorMessage(error: any): string {\n return (\n error?.error?.errorCode?.code ||\n error?.error?.errorMessage ||\n error?.message ||\n ''\n );\n}\n\nexport function generateRandomDepositAmount(\n minSol = 2,\n maxSol = 100,\n): BN {\n const randomSol = Math.random() * (maxSol - minSol) + minSol;\n return new BN(solToLamports(randomSol));\n}\n\nexport function generateTestKeypair(): Keypair {\n return Keypair.generate();\n}\n\nexport async function airdropSol(\n connection: Connection,\n publicKey: PublicKey,\n amountSol: number,\n): Promise<void> {\n const lamports = solToLamports(amountSol);\n const sig = await connection.requestAirdrop(publicKey, lamports);\n await connection.confirmTransaction(sig, 'confirmed');\n}\n\nexport async function waitForConfirmation(\n connection: Connection,\n signature: string,\n): Promise<void> {\n await connection.confirmTransaction(signature, 'confirmed');\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Simple helper used in tests: wait until safe zone, no-op.\n */\nexport async function waitUntilSafeToExecuteFunction(\n connection: Connection,\n config: ScheduleConfig = {},\n): Promise<void> {\n await scheduledInstruction(connection, config, async () => {\n // no-op\n return;\n });\n}\n\nexport interface ScheduleConfig {\n early?: number; // fraction of epoch, default 0.10\n late?: number; // fraction of epoch, default 0.90\n}\n\n"],"names":["PublicKey","liqSolTokenIDL","validatorLeaderboardIDL","__async","StakeProgram","liqsolCoreJson","Program","getAssociatedTokenAddressSync","TOKEN_2022_PROGRAM_ID","__pow","BN","SystemProgram","ASSOCIATED_TOKEN_PROGRAM_ID","SYSVAR_INSTRUCTIONS_PUBKEY","SYSVAR_CLOCK_PUBKEY","SYSVAR_STAKE_HISTORY_PUBKEY","SYSVAR_RENT_PUBKEY","Transaction","getAssociatedTokenAddress","tx","KeyType","Connection","AnchorProvider","SolPubKey","_a","ethers","Contract","BigNumber","SolChainID","EvmChainID","Keypair"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
1
+ {"version":3,"file":"stake.js","sources":["../src/networks/solana/constants.ts","../src/networks/solana/program.ts","../src/networks/solana/clients/deposit.client.ts","../src/networks/solana/clients/distribution.client.ts","../src/networks/solana/clients/leaderboard.client.ts","../src/networks/solana/solana.ts","../src/networks/ethereum/contract.ts","../src/networks/ethereum/ethereum.ts","../src/staker/staker.ts","../src/networks/ethereum/types.ts","../src/networks/solana/utils.ts"],"sourcesContent":["// src/networks/solana/constants.ts\nimport { PublicKey, StakeProgram } from '@solana/web3.js';\n\nimport liqsolCoreIDL from \"../../assets/solana/idl/liqsol_core.json\";\nimport liqSolTokenIDL from \"../../assets/solana/idl/liqsol_token.json\";\nimport validatorLeaderboardIDL from \"../../assets/solana/idl/validator_leaderboard.json\";\n\n/**\n * ---------------------------------------------------------------------------\n * PROGRAM IDS\n * ---------------------------------------------------------------------------\n *\n * These should match:\n * - `metadata.address` in your Anchor IDLs under src/assets/solana/idl/*.json\n * - The program IDs printed by your deploy scripts\n */\n// Extract program IDs from IDL files\nexport const PROGRAM_IDS = {\n LIQSOL_CORE: new PublicKey(liqsolCoreIDL.address),\n LIQSOL_TOKEN: new PublicKey(liqSolTokenIDL.address),\n VALIDATOR_LEADERBOARD: new PublicKey(validatorLeaderboardIDL.address),\n} as const;\n\n// Export individual program IDs for convenience\nexport const {\n LIQSOL_CORE,\n LIQSOL_TOKEN,\n VALIDATOR_LEADERBOARD,\n} = PROGRAM_IDS;\n\n/**\n * ---------------------------------------------------------------------------\n * PDA SEEDS (must match on-chain programs)\n * ---------------------------------------------------------------------------\n *\n * These strings are baked into the on-chain programs and are already used in\n * your test utils. We centralize them here so all clients share them.\n */\n\nexport const PDA_SEEDS = {\n // liqsol_core: deposit / stake controller\n DEPOSIT_AUTHORITY: 'deposit_authority',\n VAULT: 'vault',\n RESERVE_POOL: 'reserve_pool',\n STAKE_CONTROLLER_STATE: 'stake_controller',\n PAYOUT_STATE: 'payout-state',\n\n // liqsol_token: mint + bucket\n LIQSOL_MINT: 'liqsol_mint',\n LIQSOL_MINT_AUTHORITY: 'mint_authority',\n BUCKET_AUTHORITY: 'liqsol_bucket',\n\n // distribution program (embedded in liqsol_core)\n DISTRIBUTION_STATE: 'distribution_state',\n USER_RECORD: 'user_record',\n\n // pay-rate history\n PAY_RATE_HISTORY: 'pay_rate_history',\n\n // validator leaderboard (state + records)\n LEADERBOARD_STATE: 'leaderboard_state',\n VALIDATOR_RECORD: 'validator',\n GLOBAL_STAKE_INFO: 'global_stake_info',\n} as const;\n\n/**\n * Helpers for PDA derivation so clients don’t duplicate logic.\n */\n\nexport const deriveLiqsolMintPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQSOL_MINT)],\n PROGRAM_IDS.LIQSOL_TOKEN,\n )[0];\n\nexport const deriveLiqsolMintAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQSOL_MINT_AUTHORITY)],\n PROGRAM_IDS.LIQSOL_TOKEN,\n )[0];\n\nexport const deriveDepositAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.DEPOSIT_AUTHORITY)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveVaultPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VAULT)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveReservePoolPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.RESERVE_POOL)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveStakeControllerStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.STAKE_CONTROLLER_STATE)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const derivePayoutStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.PAYOUT_STATE)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveBucketAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.BUCKET_AUTHORITY)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveDistributionStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.DISTRIBUTION_STATE)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveUserRecordPda = (user: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.USER_RECORD), user.toBuffer()],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const derivePayRateHistoryPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.PAY_RATE_HISTORY)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\n// export const deriveGlobalStakeInfoPda = () =>\n// PublicKey.findProgramAddressSync(\n// [Buffer.from(PDA_SEEDS.GLOBAL_STAKE_INFO)],\n// PROGRAM_IDS.LIQSOL_CORE,\n// )[0];\n\nexport const deriveLeaderboardStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LEADERBOARD_STATE)],\n PROGRAM_IDS.VALIDATOR_LEADERBOARD,\n )[0];\n\nexport const deriveValidatorRecordPda = (voteAccount: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VALIDATOR_RECORD), voteAccount.toBuffer()],\n PROGRAM_IDS.VALIDATOR_LEADERBOARD,\n )[0];\n\n/**\n* Stake controller vault PDA (reserve pool SOL vault).\n* This is the same as VAULT, but named more explicitly for SDK callers.\n*/\nexport const deriveStakeControllerVaultPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VAULT)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\n/**\n * Ephemeral stake account address used per-deposit.\n * On-chain convention: seed = `ephemeral_<u32>` under StakeProgram.programId.\n */\nexport const deriveEphemeralStakeAddress = async (\n user: PublicKey,\n seed: any,\n): Promise<PublicKey> => {\n const seedStr = `ephemeral_${seed}`;\n return await PublicKey.createWithSeed(user, seedStr, StakeProgram.programId);\n};\n\n\n\n/**\n * ---------------------------------------------------------------------------\n * ECONOMICS & MATH CONSTANTS\n * ---------------------------------------------------------------------------\n */\n\n// Same scale factor used on-chain for pay-rate math\nexport const PAY_RATE_SCALE_FACTOR = BigInt(1_000_000_000_000); // 10^12\n\n// Default pay rate fallback used in tests & utils\nexport const DEFAULT_AVERAGE_PAY_RATE = BigInt(191_780_821);\n\n// How many history entries to average when computing expected fee\nexport const DEFAULT_PAY_RATE_LOOKBACK = 5;\n\n// Rent exemption for ephemeral stake account (lamports)\n// Mirrors EPHEMERAL_RENT_EXEMPTION = 2_282_880 used in tests\nexport const EPHEMERAL_RENT_EXEMPTION = 2_282_880;\n\n// For convenience: lamports <-> SOL helpers (no RPC dependency)\nexport const LAMPORTS_PER_SOL = 1_000_000_000;\n\nexport const lamportsToSol = (lamports: number | bigint): number =>\n Number(lamports) / LAMPORTS_PER_SOL;\n\nexport const solToLamports = (sol: number): number =>\n Math.round(sol * LAMPORTS_PER_SOL);\n\n/**\n * ---------------------------------------------------------------------------\n * CLUSTER / ENVIRONMENT CONFIG (optional but handy)\n * ---------------------------------------------------------------------------\n */\n\nexport type SolanaCluster = 'localnet' | 'devnet' | 'mainnet';\n\n// export interface SolanaStakeProgramAddresses {\n// liqsolCore: PublicKey;\n// liqsolToken: PublicKey;\n// validatorLeaderboard: PublicKey;\n// }\n\n// export const PROGRAMS_BY_CLUSTER: Record<SolanaCluster, SolanaStakeProgramAddresses> = {\n// localnet: {\n// liqsolCore: PROGRAM_IDS.LIQSOL_CORE,\n// liqsolToken: PROGRAM_IDS.LIQSOL_TOKEN,\n// validatorLeaderboard: PROGRAM_IDS.VALIDATOR_LEADERBOARD,\n// },\n// devnet: {\n// liqsolCore: PROGRAM_IDS.LIQSOL_CORE,\n// liqsolToken: PROGRAM_IDS.LIQSOL_TOKEN,\n// validatorLeaderboard: PROGRAM_IDS.VALIDATOR_LEADERBOARD,\n// },\n// mainnet: {\n// liqsolCore: PROGRAM_IDS.LIQSOL_CORE,\n// liqsolToken: PROGRAM_IDS.LIQSOL_TOKEN,\n// validatorLeaderboard: PROGRAM_IDS.VALIDATOR_LEADERBOARD,\n// },\n// };\n\n// export const DEFAULT_CLUSTER: SolanaCluster = 'localnet';\n\n// export function getProgramIds(cluster: SolanaCluster = DEFAULT_CLUSTER): SolanaStakeProgramAddresses {\n// return PROGRAMS_BY_CLUSTER[cluster];\n// }","import { AnchorProvider, Program } from '@coral-xyz/anchor';\n\nimport liqsolCoreJson from '../../assets/solana/idl/liqsol_core.json';\nimport liqsolTokenJson from '../../assets/solana/idl/liqsol_token.json';\nimport validatorLeaderboardJson from '../../assets/solana/idl/validator_leaderboard.json';\n\nimport type { LiqsolCore } from '../../assets/solana/types/liqsol_core';\nimport type { LiqsolToken } from '../../assets/solana/types/liqsol_token';\nimport type { ValidatorLeaderboard } from '../../assets/solana/types/validator_leaderboard';\n\nimport { PROGRAM_IDS } from './constants';\n\ntype Entry<IDL> = {\n idl: IDL & { address: string };\n address: string;\n};\n\nconst PROGRAMS = {\n liqsolCore: {\n idl: liqsolCoreJson,\n address: PROGRAM_IDS.LIQSOL_CORE.toBase58(),\n } as Entry<LiqsolCore>,\n liqsolToken: {\n idl: liqsolTokenJson,\n address: PROGRAM_IDS.LIQSOL_TOKEN.toBase58(),\n } as Entry<LiqsolToken>,\n validatorLeaderboard: {\n idl: validatorLeaderboardJson,\n address: PROGRAM_IDS.VALIDATOR_LEADERBOARD.toBase58(),\n } as Entry<ValidatorLeaderboard>,\n} as const;\n\nexport type SolanaProgramName = keyof typeof PROGRAMS;\n\nexport class SolanaProgramService {\n constructor(private provider: AnchorProvider) { }\n\n getProgram<K extends SolanaProgramName>(name: K): Program<(typeof PROGRAMS)[K]['idl']> {\n const { idl, address } = PROGRAMS[name];\n const idlWithAddr = { ...idl, address };\n return new Program(idlWithAddr, this.provider) as Program<(typeof PROGRAMS)[K]['idl']>;\n }\n\n listProgramNames(): SolanaProgramName[] {\n return Object.keys(PROGRAMS) as SolanaProgramName[];\n }\n}","import { AnchorProvider, BN, Program } from '@coral-xyz/anchor';\nimport {\n PublicKey,\n SystemProgram,\n Transaction,\n TransactionInstruction,\n StakeProgram,\n SYSVAR_INSTRUCTIONS_PUBKEY,\n SYSVAR_CLOCK_PUBKEY,\n SYSVAR_RENT_PUBKEY,\n SYSVAR_STAKE_HISTORY_PUBKEY,\n} from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddressSync,\n} from '@solana/spl-token';\n\nimport { SolanaProgramService } from '../program';\nimport type { LiqsolCore } from '../../../assets/solana/types/liqsol_core';\n\nimport {\n PROGRAM_IDS,\n deriveDepositAuthorityPda,\n deriveLiqsolMintPda,\n deriveLiqsolMintAuthorityPda,\n deriveReservePoolPda,\n deriveVaultPda,\n deriveStakeControllerStatePda,\n deriveBucketAuthorityPda,\n derivePayRateHistoryPda,\n deriveDistributionStatePda,\n deriveUserRecordPda,\n derivePayoutStatePda,\n deriveEphemeralStakeAddress,\n} from '../constants';\n\nexport class DepositClient {\n private program: Program<LiqsolCore>;\n\n constructor(private provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('liqsolCore');\n }\n\n async buildDepositTx(\n user: PublicKey,\n lamports: number\n ): Promise<{ transaction: Transaction; ephemeralStake: PublicKey }> {\n\n const program = this.program;\n\n // -------------------------------------------------------------\n // PDAs\n // -------------------------------------------------------------\n const depositAuthority = deriveDepositAuthorityPda();\n const liqsolMint = deriveLiqsolMintPda();\n const liqsolMintAuthority = deriveLiqsolMintAuthorityPda();\n const reservePool = deriveReservePoolPda();\n const vault = deriveVaultPda();\n const controllerState = deriveStakeControllerStatePda();\n const payoutState = derivePayoutStatePda();\n const bucketAuthority = deriveBucketAuthorityPda();\n const payRateHistory = derivePayRateHistoryPda();\n const distributionState = deriveDistributionStatePda();\n const userRecord = deriveUserRecordPda(user);\n\n // -------------------------------------------------------------\n // Token-2022 ATAs\n // -------------------------------------------------------------\n const userAta = getAssociatedTokenAddressSync(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID\n );\n\n const bucketTokenAccount = getAssociatedTokenAddressSync(\n liqsolMint,\n bucketAuthority,\n true,\n TOKEN_2022_PROGRAM_ID\n );\n\n // -------------------------------------------------------------\n // Ephemeral stake\n // -------------------------------------------------------------\n const seed = Math.floor(Math.random() * 2 ** 32);\n const ephemeralStake = await deriveEphemeralStakeAddress(user, seed);\n\n // -------------------------------------------------------------\n // BUILD IX (MUST MATCH IDL)\n // -------------------------------------------------------------\n const ix: TransactionInstruction = await program.methods\n .deposit(new BN(lamports), seed)\n .accounts({\n user,\n depositAuthority,\n systemProgram: SystemProgram.programId,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n liqsolProgram: PROGRAM_IDS.LIQSOL_TOKEN,\n stakeProgram: StakeProgram.programId,\n\n liqsolMint,\n userAta,\n liqsolMintAuthority,\n reservePool,\n vault,\n ephemeralStake,\n\n controllerState,\n payoutState,\n bucketAuthority,\n bucketTokenAccount,\n\n userRecord,\n distributionState,\n payRateHistory,\n\n instructionsSysvar: SYSVAR_INSTRUCTIONS_PUBKEY,\n clock: SYSVAR_CLOCK_PUBKEY,\n stakeHistory: SYSVAR_STAKE_HISTORY_PUBKEY,\n rent: SYSVAR_RENT_PUBKEY,\n })\n .instruction();\n\n const tx = new Transaction().add(ix);\n return { transaction: tx, ephemeralStake };\n }\n}","import { AnchorProvider, Program } from '@coral-xyz/anchor';\nimport {\n ParsedAccountData,\n PublicKey,\n SYSVAR_INSTRUCTIONS_PUBKEY,\n Transaction,\n SystemProgram,\n} from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n getAssociatedTokenAddress,\n} from '@solana/spl-token';\n\nimport { SolanaProgramService } from '../program';\nimport type { LiqsolCore } from '../../../assets/solana/types/liqsol_core';\nimport {\n deriveBucketAuthorityPda,\n deriveDistributionStatePda,\n deriveLiqsolMintPda,\n derivePayRateHistoryPda,\n deriveUserRecordPda,\n} from '../constants';\nimport type { CorrectRegisterBuildResult, DistributionState, MismatchCandidate, ParsedAccountInfo, UserRecord } from '../types';\n\n/**\n * Distribution client – wraps the distribution portion of the liqsol_core\n * program. Responsible for:\n * - Reading DistributionState + UserRecord\n * - Computing mismatch candidates (tracked > actual)\n * - Building a \"correct then register\" transaction for the caller\n *\n * Aligned with the on-chain `update_user` script:\n * - Single `updateUser()` entrypoint that:\n * * Can create userRecord if missing\n * * Reconciles tracked vs actual using user, userAta, bucket, pay-rate\n */\nexport class DistributionClient {\n private program: Program<LiqsolCore>;\n\n constructor(private provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('liqsolCore');\n }\n\n get connection() {\n return this.provider.connection;\n }\n\n /**\n * Fetch the global distribution state account.\n */\n async getDistributionState(): Promise<DistributionState | null> {\n const pda = deriveDistributionStatePda();\n try {\n // IDL account name: \"distributionState\"\n return await this.program.account.distributionState.fetch(pda);\n } catch {\n return null;\n }\n }\n\n /**\n * Fetch a user's distribution userRecord (or null if missing).\n */\n async getUserRecord(user: PublicKey): Promise<UserRecord | null> {\n const pda = deriveUserRecordPda(user);\n try {\n return await this.program.account.userRecord.fetchNullable(pda);\n } catch {\n return null;\n }\n }\n\n /**\n * Helper: get actual liqSOL balances for all token holders.\n *\n * Returns a map: owner (base58) -> actual balance (BigInt)\n */\n private async getActualBalancesByOwner(): Promise<Map<string, bigint>> {\n const liqsolMint = deriveLiqsolMintPda();\n const mintStr = liqsolMint.toBase58();\n\n const accounts = await this.connection.getParsedProgramAccounts(\n TOKEN_2022_PROGRAM_ID,\n {\n filters: [\n // SPL token layout: mint at offset 0\n { memcmp: { offset: 0, bytes: mintStr } },\n ],\n commitment: 'confirmed',\n },\n );\n\n const byOwner = new Map<string, bigint>();\n\n for (const acct of accounts) {\n const data = acct.account.data as ParsedAccountData;\n const parsed = data.parsed;\n if (!parsed || parsed.type !== 'account') continue;\n\n const info: ParsedAccountInfo = parsed.info;\n const ownerStr = info.owner;\n const amountStr = info.tokenAmount.amount;\n const amount = BigInt(amountStr);\n\n const prev = byOwner.get(ownerStr) ?? BigInt(0);\n byOwner.set(ownerStr, prev + amount);\n }\n\n return byOwner;\n }\n\n /**\n * Helper: get tracked balances from all userRecord accounts,\n * keyed by *actual wallet owner*, not the userRecord PDA.\n *\n * userRecord struct:\n * - userAta: pubkey\n * - trackedBalance: u64\n * - claimBalance: u64\n * - lastClaimTimestamp: i64\n * - bump: u8\n */\n private async getTrackedBalances(): Promise<\n Map<string, { owner: PublicKey; tracked: bigint }>\n > {\n const records = await this.program.account.userRecord.all();\n const map = new Map<string, { owner: PublicKey; tracked: bigint }>();\n\n for (const r of records) {\n const ur = r.account as UserRecord;\n const userAta = ur.userAta as PublicKey;\n\n // Resolve the *wallet* that owns this ATA\n const ataInfo = await this.connection.getParsedAccountInfo(userAta);\n const parsedData = ataInfo.value?.data as ParsedAccountData | undefined;\n if (!parsedData) continue;\n\n const parsed = parsedData.parsed;\n if (!parsed || (parsed as any).type !== 'account') continue;\n\n const info: ParsedAccountInfo = parsed.info;\n const ownerStr = info.owner;\n const owner = new PublicKey(ownerStr);\n\n const tracked = BigInt(ur.trackedBalance.toString());\n map.set(ownerStr, { owner, tracked });\n }\n\n return map;\n }\n\n /**\n * Discover all mismatch candidates where tracked > actual.\n *\n * - actual balances are derived from token accounts for the liqSOL mint\n * - tracked balances come from Distribution.userRecord\n */\n private async deriveMismatchCandidates(): Promise<MismatchCandidate[]> {\n const [actualByOwner, trackedByOwner] = await Promise.all([\n this.getActualBalancesByOwner(),\n this.getTrackedBalances(),\n ]);\n\n const out: MismatchCandidate[] = [];\n\n for (const [ownerStr, { owner, tracked }] of trackedByOwner.entries()) {\n const actual = actualByOwner.get(ownerStr) ?? BigInt(0);\n const delta = tracked - actual;\n if (delta > BigInt(0)) {\n out.push({ owner, actual, tracked, delta });\n }\n }\n\n // Largest discrepancy first\n out.sort((a, b) => (b.delta > a.delta ? 1 : b.delta < a.delta ? -1 : 0));\n return out;\n }\n\n /**\n * Canonical helper to build an `updateUser` instruction for a given user,\n * matching the standalone update-user.ts script.\n */\n private async buildUpdateUserIx(targetUser: PublicKey) {\n const walletPk = this.provider.wallet.publicKey;\n\n const distributionStatePDA = deriveDistributionStatePda();\n const userRecordPDA = deriveUserRecordPda(targetUser);\n const liqsolMintPDA = deriveLiqsolMintPda();\n const payRateHistoryPDA = derivePayRateHistoryPda();\n const bucketAuthorityPDA = deriveBucketAuthorityPda();\n\n const userAta = await getAssociatedTokenAddress(\n liqsolMintPDA,\n targetUser,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n const bucketTokenAccount = await getAssociatedTokenAddress(\n liqsolMintPDA,\n bucketAuthorityPDA,\n true, // allowOwnerOffCurve\n TOKEN_2022_PROGRAM_ID,\n );\n\n return (this.program.methods as any)\n .updateUser()\n .accounts({\n user: targetUser,\n userAta,\n userRecord: userRecordPDA,\n authority: walletPk,\n payer: walletPk,\n distributionState: distributionStatePDA,\n liqsolMint: liqsolMintPDA,\n instructionsSysvar: SYSVAR_INSTRUCTIONS_PUBKEY,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n bucketAuthority: bucketAuthorityPDA,\n bucketTokenAccount,\n payRateHistory: payRateHistoryPDA,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n /**\n * Build the \"correct & register\" transaction.\n *\n * - Fetches DistributionState + all userRecords + token holders\n * - Computes caller's untracked amount (actual - tracked)\n * - If DistributionState.availableBalance already covers that, we only\n * send updateUser(caller).\n * - Otherwise we select top mismatch candidates until their freed deltas\n * cover the shortfall, then build updateUser(target) for each,\n * followed by updateUser(caller).\n *\n * NOTE:\n * - This no longer uses a separate updateSpecificUser; the single\n * updateUser entrypoint accepts any `user` as long as authority/payer\n * are valid, per your script.\n */\n async buildCorrectRegisterTx(opts: {\n amount?: bigint;\n maxCandidates?: number;\n } = {}): Promise<CorrectRegisterBuildResult> {\n const walletPk = this.provider.wallet.publicKey;\n const callerStr = walletPk.toBase58();\n\n const [distState, actualByOwner, trackedByOwner] = await Promise.all([\n this.getDistributionState(),\n this.getActualBalancesByOwner(),\n this.getTrackedBalances(),\n ]);\n\n if (!distState) {\n return {\n needToRegister: false,\n canSucceed: false,\n reason: 'DistributionState not initialized',\n transaction: undefined,\n plan: { deficit: BigInt(0), willFree: BigInt(0), selected: [] },\n };\n }\n\n const availableBalance = BigInt(distState.availableBalance.toString());\n\n const trackedEntry =\n trackedByOwner.get(callerStr) ?? {\n owner: walletPk,\n tracked: BigInt(0),\n };\n\n const actual = actualByOwner.get(callerStr) ?? BigInt(0);\n const tracked = trackedEntry.tracked;\n const untracked = actual - tracked;\n\n // Nothing to register\n if (untracked <= BigInt(0)) {\n return {\n needToRegister: false,\n canSucceed: true,\n reason: 'No untracked liqSOL to register',\n transaction: undefined,\n plan: { deficit: BigInt(0), willFree: BigInt(0), selected: [] },\n };\n }\n\n // Optional user-specified cap on how much to register.\n const targetRegister =\n opts.amount && opts.amount > BigInt(0) ? opts.amount : untracked;\n\n // Simple case: availableBalance already covers what we want to register\n if (availableBalance >= targetRegister) {\n const tx = new Transaction();\n const ix = await this.buildUpdateUserIx(walletPk); // caller only\n tx.add(ix);\n\n return {\n needToRegister: true,\n canSucceed: true,\n transaction: tx,\n plan: { deficit: BigInt(0), willFree: BigInt(0), selected: [] },\n };\n }\n\n // Need to free up more availableBalance by correcting others.\n const deficit = targetRegister - availableBalance;\n\n const allCandidates = await this.deriveMismatchCandidates();\n const maxCandidates = opts.maxCandidates ?? 10;\n\n const selected: MismatchCandidate[] = [];\n let willFree = BigInt(0);\n\n for (const c of allCandidates) {\n if (c.owner.equals(walletPk)) continue; // don't self-correct here\n selected.push(c);\n willFree += c.delta;\n if (willFree >= deficit || selected.length >= maxCandidates) break;\n }\n\n if (willFree < deficit) {\n return {\n needToRegister: true,\n canSucceed: false,\n reason: 'Not enough mismatched candidates to cover deficit',\n transaction: undefined,\n plan: { deficit, willFree, selected },\n };\n }\n\n const tx = new Transaction();\n\n // 1) Correct selected mismatched users.\n for (const c of selected) {\n const ix = await this.buildUpdateUserIx(c.owner);\n tx.add(ix);\n }\n\n // 2) Register caller (updateUser(caller)).\n {\n const ix = await this.buildUpdateUserIx(walletPk);\n tx.add(ix);\n }\n\n return {\n needToRegister: true,\n canSucceed: true,\n transaction: tx,\n plan: { deficit, willFree, selected },\n };\n }\n}","import { AnchorProvider, Program } from '@coral-xyz/anchor';\nimport { PublicKey } from '@solana/web3.js';\n\nimport { SolanaProgramService } from '../program';\nimport type { ValidatorLeaderboard } from '../../../assets/solana/types/validator_leaderboard';\nimport {\n deriveLeaderboardStatePda,\n deriveValidatorRecordPda,\n} from '../constants';\n\n/**\n * Simple read client for the validator_leaderboard program.\n *\n * Adjust account names/fields to match your IDL (state, validatorRecord, etc).\n */\nexport class LeaderboardClient {\n private program: Program<ValidatorLeaderboard>;\n\n constructor(private provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('validatorLeaderboard');\n }\n\n async getState(): Promise<any | null> {\n const pda = deriveLeaderboardStatePda();\n try {\n // Assumes account name \"leaderboardState\"\n return await this.program.account.leaderboardState.fetch(pda);\n } catch {\n return null;\n }\n }\n\n async getValidatorRecord(voteAccount: PublicKey): Promise<any | null> {\n const pda = deriveValidatorRecordPda(voteAccount);\n try {\n // Assumes account name \"validatorRecord\"\n return await this.program.account.validatorRecord.fetchNullable(pda);\n } catch {\n return null;\n }\n }\n\n /**\n * Convenience helper to fetch and sort top validators by score.\n * Assumes `validatorRecord` has a numeric `score` field in the IDL.\n */\n async getTopValidators(limit = 20): Promise<any[]> {\n const records = await (this.program.account as any).validatorRecord.all();\n const sorted = (records as Array<{ publicKey: PublicKey; account: any }>).sort(\n (a, b) => {\n const sa = BigInt(a.account.score?.toString?.() ?? '0');\n const sb = BigInt(b.account.score?.toString?.() ?? '0');\n return sb > sa ? 1 : sb < sa ? -1 : 0;\n },\n );\n return sorted.slice(0, limit);\n }\n}","import {\n Commitment,\n Connection,\n ConnectionConfig,\n PublicKey as SolPubKey,\n Transaction,\n TransactionSignature,\n} from '@solana/web3.js';\nimport { AnchorProvider } from '@coral-xyz/anchor';\nimport { BaseSignerWalletAdapter } from '@solana/wallet-adapter-base';\nimport { getAssociatedTokenAddressSync, TOKEN_2022_PROGRAM_ID } from '@solana/spl-token';\n\nimport { ChainID, ExternalNetwork, KeyType, PublicKey } from '@wireio/core';\nimport { IStakingClient, Portfolio, StakerConfig } from '../../staker/types';\n\nimport { DepositClient } from './clients/deposit.client';\nimport { DistributionClient } from './clients/distribution.client';\nimport {\n deriveLiqsolMintPda,\n deriveReservePoolPda,\n deriveVaultPda,\n} from './constants';\nimport { SolanaTransaction, UserRecord } from './types';\nimport { LeaderboardClient } from './clients/leaderboard.client';\n\nconst commitment: Commitment = 'confirmed';\n\nexport class SolanaStakingClient implements IStakingClient {\n public pubKey: PublicKey;\n public connection: Connection;\n public anchor: AnchorProvider;\n\n private depositClient: DepositClient;\n private distributionClient: DistributionClient;\n private leaderboardClient: LeaderboardClient;\n\n get solPubKey(): SolPubKey { 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) {\n throw new Error('Solana wallet adapter not connected');\n }\n if (!config.network.rpcUrls.length) {\n throw new Error('No RPC URLs provided');\n }\n\n const publicKey = adapter.publicKey;\n const wirePub = new PublicKey(KeyType.ED, publicKey.toBytes());\n if (!wirePub.equals(config.pubKey)) {\n throw new Error(\"Passed-in pubKey doesn't match adapter.publicKey\");\n }\n\n const opts: ConnectionConfig = { commitment };\n if (config.network.rpcUrls.length > 1 && config.network.rpcUrls[1].startsWith('ws')) {\n opts.wsEndpoint = config.network.rpcUrls[1];\n }\n\n this.pubKey = wirePub;\n this.connection = new Connection(config.network.rpcUrls[0], opts);\n\n const anchorWallet = {\n publicKey,\n async signTransaction<T extends SolanaTransaction>(tx: T): Promise<T> {\n return adapter.signTransaction(tx);\n },\n async signAllTransactions<T extends SolanaTransaction>(txs: T[]): Promise<T[]> {\n return Promise.all(txs.map((tx) => adapter.signTransaction(tx)));\n },\n };\n\n this.anchor = new AnchorProvider(this.connection, anchorWallet, { commitment });\n\n this.depositClient = new DepositClient(this.anchor);\n this.distributionClient = new DistributionClient(this.anchor);\n this.leaderboardClient = new LeaderboardClient(this.anchor);\n }\n\n /**\n * Resolve the user's liqSOL ATA and balances + key protocol balances.\n * native = SOL in wallet\n * actual = liqSOL token balance (from ATA)\n * tracked = liqSOL tracked balance (from Distribution.userRecord)\n */\n async getPortfolio(): Promise<Portfolio> {\n try {\n const user = this.solPubKey;\n const reservePoolPDA = deriveReservePoolPda();\n const vaultPDA = deriveVaultPda();\n const liqsolMint = deriveLiqsolMintPda();\n const userLiqsolAta = getAssociatedTokenAddressSync(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n // Fetch balances and user record in parallel\n const [nativeLamports, actualBalResp, userRecord] = await Promise.all([\n this.connection.getBalance(user),\n this.connection.getTokenAccountBalance(userLiqsolAta).catch(() => null),\n this.distributionClient.getUserRecord(user).catch(() => null),\n ]);\n\n const actualAmountStr = actualBalResp?.value?.amount ?? '0';\n const actualDecimals = actualBalResp?.value?.decimals ?? 9;\n\n const trackedAmountStr = userRecord?.trackedBalance ? userRecord.trackedBalance.toString() : '0';\n const trackedDecimals = actualDecimals;\n\n const nativeSymbol = 'SOL';\n const liqSymbol = 'LiqSOL';\n\n const portfolio: Portfolio = {\n native: {\n amount: BigInt(nativeLamports),\n symbol: nativeSymbol,\n decimals: 9,\n },\n liq: {\n amount: BigInt(actualAmountStr),\n symbol: liqSymbol,\n decimals: actualDecimals,\n },\n staked: { // TODO: fetch staked balance from outpost\n amount: BigInt(0),\n symbol: liqSymbol,\n decimals: actualDecimals,\n },\n tracked: { // SOL ONLY\n amount: BigInt(trackedAmountStr),\n symbol: liqSymbol,\n decimals: trackedDecimals,\n },\n extras: {\n userLiqsolAta: userLiqsolAta.toBase58(),\n reservePoolPDA: reservePoolPDA.toBase58(),\n vaultPDA: vaultPDA.toBase58(),\n },\n chainID: this.network.chainId\n };\n\n // console.log('SOL PORTFOLIO', portfolio);\n return portfolio;\n }\n catch (error) {\n console.log('Error in getPortfolio:', error);\n throw error;\n }\n }\n\n /**\n * Optional: fetch your Distribution program user record\n * (often contains per-user deposit/claim state).\n * @returns UserRecord or null\n */\n async getUserRecord() {\n return this.distributionClient.getUserRecord(this.solPubKey);\n }\n\n getProtocolFee() {\n // TODO: wire to pay-rate math once we finalize protocol fee API\n }\n\n /**\n * Deposit funds into the staking pool.\n * @param lamports The amount to deposit (in lamports).\n * @returns The transaction signature.\n */\n async deposit(lamports: number): Promise<string> {\n const { transaction } = await this.depositClient.buildDepositTx(this.solPubKey, lamports);\n const { tx, blockhash, lastValidBlockHeight } = await this.prepareTx(transaction);\n const signed = await this.signTransaction(tx);\n const result = await this.sendAndConfirmHttp(signed, { blockhash, lastValidBlockHeight });\n return result.signature;\n }\n\n /**\n * Build, sign, and submit a single transaction that:\n * - Corrects other users (if needed) to free available balance, then\n * - Registers the caller’s untracked liqSOL.\n *\n * @param amount Optional: register a smaller amount than your full untracked balance.\n * @returns signature string\n */\n async correctBalance(amount?: bigint): Promise<string> {\n try {\n const build = await this.distributionClient.buildCorrectRegisterTx({ amount });\n if (!build.canSucceed || !build.transaction) {\n throw new Error(build.reason ?? 'Unable to build Correct&Register transaction');\n }\n\n const { tx, blockhash, lastValidBlockHeight } = await this.prepareTx(build.transaction);\n const signed = await this.signTransaction(tx);\n const result = await this.sendAndConfirmHttp(signed, { blockhash, lastValidBlockHeight });\n\n console.log('Registered:', {\n needToRegister: build.needToRegister,\n freed: build.plan.willFree,\n corrected: build.plan.selected.map((c) => ({\n owner: c.owner?.toBase58(),\n delta: c.delta?.toString(),\n })),\n });\n\n return result.signature;\n } catch (error) {\n console.error('Error in register:', error);\n throw error;\n }\n }\n\n private async sendAndConfirmHttp(\n signed: SolanaTransaction,\n ctx: { blockhash: string; lastValidBlockHeight: number },\n ): Promise<TxResult> {\n const signature = await this.connection.sendRawTransaction(signed.serialize(), {\n skipPreflight: false,\n preflightCommitment: commitment,\n maxRetries: 3,\n });\n\n const conf = await this.connection.confirmTransaction(\n { signature, blockhash: ctx.blockhash, lastValidBlockHeight: ctx.lastValidBlockHeight },\n commitment,\n );\n\n const ok = !conf.value.err;\n if (!ok) {\n throw new Error(`Transaction failed: ${JSON.stringify(conf.value.err)}`);\n }\n return { signature, slot: conf.context.slot, confirmed: true };\n }\n\n async signTransaction(tx: SolanaTransaction): Promise<SolanaTransaction> {\n return this.anchor.wallet.signTransaction(tx);\n }\n\n async sendTransaction(signed: SolanaTransaction): Promise<TransactionSignature> {\n return this.anchor.sendAndConfirm(signed);\n }\n\n async prepareTx(\n tx: Transaction,\n ): Promise<{ tx: Transaction; blockhash: string; lastValidBlockHeight: number }> {\n const { blockhash, lastValidBlockHeight } = await this.connection.getLatestBlockhash('confirmed');\n tx.recentBlockhash = blockhash;\n tx.feePayer = this.solPubKey;\n\n return { tx, blockhash, lastValidBlockHeight };\n }\n}\n\nexport interface TxResult {\n signature: string;\n slot: number;\n confirmed: boolean;\n}","/**\n * @module EthereumContractService\n *\n * Provides a unified service for interacting with Ethereum smart contracts using ethers.js.\n */\nimport AccountingArtifact from '../../assets/ethereum/ABI/liqEth/accounting.sol/Accounting.json';\nimport DepositManagerArtifact from '../../assets/ethereum/ABI/liqEth/DepositManager.sol/DepositManager.json';\nimport LiqEthArtifact from '../../assets/ethereum/ABI/liqEth/liqEth.sol/LiqEthToken.json';\nimport LiqEthBurnArtifact from '../../assets/ethereum/ABI/liqEth/liqEthBurn.sol/LiqEthBurn.json';\n// import LiqEthCommonArtifact from '../../assets/ethereum/ABI/liqEth/liqEthCommon.sol/liqEthCommon.json';\nimport LiqEthMintArtifact from '../../assets/ethereum/ABI/liqEth/liqEthMint.sol/LiqEthMint.json';\n// import RewardsERC20Artifact from '../../assets/ethereum/ABI/liqEth/RewardsERC20.sol/RewardsERC20.json';\nimport StakingModuleArtifact from '../../assets/ethereum/ABI/liqEth/stakingModule.sol/StakingModule.json';\n// import ValidatorBalanceArtifact from '../../assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/ValidatorBalanceVerifier.json';\nimport WithdrawalQueueArtifact from '../../assets/ethereum/ABI/liqEth/withdrawalQueue.sol/WithdrawalQueue.json';\nimport WithdrawalVaultArtifact from '../../assets/ethereum/ABI/liqEth/withdrawalVault.sol/WithdrawalVault.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: \"0xd51CC479c25dc7Cd23f568Ef5c1AdE1671a4D15b\",\n DepositManager: \"0x2249D309f086363ABF5057Ae7f8057279162786B\",\n LiqEth: \"0xd5bd3DC2fD86e917A46f7571708aBB88CbfCc197\",\n LiqEthMint: \"0xdBAa1539eB7b80C29d825FCda76c0d7F8F0E6cFB\",\n LiqEthBurn: \"0x02e0A02fE2311FAd661677B7117FDdc801c1216b\",\n StakingModule: \"0x87047291c3b0D55A551C97B9194A02E1D84e06A9\",\n WithdrawalQueue: \"0x7781368720294fE0bB6D97F14fE2E9275fFED071\",\n WithdrawalVault: \"0x24457626938d4132556005ecA4d9e6F24F85297E\",\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\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}","// src/networks/ethereum/ethereum.ts\n\nimport { BigNumber, BigNumberish, ethers } from 'ethers';\nimport { IStakingClient, Portfolio, StakerConfig } from '../../staker/types';\nimport { PublicKey as WirePubKey } from '@wireio/core';\nimport { ERC20Abi, EthereumContractService } from './contract'; // TODO replace with staking contract ABI\nimport { DepositEvent, DepositResult } from './types';\n\nexport class EthereumStakingClient implements IStakingClient {\n public readonly pubKey: WirePubKey;\n private readonly provider: ethers.providers.Web3Provider;\n private readonly signer: ethers.Signer;\n private readonly contractService: EthereumContractService;\n\n get contract() { return this.contractService.contract; }\n get network() { return this.config.network; }\n\n constructor(private config: StakerConfig) {\n 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 } \n catch (error) {\n // console.error('Error initializing EthereumStakingClient:', error);\n throw error;\n } \n }\n\n // ---------------------------------------------------------------------\n // Public IStakingClient.deposit\n // ---------------------------------------------------------------------\n\n /**\n * Deposit native ETH into the liqETH protocol via DepositManager.\n * @param amount Amount in wei (or something convertible to BigNumber).\n * Keep this as a bigint / string in the caller; avoid JS floats.\n * @returns transaction hash\n */\n async deposit(amount: number | string | bigint | BigNumber): Promise<string> {\n const amountWei = BigNumber.isBigNumber(amount)\n ? amount\n : BigNumber.from(amount);\n\n const result = await this.performDeposit(amountWei);\n // For now, IStakingClient contract is: just return tx hash.\n // If/when you extend the interface, you can surface more here.\n return result.txHash;\n }\n\n \n /**\n * Simulate a deposit via callStatic.\n *\n * Useful for pre-flight checks; will throw with the same revert\n * reason as a real tx if it would fail.\n */\n async simulateDeposit(amount: number | string | bigint | BigNumber): Promise<void> {\n const amountWei = BigNumber.isBigNumber(amount)\n ? amount\n : BigNumber.from(amount);\n\n // callStatic executes the function locally without sending a tx.\n // deposit() doesn't return anything, so we only care if it reverts.\n await this.contract.DepositManager.callStatic.deposit({\n value: amountWei,\n });\n }\n\n private async performDeposit(amountWei: BigNumber): Promise<DepositResult> {\n // Pre-check minDeposit\n const minDeposit: BigNumber = await this.contract.DepositManager.minDeposit();\n if (amountWei.lt(minDeposit)) {\n throw new Error(\n `Deposit amount below minDeposit: ` +\n `amount=${ethers.utils.formatEther(amountWei)} ETH, ` +\n `min=${ethers.utils.formatEther(minDeposit)} ETH`\n );\n }\n\n // Send the payable tx\n const tx = await this.contract.DepositManager.deposit({\n value: amountWei,\n });\n\n // Wait for 1 confirmation \n const receipt = await tx.wait(1);\n\n // Parse Deposited event if present\n let deposited: DepositEvent | undefined;\n const ev = receipt.events?.find((e) => e.event === 'Deposited');\n\n if (ev && ev.args) {\n const { user, netEth, fee, shares } = ev.args;\n deposited = {\n user,\n netEth: BigNumber.from(netEth),\n fee: BigNumber.from(fee),\n shares: BigNumber.from(shares),\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n deposited,\n };\n }\n\n /**\n * 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 // 1) Native ETH balance\n const nativeBalance = await this.provider.getBalance(walletAddress);\n // console.log('nativeBalance', nativeBalance);\n const nativeDecimals = this.network?.nativeCurrency?.decimals ?? 18;\n const nativeSymbol = this.network?.nativeCurrency?.symbol ?? 'ETH';\n\n \n\n // 2) liqETH ERC-20 balance (actual)\n const liqBalance: ethers.BigNumber = await this.contract.LiqEth.balanceOf(walletAddress);\n // console.log('liqBalance', liqBalance);\n \n const liqDecimals = this.network?.nativeCurrency?.decimals ?? 18;\n const liqSymbol = 'Liq' + (this.network?.nativeCurrency?.symbol ?? 'ETH');\n\n const portfolio: Portfolio = {\n native: {\n amount: nativeBalance,\n decimals: nativeDecimals,\n symbol: nativeSymbol,\n },\n liq: {\n amount: liqBalance,\n decimals: liqDecimals,\n symbol: liqSymbol,\n },\n tracked: {\n amount: liqBalance,\n decimals: liqDecimals,\n symbol: liqSymbol,\n },\n staked: { // TODO fetch staked balance from outpost\n amount: BigNumber.from(0),\n decimals: liqDecimals,\n symbol: liqSymbol,\n },\n chainID: this.network.chainId\n }\n // console.log('ETH PORTFOLIO', portfolio);\n return portfolio;\n }\n\n // TODO: implement withdraw, claimRewards, etc.\n}","// src/staker/staker.ts\n\nimport { ChainID, EvmChainID, SolChainID } from '@wireio/core';\nimport { IStakingClient, StakerConfig } from './types';\nimport { SolanaStakingClient } from '../networks/solana/solana';\nimport { EthereumStakingClient } from '../networks/ethereum/ethereum';\n\nexport class Staker {\n public selectedChainID?: ChainID;\n private clients: Map<ChainID, IStakingClient> = new Map();\n\n /**\n * Get the staking client for the currently selected chain.\n * @returns The staking client instance.\n */\n get client(): IStakingClient | undefined {\n return this.selectedChainID && this.isConfigured(this.selectedChainID)\n ? this.clients.get(this.selectedChainID) : undefined;\n }\n\n /** Is there a client configured for this chain? */\n isConfigured(chainId: ChainID): boolean {\n return this.clients.has(chainId);\n }\n\n /** List of configured chains */\n listConfigured(): ChainID[] {\n return [...this.clients.keys()];\n }\n\n constructor(config: StakerConfig | StakerConfig[], selectedChainID?: ChainID) {\n if (!config) throw new Error('StakerConfig is required');\n if (!Array.isArray(config)) config = [config];\n\n // 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';\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] as const;\n\nexport type ContractName = typeof CONTRACT_NAMES[number];\nexport type AddressBook = Record<ContractName, string>;\n\nexport interface DepositEvent {\n user: string;\n netEth: BigNumber;\n fee: BigNumber;\n shares: BigNumber;\n}\n\nexport interface DepositResult {\n /** EVM transaction hash */\n txHash: string;\n /** Full receipt, if you want it */\n receipt: ethers.providers.TransactionReceipt;\n /** Parsed Deposited event, if present */\n deposited?: DepositEvent;\n}","// src/networks/solana/utils.ts\n\nimport { Program, BN, AnchorProvider } from '@coral-xyz/anchor';\n\nimport {\n Connection,\n Keypair,\n PublicKey,\n SystemProgram,\n StakeProgram,\n} from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddress,\n} from '@solana/spl-token';\n\nimport {\n LIQSOL_CORE,\n LIQSOL_TOKEN,\n PAY_RATE_SCALE_FACTOR,\n DEFAULT_AVERAGE_PAY_RATE,\n EPHEMERAL_RENT_EXEMPTION,\n LAMPORTS_PER_SOL,\n lamportsToSol,\n solToLamports,\n deriveDepositAuthorityPda,\n deriveLiqsolMintPda,\n deriveLiqsolMintAuthorityPda,\n deriveVaultPda,\n deriveReservePoolPda,\n deriveStakeControllerStatePda,\n derivePayoutStatePda,\n deriveBucketAuthorityPda,\n deriveDistributionStatePda,\n deriveUserRecordPda,\n derivePayRateHistoryPda,\n deriveStakeControllerVaultPda,\n deriveEphemeralStakeAddress,\n DEFAULT_PAY_RATE_LOOKBACK,\n} from './constants';\n\nimport liqsolCoreIDL from '../../assets/solana/idl/liqsol_core.json';\n\n// -----------------------------------------------------------------------------\n// Read-only liqsol_core Program helper\n// -----------------------------------------------------------------------------\n\nlet _liqsolCoreProgram: Program | null = null;\n\nexport function getLiqsolCoreProgram(\n connection: Connection,\n): Program {\n if (_liqsolCoreProgram && _liqsolCoreProgram.provider.connection === connection) {\n return _liqsolCoreProgram;\n }\n\n // Dummy wallet – we're only doing read-only account fetches here.\n const tmpKeypair = Keypair.generate();\n const wallet : any = { publicKey: tmpKeypair.publicKey, signAllTransactions: async () => [], signTransaction: async () => tmpKeypair };\n\n const provider = new AnchorProvider(connection, wallet, {\n commitment: 'confirmed',\n });\n\n const program = new Program(\n liqsolCoreIDL,\n provider,\n ) as Program;\n\n _liqsolCoreProgram = program;\n return program;\n}\n\n// -----------------------------------------------------------------------------\n// Deposit accounts bundle\n// -----------------------------------------------------------------------------\n\nexport interface DepositAccounts {\n user: PublicKey;\n depositAuthority: PublicKey;\n liqsolMint: PublicKey;\n liqsolMintAuthority: PublicKey;\n userAta: PublicKey;\n stakeControllerVault: PublicKey;\n stakeControllerReservePool: PublicKey;\n stakeControllerState: PublicKey;\n payoutState: PublicKey;\n bucketAuthority: PublicKey;\n bucketTokenAccount: PublicKey;\n distributionState: PublicKey;\n userRecord: PublicKey;\n payRateHistory: PublicKey;\n ephemeralStake: PublicKey;\n ephemeralSeed: string;\n}\n\n/**\n * Build a complete DepositAccounts set for a given user, matching the\n * on-chain PDAs used by the liqSOL core program.\n *\n * The optional `seed` lets you make deposit flows replayable/deterministic.\n * If omitted, a random u32 seed is generated.\n */\nexport async function buildDepositAccounts(\n connection: Connection,\n user: PublicKey,\n): Promise<DepositAccounts> {\n const depositAuthority = deriveDepositAuthorityPda();\n const liqsolMint = deriveLiqsolMintPda();\n const liqsolMintAuthority = deriveLiqsolMintAuthorityPda();\n const stakeControllerVault = deriveStakeControllerVaultPda();\n const stakeControllerReservePool = deriveReservePoolPda();\n const stakeControllerState = deriveStakeControllerStatePda();\n const payoutState = derivePayoutStatePda();\n const bucketAuthority = deriveBucketAuthorityPda();\n const distributionState = deriveDistributionStatePda();\n const userRecord = deriveUserRecordPda(user);\n const payRateHistory = derivePayRateHistoryPda();\n\n const userAta = await getAssociatedTokenAddress(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n const bucketTokenAccount = await getAssociatedTokenAddress(\n liqsolMint,\n bucketAuthority,\n true,\n TOKEN_2022_PROGRAM_ID,\n );\n\n // -------------------------------------------------------------\n // Ephemeral stake\n // -------------------------------------------------------------\n const seed = Math.floor(Math.random() * 2 ** 32);\n const ephemeralSeed = `ephemeral_${seed}`;\n const ephemeralStake = await deriveEphemeralStakeAddress(user, ephemeralSeed);\n\n // `connection` is currently unused, but we keep it in the signature\n // so this helper can evolve to preflight/validate accounts if needed.\n void connection;\n\n return {\n user,\n depositAuthority,\n liqsolMint,\n liqsolMintAuthority,\n userAta,\n stakeControllerVault,\n stakeControllerReservePool,\n stakeControllerState,\n payoutState,\n bucketAuthority,\n bucketTokenAccount,\n distributionState,\n userRecord,\n payRateHistory,\n ephemeralStake,\n ephemeralSeed,\n };\n}\n\n// -----------------------------------------------------------------------------\n// Balance + state getters (UI-friendly)\n// -----------------------------------------------------------------------------\n\nexport async function getUserLiqSolBalance(\n connection: Connection,\n user: PublicKey,\n): Promise<number> {\n const liqsolMint = deriveLiqsolMintPda();\n const ata = await getAssociatedTokenAddress(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n try {\n const bal = await connection.getTokenAccountBalance(ata);\n return Number(bal.value.amount); // raw lamports, not decimals-adjusted\n } catch {\n return 0;\n }\n}\n\nexport async function getBucketLiqSolBalance(\n connection: Connection,\n): Promise<number> {\n const liqsolMint = deriveLiqsolMintPda();\n const bucketAuthority = deriveBucketAuthorityPda();\n const ata = await getAssociatedTokenAddress(\n liqsolMint,\n bucketAuthority,\n true,\n TOKEN_2022_PROGRAM_ID,\n );\n\n try {\n const bal = await connection.getTokenAccountBalance(ata);\n return Number(bal.value.amount);\n } catch {\n return 0;\n }\n}\n\nexport async function getReservePoolBalance(\n connection: Connection,\n): Promise<number> {\n const reservePool = deriveReservePoolPda();\n try {\n const lamports = await connection.getBalance(reservePool);\n return lamports;\n } catch {\n return 0;\n }\n}\n\n/**\n * Raw account info for the stake_controller state (Anchor decode is left\n * to the caller so the SDK can stay IDL-agnostic at this layer).\n */\nexport async function getStakeControllerStateRaw(\n connection: Connection,\n): Promise<Uint8Array | null> {\n const pda = deriveStakeControllerStatePda();\n const info = await connection.getAccountInfo(pda);\n return info?.data ?? null;\n}\n\n/**\n * Raw account info for the payout-state account.\n */\nexport async function getPayoutStateRaw(\n connection: Connection,\n): Promise<Uint8Array | null> {\n const pda = derivePayoutStatePda();\n const info = await connection.getAccountInfo(pda);\n return info?.data ?? null;\n}\n\n/**\n * Raw account info for a user's distribution user_record.\n */\nexport async function getUserRecordRaw(\n connection: Connection,\n user: PublicKey,\n): Promise<Uint8Array | null> {\n const pda = deriveUserRecordPda(user);\n const info = await connection.getAccountInfo(pda);\n return info?.data ?? null;\n}\n\n// -----------------------------------------------------------------------------\n// Pay-rate & fee utilities (on-chain compatible)\n// -----------------------------------------------------------------------------\n\nexport async function getAveragePayRate(\n connection: Connection,\n lookback: number = DEFAULT_PAY_RATE_LOOKBACK,\n): Promise<bigint> {\n const program = getLiqsolCoreProgram(connection);\n const payRateHistoryPda = derivePayRateHistoryPda();\n\n try {\n const anyProgram = program as any;\n const payRateHistoryAccount = await anyProgram.account.payRateHistory.fetch(\n payRateHistoryPda,\n );\n\n const entries: any[] = payRateHistoryAccount.entries ?? [];\n const totalEntriesAdded = Number(\n payRateHistoryAccount.totalEntriesAdded ?? 0,\n );\n const currentIndex: number = payRateHistoryAccount.currentIndex ?? 0;\n const maxEntries: number =\n payRateHistoryAccount.maxEntries ?? entries.length;\n\n if (!entries.length) {\n return DEFAULT_AVERAGE_PAY_RATE;\n }\n\n const entriesToFetch = Math.min(lookback, maxEntries, entries.length);\n\n let idx: number;\n if (totalEntriesAdded === 0) {\n idx = 0;\n } else if (currentIndex === 0) {\n idx = maxEntries - 1;\n } else {\n idx = currentIndex - 1;\n }\n\n let sum = BigInt(0);\n let validCount = BigInt(0);\n\n for (let i = 0; i < entriesToFetch; i++) {\n const entry = entries[idx];\n if (entry && typeof entry.scaledRate !== 'undefined') {\n const rate = BigInt(entry.scaledRate.toString());\n if (rate > BigInt(0)) {\n sum += rate;\n validCount += BigInt(1);\n }\n }\n\n if (totalEntriesAdded === 0) {\n idx = (idx + 1) % maxEntries;\n } else {\n idx = idx === 0 ? maxEntries - 1 : idx - 1;\n }\n }\n\n if (validCount === BigInt(0)) {\n return DEFAULT_AVERAGE_PAY_RATE;\n }\n\n return sum / validCount;\n } catch (err) {\n // Fallback to default when history missing/unavailable\n return DEFAULT_AVERAGE_PAY_RATE;\n }\n}\n/**\n * On-chain fee formula:\n * fee = (average_pay_rate * 4 * deposit_amount_lamports) / 10^12\n */\nexport function calculateExpectedFee(\n depositAmountLamports: BN,\n averagePayRate: BN,\n): BN {\n return averagePayRate\n .mul(new BN(4))\n .mul(depositAmountLamports)\n .div(new BN(1_000_000_000_000)); // 10^12\n}\n\n/**\n * Convenience helper to preview how a deposit splits between user + bucket\n * and how much goes into the reserve, assuming the simple model:\n *\n * - userLiqSol = amount - fee + EPHEMERAL_RENT_EXEMPTION\n * - bucketLiqSol = fee\n * - reserveLamports = amount + EPHEMERAL_RENT_EXEMPTION\n */\nexport function previewDepositEffects(params: {\n depositAmountLamports: BN;\n averagePayRate: BN;\n rentExemptionLamports?: number;\n}): {\n feeLamports: BN;\n userLiqSolLamports: BN;\n bucketLiqSolLamports: BN;\n reserveIncreaseLamports: BN;\n} {\n const { depositAmountLamports, averagePayRate } = params;\n const rent = new BN(\n params.rentExemptionLamports ?? EPHEMERAL_RENT_EXEMPTION,\n );\n\n const fee = calculateExpectedFee(depositAmountLamports, averagePayRate);\n const userLiqSol = depositAmountLamports.sub(fee).add(rent);\n const bucketLiqSol = fee;\n const reserveIncrease = depositAmountLamports.add(rent);\n\n return {\n feeLamports: fee,\n userLiqSolLamports: userLiqSol,\n bucketLiqSolLamports: bucketLiqSol,\n reserveIncreaseLamports: reserveIncrease,\n };\n}\n\n// -----------------------------------------------------------------------------\n// Epoch / scheduling helpers\n// -----------------------------------------------------------------------------\n\nexport type EpochSnapshot = {\n epoch: number;\n slot: number;\n firstSlot: number;\n slotsInEpoch: number;\n slotMs: number;\n};\n\nexport async function getEpochSnapshot(\n connection: Connection,\n): Promise<EpochSnapshot> {\n const info = await connection.getEpochInfo();\n\n // Fallback slot time\n let slotTimeMs = Number(process.env.SLOT_TIME_MS_FALLBACK ?? 400);\n\n try {\n const samples = await connection.getRecentPerformanceSamples(16);\n if (samples.length) {\n const avgMs =\n samples.reduce(\n (acc, s) => acc + (s.samplePeriodSecs * 1000) / s.numSlots,\n 0,\n ) / samples.length;\n if (isFinite(avgMs) && avgMs > 0) {\n slotTimeMs = avgMs;\n }\n }\n } catch {\n // ignore; keep fallback\n }\n\n return {\n epoch: info.epoch,\n slot: info.slotIndex,\n firstSlot: info.absoluteSlot - info.slotIndex,\n slotsInEpoch: info.slotsInEpoch,\n slotMs: slotTimeMs,\n };\n}\n\nexport function msToEpochEnd(snapshot: EpochSnapshot): number {\n const remainingSlots = snapshot.slotsInEpoch - snapshot.slot;\n return remainingSlots * snapshot.slotMs;\n}\n\n/**\n * Generic \"execute around epoch boundaries\" helper:\n *\n * - If current progress is within [early, late], run immediately.\n * - If too early, sleep until `early` percentage into the epoch.\n * - If too late, sleep until `early` percentage into the *next* epoch.\n *\n * This is generic; you can wrap any instruction builder in here (including\n * deposit flows) without baking in program-specific logic.\n */\nexport async function scheduledInstruction<T>(\n connection: Connection,\n config: ScheduleConfig,\n instruction: () => Promise<T>,\n): Promise<T> {\n const early = config.early ?? 0.10;\n const late = config.late ?? 0.90;\n\n const snapshot = await getEpochSnapshot(connection);\n const progress = snapshot.slot / snapshot.slotsInEpoch;\n\n // Case 1: Already in safe zone\n if (progress >= early && progress <= late) {\n return instruction();\n }\n\n // Case 2: Early in epoch → wait until `early`\n if (progress < early) {\n const targetSlot = snapshot.slotsInEpoch * early;\n const slotsRemaining = targetSlot - snapshot.slot;\n const msToWait = slotsRemaining * snapshot.slotMs;\n\n console.log(\n `Epoch early (${(progress * 100).toFixed(\n 2,\n )}%). Sleeping ${(msToWait / 1000).toFixed(1)}s until ${early * 100\n }%...`,\n );\n\n await sleep(Math.max(1000, msToWait));\n return instruction();\n }\n\n // Case 3: Late in epoch → wait for next epoch + early window\n const msToNextEpoch = msToEpochEnd(snapshot);\n const earlyWaitTime = snapshot.slotsInEpoch * early * snapshot.slotMs;\n const totalWaitTime = msToNextEpoch + earlyWaitTime + 1000;\n\n console.log(\n `Epoch late (${(progress * 100).toFixed(\n 2,\n )}%). Sleeping ${(totalWaitTime / 1000).toFixed(\n 1,\n )}s until next epoch + ${early * 100}%...`,\n );\n\n await sleep(totalWaitTime);\n return instruction();\n}\n\n\n// -----------------------------------------------------------------------------\n// Generic helpers (used in tests + can be useful in apps)\n// -----------------------------------------------------------------------------\n\nexport function getErrorMessage(error: any): string {\n return (\n error?.error?.errorCode?.code ||\n error?.error?.errorMessage ||\n error?.message ||\n ''\n );\n}\n\nexport function generateRandomDepositAmount(\n minSol = 2,\n maxSol = 100,\n): BN {\n const randomSol = Math.random() * (maxSol - minSol) + minSol;\n return new BN(solToLamports(randomSol));\n}\n\nexport function generateTestKeypair(): Keypair {\n return Keypair.generate();\n}\n\nexport async function airdropSol(\n connection: Connection,\n publicKey: PublicKey,\n amountSol: number,\n): Promise<void> {\n const lamports = solToLamports(amountSol);\n const sig = await connection.requestAirdrop(publicKey, lamports);\n await connection.confirmTransaction(sig, 'confirmed');\n}\n\nexport async function waitForConfirmation(\n connection: Connection,\n signature: string,\n): Promise<void> {\n await connection.confirmTransaction(signature, 'confirmed');\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Simple helper used in tests: wait until safe zone, no-op.\n */\nexport async function waitUntilSafeToExecuteFunction(\n connection: Connection,\n config: ScheduleConfig = {},\n): Promise<void> {\n await scheduledInstruction(connection, config, async () => {\n // no-op\n return;\n });\n}\n\nexport interface ScheduleConfig {\n early?: number; // fraction of epoch, default 0.10\n late?: number; // fraction of epoch, default 0.90\n}\n\n"],"names":["PublicKey","liqSolTokenIDL","validatorLeaderboardIDL","__async","StakeProgram","liqsolCoreJson","Program","getAssociatedTokenAddressSync","TOKEN_2022_PROGRAM_ID","__pow","BN","SystemProgram","ASSOCIATED_TOKEN_PROGRAM_ID","SYSVAR_INSTRUCTIONS_PUBKEY","SYSVAR_CLOCK_PUBKEY","SYSVAR_STAKE_HISTORY_PUBKEY","SYSVAR_RENT_PUBKEY","Transaction","getAssociatedTokenAddress","tx","KeyType","Connection","AnchorProvider","SolPubKey","_a","ethers","Contract","BigNumber","SolChainID","EvmChainID","Keypair"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}