@wireio/stake 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/README.md +57 -0
  2. package/lib/stake.browser.js +11836 -4103
  3. package/lib/stake.browser.js.map +1 -1
  4. package/lib/stake.d.ts +374 -556
  5. package/lib/stake.js +12089 -4303
  6. package/lib/stake.js.map +1 -1
  7. package/lib/stake.m.js +11836 -4103
  8. package/lib/stake.m.js.map +1 -1
  9. package/package.json +1 -1
  10. package/src/assets/ethereum/ABI/liqEth/DepositManager.sol/DepositManager.dbg.json +4 -0
  11. package/src/assets/ethereum/ABI/liqEth/DepositManager.sol/DepositManager.json +1153 -0
  12. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IAccounting.dbg.json +4 -0
  13. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IAccounting.json +172 -0
  14. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IDepositContract.dbg.json +4 -0
  15. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IDepositContract.json +39 -0
  16. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IDepositManager.dbg.json +4 -0
  17. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IDepositManager.json +64 -0
  18. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/ILiqEthBurn.dbg.json +4 -0
  19. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/ILiqEthBurn.json +24 -0
  20. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/ILiqEthMint.dbg.json +4 -0
  21. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/ILiqEthMint.json +35 -0
  22. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IRewardsERC20.dbg.json +4 -0
  23. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IRewardsERC20.json +213 -0
  24. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IStakingModule.dbg.json +4 -0
  25. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IStakingModule.json +138 -0
  26. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IValidatorBalanceVerifier.dbg.json +4 -0
  27. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IValidatorBalanceVerifier.json +70 -0
  28. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IWithdrawalRecord.dbg.json +4 -0
  29. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IWithdrawalRecord.json +64 -0
  30. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/LiqEthCommon.dbg.json +4 -0
  31. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/LiqEthCommon.json +10 -0
  32. package/src/assets/ethereum/ABI/liqEth/RewardsERC20.sol/RewardsERC20.dbg.json +4 -0
  33. package/src/assets/ethereum/ABI/liqEth/RewardsERC20.sol/RewardsERC20.json +749 -0
  34. package/src/assets/ethereum/ABI/liqEth/RewardsERC20Pausable.sol/RewardsERC20Pausable.dbg.json +4 -0
  35. package/src/assets/ethereum/ABI/liqEth/RewardsERC20Pausable.sol/RewardsERC20Pausable.json +812 -0
  36. package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/BeaconRoots.dbg.json +4 -0
  37. package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/BeaconRoots.json +10 -0
  38. package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/SSZ.dbg.json +4 -0
  39. package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/SSZ.json +10 -0
  40. package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/ValidatorBalanceVerifier.dbg.json +4 -0
  41. package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/ValidatorBalanceVerifier.json +225 -0
  42. package/src/assets/ethereum/ABI/liqEth/Yield.sol/BeaconRoots.dbg.json +4 -0
  43. package/src/assets/ethereum/ABI/liqEth/Yield.sol/BeaconRoots.json +10 -0
  44. package/src/assets/ethereum/ABI/liqEth/Yield.sol/SSZ.dbg.json +4 -0
  45. package/src/assets/ethereum/ABI/liqEth/Yield.sol/SSZ.json +10 -0
  46. package/src/assets/ethereum/ABI/liqEth/Yield.sol/YieldOracle.dbg.json +4 -0
  47. package/src/assets/ethereum/ABI/liqEth/Yield.sol/YieldOracle.json +813 -0
  48. package/src/assets/ethereum/ABI/liqEth/accounting.sol/Accounting.dbg.json +4 -0
  49. package/src/assets/ethereum/ABI/liqEth/accounting.sol/Accounting.json +651 -0
  50. package/src/assets/ethereum/ABI/liqEth/liqEth.sol/LiqEthToken.dbg.json +4 -0
  51. package/src/assets/ethereum/ABI/liqEth/liqEth.sol/LiqEthToken.json +1110 -0
  52. package/src/assets/ethereum/ABI/liqEth/liqEthBurn.sol/LiqEthBurn.dbg.json +4 -0
  53. package/src/assets/ethereum/ABI/liqEth/liqEthBurn.sol/LiqEthBurn.json +391 -0
  54. package/src/assets/ethereum/ABI/liqEth/liqEthMint.sol/LiqEthMint.dbg.json +4 -0
  55. package/src/assets/ethereum/ABI/liqEth/liqEthMint.sol/LiqEthMint.json +402 -0
  56. package/src/assets/ethereum/ABI/liqEth/stakingModule.sol/StakingModule.dbg.json +4 -0
  57. package/src/assets/ethereum/ABI/liqEth/stakingModule.sol/StakingModule.json +1225 -0
  58. package/src/assets/ethereum/ABI/liqEth/withdrawalQueue.sol/WithdrawalQueue.dbg.json +4 -0
  59. package/src/assets/ethereum/ABI/liqEth/withdrawalQueue.sol/WithdrawalQueue.json +927 -0
  60. package/src/assets/ethereum/ABI/liqEth/withdrawalVault.sol/Uint64BE.dbg.json +4 -0
  61. package/src/assets/ethereum/ABI/liqEth/withdrawalVault.sol/Uint64BE.json +10 -0
  62. package/src/assets/ethereum/ABI/liqEth/withdrawalVault.sol/WithdrawalVault.dbg.json +4 -0
  63. package/src/assets/ethereum/ABI/liqEth/withdrawalVault.sol/WithdrawalVault.json +447 -0
  64. package/src/assets/solana/idl/liqsol_core.json +4239 -0
  65. package/src/assets/solana/idl/liqsol_token.json +183 -0
  66. package/src/assets/solana/idl/validator_leaderboard.json +270 -265
  67. package/src/assets/solana/types/liqsol_core.ts +4245 -0
  68. package/src/assets/solana/types/liqsol_token.ts +189 -0
  69. package/src/assets/solana/types/validator_leaderboard.ts +270 -265
  70. package/src/index.ts +1 -3
  71. package/src/networks/ethereum/contract.ts +101 -36
  72. package/src/networks/ethereum/ethereum.ts +141 -45
  73. package/src/networks/ethereum/types.ts +30 -2
  74. package/src/networks/solana/clients/deposit.client.ts +71 -109
  75. package/src/networks/solana/clients/distribution.client.ts +256 -383
  76. package/src/networks/solana/clients/leaderboard.client.ts +38 -133
  77. package/src/networks/solana/constants.ts +214 -130
  78. package/src/networks/solana/program.ts +25 -38
  79. package/src/networks/solana/solana.ts +120 -105
  80. package/src/networks/solana/types.ts +37 -47
  81. package/src/networks/solana/utils.ts +551 -0
  82. package/src/scripts/tsconfig.json +17 -0
  83. package/src/staker/staker.ts +10 -6
  84. package/src/staker/types.ts +14 -9
  85. package/src/assets/solana/idl/deposit.json +0 -296
  86. package/src/assets/solana/idl/distribution.json +0 -768
  87. package/src/assets/solana/idl/liq_sol_token.json +0 -298
  88. package/src/assets/solana/idl/mint_helper.json +0 -110
  89. package/src/assets/solana/idl/read_tracked_balance.json +0 -140
  90. package/src/assets/solana/idl/stake_controller.json +0 -2149
  91. package/src/assets/solana/idl/treasury.json +0 -110
  92. package/src/assets/solana/idl/validator_registry.json +0 -487
  93. package/src/assets/solana/idl/yield_oracle.json +0 -32
  94. package/src/assets/solana/types/deposit.ts +0 -302
  95. package/src/assets/solana/types/distribution.ts +0 -774
  96. package/src/assets/solana/types/liq_sol_token.ts +0 -304
  97. package/src/assets/solana/types/mint_helper.ts +0 -116
  98. package/src/assets/solana/types/read_tracked_balance.ts +0 -146
  99. package/src/assets/solana/types/stake_controller.ts +0 -2155
  100. package/src/assets/solana/types/stake_registry.ts +0 -441
  101. package/src/assets/solana/types/treasury.ts +0 -116
  102. package/src/assets/solana/types/validator_registry.ts +0 -493
  103. package/src/assets/solana/types/yield_oracle.ts +0 -38
  104. package/src/common/utils.ts +0 -9
@@ -1 +1 @@
1
- {"version":3,"file":"stake.browser.js","sources":["../src/common/utils.ts","../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/solana.ts","../src/staker/staker.ts","../src/networks/ethereum/contract.ts","../src/networks/ethereum/ethereum.ts","../src/networks/ethereum/types.ts","../src/networks/solana/clients/leaderboard.client.ts"],"sourcesContent":["/**\n * Static utility functions for working with Wire Network Staking Protocol.\n * \n * @module utils\n */\n\nexport const hi = (name: string): string => {\n return `Hello, ${name}!`;\n}","// src/networks/solana/constants.ts\nimport { PublicKey } from '@solana/web3.js';\nimport {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n TOKEN_2022_PROGRAM_ID,\n getAssociatedTokenAddressSync,\n} from '@solana/spl-token';\nimport { AnchorProvider, Program } from '@coral-xyz/anchor';\n\n// IDLs (as generated artifacts)\nimport DepositIDL from '../../assets/solana/idl/deposit.json';\nimport StakeControllerIDL from '../../assets/solana/idl/stake_controller.json';\nimport ValidatorLeaderboardIDL from '../../assets/solana/idl/validator_leaderboard.json';\nimport LiqSolTokenIDL from '../../assets/solana/idl/liq_sol_token.json';\nimport DistributionIDL from '../../assets/solana/idl/distribution.json';\nimport YieldOracleIDL from '../../assets/solana/idl/yield_oracle.json';\n\n// Types (optional; keep the ones you use)\nimport type { Deposit } from '../../assets/solana/types/deposit';\n\n// ---------- Program IDs (from IDL.address) ----------\nexport const DEPOSIT_PROGRAM_ID = new PublicKey(DepositIDL.address);\nexport const STAKE_CONTROLLER_PROGRAM_ID = new PublicKey(StakeControllerIDL.address);\nexport const VALIDATOR_LEADERBOARD_PROGRAM_ID = new PublicKey(ValidatorLeaderboardIDL.address);\nexport const LIQSOL_TOKEN_PROGRAM_ID = new PublicKey(LiqSolTokenIDL.address);\nexport const DISTRIBUTION_PROGRAM_ID = new PublicKey(DistributionIDL.address);\nexport const YIELD_ORACLE_PROGRAM_ID = new PublicKey(YieldOracleIDL.address);\n\n// ---------- Protocol constants ----------\nexport const MIN_SOL_TO_PARTICIPATE = 1_000_000_000; // 1 SOL (lamports)\n\n// The liqSOL Mint is a PDA on the LiqSOL token program\nexport const LIQSOL_MINT_ADDRESS: PublicKey = PublicKey.findProgramAddressSync(\n [Buffer.from('liq_sol_mint')],\n LIQSOL_TOKEN_PROGRAM_ID\n)[0];\n\n// Re-export SPL ids\nexport { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID };\n\n// ---------- Program factories ----------\n/** Create Anchor Program client for the Deposit program (with correct address) */\nexport const getDepositProgram = (provider: AnchorProvider): Program<Deposit> => {\n const idlWithAddress = { ...JSON.parse(JSON.stringify(DepositIDL)), address: DEPOSIT_PROGRAM_ID.toString() };\n return new Program(idlWithAddress as any, provider) as Program<Deposit>;\n};\n\n// You can add similar helpers for other programs if you want:\n// export const getDistributionProgram = <T>(provider: AnchorProvider) => { ... }\n\n// ---------- PDA helpers ----------\n\n// Deposit\nexport const deriveDepositAuthorityPDA = (): [PublicKey, number] =>\n PublicKey.findProgramAddressSync(\n [Buffer.from('program_authority')], \n DEPOSIT_PROGRAM_ID\n );\n\n// LiqSOL Token program\nexport const deriveLiqsolMintPDA = (): [PublicKey, number] =>\n PublicKey.findProgramAddressSync(\n [Buffer.from('liq_sol_mint')], \n LIQSOL_TOKEN_PROGRAM_ID\n );\n\n/** ✅ FIXED: this must be derived with the LiqSOL token **program id**, not the mint address */\nexport const deriveLiqsolMintAuthorityPDA = (): [PublicKey, number] =>\n PublicKey.findProgramAddressSync(\n [Buffer.from('mint_authority')], \n LIQSOL_TOKEN_PROGRAM_ID\n );\n\n// Stake Controller\nexport const deriveStakeControllerVaultPDA = (): [PublicKey, number] =>\n PublicKey.findProgramAddressSync(\n [Buffer.from('vault')], \n STAKE_CONTROLLER_PROGRAM_ID\n );\n\nexport const deriveStakeControllerReservePoolPDA = (): [PublicKey, number] =>\n PublicKey.findProgramAddressSync(\n [Buffer.from('reserve_pool')], \n STAKE_CONTROLLER_PROGRAM_ID\n );\n\nexport const deriveStakeControllerStatePDA = (): [PublicKey, number] =>\n PublicKey.findProgramAddressSync(\n [Buffer.from('stake_controller')], \n STAKE_CONTROLLER_PROGRAM_ID\n );\n\nexport const deriveGlobalStakeInfoPDA = (): [PublicKey, number] =>\n PublicKey.findProgramAddressSync(\n [Buffer.from('global_stake_info')], \n STAKE_CONTROLLER_PROGRAM_ID\n );\n\nexport const deriveBucketAuthorityPDA = (): [PublicKey, number] =>\n PublicKey.findProgramAddressSync(\n [Buffer.from('liqsol_bucket')], \n STAKE_CONTROLLER_PROGRAM_ID\n );\n\nexport const derivePayRateHistoryPDA = (): [PublicKey, number] =>\n PublicKey.findProgramAddressSync(\n [Buffer.from('pay_rate_history')], \n STAKE_CONTROLLER_PROGRAM_ID\n );\n\n// Distribution\nexport const deriveDistributionStatePDA = (): [PublicKey, number] =>\n PublicKey.findProgramAddressSync(\n [Buffer.from('distribution_state')], \n DISTRIBUTION_PROGRAM_ID\n );\n\nexport const deriveUserRecordPDA = (user: PublicKey): [PublicKey, number] =>\n PublicKey.findProgramAddressSync(\n [Buffer.from('user_record'), user.toBuffer()], \n DISTRIBUTION_PROGRAM_ID\n );\n\n// Validator Leaderboard\nexport const deriveLeaderboardHeadPDA = (): [PublicKey, number] =>\n PublicKey.findProgramAddressSync(\n [Buffer.from('leaderboard_head')], \n VALIDATOR_LEADERBOARD_PROGRAM_ID\n );\n\nexport const deriveValidatorRecordPDA = (voteAccount: PublicKey): [PublicKey, number] =>\n PublicKey.findProgramAddressSync(\n [Buffer.from('validator_record'), voteAccount.toBuffer()], \n VALIDATOR_LEADERBOARD_PROGRAM_ID\n );\n\nexport const deriveTop10CachePDA = (): [PublicKey, number] =>\n PublicKey.findProgramAddressSync(\n [Buffer.from('top_10_cache')], \n VALIDATOR_LEADERBOARD_PROGRAM_ID\n );\n\nexport const deriveStakeControllerAuthorityPDA = (): [PublicKey, number] =>\n PublicKey.findProgramAddressSync(\n [Buffer.from('stake_authority')],\n STAKE_CONTROLLER_PROGRAM_ID\n );\n\n// ---------- SPL helper ----------\n/** User’s liqSOL ATA (Token-2022) */\nexport const getUserLiqsolATA = (user: PublicKey): PublicKey =>\n getAssociatedTokenAddressSync(\n LIQSOL_MINT_ADDRESS,\n user,\n /* owner is PDA? */ false,\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID\n );","import { AnchorProvider, Program } from '@coral-xyz/anchor';\nimport depositJson from '../../assets/solana/idl/deposit.json';\nimport stakeControllerJson from '../../assets/solana/idl/stake_controller.json';\nimport liqSolTokenJson from '../../assets/solana/idl/liq_sol_token.json';\nimport distributionJson from '../../assets/solana/idl/distribution.json';\nimport validatorLeaderboardJson from '../../assets/solana/idl/validator_leaderboard.json';\n\nimport type { Deposit } from '../../assets/solana/types/deposit';\nimport type { StakeController } from '../../assets/solana/types/stake_controller';\nimport type { LiqSolToken } from '../../assets/solana/types/liq_sol_token';\nimport type { Distribution } from '../../assets/solana/types/distribution';\nimport type { ValidatorLeaderboard } from '../../assets/solana/types/validator_leaderboard';\n\nimport {\n DEPOSIT_PROGRAM_ID,\n STAKE_CONTROLLER_PROGRAM_ID,\n LIQSOL_TOKEN_PROGRAM_ID,\n DISTRIBUTION_PROGRAM_ID,\n VALIDATOR_LEADERBOARD_PROGRAM_ID\n} from '../solana/constants';\n\ntype Entry<IDL> = { idl: IDL & { address: string }, address: string };\n\nconst PROGRAMS = {\n deposit: {\n idl: depositJson,\n address: DEPOSIT_PROGRAM_ID.toBase58()\n } as Entry<Deposit>,\n stakeController: {\n idl: stakeControllerJson,\n address: STAKE_CONTROLLER_PROGRAM_ID.toBase58()\n } as Entry<StakeController>,\n liqSolToken: {\n idl: liqSolTokenJson,\n address: LIQSOL_TOKEN_PROGRAM_ID.toBase58()\n } as Entry<LiqSolToken>,\n distribution: {\n idl: distributionJson,\n address: DISTRIBUTION_PROGRAM_ID.toBase58()\n } as Entry<Distribution>,\n validatorLeaderboard: {\n idl: validatorLeaderboardJson,\n address:VALIDATOR_LEADERBOARD_PROGRAM_ID.toBase58()\n } as Entry<ValidatorLeaderboard>,\n} as const;\n\nexport class SolanaProgramService {\n constructor(private provider: AnchorProvider) { }\n\n getProgram<K extends keyof typeof PROGRAMS>(name: K): Program<(typeof PROGRAMS)[K]['idl']> {\n const { idl, address } = PROGRAMS[name];\n // Ensure the IDL has the right address (avoid drift)\n const idlWithAddr = { ...idl, address };\n return new Program(idlWithAddr as any, this.provider) as Program<(typeof PROGRAMS)[K]['idl']>;\n }\n\n listProgramNames(): Array<keyof typeof PROGRAMS> {\n return Object.keys(PROGRAMS) as Array<keyof typeof PROGRAMS>;\n }\n}","import { AnchorProvider, BN } from '@coral-xyz/anchor';\nimport {\n PublicKey,\n Transaction,\n SystemProgram,\n SYSVAR_INSTRUCTIONS_PUBKEY,\n SYSVAR_CLOCK_PUBKEY,\n SYSVAR_RENT_PUBKEY,\n SYSVAR_STAKE_HISTORY_PUBKEY,\n StakeProgram,\n ComputeBudgetProgram,\n VersionedTransaction,\n Signer,\n TransactionSignature,\n} from '@solana/web3.js';\n\nimport {\n getAssociatedTokenAddress,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n TOKEN_2022_PROGRAM_ID\n} from '@solana/spl-token';\n\nimport {\n STAKE_CONTROLLER_PROGRAM_ID,\n LIQSOL_TOKEN_PROGRAM_ID,\n DISTRIBUTION_PROGRAM_ID,\n MIN_SOL_TO_PARTICIPATE,\n deriveDepositAuthorityPDA,\n deriveLiqsolMintPDA,\n deriveLiqsolMintAuthorityPDA,\n deriveStakeControllerReservePoolPDA,\n deriveStakeControllerVaultPDA,\n deriveStakeControllerStatePDA,\n deriveGlobalStakeInfoPDA,\n deriveBucketAuthorityPDA,\n deriveDistributionStatePDA,\n deriveUserRecordPDA,\n derivePayRateHistoryPDA,\n} from '../constants';\nimport { SolanaProgramService } from '../program';\n\n/**\n * DepositClient: builds, simulates, and sends deposit txns matching the latest IDL.\n *\n */\nexport class DepositClient {\n private programs = new SolanaProgramService(this.provider);\n\n constructor(private provider: AnchorProvider) { }\n\n /**\n * Build the deposit transaction (compute-budget bump + deposit Ix).\n * Returns the Transaction and the derived ephemeral stake pubkey.\n */\n async buildDepositTx(\n user: PublicKey,\n amount: number\n ): Promise<{ transaction: Transaction; ephemeralStakePubkey: PublicKey }> {\n if (amount < MIN_SOL_TO_PARTICIPATE) {\n throw new Error(`Minimum deposit is ${MIN_SOL_TO_PARTICIPATE / 1e9} SOL`);\n }\n\n const program = this.programs.getProgram('deposit');\n\n // PDAs\n const [programAuthority] = deriveDepositAuthorityPDA();\n const [liqsolMint] = deriveLiqsolMintPDA();\n const [liqsolMintAuthority] = deriveLiqsolMintAuthorityPDA();\n const [reservePool] = deriveStakeControllerReservePoolPDA();\n const [vault] = deriveStakeControllerVaultPDA();\n const [controllerState] = deriveStakeControllerStatePDA();\n const [globalStakeInfo] = deriveGlobalStakeInfoPDA();\n const [bucketAuthority] = deriveBucketAuthorityPDA();\n const [distributionState] = deriveDistributionStatePDA();\n const [userRecord] = deriveUserRecordPDA(user);\n const [payRateHistory] = derivePayRateHistoryPDA();\n\n // Token-2022 ATAs\n const userAta = await getAssociatedTokenAddress(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID\n );\n const bucketTokenAccount = await getAssociatedTokenAddress(\n liqsolMint,\n bucketAuthority,\n /* allowOwnerOffCurve */ true,\n TOKEN_2022_PROGRAM_ID\n );\n\n // Ephemeral stake account\n const seed = Math.floor(Math.random() * 0xffffffff);\n const ephemeralSeed = `ephemeral_${seed}`;\n const ephemeralStakePubkey = await PublicKey.createWithSeed(\n user,\n ephemeralSeed,\n StakeProgram.programId\n );\n\n // Build the deposit instruction\n const depositIx = await program.methods\n .deposit(new BN(amount), seed)\n .accounts({\n user,\n programAuthority,\n systemProgram: SystemProgram.programId,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n stakeControllerProgram: STAKE_CONTROLLER_PROGRAM_ID,\n liqsolProgram: LIQSOL_TOKEN_PROGRAM_ID,\n payRateHistory,\n stakeProgram: StakeProgram.programId,\n distributionProgram: DISTRIBUTION_PROGRAM_ID,\n\n // mints / ATAs / PDAs\n liqsolMint,\n userAta,\n liqsolMintAuthority,\n reservePool,\n vault,\n ephemeralStake: ephemeralStakePubkey,\n controllerState,\n globalStakeInfo,\n bucketAuthority,\n bucketTokenAccount,\n userRecord,\n distributionState,\n\n // sysvars\n instructionsSysvar: SYSVAR_INSTRUCTIONS_PUBKEY,\n clock: SYSVAR_CLOCK_PUBKEY,\n stakeHistory: SYSVAR_STAKE_HISTORY_PUBKEY,\n rent: SYSVAR_RENT_PUBKEY,\n } as any)\n .instruction();\n\n // Prepend compute-budget bump\n const computeIx = ComputeBudgetProgram.setComputeUnitLimit({ units: 400_000 });\n const tx = new Transaction().add(computeIx, depositIx);\n return { transaction: tx, ephemeralStakePubkey };\n }\n\n /** Simulate a transaction (dry-run). */\n async simulate(tx: Transaction): Promise<{ err: any; unitsConsumed: number }> {\n tx.feePayer = this.provider.wallet.publicKey;\n const { blockhash } = await this.provider.connection.getLatestBlockhash();\n tx.recentBlockhash = blockhash;\n\n const versioned = new VersionedTransaction(tx.compileMessage());\n const sim = await this.provider.connection.simulateTransaction(versioned, {\n sigVerify: false,\n });\n return { err: sim.value.err, unitsConsumed: sim.value.unitsConsumed! };\n }\n\n /** Build + send. Returns confirmed signature. */\n async deposit(\n user: PublicKey,\n amount: number,\n signers: Signer[] = []\n ): Promise<TransactionSignature> {\n const { transaction } = await this.buildDepositTx(user, amount);\n transaction.feePayer = this.provider.wallet.publicKey;\n const { blockhash } = await this.provider.connection.getLatestBlockhash();\n transaction.recentBlockhash = blockhash;\n return this.provider.sendAndConfirm(transaction, signers);\n }\n}","import { AnchorProvider, Program, BN } from '@coral-xyz/anchor';\nimport {\n PublicKey,\n SystemProgram,\n SYSVAR_INSTRUCTIONS_PUBKEY,\n Transaction,\n TransactionInstruction,\n} from '@solana/web3.js';\nimport {\n getAccount,\n getAssociatedTokenAddressSync,\n} from '@solana/spl-token';\n\nimport { SolanaProgramService } from '../program';\nimport {\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n STAKE_CONTROLLER_PROGRAM_ID,\n YIELD_ORACLE_PROGRAM_ID,\n deriveDistributionStatePDA,\n deriveUserRecordPDA,\n deriveStakeControllerStatePDA,\n deriveBucketAuthorityPDA,\n derivePayRateHistoryPDA,\n deriveStakeControllerAuthorityPDA,\n} from '../constants';\nimport { Distribution } from '../../../assets/solana/types/distribution';\nimport { MismatchCandidate, CorrectAndRegisterBuild, CorrectionPlan } from '../types';\n\nexport class DistributionClient {\n private programs: SolanaProgramService;\n\n constructor(private provider: AnchorProvider) {\n this.programs = new SolanaProgramService(provider);\n }\n\n /** Anchor Program<Distribution> (address comes from SolanaProgramService) */\n private get program(): Program<Distribution> {\n return this.programs.getProgram('distribution') as Program<Distribution>;\n }\n\n // ───────────────────────────────────────────────────────────────────────────────\n // BASIC READS\n // ───────────────────────────────────────────────────────────────────────────────\n\n /**\n * Fetch Distribution global state.\n */\n async getDistributionState(): Promise<any> {\n const [pda] = deriveDistributionStatePDA();\n return this.program.account.distributionState.fetch(pda);\n }\n\n /**\n * Fetch a user’s UserRecord or null if it doesn’t exist yet.\n */\n async getUserRecord(user: PublicKey): Promise<any | null> {\n const [pda] = deriveUserRecordPDA(user);\n try { return await this.program.account.userRecord.fetch(pda); }\n catch { return null; }\n }\n\n /**\n * Read protocol-tracked balance for a user (from userRecord).\n * Returns (amount, decimals).\n * @default decimals=9\n */\n async getTrackedBalance(user: PublicKey): Promise<{ amount: bigint; decimals: number }> {\n const rec = await this.getUserRecord(user);\n if (!rec) return { amount: ZERO, decimals: 9 };\n const amountStr: string = rec.trackedBalance?.toString?.() ?? '0';\n return { amount: BigInt(amountStr), decimals: 9 };\n }\n\n /**\n * Read *actual* liqSOL token balance (ATA) for a user.\n * If user has no ATA yet, returns 0.\n * @returns { amount, decimals, ata }\n */\n async getActualBalance(user: PublicKey): Promise<{ amount: bigint; decimals: number; ata: PublicKey }> {\n const state = await this.getDistributionState();\n const liqsolMint: PublicKey = state.liqsolMint;\n const ata = getAssociatedTokenAddressSync(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID\n );\n try {\n const acc = await getAccount(this.provider.connection, ata, 'confirmed', TOKEN_2022_PROGRAM_ID);\n // spl-token returns bigint amount\n return { amount: acc.amount as unknown as bigint, decimals: 9, ata };\n } catch {\n return { amount: ZERO, decimals: 9, ata };\n }\n }\n\n // ───────────────────────────────────────────────────────────────────────────────\n // STATE-CHANGING ACTIONS (single-user)\n // ───────────────────────────────────────────────────────────────────────────────\n\n /**\n * Register / Update a user’s record.\n * - If updating someone else, pass their pubkey as `targetUser` and let the connected wallet be `authority`.\n * - Optionally pass an explicit `authorityUser` if you need to override (must be the connected wallet).\n * Returns the tx signature.\n */\n /**\n * Register / Update a user’s record with the connected wallet as authority.\n * Keeps a single source of truth via `prepareUpdateUser()`.\n */\n async updateUser(targetUser: PublicKey): Promise<string> {\n const { builder } = await this.prepareUpdateUser(targetUser);\n return builder.rpc();\n }\n\n /** Build-only variant (returns the IX) so you can batch. */\n async buildUpdateUserIx(targetUser: PublicKey): Promise<TransactionInstruction> {\n const { builder } = await this.prepareUpdateUser(targetUser);\n return builder.instruction();\n }\n\n /**\n * Claim rewards for a user.\n * @returns tx signature\n */\n async claimRewards(user: PublicKey): Promise<string> {\n const state = await this.getDistributionState();\n const liqsolMint: PublicKey = state.liqsolMint;\n\n const userAta = getAssociatedTokenAddressSync(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID\n );\n\n const [userRecordPDA] = deriveUserRecordPDA(user);\n const [distributionStatePDA] = deriveDistributionStatePDA();\n const [bucketAuthority] = deriveBucketAuthorityPDA();\n const [payRateHistory] = derivePayRateHistoryPDA();\n\n const bucketTokenAccount = getAssociatedTokenAddressSync(\n liqsolMint,\n bucketAuthority,\n true,\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID\n );\n\n const sig = await this.program.methods\n .claimRewards()\n .accounts({\n user,\n // @ts-ignore\n userAta,\n userRecord: userRecordPDA,\n distributionState: distributionStatePDA,\n liqsolMint,\n stakeControllerProgram: STAKE_CONTROLLER_PROGRAM_ID,\n bucketAuthority,\n bucketTokenAccount,\n payRateHistory,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .rpc();\n\n return sig;\n }\n\n /**\n * Withdraw liqSOL (amount in base units; e.g. 1e9 = 1 liqSOL).\n * @returns tx signature\n */\n async withdraw(user: PublicKey, amount: bigint | number): Promise<string> {\n const state = await this.getDistributionState();\n const liqsolMint: PublicKey = state.liqsolMint;\n\n const userAta = getAssociatedTokenAddressSync(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID\n );\n\n const [userRecordPDA] = deriveUserRecordPDA(user);\n const [distributionStatePDA] = deriveDistributionStatePDA();\n const [stakeControllerState] = deriveStakeControllerStatePDA();\n const [controllerAuthority] = deriveStakeControllerAuthorityPDA();\n\n const sig = await this.program.methods\n .withdraw(new BN(amount.toString()))\n .accounts({\n user,\n // @ts-ignore\n userAta,\n userRecord: userRecordPDA,\n distributionState: distributionStatePDA,\n liqsolMint,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n stakeControllerProgram: STAKE_CONTROLLER_PROGRAM_ID,\n stakeControllerState,\n controllerAuthority,\n yieldOracleProgram: YIELD_ORACLE_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .rpc();\n\n return sig;\n }\n\n // ───────────────────────────────────────────────────────────────────────────────\n // INSTRUCTION BUILDERS (for bundling into 1 tx)\n // ───────────────────────────────────────────────────────────────────────────────\n\n /** Single prep path used by both send & build. */\n private async prepareUpdateUser(targetUser: PublicKey) {\n const authority = this.provider.wallet?.publicKey;\n if (!authority) throw new Error('Wallet not connected');\n\n const state = await this.getDistributionState();\n const liqsolMint: PublicKey = state.liqsolMint;\n\n const targetUserAta = getAssociatedTokenAddressSync(\n liqsolMint,\n targetUser,\n false,\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID\n );\n\n const [targetUserRecordPDA] = deriveUserRecordPDA(targetUser);\n const [distributionStatePDA] = deriveDistributionStatePDA();\n const [payRateHistory] = derivePayRateHistoryPDA();\n\n const accounts = {\n user: targetUser,\n userAta: targetUserAta,\n // @ts-ignore (account name casing differences)\n userRecord: targetUserRecordPDA,\n authority,\n payer: authority,\n distributionState: distributionStatePDA,\n liqsolMint,\n instructionsSysvar: SYSVAR_INSTRUCTIONS_PUBKEY,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n stakeControllerProgram: STAKE_CONTROLLER_PROGRAM_ID,\n payRateHistory,\n systemProgram: SystemProgram.programId,\n };\n\n const builder = this.program.methods.updateUser().accounts(accounts as any);\n return { builder, accounts };\n }\n\n // ───────────────────────────────────────────────────────────────────────────────\n // ONE-SHOT BUILDER: correct 0..N others, then register self\n // ───────────────────────────────────────────────────────────────────────────────\n\n /**\n * Build a single transaction that:\n * 1) If self mismatch < 0 → just correct self (single updateUser).\n * 2) Else (mismatch > 0) → correct top candidates (if needed) to free “available” balance\n * and then register self (updateUser).\n *\n * It refuses to build if it can’t free enough to cover the full positive untracked amount\n * (since updateUser has no partial-amount arg).\n */\n async buildCorrectRegisterTx(opts?: {\n /** optional override of computed mismatch; may be positive (register) or negative (self-correct) */\n amount?: bigint;\n /** optionally pass pre-fetched candidates to avoid re-reading on UI flows */\n preloadCandidates?: MismatchCandidate[];\n }): Promise<CorrectAndRegisterBuild> {\n const self = this.provider.wallet?.publicKey;\n if (!self) throw new Error('Wallet not connected');\n\n const state = await this.getDistributionState();\n const liqsolMint: PublicKey = state.liqsolMint;\n const availableBefore = BigInt(state.availableBalance.toString());\n\n // self balances\n const [selfUserRecordPda] = deriveUserRecordPDA(self);\n const { amount: selfTracked } = await this.getTrackedBalance(self);\n const { amount: selfActual, ata: selfUserAta } = await this.getActualBalance(self);\n\n // True on-chain mismatch (can be negative or positive)\n const computedMismatch = selfActual - selfTracked; // + = need to register, - = need to correct self\n\n // Allow caller to suggest an amount (mainly for planning); clamp to real mismatch\n let desired = opts?.amount ?? computedMismatch;\n if (computedMismatch >= ZERO) {\n // clamp down to computedMismatch\n if (desired < ZERO) desired = ZERO;\n if (desired > computedMismatch) desired = computedMismatch;\n } else {\n // negative side: clamp up to computedMismatch (remember computedMismatch is negative)\n if (desired > ZERO) desired = ZERO;\n if (desired < computedMismatch) desired = computedMismatch;\n }\n\n // CASE A: Negative mismatch → just correct self\n if (desired < ZERO) {\n console.log('Building Correct transaction for self with amount:', desired);\n\n const tx = new Transaction().add(await this.buildUpdateUserIx(self));\n return {\n canSucceed: true,\n transaction: tx,\n liqsolMint,\n needToRegister: desired, // negative indicates self-correction\n availableBefore,\n candidates: [],\n plan: { selected: [], willFree: ZERO, deficit: ZERO },\n accounts: { selfUserRecordPda, selfUserAta },\n };\n }\n\n // Reuse the existing “positive mismatch” path\n const needToRegister = desired; // >= 0\n if (needToRegister === ZERO) {\n return {\n canSucceed: false,\n reason: 'No mismatch to resolve.',\n liqsolMint,\n needToRegister,\n availableBefore,\n candidates: [],\n plan: { selected: [], willFree: ZERO, deficit: ZERO },\n accounts: { selfUserRecordPda, selfUserAta },\n };\n }\n\n // Already enough available → just register self\n if (availableBefore >= needToRegister) {\n console.log('Available balance', availableBefore, 'is enough to register self:', needToRegister);\n const registerIx = await this.buildUpdateUserIx(self);\n const tx = new Transaction().add(registerIx);\n return {\n canSucceed: true,\n transaction: tx,\n liqsolMint,\n needToRegister,\n availableBefore,\n candidates: [],\n plan: { selected: [], willFree: ZERO, deficit: ZERO },\n accounts: { selfUserRecordPda, selfUserAta },\n };\n }\n\n // Need to free more\n const missing = needToRegister - availableBefore;\n const candidates = opts?.preloadCandidates ?? (await this.fetchMismatchCandidates());\n\n if (!candidates.length) {\n return {\n canSucceed: false,\n reason: 'No candidates to free available balance.',\n liqsolMint,\n needToRegister,\n availableBefore,\n candidates: [],\n plan: { selected: [], willFree: ZERO, deficit: missing },\n accounts: { selfUserRecordPda, selfUserAta },\n };\n }\n\n const plan = this.chooseCandidatesFor(missing, candidates);\n if (plan.deficit > ZERO) {\n return {\n canSucceed: false,\n reason: `Insufficient freeable balance (need ${missing}, can free ${plan.willFree}).`,\n liqsolMint,\n needToRegister,\n availableBefore,\n candidates,\n plan,\n accounts: { selfUserRecordPda, selfUserAta },\n };\n }\n\n // Build: correct N others, then register self\n const tx = new Transaction();\n for (const c of plan.selected) {\n tx.add(await this.buildUpdateUserIx(c.owner));\n }\n tx.add(await this.buildUpdateUserIx(self));\n\n return {\n canSucceed: true,\n transaction: tx,\n liqsolMint,\n needToRegister,\n availableBefore,\n candidates,\n plan,\n accounts: { selfUserRecordPda, selfUserAta },\n };\n }\n\n\n // ───────────────────────────────────────────────────────────────────────────────\n // MISMATCH DISCOVERY\n // ───────────────────────────────────────────────────────────────────────────────\n\n /**\n * Fetch all distribution user records and turn them into mismatch candidates:\n * rows where `tracked > actual` (delta > 0). Sorted by largest delta first.\n *\n * NOTE: This reads each user’s token account (`getAccount`) to recover\n * the owner and actual balance — simpler and reliable for Token-2022 ATAs.\n */\n async fetchMismatchCandidates(): Promise<MismatchCandidate[]> {\n const state = await this.getDistributionState();\n const liqsolMint: PublicKey = state.liqsolMint;\n\n const records = await this.program.account.userRecord.all();\n if (!records.length) return [];\n\n const out: MismatchCandidate[] = [];\n\n // For each userRecord, read its token account to recover owner + actual\n // (small N is fine; for very large N you can batch or shard).\n for (const rec of records) {\n const userRecordPda = rec.publicKey;\n const userAta: PublicKey = rec.account.userAta;\n const tracked = BigInt(rec.account.trackedBalance.toString());\n\n let actual = ZERO;\n let owner: PublicKey | null = null;\n\n try {\n const acc = await getAccount(this.provider.connection, userAta, 'confirmed', TOKEN_2022_PROGRAM_ID);\n actual = acc.amount as unknown as bigint;\n owner = acc.owner as unknown as PublicKey;\n } catch {\n // missing/closed ATA → actual = 0\n owner = null;\n }\n\n if (!owner) continue;\n\n const delta = tracked - actual;\n if (delta > ZERO) {\n // we only care about freeable deltas\n out.push({ owner, userRecordPda, userAta, tracked, actual, delta });\n }\n }\n\n // Largest first\n out.sort((a, b) => (a.delta === b.delta ? 0 : a.delta > b.delta ? -1 : 1));\n return out;\n }\n\n /**\n * Given a required amount to free (in base units), choose the\n * smallest prefix of candidates (already sorted desc) that can cover it.\n */\n chooseCandidatesFor(required: bigint, candidates: MismatchCandidate[]): CorrectionPlan {\n if (required <= ZERO) return { selected: [], willFree: ZERO, deficit: ZERO };\n\n let willFree = ZERO;\n const selected: MismatchCandidate[] = [];\n\n for (const c of candidates) {\n if (willFree >= required) break;\n selected.push(c);\n willFree += c.delta;\n }\n\n const deficit = willFree >= required ? ZERO : required - willFree;\n return { selected, willFree, deficit };\n }\n}\n\nconst ZERO = BigInt(0);\n","import {\n Connection,\n PublicKey as SolPubKey,\n TransactionSignature,\n Commitment,\n ConnectionConfig,\n Transaction,\n} from '@solana/web3.js';\nimport { AnchorProvider } from '@coral-xyz/anchor';\nimport { BaseSignerWalletAdapter } from '@solana/wallet-adapter-base';\nimport { IStakingClient, Portfolio, StakerConfig } from '../../staker/types';\nimport { ChainID, ExternalNetwork, KeyType, PublicKey } from '@wireio/core';\nimport { DepositClient } from './clients/deposit.client';\nimport { deriveStakeControllerReservePoolPDA, deriveStakeControllerVaultPDA, getUserLiqsolATA } from './constants';\nimport { DistributionClient } from './clients/distribution.client';\nimport { SolanaTransaction } from './types';\n// import { ValidatorLeaderboardClient } 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: ValidatorLeaderboardClient;\n\n get solPubKey(): SolPubKey {\n return new SolPubKey(this.pubKey.data.array);\n }\n\n get network() { return this.config.network; }\n\n constructor(private config: StakerConfig) {\n // 1) unwrap & validate wallet adapter\n const adapter = config.provider as BaseSignerWalletAdapter;\n if (!adapter.publicKey) throw new Error('Solana wallet adapter not connected');\n if (!config.network.rpcUrls.length) throw new Error('No RPC URLs provided');\n\n // 2) sanity‐check wire ↔ solana pubkey\n const publicKey = adapter.publicKey;\n const wirePub = new PublicKey(KeyType.ED, publicKey.toBytes());\n if (!wirePub.equals(config.pubKey)) {\n throw new Error('Passed-in pubKey doesn\\'t match adapter.publicKey');\n }\n\n // build connection config\n let 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 // 4) staking clients\n this.depositClient = new DepositClient(this.anchor);\n this.distributionClient = new DistributionClient(this.anchor);\n // this.leaderboardClient = new ValidatorLeaderboardClient(this.anchor);\n }\n\n /**\n * 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 const user = this.solPubKey;\n\n // Handy PDAs & ATA\n const [reservePoolPDA] = deriveStakeControllerReservePoolPDA();\n const [vaultPDA] = deriveStakeControllerVaultPDA();\n const userLiqsolAta = getUserLiqsolATA(user);\n\n // Pull balances in parallel; ATA may not exist yet\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 // Actual (LiqSOL) balance + decimals (fallback to 9 if ATA missing)\n const actualAmountStr = actualBalResp?.value?.amount ?? '0';\n const actualDecimals = actualBalResp?.value?.decimals ?? 9;\n\n // Tracked (from userRecord in Distribution program)\n const trackedAmountStr = userRecord?.trackedBalance\n ? (userRecord.trackedBalance as any).toString()\n : '0';\n const trackedDecimals = actualDecimals; // same mint as liqSOL\n\n // Assemble the portfolio\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 // console.log('>> PORTFOLIO SET', this.network.name, this.portfolio);\n return portfolio;\n }\n /**\n * Optional: fetch your Distribution program user record\n * (often contains per-user deposit/claim state).\n */\n async getUserRecord(): Promise<any | null> {\n return this.distributionClient.getUserRecord(this.solPubKey);\n }\n\n getProtocolFee() {\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 console.log('Building CorrectAndRegister transaction with amount:', amount);\n\n // Build the transaction using the Distribution client (self = this.solPubKey)\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 console.log('buildCorrectRegisterTx:', build);\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 // Optionally refresh portfolio after success (non-blocking)\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 // sendRawTransaction is HTTP\n const signature = await this.connection.sendRawTransaction(signed.serialize(), {\n skipPreflight: false,\n preflightCommitment: commitment,\n maxRetries: 3,\n });\n\n // Poll confirmation using blockhash/lastValidBlockHeight\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 await this.anchor.wallet.signTransaction(tx);\n }\n\n async sendTransaction(signed: SolanaTransaction): Promise<TransactionSignature> {\n return await this.anchor.sendAndConfirm(signed);\n }\n\n async prepareTx(tx: Transaction): 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};","// src/staker/staker.ts\n\nimport { ChainID, SolChainID } from '@wireio/core';\nimport { IStakingClient, StakerConfig } from './types';\nimport { SolanaStakingClient } from '../networks/solana/solana';\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.Sepolia:\n // this.clients.set(EvmChainID.Sepolia, 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}","/**\n * @module EthereumContractService\n * \n * Provides a unified service for interacting with Ethereum smart contracts using ethers.js.\n * \n * This module includes:\n * - ABI imports for ERC20, ERC721, and ERC1155 token standards.\n * - Address book and contract configuration types.\n * - A service class for managing contract instances, interfaces, and utility methods for read/write access.\n * - Utility for decoding custom errors and events using a combined interface of all known ABIs.\n * \n * @remarks\n * - Update the `ADDRESSES` and `CONTRACTS` objects to match your deployment.\n * - The service supports both read-only and write-enabled contract handles, depending on the presence of a signer.\n * - The `omniInterface` property allows decoding of errors and events across all included ABIs.\n * \n * @example\n * ```typescript\n * const service = new EthereumContractService({ provider, signer });\n * const stakeContract = service.getContract('Stake');\n * const address = service.getAddress('Stake');\n * ```\n */\n\nimport ERC20Artifact from '../../assets/ethereum/ABI/token/ERC20Token.sol/ERC20Token.json';\nimport ERC721Artifact from '../../assets/ethereum/ABI/token/ERC721Token.sol/ERC721Token.json';\nimport ERC1155Artifact from '../../assets/ethereum/ABI/token/ERC1155Token.sol/ERC1155Token.json';\nimport { AddressBook, ContractName } from './types';\nimport { Contract, ethers, providers, Signer } from 'ethers';\nimport { JsonFragment } from '@ethersproject/abi';\nimport { ErrorDescription } from '@ethersproject/abi/lib/interface';\n\nexport const ERC20Abi = ERC20Artifact.abi;\nexport const ERC721Abi = ERC721Artifact.abi;\nexport const ERC1155Abi = ERC1155Artifact.abi;\n\n// Update this to be your staking contract address book\nexport const ADDRESSES: AddressBook = {\n Stake: '0xEeaCBa95852324eAc63fE2711aFe0283adf3bC93',\n};\n\nexport type Contracts<T extends string = ContractName> = Record<T, ContractConfig>;\n\nexport type ContractConfig = {\n address: string;\n abi: JsonFragment[];\n}\n\nexport const CONTRACTS: Contracts<ContractName> = {\n Stake: { address: ADDRESSES.Stake, abi: undefined as any }, // Replace with actual ABI artifact when available\n // Stake: { address: ADDRESSES.Stake, abi: Stake.abi },\n}\n\nexport interface ContractOptions {\n /** RPC endpoint or injected EIP-1193 provider */\n provider?: ethers.providers.Provider;\n /** Only required if you need to send txns */\n signer?: Signer;\n}\n\n\nexport class EthereumContractService {\n private provider?: providers.Provider;\n private signer?: Signer;\n\n public readonly contract: { [N in ContractName]: ethers.Contract } = {} as any;\n public readonly iface: { [N in ContractName]: ethers.utils.Interface } = {} as any;\n\n constructor(opts: ContractOptions) {\n this.provider = opts.provider;\n this.signer = opts.signer;\n\n (Object.keys(CONTRACTS) as ContractName[]).forEach((name) => {\n const { address, abi } = CONTRACTS[name];\n this.iface[name] = new ethers.utils.Interface(abi);\n this.contract[name] = new ethers.Contract(address, abi, this.signer ?? this.provider);\n });\n }\n\n /** Get raw address for a contract */\n public getAddress(name: ContractName): string {\n return CONTRACTS[name].address;\n }\n\n /** Utility: get a read-only handle even if signer is present */\n getReadOnly(name: ContractName): Contract {\n const { address, abi } = CONTRACTS[name];\n return new Contract(address, abi, this.provider);\n }\n\n /** Utility: get a write-enabled handle (throws if no signer) */\n getWrite(name: ContractName): Contract {\n if (!this.signer) throw new Error('No signer available for write calls');\n const { address, abi } = CONTRACTS[name];\n return new Contract(address, abi, this.signer);\n }\n\n /** Expose network info */\n async getNetwork() {\n return this.provider?.getNetwork();\n }\n\n /** List all known contract names */\n public listContractNames(): ContractName[] {\n return Object.keys(CONTRACTS) as ContractName[];\n }\n\n /** Get Interface instance for a contract */\n public getInterface(name: ContractName): ethers.utils.Interface {\n const iface = this.iface[name];\n if (!iface) throw new Error(`Interface not initialized for ${name}`);\n return iface;\n }\n\n /** Get live Contract instance */\n public getContract(name: ContractName): ethers.Contract {\n const ctr = this.contract[name];\n if (!ctr) throw new Error(`Contract not initialized for ${name}`);\n return ctr;\n }\n\n /** A unified Interface containing all ABIs (addresses + extra decoding-only)\n * to parse custom errors or events. */\n public get omniInterface(): ethers.utils.Interface {\n const all: any[] = [];\n\n // Add all artifacts to the interface\n const allArtifacts = [\n ERC20Artifact,\n ERC721Artifact,\n ERC1155Artifact,\n // Add more artifacts as needed\n ];\n\n // Add all ABIs to the omnibus interface\n allArtifacts.forEach(artifact => {\n if (artifact && artifact.abi) {\n all.push(...artifact.abi);\n }\n });\n\n // dedupe\n const seen = new Set<string>();\n const dedup: any[] = [];\n for (const item of all) {\n try {\n const frag = ethers.utils.Fragment.from(item);\n const key = `${frag.type}:${frag.format(ethers.utils.FormatTypes.full)}`.toLowerCase();\n if (!seen.has(key)) {\n seen.add(key);\n dedup.push(item);\n }\n } catch { }\n }\n\n return new ethers.utils.Interface(dedup);\n }\n\n /** Decode a revert or custom error payload */\n public parseError(revertData: string): ErrorDescription {\n try {\n return this.omniInterface.parseError(revertData);\n } catch {\n throw new Error(`Unable to parse error data: ${revertData}`);\n }\n }\n}","// src/networks/ethereum/ethereum.ts\n\nimport { ethers } from 'ethers';\nimport { IStakingClient, StakerConfig } from '../../staker/types';\nimport { PublicKey as WirePubKey } from '@wireio/core';\nimport { ERC20Abi } from './contract'; // TODO replace with staking contract ABI\n\n// — replace with your actual staking contract ABI & address —\nconst STAKING_CONTRACT_ADDRESS = '0xYourStakingContractAddress';\n\n// TODO extend to implement ISTAKINGCLIENT\nexport class EthereumStakingClient {\n public readonly pubKey: WirePubKey;\n private readonly provider: ethers.providers.Web3Provider;\n private readonly signer: ethers.Signer;\n private readonly contract: ethers.Contract;\n\n constructor(private config: StakerConfig) {\n // 1) unwrap & validate Ethers provider\n if (!ethers.providers.Web3Provider.isProvider(config.provider as any)) {\n throw new Error('Expected a Web3Provider for Ethereum');\n }\n this.provider = config.provider as ethers.providers.Web3Provider;\n\n // 2) signer\n this.signer = this.provider.getSigner();\n this.pubKey = config.pubKey as WirePubKey;\n\n // 4) instantiate your contract wrapper\n this.contract = new ethers.Contract(\n STAKING_CONTRACT_ADDRESS,\n ERC20Abi,\n this.signer\n );\n }\n\n /** Submit a deposit; returns the transaction hash */\n async deposit(amount: number): Promise<string> {\n // build & send in one go\n const txResponse = await this.contract.deposit(\n ethers.BigNumber.from(amount),\n {\n // if your contract needs ETH value:\n // value: ethers.BigNumber.from(amount),\n }\n );\n\n // wait for on-chain confirmation (optional)\n await txResponse.wait();\n return txResponse.hash;\n }\n\n /** (Optional) dry-run via eth_call */\n async simulateDeposit(amount: number): Promise<any> {\n return this.provider.call({\n to: STAKING_CONTRACT_ADDRESS,\n data: this.contract.interface.encodeFunctionData('deposit', [\n ethers.BigNumber.from(amount)\n ]),\n });\n }\n\n // TODO: implement withdraw, claimRewards, etc.\n}","export const CONTRACT_NAMES = [\n 'Stake',\n] as const;\n\nexport type ContractName = typeof CONTRACT_NAMES[number];\nexport type AddressBook = Record<ContractName, string>;","import { AnchorProvider, Program, BN } from '@coral-xyz/anchor';\nimport { PublicKey, SystemProgram, Transaction, TransactionInstruction } from '@solana/web3.js';\nimport { SolanaProgramService } from '../program';\nimport type { ValidatorLeaderboard } from '../../../assets/solana/types/validator_leaderboard';\nimport {\n deriveLeaderboardHeadPDA,\n deriveValidatorRecordPDA,\n deriveTop10CachePDA,\n} from '../constants';\n\nexport class ValidatorLeaderboardClient {\n private programs: SolanaProgramService;\n\n constructor(private provider: AnchorProvider) {\n this.programs = new SolanaProgramService(provider);\n }\n\n /** Anchor Program<ValidatorLeaderboard> via ProgramService */\n private get program(): Program<ValidatorLeaderboard> {\n return this.programs.getProgram('validatorLeaderboard') as Program<ValidatorLeaderboard>;\n }\n\n // ───────────────────────────────────────────────────────────────────────────────\n // BUILDERS (return Ixs so you can batch)\n // ───────────────────────────────────────────────────────────────────────────────\n\n /** Initialize the leaderboard head account. */\n async buildInitializeIx(authority: PublicKey): Promise<TransactionInstruction> {\n const [leaderboardHead] = deriveLeaderboardHeadPDA();\n return this.program.methods\n .initialize()\n .accounts({\n authority,\n // @ts-ignore\n leaderboardHead,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n /**\n * Upsert/update a validator record and (optionally) reposition it in the linked list.\n * Any of insertAfter/insertBefore/currentPrev/currentNext can be omitted.\n */\n async buildUpdateValidatorIx(params: {\n registrant: PublicKey;\n voteAccount: PublicKey;\n vpp: number; // Validator Performance Points\n insertAfter?: PublicKey;\n insertBefore?: PublicKey;\n currentPrev?: PublicKey;\n currentNext?: PublicKey;\n }): Promise<TransactionInstruction> {\n const { registrant, voteAccount, vpp, insertAfter, insertBefore, currentPrev, currentNext } = params;\n\n const [leaderboardHead] = deriveLeaderboardHeadPDA();\n const [validatorRecord] = deriveValidatorRecordPDA(voteAccount);\n\n const accounts: any = {\n registrant,\n voteAccount,\n validatorRecord,\n leaderboardHead,\n systemProgram: SystemProgram.programId,\n ...(insertAfter && { insertAfter }),\n ...(insertBefore && { insertBefore }),\n ...(currentPrev && { currentPrev }),\n ...(currentNext && { currentNext }),\n };\n\n return this.program.methods\n .updateValidator(new BN(vpp))\n .accounts(accounts)\n .instruction();\n }\n\n /** Update the Top-10 cache. Requires exactly 10 validator vote accounts. */\n async buildUpdateTop10CacheIx(params: {\n authority: PublicKey;\n top10Validators: PublicKey[];\n }): Promise<TransactionInstruction> {\n const { authority, top10Validators } = params;\n if (top10Validators.length !== 10) throw new Error('Must provide exactly 10 validators');\n\n const [cache] = deriveTop10CachePDA();\n return this.program.methods\n .updateTop10Cache(top10Validators)\n .accounts({\n // @ts-ignore\n authority,\n cache,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n // Convenience wrappers if you want a ready-to-send Transaction\n\n async buildInitializeTx(authority: PublicKey): Promise<Transaction> {\n return new Transaction().add(await this.buildInitializeIx(authority));\n }\n\n async buildUpdateValidatorTx(params: {\n registrant: PublicKey;\n voteAccount: PublicKey;\n vpp: number;\n insertAfter?: PublicKey;\n insertBefore?: PublicKey;\n currentPrev?: PublicKey;\n currentNext?: PublicKey;\n }): Promise<Transaction> {\n return new Transaction().add(await this.buildUpdateValidatorIx(params));\n }\n\n async buildUpdateTop10CacheTx(params: {\n authority: PublicKey;\n top10Validators: PublicKey[];\n }): Promise<Transaction> {\n return new Transaction().add(await this.buildUpdateTop10CacheIx(params));\n }\n\n // ───────────────────────────────────────────────────────────────────────────────\n // READ HELPERS\n // ───────────────────────────────────────────────────────────────────────────────\n\n /** Traverse the linked-list leaderboard, returning vote accounts in order. */\n async getLeaderboard(): Promise<PublicKey[]> {\n const [head] = deriveLeaderboardHeadPDA();\n let headAcc;\n try {\n headAcc = await this.program.account.leaderboardHead.fetch(head);\n } catch {\n return [];\n }\n const out: PublicKey[] = [];\n let cursor: PublicKey = headAcc.nextValidator;\n while (cursor && !cursor.equals(PublicKey.default)) {\n out.push(cursor);\n const rec = await this.program.account.validatorRecord.fetch(cursor);\n cursor = rec.nextValidator;\n }\n return out;\n }\n\n /** Fetch a single validator record (or null if it doesn't exist). */\n async getValidatorRecord(voteAccount: PublicKey): Promise<any | null> {\n const [recPda] = deriveValidatorRecordPDA(voteAccount);\n try {\n return await this.program.account.validatorRecord.fetch(recPda);\n } catch {\n return null;\n }\n }\n}"],"names":["DepositIDL","StakeControllerIDL","ValidatorLeaderboardIDL","LiqSolTokenIDL","DistributionIDL","tx","PublicKey","SolPubKey"],"mappings":";;;;;;;AAMa,MAAA,EAAA,GAAK,CAAC,IAAyB,KAAA;AACxC,EAAA,OAAO,UAAU,IAAI,CAAA,CAAA,CAAA,CAAA;AACzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
1
+ {"version":3,"file":"stake.browser.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\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 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 * 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\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 // 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 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":["liqSolTokenIDL","validatorLeaderboardIDL","liqsolCoreJson","tx","PublicKey","SolPubKey"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}