@wireio/stake 0.4.2 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/lib/stake.browser.js +18509 -11887
  2. package/lib/stake.browser.js.map +1 -1
  3. package/lib/stake.d.ts +899 -140
  4. package/lib/stake.js +18524 -11890
  5. package/lib/stake.js.map +1 -1
  6. package/lib/stake.m.js +18509 -11887
  7. package/lib/stake.m.js.map +1 -1
  8. package/package.json +2 -2
  9. package/src/assets/ethereum/ABI/common/Base58.sol/Base58.dbg.json +4 -0
  10. package/src/assets/ethereum/ABI/common/Base58.sol/Base58.json +164 -0
  11. package/src/assets/ethereum/ABI/common/OpenZepArtifacts.sol/__Dummy_OZ_UUPS__.dbg.json +4 -0
  12. package/src/assets/ethereum/ABI/common/OpenZepArtifacts.sol/__Dummy_OZ_UUPS__.json +76 -0
  13. package/src/assets/ethereum/ABI/common/RestrictedCallers.sol/RestrictedCallers.dbg.json +4 -0
  14. package/src/assets/ethereum/ABI/common/RestrictedCallers.sol/RestrictedCallers.json +10 -0
  15. package/src/assets/ethereum/ABI/common/iodata.sol/iodata.dbg.json +4 -0
  16. package/src/assets/ethereum/ABI/common/iodata.sol/iodata.json +618 -0
  17. package/src/assets/ethereum/ABI/common/iodata_util.sol/iodata_util.dbg.json +4 -0
  18. package/src/assets/ethereum/ABI/common/iodata_util.sol/iodata_util.json +40 -0
  19. package/src/assets/ethereum/ABI/common/sysio_data.sol/sysio_data.dbg.json +4 -0
  20. package/src/assets/ethereum/ABI/common/sysio_data.sol/sysio_data.json +10 -0
  21. package/src/assets/ethereum/ABI/common/sysio_errors.sol/sysio_errors.dbg.json +4 -0
  22. package/src/assets/ethereum/ABI/common/sysio_errors.sol/sysio_errors.json +10 -0
  23. package/src/assets/ethereum/ABI/common/sysio_merkle.sol/sysio_merkle.dbg.json +4 -0
  24. package/src/assets/ethereum/ABI/common/sysio_merkle.sol/sysio_merkle.json +233 -0
  25. package/src/assets/ethereum/ABI/common/sysio_name.sol/sysio_name.dbg.json +4 -0
  26. package/src/assets/ethereum/ABI/common/sysio_name.sol/sysio_name.json +49 -0
  27. package/src/assets/ethereum/ABI/common/sysio_pubkey.sol/sysio_pubkey.dbg.json +4 -0
  28. package/src/assets/ethereum/ABI/common/sysio_pubkey.sol/sysio_pubkey.json +64 -0
  29. package/src/assets/ethereum/ABI/common/sysio_read.sol/sysio_read.dbg.json +4 -0
  30. package/src/assets/ethereum/ABI/common/sysio_read.sol/sysio_read.json +1458 -0
  31. package/src/assets/ethereum/ABI/common/sysio_tester.sol/SysioTester.dbg.json +4 -0
  32. package/src/assets/ethereum/ABI/common/sysio_tester.sol/SysioTester.json +1532 -0
  33. package/src/assets/ethereum/ABI/common/sysio_verify.sol/sysio_verify.dbg.json +4 -0
  34. package/src/assets/ethereum/ABI/common/sysio_verify.sol/sysio_verify.json +1525 -0
  35. package/src/assets/ethereum/ABI/common/sysio_write.sol/sysio_write.dbg.json +4 -0
  36. package/src/assets/ethereum/ABI/common/sysio_write.sol/sysio_write.json +1076 -0
  37. package/src/assets/ethereum/ABI/liqEth/BeaconState.sol/BeaconState.dbg.json +1 -1
  38. package/src/assets/ethereum/ABI/liqEth/DepositManager.sol/DepositManager.dbg.json +1 -1
  39. package/src/assets/ethereum/ABI/liqEth/DepositManager.sol/DepositManager.json +28 -2
  40. package/src/assets/ethereum/ABI/liqEth/LiqEthAuthority.sol/LiqEthAuthority.dbg.json +1 -1
  41. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IAccounting.dbg.json +1 -1
  42. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IDepositContract.dbg.json +1 -1
  43. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IDepositManager.dbg.json +1 -1
  44. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/ILiqEthUpgradeable.dbg.json +1 -1
  45. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IRewardsERC20.dbg.json +1 -1
  46. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IRewardsERC20Pausable.dbg.json +1 -1
  47. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IStakingModule.dbg.json +1 -1
  48. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IValidatorBalanceVerifier.dbg.json +1 -1
  49. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IWithdrawalRecord.dbg.json +1 -1
  50. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/LiqEthCommon.dbg.json +1 -1
  51. package/src/assets/ethereum/ABI/liqEth/LiqEthManaged.sol/LiqEthManaged.dbg.json +1 -1
  52. package/src/assets/ethereum/ABI/liqEth/RewardsERC20.sol/RewardsERC20Upgradeable.dbg.json +1 -1
  53. package/src/assets/ethereum/ABI/liqEth/RewardsERC20Pausable.sol/RewardsERC20PausableUpgradeable.dbg.json +1 -1
  54. package/src/assets/ethereum/ABI/liqEth/Yield.sol/YieldOracle.dbg.json +1 -1
  55. package/src/assets/ethereum/ABI/liqEth/Yield.sol/YieldOracle.json +2 -2
  56. package/src/assets/ethereum/ABI/liqEth/accounting.sol/Accounting.dbg.json +1 -1
  57. package/src/assets/ethereum/ABI/liqEth/accounting.sol/Accounting.json +2 -15
  58. package/src/assets/ethereum/ABI/liqEth/liqEth.sol/LiqEthToken.dbg.json +1 -1
  59. package/src/assets/ethereum/ABI/liqEth/stakingModule.sol/StakingModule.dbg.json +1 -1
  60. package/src/assets/ethereum/ABI/liqEth/stakingModule.sol/StakingModule.json +6 -25
  61. package/src/assets/ethereum/ABI/liqEth/withdrawalQueue.sol/WithdrawalQueue.dbg.json +1 -1
  62. package/src/assets/ethereum/ABI/liqEth/withdrawalVault.sol/Uint64BE.dbg.json +1 -1
  63. package/src/assets/ethereum/ABI/liqEth/withdrawalVault.sol/Uint64BE.json +2 -2
  64. package/src/assets/ethereum/ABI/liqEth/withdrawalVault.sol/WithdrawalVault.dbg.json +1 -1
  65. package/src/assets/ethereum/ABI/liqEth/withdrawalVault.sol/WithdrawalVault.json +6 -25
  66. package/src/assets/ethereum/ABI/outpost/BAR.sol/BAR.dbg.json +1 -1
  67. package/src/assets/ethereum/ABI/outpost/Depositor.sol/Depositor.dbg.json +1 -1
  68. package/src/assets/ethereum/ABI/outpost/Depositor.sol/Depositor.json +26 -26
  69. package/src/assets/ethereum/ABI/outpost/EthUsdPriceConsumer.sol/AggregatorV3Interface.dbg.json +1 -1
  70. package/src/assets/ethereum/ABI/outpost/EthUsdPriceConsumer.sol/EthUsdPriceConsumer.dbg.json +1 -1
  71. package/src/assets/ethereum/ABI/outpost/OPP.sol/OPP.dbg.json +1 -1
  72. package/src/assets/ethereum/ABI/outpost/OPPCommon.sol/IOPP.dbg.json +1 -1
  73. package/src/assets/ethereum/ABI/outpost/OPPCommon.sol/IOPPEndpoint.dbg.json +1 -1
  74. package/src/assets/ethereum/ABI/outpost/OPPCommon.sol/IOPPInbound.dbg.json +1 -1
  75. package/src/assets/ethereum/ABI/outpost/OPPCommon.sol/IOPPReceiver.dbg.json +1 -1
  76. package/src/assets/ethereum/ABI/outpost/OPPCommon.sol/IOPPSender.dbg.json +1 -1
  77. package/src/assets/ethereum/ABI/outpost/OPPCommon.sol/OPPCommon.dbg.json +1 -1
  78. package/src/assets/ethereum/ABI/outpost/OPPEndpoint.sol/OPPEndpoint.dbg.json +1 -1
  79. package/src/assets/ethereum/ABI/outpost/OPPEndpointManaged.sol/OPPEndpointManaged.dbg.json +1 -1
  80. package/src/assets/ethereum/ABI/outpost/OPPEndpointOwnable.sol/OPPEndpointOwnable.dbg.json +1 -1
  81. package/src/assets/ethereum/ABI/outpost/OPPErrors.sol/OPPErrors.dbg.json +1 -1
  82. package/src/assets/ethereum/ABI/outpost/OPPInbound.sol/OPPInbound.dbg.json +1 -1
  83. package/src/assets/ethereum/ABI/outpost/OPPReceiver.sol/OPPReceiver.dbg.json +1 -1
  84. package/src/assets/ethereum/ABI/outpost/OPPSender.sol/OPPSender.dbg.json +1 -1
  85. package/src/assets/ethereum/ABI/outpost/OutpostErrors.sol/OutpostErrors.dbg.json +1 -1
  86. package/src/assets/ethereum/ABI/outpost/OutpostManaged.sol/OutpostManaged.dbg.json +1 -1
  87. package/src/assets/ethereum/ABI/outpost/OutpostManager.sol/OutpostManager.dbg.json +1 -1
  88. package/src/assets/ethereum/ABI/outpost/OutpostManagerAuthority.sol/OutpostManagerAuthority.dbg.json +1 -1
  89. package/src/assets/ethereum/ABI/outpost/OutpostManagerCommon.sol/IOutpostManager.dbg.json +1 -1
  90. package/src/assets/ethereum/ABI/outpost/OutpostManagerCommon.sol/IOutpostUpgradeable.dbg.json +1 -1
  91. package/src/assets/ethereum/ABI/outpost/OutpostManagerCommon.sol/OutpostManagerCommon.dbg.json +1 -1
  92. package/src/assets/ethereum/ABI/outpost/OutpostOwnable.sol/OutpostOwnable.dbg.json +1 -1
  93. package/src/assets/ethereum/ABI/outpost/Pool.sol/Pool.dbg.json +1 -1
  94. package/src/assets/ethereum/ABI/outpost/Pool.sol/Pool.json +2 -2
  95. package/src/assets/ethereum/ABI/outpost/Pretoken.sol/Pretoken.dbg.json +1 -1
  96. package/src/assets/ethereum/ABI/outpost/Pretoken.sol/Pretoken.json +9 -9
  97. package/src/assets/ethereum/ABI/outpost/ReceiptNFT.sol/ReceiptNFT.dbg.json +1 -1
  98. package/src/assets/ethereum/ABI/outpost/interfaces/IPretoken.sol/IPretoken.dbg.json +1 -1
  99. package/src/assets/ethereum/ABI/outpost/interfaces/IWarrant.sol/IWarrant.dbg.json +1 -1
  100. package/src/assets/ethereum/ABI/outpost/token/ERC721EthEquivalentVotesUpgradeable.sol/ERC721EthEquivalentVotesUpgradeable.dbg.json +1 -1
  101. package/src/assets/ethereum/ABI/outpost/token/IERC721EthEquivalent.sol/IERC721EthEquivalent.dbg.json +1 -1
  102. package/src/assets/solana/idl/liqsol_core.json +760 -150
  103. package/src/assets/solana/idl/liqsol_token.json +1 -1
  104. package/src/assets/solana/idl/transfer_hook.json +6 -1
  105. package/src/assets/solana/idl/validator_leaderboard.json +4 -1
  106. package/src/assets/solana/types/liqsol_core.ts +760 -150
  107. package/src/assets/solana/types/liqsol_token.ts +1 -1
  108. package/src/assets/solana/types/transfer_hook.ts +6 -1
  109. package/src/assets/solana/types/validator_leaderboard.ts +4 -1
  110. package/src/networks/ethereum/clients/convert.client.ts +2 -2
  111. package/src/networks/ethereum/clients/pretoken.client.ts +6 -4
  112. package/src/networks/ethereum/clients/stake.client.ts +2 -2
  113. package/src/networks/ethereum/contract.ts +102 -49
  114. package/src/networks/ethereum/ethereum.ts +117 -58
  115. package/src/networks/ethereum/types.ts +26 -17
  116. package/src/networks/ethereum/utils.ts +8 -8
  117. package/src/networks/solana/clients/deposit.client.ts +5 -4
  118. package/src/networks/solana/clients/distribution.client.ts +36 -1
  119. package/src/networks/solana/constants.ts +14 -0
  120. package/src/networks/solana/solana.ts +148 -17
  121. package/src/networks/solana/types.ts +129 -0
  122. package/src/types.ts +21 -11
  123. package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/BeaconRoots.dbg.json +0 -4
  124. package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/BeaconRoots.json +0 -10
  125. package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/SSZ.dbg.json +0 -4
  126. package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/SSZ.json +0 -10
  127. package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/SSZExtras.dbg.json +0 -4
  128. package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/SSZExtras.json +0 -10
  129. package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/SSZVec48.dbg.json +0 -4
  130. package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/SSZVec48.json +0 -10
  131. package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/ValidatorBalanceVerifier.dbg.json +0 -4
  132. package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/ValidatorBalanceVerifier.json +0 -291
  133. package/src/assets/ethereum/ABI/outpost/Aggregator.sol/Aggregator.json +0 -82
@@ -1 +1 @@
1
- {"version":3,"file":"stake.m.js","sources":["../src/networks/solana/constants.ts","../src/networks/solana/program.ts","../src/networks/solana/clients/deposit.client.ts","../src/networks/solana/clients/distribution.client.ts","../src/networks/solana/clients/leaderboard.client.ts","../src/networks/solana/utils.ts","../src/networks/solana/clients/outpost.client.ts","../src/networks/solana/clients/token.client.ts","../src/networks/solana/solana.ts","../src/networks/ethereum/contract.ts","../src/networks/ethereum/utils.ts","../src/networks/ethereum/clients/convert.client.ts","../src/networks/ethereum/clients/stake.client.ts","../src/networks/ethereum/clients/pretoken.client.ts","../src/networks/ethereum/clients/opp.client.ts","../src/types.ts","../src/networks/ethereum/clients/receipt.client.ts","../src/networks/ethereum/ethereum.ts","../src/staker.ts","../src/networks/ethereum/types.ts"],"sourcesContent":["// src/networks/solana/constants.ts\nimport { PublicKey, StakeProgram } from '@solana/web3.js';\n\nimport liqsolCoreIDL from '../../assets/solana/idl/liqsol_core.json';\nimport liqSolTokenIDL from '../../assets/solana/idl/liqsol_token.json';\nimport validatorLeaderboardIDL from '../../assets/solana/idl/validator_leaderboard.json';\nimport transferHookIDL from '../../assets/solana/idl/transfer_hook.json';\n\n/**\n * ---------------------------------------------------------------------------\n * PROGRAM IDS\n * ---------------------------------------------------------------------------\n *\n * These should match:\n * - `metadata.address` in your Anchor IDLs under src/assets/solana/idl/*.json\n * - The program IDs printed by your deploy scripts\n */\nexport const PROGRAM_IDS = {\n LIQSOL_CORE: new PublicKey(liqsolCoreIDL.address),\n LIQSOL_TOKEN: new PublicKey(liqSolTokenIDL.address),\n VALIDATOR_LEADERBOARD: new PublicKey(validatorLeaderboardIDL.address),\n TRANSFER_HOOK: new PublicKey(transferHookIDL.address),\n} as const;\n\nexport const {\n LIQSOL_CORE,\n LIQSOL_TOKEN,\n VALIDATOR_LEADERBOARD,\n TRANSFER_HOOK,\n} = PROGRAM_IDS;\n\n/**\n * ---------------------------------------------------------------------------\n * PDA SEEDS (must match on-chain programs)\n * ---------------------------------------------------------------------------\n */\n\nexport const PDA_SEEDS = {\n // liqsol_core: deposit / stake controller\n DEPOSIT_AUTHORITY: 'deposit_authority',\n VAULT: 'vault',\n RESERVE_POOL: 'reserve_pool',\n STAKE_CONTROLLER_STATE: 'stake_controller',\n PAYOUT_STATE: 'payout_state',\n\n // liqsol_token: mint + bucket\n LIQSOL_MINT: 'liqsol_mint',\n LIQSOL_MINT_AUTHORITY: 'mint_authority',\n BUCKET_AUTHORITY: 'liqsol_bucket',\n\n // distribution program (embedded in liqsol_core)\n DISTRIBUTION_STATE: 'distribution_state',\n // NOTE: in the current IDL, userRecord is keyed by the USER (wallet), not ATA\n USER_RECORD: 'user_record',\n\n // pay-rate / price history\n PAY_RATE_HISTORY: 'pay_rate_history',\n PRICE_HISTORY: 'price_history',\n\n // validator leaderboard (state + records)\n LEADERBOARD_STATE: 'leaderboard_state',\n VALIDATOR_RECORD: 'validator',\n GLOBAL_STAKE_INFO: 'global_stake_info',\n\n // Outpost / Wire pretokens\n OUTPOST_GLOBAL_STATE: 'outpost_global_state',\n LIQSOL_POOL: 'liqsol_pool',\n OUTPOST_ACCOUNT: 'outpost_account',\n USER_PRETOKEN_RECORD: 'user_pretoken_record',\n TRANCHE_STATE: 'tranche_state',\n\n // BAR module (bonded actor roles)\n BAR_STATE_SEED: 'bar_state',\n BONDED_ACTOR_SEED: 'bonded_actor',\n BOND_LEVEL_SEED: 'bond_level',\n\n // SPL transfer-hook extra account metas\n EXTRA_ACCOUNT_METAS: 'extra-account-metas',\n\n // Withdraw module / receipts\n WITHDRAW_GLOBAL: 'global',\n STAKE_ALLOCATION_STATE: 'stake_allocation_state',\n STAKE_METRICS: 'stake_metrics',\n MAINTENANCE_LEDGER: 'maintenance_ledger',\n WITHDRAW_MINT_AUTHORITY: 'mint_authority',\n MINT_METADATA: 'mint_metadata',\n LIQ_RECEIPT_DATA: 'liq_receipt_data',\n WITHDRAW_MINT: 'mint',\n} as const;\n\n/**\n * ---------------------------------------------------------------------------\n * CORE / DISTRIBUTION / DEPOSIT PDAS\n * ---------------------------------------------------------------------------\n */\n\nexport const deriveLiqsolMintPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQSOL_MINT)],\n LIQSOL_TOKEN,\n )[0];\n\nexport const deriveLiqsolMintAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQSOL_MINT_AUTHORITY)],\n LIQSOL_TOKEN,\n )[0];\n\nexport const deriveDepositAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.DEPOSIT_AUTHORITY)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveVaultPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VAULT)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveReservePoolPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.RESERVE_POOL)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveStakeControllerStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.STAKE_CONTROLLER_STATE)],\n LIQSOL_CORE,\n )[0];\n\nexport const derivePayoutStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.PAYOUT_STATE)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveBucketAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.BUCKET_AUTHORITY)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveDistributionStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.DISTRIBUTION_STATE)],\n LIQSOL_CORE,\n )[0];\n\n/**\n * user_record PDA\n *\n * In the current liqsol_core IDL, this is keyed by USER (wallet),\n * not by token account.\n */\nexport const deriveUserRecordPda = (user: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.USER_RECORD), user.toBuffer()],\n LIQSOL_CORE,\n )[0];\n\nexport const derivePayRateHistoryPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.PAY_RATE_HISTORY)],\n LIQSOL_CORE,\n )[0];\n\n/**\n * ---------------------------------------------------------------------------\n * WITHDRAW MODULE / RECEIPTS\n * ---------------------------------------------------------------------------\n */\n\nexport const deriveWithdrawGlobalPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.WITHDRAW_GLOBAL)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveStakeAllocationStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.STAKE_ALLOCATION_STATE)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveStakeMetricsPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.STAKE_METRICS)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveMaintenanceLedgerPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.MAINTENANCE_LEDGER)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveWithdrawMintAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.WITHDRAW_MINT_AUTHORITY)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveWithdrawMintMetadataPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.MINT_METADATA)],\n LIQSOL_CORE,\n )[0];\n\n/**\n * NFT mint for withdrawal receipt, derived from nextReceiptId.\n */\nexport const deriveWithdrawNftMintPda = (receiptId: bigint | number) => {\n const receiptIdBytes = Buffer.alloc(8);\n // receiptId comes in as BN or bigint upstream → normalize\n const asBigInt =\n typeof receiptId === 'bigint'\n ? receiptId\n : BigInt(receiptId.toString());\n receiptIdBytes.writeBigUInt64LE(asBigInt);\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.WITHDRAW_MINT), receiptIdBytes],\n LIQSOL_CORE,\n )[0];\n};\n\nexport const deriveLiqReceiptDataPda = (nftMint: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQ_RECEIPT_DATA), nftMint.toBuffer()],\n LIQSOL_CORE,\n )[0];\n\n/**\n * ---------------------------------------------------------------------------\n * VALIDATOR LEADERBOARD\n * ---------------------------------------------------------------------------\n */\n\nexport const deriveLeaderboardStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LEADERBOARD_STATE)],\n VALIDATOR_LEADERBOARD,\n )[0];\n\nexport const deriveValidatorRecordPda = (voteAccount: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VALIDATOR_RECORD), voteAccount.toBuffer()],\n VALIDATOR_LEADERBOARD,\n )[0];\n\nexport const deriveStakeControllerVaultPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VAULT)],\n LIQSOL_CORE,\n )[0];\n\n/**\n * ---------------------------------------------------------------------------\n * OUTPOST / PRETOKENS\n * ---------------------------------------------------------------------------\n */\n\nexport const deriveOutpostGlobalStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.OUTPOST_GLOBAL_STATE)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveOutpostPoolAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQSOL_POOL)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveOutpostAccountPda = (user: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.OUTPOST_ACCOUNT), user.toBuffer()],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveUserPretokenRecordPda = (user: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.USER_PRETOKEN_RECORD), user.toBuffer()],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveTrancheStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.TRANCHE_STATE)],\n LIQSOL_CORE,\n )[0];\n\nexport const derivePriceHistoryPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.PRICE_HISTORY)],\n LIQSOL_CORE,\n )[0];\n\n/**\n * BAR (bonded actor roles)\n */\n\nexport const deriveBarConfigPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.BAR_STATE_SEED)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveBondLevelPda = (bondLevelId: number[]) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.BOND_LEVEL_SEED), Buffer.from(bondLevelId)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveBondedActorPda = (actor: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.BONDED_ACTOR_SEED), actor.toBuffer()],\n LIQSOL_CORE,\n )[0];\n\n/**\n * SPL Transfer-hook: extra-account-metas PDA for the liqSOL mint.\n */\nexport const deriveExtraAccountMetaListPda = (liqsolMint: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.EXTRA_ACCOUNT_METAS), liqsolMint.toBuffer()],\n PROGRAM_IDS.TRANSFER_HOOK,\n )[0];\n\n/**\n * Ephemeral stake account address used per-deposit.\n * On-chain convention: seed = `ephemeral_<u32>` under StakeProgram.programId.\n */\nexport const deriveEphemeralStakeAddress = async (\n user: PublicKey,\n seed: number,\n): Promise<PublicKey> => {\n const seedStr = `ephemeral_${seed}`;\n return PublicKey.createWithSeed(user, seedStr, StakeProgram.programId);\n};\n\n/**\n * Constant keys (Chainlink)\n */\nexport const CHAINLINK_FEED = new PublicKey(\n '99B2bTijsU6f1GCT73HmdR7HCFFjGMBcPZY6jZ96ynrR',\n);\nexport const CHAINLINK_PROGRAM = new PublicKey(\n 'HEvSKofvBgfaexv23kMabbYqxasxU3mQ4ibBMEmJWHny',\n);\n\n/**\n * ---------------------------------------------------------------------------\n * ECONOMICS & MATH CONSTANTS\n * ---------------------------------------------------------------------------\n */\n\n// Same scale factor used on-chain for pay-rate math\nexport const PAY_RATE_SCALE_FACTOR = BigInt(1_000_000_000_000); // 10^12\n\n// Default pay rate fallback used in tests & utils\nexport const DEFAULT_AVERAGE_PAY_RATE = BigInt(191_780_821);\n\n// How many history entries to average when computing expected fee\nexport const DEFAULT_PAY_RATE_LOOKBACK = 5;\n\n// Rent exemption for ephemeral stake account (lamports)\nexport const EPHEMERAL_RENT_EXEMPTION = 2_282_880;\n\n// For convenience: lamports <-> SOL helpers (no RPC dependency)\nexport const LAMPORTS_PER_SOL = 1_000_000_000;\n\nexport const INDEX_SCALE = BigInt(1_000_000_000_000); // 1e12\n\nexport const lamportsToSol = (lamports: number | bigint): number =>\n Number(lamports) / LAMPORTS_PER_SOL;\n\nexport const solToLamports = (sol: number): bigint =>\n BigInt(Math.round(sol * LAMPORTS_PER_SOL));","import { AnchorProvider, Program } from '@coral-xyz/anchor';\n\nimport liqsolCoreJson from '../../assets/solana/idl/liqsol_core.json';\nimport liqsolTokenJson from '../../assets/solana/idl/liqsol_token.json';\nimport validatorLeaderboardJson from '../../assets/solana/idl/validator_leaderboard.json';\n\nimport type { LiqsolCore } from '../../assets/solana/types/liqsol_core';\nimport type { LiqsolToken } from '../../assets/solana/types/liqsol_token';\nimport type { ValidatorLeaderboard } from '../../assets/solana/types/validator_leaderboard';\n\nimport { PROGRAM_IDS } from './constants';\n\ntype Entry<IDL> = {\n idl: IDL & { address: string };\n address: string;\n};\n\nconst PROGRAMS = {\n liqsolCore: {\n idl: liqsolCoreJson,\n address: PROGRAM_IDS.LIQSOL_CORE.toBase58(),\n } as Entry<LiqsolCore>,\n liqsolToken: {\n idl: liqsolTokenJson,\n address: PROGRAM_IDS.LIQSOL_TOKEN.toBase58(),\n } as Entry<LiqsolToken>,\n validatorLeaderboard: {\n idl: validatorLeaderboardJson,\n address: PROGRAM_IDS.VALIDATOR_LEADERBOARD.toBase58(),\n } as Entry<ValidatorLeaderboard>,\n} as const;\n\nexport type SolanaProgramName = keyof typeof PROGRAMS;\n\nexport class SolanaProgramService {\n constructor(private provider: AnchorProvider) { }\n\n getProgram<K extends SolanaProgramName>(name: K): Program<(typeof PROGRAMS)[K]['idl']> {\n const { idl, address } = PROGRAMS[name];\n const idlWithAddr = { ...idl, address };\n return new Program(idlWithAddr, this.provider) as Program<(typeof PROGRAMS)[K]['idl']>;\n }\n\n listProgramNames(): SolanaProgramName[] {\n return Object.keys(PROGRAMS) as SolanaProgramName[];\n }\n}","import { AnchorProvider, BN, Program } from '@coral-xyz/anchor';\nimport {\n SystemProgram,\n Transaction,\n TransactionInstruction,\n StakeProgram,\n SYSVAR_INSTRUCTIONS_PUBKEY,\n SYSVAR_CLOCK_PUBKEY,\n SYSVAR_RENT_PUBKEY,\n SYSVAR_STAKE_HISTORY_PUBKEY,\n} from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddressSync,\n} from '@solana/spl-token';\n\nimport { SolanaProgramService } from '../program';\nimport type { LiqsolCore } from '../../../assets/solana/types/liqsol_core';\n\nimport {\n PROGRAM_IDS,\n deriveDepositAuthorityPda,\n deriveLiqsolMintPda,\n deriveLiqsolMintAuthorityPda,\n deriveReservePoolPda,\n deriveVaultPda,\n deriveStakeControllerStatePda,\n derivePayoutStatePda,\n deriveBucketAuthorityPda,\n derivePayRateHistoryPda,\n deriveDistributionStatePda,\n deriveUserRecordPda,\n deriveEphemeralStakeAddress,\n deriveWithdrawGlobalPda,\n deriveStakeAllocationStatePda,\n deriveStakeMetricsPda,\n deriveMaintenanceLedgerPda,\n deriveWithdrawMintAuthorityPda,\n deriveWithdrawMintMetadataPda,\n deriveWithdrawNftMintPda,\n deriveLiqReceiptDataPda,\n} from '../constants';\nimport { WalletLike } from '../types';\n\nexport class DepositClient {\n private program: Program<LiqsolCore>;\n\n get wallet(): WalletLike {\n return this.provider.wallet;\n }\n\n constructor(private provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('liqsolCore');\n }\n\n /**\n * Build a deposit transaction:\n * SOL -> liqSOL via liqsol_core::deposit.\n */\n async buildDepositTx(\n amount: bigint,\n user = this.wallet.publicKey,\n ): Promise<Transaction> {\n if (!user) {\n throw new Error(\n 'DepositClient.buildDepositTx: wallet not connected',\n );\n }\n if (!amount || amount <= BigInt(0)) {\n throw new Error(\n 'DepositClient.buildDepositTx: amount must be greater than zero.',\n );\n }\n\n // -------------------------------------------------------------\n // PDAs\n // -------------------------------------------------------------\n const depositAuthority = deriveDepositAuthorityPda();\n const liqsolMint = deriveLiqsolMintPda();\n const liqsolMintAuthority = deriveLiqsolMintAuthorityPda();\n const reservePool = deriveReservePoolPda();\n const vault = deriveVaultPda();\n const controllerState = deriveStakeControllerStatePda();\n const payoutState = derivePayoutStatePda();\n const bucketAuthority = deriveBucketAuthorityPda();\n const payRateHistory = derivePayRateHistoryPda();\n\n // -------------------------------------------------------------\n // Token-2022 ATAs\n // -------------------------------------------------------------\n const userAta = getAssociatedTokenAddressSync(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n // -------------------------------------------------------------\n // Distribution state + user_record (KEYED BY TOKEN ACCOUNT)\n // -------------------------------------------------------------\n const distributionState = deriveDistributionStatePda();\n const userRecord = deriveUserRecordPda(userAta);\n\n const bucketTokenAccount = getAssociatedTokenAddressSync(\n liqsolMint,\n bucketAuthority,\n true,\n TOKEN_2022_PROGRAM_ID,\n );\n\n // -------------------------------------------------------------\n // Ephemeral stake\n // -------------------------------------------------------------\n const seed = Math.floor(Math.random() * 2 ** 32);\n const ephemeralStake = await deriveEphemeralStakeAddress(user, seed);\n\n // -------------------------------------------------------------\n // BUILD IX (MUST MATCH IDL)\n // -------------------------------------------------------------\n const ix: TransactionInstruction = await this.program.methods\n .deposit(new BN(amount.toString()), seed)\n .accounts({\n user,\n depositAuthority,\n systemProgram: SystemProgram.programId,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n liqsolProgram: PROGRAM_IDS.LIQSOL_TOKEN,\n stakeProgram: StakeProgram.programId,\n\n liqsolMint,\n userAta,\n liqsolMintAuthority,\n reservePool,\n vault,\n ephemeralStake,\n\n controllerState,\n payoutState,\n bucketAuthority,\n bucketTokenAccount,\n\n userRecord,\n distributionState,\n payRateHistory,\n\n instructionsSysvar: SYSVAR_INSTRUCTIONS_PUBKEY,\n clock: SYSVAR_CLOCK_PUBKEY,\n stakeHistory: SYSVAR_STAKE_HISTORY_PUBKEY,\n rent: SYSVAR_RENT_PUBKEY,\n })\n .instruction();\n\n return new Transaction().add(ix);\n }\n\n /**\n * Build a withdraw-request transaction:\n * liqSOL -> SOL via liqsol_core::requestWithdraw.\n *\n * This:\n * - burns liqSOL from the user\n * - increments totalEncumberedFunds in global state\n * - mints an NFT receipt (liqReceiptData + NFT ATA for owner)\n */\n async buildWithdrawTx(\n amount: bigint,\n user = this.wallet.publicKey,\n ): Promise<Transaction> {\n if (!user) {\n throw new Error(\n 'DepositClient.buildWithdrawTx: wallet not connected',\n );\n }\n if (!amount || amount <= BigInt(0)) {\n throw new Error(\n 'DepositClient.buildWithdrawTx: amount must be greater than zero.',\n );\n }\n\n // -------------------------------------------------------------\n // Core program + liqSOL mint / user ATA\n // -------------------------------------------------------------\n const liqsolMint = deriveLiqsolMintPda();\n\n const userAta = getAssociatedTokenAddressSync(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n // Distribution / balance-tracking\n // user_record is keyed by the user’s liqSOL ATA (same convention as deposit/purchase)\n const userRecord = deriveUserRecordPda(userAta);\n const distributionState = deriveDistributionStatePda();\n\n // Reserve + stake controller PDAs\n const global = deriveWithdrawGlobalPda();\n const reservePool = deriveReservePoolPda();\n const stakeAllocationState = deriveStakeAllocationStatePda();\n const stakeMetrics = deriveStakeMetricsPda();\n const maintenanceLedger = deriveMaintenanceLedgerPda();\n\n // -------------------------------------------------------------\n // Need nextReceiptId from withdraw global state\n // -------------------------------------------------------------\n const globalState = await this.program.account.global.fetch(global);\n const receiptId = (globalState.nextReceiptId as BN).toBigInt();\n\n // -------------------------------------------------------------\n // NFT receipt PDAs (mint, metadata, data, ATA)\n // -------------------------------------------------------------\n const mintAuthority = deriveWithdrawMintAuthorityPda();\n const metadata = deriveWithdrawMintMetadataPda();\n\n const nftMint = deriveWithdrawNftMintPda(receiptId);\n const receiptData = deriveLiqReceiptDataPda(nftMint);\n\n const owner = user;\n const nftAta = getAssociatedTokenAddressSync(\n nftMint,\n owner,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n // Bucket token account (same bucket used by deposit/distribution)\n const bucketAuthority = deriveBucketAuthorityPda();\n const bucketTokenAccount = getAssociatedTokenAddressSync(\n liqsolMint,\n bucketAuthority,\n true,\n TOKEN_2022_PROGRAM_ID,\n );\n\n // -------------------------------------------------------------\n // BUILD IX (MUST MATCH requestWithdraw IDL)\n // -------------------------------------------------------------\n const ix: TransactionInstruction = await this.program.methods\n .requestWithdraw(new BN(amount.toString()))\n .accounts({\n user,\n owner,\n global,\n liqsolMint,\n userAta,\n userRecord,\n reservePool,\n stakeAllocationState,\n stakeMetrics,\n maintenanceLedger,\n clock: SYSVAR_CLOCK_PUBKEY,\n mintAuthority,\n receiptData,\n metadata,\n nftMint,\n nftAta,\n distributionState,\n bucketTokenAccount,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n tokenInterface: TOKEN_2022_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n rent: SYSVAR_RENT_PUBKEY,\n })\n .instruction();\n\n return new Transaction().add(ix);\n }\n}","import { AnchorProvider, Program, BN } from '@coral-xyz/anchor';\nimport { PublicKey } from '@solana/web3.js';\n\nimport { SolanaProgramService } from '../program';\nimport type { LiqsolCore } from '../../../assets/solana/types/liqsol_core';\nimport {\n deriveDistributionStatePda,\n deriveLiqsolMintPda,\n deriveUserRecordPda,\n} from '../constants';\nimport type { DistributionState, DistributionUserRecord } from '../types';\nimport { getAssociatedTokenAddressSync, TOKEN_2022_PROGRAM_ID } from '@solana/spl-token';\n\n/**\n * Distribution client – wraps the distribution portion of the liqsol_core\n * program in the *new* shares-only model.\n *\n * Responsibilities:\n * - Read DistributionState (global index/share pool)\n * - Read per-user UserRecord (shares)\n * - Provide simple helpers for querying user share positions\n *\n * There is no longer any notion of:\n * - tracked vs actual balances\n * - mismatch candidates\n * - updateUser / correct-&-register flow\n *\n * On-chain truth:\n * - User balances live in their liqSOL ATA.\n * - DistributionState + UserRecord track *shares* for yield.\n */\nexport class DistributionClient {\n private program: Program<LiqsolCore>;\n\n constructor(private provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('liqsolCore');\n }\n\n get connection() {\n return this.provider.connection;\n }\n\n /**\n * Fetch the global distribution state account.\n *\n * IDL account name: \"distributionState\"\n */\n async getDistributionState(): Promise<DistributionState | null> {\n const pda = deriveDistributionStatePda();\n try {\n return await this.program.account.distributionState.fetch(pda);\n } catch {\n return null;\n }\n }\n\n /**\n * Fetch a user's distribution userRecord (or null if missing).\n *\n * IDL account name: \"userRecord\"\n */\n async getUserRecord(\n ownerOrAta: PublicKey,\n ): Promise<DistributionUserRecord | null> {\n const liqsolMint = deriveLiqsolMintPda();\n\n // 1) Try treating ownerOrAta as a WALLET: derive its liqSOL ATA, then userRecord.\n try {\n const ata = getAssociatedTokenAddressSync(\n liqsolMint,\n ownerOrAta,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n const pdaFromWallet = deriveUserRecordPda(ata);\n const recFromWallet =\n await this.program.account.userRecord.fetchNullable(pdaFromWallet);\n if (recFromWallet) {\n return recFromWallet;\n }\n } catch {\n // fall through\n }\n\n // 2) Fallback: treat ownerOrAta as already being the TOKEN ACCOUNT.\n try {\n const pdaFromAta = deriveUserRecordPda(ownerOrAta);\n return await this.program.account.userRecord.fetchNullable(pdaFromAta);\n } catch {\n return null;\n }\n }\n\n /**\n * Convenience: get the user's current distribution shares.\n *\n * Returns BN(0) if the user has no userRecord yet.\n */\n async getUserShares(user: PublicKey): Promise<BN> {\n const record = await this.getUserRecord(user);\n return record ? record.shares : new BN(0);\n }\n\n /**\n * Convenience: get both the user's shares and totalShares, plus a\n * floating-point ratio (userShares / totalShares).\n *\n * NOTE: ratio is a JS number and may lose precision for very large values,\n * but is fine for display / percentage UIs.\n */\n async getUserSharePosition(user: PublicKey): Promise<{\n shares: BN;\n totalShares: BN;\n ratio: number;\n }> {\n const [dist, userShares] = await Promise.all([\n this.getDistributionState(),\n this.getUserShares(user),\n ]);\n\n const totalShares = dist ? dist.totalShares : new BN(0);\n\n let ratio = 0;\n if (!totalShares.isZero()) {\n // use toNumber() for UI-friendly ratio; if you need exact math,\n // do it with BN or bigint at the call site instead.\n ratio = userShares.toNumber() / totalShares.toNumber();\n }\n\n return { shares: userShares, totalShares, ratio };\n }\n}","import { AnchorProvider, Program } from '@coral-xyz/anchor';\nimport { PublicKey } from '@solana/web3.js';\n\nimport { SolanaProgramService } from '../program';\nimport type { ValidatorLeaderboard } from '../../../assets/solana/types/validator_leaderboard';\nimport {\n deriveLeaderboardStatePda,\n deriveValidatorRecordPda,\n} from '../constants';\nimport { LeaderboardState, ValidatorRecord } from '../types';\n\n/**\n * Simple read client for the validator_leaderboard program.\n *\n * Adjust account names/fields to match your IDL (state, validatorRecord, etc).\n */\nexport class LeaderboardClient {\n private program: Program<ValidatorLeaderboard>;\n\n constructor(private provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('validatorLeaderboard');\n }\n\n async getState(): Promise<LeaderboardState | null> {\n const pda = deriveLeaderboardStatePda();\n try {\n // Assumes account name \"leaderboardState\"\n return await this.program.account.leaderboardState.fetch(pda);\n } catch {\n return null;\n }\n }\n\n async getValidatorRecord(voteAccount: PublicKey): Promise<ValidatorRecord | null> {\n const pda = deriveValidatorRecordPda(voteAccount);\n try {\n // Assumes account name \"validatorRecord\"\n return await this.program.account.validatorRecord.fetchNullable(pda);\n } catch {\n return null;\n }\n }\n\n /**\n * Convenience helper to fetch and return top validators ordered\n * by the on-chain leaderboard scores.\n *\n * Uses:\n * - `leaderboardState.scores`\n * - `leaderboardState.sortedIndices`\n * - `validatorRecord.registryIndex`\n *\n * Fallback: if leaderboardState can't be fetched, we sort by\n * `creditsObserved` descending.\n */\n async getTopValidators(limit = 20): Promise<ValidatorRecord[]> {\n // Try to use the leaderboard state first\n try {\n const leaderboardPda = deriveLeaderboardStatePda();\n const leaderboard: LeaderboardState \n = await this.program.account.leaderboardState.fetch(leaderboardPda);\n\n const all = await this.program.account.validatorRecord.all();\n const byIndex = new Map<number, ValidatorRecord>();\n\n for (const r of all) {\n const vr = r.account;\n byIndex.set(vr.registryIndex, vr);\n }\n\n const max = Math.min(\n limit,\n leaderboard.numValidators,\n leaderboard.sortedIndices.length,\n );\n\n const top: ValidatorRecord[] = [];\n for (let i = 0; i < max; i++) {\n const idx = leaderboard.sortedIndices[i];\n const rec = byIndex.get(idx);\n if (rec) {\n top.push(rec);\n }\n }\n\n return top;\n } catch (e) {\n // Fallback: no leaderboardState available, sort by creditsObserved.\n const all = await this.program.account.validatorRecord.all();\n\n all.sort((a, b) => {\n const va = a.account;\n const vb = b.account;\n const ca = va.creditsObserved;\n const cb = vb.creditsObserved;\n // BN.cmp: -1 if a < b, 0 if equal, 1 if a > b\n return cb.cmp(ca);\n });\n\n return all.slice(0, limit).map(r => r.account);\n }\n }\n}","import { Program, BN, AnchorProvider } from '@coral-xyz/anchor';\n\nimport {\n Connection,\n Keypair,\n PublicKey,\n SystemProgram,\n StakeProgram,\n} from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddress,\n} from '@solana/spl-token';\n\nimport {\n LIQSOL_CORE,\n LIQSOL_TOKEN,\n PAY_RATE_SCALE_FACTOR,\n DEFAULT_AVERAGE_PAY_RATE,\n EPHEMERAL_RENT_EXEMPTION,\n LAMPORTS_PER_SOL,\n lamportsToSol,\n solToLamports,\n deriveDepositAuthorityPda,\n deriveLiqsolMintPda,\n deriveLiqsolMintAuthorityPda,\n deriveVaultPda,\n deriveReservePoolPda,\n deriveStakeControllerStatePda,\n derivePayoutStatePda,\n deriveBucketAuthorityPda,\n deriveDistributionStatePda,\n deriveUserRecordPda,\n derivePayRateHistoryPda,\n deriveStakeControllerVaultPda,\n deriveEphemeralStakeAddress,\n DEFAULT_PAY_RATE_LOOKBACK,\n deriveOutpostGlobalStatePda,\n deriveOutpostPoolAuthorityPda,\n deriveOutpostAccountPda,\n deriveTrancheStatePda,\n deriveUserPretokenRecordPda,\n CHAINLINK_FEED,\n CHAINLINK_PROGRAM,\n deriveExtraAccountMetaListPda,\n} from './constants';\n\nimport liqsolCoreIDL from '../../assets/solana/idl/liqsol_core.json';\nimport { LiqsolCore } from '../../assets/solana/types/liqsol_core';\nimport { GlobalState, TrancheState } from './types';\nimport { TrancheLadderItem, TrancheSnapshot } from '../../types';\nimport { ChainID } from '@wireio/core';\n\n// -----------------------------------------------------------------------------\n// Tranche Support\n// -----------------------------------------------------------------------------\n\nconst INDEX_SCALE = BigInt(1_000_000_000_000); // 1e12\nconst USD_SCALE = BigInt(100_000_000); // 1e8\nconst BPS = BigInt(10_000);\n\n/** BN | bigint -> bigint helper (keeps code readable) */\nexport function toBigint(x: any): bigint {\n if (typeof x === 'bigint') return x;\n if (typeof x === 'number') return BigInt(x);\n // Anchor BN\n return BigInt(x.toString());\n}\n\n/**\n * Convert token amount -> shares using the same rule as on-chain tests:\n * shares = ceil(amount * INDEX_SCALE / currentIndex)\n */\nexport function tokensToShares(amount: bigint, currentIndex: bigint): bigint {\n if (amount === BigInt(0)) return BigInt(0);\n const num = amount * INDEX_SCALE;\n const q = num / currentIndex;\n const r = num % currentIndex;\n return r === BigInt(0) ? q : q + BigInt(1);\n}\n\n/**\n * Apply one forward growth step: value * (BPS + growthBps) / BPS.\n * Simple integer round-half-up.\n */\nfunction growOnce(value: bigint, growthBps: number): bigint {\n const g = BigInt(growthBps);\n return (value * (BPS + g) + BPS / BigInt(2)) / BPS;\n}\n\n/**\n * Apply one backward step: value * BPS / (BPS + growthBps).\n * Also integer round-half-up.\n */\nfunction shrinkOnce(value: bigint, growthBps: number): bigint {\n const g = BigInt(growthBps);\n return (value * BPS + (BPS + g) / BigInt(2)) / (BPS + g);\n}\n\n/**\n * Build a local tranche ladder around the current tranche\n * using only on-chain config + current state.\n *\n * Rules (from liqsol_core tests):\n * - past tranches are fully sold\n * - current tranche has (initial - currentSupply) sold\n * - future tranches start with 0 sold\n * - supply/price grow by supplyGrowthBps/priceGrowthBps per tranche\n */\nexport function buildSolanaTrancheLadder(options: {\n currentTranche: number;\n initialTrancheSupply: bigint;\n currentTrancheSupply: bigint;\n currentPriceUsd: bigint;\n supplyGrowthBps: number;\n priceGrowthBps: number;\n windowBefore?: number;\n windowAfter?: number;\n}): TrancheLadderItem[] {\n const {\n currentTranche,\n initialTrancheSupply,\n currentTrancheSupply,\n currentPriceUsd,\n supplyGrowthBps,\n priceGrowthBps,\n windowBefore = 5,\n windowAfter = 5,\n } = options;\n\n const startId = Math.max(0, currentTranche - windowBefore);\n const endId = currentTranche + windowAfter;\n\n const capacity = new Map<number, bigint>();\n const price = new Map<number, bigint>();\n\n // Seed current\n capacity.set(currentTranche, initialTrancheSupply);\n price.set(currentTranche, currentPriceUsd);\n\n // Forward (future tranches)\n for (let id = currentTranche + 1; id <= endId; id++) {\n const prevCap = capacity.get(id - 1)!;\n const prevPrice = price.get(id - 1)!;\n capacity.set(id, growOnce(prevCap, supplyGrowthBps));\n price.set(id, growOnce(prevPrice, priceGrowthBps));\n }\n\n // Backward (past tranches)\n for (let id = currentTranche - 1; id >= startId; id--) {\n const nextCap = capacity.get(id + 1)!;\n const nextPrice = price.get(id + 1)!;\n capacity.set(id, shrinkOnce(nextCap, supplyGrowthBps));\n price.set(id, shrinkOnce(nextPrice, priceGrowthBps));\n }\n\n const ladder: TrancheLadderItem[] = [];\n for (let id = startId; id <= endId; id++) {\n const cap = capacity.get(id)!;\n let sold: bigint;\n if (id < currentTranche) {\n sold = cap;\n } else if (id === currentTranche) {\n sold = cap - currentTrancheSupply;\n } else {\n sold = BigInt(0);\n }\n\n ladder.push({\n id,\n capacity: cap,\n sold,\n remaining: cap - sold,\n priceUsd: price.get(id)!,\n });\n }\n\n return ladder;\n}\n\n/**\n * Turn raw liqsol_core accounts into a chain-agnostic TrancheSnapshot for SOL.\n * All math stays here; TokenClient just wires accounts + connection.\n */\nexport function buildSolanaTrancheSnapshot(options: {\n chainID: ChainID;\n globalState: GlobalState;\n trancheState: TrancheState;\n solPriceUsd?: bigint;\n nativePriceTimestamp?: number;\n ladderWindowBefore?: number;\n ladderWindowAfter?: number;\n}): TrancheSnapshot {\n const {\n chainID,\n globalState,\n trancheState,\n solPriceUsd,\n nativePriceTimestamp,\n ladderWindowBefore,\n ladderWindowAfter,\n } = options;\n\n const currentIndex = toBigint(globalState.currentIndex);\n const totalShares = toBigint(globalState.totalShares);\n const currentTranche = trancheState.currentTrancheNumber.toNumber();\n const currentTrancheSupply = toBigint(trancheState.currentTrancheSupply);\n const initialTrancheSupply = toBigint(trancheState.initialTrancheSupply);\n const totalPretokensSold = toBigint(trancheState.totalPretokensSold);\n const currentPriceUsd = toBigint(trancheState.currentTranchePriceUsd);\n const supplyGrowthBps = trancheState.supplyGrowthBps;\n const priceGrowthBps = trancheState.priceGrowthBps;\n\n const ladder = buildSolanaTrancheLadder({\n currentTranche,\n initialTrancheSupply,\n currentTrancheSupply,\n currentPriceUsd,\n supplyGrowthBps,\n priceGrowthBps,\n windowBefore: ladderWindowBefore,\n windowAfter: ladderWindowAfter,\n });\n\n return {\n chainID,\n currentIndex,\n totalShares,\n currentTranche,\n currentPriceUsd,\n supplyGrowthBps,\n priceGrowthBps,\n totalPretokensSold,\n currentTrancheSupply,\n initialTrancheSupply,\n nativePriceUsd: solPriceUsd,\n nativePriceTimestamp,\n ladder,\n };\n}\n\n\n// -----------------------------------------------------------------------------\n// Read-only liqsol_core Program helper\n// -----------------------------------------------------------------------------\n\nlet _liqsolCoreProgram: Program<LiqsolCore> | null = null;\n\nexport function getLiqsolCoreProgram(\n connection: Connection,\n): Program<LiqsolCore> {\n if (_liqsolCoreProgram && _liqsolCoreProgram.provider.connection === connection) {\n return _liqsolCoreProgram;\n }\n\n // Dummy wallet – we're only doing read-only account fetches here.\n const tmpKeypair = Keypair.generate();\n const wallet: any = {\n publicKey: tmpKeypair.publicKey,\n signAllTransactions: async () => [],\n signTransaction: async () => tmpKeypair,\n };\n\n const provider = new AnchorProvider(connection, wallet, {\n commitment: 'confirmed',\n });\n\n const program = new Program(\n liqsolCoreIDL,\n provider,\n ) as Program<LiqsolCore>;\n\n _liqsolCoreProgram = program;\n return program;\n}\n\n\n// -----------------------------------------------------------------------------\n// Balance + state getters (UI-friendly)\n// -----------------------------------------------------------------------------\n\nexport async function getUserLiqSolBalance(\n connection: Connection,\n user: PublicKey,\n): Promise<number> {\n const liqsolMint = deriveLiqsolMintPda();\n const ata = await getAssociatedTokenAddress(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n try {\n const bal = await connection.getTokenAccountBalance(ata);\n return Number(bal.value.amount); // raw lamports, not decimals-adjusted\n } catch {\n return 0;\n }\n}\n\nexport async function getBucketLiqSolBalance(\n connection: Connection,\n): Promise<number> {\n const liqsolMint = deriveLiqsolMintPda();\n const bucketAuthority = deriveBucketAuthorityPda();\n const ata = await getAssociatedTokenAddress(\n liqsolMint,\n bucketAuthority,\n true,\n TOKEN_2022_PROGRAM_ID,\n );\n\n try {\n const bal = await connection.getTokenAccountBalance(ata);\n return Number(bal.value.amount);\n } catch {\n return 0;\n }\n}\n\nexport async function getReservePoolBalance(\n connection: Connection,\n): Promise<number> {\n const reservePool = deriveReservePoolPda();\n try {\n const lamports = await connection.getBalance(reservePool);\n return lamports;\n } catch {\n return 0;\n }\n}\n\n/**\n * Raw account info for the stake_controller state (Anchor decode is left\n * to the caller so the SDK can stay IDL-agnostic at this layer).\n */\nexport async function getStakeControllerStateRaw(\n connection: Connection,\n): Promise<Uint8Array | null> {\n const pda = deriveStakeControllerStatePda();\n const info = await connection.getAccountInfo(pda);\n return info?.data ?? null;\n}\n\n/**\n * Raw account info for the payout-state account.\n */\nexport async function getPayoutStateRaw(\n connection: Connection,\n): Promise<Uint8Array | null> {\n const pda = derivePayoutStatePda();\n const info = await connection.getAccountInfo(pda);\n return info?.data ?? null;\n}\n\n/**\n * Raw account info for a user's distribution user_record.\n *\n * NOTE: user_record is keyed by the TOKEN ACCOUNT (ATA), not the wallet.\n * Here we derive the user's liqSOL ATA and then its user_record PDA.\n */\nexport async function getUserRecordRaw(\n connection: Connection,\n user: PublicKey,\n): Promise<Uint8Array | null> {\n const liqsolMint = deriveLiqsolMintPda();\n const userAta = await getAssociatedTokenAddress(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n const pda = deriveUserRecordPda(userAta);\n const info = await connection.getAccountInfo(pda);\n return info?.data ?? null;\n}\n\n\n// -----------------------------------------------------------------------------\n// Pay-rate & fee utilities (on-chain compatible)\n// -----------------------------------------------------------------------------\n\nexport async function getAveragePayRate(\n connection: Connection,\n lookback: number = DEFAULT_PAY_RATE_LOOKBACK,\n): Promise<bigint> {\n const program = getLiqsolCoreProgram(connection);\n const payRateHistoryPda = derivePayRateHistoryPda();\n\n try {\n const anyProgram = program;\n const payRateHistoryAccount = await anyProgram.account.payRateHistory.fetch(\n payRateHistoryPda,\n );\n\n const entries = payRateHistoryAccount.entries ?? [];\n const totalEntriesAdded = Number(\n payRateHistoryAccount.totalEntriesAdded ?? 0,\n );\n const currentIndex: number = payRateHistoryAccount.currentIndex ?? 0;\n const maxEntries: number =\n payRateHistoryAccount.maxEntries ?? entries.length;\n\n if (!entries.length) {\n return DEFAULT_AVERAGE_PAY_RATE;\n }\n\n const entriesToFetch = Math.min(lookback, maxEntries, entries.length);\n\n let idx: number;\n if (totalEntriesAdded === 0) {\n idx = 0;\n } else if (currentIndex === 0) {\n idx = maxEntries - 1;\n } else {\n idx = currentIndex - 1;\n }\n\n let sum = BigInt(0);\n let validCount = BigInt(0);\n\n for (let i = 0; i < entriesToFetch; i++) {\n const entry = entries[idx];\n if (entry && typeof entry.scaledRate !== 'undefined') {\n const rate = BigInt(entry.scaledRate.toString());\n if (rate > BigInt(0)) {\n sum += rate;\n validCount += BigInt(1);\n }\n }\n\n if (totalEntriesAdded === 0) {\n idx = (idx + 1) % maxEntries;\n } else {\n idx = idx === 0 ? maxEntries - 1 : idx - 1;\n }\n }\n\n if (validCount === BigInt(0)) {\n return DEFAULT_AVERAGE_PAY_RATE;\n }\n\n return sum / validCount;\n } catch (err) {\n // Fallback to default when history missing/unavailable\n return DEFAULT_AVERAGE_PAY_RATE;\n }\n}\n\n/**\n * On-chain fee formula:\n * fee = (average_pay_rate * 4 * deposit_amount_lamports) / 10^12\n */\nexport function calculateExpectedFee(\n depositAmountLamports: BN,\n averagePayRate: BN,\n): BN {\n return averagePayRate\n .mul(new BN(4))\n .mul(depositAmountLamports)\n .div(new BN(1_000_000_000_000)); // 10^12\n}\n\n/**\n * Convenience helper to preview how a deposit splits between user + bucket\n * and how much goes into the reserve, assuming the simple model:\n *\n * - userLiqSol = amount - fee + EPHEMERAL_RENT_EXEMPTION\n * - bucketLiqSol = fee\n * - reserveLamports = amount + EPHEMERAL_RENT_EXEMPTION\n */\nexport function previewDepositEffects(params: {\n depositAmountLamports: BN;\n averagePayRate: BN;\n rentExemptionLamports?: number;\n}): {\n feeLamports: BN;\n userLiqSolLamports: BN;\n bucketLiqSolLamports: BN;\n reserveIncreaseLamports: BN;\n} {\n const { depositAmountLamports, averagePayRate } = params;\n const rent = new BN(\n params.rentExemptionLamports ?? EPHEMERAL_RENT_EXEMPTION,\n );\n\n const fee = calculateExpectedFee(depositAmountLamports, averagePayRate);\n const userLiqSol = depositAmountLamports.sub(fee).add(rent);\n const bucketLiqSol = fee;\n const reserveIncrease = depositAmountLamports.add(rent);\n\n return {\n feeLamports: fee,\n userLiqSolLamports: userLiqSol,\n bucketLiqSolLamports: bucketLiqSol,\n reserveIncreaseLamports: reserveIncrease,\n };\n}\n\n/**\n * ---------------------------------------------------------------------------\n * Outpost-specific helpers\n * ---------------------------------------------------------------------------\n *\n * This is the SDK equivalent of `deriveWirePdas` in capital-staking tests.\n * It aggregates all PDAs / ATAs needed for Outpost pretokens + synd/desynd.\n */\nexport interface OutpostAccounts {\n user: PublicKey;\n\n // Outpost / pretoken wiring\n globalState: PublicKey;\n poolAuthority: PublicKey;\n liqsolMint: PublicKey;\n liqsolPoolAta: PublicKey;\n userAta: PublicKey;\n outpostAccount: PublicKey;\n userPretokenRecord: PublicKey;\n\n // Distribution / yield context (user_record keyed by token accounts)\n distributionState: PublicKey;\n bucketAuthority: PublicKey;\n bucketTokenAccount: PublicKey;\n bucketUserRecord: PublicKey;\n liqsolPoolUserRecord: PublicKey;\n userUserRecord: PublicKey;\n\n // Tranche / pricing\n trancheState: PublicKey;\n\n // Chainlink\n chainLinkFeed: PublicKey;\n chainLinkProgram: PublicKey;\n\n // Transfer hook extra accounts\n extraAccountMetaList: PublicKey;\n}\n\nexport async function buildOutpostAccounts(\n connection: Connection,\n user: PublicKey,\n): Promise<OutpostAccounts> {\n const globalState = deriveOutpostGlobalStatePda();\n const poolAuthority = deriveOutpostPoolAuthorityPda();\n const liqsolMint = deriveLiqsolMintPda();\n const distributionState = deriveDistributionStatePda();\n const bucketAuthority = deriveBucketAuthorityPda();\n const trancheState = deriveTrancheStatePda();\n\n // Outpost / pretoken PDAs\n const outpostAccount = deriveOutpostAccountPda(user);\n const userPretokenRecord = deriveUserPretokenRecordPda(user);\n\n // ATAs\n const liqsolPoolAta = await getAssociatedTokenAddress(\n liqsolMint,\n poolAuthority,\n true,\n TOKEN_2022_PROGRAM_ID,\n );\n\n const bucketTokenAccount = await getAssociatedTokenAddress(\n liqsolMint,\n bucketAuthority,\n true,\n TOKEN_2022_PROGRAM_ID,\n );\n\n const userAta = await getAssociatedTokenAddress(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n // user_record PDAs keyed by TOKEN ACCOUNTS (matches capital-staking)\n const bucketUserRecord = deriveUserRecordPda(bucketTokenAccount);\n const liqsolPoolUserRecord = deriveUserRecordPda(liqsolPoolAta);\n const userUserRecord = deriveUserRecordPda(userAta);\n\n const extraAccountMetaList = deriveExtraAccountMetaListPda(liqsolMint);\n\n // Chainlink program feeds\n let chainLinkFeed = CHAINLINK_FEED;\n let chainLinkProgram = CHAINLINK_PROGRAM;\n\n try {\n const program = getLiqsolCoreProgram(connection);\n const ts: TrancheState =\n await program.account.trancheState.fetch(trancheState);\n\n // If on-chain config overrides are present, prefer those.\n if (ts.chainlinkFeed && ts.chainlinkProgram) {\n chainLinkFeed = ts.chainlinkFeed as PublicKey;\n chainLinkProgram = ts.chainlinkProgram as PublicKey;\n }\n } catch {\n // If trancheState isn't initialized yet, we fall back to the constants.\n // In that case, purchase instructions will still fail, which is the\n // correct behavior until admin initializes TrancheState on-chain.\n }\n\n void connection; // reserved for future extra validation\n\n return {\n user,\n globalState,\n poolAuthority,\n liqsolMint,\n liqsolPoolAta,\n userAta,\n outpostAccount,\n userPretokenRecord,\n distributionState,\n bucketAuthority,\n bucketTokenAccount,\n bucketUserRecord,\n liqsolPoolUserRecord,\n userUserRecord,\n trancheState,\n chainLinkFeed,\n chainLinkProgram,\n extraAccountMetaList\n };\n}\n// -----------------------------------------------------------------------------\n// Epoch / scheduling helpers\n// -----------------------------------------------------------------------------\n\nexport type EpochSnapshot = {\n epoch: number;\n slot: number;\n firstSlot: number;\n slotsInEpoch: number;\n slotMs: number;\n};\n\nexport async function getEpochSnapshot(\n connection: Connection,\n): Promise<EpochSnapshot> {\n const info = await connection.getEpochInfo();\n\n // Fallback slot time\n let slotTimeMs = Number(process.env.SLOT_TIME_MS_FALLBACK ?? 400);\n\n try {\n const samples = await connection.getRecentPerformanceSamples(16);\n if (samples.length) {\n const avgMs =\n samples.reduce(\n (acc, s) => acc + (s.samplePeriodSecs * 1000) / s.numSlots,\n 0,\n ) / samples.length;\n if (isFinite(avgMs) && avgMs > 0) {\n slotTimeMs = avgMs;\n }\n }\n } catch {\n // ignore; keep fallback\n }\n\n return {\n epoch: info.epoch,\n slot: info.slotIndex,\n firstSlot: info.absoluteSlot - info.slotIndex,\n slotsInEpoch: info.slotsInEpoch,\n slotMs: slotTimeMs,\n };\n}\n\nexport function msToEpochEnd(snapshot: EpochSnapshot): number {\n const remainingSlots = snapshot.slotsInEpoch - snapshot.slot;\n return remainingSlots * snapshot.slotMs;\n}\n\n/**\n * Generic \"execute around epoch boundaries\" helper:\n *\n * - If current progress is within [early, late], run immediately.\n * - If too early, sleep until `early` percentage into the epoch.\n * - If too late, sleep until `early` percentage into the *next* epoch.\n *\n * This is generic; you can wrap any instruction builder in here (including\n * deposit flows) without baking in program-specific logic.\n */\nexport async function scheduledInstruction<T>(\n connection: Connection,\n config: ScheduleConfig,\n instruction: () => Promise<T>,\n): Promise<T> {\n const early = config.early ?? 0.10;\n const late = config.late ?? 0.90;\n\n const snapshot = await getEpochSnapshot(connection);\n const progress = snapshot.slot / snapshot.slotsInEpoch;\n\n // Case 1: Already in safe zone\n if (progress >= early && progress <= late) {\n return instruction();\n }\n\n // Case 2: Early in epoch → wait until `early`\n if (progress < early) {\n const targetSlot = snapshot.slotsInEpoch * early;\n const slotsRemaining = targetSlot - snapshot.slot;\n const msToWait = slotsRemaining * snapshot.slotMs;\n\n console.log(\n `Epoch early (${(progress * 100).toFixed(\n 2,\n )}%). Sleeping ${(msToWait / 1000).toFixed(1)}s until ${early * 100\n }%...`,\n );\n\n await sleep(Math.max(1000, msToWait));\n return instruction();\n }\n\n // Case 3: Late in epoch → wait for next epoch + early window\n const msToNextEpoch = msToEpochEnd(snapshot);\n const earlyWaitTime = snapshot.slotsInEpoch * early * snapshot.slotMs;\n const totalWaitTime = msToNextEpoch + earlyWaitTime + 1000;\n\n console.log(\n `Epoch late (${(progress * 100).toFixed(\n 2,\n )}%). Sleeping ${(totalWaitTime / 1000).toFixed(\n 1,\n )}s until next epoch + ${early * 100}%...`,\n );\n\n await sleep(totalWaitTime);\n return instruction();\n}\n\n\n// -----------------------------------------------------------------------------\n// Generic helpers (used in tests + can be useful in apps)\n// -----------------------------------------------------------------------------\n\nexport function getErrorMessage(error: any): string {\n return (\n error?.error?.errorCode?.code ||\n error?.error?.errorMessage ||\n error?.message ||\n ''\n );\n}\n\nexport function generateRandomDepositAmount(\n minSol = 2,\n maxSol = 100,\n): BN {\n const randomSol = Math.random() * (maxSol - minSol) + minSol;\n return new BN(solToLamports(randomSol));\n}\n\nexport function generateTestKeypair(): Keypair {\n return Keypair.generate();\n}\n\nexport async function airdropSol(\n connection: Connection,\n publicKey: PublicKey,\n amountSol: number,\n): Promise<void> {\n const lamports = solToLamports(amountSol);\n const sig = await connection.requestAirdrop(publicKey, Number(lamports));\n await connection.confirmTransaction(sig, 'confirmed');\n}\n\nexport async function waitForConfirmation(\n connection: Connection,\n signature: string,\n): Promise<void> {\n await connection.confirmTransaction(signature, 'confirmed');\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Simple helper used in tests: wait until safe zone, no-op.\n */\nexport async function waitUntilSafeToExecuteFunction(\n connection: Connection,\n config: ScheduleConfig = {},\n): Promise<void> {\n await scheduledInstruction(connection, config, async () => {\n // no-op\n return;\n });\n}\n\nexport interface ScheduleConfig {\n early?: number; // fraction of epoch, default 0.10\n late?: number; // fraction of epoch, default 0.90\n}","import { AnchorProvider, BN, Program } from '@coral-xyz/anchor';\nimport {\n PublicKey,\n SystemProgram,\n TransactionInstruction,\n} from '@solana/web3.js';\nimport {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n TOKEN_2022_PROGRAM_ID,\n} from '@solana/spl-token';\n\nimport liqsolCoreIDL from '../../../assets/solana/idl/liqsol_core.json';\nimport { LiqsolCore } from '../../../assets/solana/types/liqsol_core';\n\nimport {\n OutpostAccounts,\n buildOutpostAccounts,\n} from '../utils';\n\nimport {\n OutpostWireStateSnapshot,\n SharesPreview,\n TrancheState,\n WalletLike,\n} from '../types';\nimport { INDEX_SCALE, PROGRAM_IDS } from '../constants';\n\n/**\n * OutpostClient\n *\n * Read-only + preview helper for:\n * - Outpost config + per-user pretokens\n * - Tranche ladder snapshot\n * - Pretoken preview math\n *\n * Write helpers:\n * - buildStakeIx → liqsol_core::synd\n * - buildUnstakeIx → liqsol_core::desynd\n *\n * All PDAs / ATAs are sourced via buildOutpostAccounts, which is kept\n * in sync with the on-chain PDAs and capital-staking Wire utils.\n */\nexport class OutpostClient {\n private readonly program: Program<LiqsolCore>;\n\n constructor(\n private readonly provider: AnchorProvider,\n ) {\n this.program = new Program(liqsolCoreIDL as any, provider);\n }\n\n get connection() {\n return this.provider.connection;\n }\n\n get wallet(): WalletLike {\n return this.provider.wallet as unknown as WalletLike;\n }\n\n /**\n * Expose the raw Program in case callers need to build custom\n * instructions outside this client.\n */\n get liqsolCoreProgram(): Program<LiqsolCore> {\n return this.program;\n }\n\n /**\n * Build all outpost-related PDAs / ATAs for a given user.\n * Defaults to the connected wallet.\n */\n async buildAccounts(user?: PublicKey): Promise<OutpostAccounts> {\n const userPk = user ?? this.wallet.publicKey;\n if (!userPk) {\n throw new Error('OutpostClient.buildAccounts: wallet not connected');\n }\n return buildOutpostAccounts(this.connection, userPk);\n }\n\n /**\n * Internal helper: get raw token balance (BN) for a given ATA.\n */\n private async getTokenBalance(ata: PublicKey): Promise<BN> {\n try {\n const bal = await this.connection.getTokenAccountBalance(ata);\n return new BN(bal.value.amount);\n } catch {\n return new BN(0);\n }\n }\n\n /**\n * Fetch the core \"Wire state\" for Outpost / pretokens for a given user.\n */\n async fetchWireState(user?: PublicKey): Promise<OutpostWireStateSnapshot> {\n const userPk = user ?? this.wallet.publicKey;\n if (!userPk) {\n throw new Error('OutpostClient.fetchWireState: wallet not connected');\n }\n\n const pdas = await this.buildAccounts(userPk);\n\n const [\n globalState,\n outpostAccount,\n distributionState,\n userPretokenRecord,\n trancheState,\n ] = await Promise.all([\n this.program.account.globalState.fetch(pdas.globalState),\n this.program.account.outpostAccount.fetchNullable(pdas.outpostAccount),\n this.program.account.distributionState.fetchNullable(pdas.distributionState),\n this.program.account.userPretokenRecord.fetchNullable(pdas.userPretokenRecord),\n this.program.account.trancheState.fetchNullable(pdas.trancheState),\n ]);\n\n const [liqsolPoolBalance, userLiqsolBalance] = await Promise.all([\n this.getTokenBalance(pdas.liqsolPoolAta),\n this.getTokenBalance(pdas.userAta),\n ]);\n\n return {\n globalState,\n outpostAccount,\n distributionState,\n trancheState,\n userPretokenRecord,\n liqsolPoolBalance,\n userLiqsolBalance,\n };\n }\n\n // -------------------------------------------------------------------------\n // Outpost stake / unstake builders (synd / desynd)\n // -------------------------------------------------------------------------\n\n /**\n * Build the `synd` (stake) instruction:\n * user liqSOL ATA → liqSOL pool ATA\n */\n async buildStakeIx(\n amountLamports: bigint,\n user?: PublicKey,\n ): Promise<TransactionInstruction> {\n const userPk = user ?? this.wallet.publicKey;\n if (!userPk) {\n throw new Error('OutpostClient.buildStakeIx: wallet not connected');\n }\n\n const a = await this.buildAccounts(userPk);\n\n return this.program.methods\n .synd(new BN(amountLamports.toString()))\n .accounts({\n user: userPk,\n liqsolMint: a.liqsolMint,\n globalState: a.globalState,\n distributionState: a.distributionState,\n userAta: a.userAta,\n poolAuthority: a.poolAuthority,\n bucketAuthority: a.bucketAuthority,\n bucketTokenAccount: a.bucketTokenAccount,\n bucketUserRecord: a.bucketUserRecord,\n senderUserRecord: a.userUserRecord,\n receiverUserRecord: a.liqsolPoolUserRecord,\n extraAccountMetaList: a.extraAccountMetaList,\n liqsolCoreProgram: PROGRAM_IDS.LIQSOL_CORE,\n transferHookProgram: PROGRAM_IDS.TRANSFER_HOOK,\n liqsolPoolAta: a.liqsolPoolAta,\n outpostAccount: a.outpostAccount,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n /**\n * Build the `desynd` (unstake) instruction:\n * liqSOL pool ATA → user liqSOL ATA\n */\n async buildUnstakeIx(\n amountLamports: bigint,\n user?: PublicKey,\n ): Promise<TransactionInstruction> {\n const userPk = user ?? this.wallet.publicKey;\n if (!userPk) {\n throw new Error('OutpostClient.buildUnstakeIx: wallet not connected');\n }\n\n const a = await this.buildAccounts(userPk);\n\n return this.program.methods\n .desynd(new BN(amountLamports.toString()))\n .accounts({\n user: userPk,\n liqsolMint: a.liqsolMint,\n globalState: a.globalState,\n distributionState: a.distributionState,\n userAta: a.userAta,\n poolAuthority: a.poolAuthority,\n bucketAuthority: a.bucketAuthority,\n bucketTokenAccount: a.bucketTokenAccount,\n bucketUserRecord: a.bucketUserRecord,\n senderUserRecord: a.liqsolPoolUserRecord,\n receiverUserRecord: a.userUserRecord,\n extraAccountMetaList: a.extraAccountMetaList,\n liqsolCoreProgram: PROGRAM_IDS.LIQSOL_CORE,\n transferHookProgram: PROGRAM_IDS.TRANSFER_HOOK,\n liqsolPoolAta: a.liqsolPoolAta,\n outpostAccount: a.outpostAccount,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n // -------------------------------------------------------------------------\n // Pretoken preview helper (unchanged)\n // -------------------------------------------------------------------------\n\n /**\n * Local preview for \"how many pretokens would I get for this liqSOL\n * amount at the current tranche price and SOL/USD price?\"\n *\n * SCALE = 1e8\n * usdValue = solAmountLamports * solPriceUsd / 1e9\n * pretokens = usdValue * SCALE / pretokenPriceUsd\n *\n * All values are BN integers; solPriceUsd and pretokenPriceUsd are 1e8 scaled.\n */\n previewPretokens(params: {\n liqsolAmountLamports: BN;\n solPriceUsd: BN; // 1e8 scale\n trancheState: TrancheState;\n }): SharesPreview {\n const { liqsolAmountLamports, solPriceUsd, trancheState } = params;\n\n // Current tranche price in USD (1e8 scale)\n const pretokenPriceUsd = new BN(\n trancheState.currentTranchePriceUsd.toString(),\n );\n\n const SCALE = new BN('100000000'); // 1e8\n\n // usdValue = (lamports * solPriceUsd) / 1e9\n const usdValue = liqsolAmountLamports\n .mul(solPriceUsd)\n .div(new BN(1_000_000_000));\n\n const estimatedPretokens = usdValue.mul(SCALE).div(pretokenPriceUsd);\n\n return {\n liqsolAmountLamports,\n solPriceUsd,\n pretokenPriceUsd,\n estimatedPretokens,\n };\n }\n\n /**\n * Convert liqSOL tokens (lamports) → Outpost “shares”, rounding UP\n * when there is any remainder.\n *\n * This matches the on-chain logic and the capital-staking helper:\n *\n * INDEX_SCALE = 1e12\n * numerator = amount * INDEX_SCALE\n * shares = numerator / currentIndex\n * remainder = numerator % currentIndex\n * if remainder > 0 → shares + 1\n */\n static tokensToShares(amount: BN, currentIndex: BN): BN {\n const numerator = amount.mul(INDEX_SCALE);\n const shares = numerator.div(currentIndex);\n const remainder = numerator.mod(currentIndex);\n return remainder.eqn(0) ? shares : shares.addn(1);\n }\n\n /**\n * Format a 1e8-scaled integer (e.g. USD price, pretokens, etc.)\n * into a fixed 8-decimal string.\n *\n * Examples:\n * 0 -> \"0.00000000\"\n * 1 -> \"0.00000001\"\n * 100000000 -> \"1.00000000\"\n * 123456789 -> \"1.23456789\"\n */\n static formatScale8(value: BN): string {\n const decimals = 8;\n const valueStr = value.toString();\n\n if (valueStr.length <= decimals) {\n const padding = '0'.repeat(decimals - valueStr.length);\n return `0.${padding}${valueStr}`;\n }\n\n const intPart = valueStr.slice(0, valueStr.length - decimals);\n const decPart = valueStr.slice(valueStr.length - decimals);\n return `${intPart}.${decPart}`;\n }\n}","import { AnchorProvider, BN, Program } from '@coral-xyz/anchor';\nimport type { TransactionInstruction, Connection } from '@solana/web3.js';\nimport { PublicKey, SystemProgram } from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n} from '@solana/spl-token';\n\nimport {\n buildOutpostAccounts,\n type OutpostAccounts,\n} from '../utils';\n\nimport { SolanaProgramService } from '../program';\nimport type { LiqsolCore } from '../../../assets/solana/types/liqsol_core';\n\nimport {\n GlobalState,\n PriceHistory,\n TrancheState,\n WalletLike,\n OutpostAccount,\n UserPretokenRecord,\n} from '../types';\n\nimport {\n derivePriceHistoryPda,\n CHAINLINK_FEED,\n CHAINLINK_PROGRAM,\n PROGRAM_IDS,\n deriveExtraAccountMetaListPda,\n} from '../constants';\n\n\nexport class TokenClient {\n private readonly program: Program<LiqsolCore>;\n\n get wallet(): WalletLike {\n return this.provider.wallet;\n }\n\n get connection(): Connection {\n return this.provider.connection;\n }\n\n constructor(private readonly provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('liqsolCore');\n }\n\n // ---------------------------------------------------------------------------\n // Account helpers\n // ---------------------------------------------------------------------------\n\n async getAccounts(user: PublicKey): Promise<OutpostAccounts> {\n return buildOutpostAccounts(this.provider.connection, user);\n }\n\n async fetchGlobalState(): Promise<GlobalState> {\n const { globalState } = await this.getAccounts(this.wallet.publicKey);\n return this.program.account.globalState.fetch(globalState);\n }\n\n async fetchTrancheState(): Promise<TrancheState> {\n const { trancheState } = await this.getAccounts(this.wallet.publicKey);\n return this.program.account.trancheState.fetch(trancheState);\n }\n\n /**\n * Fetch the per-user Outpost account (old \"wire receipt\").\n * Returns null if the user has never interacted with Outpost.\n */\n async fetchOutpostAccount(user: PublicKey): Promise<OutpostAccount | null> {\n const { outpostAccount } = await this.getAccounts(user);\n return this.program.account.outpostAccount.fetchNullable(outpostAccount);\n }\n\n /**\n * Fetch the per-user pretoken purchase record.\n * Returns null if the user has never purchased pretokens.\n */\n async fetchUserPretokenRecord(\n user: PublicKey,\n ): Promise<UserPretokenRecord | null> {\n const { userPretokenRecord } = await this.getAccounts(user);\n return this.program.account.userPretokenRecord.fetchNullable(\n userPretokenRecord,\n );\n }\n\n // ---------------------------------------------------------------------------\n // Instruction builders (no send / confirm)\n // ---------------------------------------------------------------------------\n\n /**\n * Build a pretoken `purchase` instruction using liqSOL from the user’s ATA.\n *\n * This mirrors capital-staking `executePurchase` wiring:\n * - amountLamports: liqSOL amount (raw token-2022 units, not SOL)\n */\n async buildPurchaseIx(\n amountLamports: bigint,\n user = this.wallet.publicKey,\n ): Promise<TransactionInstruction> {\n const a = await this.getAccounts(user);\n\n const extraAccountMetaList = deriveExtraAccountMetaListPda(a.liqsolMint);\n const liqsolCoreProgram = PROGRAM_IDS.LIQSOL_CORE;\n const transferHookProgram = PROGRAM_IDS.TRANSFER_HOOK;\n\n return this.program.methods\n .purchase(new BN(amountLamports.toString()))\n .accounts({\n user: a.user,\n liqsolMint: a.liqsolMint,\n globalState: a.globalState,\n distributionState: a.distributionState,\n\n // buyer’s liqSOL\n buyerAta: a.userAta,\n\n // pool / bucket context\n poolAuthority: a.poolAuthority,\n bucketAuthority: a.bucketAuthority,\n bucketTokenAccount: a.bucketTokenAccount,\n bucketUserRecord: a.bucketUserRecord,\n\n // distribution userRecords (token-account keyed)\n senderUserRecord: a.userUserRecord,\n receiverUserRecord: a.liqsolPoolUserRecord,\n\n // transfer-hook wiring\n extraAccountMetaList,\n liqsolCoreProgram,\n transferHookProgram,\n\n // pool + outpost + tranche\n liqsolPoolAta: a.liqsolPoolAta,\n outpostAccount: a.outpostAccount,\n trancheState: a.trancheState,\n userPretokenRecord: a.userPretokenRecord,\n\n // Chainlink pricing\n chainlinkFeed: a.chainLinkFeed ?? CHAINLINK_FEED,\n chainlinkProgram: a.chainLinkProgram ?? CHAINLINK_PROGRAM,\n\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n // NOTE:\n // - There is no longer `purchaseWithSol` in the IDL - SOL → liqSOL happens\n // through the deposit / liqSOL minting path, not directly in pretokens.\n // - `purchaseFromYield` is an operator-facing / protocol flow and you\n // indicated you’ll trigger it from Wire infra, so we don’t expose a\n // client helper here for now.\n\n // ---------------------------------------------------------------------------\n // Price helpers (SOL/USD via priceHistory account)\n // ---------------------------------------------------------------------------\n\n async getSolPriceUsdSafe(): Promise<{ price?: bigint; timestamp?: number }> {\n try {\n const price = await this.getSolPriceUsd();\n // current priceHistory account has no timestamp; keep optional\n return { price, timestamp: undefined };\n } catch {\n return { price: undefined, timestamp: undefined };\n }\n }\n\n /**\n * Fetch latest SOL/USD price (1e8 scale) from liqsol_core.priceHistory.\n * Uses the ring-buffer semantics from capital-staking.\n */\n async getSolPriceUsd(): Promise<bigint> {\n const priceHistoryPda = derivePriceHistoryPda();\n const history = (await this.program.account.priceHistory.fetch(\n priceHistoryPda,\n )) as PriceHistory;\n\n const { prices, nextIndex, count, windowSize } = history;\n\n if (!prices || prices.length === 0 || !count) {\n throw new Error('Price history is empty - no SOL price available');\n }\n\n const capacity = prices.length || windowSize;\n if (!capacity) {\n throw new Error(\n 'Price history capacity is zero - check account layout',\n );\n }\n\n const lastIndex = nextIndex === 0 ? capacity - 1 : nextIndex - 1;\n const latest = prices[lastIndex];\n\n if (!BN.isBN(latest)) {\n throw new Error(\n 'Latest price entry is not a BN - check IDL/decoder',\n );\n }\n\n return BigInt(latest.toString());\n }\n}","import {\n Commitment,\n ComputeBudgetProgram,\n Connection,\n ConnectionConfig,\n 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 {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddressSync,\n TOKEN_2022_PROGRAM_ID,\n} from '@solana/spl-token';\n\nimport {\n ChainID,\n ExternalNetwork,\n KeyType,\n PublicKey,\n SolChainID,\n} from '@wireio/core';\n\nimport {\n IStakingClient,\n Portfolio,\n StakerConfig,\n TrancheSnapshot,\n} from '../../types';\n\nimport { DepositClient } from './clients/deposit.client';\nimport { DistributionClient } from './clients/distribution.client';\nimport { LeaderboardClient } from './clients/leaderboard.client';\nimport { OutpostClient } from './clients/outpost.client';\nimport { TokenClient } from './clients/token.client';\n\nimport {\n deriveLiqsolMintPda,\n deriveReservePoolPda,\n deriveVaultPda,\n INDEX_SCALE,\n} from './constants';\n\nimport { buildSolanaTrancheSnapshot } from './utils';\nimport { SolanaTransaction } from './types';\n\nconst commitment: Commitment = 'confirmed';\n\n/**\n * Solana implementation of IStakingClient.\n *\n * Responsibilities:\n * - liqSOL deposit (SOL -> liqSOL)\n * - withdraw requests (liqSOL -> NFT receipt / encumbered SOL)\n * - Pretoken (WIRE) buys via liqSOL\n * - Unified portfolio + tranche snapshot + balance correction (later)\n *\n * This composes lower-level clients; it does not know about UI.\n */\nexport class SolanaStakingClient implements IStakingClient {\n public pubKey?: PublicKey; // Wire ED key (optional → read-only)\n public connection: Connection;\n public anchor: AnchorProvider;\n\n public depositClient: DepositClient;\n public distributionClient: DistributionClient;\n public leaderboardClient: LeaderboardClient;\n public outpostClient: OutpostClient;\n public tokenClient: TokenClient;\n\n get solPubKey(): SolPubKey {\n if (!this.pubKey) throw new Error('pubKey is undefined');\n return new SolPubKey(this.pubKey.data.array);\n }\n\n get network(): ExternalNetwork {\n return this.config.network;\n }\n\n constructor(private config: StakerConfig) {\n const adapter = config.provider as BaseSignerWalletAdapter | undefined;\n\n if (!config.network.rpcUrls.length) {\n throw new Error('No RPC URLs provided');\n }\n\n // -------------------------------------------------------------\n // Resolve Solana wallet pubkey (or dummy in read-only mode)\n // -------------------------------------------------------------\n let solWalletPubkey: SolPubKey;\n if (adapter?.publicKey) {\n solWalletPubkey = adapter.publicKey;\n } else {\n // Zeroed pubkey when no wallet (read-only usage)\n solWalletPubkey = new SolPubKey(new Uint8Array(32));\n }\n\n // -------------------------------------------------------------\n // Resolve Wire pubKey\n // -------------------------------------------------------------\n if (config.pubKey) {\n const wirePub = config.pubKey;\n\n if (adapter?.publicKey) {\n const derived = new PublicKey(\n KeyType.ED,\n adapter.publicKey.toBytes(),\n );\n if (!derived.equals(wirePub)) {\n throw new Error(\n \"Passed-in pubKey doesn't match adapter.publicKey\",\n );\n }\n }\n\n this.pubKey = wirePub;\n } else if (adapter?.publicKey) {\n // Derive Wire pubKey from adapter when not explicitly passed\n this.pubKey = new PublicKey(\n KeyType.ED,\n adapter.publicKey.toBytes(),\n );\n }\n\n // -------------------------------------------------------------\n // Connection + AnchorProvider\n // -------------------------------------------------------------\n const opts: ConnectionConfig = { commitment };\n if (\n config.network.rpcUrls.length > 1 &&\n config.network.rpcUrls[1].startsWith('ws')\n ) {\n opts.wsEndpoint = config.network.rpcUrls[1];\n }\n\n const anchorWallet = adapter\n ? {\n publicKey: solWalletPubkey,\n async signTransaction<T extends SolanaTransaction>(\n tx: T,\n ): Promise<T> {\n return adapter.signTransaction(tx);\n },\n async signAllTransactions<T extends SolanaTransaction>(\n txs: T[],\n ): Promise<T[]> {\n if (adapter.signAllTransactions) {\n return adapter.signAllTransactions(txs);\n }\n return Promise.all(\n txs.map((tx) => adapter.signTransaction(tx)),\n );\n },\n }\n : {\n publicKey: solWalletPubkey,\n async signTransaction<T extends SolanaTransaction>(\n _tx: T,\n ): Promise<T> {\n throw new Error(\n 'Wallet not connected: signTransaction not available',\n );\n },\n async signAllTransactions<T extends SolanaTransaction>(\n _txs: T[],\n ): Promise<T[]> {\n throw new Error(\n 'Wallet not connected: signAllTransactions not available',\n );\n },\n };\n\n this.connection = new Connection(config.network.rpcUrls[0], opts);\n this.anchor = new AnchorProvider(this.connection, anchorWallet, {\n commitment,\n });\n\n this.depositClient = new DepositClient(this.anchor);\n this.distributionClient = new DistributionClient(this.anchor);\n this.leaderboardClient = new LeaderboardClient(this.anchor);\n this.outpostClient = new OutpostClient(this.anchor);\n this.tokenClient = new TokenClient(this.anchor);\n }\n\n // ---------------------------------------------------------------------\n // IStakingClient core methods\n // ---------------------------------------------------------------------\n\n /**\n * Deposit native SOL into liqSOL (liqsol_core::deposit).\n * Handles tx build, sign, send, and confirmation.\n */\n async deposit(amountLamports: bigint): Promise<string> {\n this.ensureUser();\n if (amountLamports <= BigInt(0)) {\n throw new Error('Deposit amount must be greater than zero.');\n }\n\n const tx = await this.depositClient.buildDepositTx(amountLamports);\n const { tx: prepared, blockhash, lastValidBlockHeight } =\n await this.prepareTx(tx);\n const signed = await this.signTransaction(prepared);\n return await this.sendAndConfirmHttp(signed, {\n blockhash,\n lastValidBlockHeight,\n });\n }\n\n /**\n * Request a withdraw from liqSOL to SOL (liqsol_core::requestWithdraw).\n *\n * This:\n * - burns liqSOL from the user ATA\n * - mints an NFT withdrawal receipt\n * - increases totalEncumberedFunds in global state\n *\n * Actual SOL payout happens later via the operator-side flow.\n */\n async withdraw(amountLamports: bigint): Promise<string> {\n this.ensureUser();\n if (amountLamports <= BigInt(0)) {\n throw new Error('Withdraw amount must be greater than zero.');\n }\n\n const tx = await this.depositClient.buildWithdrawTx(amountLamports);\n const { tx: prepared, blockhash, lastValidBlockHeight } =\n await this.prepareTx(tx);\n const signed = await this.signTransaction(prepared);\n return await this.sendAndConfirmHttp(signed, {\n blockhash,\n lastValidBlockHeight,\n });\n }\n\n /**\n * Stake liqSOL into Outpost (liqSOL → pool) via liqsol_core::synd.\n */\n async stake(amountLamports: bigint): Promise<string> {\n this.ensureUser();\n\n if (!amountLamports || amountLamports <= BigInt(0)) {\n throw new Error('Stake amount must be greater than zero.');\n }\n\n const user = this.solPubKey;\n\n // Build the Outpost synd instruction\n const ix = await this.outpostClient.buildStakeIx(amountLamports, user);\n\n // Wrap in a transaction and send\n const tx = new Transaction().add(ix);\n const prepared = await this.prepareTx(tx);\n const signed = await this.signTransaction(prepared.tx);\n\n return this.sendAndConfirmHttp(signed, prepared);\n }\n\n /**\n * Unstake liqSOL from Outpost (pool → liqSOL) via liqsol_core::desynd.\n */\n async unstake(amountLamports: bigint): Promise<string> {\n this.ensureUser();\n\n if (!amountLamports || amountLamports <= BigInt(0)) {\n throw new Error('Unstake amount must be greater than zero.');\n }\n\n const user = this.solPubKey;\n\n // Build the Outpost desynd instruction\n const ix = await this.outpostClient.buildUnstakeIx(amountLamports, user);\n\n // Wrap in a transaction and send\n const tx = new Transaction().add(ix);\n const prepared = await this.prepareTx(tx);\n const signed = await this.signTransaction(prepared.tx);\n\n return this.sendAndConfirmHttp(signed, prepared);\n }\n\n /**\n * Buy prelaunch WIRE “pretokens” using liqSOL.\n *\n * This delegates to TokenClient, which uses the `purchase`-style\n * instruction under the new IDL (no more native-SOL purchase).\n */\n async buy(amountLamports: bigint): Promise<string> {\n this.ensureUser();\n if (!amountLamports || amountLamports <= BigInt(0)) {\n throw new Error('liqSOL pretoken purchase requires a positive amount.');\n }\n\n const user = this.solPubKey;\n const cuIx = ComputeBudgetProgram.setComputeUnitLimit({ units: 400_000 });\n const ix = await this.tokenClient.buildPurchaseIx(amountLamports, user);\n const tx = new Transaction().add(cuIx, ix);\n const { tx: prepared, blockhash, lastValidBlockHeight } =\n await this.prepareTx(tx);\n const signed = await this.signTransaction(prepared);\n return await this.sendAndConfirmHttp(signed, {\n blockhash,\n lastValidBlockHeight,\n });\n }\n\n /**\n * Aggregate view of the user’s balances on Solana:\n * - native: SOL wallet balance\n * - liq: liqSOL token balance (Token-2022 ATA)\n * - staked: liqSOL staked in Outpost (synd/desynd) → outpostAccount.stakedLiqsol\n * - wire: total WIRE pretokens purchased (1e8 scale)\n * - yield: on-chain index/shares plus an estimated accrued liqSOL yield\n * - extras: useful internal addresses and raw state for debugging/UX\n */\n async getPortfolio(): Promise<Portfolio> {\n if (!this.pubKey) throw new Error('User pubKey is undefined');\n\n const user = this.solPubKey;\n\n const reservePoolPDA = deriveReservePoolPda();\n const vaultPDA = deriveVaultPda();\n const liqsolMint = deriveLiqsolMintPda();\n\n const userLiqsolAta = getAssociatedTokenAddressSync(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n // NOTE:\n // - nativeLamports: wallet SOL\n // - actualBalResp: liqSOL balance in user ATA\n // - snapshot: Outpost + pretokens + global index/shares\n const [nativeLamports, actualBalResp, snapshot] = await Promise.all([\n this.connection.getBalance(user, 'confirmed'),\n this.connection\n .getTokenAccountBalance(userLiqsolAta, 'confirmed')\n .catch(() => null),\n this.outpostClient.fetchWireState(user).catch(() => null),\n ]);\n\n const LIQSOL_DECIMALS = 9;\n\n const actualAmountStr = actualBalResp?.value?.amount ?? '0';\n\n const globalState = snapshot?.globalState ?? null;\n const outpostAccount = snapshot?.outpostAccount ?? null;\n const trancheState = snapshot?.trancheState ?? null;\n const userPretokenRecord = snapshot?.userPretokenRecord ?? null;\n\n // -----------------------------\n // Staked liqSOL (Outpost)\n // -----------------------------\n // This is the liqSOL that has been syndicated into Outpost via `synd`.\n // It lives on the outpost account as `stakedLiqsol`.\n const stakedLiqsolStr =\n outpostAccount?.stakedLiqsol?.toString?.() ?? '0';\n\n // -----------------------------\n // WIRE pretokens (1e8 scale)\n // -----------------------------\n // This is NOT stake — it’s the prelaunch WIRE position.\n const wirePretokensStr =\n userPretokenRecord?.totalPretokensPurchased?.toString?.() ??\n '0';\n\n // -----------------------------\n // Yield view (index + shares)\n // -----------------------------\n // We expose:\n // - currentIndex: globalState.currentIndex (1e12 scale)\n // - totalShares: globalState.totalShares\n // - userShares: outpostAccount.stakedShares\n // - estimatedClaimLiqsol: floor(userShares * index / INDEX_SCALE)\n // - estimatedYieldLiqsol: max(0, estimatedClaim - stakedLiqsol)\n //\n // This matches the capital-staking math:\n // sharesToTokens(shares, index) = shares * index / INDEX_SCALE\n const currentIndexStr =\n globalState?.currentIndex?.toString?.() ?? '0';\n const totalSharesStr =\n globalState?.totalShares?.toString?.() ?? '0';\n const userSharesStr =\n outpostAccount?.stakedShares?.toString?.() ?? '0';\n\n const stakedLiqsol = BigInt(stakedLiqsolStr);\n const currentIndex = BigInt(currentIndexStr);\n const totalShares = BigInt(totalSharesStr);\n const userShares = BigInt(userSharesStr);\n\n let estimatedClaimLiqsol = BigInt(0);\n let estimatedYieldLiqsol = BigInt(0);\n\n if (userShares > BigInt(0) && currentIndex > BigInt(0)) {\n // sharesToTokens(userShares, currentIndex)\n estimatedClaimLiqsol = (userShares * currentIndex) / INDEX_SCALE;\n\n if (estimatedClaimLiqsol > stakedLiqsol) {\n estimatedYieldLiqsol = estimatedClaimLiqsol - stakedLiqsol;\n }\n }\n\n return {\n native: {\n amount: BigInt(nativeLamports),\n symbol: 'SOL',\n decimals: 9,\n },\n liq: {\n amount: BigInt(actualAmountStr),\n symbol: 'LiqSOL',\n decimals: LIQSOL_DECIMALS,\n ata: userLiqsolAta,\n },\n staked: {\n // liqSOL staked in Outpost via `synd`\n amount: stakedLiqsol,\n symbol: 'LiqSOL',\n decimals: LIQSOL_DECIMALS,\n },\n wire: {\n // Prelaunch WIRE pretokens (1e8 scale)\n amount: BigInt(wirePretokensStr),\n symbol: '$WIRE',\n decimals: 8,\n },\n yield: {\n // Raw primitives so the frontend can display curves, charts, etc.\n currentIndex,\n indexScale: INDEX_SCALE,\n totalShares,\n userShares,\n // liqSOL amounts (lamports) implied by index/shares\n estimatedClaimLiqsol,\n estimatedYieldLiqsol,\n },\n extras: {\n userLiqsolAta: userLiqsolAta.toBase58(),\n reservePoolPDA: reservePoolPDA.toBase58(),\n vaultPDA: vaultPDA.toBase58(),\n globalIndex: globalState?.currentIndex?.toString(),\n totalShares: globalState?.totalShares?.toString(),\n currentTrancheNumber:\n trancheState?.currentTrancheNumber?.toString(),\n currentTranchePriceUsd:\n trancheState?.currentTranchePriceUsd?.toString(), // 1e8 USD\n },\n chainID: this.network.chainId,\n };\n }\n\n /**\n * Convenience helper to fetch the distribution userRecord for the current user.\n * Used by balance-correction flows and debugging.\n */\n async getUserRecord() {\n if (!this.pubKey) throw new Error('User pubKey is undefined');\n return this.distributionClient.getUserRecord(this.solPubKey);\n }\n\n \n // ---------------------------------------------------------------------\n // READ-ONLY Public Methods\n // ---------------------------------------------------------------------\n\n // Estimated total APY for staking yeild\n getSystemAPY(): Promise<number> {\n // TODO\n return Promise.resolve(0);\n }\n\n // Protocol fee charged for deposit from Native to LIQ\n getDepositFee(amount: bigint): Promise<bigint> {\n // TODO\n return Promise.resolve(BigInt(0));\n }\n\n /**\n * Unified, chain-agnostic tranche snapshot for Solana.\n *\n * Uses:\n * - liqsol_core.globalState (currentIndex, totalShares, etc.)\n * - liqsol_core.trancheState (price, supply, total sold, etc.)\n * - PriceHistory/Chainlink SOL/USD via TokenClient.getSolPriceUsdSafe()\n *\n * This is READ-ONLY and works even with no connected wallet.\n */\n async getTrancheSnapshot(options?: {\n chainID?: ChainID;\n windowBefore?: number;\n windowAfter?: number;\n }): Promise<TrancheSnapshot> {\n const {\n chainID = SolChainID.WireTestnet,\n windowBefore,\n windowAfter,\n } = options ?? {};\n\n const [globalState, trancheState] = await Promise.all([\n this.tokenClient.fetchGlobalState(),\n this.tokenClient.fetchTrancheState(),\n ]);\n\n const { price: solPriceUsd, timestamp } =\n await this.tokenClient.getSolPriceUsdSafe();\n\n return buildSolanaTrancheSnapshot({\n chainID,\n globalState,\n trancheState,\n solPriceUsd,\n nativePriceTimestamp: timestamp,\n ladderWindowBefore: windowBefore,\n ladderWindowAfter: windowAfter,\n });\n }\n\n // ---------------------------------------------------------------------\n // Tx helpers\n // ---------------------------------------------------------------------\n\n /**\n * Send a signed transaction over HTTP RPC and wait for confirmation.\n * Throws if the transaction fails.\n */\n private async sendAndConfirmHttp(\n signed: SolanaTransaction,\n ctx: { blockhash: string; lastValidBlockHeight: number },\n ): Promise<string> {\n this.ensureUser();\n\n const signature = await this.connection.sendRawTransaction(\n signed.serialize(),\n {\n skipPreflight: false,\n preflightCommitment: commitment,\n maxRetries: 3,\n },\n );\n\n const conf = await this.connection.confirmTransaction(\n {\n signature,\n blockhash: ctx.blockhash,\n lastValidBlockHeight: ctx.lastValidBlockHeight,\n },\n commitment,\n );\n\n if (conf.value.err) {\n throw new Error(\n `Transaction failed: ${JSON.stringify(conf.value.err)}`,\n );\n }\n\n return signature;\n }\n\n /**\n * Sign a single Solana transaction using the connected wallet adapter.\n */\n async signTransaction(\n tx: SolanaTransaction,\n ): Promise<SolanaTransaction> {\n this.ensureUser();\n return this.anchor.wallet.signTransaction(tx);\n }\n\n /**\n * Generic \"fire and forget\" send helper if the caller already\n * prepared and signed the transaction.\n */\n async sendTransaction(\n signed: SolanaTransaction,\n ): Promise<TransactionSignature> {\n this.ensureUser();\n return this.anchor.sendAndConfirm(signed);\n }\n\n /**\n * Attach recent blockhash + fee payer to a transaction.\n * Required before signing and sending.\n */\n async prepareTx(\n tx: Transaction,\n ): Promise<{\n tx: Transaction;\n blockhash: string;\n lastValidBlockHeight: number;\n }> {\n const { blockhash, lastValidBlockHeight } =\n await this.connection.getLatestBlockhash('confirmed');\n tx.recentBlockhash = blockhash;\n tx.feePayer = this.solPubKey;\n return { tx, blockhash, lastValidBlockHeight };\n }\n\n /**\n * Guard for all write operations (deposit/withdraw/stake/unstake/buy).\n * Ensures we have a Wire pubKey and an Anchor wallet pubKey, and that they match.\n */\n ensureUser() {\n if (!this.pubKey || !this.anchor.wallet.publicKey) {\n throw new Error('User Authorization required: pubKey is undefined');\n }\n if (\n this.solPubKey.toBase58() !==\n this.anchor.wallet.publicKey.toBase58()\n ) {\n throw new Error(\n 'Write access requires connected wallet to match pubKey',\n );\n }\n }\n}","/**\n * @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 StakingModuleArtifact from '../../assets/ethereum/ABI/liqEth/stakingModule.sol/StakingModule.json';\nimport WithdrawalQueueArtifact from '../../assets/ethereum/ABI/liqEth/withdrawalQueue.sol/WithdrawalQueue.json';\nimport WithdrawalVaultArtifact from '../../assets/ethereum/ABI/liqEth/withdrawalVault.sol/WithdrawalVault.json';\n\n// Outpost Artifacts\nimport DepositorArtifact from '../../assets/ethereum/ABI/outpost/Depositor.sol/Depositor.json';\nimport ReceiptNFTArtifact from '../../assets/ethereum/ABI/outpost/ReceiptNFT.sol/ReceiptNFT.json';\nimport OutpostManagerArtifact from '../../assets/ethereum/ABI/outpost/OutpostManager.sol/OutpostManager.json';\nimport BARArtifact from '../../assets/ethereum/ABI/outpost/BAR.sol/BAR.json';\nimport OPPArtifact from '../../assets/ethereum/ABI/outpost/OPP.sol/OPP.json';\nimport OPPCommonArtifact from '../../assets/ethereum/ABI/outpost/OPPCommon.sol/OPPCommon.json';\nimport OPPInboundArtifact from '../../assets/ethereum/ABI/outpost/OPPInbound.sol/OPPInbound.json';\nimport PretokenArtifact from '../../assets/ethereum/ABI/outpost/Pretoken.sol/Pretoken.json';\nimport AggregatorArtifact from '../../assets/ethereum/ABI/outpost/Aggregator.sol/Aggregator.json';\nimport EthUsdPriceConsumerArtifact from '../../assets/ethereum/ABI/outpost/EthUsdPriceConsumer.sol/EthUsdPriceConsumer.json';\nimport PoolArtifact from '../../assets/ethereum/ABI/outpost/Pool.sol/Pool.json';\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 // LiqETH contracts\n Accounting: \"0xd333A03a44D5d602A98c1B7bcd7ED1f042DD0dEd\",\n DepositManager: \"0x601eaA31e8d33D8725786f1733f4cE6cCEf740D4\",\n LiqEth: \"0x08252e1Dcbaa86A2887927b02536CD3E67a802c8\", // AKA LiqEthToken\n StakingModule: \"0x7Aac2fCfc83d7F2f15eA53a10C1677CA377AFcF4\",\n WithdrawalQueue: \"0x951E413FC81a2CE133078ABE8B88677F5296abE7\",\n WithdrawalVault: \"0x0D2bf834DD560839e986d42D06DeE268A17c2d13\",\n\n //Outpost contracts\n Depositor: \"0x69Aa53Ef02F124dB421AeDda509d6912341299Cc\",\n ReceiptNFT: \"0x13588fF41E2f47D047874162B1eD15AaF6818f5a\",\n OutpostManager: \"0x187f4fEDBCAD2f3150120B743b5d568F11dD3452\",\n BAR: \"0x27d4646abF638A13934c94f8bA9AC1Bda39F5dbb\",\n OPP: \"0x79CA2DE915C294593edc16b32CBA8B7866159205\",\n OPPCommon: \"0x8392ea945Cd8C03F5241d4964D20BB5A9c320c71\",\n OPPInbound: \"0xfDA9A2C7e395a9722d9fa506f5d67aba823298dd\",\n Pretoken: \"0xcf6A1209A7A391cc576174204386F4e5462323dC\",\n EthUsdPriceConsumer: \"0x1Ef180FF49313fCB8B5c0470268295d0d24CDE69\",\n Aggregator: \"0xFCfc3ddd4CBd9Ad3b3af3A374B8bdA1b66eE6FFF\",\n Pool: \"0x29DEf0fA009e02d108d9505018EAe0168F233e03\",\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 StakingModule: {\n address: ADDRESSES.StakingModule,\n abi: StakingModuleArtifact.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\n // Outpost Contracts\n Depositor: {\n address: ADDRESSES.Depositor,\n abi: DepositorArtifact.abi as JsonFragment[],\n },\n ReceiptNFT: {\n address: ADDRESSES.ReceiptNFT,\n abi: ReceiptNFTArtifact.abi as JsonFragment[],\n },\n OutpostManager: {\n address: ADDRESSES.OutpostManager,\n abi: OutpostManagerArtifact.abi as JsonFragment[],\n },\n BAR: {\n address: ADDRESSES.BAR,\n abi: BARArtifact.abi as JsonFragment[],\n },\n OPP: {\n address: ADDRESSES.OPP,\n abi: OPPArtifact.abi as JsonFragment[],\n },\n OPPCommon: {\n address: ADDRESSES.OPPCommon,\n abi: OPPCommonArtifact.abi as JsonFragment[],\n },\n OPPInbound: {\n address: ADDRESSES.OPPInbound,\n abi: OPPInboundArtifact.abi as JsonFragment[],\n },\n Pretoken: {\n address: ADDRESSES.Pretoken,\n abi: PretokenArtifact.abi as JsonFragment[],\n },\n Aggregator: {\n address: ADDRESSES.Aggregator,\n abi: AggregatorArtifact.abi as JsonFragment[],\n },\n EthUsdPriceConsumer: {\n address: ADDRESSES.EthUsdPriceConsumer,\n abi: EthUsdPriceConsumerArtifact.abi as JsonFragment[],\n },\n Pool: {\n address: ADDRESSES.Pool,\n abi: PoolArtifact.abi as JsonFragment[],\n }\n};\n\nexport interface ContractOptions {\n /** RPC endpoint or injected EIP-1193 provider */\n provider?: ethers.providers.Provider;\n /** Only required if you need to send txns */\n signer?: Signer;\n}\n\nexport class EthereumContractService {\n private provider?: providers.Provider;\n private signer?: Signer;\n\n public readonly contract: { [N in ContractName]: ethers.Contract } = {} as any;\n public readonly iface: { [N in ContractName]: ethers.utils.Interface } = {} as any;\n\n constructor(opts: ContractOptions) {\n this.provider = opts.provider;\n this.signer = opts.signer;\n\n (Object.keys(CONTRACTS) as ContractName[]).forEach((name) => {\n const { address, abi } = CONTRACTS[name];\n this.iface[name] = new ethers.utils.Interface(abi);\n this.contract[name] = new ethers.Contract(\n address,\n abi,\n this.signer ?? this.provider\n );\n });\n }\n\n /** Get raw address for a contract */\n public getAddress(name: ContractName): string {\n return CONTRACTS[name].address;\n }\n\n /** Utility: get a read-only handle even if signer is present */\n public getReadOnly(name: ContractName): Contract {\n const { address, abi } = CONTRACTS[name];\n return new Contract(address, abi, this.provider);\n }\n\n /** Utility: get a write-enabled handle (throws if no signer) */\n public getWrite(name: ContractName): Contract {\n if (!this.signer) throw new Error('No signer available for write calls');\n const { address, abi } = CONTRACTS[name];\n return new Contract(address, abi, this.signer);\n }\n\n /** Expose network info */\n async getNetwork() {\n return this.provider?.getNetwork();\n }\n\n /** List all known contract names */\n public listContractNames(): ContractName[] {\n return Object.keys(CONTRACTS) as ContractName[];\n }\n\n /** Get Interface instance for a contract */\n public getInterface(name: ContractName): ethers.utils.Interface {\n const iface = this.iface[name];\n if (!iface) throw new Error(`Interface not initialized for ${name}`);\n return iface;\n }\n\n /** Get live Contract instance */\n public getContract(name: ContractName): ethers.Contract {\n const ctr = this.contract[name];\n if (!ctr) throw new Error(`Contract not initialized for ${name}`);\n return ctr;\n }\n\n /** A unified Interface containing all ABIs to parse custom errors or events. */\n public get omniInterface(): ethers.utils.Interface {\n const all: any[] = [];\n\n const allArtifacts = [\n ERC20Artifact,\n ERC721Artifact,\n ERC1155Artifact,\n\n // liqETH suite\n AccountingArtifact,\n DepositManagerArtifact,\n LiqEthArtifact,\n // LiqEthBurnArtifact,\n // LiqEthMintArtifact,\n // RewardsERC20Artifact,\n StakingModuleArtifact,\n // ValidatorBalanceArtifact,\n WithdrawalQueueArtifact,\n WithdrawalVaultArtifact,\n // YieldArtifact,\n ];\n\n allArtifacts.forEach(artifact => {\n if (artifact && artifact.abi) {\n all.push(...artifact.abi);\n }\n });\n\n const seen = new Set<string>();\n const dedup: any[] = [];\n for (const item of all) {\n try {\n const frag = ethers.utils.Fragment.from(item);\n const key = `${frag.type}:${frag.format(ethers.utils.FormatTypes.full)}`.toLowerCase();\n if (!seen.has(key)) {\n seen.add(key);\n dedup.push(item);\n }\n } catch {\n // ignore bad fragments\n }\n }\n\n return new ethers.utils.Interface(dedup);\n }\n\n /** Decode a revert or custom error payload */\n public parseError(revertData: string): ErrorDescription {\n try {\n return this.omniInterface.parseError(revertData);\n } catch {\n throw new Error(`Unable to parse error data: ${revertData}`);\n }\n }\n}","\nimport { ethers } from \"ethers\";\nimport { TrancheLadderItem, TrancheSnapshot } from \"../../types\";\nimport { ChainID } from \"@wireio/core\";\n\n\nconst BPS = BigInt(10_000);\n\nexport interface CustomContractError {\n name?: string;\n signature?: string;\n args?: any[];\n data?: any;\n method?: string;\n code?: any;\n raw: string;\n}\n\n\n\nexport function formatContractErrors(err: any): CustomContractError {\n // Extract custom error details if present\n if (err.errorName && err.errorArgs) {\n const errorObj: CustomContractError = {\n name: err.errorName,\n signature: err.errorSignature,\n args: err.errorArgs.map((arg: any) =>\n arg && arg._isBigNumber ? ethers.BigNumber.from(arg).toString() : arg\n ),\n data: err.data,\n method: err.method,\n code: err.code,\n raw: err,\n };\n console.error(\"Custom contract error:\", errorObj);\n return errorObj;\n } else {\n console.error(\"Contract Error:\", err);\n return {\n raw: typeof err === 'string' ? err : (err?.message || String(err))\n };\n }\n}\n\n\n\n/**\n * Finalize an OPP epoch. Optionally accept a gasLimit override (ethers BigNumberish).\n * If gasLimit is not provided, the method will attempt estimateGas.finalizeEpoch()\n * and pad it (1.2x). If estimateGas fails, a conservative fallback is used.\n */\nexport async function sendOPPFinalize(opp: ethers.Contract, gasLimit?: ethers.BigNumberish) {\n const overrides: any = {};\n try {\n if (gasLimit === undefined) {\n try {\n const estimated = await opp.estimateGas.finalizeEpoch();\n const padded = ethers.BigNumber.from(estimated).mul(12).div(10); // 1.2x\n overrides.gasLimit = padded;\n console.log('sendFinalize: estimated gas', estimated.toString(), 'padded to', overrides.gasLimit.toString());\n } catch (estErr) {\n // estimateGas can throw UNPREDICTABLE_GAS_LIMIT; fall back to a safe default\n console.warn('sendFinalize: estimateGas.finalizeEpoch() failed, falling back to hardcoded gasLimit', estErr);\n overrides.gasLimit = ethers.BigNumber.from(8000000);\n }\n } else {\n overrides.gasLimit = ethers.BigNumber.from(gasLimit);\n console.log('sendFinalize: using provided gasLimit override', overrides.gasLimit.toString());\n }\n\n const tx = await opp.finalizeEpoch(overrides); // submit tx with overrides\n console.log('sendFinalize tx hash:', tx.hash, 'overrides:', overrides);\n\n const receipt = await tx.wait(); // wait for mined\n console.log('sendFinalize tx mined, block:', receipt.blockNumber);\n return receipt;\n } catch (err: any) {\n // Verbose error logging to help debugging reverts / provider issues\n console.error('sendFinalize() failed:', err?.message || err);\n\n // Try to extract common raw payload locations used by ethers errors\n const raw = err?.error?.data || err?.data || err?.body || err?.receipt || err?.transaction || err;\n console.error('sendFinalize raw payload:', raw);\n\n // Try parsing with contractService if available\n try {\n const parsed = formatContractErrors(raw);\n console.error('sendFinalize parsed error:', parsed.name, parsed.args);\n } catch (parseErr) {\n // Fallback: decode Error(string) ABI encoded revert (0x08c379a0)\n try {\n const hex = (typeof raw === 'string') ? raw : (raw && raw.data) ? raw.data : null;\n if (hex && typeof hex === 'string' && hex.startsWith('0x08c379a0')) {\n const reason = ethers.utils.defaultAbiCoder.decode(['string'], '0x' + hex.slice(10))[0];\n console.error('sendFinalize revert reason:', reason);\n } else {\n console.error('sendFinalize: unable to decode revert payload (not standard Error(string))');\n }\n } catch (fallbackErr) {\n console.error('sendFinalize: fallback decode failed:', fallbackErr);\n }\n }\n\n // If there is a receipt, print it for extra context\n if (err?.receipt) console.error('sendFinalize receipt:', err.receipt);\n if (err?.transaction) console.error('sendFinalize transaction object:', err.transaction);\n\n // Re-throw so callers can handle it as well\n throw err;\n }\n}\n\n\n\n/**\n * Apply one forward growth step: value * (BPS + growthBps) / BPS.\n * Simple integer round-half-up.\n */\nfunction growOnce(value: bigint, growthBps: number): bigint {\n const g = BigInt(growthBps);\n return (value * (BPS + g) + BPS / BigInt(2)) / BPS;\n}\n\n\n/**\n * Apply one backward step: value * BPS / (BPS + growthBps).\n * Also integer round-half-up.\n */\nfunction shrinkOnce(value: bigint, growthBps: number): bigint {\n const g = BigInt(growthBps);\n return (value * BPS + (BPS + g) / BigInt(2)) / (BPS + g);\n}\n\n\n/**\n * Calculate the full supply for a given tranche using BigInt math.\n * trancheNumber is 1-based (tranche 1 = startSupply)\n */\nfunction getTrancheSize(startSupply: bigint, supplyGrowthBps: number, trancheNumber: number): bigint {\n let supply = startSupply;\n for (let i = 0; i < trancheNumber; i++) {\n supply = (supply * (BPS + BigInt(supplyGrowthBps)) + BPS / BigInt(2)) / BPS;\n }\n return supply;\n}\n\n\n/**\n * Build a local tranche ladder around the current tranche\n * using only on-chain config + current state.\n *\n */\nexport function buildEthereumTrancheLadder(options: {\n currentTranche: number;\n totalTrancheSupply: bigint,\n initialTrancheSupply: bigint;\n currentTrancheSupply: bigint;\n currentPriceUsd: bigint;\n supplyGrowthBps: number;\n priceGrowthBps: number;\n windowBefore?: number;\n windowAfter?: number;\n}): TrancheLadderItem[] {\n const {\n currentTranche,\n initialTrancheSupply,\n currentTrancheSupply,\n currentPriceUsd,\n supplyGrowthBps,\n priceGrowthBps,\n windowBefore = 5,\n windowAfter = 5,\n } = options;\n\n const startId = Math.max(0, currentTranche - windowBefore);\n const endId = currentTranche + windowAfter;\n \n //calculate total tranche size (e.g. 60,600 on tranche 2)\n const currentTrancheSize = getTrancheSize(initialTrancheSupply, supplyGrowthBps, currentTranche);\n\n const capacity = new Map<number, bigint>();\n const price = new Map<number, bigint>();\n\n // Seed current\n capacity.set(currentTranche, currentTrancheSize);\n price.set(currentTranche, currentPriceUsd);\n\n // Forward (future tranches)\n for (let id = currentTranche + 1; id <= endId; id++) {\n const prevCap = capacity.get(id - 1)!;\n const prevPrice = price.get(id - 1)!;\n capacity.set(id, growOnce(prevCap, supplyGrowthBps));\n price.set(id, growOnce(prevPrice, priceGrowthBps));\n }\n\n // Backward (past tranches)\n for (let id = currentTranche - 1; id >= startId; id--) {\n const nextCap = capacity.get(id + 1)!;\n const nextPrice = price.get(id + 1)!;\n capacity.set(id, shrinkOnce(nextCap, supplyGrowthBps));\n price.set(id, shrinkOnce(nextPrice, priceGrowthBps));\n }\n\n const ladder: TrancheLadderItem[] = [];\n for (let id = startId; id <= endId; id++) {\n const cap = capacity.get(id)!;\n let sold: bigint;\n if (id < currentTranche) {\n sold = cap;\n } else if (id === currentTranche) {\n sold = cap - currentTrancheSupply;\n } else {\n sold = BigInt(0);\n }\n\n ladder.push({\n id,\n capacity: cap,\n sold,\n remaining: cap - sold,\n priceUsd: price.get(id)!,\n });\n }\n\n return ladder;\n}\n\n\n/**\n * Turn raw liqsol_core accounts into a chain-agnostic TrancheSnapshot for SOL.\n * All math stays here; TokenClient just wires accounts + connection.\n */\nexport async function buildEthereumTrancheSnapshot(options: {\n chainID: ChainID;\n totalSharesBn;\n indexBn;\n trancheNumberBn;\n currentTrancheSupply;\n tranchePriceWadBn;\n totalTrancheSupply;\n initialTrancheSupply;\n supplyGrowthBps;\n priceGrowthBps;\n minPriceUsd;\n maxPriceUsd;\n\n ethPriceUsd?: bigint;\n nativePriceTimestamp?: number;\n ladderWindowBefore?: number;\n ladderWindowAfter?: number;\n}): Promise<TrancheSnapshot> {\n const {\n chainID,\n ethPriceUsd,\n nativePriceTimestamp,\n ladderWindowBefore,\n ladderWindowAfter,\n\n totalSharesBn, \n indexBn, \n trancheNumberBn, \n currentTrancheSupply, \n tranchePriceWadBn, \n totalTrancheSupply,\n initialTrancheSupply,\n supplyGrowthBps,\n priceGrowthBps,\n minPriceUsd, \n maxPriceUsd,\n } = options;\n\n\n // convert default BigNumber to bigint for hub to handle, and partially convert from 1e18 to 1e8 for the hub\n const totalShares = BigInt(totalSharesBn.toString()) / BigInt(1e10);\n const currentIndex = BigInt(indexBn.toString()); // RAY (1e27)\n const currentTranche = Number(trancheNumberBn.toString());\n const currentPriceUsd = BigInt(tranchePriceWadBn.toString()) / BigInt(1e10); // 1e18 WAD\n\n\n const ladder = buildEthereumTrancheLadder({\n currentTranche,\n totalTrancheSupply,\n initialTrancheSupply,\n currentTrancheSupply,\n currentPriceUsd,\n supplyGrowthBps,\n priceGrowthBps,\n windowBefore: ladderWindowBefore,\n windowAfter: ladderWindowAfter,\n });\n\n\n return {\n chainID,\n currentIndex,\n totalShares,\n currentTranche,\n currentPriceUsd,\n supplyGrowthBps,\n priceGrowthBps,\n currentTrancheSupply,\n initialTrancheSupply,\n totalPretokensSold: totalTrancheSupply,\n nativePriceUsd: ethPriceUsd,\n nativePriceTimestamp,\n ladder,\n };\n}\n","import { BigNumber, ethers } from \"ethers\";\nimport { DepositEvent, DepositResult, SharesBurnedEvent } from \"../types\";\nimport { EthereumContractService } from \"../contract\";\nimport { formatContractErrors } from \"../utils\";\n\nexport class ConvertClient {\n\n private readonly contractService: EthereumContractService;\n \n get contract() { return this.contractService.contract; }\n\n constructor(contract: EthereumContractService) {\n this.contractService = contract;\n }\n \n\n /**\n * Simulate a deposit via callStatic.\n *\n * Useful for pre-flight checks; will throw with the same revert\n * reason as a real tx if it would fail.\n */\n async simulateDeposit(amount: number | string | bigint | BigNumber): Promise<void> {\n const amountWei = BigNumber.isBigNumber(amount)\n ? amount\n : BigNumber.from(amount);\n\n // callStatic executes the function locally without sending a tx.\n // deposit() doesn't return anything, so we only care if it reverts.\n await this.contract.DepositManager.callStatic.deposit({\n value: amountWei,\n });\n }\n\n\n\n /**\n * \n * @param amountWei an amount of WEI to deposit in exchange for liqETH\n * @returns the hash of the transaction\n */\n async performDeposit(amountWei: BigNumber): Promise<DepositResult> {\n // Pre-check minDeposit\n const minDeposit: BigNumber = await this.contract.DepositManager.minDeposit();\n if (amountWei.lt(minDeposit)) {\n console.warn('less than min deposit');\n throw new Error(\n `Deposit amount below minDeposit: ` +\n `amount=${ethers.utils.formatEther(amountWei)} ETH, ` +\n `min=${ethers.utils.formatEther(minDeposit)} ETH`\n );\n }\n\n let tx, receipt;\n try {\n tx = await this.contract.DepositManager.deposit({ value: amountWei });\n receipt = await tx.wait(1);\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n\n\n // Parse Deposited event if present\n let deposited: DepositEvent | undefined;\n const ev = receipt.events?.find((e) => e.event === 'Deposited');\n\n if (ev && ev.args) {\n const { user, netEth, fee, shares } = ev.args;\n deposited = {\n user,\n netEth: BigNumber.from(netEth),\n fee: BigNumber.from(fee),\n shares: BigNumber.from(shares),\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n deposited,\n };\n }\n\n\n public async performWithdraw(signerAddress: string, amountWei: BigNumber): Promise<any> {\n let tx, receipt;\n try {\n tx = await this.contract.LiqEth.safeBurn(signerAddress, amountWei);\n receipt = await tx.wait(1);\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n\n // Parse SharesBurned event if present\n let event: SharesBurnedEvent | undefined;\n const ev = receipt.events?.find((e) => e.event === 'SharesBurned');\n\n if (ev && ev.args) {\n const { from, shares, tokenValue } = ev.args;\n event = {\n from,\n shares: BigNumber.from(shares),\n tokenValue: BigNumber.from(tokenValue),\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n event,\n };\n }\n\n\n \n /*\n // OLD - this was replaced with LiqEth.safeBurn() on 1/13/26\n async requestWithdraw(amountWei: BigNumber, signer: Signer, chainId: ChainID): Promise<WithdrawResult> {\n // deadline is a period of time in the future that the signature is valid for\n const deadline = Math.floor(Date.now() / 1000) + 3600;\n\n const liqEth = this.contract.LiqEth;\n const owner = await signer.getAddress();\n \n const nonce: BigNumber = await liqEth.nonces(owner);\n const domain = {\n name: await liqEth.name(),\n version: '1',\n chainId,\n verifyingContract: this.contract.LiqEth.address,\n } as any;\n\n const types = {\n Permit: [\n { name: 'owner', type: 'address' },\n { name: 'spender', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'nonce', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n ],\n } as any;\n\n const values = {\n owner,\n spender: this.contractService.getAddress('DepositManager'),\n value: amountWei,\n nonce: nonce,\n deadline,\n } as any;\n\n const signature = await (signer as any)._signTypedData(domain, types, values);\n const split = ethers.utils.splitSignature(signature);\n\n const tx = await this.contract.DepositManager.requestWithdrawal(\n amountWei,\n deadline,\n split.v,\n split.r,\n split.s\n );\n\n // wait for 1 confirmation\n const receipt = await tx.wait(1);\n\n // if WithdrawRequested event exists, parse it and get arguments\n let withdrawRequested: WithdrawRequestedEvent | undefined;\n const ev = receipt.events?.find((e) => e.event === 'WithdrawRequested');\n\n if (ev && ev.args) {\n const { user, ethAmount, nftId, readyAt } = ev.args;\n withdrawRequested = {\n user,\n ethAmount: BigNumber.from(ethAmount),\n nftId: BigNumber.from(nftId),\n readyAt: readyAt,\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n withdrawRequested,\n } as WithdrawResult;\n }\n */\n\n\n\n\n}","import { BigNumber, ethers } from \"ethers\";\nimport { StakedEvent, WithdrawnStakeEvent, WithdrawnStakeResult } from \"../types\";\nimport { EthereumContractService } from \"../contract\";\nimport { formatContractErrors } from \"../utils\";\n\nexport class StakeClient {\n\n private readonly contractService: EthereumContractService;\n \n get contract() { return this.contractService.contract; }\n\n constructor(contract: EthereumContractService) {\n this.contractService = contract;\n }\n \n\n\n /**\n * Simulate a stake via callStatic\n */\n async simulateStake(amountWei: BigNumber): Promise<void> {\n try {\n await this.contract.Depositor.callStatic.stakeLiqETH(amountWei);\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n }\n\n\n\n /**\n * \n * @param amountWei an amount of liqETH (in WEI) to stake to the Outpost\n * @returns txHash (hash of the transaction), receipt, Staked event\n */\n async performStake(amountWei: BigNumber, signerAddress: string): Promise<any> {\n const depositor = this.contract.Depositor.address;\n const liqRead = this.contract.LiqEth;\n const bal = await liqRead.balanceOf(signerAddress);\n const allowance = await liqRead.allowance(signerAddress, depositor);\n\n const paused = await this.contract.Depositor.paused();\n if(paused) {\n throw new Error(\"Error - Depositor is in a paused state\");\n }\n\n\n // if allowance is less than the requested stake amount, request permission to spend LiqEth\n if (allowance.lt(amountWei)) {\n const liqWrite = this.contractService.getWrite('LiqEth');\n\n // currently requested unlimited amount - potentially change to only request up to the current amount?\n const approveAmount = ethers.constants.MaxUint256;\n\n console.warn(`allowance insufficient (${allowance.toString()} < ${amountWei.toString()}); sending approve(${depositor}, ${approveAmount.toString()})`);\n const approveTx = await liqWrite.approve(depositor, approveAmount);\n await approveTx.wait(1);\n\n // re-read allowance to ensure approval succeeded\n const newAllowance = await liqRead.allowance(signerAddress, depositor);\n if (newAllowance.lt(amountWei)) {\n throw new Error('Approval failed or allowance still insufficient after approve');\n }\n }\n \n \n await this.simulateStake(amountWei);\n\n\n // send the tx to stake liqeth\n const tx = await this.contract.Depositor.stakeLiqETH(amountWei);\n\n // Wait for 1 confirmation \n const receipt = await tx.wait(1);\n\n // Parse Staked event if present\n let staked: StakedEvent | undefined;\n const ev = receipt.events?.find((e) => e.event === 'Staked');\n\n if (ev && ev.args) {\n const { user, amountLiq, shares, tokenId } = ev.args;\n staked = {\n user,\n amountLiq: BigNumber.from(amountLiq),\n shares: BigNumber.from(shares),\n tokenId: BigNumber.from(tokenId)\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n staked,\n };\n }\n\n\n\n /**\n * \n * @param amountWei an amount of liqETH (in WEI) to stake to the Outpost\n * @returns txHash (hash of the transaction), receipt, WithdrawnStake event\n */\n async performWithdrawStake(tokenId: BigNumber, recipient: string): Promise<WithdrawnStakeResult> {\n // Send the payable tx\n const tx = await this.contract.Depositor.withdrawStake(tokenId, recipient);\n\n // Wait for 1 confirmation \n const receipt = await tx.wait(1);\n\n // Parse Staked event if present\n let withdrawnstake: WithdrawnStakeEvent | undefined;\n const ev = receipt.events?.find((e) => e.event === 'WithdrawnStake');\n\n if (ev && ev.args) {\n const { user, tokenOut, tokenId } = ev.args;\n withdrawnstake = {\n user: user,\n tokenOut: BigNumber.from(tokenOut),\n tokenId: BigNumber.from(tokenId)\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n withdrawnstake,\n };\n }\n}","import { BigNumber, ethers } from \"ethers\";\nimport { EthereumContractService } from \"../contract\";\nimport { formatContractErrors, sendOPPFinalize } from \"../utils\";\n\nexport class PretokenClient {\n private readonly contractService: EthereumContractService;\n \n get contract() { return this.contractService.contract; }\n\n constructor(contract: EthereumContractService) {\n this.contractService = contract;\n }\n \n\n\n /**\n * Purchase pretokens by transferring liqETH into the pool (ERC-20) and calling Depositor.purchasePretokensWithLiqETH(amountLiq, buyer).\n * Returns txHash, receipt and parsed PurchasedWithLiqETH event (if present).\n */\n async purchasePretokensWithLiqETH(amountLiq: bigint, buyer: string): Promise<any> {\n\n const bal = await this.contract.LiqEth.balanceOf(buyer);\n const paused = await this.contract.Depositor.paused();\n if(paused) {\n throw new Error(\"Error - Depositor is in a paused state\");\n }\n\n // if current liq balance is less than the requested buy amount, throw an error\n if (bal.lt(amountLiq)) {\n throw new Error(`Balance insufficient for pre-token purchase`);\n }\n\n //check that the contract has allowance for the token\n const depositorAddr = this.contract.Depositor.address;\n const allowance = await this.contract.LiqEth.allowance(buyer, depositorAddr);\n\n // if allowance is less than the requested stake amount, request permission to spend LiqEth\n if (allowance.lt(amountLiq)) {\n const liqWrite = this.contractService.getWrite('LiqEth');\n\n // currently requested unlimited amount - potentially change to only request up to the current amount?\n const approveAmount = ethers.constants.MaxUint256;\n\n console.warn(`allowance insufficient (${allowance.toString()} < ${amountLiq.toString()}); sending approve(${depositorAddr}, ${approveAmount.toString()})`);\n\n const approveTx = await liqWrite.approve(depositorAddr, approveAmount);\n await approveTx.wait(1);\n\n // re-read allowance to ensure approval succeeded\n const newAllowance = await this.contract.LiqEth.allowance(buyer, depositorAddr);\n if (newAllowance.lt(amountLiq)) {\n throw new Error('Approval failed or allowance still insufficient after approve');\n }\n }\n \n // attempt a simulation of the purchase call\n try {\n const amountLiqBN = BigNumber.from(amountLiq)\n await this.contract.Depositor.callStatic.purchasePretokensWithLiqETH(amountLiqBN, buyer);\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n\n // ! TEMP for testing\n if(errorObj.name == \"OPP_PreviousEpochUnsent\") {\n console.error(\"OPP Previous Epoch is unsent - trigger OPP finalizeEpoch()\")\n await sendOPPFinalize(this.contract.OPP);\n throw new Error(errorObj.name+` - triggering OPP finalizeEpoch() please try again`);\n }\n\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n\n // attempt the real purchase call\n let tx, receipt;\n try {\n tx = await this.contract.Depositor.purchasePretokensWithLiqETH(amountLiq, buyer);\n receipt = await tx.wait(1);\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n\n\n // Attempt to parse PurchasedWithLiqETH event\n let purchased: any | undefined;\n const ev = receipt.events?.find((e) => e.event === 'PurchasedWithLiqETH' || (e.event && e.event.toString().startsWith('PurchasedWithLiqETH')));\n\n if (ev && ev.args) {\n // Event shape: PurchasedWithLiqETH(buyer, amountLiq, ethEqWei, shares, tokenId)\n const args: any = ev.args;\n // try named fields first, fallback to positional\n const evtBuyer = args.buyer ?? args[0];\n const evtAmountLiq = (args.amountLiq ?? args[1]) ? BigNumber.from(args.amountLiq ?? args[1]) : undefined;\n const evtEthEqWei = (args.ethEqWei ?? args[2]) ? BigNumber.from(args.ethEqWei ?? args[2]) : undefined;\n const evtShares = (args.shares ?? args[3]) ? BigNumber.from(args.shares ?? args[3]) : undefined;\n const evtTokenId = (args.tokenId ?? args[4]) ? BigNumber.from(args.tokenId ?? args[4]) : undefined;\n\n purchased = {\n buyer: evtBuyer,\n amountLiq: evtAmountLiq,\n ethEqWei: evtEthEqWei,\n shares: evtShares,\n tokenId: evtTokenId,\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n purchased,\n };\n }\n\n\n\n\n /**\n * Purchase pretokens by sending ETH to the Depositor.purchasePretokensWithETH(buyer) payable function.\n * Returns txHash, receipt and parsed PurchasedWithETH event (if present).\n async purchasePretokensWithETH(amountWei: BigNumber, buyer: string): Promise<any> {\n // attempt a simulation of the purchase call\n try {\n await this.contract.Depositor.callStatic.purchasePretokensWithETH(buyer, { value: amountWei });\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n\n // attempt the real purchase call\n let tx, receipt;\n try {\n tx = await this.contract.Depositor.purchasePretokensWithETH(buyer, { value: amountWei });\n receipt = await tx.wait(1);\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n\n\n // Attempt to parse PurchasedWithETH event\n let purchased: any | undefined;\n const ev = receipt.events?.find((e) => e.event === 'PurchasedWithETH' || e.event === 'PurchasedWithETH(address,uint256,uint256,uint256)');\n\n if (ev && ev.args) {\n // event signature: PurchasedWithETH(address indexed user, uint256 ethIn, uint256 shares, uint256 tokenId)\n const { user, ethIn, shares, tokenId } = ev.args as any;\n\n purchased = {\n buyer: user,\n amount: BigNumber.from(ethIn),\n shares: BigNumber.from(shares),\n tokenId: BigNumber.from(tokenId),\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n purchased,\n };\n }\n */\n\n \n\n}","import { ethers } from \"ethers\";\nimport { EthereumContractService } from \"../contract\";\nimport { OPPAssertion } from \"../../../types\";\n\n\nexport class OPPClient {\n\n \n private readonly decoders: Record<number, Decoder> = {\n 2001: (d) => this.decode2001(d),\n 2002: (d) => this.decode2002(d),\n\n 3001: (d) => this.decodeStake3001(d),\n 3002: (d) => this.decodeUnstake3002(d),\n // 3003 not implemented\n 3004: (d) => this.decodeLiqPretoken3004(d),\n 3005: (d) => this.decodePretoken3005(d),\n 3006: (d) => this.decodeYieldPretoken3006(d),\n };\n \n private readonly contractService: EthereumContractService;\n \n get contract() { return this.contractService.contract; }\n\n constructor(contract: EthereumContractService) {\n this.contractService = contract;\n }\n \n\n\n /**\n * Read OPP / Outpost state used by the Depositor to decide whether staking is allowed.\n * Returns various data\n */\n async getStatus(): Promise<any> {\n const depositor = this.contract.Depositor;\n const opp = this.contract.OPP;\n\n \n const oppAddress: string = await depositor.oppAddress();\n const oppInboundAddress: string = await depositor.oppInboundAddress();\n const prevEpochSent = await opp.prevEpochSent();\n \n\n const inbound = this.contractService.getReadOnly('OPPInbound');\n\n // Query useful getters\n const nextEpochBN: any = await inbound.nextEpochNum();\n const pendingEpochRaw: any = await inbound.pendingEpoch();\n const pendingMessageCount: any = await inbound.pendingMessageCount();\n const previousEpochHash: string = await inbound.previousEpochHash();\n const nextEpochNum = (nextEpochBN && typeof nextEpochBN.toNumber === 'function') ? nextEpochBN.toNumber() : Number(nextEpochBN || 0);\n\n const pendingEpoch = (pendingEpochRaw && pendingEpochRaw.epochNumber !== undefined)\n ? {\n epochNumber: (pendingEpochRaw.epochNumber && typeof pendingEpochRaw.epochNumber.toNumber === 'function') ? pendingEpochRaw.epochNumber.toNumber() : Number(pendingEpochRaw.epochNumber || 0),\n timestamp: (pendingEpochRaw.timestamp && typeof pendingEpochRaw.timestamp.toNumber === 'function') ? pendingEpochRaw.timestamp.toNumber() : Number(pendingEpochRaw.timestamp || 0),\n prevEpochHash: pendingEpochRaw.prevEpochHash,\n merkleRoot: pendingEpochRaw.merkleRoot,\n firstMessageID: pendingEpochRaw.firstMessageID,\n lastMessageID: pendingEpochRaw.lastMessageID,\n }\n : null;\n\n const pendingMessagesBN = pendingMessageCount;\n const pendingMessages = (pendingMessagesBN && typeof pendingMessagesBN.toString === 'function') ? pendingMessagesBN.toString() : String(pendingMessagesBN || '0');\n\n const hasPendingMessages = (pendingMessagesBN && typeof pendingMessagesBN.gt === 'function') ? pendingMessagesBN.gt(0) : (Number(pendingMessages) > 0);\n\n return {\n oppAddress,\n prevEpochSent,\n oppInboundAddress,\n nextEpochNum,\n pendingEpoch,\n pendingMessageCount: pendingMessages,\n previousEpochHash,\n hasPendingMessages,\n raw: {\n nextEpochBN,\n pendingEpochRaw,\n pendingMessageCount: pendingMessagesBN,\n },\n };\n }\n\n \n\n\n /**\n * Fetches all OPPMessage events and flattens all assertions into a single OPPAssertion[] array.\n */\n async getMessages(address: string): Promise<OPPAssertion[]> {\n const oppMessageFilter = this.contract.OPP.filters.OPPMessage();\n const events = await this.contract.OPP.queryFilter(oppMessageFilter, 0, \"latest\");\n const allAssertions: OPPAssertion[] = [];\n for (const event of events) {\n const assertions = await this.extractAssertionsFromEvent(event);\n allAssertions.push(...assertions);\n }\n\n // ! Current implementation is not ideal - no current way to filter OPP Messages by a single user\n const normalized = address ? address.toLowerCase() : null;\n const filtered = allAssertions.filter(a =>\n (a.from && a.from.toLowerCase() === normalized) ||\n (a.to && a.to.toLowerCase() === normalized)\n );\n return filtered.reverse();\n }\n\n\n\n\n\n /**\n * Extracts all OPPAssertions from a single OPPMessage event, attaching event metadata to each.\n */\n private async extractAssertionsFromEvent(event: any): Promise<OPPAssertion[]> {\n const header = event.args.header;\n const payloadAssertions = event.args.payload.assertions;\n\n const timestamp = header.timestamp ? Number(header.timestamp) : null;\n const from = event.address || null;\n const txHash = event.transactionHash;\n const chain = 'ETH';\n\n const assertionList: OPPAssertion[] = [];\n\n if (payloadAssertions && payloadAssertions.length > 0) {\n for (let a of payloadAssertions) {\n const assertionType = a[0] as number;\n const assertionData = a[1] as string;\n\n\n let type: OPPAssertion[\"type\"] = \"unknown\";\n let data: any = {};\n let to: string | null = null;\n\n const decoder = this.decoders[assertionType];\n\n if (decoder) {\n try {\n const decoded = decoder(assertionData);\n type = decoded.type;\n data = decoded.data;\n to = decoded.to ?? null;\n } catch (e: any) {\n // catch a bad assertion so it doesn't fail the entire function\n type = \"unknown\";\n data = {\n decodeError: e?.message ?? String(e),\n assertionType,\n rawHex: assertionData,\n };\n }\n } else {\n // Unknown assertion type\n data = { assertionType, rawHex: assertionData };\n }\n\n assertionList.push({\n type,\n data,\n chain,\n timestamp,\n from,\n to,\n txHash,\n raw: event,\n });\n }\n }\n return assertionList;\n }\n \n\n\n private decode2001(assertionData: string): DecoderResult {\n const hex = this.strip0x(assertionData);\n\n let cursor = 0;\n const r1 = this.readAddress(hex, cursor); cursor = r1.next;\n const r2 = this.readAddress(hex, cursor); cursor = r2.next;\n const r3 = this.readBytes32(hex, cursor); cursor = r3.next;\n const r4 = this.readUint256LE(hex, cursor); cursor = r4.next;\n const r5 = this.readUint64LE(hex, cursor); cursor = r5.next;\n\n const data = {\n actor: r1.addr,\n owner: r2.addr,\n bondLevelId: r3.value,\n tokenId: r4.value,\n bondedAt: r5.value,\n };\n\n return { type: \"bonded_actor\", data, to: r1.addr };\n }\n private decode2002(assertionData: string): DecoderResult {\n const hex = this.strip0x(assertionData);\n\n let cursor = 0;\n const r1 = this.readAddress(hex, cursor); cursor = r1.next;\n const r2 = this.readBytes32(hex, cursor); cursor = r2.next;\n const r3 = this.readUint256LE(hex, cursor); cursor = r3.next;\n const r4 = this.readUint64LE(hex, cursor); cursor = r4.next;\n\n const data = {\n actor: r1.addr,\n bondLevelId: r2.value,\n tokenId: r3.value,\n unbondedAt: r4.value,\n };\n\n return { type: \"unbonded_actor\", data, to: r1.addr };\n }\n\n\n private decodeStake3001(assertionData: string): DecoderResult {\n const { addr, nums } = this.decodeAddrPlusU256(assertionData, 3);\n const [principal, shares, indexAtMint] = nums;\n\n return {\n type: \"stake\",\n data: { \n staker: addr, \n principal: ethers.utils.formatUnits(principal, 18),\n shares: ethers.utils.formatUnits(shares, 18),\n indexAtMint \n },\n to: addr,\n };\n }\n private decodeUnstake3002(assertionData: string): DecoderResult {\n const { addr, nums } = this.decodeAddrPlusU256(assertionData, 4);\n const [unstakeAmount, shares, indexAtBurn, tokenId] = nums;\n\n return {\n type: \"unstake\",\n data: { \n unstaker: addr, \n unstakeAmount: ethers.utils.formatUnits(unstakeAmount, 18),\n shares, \n indexAtBurn, \n tokenId \n },\n to: addr,\n };\n }\n private decodeLiqPretoken3004(assertionData: string): DecoderResult {\n const { addr, nums } = this.decodeAddrPlusU256(assertionData, 3);\n const [principal, shares, indexAtMint] = nums;\n\n return {\n type: \"liq_pretoken_purchase\",\n data: { \n purchaser: addr, \n principal: ethers.utils.formatUnits(principal, 18),\n shares: ethers.utils.formatUnits(shares, 18),\n indexAtMint \n },\n to: addr,\n };\n }\n private decodePretoken3005(assertionData: string): DecoderResult {\n const { addr, nums } = this.decodeAddrPlusU256(assertionData, 3);\n const [ethInWei, usdValue, pretokensOut] = nums;\n\n return {\n type: \"pretoken_purchase\",\n data: {\n buyer: addr,\n ethInWei,\n ethIn: ethers.utils.formatUnits(ethInWei, 18),\n usdValue: ethers.utils.formatUnits(usdValue, 18),\n pretokensOut: ethers.utils.formatUnits(pretokensOut, 18),\n },\n to: addr,\n };\n }\n private decodeYieldPretoken3006(assertionData: string): DecoderResult {\n const { addr, nums } = this.decodeAddrPlusU256(assertionData, 2);\n const [principal, indexAtMint] = nums;\n\n return {\n type: \"yield_pretoken_purchase\",\n data: { purchaser: addr, principal, indexAtMint },\n to: addr,\n };\n }\n\n\n\n\n /**\n * \n * @param hex string to check\n * @returns the passed string, without a prefixed 0x if it existed\n */\n private strip0x(hex: string): string {\n return hex.startsWith(\"0x\") ? hex.slice(2) : hex;\n }\n\n private decodeAddrPlusU256(assertionData: string, count: number): { addr: string; nums: string[] } {\n const hex = this.strip0x(assertionData);\n let cursor = 0;\n\n const { addr, next } = this.readAddress(hex, cursor);\n cursor = next;\n\n const nums: string[] = [];\n for (let i = 0; i < count; i++) {\n const r = this.readUint256LE(hex, cursor);\n nums.push(r.value);\n cursor = r.next;\n }\n return { addr, nums };\n }\n\n private uint256FromLE(hexNo0x: string): ethers.BigNumber {\n if (hexNo0x.length !== 64) {\n throw new Error(`uint256 LE must be 32 bytes (64 hex chars), got ${hexNo0x.length}`);\n }\n const bytes = ethers.utils.arrayify(\"0x\" + hexNo0x);\n const reversed = Uint8Array.from(bytes).reverse(); // little -> big endian\n return ethers.BigNumber.from(ethers.utils.hexlify(reversed));\n }\n\n\n /**\n * Parses \"0x14 + <addr>\" and returns addr + next cursor (in hex chars, excluding 0x)\n * @param payload full payload\n * @param cursor place to start\n * @returns string\n */\n private readAddress(payload: string, cursor: number): { addr: string; next: number } {\n const lenByteHex = payload.slice(cursor, cursor + 2);\n const len = parseInt(lenByteHex, 16);\n if (!Number.isFinite(len) || len <= 0) throw new Error(`Bad address len byte: ${lenByteHex}`);\n const start = cursor + 2;\n const end = start + len * 2;\n const addrHex = payload.slice(start, end);\n if (addrHex.length !== len * 2) throw new Error(`Truncated address bytes`);\n return { addr: ethers.utils.getAddress(\"0x\" + addrHex), next: end };\n }\n\n /**\n * Reads 32-byte uint256 little-endian from payload at cursor (hex chars, excluding 0x)\n * @param payload \n * @param cursor \n * @returns \n */\n private readUint256LE(payload: string, cursor: number): { value: string; next: number } {\n const word = payload.slice(cursor, cursor + 64);\n if (word.length !== 64) throw new Error(`Truncated uint256 at ${cursor}`);\n return { value: this.uint256FromLE(word).toString(), next: cursor + 64 };\n }\n\n /**\n * Reads 8-byte uint64 little-endian from payload at cursor (hex chars, excluding 0x)\n * @param payload \n * @param cursor \n * @returns \n */\n private readUint64LE(payload: string, cursor: number): { value: number; next: number } {\n const word = payload.slice(cursor, cursor + 16);\n if (word.length !== 16) throw new Error(`Truncated uint64 at ${cursor}`);\n const bytes = ethers.utils.arrayify(\"0x\" + word);\n const reversed = Uint8Array.from(bytes).reverse();\n const bn = ethers.BigNumber.from(ethers.utils.hexlify(reversed));\n return { value: bn.toNumber(), next: cursor + 16 };\n }\n\n /**\n * Reads bytes32 from payload at cursor (hex chars, excluding 0x)\n * @param payload \n * @param cursor \n * @returns \n */\n private readBytes32(payload: string, cursor: number): { value: string; next: number } {\n const word = payload.slice(cursor, cursor + 64);\n if (word.length !== 64) throw new Error(`Truncated bytes32 at ${cursor}`);\n return { value: \"0x\" + word, next: cursor + 64 };\n }\n\n\n}\n\n\ntype DecoderResult = { type: OPPAssertion[\"type\"]; data: any; to?: string | null };\ntype Decoder = (assertionData: string) => DecoderResult;","import { BaseSignerWalletAdapter } from '@solana/wallet-adapter-base';\nimport { PublicKey as SolPubKey } from '@solana/web3.js';\nimport { ChainID, ExternalNetwork, PublicKey } from '@wireio/core';\nimport { ethers } from 'ethers';\n\nexport type StakerConfig = {\n network: ExternalNetwork;\n provider?: BaseSignerWalletAdapter | ethers.providers.Web3Provider;\n pubKey?: PublicKey;\n}\n\nexport interface IStakingClient {\n pubKey?: PublicKey;\n network: ExternalNetwork;\n\n /** Amount is in the chain's smallest unit (lamports/wei, etc.) */\n deposit(amount: bigint): Promise<string>;\n withdraw(amount: bigint): Promise<string>;\n stake(amount: bigint): Promise<string>;\n unstake(amount: bigint): Promise<string>;\n buy(amount: bigint): Promise<string>;\n\n /** Fetch the complete user portfolio */\n getPortfolio(): Promise<Portfolio>;\n\n // Estimated total APY for staking yeild\n getSystemAPY(): Promise<number>;\n\n // Protocol fee charged for deposit from Native to LIQ\n getDepositFee(amount: bigint): Promise<bigint>;\n\n /**\n * Program-level prelaunch WIRE/tranche snapshot for this chain.\n *\n * Returns:\n * - `TrancheSnapshot` when the chain supports pretoken/tranches\n * - `null` if this chain has no WIRE/pretoken integration\n */\n getTrancheSnapshot(options?: {\n chainID?: ChainID;\n windowBefore?: number;\n windowAfter?: number;\n }): Promise<TrancheSnapshot | null>;\n}\n\n/**\n * Cross-chain portfolio view for a single account/wallet.\n *\n * On Solana (liqSOL + Outpost + pretokens) we fill:\n * - native: SOL wallet lamports\n * - liq: liqSOL in user ATA\n * - staked: liqSOL staked into Outpost (stakedLiqsol)\n * - wire: WIRE pretokens purchased (1e8 scale)\n * - yield: Outpost yield view (index/shares + implied claim/yield)\n *\n * On other chains:\n * - native/liq/wire/staked can still be populated as appropriate\n * - yield may be undefined if no index/shares concept exists.\n */\nexport interface Portfolio {\n /** Native balance on chain: ETH, SOL, etc. */\n native: BalanceView;\n\n /** Liquid staking token balance (LiqETH, LiqSOL, etc.). */\n liq: BalanceView;\n\n /**\n * Outpost-staked balance:\n * - On Solana: liqSOL staked via `synd` (stakedLiqsol, in lamports).\n * - On other chains: protocol-specific staked principal, if any.\n */\n staked: BalanceView;\n\n /**\n * Prelaunch WIRE “shares” (pretokens).\n * - On Solana: totalPretokensPurchased (1e8 scale).\n * - On other chains: analogous pretoken balance if supported.\n */\n wire: BalanceView;\n\n /**\n * Yield / index-based view (SOL + Outpost only for now).\n *\n * If the connected chain doesn’t expose an index+shares model,\n * this will be undefined.\n */\n yield?: YieldView;\n\n /**\n * Extra PDAs, account addresses, and raw state useful for debugging\n * and advanced UI (e.g. tranche price, global index, PDAs).\n */\n extras?: Record<string, any>;\n\n /** Chain ID of the network from which this portfolio was fetched. */\n chainID: ChainID;\n}\n\n/**\n * Canonical view of a single balance on a given chain.\n *\n * amount – integer base units (wei, lamports, token base units)\n * symbol – display symbol (“SOL”, “LiqSOL”, “$WIRE”, etc.)\n * decimals – how many decimal places to use when formatting\n * ata – optional SPL ATA / ERC-20 address (where applicable)\n */\nexport interface BalanceView {\n amount: bigint;\n symbol: string;\n decimals: number;\n ata?: SolPubKey;\n}\n\n/**\n * SOL / Outpost yield view.\n *\n * All amounts are integers in base units (lamports for liqSOL).\n *\n * Math matches capital-staking:\n * INDEX_SCALE = 1e12\n * sharesToTokens = shares * currentIndex / INDEX_SCALE\n */\nexport interface YieldView {\n /**\n * Current global index for the Outpost pool.\n * - 1e12 scale (INDEX_SCALE)\n * - sharesToTokens(shares) = shares * currentIndex / indexScale\n */\n currentIndex: bigint;\n\n /**\n * Fixed scale factor used for index math.\n * - Always 1_000_000_000_000n (1e12) on Solana Outpost.\n */\n indexScale: bigint;\n\n /** Total shares outstanding in the Outpost pool (all users). */\n totalShares: bigint;\n\n /** User’s staked shares in the Outpost pool. */\n userShares: bigint;\n\n /**\n * Total liqSOL (lamports) the user could claim right now if they fully\n * unwound their stake:\n * estimatedClaimLiqsol = userShares * currentIndex / indexScale\n */\n estimatedClaimLiqsol: bigint;\n\n /**\n * Portion of estimatedClaimLiqsol that is “yield” above principal:\n * estimatedYieldLiqsol = max(0, estimatedClaimLiqsol - stakedLiqsol)\n *\n * NOTE: stakedLiqsol principal itself is surfaced separately as\n * Portfolio.staked.amount.\n */\n estimatedYieldLiqsol: bigint;\n}\n\nexport interface TrancheLadderItem {\n /** On-chain tranche id, 0-based (0,1,2,...) */\n id: number;\n /** Total capacity for this tranche (pretokens, 1e8 scale) */\n capacity: bigint;\n /** Sold amount in this tranche (1e8 scale) */\n sold: bigint;\n /** Remaining = capacity - sold (1e8 scale) */\n remaining: bigint;\n /** Price for this tranche in USD (1e8 scale) */\n priceUsd: bigint;\n}\n\nexport interface TrancheLadderItem {\n /** On-chain tranche id, 0-based (0,1,2,...) */\n id: number;\n /** Total capacity for this tranche (pretokens, 1e8 scale) */\n capacity: bigint;\n /** Sold amount in this tranche (1e8 scale) */\n sold: bigint;\n /** Remaining = capacity - sold (1e8 scale) */\n remaining: bigint;\n /** Price for this tranche in USD (1e8 scale) */\n priceUsd: bigint;\n}\n\n/**\n * Unified pretoken/tranche snapshot for any chain.\n * ETH / other chains just fill the same shape from their own contracts.\n */\nexport interface TrancheSnapshot {\n chainID: ChainID;\n\n /** Global share index (1e12 on Sol today; other chains can use their own scale) */\n currentIndex: bigint;\n /** Total accounting shares (wire pretoken “shares”) */\n totalShares: bigint;\n\n /** Current tranche id as stored on chain (0-based) */\n currentTranche: number;\n\n /** Current tranche price in USD (1e8 scale) */\n currentPriceUsd: bigint;\n\n /** Tranche curve config (per-chain) */\n // TODO make a constant?\n supplyGrowthBps: number; // e.g. 100 = +1% per tranche\n priceGrowthBps: number; // e.g. 200 = +2% per tranche\n\n totalPretokensSold: bigint; // total pretokens sold across all tranches (1e8 scale)\n\n /** Current tranche supply state (1e8 scale) */\n currentTrancheSupply: bigint; // remaining in current tranche\n initialTrancheSupply: bigint; // capacity for current tranche\n\n /** Native token → USD price if available (SOL/USD, ETH/USD, etc, 1e8 scale) */\n nativePriceUsd?: bigint;\n /** Optional timestamp (sec) for the last recorded native price */\n nativePriceTimestamp?: number;\n\n /**\n * Local window of tranche “rows” centered around current.\n * Used directly by the frontend for ladder graphs.\n */\n ladder: TrancheLadderItem[];\n}\n\n\n// Enum describing which asset is being used to buy pretoken\nexport enum PurchaseAsset {\n SOL = 'SOL',\n LIQSOL = 'LIQSOL',\n ETH = 'ETH',\n LIQETH = 'LIQETH',\n YIELD = 'YIELD',\n}\n\nexport interface PurchaseQuote {\n purchaseAsset: PurchaseAsset;\n amountIn: bigint; // lamports / wei / token units\n\n /** Expected pretoken “shares” (pretokens) and decimals */\n wireShares: bigint; // 1e8 scale\n wireDecimals: number; // always 8 for now\n\n /** Current price + notional in USD (1e8 scale) */\n wirePriceUsd: bigint;\n notionalUsd: bigint;\n}\n\n// export interface OPPEvent {\n// type: 'liq_pretoken_purchase' | 'yield_pretoken_purchase' | 'pretoken_purchase' | 'stake' | 'unstake' | 'unknown';\n// amount: bigint | null;\n// chain: 'ETH' | 'SOL';\n// timestamp: number | null;\n// from: string | null;\n// to: string | null;\n// txHash: string;\n// raw: any;\n// assertions: OPPAssertion[]\n// }\n\nexport interface OPPAssertion {\n type: 'liq_pretoken_purchase' | 'yield_pretoken_purchase' | 'pretoken_purchase' | 'stake' | 'unstake' | 'bonded_actor' | 'unbonded_actor' | 'unknown',\n data: any\n chain: 'ETH' | 'SOL';\n timestamp: number | null;\n from: string | null;\n to: string | null;\n txHash: string;\n raw: any;\n}\n\n\n\nexport enum ReceiptNFTKind {\n STAKE = 0,\n PRETOKEN_PURCHASE = 1,\n}","import { BigNumber } from \"ethers\";\nimport { preLaunchReceipt } from \"../types\";\nimport { EthereumContractService } from \"../contract\";\nimport { ReceiptNFTKind } from \"../../../types\";\n\nexport class ReceiptClient {\n\n private readonly contractService: EthereumContractService;\n \n get contract() { return this.contractService.contract; }\n\n constructor(contract: EthereumContractService) {\n this.contractService = contract;\n }\n\n\n\n async allReceipts(address: string): Promise<preLaunchReceipt[]> {\n return this.fetchPreLaunchReceipts(address);\n }\n\n async stakeReceipts(address: string): Promise<preLaunchReceipt[]> {\n return this.fetchPreLaunchReceipts(address, ReceiptNFTKind.STAKE);\n }\n \n async pretokenReceipts(address: string): Promise<preLaunchReceipt[]> {\n return this.fetchPreLaunchReceipts(address, ReceiptNFTKind.PRETOKEN_PURCHASE);\n }\n\n\n\n /**\n * \n * @param address (string) to fetch receipts for\n * @returns preLaunchReceipt[]\n */\n async fetchPreLaunchReceipts(address: string, type?: ReceiptNFTKind): Promise<preLaunchReceipt[]> {\n const receiptContract = this.contract.ReceiptNFT;\n\n // first figure out which tokenIds this address owns, from events\n const tokenIds = await this.getOwnedTokenIdsFor(address);\n\n const results: preLaunchReceipt[] = [];\n\n // next fetch on-chain receipt data just for those ids\n for (const idBN of tokenIds) {\n try {\n const receiptData = await receiptContract.getReceipt(idBN);\n\n //skip any receipt not of the requested type\n if(type !== undefined && receiptData.kind !== type) continue;\n\n results.push({ \n tokenId: idBN.toBigInt(), \n receipt: {\n account: receiptData.account,\n currency: receiptData.currency,\n kind: receiptData.kind,\n indexAtMint: receiptData.indexAtMint.toBigInt(),\n principal: {\n amount: receiptData.principal.toBigInt(),\n decimals: 18,\n symbol: \"LiqETH\"\n },\n shares: {\n amount: receiptData.shares.toBigInt(),\n decimals: 18,\n symbol: \"LiqETH\"\n },\n timestamp: new Date(Number(receiptData.timestamp.toString()) * 1000).toLocaleString(),\n }\n });\n } catch (err) {\n // in case of any mismatch or race, just skip this id\n console.warn(`Failed to load receipt for tokenId=${idBN.toString()}`, err);\n continue;\n }\n }\n\n return results;\n }\n\n\n\n\n private async getOwnedTokenIdsFor(\n owner: string,\n fromBlock = 0,\n toBlock: number | string = \"latest\"\n ): Promise<BigNumber[]> {\n const receiptContract = this.contract.ReceiptNFT;\n\n // Logs where address received tokens\n const toLogs = await receiptContract.queryFilter(\n receiptContract.filters.Transfer(null, owner),\n fromBlock,\n toBlock\n );\n\n // Logs where address sent tokens (including burns from owner → 0)\n const fromLogs = await receiptContract.queryFilter(\n receiptContract.filters.Transfer(owner, null),\n fromBlock,\n toBlock\n );\n\n const owned = new Set<string>();\n\n // Add all received tokenIds\n for (const e of toLogs) {\n const tokenId = e.args?.tokenId;\n if (!tokenId) continue;\n owned.add(tokenId.toString());\n }\n\n // Remove all sent tokenIds\n for (const e of fromLogs) {\n const tokenId = e.args?.tokenId;\n if (!tokenId) continue;\n owned.delete(tokenId.toString());\n }\n\n // Convert to BigNumbers\n return Array.from(owned).map((id) => BigNumber.from(id));\n }\n\n\n\n}","import { BigNumber, ethers } from 'ethers';\nimport { ChainID, EvmChainID, PublicKey as WirePubKey } from '@wireio/core';\nimport {\n IStakingClient,\n OPPAssertion,\n Portfolio,\n StakerConfig,\n TrancheSnapshot\n} from '../../types';\nimport { EthereumContractService } from './contract';\nimport { preLaunchReceipt } from './types';\nimport { buildEthereumTrancheSnapshot } from './utils';\nimport { ConvertClient } from './clients/convert.client';\nimport { StakeClient } from './clients/stake.client';\nimport { PretokenClient } from './clients/pretoken.client';\nimport { OPPClient } from './clients/opp.client';\nimport { ReceiptClient } from './clients/receipt.client';\n\nexport class EthereumStakingClient implements IStakingClient {\n private readonly provider: ethers.providers.Web3Provider | ethers.providers.JsonRpcProvider;\n public readonly pubKey?: WirePubKey;\n private readonly signer?: ethers.Signer;\n private readonly contractService: EthereumContractService;\n\n private convertClient: ConvertClient;\n private pretokenClient: PretokenClient;\n private stakeClient: StakeClient;\n private oppClient: OPPClient;\n private receiptClient: ReceiptClient;\n\n\n get contract() { return this.contractService.contract; }\n get network() { return this.config.network; }\n\n constructor(private config: StakerConfig) {\n try {\n if (config.provider) {\n this.provider = config.provider as ethers.providers.Web3Provider;\n this.signer = this.provider.getSigner();\n }\n else {\n this.provider = new ethers.providers.JsonRpcProvider(config.network.rpcUrls[0]);\n }\n this.pubKey = config.pubKey;\n\n this.contractService = new EthereumContractService({\n provider: this.provider,\n signer: this.signer,\n });\n\n this.convertClient = new ConvertClient(this.contractService);\n this.pretokenClient = new PretokenClient(this.contractService);\n this.stakeClient = new StakeClient(this.contractService);\n this.oppClient = new OPPClient(this.contractService);\n this.receiptClient = new ReceiptClient(this.contractService);\n }\n catch (error) {\n // console.error('Error initializing EthereumStakingClient:', error);\n throw error;\n }\n }\n\n // ---------------------------------------------------------------------\n // Public IStakingClient Interface Methods\n // ---------------------------------------------------------------------\n\n /**\n * Deposit native ETH into the liqETH protocol via DepositManager.\n * @param amount Amount in wei (or something convertible to BigNumber).\n * Keep this as a bigint / string in the caller; avoid JS floats.\n * @returns transaction hash\n */\n async deposit(amount: number | string | bigint | BigNumber): Promise<string> {\n this.ensureUser();\n\n const amountWei = BigNumber.isBigNumber(amount)\n ? amount\n : BigNumber.from(amount);\n\n const result = await this.convertClient.performDeposit(amountWei);\n return result.txHash;\n }\n\n /**\n * Withdraw native ETH from the liqETH protocol via the liqeth safeBurn function, which burns the LiqETH and adds the user to the withdrawal queue.\n * @param amount Amount in wei (or something convertible to BigNumber).\n * @returns transaction hash\n */\n async withdraw(amount: bigint): Promise<string> {\n this.ensureUser();\n\n const address = await this.signer!.getAddress();\n const amountWei = BigNumber.from(amount);\n\n const result = await this.convertClient.performWithdraw(address, amountWei)\n return result.txHash;\n }\n\n\n /**\n * Stake liqETH via DepositManager.\n * @param amount Amount in wei - Keep this as a bigint / string in the caller; avoid JS floats.\n * @returns transaction hash\n */\n async stake(amount: bigint): Promise<string> {\n this.ensureUser();\n\n const walletAddress = await this.signer!.getAddress();\n const amountWei = BigNumber.from(amount);\n\n const result = await this.stakeClient.performStake(amountWei, walletAddress);\n return result.txHash;\n }\n\n\n // TODO\n async unstake(): Promise<string> {\n throw new Error(\"Method not yet implemented.\");\n }\n\n\n /**\n * ETH Prelaunch function to unstake liqEth\n * @param tokenId ReceiptNFT tokenId for the owned NFT that will be burned\n * @param recipient Address to receive the liqEth funds linked to the burned NFT\n * @returns the transaction hash\n */\n async unstakePrelaunch(tokenId: bigint, recipient: string): Promise<string> {\n this.ensureUser();\n\n const tokenIdBigNum = BigNumber.from(tokenId)\n const result = await this.stakeClient.performWithdrawStake(tokenIdBigNum, recipient);\n return result.txHash;\n }\n\n\n async buy(amount: bigint): Promise<string> {\n this.ensureUser();\n\n const buyer = await this.signer!.getAddress();\n\n // ! Hoodi only - check if the mock aggregator price is stale, and if so, update it before submitting the buy request\n await this.updateMockAggregatorPrice();\n\n let result = await this.pretokenClient.purchasePretokensWithLiqETH(amount, buyer);\n return result && result.txHash ? result.txHash : \"Error - no resulting txHash\";\n }\n\n\n /**\n * Resolve the user's ETH + liqETH balances.\n *\n * native = ETH in wallet\n * actual = liqETH token balance (ERC-20)\n * tracked = liqETH tracked balance (protocol/accounting view)\n */\n async getPortfolio(): Promise<Portfolio> {\n this.ensureUser();\n\n const walletAddress = await this.signer!.getAddress();\n\n // 1) Native ETH balance\n const nativeBalance = await this.provider.getBalance(walletAddress);\n const nativeDecimals = this.network?.nativeCurrency?.decimals ?? 18;\n const nativeSymbol = this.network?.nativeCurrency?.symbol ?? 'ETH';\n\n // 2) liqETH ERC-20 balance (actual)\n const liqBalance: ethers.BigNumber = await this.contract.LiqEth.balanceOf(walletAddress);\n const liqSymbol = 'Liq' + (this.network?.nativeCurrency?.symbol ?? 'ETH');\n\n // 3) staked liqEth ERC-20 balance (calculate from receipts)\n let stakeReceipts = await this.receiptClient.stakeReceipts(walletAddress);\n let stakeBalanceBN = BigNumber.from(0);\n for (let r of stakeReceipts) {\n stakeBalanceBN = stakeBalanceBN.add(BigNumber.from(r.receipt.principal.amount));\n }\n\n // 4) WIRE pretoken balance\n const wireBalance: ethers.BigNumber = await this.contract.Pretoken.balanceOf(walletAddress);\n\n const portfolio: Portfolio = {\n native: {\n amount: nativeBalance.toBigInt(),\n decimals: nativeDecimals,\n symbol: nativeSymbol,\n },\n liq: {\n amount: liqBalance.toBigInt(),\n decimals: nativeDecimals,\n symbol: liqSymbol,\n },\n staked: {\n amount: stakeBalanceBN.toBigInt(),\n decimals: nativeDecimals,\n symbol: liqSymbol,\n },\n wire: {\n amount: wireBalance.toBigInt(),\n decimals: 18,\n symbol: '$WIRE',\n },\n chainID: this.network.chainId\n }\n return portfolio;\n }\n\n /**\n * ETH Prelaunch function to list the Stake ReceiptNFTs owned by a specific user\n * @param address address to query the receipts for\n * @returns array of receipts\n */\n async fetchPrelaunchReceipts(address?: string): Promise<preLaunchReceipt[]> {\n this.ensureUser();\n\n if (address === undefined) address = await this.signer!.getAddress();\n\n //default to stake receipts\n return await this.receiptClient.stakeReceipts(address);\n }\n\n async getOPPMessages(address?: string): Promise<OPPAssertion[]> {\n this.ensureUser();\n\n if (!address) address = await this.signer!.getAddress();\n\n return await this.oppClient.getMessages(address);\n }\n\n // Ensure that signer wallet is available for write operations\n private ensureUser() {\n if (!this.signer) {\n throw new Error(\n 'EthereumStakingClient: write operation requires a wallet-connected Web3 provider',\n );\n }\n }\n\n\n // ---------------------------------------------------------------------\n // READ-ONLY Public Methods\n // ---------------------------------------------------------------------\n\n // Estimated total APY for staking yeild\n getSystemAPY(): Promise<number> {\n // TODO\n return Promise.resolve(0);\n }\n\n // Protocol fee charged for deposit from Native to LIQ\n getDepositFee(amount: bigint): Promise<bigint> {\n // TODO\n return Promise.resolve(BigInt(0));\n }\n\n async getOPPStatus(): Promise<any> {\n return await this.oppClient.getStatus();\n }\n\n async getEthStats(): Promise<any> {\n let withdrawDelay = await this.contract.DepositManager.withdrawDelay();\n let minDeposit = await this.contract.DepositManager.minDeposit();\n let rewardCooldown = await this.contract.DepositManager.rewardCooldown();\n\n return {\n withdrawDelay,\n minDeposit,\n rewardCooldown,\n }\n }\n\n /**\n * Program-level prelaunch WIRE / tranche snapshot for Ethereum\n * \n * SUPPORTS READ-ONLY ACcESS\n */\n async getTrancheSnapshot(options?: {\n chainID?: ChainID;\n windowBefore?: number;\n windowAfter?: number;\n }): Promise<TrancheSnapshot> {\n const {\n chainID = EvmChainID.Hoodi,\n windowBefore,\n windowAfter,\n } = options ?? {};\n\n\n const blockNumber = await this.provider.getBlockNumber();\n const blockTag = { blockTag: blockNumber };\n\n // Fetch all required contract data\n const [totalSharesBn, indexBn, trancheNumberBn, trancheSupplyBn, tranchePriceWadBn, totalSupplyBn, supplyGrowthBps, priceGrowthBps, minPriceUsd, maxPriceUsd] = await Promise.all([\n this.contract.Depositor.totalShares(blockTag),\n this.contract.Depositor.index(blockTag),\n this.contract.Pretoken.trancheNumber(blockTag),\n this.contract.Pretoken.trancheSupply(blockTag),\n this.contract.Pretoken.tranchePriceUsd(blockTag),\n this.contract.Pretoken.totalSupply(blockTag),\n this.contract.Pretoken.supplyGrowthBps(blockTag),\n this.contract.Pretoken.priceGrowthBps(blockTag),\n this.contract.EthUsdPriceConsumer.MIN_PRICE(),\n this.contract.EthUsdPriceConsumer.MAX_PRICE(),\n ]);\n\n\n const totalTrancheSupply = BigInt(totalSupplyBn.toString()) / BigInt(1e10);\n const currentTrancheSupply = BigInt(trancheSupplyBn.toString()) / BigInt(1e10);\n\n\n // fetch price and timestamp from aggregator\n const [roundId, answer, startedAt, updatedAt, answeredInRound] = await this.contract.Aggregator.latestRoundData();\n let ethPriceUsd: bigint = BigInt(answer.toString());\n let nativePriceTimestamp: number = Number(updatedAt);\n\n // ! Placeholder from hoodi deployment - don't think this can be fetched dynamically\n const initialTrancheSupply = BigInt(60000) * BigInt(1e8);\n\n return buildEthereumTrancheSnapshot({\n chainID,\n totalSharesBn,\n indexBn,\n trancheNumberBn,\n currentTrancheSupply,\n tranchePriceWadBn,\n totalTrancheSupply,\n initialTrancheSupply,\n supplyGrowthBps,\n priceGrowthBps,\n minPriceUsd,\n maxPriceUsd,\n\n ethPriceUsd,\n nativePriceTimestamp,\n ladderWindowBefore: windowBefore,\n ladderWindowAfter: windowAfter,\n });\n }\n\n // ---------------------------------------------------------------------\n // Internal ETH Staking client helper functions\n // ---------------------------------------------------------------------\n\n // ! This is a temporary measure for Hoodi testnet because there is no aggregator deployed\n private async updateMockAggregatorPrice() {\n const aggregator = this.contract.Aggregator;\n\n // read latest round & compute age\n const [roundId, answer, startedAt, updatedAt, answeredInRound] = await aggregator.latestRoundData();\n const now = (await this.provider.getBlock(\"latest\")).timestamp;\n const ageSec = Number(now) - Number(updatedAt);\n\n const ONE_HOUR = 1 * 3600;\n // const ONE_HOUR = 10;\n if (ageSec > ONE_HOUR) {\n // safety check - only run in non-production contexts\n const network = await this.provider.getNetwork();\n const chainId = network.chainId;\n const allowedTestChains = new Set([560048]);\n if (!allowedTestChains.has(chainId)) {\n console.warn(`MockAggregator is stale (${ageSec}s) but chainId ${chainId} is not a test/local network — skipping update.`);\n return;\n }\n\n\n //fetch the current ETH / USD price\n const res = await fetch('https://api.coingecko.com/api/v3/simple/price?ids=ethereum&vs_currencies=usd');\n const data = await res.json();\n const ethUsd = data.ethereum.usd;\n\n const currentEthPrice = ethers.utils.parseUnits(ethUsd.toString(), 8);\n\n try {\n //update to be intentionally stale\n // const alttx = await aggregator.updateStale(currentEthPrice, now - 7200);\n // const altreceipt = await alttx.wait(1);\n // console.log('stale update receipt', altreceipt)\n\n //update answer with current timestamp\n const tx = await aggregator.updateAnswer(currentEthPrice);\n const txreceipt = await tx.wait(1);\n // console.log('MockAggregator answer updated - receipt:', txreceipt)\n } catch (err: any) {\n console.error('MockAggregator updateAnswer failed', err?.message || err);\n }\n } else {\n console.log(`MockAggregator updated ${ageSec}s ago — no update needed`);\n }\n }\n}","// src/staker/staker.ts\n\nimport { ChainID, EvmChainID, SolChainID } from '@wireio/core';\nimport { IStakingClient, StakerConfig } from './types';\nimport { SolanaStakingClient } from './networks/solana/solana';\nimport { EthereumStakingClient } from './networks/ethereum/ethereum';\n\nexport class Staker {\n public selectedChainID?: ChainID;\n private clients: Map<ChainID, IStakingClient> = new Map();\n\n /**\n * Get the staking client for the currently selected chain.\n * @returns The staking client instance.\n */\n get client(): IStakingClient | undefined {\n return this.selectedChainID && this.isConfigured(this.selectedChainID)\n ? this.clients.get(this.selectedChainID) : undefined;\n }\n\n /** Is there a client configured for this chain? */\n isConfigured(chainId: ChainID): boolean {\n return this.clients.has(chainId);\n }\n\n /** List of configured chains */\n listConfigured(): ChainID[] {\n return [...this.clients.keys()];\n }\n\n constructor(config: StakerConfig | StakerConfig[], selectedChainID?: ChainID) {\n if (!config) throw new Error('StakerConfig is required');\n if (!Array.isArray(config)) config = [config];\n\n // console.log('STAKER INIT', config);\n\n config.forEach((cfg) => {\n switch (cfg.network.chainId) {\n case SolChainID.WireTestnet:\n this.clients.set(cfg.network.chainId, new SolanaStakingClient(cfg));\n break;\n\n case EvmChainID.Hoodi:\n this.clients.set(EvmChainID.Hoodi, new EthereumStakingClient(cfg));\n break;\n\n default:\n console.log(`No staking client available for chain ${cfg.network.chainId}`);\n throw new Error(`Unsupported network curve: ${cfg.network.name}`);\n }\n });\n\n this.selectedChainID = selectedChainID;\n }\n \n /**\n * Select a chain. Returns true if a client exists for it, false otherwise.\n * (We still record the selectedChainID so the UI can reflect the chosen chain.)\n */\n setChain(chainID: ChainID): boolean {\n this.selectedChainID = chainID;\n return this.clients.has(chainID);\n }\n}","import { BigNumber, ethers } from 'ethers';\nimport { BalanceView } from '../../types';\n\nexport const CONTRACT_NAMES = [\n 'Accounting',\n 'DepositManager',\n 'LiqEth',\n 'StakingModule',\n 'WithdrawalQueue',\n 'WithdrawalVault',\n\n //Outpost contracts\n 'Depositor',\n 'ReceiptNFT',\n 'OutpostManager',\n 'BAR',\n 'OPP',\n 'OPPCommon',\n 'OPPInbound',\n 'Pretoken',\n 'Aggregator',\n 'EthUsdPriceConsumer',\n 'Pool',\n\n] as const;\n\nexport type ContractName = typeof CONTRACT_NAMES[number];\nexport type AddressBook = Record<ContractName, string>;\n\n\ninterface Result {\n /** EVM transaction hash */\n txHash: string;\n /** Full receipt, if you want it */\n receipt: ethers.providers.TransactionReceipt;\n}\n\n\nexport interface DepositEvent {\n user: string;\n netEth: BigNumber;\n fee: BigNumber;\n shares: BigNumber;\n}\n\nexport interface DepositResult extends Result {\n /** Parsed Deposited event, if present */\n deposited?: DepositEvent;\n}\n\nexport interface WithdrawRequestedEvent {\n user: string;\n ethAmount: BigNumber;\n nftId: BigNumber;\n readyAt: string;\n}\n\nexport interface WithdrawResult extends Result {\n /** Parsed WithdrawRequested event, if present */\n withdrawRequested?: WithdrawRequestedEvent;\n}\n\n\nexport interface StakedEvent {\n user: string;\n amountLiq: BigNumber;\n shares: BigNumber;\n tokenId: BigNumber;\n}\n\nexport interface StakedResult extends Result {\n /** Parsed Staked event, if present */\n staked?: StakedEvent;\n}\n\n\nexport interface WithdrawnStakeEvent {\n user: string;\n tokenId: BigNumber;\n tokenOut: BigNumber;\n}\nexport interface WithdrawnStakeResult extends Result {\n /** Parsed WithdrawnStake event, if present */\n withdrawnstake?: WithdrawnStakeEvent;\n\n}\n\nexport interface SharesBurnedEvent {\n from: string;\n shares: BigNumber;\n tokenValue: BigNumber;\n}\n\nexport interface preLaunchReceipt {\n tokenId: bigint;\n receipt: {\n account: string,\n currency: number,\n kind: number,\n indexAtMint: BalanceView,\n principal: BalanceView,\n shares: BalanceView,\n timestamp: string,\n }\n}"],"names":["liqSolTokenIDL","validatorLeaderboardIDL","INDEX_SCALE","liqsolCoreJson","BPS","growOnce","shrinkOnce","SolPubKey","PublicKey","tokenId","PurchaseAsset","ReceiptNFTKind"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
1
+ {"version":3,"file":"stake.m.js","sources":["../src/networks/solana/constants.ts","../src/networks/solana/program.ts","../src/networks/solana/clients/deposit.client.ts","../src/networks/solana/clients/distribution.client.ts","../src/networks/solana/clients/leaderboard.client.ts","../src/networks/solana/utils.ts","../src/networks/solana/clients/outpost.client.ts","../src/networks/solana/clients/token.client.ts","../src/networks/solana/solana.ts","../src/networks/ethereum/contract.ts","../src/networks/ethereum/utils.ts","../src/networks/ethereum/clients/convert.client.ts","../src/networks/ethereum/clients/stake.client.ts","../src/networks/ethereum/clients/pretoken.client.ts","../src/networks/ethereum/clients/opp.client.ts","../src/types.ts","../src/networks/ethereum/clients/receipt.client.ts","../src/networks/ethereum/ethereum.ts","../src/staker.ts","../src/networks/ethereum/types.ts"],"sourcesContent":["// src/networks/solana/constants.ts\nimport { PublicKey, StakeProgram } from '@solana/web3.js';\n\nimport liqsolCoreIDL from '../../assets/solana/idl/liqsol_core.json';\nimport liqSolTokenIDL from '../../assets/solana/idl/liqsol_token.json';\nimport validatorLeaderboardIDL from '../../assets/solana/idl/validator_leaderboard.json';\nimport transferHookIDL from '../../assets/solana/idl/transfer_hook.json';\n\n/**\n * ---------------------------------------------------------------------------\n * PROGRAM IDS\n * ---------------------------------------------------------------------------\n *\n * These should match:\n * - `metadata.address` in your Anchor IDLs under src/assets/solana/idl/*.json\n * - The program IDs printed by your deploy scripts\n */\nexport const PROGRAM_IDS = {\n LIQSOL_CORE: new PublicKey(liqsolCoreIDL.address),\n LIQSOL_TOKEN: new PublicKey(liqSolTokenIDL.address),\n VALIDATOR_LEADERBOARD: new PublicKey(validatorLeaderboardIDL.address),\n TRANSFER_HOOK: new PublicKey(transferHookIDL.address),\n} as const;\n\nexport const {\n LIQSOL_CORE,\n LIQSOL_TOKEN,\n VALIDATOR_LEADERBOARD,\n TRANSFER_HOOK,\n} = PROGRAM_IDS;\n\n/**\n * ---------------------------------------------------------------------------\n * PDA SEEDS (must match on-chain programs)\n * ---------------------------------------------------------------------------\n */\n\nexport const PDA_SEEDS = {\n // GLOBAL CONFIG\n GLOBAL_CONFIG: 'global_config',\n\n // liqsol_core: deposit / stake controller\n DEPOSIT_AUTHORITY: 'deposit_authority',\n VAULT: 'vault',\n RESERVE_POOL: 'reserve_pool',\n STAKE_CONTROLLER_STATE: 'stake_controller',\n PAYOUT_STATE: 'payout_state',\n\n // liqsol_token: mint + bucket\n LIQSOL_MINT: 'liqsol_mint',\n LIQSOL_MINT_AUTHORITY: 'mint_authority',\n BUCKET_AUTHORITY: 'liqsol_bucket',\n\n // distribution program (embedded in liqsol_core)\n DISTRIBUTION_STATE: 'distribution_state',\n // NOTE: in the current IDL, userRecord is keyed by the USER (wallet), not ATA\n USER_RECORD: 'user_record',\n\n // pay-rate / price history\n PAY_RATE_HISTORY: 'pay_rate_history',\n PRICE_HISTORY: 'price_history',\n\n // validator leaderboard (state + records)\n LEADERBOARD_STATE: 'leaderboard_state',\n VALIDATOR_RECORD: 'validator',\n GLOBAL_STAKE_INFO: 'global_stake_info',\n\n // Outpost / Wire pretokens\n OUTPOST_GLOBAL_STATE: 'outpost_global_state',\n LIQSOL_POOL: 'liqsol_pool',\n OUTPOST_ACCOUNT: 'outpost_account',\n USER_PRETOKEN_RECORD: 'user_pretoken_record',\n TRANCHE_STATE: 'tranche_state',\n\n // BAR module (bonded actor roles)\n BAR_STATE_SEED: 'bar_state',\n BONDED_ACTOR_SEED: 'bonded_actor',\n BOND_LEVEL_SEED: 'bond_level',\n\n // SPL transfer-hook extra account metas\n EXTRA_ACCOUNT_METAS: 'extra-account-metas',\n\n // Withdraw module / receipts\n WITHDRAW_GLOBAL: 'global',\n STAKE_ALLOCATION_STATE: 'stake_allocation_state',\n STAKE_METRICS: 'stake_metrics',\n MAINTENANCE_LEDGER: 'maintenance_ledger',\n WITHDRAW_MINT_AUTHORITY: 'mint_authority',\n MINT_METADATA: 'mint_metadata',\n LIQ_RECEIPT_DATA: 'liq_receipt_data',\n WITHDRAW_MINT: 'mint',\n\n\n\n} as const;\n\n// Global Config PDA\nexport const deriveGlobalConfigPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.GLOBAL_CONFIG)],\n LIQSOL_CORE,\n )[0];\n\n\n/**\n * ---------------------------------------------------------------------------\n * CORE / DISTRIBUTION / DEPOSIT PDAS\n * ---------------------------------------------------------------------------\n */\n\nexport const deriveLiqsolMintPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQSOL_MINT)],\n LIQSOL_TOKEN,\n )[0];\n\nexport const deriveLiqsolMintAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQSOL_MINT_AUTHORITY)],\n LIQSOL_TOKEN,\n )[0];\n\nexport const deriveDepositAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.DEPOSIT_AUTHORITY)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveVaultPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VAULT)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveReservePoolPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.RESERVE_POOL)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveStakeControllerStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.STAKE_CONTROLLER_STATE)],\n LIQSOL_CORE,\n )[0];\n\nexport const derivePayoutStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.PAYOUT_STATE)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveBucketAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.BUCKET_AUTHORITY)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveDistributionStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.DISTRIBUTION_STATE)],\n LIQSOL_CORE,\n )[0];\n\n/**\n * user_record PDA\n *\n * In the current liqsol_core IDL, this is keyed by USER (wallet),\n * not by token account.\n */\nexport const deriveUserRecordPda = (user: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.USER_RECORD), user.toBuffer()],\n LIQSOL_CORE,\n )[0];\n\nexport const derivePayRateHistoryPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.PAY_RATE_HISTORY)],\n LIQSOL_CORE,\n )[0];\n\n/**\n * ---------------------------------------------------------------------------\n * WITHDRAW MODULE / RECEIPTS\n * ---------------------------------------------------------------------------\n */\n\nexport const deriveWithdrawGlobalPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.WITHDRAW_GLOBAL)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveStakeAllocationStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.STAKE_ALLOCATION_STATE)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveStakeMetricsPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.STAKE_METRICS)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveMaintenanceLedgerPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.MAINTENANCE_LEDGER)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveWithdrawMintAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.WITHDRAW_MINT_AUTHORITY)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveWithdrawMintMetadataPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.MINT_METADATA)],\n LIQSOL_CORE,\n )[0];\n\n/**\n * NFT mint for withdrawal receipt, derived from nextReceiptId.\n */\nexport const deriveWithdrawNftMintPda = (receiptId: bigint | number) => {\n const receiptIdBytes = Buffer.alloc(8);\n // receiptId comes in as BN or bigint upstream → normalize\n const asBigInt =\n typeof receiptId === 'bigint'\n ? receiptId\n : BigInt(receiptId.toString());\n receiptIdBytes.writeBigUInt64LE(asBigInt);\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.WITHDRAW_MINT), receiptIdBytes],\n LIQSOL_CORE,\n )[0];\n};\n\nexport const deriveLiqReceiptDataPda = (nftMint: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQ_RECEIPT_DATA), nftMint.toBuffer()],\n LIQSOL_CORE,\n )[0];\n\n/**\n * ---------------------------------------------------------------------------\n * VALIDATOR LEADERBOARD\n * ---------------------------------------------------------------------------\n */\n\nexport const deriveLeaderboardStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LEADERBOARD_STATE)],\n VALIDATOR_LEADERBOARD,\n )[0];\n\nexport const deriveValidatorRecordPda = (voteAccount: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VALIDATOR_RECORD), voteAccount.toBuffer()],\n VALIDATOR_LEADERBOARD,\n )[0];\n\nexport const deriveStakeControllerVaultPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VAULT)],\n LIQSOL_CORE,\n )[0];\n\n/**\n * ---------------------------------------------------------------------------\n * OUTPOST / PRETOKENS\n * ---------------------------------------------------------------------------\n */\n\nexport const deriveOutpostGlobalStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.OUTPOST_GLOBAL_STATE)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveOutpostPoolAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQSOL_POOL)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveOutpostAccountPda = (user: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.OUTPOST_ACCOUNT), user.toBuffer()],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveUserPretokenRecordPda = (user: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.USER_PRETOKEN_RECORD), user.toBuffer()],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveTrancheStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.TRANCHE_STATE)],\n LIQSOL_CORE,\n )[0];\n\nexport const derivePriceHistoryPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.PRICE_HISTORY)],\n LIQSOL_CORE,\n )[0];\n\n/**\n * BAR (bonded actor roles)\n */\n\nexport const deriveBarConfigPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.BAR_STATE_SEED)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveBondLevelPda = (bondLevelId: number[]) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.BOND_LEVEL_SEED), Buffer.from(bondLevelId)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveBondedActorPda = (actor: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.BONDED_ACTOR_SEED), actor.toBuffer()],\n LIQSOL_CORE,\n )[0];\n\n/**\n * SPL Transfer-hook: extra-account-metas PDA for the liqSOL mint.\n */\nexport const deriveExtraAccountMetaListPda = (liqsolMint: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.EXTRA_ACCOUNT_METAS), liqsolMint.toBuffer()],\n PROGRAM_IDS.TRANSFER_HOOK,\n )[0];\n\n/**\n * Ephemeral stake account address used per-deposit.\n * On-chain convention: seed = `ephemeral_<u32>` under StakeProgram.programId.\n */\nexport const deriveEphemeralStakeAddress = async (\n user: PublicKey,\n seed: number,\n): Promise<PublicKey> => {\n const seedStr = `ephemeral_${seed}`;\n return PublicKey.createWithSeed(user, seedStr, StakeProgram.programId);\n};\n\n/**\n * Constant keys (Chainlink)\n */\nexport const CHAINLINK_FEED = new PublicKey(\n '99B2bTijsU6f1GCT73HmdR7HCFFjGMBcPZY6jZ96ynrR',\n);\nexport const CHAINLINK_PROGRAM = new PublicKey(\n 'HEvSKofvBgfaexv23kMabbYqxasxU3mQ4ibBMEmJWHny',\n);\n\n/**\n * ---------------------------------------------------------------------------\n * ECONOMICS & MATH CONSTANTS\n * ---------------------------------------------------------------------------\n */\n\n// Same scale factor used on-chain for pay-rate math\nexport const PAY_RATE_SCALE_FACTOR = BigInt(1_000_000_000_000); // 10^12\n\n// Default pay rate fallback used in tests & utils\nexport const DEFAULT_AVERAGE_PAY_RATE = BigInt(191_780_821);\n\n// How many history entries to average when computing expected fee\nexport const DEFAULT_PAY_RATE_LOOKBACK = 5;\n\n// Rent exemption for ephemeral stake account (lamports)\nexport const EPHEMERAL_RENT_EXEMPTION = 2_282_880;\n\n// For convenience: lamports <-> SOL helpers (no RPC dependency)\nexport const LAMPORTS_PER_SOL = 1_000_000_000;\n\nexport const INDEX_SCALE = BigInt(1_000_000_000_000); // 1e12\n\nexport const lamportsToSol = (lamports: number | bigint): number =>\n Number(lamports) / LAMPORTS_PER_SOL;\n\nexport const solToLamports = (sol: number): bigint =>\n BigInt(Math.round(sol * LAMPORTS_PER_SOL));","import { AnchorProvider, Program } from '@coral-xyz/anchor';\n\nimport liqsolCoreJson from '../../assets/solana/idl/liqsol_core.json';\nimport liqsolTokenJson from '../../assets/solana/idl/liqsol_token.json';\nimport validatorLeaderboardJson from '../../assets/solana/idl/validator_leaderboard.json';\n\nimport type { LiqsolCore } from '../../assets/solana/types/liqsol_core';\nimport type { LiqsolToken } from '../../assets/solana/types/liqsol_token';\nimport type { ValidatorLeaderboard } from '../../assets/solana/types/validator_leaderboard';\n\nimport { PROGRAM_IDS } from './constants';\n\ntype Entry<IDL> = {\n idl: IDL & { address: string };\n address: string;\n};\n\nconst PROGRAMS = {\n liqsolCore: {\n idl: liqsolCoreJson,\n address: PROGRAM_IDS.LIQSOL_CORE.toBase58(),\n } as Entry<LiqsolCore>,\n liqsolToken: {\n idl: liqsolTokenJson,\n address: PROGRAM_IDS.LIQSOL_TOKEN.toBase58(),\n } as Entry<LiqsolToken>,\n validatorLeaderboard: {\n idl: validatorLeaderboardJson,\n address: PROGRAM_IDS.VALIDATOR_LEADERBOARD.toBase58(),\n } as Entry<ValidatorLeaderboard>,\n} as const;\n\nexport type SolanaProgramName = keyof typeof PROGRAMS;\n\nexport class SolanaProgramService {\n constructor(private provider: AnchorProvider) { }\n\n getProgram<K extends SolanaProgramName>(name: K): Program<(typeof PROGRAMS)[K]['idl']> {\n const { idl, address } = PROGRAMS[name];\n const idlWithAddr = { ...idl, address };\n return new Program(idlWithAddr, this.provider) as Program<(typeof PROGRAMS)[K]['idl']>;\n }\n\n listProgramNames(): SolanaProgramName[] {\n return Object.keys(PROGRAMS) as SolanaProgramName[];\n }\n}","import { AnchorProvider, BN, Program } from '@coral-xyz/anchor';\nimport {\n SystemProgram,\n Transaction,\n TransactionInstruction,\n StakeProgram,\n SYSVAR_INSTRUCTIONS_PUBKEY,\n SYSVAR_CLOCK_PUBKEY,\n SYSVAR_RENT_PUBKEY,\n SYSVAR_STAKE_HISTORY_PUBKEY,\n} from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddressSync,\n} from '@solana/spl-token';\n\nimport { SolanaProgramService } from '../program';\nimport type { LiqsolCore } from '../../../assets/solana/types/liqsol_core';\n\nimport {\n PROGRAM_IDS,\n deriveDepositAuthorityPda,\n deriveLiqsolMintPda,\n deriveLiqsolMintAuthorityPda,\n deriveReservePoolPda,\n deriveVaultPda,\n deriveStakeControllerStatePda,\n derivePayoutStatePda,\n deriveBucketAuthorityPda,\n derivePayRateHistoryPda,\n deriveDistributionStatePda,\n deriveUserRecordPda,\n deriveEphemeralStakeAddress,\n deriveWithdrawGlobalPda,\n deriveStakeAllocationStatePda,\n deriveStakeMetricsPda,\n deriveMaintenanceLedgerPda,\n deriveWithdrawMintAuthorityPda,\n deriveWithdrawMintMetadataPda,\n deriveWithdrawNftMintPda,\n deriveLiqReceiptDataPda,\n deriveGlobalConfigPda,\n} from '../constants';\nimport { WalletLike } from '../types';\n\nexport class DepositClient {\n private program: Program<LiqsolCore>;\n\n get wallet(): WalletLike {\n return this.provider.wallet;\n }\n\n constructor(private provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('liqsolCore');\n }\n\n /**\n * Build a deposit transaction:\n * SOL -> liqSOL via liqsol_core::deposit.\n */\n async buildDepositTx(\n amount: bigint,\n user = this.wallet.publicKey,\n ): Promise<Transaction> {\n if (!user) {\n throw new Error(\n 'DepositClient.buildDepositTx: wallet not connected',\n );\n }\n if (!amount || amount <= BigInt(0)) {\n throw new Error(\n 'DepositClient.buildDepositTx: amount must be greater than zero.',\n );\n }\n\n // -------------------------------------------------------------\n // PDAs\n // -------------------------------------------------------------\n const depositAuthority = deriveDepositAuthorityPda();\n const liqsolMint = deriveLiqsolMintPda();\n const liqsolMintAuthority = deriveLiqsolMintAuthorityPda();\n const reservePool = deriveReservePoolPda();\n const vault = deriveVaultPda();\n const controllerState = deriveStakeControllerStatePda();\n const payoutState = derivePayoutStatePda();\n const bucketAuthority = deriveBucketAuthorityPda();\n const payRateHistory = derivePayRateHistoryPda();\n const globalConfig = deriveGlobalConfigPda();\n\n // -------------------------------------------------------------\n // Token-2022 ATAs\n // -------------------------------------------------------------\n const userAta = getAssociatedTokenAddressSync(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n // -------------------------------------------------------------\n // Distribution state + user_record (KEYED BY TOKEN ACCOUNT)\n // -------------------------------------------------------------\n const distributionState = deriveDistributionStatePda();\n const userRecord = deriveUserRecordPda(userAta);\n\n const bucketTokenAccount = getAssociatedTokenAddressSync(\n liqsolMint,\n bucketAuthority,\n true,\n TOKEN_2022_PROGRAM_ID,\n );\n\n // -------------------------------------------------------------\n // Ephemeral stake\n // -------------------------------------------------------------\n const seed = Math.floor(Math.random() * 2 ** 32);\n const ephemeralStake = await deriveEphemeralStakeAddress(user, seed);\n\n // -------------------------------------------------------------\n // BUILD IX (MUST MATCH IDL)\n // -------------------------------------------------------------\n const ix: TransactionInstruction = await this.program.methods\n .deposit(new BN(amount.toString()), seed)\n .accounts({\n user,\n depositAuthority,\n systemProgram: SystemProgram.programId,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n liqsolProgram: PROGRAM_IDS.LIQSOL_TOKEN,\n stakeProgram: StakeProgram.programId,\n liqsolMint,\n userAta,\n liqsolMintAuthority,\n reservePool,\n vault,\n ephemeralStake,\n controllerState,\n payoutState,\n bucketAuthority,\n bucketTokenAccount,\n userRecord,\n distributionState,\n payRateHistory,\n instructionsSysvar: SYSVAR_INSTRUCTIONS_PUBKEY,\n clock: SYSVAR_CLOCK_PUBKEY,\n stakeHistory: SYSVAR_STAKE_HISTORY_PUBKEY,\n rent: SYSVAR_RENT_PUBKEY,\n globalConfig\n })\n .instruction();\n\n return new Transaction().add(ix);\n }\n\n /**\n * Build a withdraw-request transaction:\n * liqSOL -> SOL via liqsol_core::requestWithdraw.\n *\n * This:\n * - burns liqSOL from the user\n * - increments totalEncumberedFunds in global state\n * - mints an NFT receipt (liqReceiptData + NFT ATA for owner)\n */\n async buildWithdrawTx(\n amount: bigint,\n user = this.wallet.publicKey,\n ): Promise<Transaction> {\n if (!user) {\n throw new Error(\n 'DepositClient.buildWithdrawTx: wallet not connected',\n );\n }\n if (!amount || amount <= BigInt(0)) {\n throw new Error(\n 'DepositClient.buildWithdrawTx: amount must be greater than zero.',\n );\n }\n\n // -------------------------------------------------------------\n // Core program + liqSOL mint / user ATA\n // -------------------------------------------------------------\n const liqsolMint = deriveLiqsolMintPda();\n\n const userAta = getAssociatedTokenAddressSync(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n // Distribution / balance-tracking\n // user_record is keyed by the user’s liqSOL ATA (same convention as deposit/purchase)\n const userRecord = deriveUserRecordPda(userAta);\n const distributionState = deriveDistributionStatePda();\n\n // Reserve + stake controller PDAs\n const global = deriveWithdrawGlobalPda();\n const reservePool = deriveReservePoolPda();\n const stakeAllocationState = deriveStakeAllocationStatePda();\n const stakeMetrics = deriveStakeMetricsPda();\n const maintenanceLedger = deriveMaintenanceLedgerPda();\n const globalConfig = deriveGlobalConfigPda();\n\n // -------------------------------------------------------------\n // Need nextReceiptId from withdraw global state\n // -------------------------------------------------------------\n const globalState = await this.program.account.global.fetch(global);\n const receiptId = (globalState.nextReceiptId as BN).toBigInt();\n\n // -------------------------------------------------------------\n // NFT receipt PDAs (mint, metadata, data, ATA)\n // -------------------------------------------------------------\n const mintAuthority = deriveWithdrawMintAuthorityPda();\n const metadata = deriveWithdrawMintMetadataPda();\n\n const nftMint = deriveWithdrawNftMintPda(receiptId);\n const receiptData = deriveLiqReceiptDataPda(nftMint);\n\n const owner = user;\n const nftAta = getAssociatedTokenAddressSync(\n nftMint,\n owner,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n // Bucket token account (same bucket used by deposit/distribution)\n const bucketAuthority = deriveBucketAuthorityPda();\n const bucketTokenAccount = getAssociatedTokenAddressSync(\n liqsolMint,\n bucketAuthority,\n true,\n TOKEN_2022_PROGRAM_ID,\n );\n\n // -------------------------------------------------------------\n // BUILD IX (MUST MATCH requestWithdraw IDL)\n // -------------------------------------------------------------\n const ix: TransactionInstruction = await this.program.methods\n .requestWithdraw(new BN(amount.toString()))\n .accounts({\n user,\n owner,\n global,\n liqsolMint,\n userAta,\n userRecord,\n reservePool,\n stakeAllocationState,\n stakeMetrics,\n maintenanceLedger,\n clock: SYSVAR_CLOCK_PUBKEY,\n mintAuthority,\n receiptData,\n metadata,\n nftMint,\n nftAta,\n distributionState,\n bucketTokenAccount,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n tokenInterface: TOKEN_2022_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n rent: SYSVAR_RENT_PUBKEY,\n globalConfig\n })\n .instruction();\n\n return new Transaction().add(ix);\n }\n}","import { AnchorProvider, Program, BN } from '@coral-xyz/anchor';\nimport { PublicKey } from '@solana/web3.js';\n\nimport { SolanaProgramService } from '../program';\nimport type { LiqsolCore } from '../../../assets/solana/types/liqsol_core';\nimport {\n deriveDistributionStatePda,\n deriveGlobalConfigPda,\n deriveLiqsolMintPda,\n derivePayRateHistoryPda,\n deriveUserRecordPda,\n} from '../constants';\nimport type { DistributionState, DistributionUserRecord, GlobalConfig, PayRateHistory } from '../types';\nimport { getAssociatedTokenAddressSync, TOKEN_2022_PROGRAM_ID } from '@solana/spl-token';\n\n/**\n * Distribution client – wraps the distribution portion of the liqsol_core\n * program in the *new* shares-only model.\n *\n * Responsibilities:\n * - Read DistributionState (global index/share pool)\n * - Read per-user UserRecord (shares)\n * - Provide simple helpers for querying user share positions\n *\n * There is no longer any notion of:\n * - tracked vs actual balances\n * - mismatch candidates\n * - updateUser / correct-&-register flow\n *\n * On-chain truth:\n * - User balances live in their liqSOL ATA.\n * - DistributionState + UserRecord track *shares* for yield.\n */\nexport class DistributionClient {\n private program: Program<LiqsolCore>;\n\n constructor(private provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('liqsolCore');\n }\n\n get connection() {\n return this.provider.connection;\n }\n\n /**\n * Fetch the global distribution state account.\n *\n * IDL account name: \"distributionState\"\n */\n async getDistributionState(): Promise<DistributionState | null> {\n const pda = deriveDistributionStatePda();\n try {\n return await this.program.account.distributionState.fetch(pda);\n } catch {\n return null;\n }\n }\n\n\n /**\n * Fetch the global payRateHistory account (circular buffer of scaled pay rates).\n *\n * IDL account name: \"payRateHistory\"\n */\n async getPayRateHistory(): Promise<PayRateHistory | null> {\n const pda = derivePayRateHistoryPda();\n try {\n // Anchor types map directly onto our PayRateHistory TS type\n return (await this.program.account.payRateHistory.fetch(\n pda,\n )) as PayRateHistory;\n } catch {\n return null;\n }\n }\n\n /**\n * Fetch the globalConfig account (contains depositFeeMultiplier, etc).\n *\n * IDL account name: \"globalConfig\"\n */\n async getGlobalConfig(): Promise<GlobalConfig | null> {\n const pda = deriveGlobalConfigPda();\n try {\n return (await this.program.account.globalConfig.fetch(\n pda,\n ));\n } catch {\n return null;\n }\n }\n /**\n * Fetch a user's distribution userRecord (or null if missing).\n *\n * IDL account name: \"userRecord\"\n */\n async getUserRecord(\n ownerOrAta: PublicKey,\n ): Promise<DistributionUserRecord | null> {\n const liqsolMint = deriveLiqsolMintPda();\n\n // 1) Try treating ownerOrAta as a WALLET: derive its liqSOL ATA, then userRecord.\n try {\n const ata = getAssociatedTokenAddressSync(\n liqsolMint,\n ownerOrAta,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n const pdaFromWallet = deriveUserRecordPda(ata);\n const recFromWallet =\n await this.program.account.userRecord.fetchNullable(pdaFromWallet);\n if (recFromWallet) {\n return recFromWallet;\n }\n } catch {\n // fall through\n }\n\n // 2) Fallback: treat ownerOrAta as already being the TOKEN ACCOUNT.\n try {\n const pdaFromAta = deriveUserRecordPda(ownerOrAta);\n return await this.program.account.userRecord.fetchNullable(pdaFromAta);\n } catch {\n return null;\n }\n }\n\n /**\n * Convenience: get the user's current distribution shares.\n *\n * Returns BN(0) if the user has no userRecord yet.\n */\n async getUserShares(user: PublicKey): Promise<BN> {\n const record = await this.getUserRecord(user);\n return record ? record.shares : new BN(0);\n }\n\n /**\n * Convenience: get both the user's shares and totalShares, plus a\n * floating-point ratio (userShares / totalShares).\n *\n * NOTE: ratio is a JS number and may lose precision for very large values,\n * but is fine for display / percentage UIs.\n */\n async getUserSharePosition(user: PublicKey): Promise<{\n shares: BN;\n totalShares: BN;\n ratio: number;\n }> {\n const [dist, userShares] = await Promise.all([\n this.getDistributionState(),\n this.getUserShares(user),\n ]);\n\n const totalShares = dist ? dist.totalShares : new BN(0);\n\n let ratio = 0;\n if (!totalShares.isZero()) {\n // use toNumber() for UI-friendly ratio; if you need exact math,\n // do it with BN or bigint at the call site instead.\n ratio = userShares.toNumber() / totalShares.toNumber();\n }\n\n return { shares: userShares, totalShares, ratio };\n }\n}","import { AnchorProvider, Program } from '@coral-xyz/anchor';\nimport { PublicKey } from '@solana/web3.js';\n\nimport { SolanaProgramService } from '../program';\nimport type { ValidatorLeaderboard } from '../../../assets/solana/types/validator_leaderboard';\nimport {\n deriveLeaderboardStatePda,\n deriveValidatorRecordPda,\n} from '../constants';\nimport { LeaderboardState, ValidatorRecord } from '../types';\n\n/**\n * Simple read client for the validator_leaderboard program.\n *\n * Adjust account names/fields to match your IDL (state, validatorRecord, etc).\n */\nexport class LeaderboardClient {\n private program: Program<ValidatorLeaderboard>;\n\n constructor(private provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('validatorLeaderboard');\n }\n\n async getState(): Promise<LeaderboardState | null> {\n const pda = deriveLeaderboardStatePda();\n try {\n // Assumes account name \"leaderboardState\"\n return await this.program.account.leaderboardState.fetch(pda);\n } catch {\n return null;\n }\n }\n\n async getValidatorRecord(voteAccount: PublicKey): Promise<ValidatorRecord | null> {\n const pda = deriveValidatorRecordPda(voteAccount);\n try {\n // Assumes account name \"validatorRecord\"\n return await this.program.account.validatorRecord.fetchNullable(pda);\n } catch {\n return null;\n }\n }\n\n /**\n * Convenience helper to fetch and return top validators ordered\n * by the on-chain leaderboard scores.\n *\n * Uses:\n * - `leaderboardState.scores`\n * - `leaderboardState.sortedIndices`\n * - `validatorRecord.registryIndex`\n *\n * Fallback: if leaderboardState can't be fetched, we sort by\n * `creditsObserved` descending.\n */\n async getTopValidators(limit = 20): Promise<ValidatorRecord[]> {\n // Try to use the leaderboard state first\n try {\n const leaderboardPda = deriveLeaderboardStatePda();\n const leaderboard: LeaderboardState \n = await this.program.account.leaderboardState.fetch(leaderboardPda);\n\n const all = await this.program.account.validatorRecord.all();\n const byIndex = new Map<number, ValidatorRecord>();\n\n for (const r of all) {\n const vr = r.account;\n byIndex.set(vr.registryIndex, vr);\n }\n\n const max = Math.min(\n limit,\n leaderboard.numValidators,\n leaderboard.sortedIndices.length,\n );\n\n const top: ValidatorRecord[] = [];\n for (let i = 0; i < max; i++) {\n const idx = leaderboard.sortedIndices[i];\n const rec = byIndex.get(idx);\n if (rec) {\n top.push(rec);\n }\n }\n\n return top;\n } catch (e) {\n // Fallback: no leaderboardState available, sort by creditsObserved.\n const all = await this.program.account.validatorRecord.all();\n\n all.sort((a, b) => {\n const va = a.account;\n const vb = b.account;\n const ca = va.creditsObserved;\n const cb = vb.creditsObserved;\n // BN.cmp: -1 if a < b, 0 if equal, 1 if a > b\n return cb.cmp(ca);\n });\n\n return all.slice(0, limit).map(r => r.account);\n }\n }\n}","import { Program, BN, AnchorProvider } from '@coral-xyz/anchor';\n\nimport {\n Connection,\n Keypair,\n PublicKey,\n SystemProgram,\n StakeProgram,\n} from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddress,\n} from '@solana/spl-token';\n\nimport {\n LIQSOL_CORE,\n LIQSOL_TOKEN,\n PAY_RATE_SCALE_FACTOR,\n DEFAULT_AVERAGE_PAY_RATE,\n EPHEMERAL_RENT_EXEMPTION,\n LAMPORTS_PER_SOL,\n lamportsToSol,\n solToLamports,\n deriveDepositAuthorityPda,\n deriveLiqsolMintPda,\n deriveLiqsolMintAuthorityPda,\n deriveVaultPda,\n deriveReservePoolPda,\n deriveStakeControllerStatePda,\n derivePayoutStatePda,\n deriveBucketAuthorityPda,\n deriveDistributionStatePda,\n deriveUserRecordPda,\n derivePayRateHistoryPda,\n deriveStakeControllerVaultPda,\n deriveEphemeralStakeAddress,\n DEFAULT_PAY_RATE_LOOKBACK,\n deriveOutpostGlobalStatePda,\n deriveOutpostPoolAuthorityPda,\n deriveOutpostAccountPda,\n deriveTrancheStatePda,\n deriveUserPretokenRecordPda,\n CHAINLINK_FEED,\n CHAINLINK_PROGRAM,\n deriveExtraAccountMetaListPda,\n} from './constants';\n\nimport liqsolCoreIDL from '../../assets/solana/idl/liqsol_core.json';\nimport { LiqsolCore } from '../../assets/solana/types/liqsol_core';\nimport { GlobalState, TrancheState } from './types';\nimport { TrancheLadderItem, TrancheSnapshot } from '../../types';\nimport { ChainID } from '@wireio/core';\n\n// -----------------------------------------------------------------------------\n// Tranche Support\n// -----------------------------------------------------------------------------\n\nconst INDEX_SCALE = BigInt(1_000_000_000_000); // 1e12\nconst USD_SCALE = BigInt(100_000_000); // 1e8\nconst BPS = BigInt(10_000);\n\n/** BN | bigint -> bigint helper (keeps code readable) */\nexport function toBigint(x: any): bigint {\n if (typeof x === 'bigint') return x;\n if (typeof x === 'number') return BigInt(x);\n // Anchor BN\n return BigInt(x.toString());\n}\n\n/**\n * Convert token amount -> shares using the same rule as on-chain tests:\n * shares = ceil(amount * INDEX_SCALE / currentIndex)\n */\nexport function tokensToShares(amount: bigint, currentIndex: bigint): bigint {\n if (amount === BigInt(0)) return BigInt(0);\n const num = amount * INDEX_SCALE;\n const q = num / currentIndex;\n const r = num % currentIndex;\n return r === BigInt(0) ? q : q + BigInt(1);\n}\n\n/**\n * Apply one forward growth step: value * (BPS + growthBps) / BPS.\n * Simple integer round-half-up.\n */\nfunction growOnce(value: bigint, growthBps: number): bigint {\n const g = BigInt(growthBps);\n return (value * (BPS + g) + BPS / BigInt(2)) / BPS;\n}\n\n/**\n * Apply one backward step: value * BPS / (BPS + growthBps).\n * Also integer round-half-up.\n */\nfunction shrinkOnce(value: bigint, growthBps: number): bigint {\n const g = BigInt(growthBps);\n return (value * BPS + (BPS + g) / BigInt(2)) / (BPS + g);\n}\n\n/**\n * Build a local tranche ladder around the current tranche\n * using only on-chain config + current state.\n *\n * Rules (from liqsol_core tests):\n * - past tranches are fully sold\n * - current tranche has (initial - currentSupply) sold\n * - future tranches start with 0 sold\n * - supply/price grow by supplyGrowthBps/priceGrowthBps per tranche\n */\nexport function buildSolanaTrancheLadder(options: {\n currentTranche: number;\n initialTrancheSupply: bigint;\n currentTrancheSupply: bigint;\n currentPriceUsd: bigint;\n supplyGrowthBps: number;\n priceGrowthBps: number;\n windowBefore?: number;\n windowAfter?: number;\n}): TrancheLadderItem[] {\n const {\n currentTranche,\n initialTrancheSupply,\n currentTrancheSupply,\n currentPriceUsd,\n supplyGrowthBps,\n priceGrowthBps,\n windowBefore = 5,\n windowAfter = 5,\n } = options;\n\n const startId = Math.max(0, currentTranche - windowBefore);\n const endId = currentTranche + windowAfter;\n\n const capacity = new Map<number, bigint>();\n const price = new Map<number, bigint>();\n\n // Seed current\n capacity.set(currentTranche, initialTrancheSupply);\n price.set(currentTranche, currentPriceUsd);\n\n // Forward (future tranches)\n for (let id = currentTranche + 1; id <= endId; id++) {\n const prevCap = capacity.get(id - 1)!;\n const prevPrice = price.get(id - 1)!;\n capacity.set(id, growOnce(prevCap, supplyGrowthBps));\n price.set(id, growOnce(prevPrice, priceGrowthBps));\n }\n\n // Backward (past tranches)\n for (let id = currentTranche - 1; id >= startId; id--) {\n const nextCap = capacity.get(id + 1)!;\n const nextPrice = price.get(id + 1)!;\n capacity.set(id, shrinkOnce(nextCap, supplyGrowthBps));\n price.set(id, shrinkOnce(nextPrice, priceGrowthBps));\n }\n\n const ladder: TrancheLadderItem[] = [];\n for (let id = startId; id <= endId; id++) {\n const cap = capacity.get(id)!;\n let sold: bigint;\n if (id < currentTranche) {\n sold = cap;\n } else if (id === currentTranche) {\n sold = cap - currentTrancheSupply;\n } else {\n sold = BigInt(0);\n }\n\n ladder.push({\n id,\n capacity: cap,\n sold,\n remaining: cap - sold,\n priceUsd: price.get(id)!,\n });\n }\n\n return ladder;\n}\n\n/**\n * Turn raw liqsol_core accounts into a chain-agnostic TrancheSnapshot for SOL.\n * All math stays here; TokenClient just wires accounts + connection.\n */\nexport function buildSolanaTrancheSnapshot(options: {\n chainID: ChainID;\n globalState: GlobalState;\n trancheState: TrancheState;\n solPriceUsd?: bigint;\n nativePriceTimestamp?: number;\n ladderWindowBefore?: number;\n ladderWindowAfter?: number;\n}): TrancheSnapshot {\n const {\n chainID,\n globalState,\n trancheState,\n solPriceUsd,\n nativePriceTimestamp,\n ladderWindowBefore,\n ladderWindowAfter,\n } = options;\n\n const currentIndex = toBigint(globalState.currentIndex);\n const totalShares = toBigint(globalState.totalShares);\n const currentTranche = trancheState.currentTrancheNumber.toNumber();\n const currentTrancheSupply = toBigint(trancheState.currentTrancheSupply);\n const initialTrancheSupply = toBigint(trancheState.initialTrancheSupply);\n const totalPretokensSold = toBigint(trancheState.totalPretokensSold);\n const currentPriceUsd = toBigint(trancheState.currentTranchePriceUsd);\n const supplyGrowthBps = trancheState.supplyGrowthBps;\n const priceGrowthBps = trancheState.priceGrowthBps;\n\n const ladder = buildSolanaTrancheLadder({\n currentTranche,\n initialTrancheSupply,\n currentTrancheSupply,\n currentPriceUsd,\n supplyGrowthBps,\n priceGrowthBps,\n windowBefore: ladderWindowBefore,\n windowAfter: ladderWindowAfter,\n });\n\n return {\n chainID,\n currentIndex,\n totalShares,\n currentTranche,\n currentPriceUsd,\n supplyGrowthBps,\n priceGrowthBps,\n totalPretokensSold,\n currentTrancheSupply,\n initialTrancheSupply,\n nativePriceUsd: solPriceUsd,\n nativePriceTimestamp,\n ladder,\n };\n}\n\n\n// -----------------------------------------------------------------------------\n// Read-only liqsol_core Program helper\n// -----------------------------------------------------------------------------\n\nlet _liqsolCoreProgram: Program<LiqsolCore> | null = null;\n\nexport function getLiqsolCoreProgram(\n connection: Connection,\n): Program<LiqsolCore> {\n if (_liqsolCoreProgram && _liqsolCoreProgram.provider.connection === connection) {\n return _liqsolCoreProgram;\n }\n\n // Dummy wallet – we're only doing read-only account fetches here.\n const tmpKeypair = Keypair.generate();\n const wallet: any = {\n publicKey: tmpKeypair.publicKey,\n signAllTransactions: async () => [],\n signTransaction: async () => tmpKeypair,\n };\n\n const provider = new AnchorProvider(connection, wallet, {\n commitment: 'confirmed',\n });\n\n const program = new Program(\n liqsolCoreIDL,\n provider,\n ) as Program<LiqsolCore>;\n\n _liqsolCoreProgram = program;\n return program;\n}\n\n\n// -----------------------------------------------------------------------------\n// Balance + state getters (UI-friendly)\n// -----------------------------------------------------------------------------\n\nexport async function getUserLiqSolBalance(\n connection: Connection,\n user: PublicKey,\n): Promise<number> {\n const liqsolMint = deriveLiqsolMintPda();\n const ata = await getAssociatedTokenAddress(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n try {\n const bal = await connection.getTokenAccountBalance(ata);\n return Number(bal.value.amount); // raw lamports, not decimals-adjusted\n } catch {\n return 0;\n }\n}\n\nexport async function getBucketLiqSolBalance(\n connection: Connection,\n): Promise<number> {\n const liqsolMint = deriveLiqsolMintPda();\n const bucketAuthority = deriveBucketAuthorityPda();\n const ata = await getAssociatedTokenAddress(\n liqsolMint,\n bucketAuthority,\n true,\n TOKEN_2022_PROGRAM_ID,\n );\n\n try {\n const bal = await connection.getTokenAccountBalance(ata);\n return Number(bal.value.amount);\n } catch {\n return 0;\n }\n}\n\nexport async function getReservePoolBalance(\n connection: Connection,\n): Promise<number> {\n const reservePool = deriveReservePoolPda();\n try {\n const lamports = await connection.getBalance(reservePool);\n return lamports;\n } catch {\n return 0;\n }\n}\n\n/**\n * Raw account info for the stake_controller state (Anchor decode is left\n * to the caller so the SDK can stay IDL-agnostic at this layer).\n */\nexport async function getStakeControllerStateRaw(\n connection: Connection,\n): Promise<Uint8Array | null> {\n const pda = deriveStakeControllerStatePda();\n const info = await connection.getAccountInfo(pda);\n return info?.data ?? null;\n}\n\n/**\n * Raw account info for the payout-state account.\n */\nexport async function getPayoutStateRaw(\n connection: Connection,\n): Promise<Uint8Array | null> {\n const pda = derivePayoutStatePda();\n const info = await connection.getAccountInfo(pda);\n return info?.data ?? null;\n}\n\n/**\n * Raw account info for a user's distribution user_record.\n *\n * NOTE: user_record is keyed by the TOKEN ACCOUNT (ATA), not the wallet.\n * Here we derive the user's liqSOL ATA and then its user_record PDA.\n */\nexport async function getUserRecordRaw(\n connection: Connection,\n user: PublicKey,\n): Promise<Uint8Array | null> {\n const liqsolMint = deriveLiqsolMintPda();\n const userAta = await getAssociatedTokenAddress(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n const pda = deriveUserRecordPda(userAta);\n const info = await connection.getAccountInfo(pda);\n return info?.data ?? null;\n}\n\n\n// -----------------------------------------------------------------------------\n// Pay-rate & fee utilities (on-chain compatible)\n// -----------------------------------------------------------------------------\n\nexport async function getAveragePayRate(\n connection: Connection,\n lookback: number = DEFAULT_PAY_RATE_LOOKBACK,\n): Promise<bigint> {\n const program = getLiqsolCoreProgram(connection);\n const payRateHistoryPda = derivePayRateHistoryPda();\n\n try {\n const anyProgram = program;\n const payRateHistoryAccount = await anyProgram.account.payRateHistory.fetch(\n payRateHistoryPda,\n );\n\n const entries = payRateHistoryAccount.entries ?? [];\n const totalEntriesAdded = Number(\n payRateHistoryAccount.totalEntriesAdded ?? 0,\n );\n const currentIndex: number = payRateHistoryAccount.currentIndex ?? 0;\n const maxEntries: number =\n payRateHistoryAccount.maxEntries ?? entries.length;\n\n if (!entries.length) {\n return DEFAULT_AVERAGE_PAY_RATE;\n }\n\n const entriesToFetch = Math.min(lookback, maxEntries, entries.length);\n\n let idx: number;\n if (totalEntriesAdded === 0) {\n idx = 0;\n } else if (currentIndex === 0) {\n idx = maxEntries - 1;\n } else {\n idx = currentIndex - 1;\n }\n\n let sum = BigInt(0);\n let validCount = BigInt(0);\n\n for (let i = 0; i < entriesToFetch; i++) {\n const entry = entries[idx];\n if (entry && typeof entry.scaledRate !== 'undefined') {\n const rate = BigInt(entry.scaledRate.toString());\n if (rate > BigInt(0)) {\n sum += rate;\n validCount += BigInt(1);\n }\n }\n\n if (totalEntriesAdded === 0) {\n idx = (idx + 1) % maxEntries;\n } else {\n idx = idx === 0 ? maxEntries - 1 : idx - 1;\n }\n }\n\n if (validCount === BigInt(0)) {\n return DEFAULT_AVERAGE_PAY_RATE;\n }\n\n return sum / validCount;\n } catch (err) {\n // Fallback to default when history missing/unavailable\n return DEFAULT_AVERAGE_PAY_RATE;\n }\n}\n\n/**\n * On-chain fee formula:\n * fee = (average_pay_rate * 4 * deposit_amount_lamports) / 10^12\n */\nexport function calculateExpectedFee(\n depositAmountLamports: BN,\n averagePayRate: BN,\n): BN {\n return averagePayRate\n .mul(new BN(4))\n .mul(depositAmountLamports)\n .div(new BN(1_000_000_000_000)); // 10^12\n}\n\n/**\n * Convenience helper to preview how a deposit splits between user + bucket\n * and how much goes into the reserve, assuming the simple model:\n *\n * - userLiqSol = amount - fee + EPHEMERAL_RENT_EXEMPTION\n * - bucketLiqSol = fee\n * - reserveLamports = amount + EPHEMERAL_RENT_EXEMPTION\n */\nexport function previewDepositEffects(params: {\n depositAmountLamports: BN;\n averagePayRate: BN;\n rentExemptionLamports?: number;\n}): {\n feeLamports: BN;\n userLiqSolLamports: BN;\n bucketLiqSolLamports: BN;\n reserveIncreaseLamports: BN;\n} {\n const { depositAmountLamports, averagePayRate } = params;\n const rent = new BN(\n params.rentExemptionLamports ?? EPHEMERAL_RENT_EXEMPTION,\n );\n\n const fee = calculateExpectedFee(depositAmountLamports, averagePayRate);\n const userLiqSol = depositAmountLamports.sub(fee).add(rent);\n const bucketLiqSol = fee;\n const reserveIncrease = depositAmountLamports.add(rent);\n\n return {\n feeLamports: fee,\n userLiqSolLamports: userLiqSol,\n bucketLiqSolLamports: bucketLiqSol,\n reserveIncreaseLamports: reserveIncrease,\n };\n}\n\n/**\n * ---------------------------------------------------------------------------\n * Outpost-specific helpers\n * ---------------------------------------------------------------------------\n *\n * This is the SDK equivalent of `deriveWirePdas` in capital-staking tests.\n * It aggregates all PDAs / ATAs needed for Outpost pretokens + synd/desynd.\n */\nexport interface OutpostAccounts {\n user: PublicKey;\n\n // Outpost / pretoken wiring\n globalState: PublicKey;\n poolAuthority: PublicKey;\n liqsolMint: PublicKey;\n liqsolPoolAta: PublicKey;\n userAta: PublicKey;\n outpostAccount: PublicKey;\n userPretokenRecord: PublicKey;\n\n // Distribution / yield context (user_record keyed by token accounts)\n distributionState: PublicKey;\n bucketAuthority: PublicKey;\n bucketTokenAccount: PublicKey;\n bucketUserRecord: PublicKey;\n liqsolPoolUserRecord: PublicKey;\n userUserRecord: PublicKey;\n\n // Tranche / pricing\n trancheState: PublicKey;\n\n // Chainlink\n chainLinkFeed: PublicKey;\n chainLinkProgram: PublicKey;\n\n // Transfer hook extra accounts\n extraAccountMetaList: PublicKey;\n}\n\nexport async function buildOutpostAccounts(\n connection: Connection,\n user: PublicKey,\n): Promise<OutpostAccounts> {\n const globalState = deriveOutpostGlobalStatePda();\n const poolAuthority = deriveOutpostPoolAuthorityPda();\n const liqsolMint = deriveLiqsolMintPda();\n const distributionState = deriveDistributionStatePda();\n const bucketAuthority = deriveBucketAuthorityPda();\n const trancheState = deriveTrancheStatePda();\n\n // Outpost / pretoken PDAs\n const outpostAccount = deriveOutpostAccountPda(user);\n const userPretokenRecord = deriveUserPretokenRecordPda(user);\n\n // ATAs\n const liqsolPoolAta = await getAssociatedTokenAddress(\n liqsolMint,\n poolAuthority,\n true,\n TOKEN_2022_PROGRAM_ID,\n );\n\n const bucketTokenAccount = await getAssociatedTokenAddress(\n liqsolMint,\n bucketAuthority,\n true,\n TOKEN_2022_PROGRAM_ID,\n );\n\n const userAta = await getAssociatedTokenAddress(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n // user_record PDAs keyed by TOKEN ACCOUNTS (matches capital-staking)\n const bucketUserRecord = deriveUserRecordPda(bucketTokenAccount);\n const liqsolPoolUserRecord = deriveUserRecordPda(liqsolPoolAta);\n const userUserRecord = deriveUserRecordPda(userAta);\n\n const extraAccountMetaList = deriveExtraAccountMetaListPda(liqsolMint);\n\n // Chainlink program feeds\n let chainLinkFeed = CHAINLINK_FEED;\n let chainLinkProgram = CHAINLINK_PROGRAM;\n\n try {\n const program = getLiqsolCoreProgram(connection);\n const ts: TrancheState =\n await program.account.trancheState.fetch(trancheState);\n\n // If on-chain config overrides are present, prefer those.\n if (ts.chainlinkFeed && ts.chainlinkProgram) {\n chainLinkFeed = ts.chainlinkFeed as PublicKey;\n chainLinkProgram = ts.chainlinkProgram as PublicKey;\n }\n } catch {\n // If trancheState isn't initialized yet, we fall back to the constants.\n // In that case, purchase instructions will still fail, which is the\n // correct behavior until admin initializes TrancheState on-chain.\n }\n\n void connection; // reserved for future extra validation\n\n return {\n user,\n globalState,\n poolAuthority,\n liqsolMint,\n liqsolPoolAta,\n userAta,\n outpostAccount,\n userPretokenRecord,\n distributionState,\n bucketAuthority,\n bucketTokenAccount,\n bucketUserRecord,\n liqsolPoolUserRecord,\n userUserRecord,\n trancheState,\n chainLinkFeed,\n chainLinkProgram,\n extraAccountMetaList\n };\n}\n// -----------------------------------------------------------------------------\n// Epoch / scheduling helpers\n// -----------------------------------------------------------------------------\n\nexport type EpochSnapshot = {\n epoch: number;\n slot: number;\n firstSlot: number;\n slotsInEpoch: number;\n slotMs: number;\n};\n\nexport async function getEpochSnapshot(\n connection: Connection,\n): Promise<EpochSnapshot> {\n const info = await connection.getEpochInfo();\n\n // Fallback slot time\n let slotTimeMs = Number(process.env.SLOT_TIME_MS_FALLBACK ?? 400);\n\n try {\n const samples = await connection.getRecentPerformanceSamples(16);\n if (samples.length) {\n const avgMs =\n samples.reduce(\n (acc, s) => acc + (s.samplePeriodSecs * 1000) / s.numSlots,\n 0,\n ) / samples.length;\n if (isFinite(avgMs) && avgMs > 0) {\n slotTimeMs = avgMs;\n }\n }\n } catch {\n // ignore; keep fallback\n }\n\n return {\n epoch: info.epoch,\n slot: info.slotIndex,\n firstSlot: info.absoluteSlot - info.slotIndex,\n slotsInEpoch: info.slotsInEpoch,\n slotMs: slotTimeMs,\n };\n}\n\nexport function msToEpochEnd(snapshot: EpochSnapshot): number {\n const remainingSlots = snapshot.slotsInEpoch - snapshot.slot;\n return remainingSlots * snapshot.slotMs;\n}\n\n/**\n * Generic \"execute around epoch boundaries\" helper:\n *\n * - If current progress is within [early, late], run immediately.\n * - If too early, sleep until `early` percentage into the epoch.\n * - If too late, sleep until `early` percentage into the *next* epoch.\n *\n * This is generic; you can wrap any instruction builder in here (including\n * deposit flows) without baking in program-specific logic.\n */\nexport async function scheduledInstruction<T>(\n connection: Connection,\n config: ScheduleConfig,\n instruction: () => Promise<T>,\n): Promise<T> {\n const early = config.early ?? 0.10;\n const late = config.late ?? 0.90;\n\n const snapshot = await getEpochSnapshot(connection);\n const progress = snapshot.slot / snapshot.slotsInEpoch;\n\n // Case 1: Already in safe zone\n if (progress >= early && progress <= late) {\n return instruction();\n }\n\n // Case 2: Early in epoch → wait until `early`\n if (progress < early) {\n const targetSlot = snapshot.slotsInEpoch * early;\n const slotsRemaining = targetSlot - snapshot.slot;\n const msToWait = slotsRemaining * snapshot.slotMs;\n\n console.log(\n `Epoch early (${(progress * 100).toFixed(\n 2,\n )}%). Sleeping ${(msToWait / 1000).toFixed(1)}s until ${early * 100\n }%...`,\n );\n\n await sleep(Math.max(1000, msToWait));\n return instruction();\n }\n\n // Case 3: Late in epoch → wait for next epoch + early window\n const msToNextEpoch = msToEpochEnd(snapshot);\n const earlyWaitTime = snapshot.slotsInEpoch * early * snapshot.slotMs;\n const totalWaitTime = msToNextEpoch + earlyWaitTime + 1000;\n\n console.log(\n `Epoch late (${(progress * 100).toFixed(\n 2,\n )}%). Sleeping ${(totalWaitTime / 1000).toFixed(\n 1,\n )}s until next epoch + ${early * 100}%...`,\n );\n\n await sleep(totalWaitTime);\n return instruction();\n}\n\n\n// -----------------------------------------------------------------------------\n// Generic helpers (used in tests + can be useful in apps)\n// -----------------------------------------------------------------------------\n\nexport function getErrorMessage(error: any): string {\n return (\n error?.error?.errorCode?.code ||\n error?.error?.errorMessage ||\n error?.message ||\n ''\n );\n}\n\nexport function generateRandomDepositAmount(\n minSol = 2,\n maxSol = 100,\n): BN {\n const randomSol = Math.random() * (maxSol - minSol) + minSol;\n return new BN(solToLamports(randomSol));\n}\n\nexport function generateTestKeypair(): Keypair {\n return Keypair.generate();\n}\n\nexport async function airdropSol(\n connection: Connection,\n publicKey: PublicKey,\n amountSol: number,\n): Promise<void> {\n const lamports = solToLamports(amountSol);\n const sig = await connection.requestAirdrop(publicKey, Number(lamports));\n await connection.confirmTransaction(sig, 'confirmed');\n}\n\nexport async function waitForConfirmation(\n connection: Connection,\n signature: string,\n): Promise<void> {\n await connection.confirmTransaction(signature, 'confirmed');\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Simple helper used in tests: wait until safe zone, no-op.\n */\nexport async function waitUntilSafeToExecuteFunction(\n connection: Connection,\n config: ScheduleConfig = {},\n): Promise<void> {\n await scheduledInstruction(connection, config, async () => {\n // no-op\n return;\n });\n}\n\nexport interface ScheduleConfig {\n early?: number; // fraction of epoch, default 0.10\n late?: number; // fraction of epoch, default 0.90\n}","import { AnchorProvider, BN, Program } from '@coral-xyz/anchor';\nimport {\n PublicKey,\n SystemProgram,\n TransactionInstruction,\n} from '@solana/web3.js';\nimport {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n TOKEN_2022_PROGRAM_ID,\n} from '@solana/spl-token';\n\nimport liqsolCoreIDL from '../../../assets/solana/idl/liqsol_core.json';\nimport { LiqsolCore } from '../../../assets/solana/types/liqsol_core';\n\nimport {\n OutpostAccounts,\n buildOutpostAccounts,\n} from '../utils';\n\nimport {\n OutpostWireStateSnapshot,\n SharesPreview,\n TrancheState,\n WalletLike,\n} from '../types';\nimport { INDEX_SCALE, PROGRAM_IDS } from '../constants';\n\n/**\n * OutpostClient\n *\n * Read-only + preview helper for:\n * - Outpost config + per-user pretokens\n * - Tranche ladder snapshot\n * - Pretoken preview math\n *\n * Write helpers:\n * - buildStakeIx → liqsol_core::synd\n * - buildUnstakeIx → liqsol_core::desynd\n *\n * All PDAs / ATAs are sourced via buildOutpostAccounts, which is kept\n * in sync with the on-chain PDAs and capital-staking Wire utils.\n */\nexport class OutpostClient {\n private readonly program: Program<LiqsolCore>;\n\n constructor(\n private readonly provider: AnchorProvider,\n ) {\n this.program = new Program(liqsolCoreIDL as any, provider);\n }\n\n get connection() {\n return this.provider.connection;\n }\n\n get wallet(): WalletLike {\n return this.provider.wallet as unknown as WalletLike;\n }\n\n /**\n * Expose the raw Program in case callers need to build custom\n * instructions outside this client.\n */\n get liqsolCoreProgram(): Program<LiqsolCore> {\n return this.program;\n }\n\n /**\n * Build all outpost-related PDAs / ATAs for a given user.\n * Defaults to the connected wallet.\n */\n async buildAccounts(user?: PublicKey): Promise<OutpostAccounts> {\n const userPk = user ?? this.wallet.publicKey;\n if (!userPk) {\n throw new Error('OutpostClient.buildAccounts: wallet not connected');\n }\n return buildOutpostAccounts(this.connection, userPk);\n }\n\n /**\n * Internal helper: get raw token balance (BN) for a given ATA.\n */\n private async getTokenBalance(ata: PublicKey): Promise<BN> {\n try {\n const bal = await this.connection.getTokenAccountBalance(ata);\n return new BN(bal.value.amount);\n } catch {\n return new BN(0);\n }\n }\n\n /**\n * Fetch the core \"Wire state\" for Outpost / pretokens for a given user.\n */\n async fetchWireState(user?: PublicKey): Promise<OutpostWireStateSnapshot> {\n const userPk = user ?? this.wallet.publicKey;\n if (!userPk) {\n throw new Error('OutpostClient.fetchWireState: wallet not connected');\n }\n\n const pdas = await this.buildAccounts(userPk);\n\n const [\n globalState,\n outpostAccount,\n distributionState,\n userPretokenRecord,\n trancheState,\n ] = await Promise.all([\n this.program.account.globalState.fetch(pdas.globalState),\n this.program.account.outpostAccount.fetchNullable(pdas.outpostAccount),\n this.program.account.distributionState.fetchNullable(pdas.distributionState),\n this.program.account.userPretokenRecord.fetchNullable(pdas.userPretokenRecord),\n this.program.account.trancheState.fetchNullable(pdas.trancheState),\n ]);\n\n const [liqsolPoolBalance, userLiqsolBalance] = await Promise.all([\n this.getTokenBalance(pdas.liqsolPoolAta),\n this.getTokenBalance(pdas.userAta),\n ]);\n\n return {\n globalState,\n outpostAccount,\n distributionState,\n trancheState,\n userPretokenRecord,\n liqsolPoolBalance,\n userLiqsolBalance,\n };\n }\n\n // -------------------------------------------------------------------------\n // Outpost stake / unstake builders (synd / desynd)\n // -------------------------------------------------------------------------\n\n /**\n * Build the `synd` (stake) instruction:\n * user liqSOL ATA → liqSOL pool ATA\n */\n async buildStakeIx(\n amountLamports: bigint,\n user?: PublicKey,\n ): Promise<TransactionInstruction> {\n const userPk = user ?? this.wallet.publicKey;\n if (!userPk) {\n throw new Error('OutpostClient.buildStakeIx: wallet not connected');\n }\n\n const a = await this.buildAccounts(userPk);\n\n return this.program.methods\n .synd(new BN(amountLamports.toString()))\n .accounts({\n user: userPk,\n liqsolMint: a.liqsolMint,\n globalState: a.globalState,\n distributionState: a.distributionState,\n userAta: a.userAta,\n poolAuthority: a.poolAuthority,\n bucketAuthority: a.bucketAuthority,\n bucketTokenAccount: a.bucketTokenAccount,\n bucketUserRecord: a.bucketUserRecord,\n senderUserRecord: a.userUserRecord,\n receiverUserRecord: a.liqsolPoolUserRecord,\n extraAccountMetaList: a.extraAccountMetaList,\n liqsolCoreProgram: PROGRAM_IDS.LIQSOL_CORE,\n transferHookProgram: PROGRAM_IDS.TRANSFER_HOOK,\n liqsolPoolAta: a.liqsolPoolAta,\n outpostAccount: a.outpostAccount,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n /**\n * Build the `desynd` (unstake) instruction:\n * liqSOL pool ATA → user liqSOL ATA\n */\n async buildUnstakeIx(\n amountLamports: bigint,\n user?: PublicKey,\n ): Promise<TransactionInstruction> {\n const userPk = user ?? this.wallet.publicKey;\n if (!userPk) {\n throw new Error('OutpostClient.buildUnstakeIx: wallet not connected');\n }\n\n const a = await this.buildAccounts(userPk);\n\n return this.program.methods\n .desynd(new BN(amountLamports.toString()))\n .accounts({\n user: userPk,\n liqsolMint: a.liqsolMint,\n globalState: a.globalState,\n distributionState: a.distributionState,\n userAta: a.userAta,\n poolAuthority: a.poolAuthority,\n bucketAuthority: a.bucketAuthority,\n bucketTokenAccount: a.bucketTokenAccount,\n bucketUserRecord: a.bucketUserRecord,\n senderUserRecord: a.liqsolPoolUserRecord,\n receiverUserRecord: a.userUserRecord,\n extraAccountMetaList: a.extraAccountMetaList,\n liqsolCoreProgram: PROGRAM_IDS.LIQSOL_CORE,\n transferHookProgram: PROGRAM_IDS.TRANSFER_HOOK,\n liqsolPoolAta: a.liqsolPoolAta,\n outpostAccount: a.outpostAccount,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n // -------------------------------------------------------------------------\n // Pretoken preview helper (unchanged)\n // -------------------------------------------------------------------------\n\n /**\n * Local preview for \"how many pretokens would I get for this liqSOL\n * amount at the current tranche price and SOL/USD price?\"\n *\n * SCALE = 1e8\n * usdValue = solAmountLamports * solPriceUsd / 1e9\n * pretokens = usdValue * SCALE / pretokenPriceUsd\n *\n * All values are BN integers; solPriceUsd and pretokenPriceUsd are 1e8 scaled.\n */\n previewPretokens(params: {\n liqsolAmountLamports: BN;\n solPriceUsd: BN; // 1e8 scale\n trancheState: TrancheState;\n }): SharesPreview {\n const { liqsolAmountLamports, solPriceUsd, trancheState } = params;\n\n // Current tranche price in USD (1e8 scale)\n const pretokenPriceUsd = new BN(\n trancheState.currentTranchePriceUsd.toString(),\n );\n\n const SCALE = new BN('100000000'); // 1e8\n\n // usdValue = (lamports * solPriceUsd) / 1e9\n const usdValue = liqsolAmountLamports\n .mul(solPriceUsd)\n .div(new BN(1_000_000_000));\n\n const estimatedPretokens = usdValue.mul(SCALE).div(pretokenPriceUsd);\n\n return {\n liqsolAmountLamports,\n solPriceUsd,\n pretokenPriceUsd,\n estimatedPretokens,\n };\n }\n\n /**\n * Convert liqSOL tokens (lamports) → Outpost “shares”, rounding UP\n * when there is any remainder.\n *\n * This matches the on-chain logic and the capital-staking helper:\n *\n * INDEX_SCALE = 1e12\n * numerator = amount * INDEX_SCALE\n * shares = numerator / currentIndex\n * remainder = numerator % currentIndex\n * if remainder > 0 → shares + 1\n */\n static tokensToShares(amount: BN, currentIndex: BN): BN {\n const numerator = amount.mul(INDEX_SCALE);\n const shares = numerator.div(currentIndex);\n const remainder = numerator.mod(currentIndex);\n return remainder.eqn(0) ? shares : shares.addn(1);\n }\n\n /**\n * Format a 1e8-scaled integer (e.g. USD price, pretokens, etc.)\n * into a fixed 8-decimal string.\n *\n * Examples:\n * 0 -> \"0.00000000\"\n * 1 -> \"0.00000001\"\n * 100000000 -> \"1.00000000\"\n * 123456789 -> \"1.23456789\"\n */\n static formatScale8(value: BN): string {\n const decimals = 8;\n const valueStr = value.toString();\n\n if (valueStr.length <= decimals) {\n const padding = '0'.repeat(decimals - valueStr.length);\n return `0.${padding}${valueStr}`;\n }\n\n const intPart = valueStr.slice(0, valueStr.length - decimals);\n const decPart = valueStr.slice(valueStr.length - decimals);\n return `${intPart}.${decPart}`;\n }\n}","import { AnchorProvider, BN, Program } from '@coral-xyz/anchor';\nimport type { TransactionInstruction, Connection } from '@solana/web3.js';\nimport { PublicKey, SystemProgram } from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n} from '@solana/spl-token';\n\nimport {\n buildOutpostAccounts,\n type OutpostAccounts,\n} from '../utils';\n\nimport { SolanaProgramService } from '../program';\nimport type { LiqsolCore } from '../../../assets/solana/types/liqsol_core';\n\nimport {\n GlobalState,\n PriceHistory,\n TrancheState,\n WalletLike,\n OutpostAccount,\n UserPretokenRecord,\n} from '../types';\n\nimport {\n derivePriceHistoryPda,\n CHAINLINK_FEED,\n CHAINLINK_PROGRAM,\n PROGRAM_IDS,\n deriveExtraAccountMetaListPda,\n} from '../constants';\n\n\nexport class TokenClient {\n private readonly program: Program<LiqsolCore>;\n\n get wallet(): WalletLike {\n return this.provider.wallet;\n }\n\n get connection(): Connection {\n return this.provider.connection;\n }\n\n constructor(private readonly provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('liqsolCore');\n }\n\n // ---------------------------------------------------------------------------\n // Account helpers\n // ---------------------------------------------------------------------------\n\n async getAccounts(user: PublicKey): Promise<OutpostAccounts> {\n return buildOutpostAccounts(this.provider.connection, user);\n }\n\n async fetchGlobalState(): Promise<GlobalState> {\n const { globalState } = await this.getAccounts(this.wallet.publicKey);\n return this.program.account.globalState.fetch(globalState);\n }\n\n async fetchTrancheState(): Promise<TrancheState> {\n const { trancheState } = await this.getAccounts(this.wallet.publicKey);\n return this.program.account.trancheState.fetch(trancheState);\n }\n\n /**\n * Fetch the per-user Outpost account (old \"wire receipt\").\n * Returns null if the user has never interacted with Outpost.\n */\n async fetchOutpostAccount(user: PublicKey): Promise<OutpostAccount | null> {\n const { outpostAccount } = await this.getAccounts(user);\n return this.program.account.outpostAccount.fetchNullable(outpostAccount);\n }\n\n /**\n * Fetch the per-user pretoken purchase record.\n * Returns null if the user has never purchased pretokens.\n */\n async fetchUserPretokenRecord(\n user: PublicKey,\n ): Promise<UserPretokenRecord | null> {\n const { userPretokenRecord } = await this.getAccounts(user);\n return this.program.account.userPretokenRecord.fetchNullable(\n userPretokenRecord,\n );\n }\n\n // ---------------------------------------------------------------------------\n // Instruction builders (no send / confirm)\n // ---------------------------------------------------------------------------\n\n /**\n * Build a pretoken `purchase` instruction using liqSOL from the user’s ATA.\n *\n * This mirrors capital-staking `executePurchase` wiring:\n * - amountLamports: liqSOL amount (raw token-2022 units, not SOL)\n */\n async buildPurchaseIx(\n amountLamports: bigint,\n user = this.wallet.publicKey,\n ): Promise<TransactionInstruction> {\n const a = await this.getAccounts(user);\n\n const extraAccountMetaList = deriveExtraAccountMetaListPda(a.liqsolMint);\n const liqsolCoreProgram = PROGRAM_IDS.LIQSOL_CORE;\n const transferHookProgram = PROGRAM_IDS.TRANSFER_HOOK;\n\n return this.program.methods\n .purchase(new BN(amountLamports.toString()))\n .accounts({\n user: a.user,\n liqsolMint: a.liqsolMint,\n globalState: a.globalState,\n distributionState: a.distributionState,\n\n // buyer’s liqSOL\n buyerAta: a.userAta,\n\n // pool / bucket context\n poolAuthority: a.poolAuthority,\n bucketAuthority: a.bucketAuthority,\n bucketTokenAccount: a.bucketTokenAccount,\n bucketUserRecord: a.bucketUserRecord,\n\n // distribution userRecords (token-account keyed)\n senderUserRecord: a.userUserRecord,\n receiverUserRecord: a.liqsolPoolUserRecord,\n\n // transfer-hook wiring\n extraAccountMetaList,\n liqsolCoreProgram,\n transferHookProgram,\n\n // pool + outpost + tranche\n liqsolPoolAta: a.liqsolPoolAta,\n outpostAccount: a.outpostAccount,\n trancheState: a.trancheState,\n userPretokenRecord: a.userPretokenRecord,\n\n // Chainlink pricing\n chainlinkFeed: a.chainLinkFeed ?? CHAINLINK_FEED,\n chainlinkProgram: a.chainLinkProgram ?? CHAINLINK_PROGRAM,\n\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n // NOTE:\n // - There is no longer `purchaseWithSol` in the IDL - SOL → liqSOL happens\n // through the deposit / liqSOL minting path, not directly in pretokens.\n // - `purchaseFromYield` is an operator-facing / protocol flow and you\n // indicated you’ll trigger it from Wire infra, so we don’t expose a\n // client helper here for now.\n\n // ---------------------------------------------------------------------------\n // Price helpers (SOL/USD via priceHistory account)\n // ---------------------------------------------------------------------------\n\n async getSolPriceUsdSafe(): Promise<{ price?: bigint; timestamp?: number }> {\n try {\n const price = await this.getSolPriceUsd();\n // current priceHistory account has no timestamp; keep optional\n return { price, timestamp: undefined };\n } catch {\n return { price: undefined, timestamp: undefined };\n }\n }\n\n /**\n * Fetch latest SOL/USD price (1e8 scale) from liqsol_core.priceHistory.\n * Uses the ring-buffer semantics from capital-staking.\n */\n async getSolPriceUsd(): Promise<bigint> {\n const priceHistoryPda = derivePriceHistoryPda();\n const history = (await this.program.account.priceHistory.fetch(\n priceHistoryPda,\n )) as PriceHistory;\n\n const { prices, nextIndex, count, windowSize } = history;\n\n if (!prices || prices.length === 0 || !count) {\n throw new Error('Price history is empty - no SOL price available');\n }\n\n const capacity = prices.length || windowSize;\n if (!capacity) {\n throw new Error(\n 'Price history capacity is zero - check account layout',\n );\n }\n\n const lastIndex = nextIndex === 0 ? capacity - 1 : nextIndex - 1;\n const latest = prices[lastIndex];\n\n if (!BN.isBN(latest)) {\n throw new Error(\n 'Latest price entry is not a BN - check IDL/decoder',\n );\n }\n\n return BigInt(latest.toString());\n }\n}","import {\n Commitment,\n ComputeBudgetProgram,\n Connection,\n ConnectionConfig,\n PublicKey as SolPubKey,\n Transaction,\n TransactionSignature,\n} from '@solana/web3.js';\nimport { AnchorProvider, BN } from '@coral-xyz/anchor';\nimport { BaseSignerWalletAdapter } from '@solana/wallet-adapter-base';\nimport {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddressSync,\n TOKEN_2022_PROGRAM_ID,\n} from '@solana/spl-token';\n\nimport {\n ChainID,\n ExternalNetwork,\n KeyType,\n PublicKey,\n SolChainID,\n} from '@wireio/core';\n\nimport {\n IStakingClient,\n Portfolio,\n StakerConfig,\n TrancheSnapshot,\n} from '../../types';\n\nimport { DepositClient } from './clients/deposit.client';\nimport { DistributionClient } from './clients/distribution.client';\nimport { LeaderboardClient } from './clients/leaderboard.client';\nimport { OutpostClient } from './clients/outpost.client';\nimport { TokenClient } from './clients/token.client';\n\nimport {\n deriveLiqsolMintPda,\n deriveReservePoolPda,\n deriveVaultPda,\n INDEX_SCALE,\n} from './constants';\n\nimport { buildSolanaTrancheSnapshot } from './utils';\nimport { PayRateEntry, SolanaTransaction } from './types';\n\nconst commitment: Commitment = 'confirmed';\n\n/**\n * Solana implementation of IStakingClient.\n *\n * Responsibilities:\n * - liqSOL deposit (SOL -> liqSOL)\n * - withdraw requests (liqSOL -> NFT receipt / encumbered SOL)\n * - Pretoken (WIRE) buys via liqSOL\n * - Unified portfolio + tranche snapshot + balance correction (later)\n *\n * This composes lower-level clients; it does not know about UI.\n */\nexport class SolanaStakingClient implements IStakingClient {\n public pubKey?: PublicKey; // Wire ED key (optional → read-only)\n public connection: Connection;\n public anchor: AnchorProvider;\n\n public depositClient: DepositClient;\n public distributionClient: DistributionClient;\n public leaderboardClient: LeaderboardClient;\n public outpostClient: OutpostClient;\n public tokenClient: TokenClient;\n\n get solPubKey(): SolPubKey {\n if (!this.pubKey) throw new Error('pubKey is undefined');\n return new SolPubKey(this.pubKey.data.array);\n }\n\n get network(): ExternalNetwork {\n return this.config.network;\n }\n\n constructor(private config: StakerConfig) {\n const adapter = config.provider as BaseSignerWalletAdapter | undefined;\n\n if (!config.network.rpcUrls.length) {\n throw new Error('No RPC URLs provided');\n }\n\n // -------------------------------------------------------------\n // Resolve Solana wallet pubkey (or dummy in read-only mode)\n // -------------------------------------------------------------\n let solWalletPubkey: SolPubKey;\n if (adapter?.publicKey) {\n solWalletPubkey = adapter.publicKey;\n } else {\n // Zeroed pubkey when no wallet (read-only usage)\n solWalletPubkey = new SolPubKey(new Uint8Array(32));\n }\n\n // -------------------------------------------------------------\n // Resolve Wire pubKey\n // -------------------------------------------------------------\n if (config.pubKey) {\n const wirePub = config.pubKey;\n\n if (adapter?.publicKey) {\n const derived = new PublicKey(\n KeyType.ED,\n adapter.publicKey.toBytes(),\n );\n if (!derived.equals(wirePub)) {\n throw new Error(\n \"Passed-in pubKey doesn't match adapter.publicKey\",\n );\n }\n }\n\n this.pubKey = wirePub;\n } else if (adapter?.publicKey) {\n // Derive Wire pubKey from adapter when not explicitly passed\n this.pubKey = new PublicKey(\n KeyType.ED,\n adapter.publicKey.toBytes(),\n );\n }\n\n // -------------------------------------------------------------\n // Connection + AnchorProvider\n // -------------------------------------------------------------\n const opts: ConnectionConfig = { commitment };\n if (\n config.network.rpcUrls.length > 1 &&\n config.network.rpcUrls[1].startsWith('ws')\n ) {\n opts.wsEndpoint = config.network.rpcUrls[1];\n }\n\n const anchorWallet = adapter\n ? {\n publicKey: solWalletPubkey,\n async signTransaction<T extends SolanaTransaction>(\n tx: T,\n ): Promise<T> {\n return adapter.signTransaction(tx);\n },\n async signAllTransactions<T extends SolanaTransaction>(\n txs: T[],\n ): Promise<T[]> {\n if (adapter.signAllTransactions) {\n return adapter.signAllTransactions(txs);\n }\n return Promise.all(\n txs.map((tx) => adapter.signTransaction(tx)),\n );\n },\n }\n : {\n publicKey: solWalletPubkey,\n async signTransaction<T extends SolanaTransaction>(\n _tx: T,\n ): Promise<T> {\n throw new Error(\n 'Wallet not connected: signTransaction not available',\n );\n },\n async signAllTransactions<T extends SolanaTransaction>(\n _txs: T[],\n ): Promise<T[]> {\n throw new Error(\n 'Wallet not connected: signAllTransactions not available',\n );\n },\n };\n\n this.connection = new Connection(config.network.rpcUrls[0], opts);\n this.anchor = new AnchorProvider(this.connection, anchorWallet, {\n commitment,\n });\n\n this.depositClient = new DepositClient(this.anchor);\n this.distributionClient = new DistributionClient(this.anchor);\n this.leaderboardClient = new LeaderboardClient(this.anchor);\n this.outpostClient = new OutpostClient(this.anchor);\n this.tokenClient = new TokenClient(this.anchor);\n }\n\n // ---------------------------------------------------------------------\n // IStakingClient core methods\n // ---------------------------------------------------------------------\n\n /**\n * Deposit native SOL into liqSOL (liqsol_core::deposit).\n * Handles tx build, sign, send, and confirmation.\n */\n async deposit(amountLamports: bigint): Promise<string> {\n this.ensureUser();\n if (amountLamports <= BigInt(0)) {\n throw new Error('Deposit amount must be greater than zero.');\n }\n\n const tx = await this.depositClient.buildDepositTx(amountLamports);\n const { tx: prepared, blockhash, lastValidBlockHeight } =\n await this.prepareTx(tx);\n const signed = await this.signTransaction(prepared);\n return await this.sendAndConfirmHttp(signed, {\n blockhash,\n lastValidBlockHeight,\n });\n }\n\n /**\n * Request a withdraw from liqSOL to SOL (liqsol_core::requestWithdraw).\n *\n * This:\n * - burns liqSOL from the user ATA\n * - mints an NFT withdrawal receipt\n * - increases totalEncumberedFunds in global state\n *\n * Actual SOL payout happens later via the operator-side flow.\n */\n async withdraw(amountLamports: bigint): Promise<string> {\n this.ensureUser();\n if (amountLamports <= BigInt(0)) {\n throw new Error('Withdraw amount must be greater than zero.');\n }\n\n const tx = await this.depositClient.buildWithdrawTx(amountLamports);\n const { tx: prepared, blockhash, lastValidBlockHeight } =\n await this.prepareTx(tx);\n const signed = await this.signTransaction(prepared);\n return await this.sendAndConfirmHttp(signed, {\n blockhash,\n lastValidBlockHeight,\n });\n }\n\n /**\n * Stake liqSOL into Outpost (liqSOL → pool) via liqsol_core::synd.\n */\n async stake(amountLamports: bigint): Promise<string> {\n this.ensureUser();\n\n if (!amountLamports || amountLamports <= BigInt(0)) {\n throw new Error('Stake amount must be greater than zero.');\n }\n\n const user = this.solPubKey;\n\n // Build compute budget increase instruction\n const cuIx = ComputeBudgetProgram.setComputeUnitLimit({ units: 400_000 });\n\n // Build the Outpost synd instruction\n const ix = await this.outpostClient.buildStakeIx(amountLamports, user);\n\n // Wrap in a transaction and send\n const tx = new Transaction().add(cuIx, ix);\n const prepared = await this.prepareTx(tx);\n const signed = await this.signTransaction(prepared.tx);\n\n return this.sendAndConfirmHttp(signed, prepared);\n }\n\n /**\n * Unstake liqSOL from Outpost (pool → liqSOL) via liqsol_core::desynd.\n */\n async unstake(amountLamports: bigint): Promise<string> {\n this.ensureUser();\n\n if (!amountLamports || amountLamports <= BigInt(0)) {\n throw new Error('Unstake amount must be greater than zero.');\n }\n\n const user = this.solPubKey;\n\n // Build compute budget increase instruction\n const cuIx = ComputeBudgetProgram.setComputeUnitLimit({ units: 400_000 });\n\n // Build the Outpost desynd instruction\n const ix = await this.outpostClient.buildUnstakeIx(amountLamports, user);\n\n // Wrap in a transaction and send\n const tx = new Transaction().add(cuIx, ix);\n const prepared = await this.prepareTx(tx);\n const signed = await this.signTransaction(prepared.tx);\n\n return this.sendAndConfirmHttp(signed, prepared);\n }\n\n /**\n * Buy prelaunch WIRE “pretokens” using liqSOL.\n *\n * This delegates to TokenClient, which uses the `purchase`-style\n * instruction under the new IDL (no more native-SOL purchase).\n */\n async buy(amountLamports: bigint): Promise<string> {\n this.ensureUser();\n if (!amountLamports || amountLamports <= BigInt(0)) {\n throw new Error('liqSOL pretoken purchase requires a positive amount.');\n }\n\n const user = this.solPubKey;\n const cuIx = ComputeBudgetProgram.setComputeUnitLimit({ units: 400_000 });\n const ix = await this.tokenClient.buildPurchaseIx(amountLamports, user);\n const tx = new Transaction().add(cuIx, ix);\n const { tx: prepared, blockhash, lastValidBlockHeight } =\n await this.prepareTx(tx);\n const signed = await this.signTransaction(prepared);\n return await this.sendAndConfirmHttp(signed, {\n blockhash,\n lastValidBlockHeight,\n });\n }\n\n /**\n * Aggregate view of the user’s balances on Solana:\n * - native: SOL wallet balance\n * - liq: liqSOL token balance (Token-2022 ATA)\n * - staked: liqSOL staked in Outpost (synd/desynd) → outpostAccount.stakedLiqsol\n * - wire: total WIRE pretokens purchased (1e8 scale)\n * - yield: on-chain index/shares plus an estimated accrued liqSOL yield\n * - extras: useful internal addresses and raw state for debugging/UX\n */\n async getPortfolio(): Promise<Portfolio> {\n if (!this.pubKey) throw new Error('User pubKey is undefined');\n\n const user = this.solPubKey;\n\n const reservePoolPDA = deriveReservePoolPda();\n const vaultPDA = deriveVaultPda();\n const liqsolMint = deriveLiqsolMintPda();\n\n const userLiqsolAta = getAssociatedTokenAddressSync(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n // NOTE:\n // - nativeLamports: wallet SOL\n // - actualBalResp: liqSOL balance in user ATA\n // - snapshot: Outpost + pretokens + global index/shares\n const [nativeLamports, actualBalResp, snapshot] = await Promise.all([\n this.connection.getBalance(user, 'confirmed'),\n this.connection\n .getTokenAccountBalance(userLiqsolAta, 'confirmed')\n .catch(() => null),\n this.outpostClient.fetchWireState(user).catch(() => null),\n ]);\n\n const LIQSOL_DECIMALS = 9;\n\n const actualAmountStr = actualBalResp?.value?.amount ?? '0';\n\n const globalState = snapshot?.globalState ?? null;\n const outpostAccount = snapshot?.outpostAccount ?? null;\n const trancheState = snapshot?.trancheState ?? null;\n const userPretokenRecord = snapshot?.userPretokenRecord ?? null;\n\n // -----------------------------\n // Staked liqSOL (Outpost)\n // -----------------------------\n // This is the liqSOL that has been syndicated into Outpost via `synd`.\n // It lives on the outpost account as `stakedLiqsol`.\n const stakedLiqsolStr =\n outpostAccount?.stakedLiqsol?.toString?.() ?? '0';\n\n // -----------------------------\n // WIRE pretokens (1e8 scale)\n // -----------------------------\n // This is NOT stake — it’s the prelaunch WIRE position.\n const wirePretokensStr =\n userPretokenRecord?.totalPretokensPurchased?.toString?.() ??\n '0';\n\n // -----------------------------\n // Yield view (index + shares)\n // -----------------------------\n // We expose:\n // - currentIndex: globalState.currentIndex (1e12 scale)\n // - totalShares: globalState.totalShares\n // - userShares: outpostAccount.stakedShares\n // - estimatedClaimLiqsol: floor(userShares * index / INDEX_SCALE)\n // - estimatedYield: max(0, estimatedClaim - stakedLiqsol)\n //\n // This matches the capital-staking math:\n // sharesToTokens(shares, index) = shares * index / INDEX_SCALE\n const currentIndexStr =\n globalState?.currentIndex?.toString?.() ?? '0';\n const totalSharesStr =\n globalState?.totalShares?.toString?.() ?? '0';\n const userSharesStr =\n outpostAccount?.stakedShares?.toString?.() ?? '0';\n\n const stakedLiqsol = BigInt(stakedLiqsolStr);\n const currentIndex = BigInt(currentIndexStr);\n const totalShares = BigInt(totalSharesStr);\n const userShares = BigInt(userSharesStr);\n\n let estimatedClaim = BigInt(0);\n let estimatedYield = BigInt(0);\n\n if (userShares > BigInt(0) && currentIndex > BigInt(0)) {\n // sharesToTokens(userShares, currentIndex)\n estimatedClaim = (userShares * currentIndex) / INDEX_SCALE;\n\n if (estimatedClaim > stakedLiqsol) {\n estimatedYield = estimatedClaim - stakedLiqsol;\n }\n }\n\n return {\n native: {\n amount: BigInt(nativeLamports),\n symbol: 'SOL',\n decimals: 9,\n },\n liq: {\n amount: BigInt(actualAmountStr),\n symbol: 'LiqSOL',\n decimals: LIQSOL_DECIMALS,\n ata: userLiqsolAta,\n },\n staked: {\n // liqSOL staked in Outpost via `synd`\n amount: stakedLiqsol,\n symbol: 'LiqSOL',\n decimals: LIQSOL_DECIMALS,\n },\n wire: {\n // Prelaunch WIRE pretokens (1e8 scale)\n amount: BigInt(wirePretokensStr),\n symbol: '$WIRE',\n decimals: 8,\n },\n yield: {\n // Raw primitives so the frontend can display curves, charts, etc.\n currentIndex,\n indexScale: INDEX_SCALE,\n totalShares,\n userShares,\n // liqSOL amounts (lamports) implied by index/shares\n estimatedClaim,\n estimatedYield,\n },\n extras: {\n userLiqsolAta: userLiqsolAta.toBase58(),\n reservePoolPDA: reservePoolPDA.toBase58(),\n vaultPDA: vaultPDA.toBase58(),\n globalIndex: globalState?.currentIndex?.toString(),\n totalShares: globalState?.totalShares?.toString(),\n currentTrancheNumber:\n trancheState?.currentTrancheNumber?.toString(),\n currentTranchePriceUsd:\n trancheState?.currentTranchePriceUsd?.toString(), // 1e8 USD\n },\n chainID: this.network.chainId,\n };\n }\n\n /**\n * Convenience helper to fetch the distribution userRecord for the current user.\n * Used by balance-correction flows and debugging.\n */\n async getUserRecord() {\n if (!this.pubKey) throw new Error('User pubKey is undefined');\n return this.distributionClient.getUserRecord(this.solPubKey);\n }\n\n\n // ---------------------------------------------------------------------\n // READ-ONLY Public Methods\n // ---------------------------------------------------------------------\n\n // Estimated total APY for staking yeild\n getSystemAPY(): Promise<number> {\n // TODO\n return Promise.resolve(0);\n }\n\n // ---------------------------------------------\n // Deposit fee calculation (SOL -> liqSOL)\n // ---------------------------------------------\n\n /**\n * Estimate the protocol deposit fee in lamports for a given SOL amount,\n * based on recent pay rates and globalConfig.depositFeeMultiplier.\n *\n * - amountLamports: deposit notional in lamports\n * - windowSize: how many recent payRate entries to average (default 5)\n *\n * Returns 0n if payRateHistory or globalConfig is missing, or if\n * there are no valid pay-rate entries yet.\n */\n async getDepositFee(\n amountLamports: bigint,\n windowSize = 5,\n ): Promise<bigint> {\n if (amountLamports <= BigInt(0)) {\n return BigInt(0);\n }\n\n const [history, globalConfig] = await Promise.all([\n this.distributionClient.getPayRateHistory(),\n this.distributionClient.getGlobalConfig(),\n ]);\n\n if (!history || !globalConfig) {\n return BigInt(0);\n }\n\n const entries = history.entries ?? [];\n if (!entries.length) {\n return BigInt(0);\n }\n\n const maxEntries =\n typeof history.maxEntries === 'number'\n ? history.maxEntries\n : entries.length;\n\n const totalEntriesAdded = new BN(\n history.totalEntriesAdded.toString(),\n );\n\n const COUNT = Math.max(1, Math.min(windowSize, maxEntries, entries.length));\n\n // ---------------------------------------------\n // Walk the circular buffer from \"most recent\"\n // back through COUNT entries, using the same\n // logic as your coworker script.\n // ---------------------------------------------\n\n let avgPayRate = new BN(0);\n\n if (COUNT > 0) {\n let idx: number;\n\n if (totalEntriesAdded.isZero()) {\n // \"Not wrapped yet\" case\n idx = 0;\n } else if (history.currentIndex === 0) {\n idx = maxEntries - 1;\n } else {\n idx = history.currentIndex - 1;\n }\n\n let sum = new BN(0);\n let valid = 0;\n const zero = new BN(0);\n\n for (let i = 0; i < COUNT; i++) {\n const entry: PayRateEntry | undefined = entries[idx];\n if (entry) {\n const rate = new BN(entry.scaledRate.toString());\n if (rate.gt(zero)) {\n sum = sum.add(rate);\n valid += 1;\n }\n }\n\n // Same wrap logic as the coworker’s script:\n if (totalEntriesAdded.isZero()) {\n // simple forward iteration if never wrapped\n idx = (idx + 1) % maxEntries;\n } else {\n // walk backwards through the ring buffer\n idx = idx === 0 ? maxEntries - 1 : idx - 1;\n }\n }\n\n if (valid > 0) {\n avgPayRate = this.ceilDiv(sum, new BN(valid));\n }\n }\n\n // If no valid pay-rate entries, no fee\n if (avgPayRate.isZero()) {\n return BigInt(0);\n }\n\n // depositFeeMultiplier may be BN or number depending on your type\n const rawMultiplier: any = (globalConfig as any).depositFeeMultiplier;\n const multiplier = new BN(\n rawMultiplier?.toString?.() ?? rawMultiplier ?? 0,\n );\n if (multiplier.isZero()) {\n return BigInt(0);\n }\n\n const amountBn = new BN(amountLamports.toString());\n\n // 10^12 scale (matches scaledRate / index scale)\n const SCALE = new BN('1000000000000');\n\n const feeBn = this.ceilDiv(\n avgPayRate.mul(multiplier).mul(amountBn),\n SCALE,\n );\n\n return BigInt(feeBn.toString());\n }\n\n /**\n * Unified, chain-agnostic tranche snapshot for Solana.\n *\n * Uses:\n * - liqsol_core.globalState (currentIndex, totalShares, etc.)\n * - liqsol_core.trancheState (price, supply, total sold, etc.)\n * - PriceHistory/Chainlink SOL/USD via TokenClient.getSolPriceUsdSafe()\n *\n * This is READ-ONLY and works even with no connected wallet.\n */\n async getTrancheSnapshot(options?: {\n chainID?: ChainID;\n windowBefore?: number;\n windowAfter?: number;\n }): Promise<TrancheSnapshot> {\n const {\n chainID = SolChainID.WireTestnet,\n windowBefore,\n windowAfter,\n } = options ?? {};\n\n const [globalState, trancheState] = await Promise.all([\n this.tokenClient.fetchGlobalState(),\n this.tokenClient.fetchTrancheState(),\n ]);\n\n const { price: solPriceUsd, timestamp } =\n await this.tokenClient.getSolPriceUsdSafe();\n\n return buildSolanaTrancheSnapshot({\n chainID,\n globalState,\n trancheState,\n solPriceUsd,\n nativePriceTimestamp: timestamp,\n ladderWindowBefore: windowBefore,\n ladderWindowAfter: windowAfter,\n });\n }\n\n // ---------------------------------------------------------------------\n // Tx helpers\n // ---------------------------------------------------------------------\n\n /**\n * Send a signed transaction over HTTP RPC and wait for confirmation.\n * Throws if the transaction fails.\n */\n private async sendAndConfirmHttp(\n signed: SolanaTransaction,\n ctx: { blockhash: string; lastValidBlockHeight: number },\n ): Promise<string> {\n this.ensureUser();\n\n const signature = await this.connection.sendRawTransaction(\n signed.serialize(),\n {\n skipPreflight: false,\n preflightCommitment: commitment,\n maxRetries: 3,\n },\n );\n\n const conf = await this.connection.confirmTransaction(\n {\n signature,\n blockhash: ctx.blockhash,\n lastValidBlockHeight: ctx.lastValidBlockHeight,\n },\n commitment,\n );\n\n if (conf.value.err) {\n throw new Error(\n `Transaction failed: ${JSON.stringify(conf.value.err)}`,\n );\n }\n\n return signature;\n }\n\n /**\n * Sign a single Solana transaction using the connected wallet adapter.\n */\n async signTransaction(\n tx: SolanaTransaction,\n ): Promise<SolanaTransaction> {\n this.ensureUser();\n return this.anchor.wallet.signTransaction(tx);\n }\n\n /**\n * Generic \"fire and forget\" send helper if the caller already\n * prepared and signed the transaction.\n */\n async sendTransaction(\n signed: SolanaTransaction,\n ): Promise<TransactionSignature> {\n this.ensureUser();\n return this.anchor.sendAndConfirm(signed);\n }\n\n /**\n * Attach recent blockhash + fee payer to a transaction.\n * Required before signing and sending.\n */\n async prepareTx(\n tx: Transaction,\n ): Promise<{\n tx: Transaction;\n blockhash: string;\n lastValidBlockHeight: number;\n }> {\n const { blockhash, lastValidBlockHeight } =\n await this.connection.getLatestBlockhash('confirmed');\n tx.recentBlockhash = blockhash;\n tx.feePayer = this.solPubKey;\n return { tx, blockhash, lastValidBlockHeight };\n }\n\n /**\n * Guard for all write operations (deposit/withdraw/stake/unstake/buy).\n * Ensures we have a Wire pubKey and an Anchor wallet pubKey, and that they match.\n */\n ensureUser() {\n if (!this.pubKey || !this.anchor.wallet.publicKey) {\n throw new Error('User Authorization required: pubKey is undefined');\n }\n if (\n this.solPubKey.toBase58() !==\n this.anchor.wallet.publicKey.toBase58()\n ) {\n throw new Error(\n 'Write access requires connected wallet to match pubKey',\n );\n }\n }\n\n private ceilDiv(n: BN, d: BN): BN {\n if (d.isZero()) {\n throw new Error('Division by zero in ceilDiv');\n }\n return n.add(d.subn(1)).div(d);\n }\n\n}","/**\n * @module EthereumContractService\n *\n * Provides a unified service for interacting with Ethereum smart contracts using ethers.js.\n */\n\n// LiqETH Artifacts\nimport AccountingArtifact from '../../assets/ethereum/ABI/liqEth/accounting.sol/Accounting.json';\nimport DepositManagerArtifact from '../../assets/ethereum/ABI/liqEth/DepositManager.sol/DepositManager.json';\nimport LiqEthArtifact from '../../assets/ethereum/ABI/liqEth/liqEth.sol/LiqEthToken.json';\nimport StakingModuleArtifact from '../../assets/ethereum/ABI/liqEth/stakingModule.sol/StakingModule.json';\nimport WithdrawalQueueArtifact from '../../assets/ethereum/ABI/liqEth/withdrawalQueue.sol/WithdrawalQueue.json';\nimport WithdrawalVaultArtifact from '../../assets/ethereum/ABI/liqEth/withdrawalVault.sol/WithdrawalVault.json';\nimport BeaconStateArtifact from '../../assets/ethereum/ABI/liqEth/BeaconState.sol/BeaconState.json';\nimport YieldOracleArtifact from '../../assets/ethereum/ABI/liqEth/Yield.sol/YieldOracle.json';\n\n// Outpost Artifacts\nimport DepositorArtifact from '../../assets/ethereum/ABI/outpost/Depositor.sol/Depositor.json';\nimport ReceiptNFTArtifact from '../../assets/ethereum/ABI/outpost/ReceiptNFT.sol/ReceiptNFT.json';\nimport OutpostManagerArtifact from '../../assets/ethereum/ABI/outpost/OutpostManager.sol/OutpostManager.json';\nimport BARArtifact from '../../assets/ethereum/ABI/outpost/BAR.sol/BAR.json';\nimport OPPArtifact from '../../assets/ethereum/ABI/outpost/OPP.sol/OPP.json';\nimport OPPCommonArtifact from '../../assets/ethereum/ABI/outpost/OPPCommon.sol/OPPCommon.json';\nimport OPPInboundArtifact from '../../assets/ethereum/ABI/outpost/OPPInbound.sol/OPPInbound.json';\nimport PretokenArtifact from '../../assets/ethereum/ABI/outpost/Pretoken.sol/Pretoken.json';\nimport AggregatorArtifact from '../../assets/ethereum/ABI/outpost/EthUsdPriceConsumer.sol/AggregatorV3Interface.json';\nimport EthUsdPriceConsumerArtifact from '../../assets/ethereum/ABI/outpost/EthUsdPriceConsumer.sol/EthUsdPriceConsumer.json';\nimport PoolArtifact from '../../assets/ethereum/ABI/outpost/Pool.sol/Pool.json';\nimport OutpostManagerAuthorityArtifact from '../../assets/ethereum/ABI/outpost/OutpostManagerAuthority.sol/OutpostManagerAuthority.json';\n\n// Common Artifacts\nimport IodataArtifact from '../../assets/ethereum/ABI/common/iodata.sol/iodata.json';\nimport Base58Artifact from '../../assets/ethereum/ABI/common/Base58.sol/Base58.json';\nimport sysio_merkleArtifact from '../../assets/ethereum/ABI/common/sysio_merkle.sol/sysio_merkle.json';\nimport sysio_writeArtifact from '../../assets/ethereum/ABI/common/sysio_write.sol/sysio_write.json';\n\n// ERC Token Artifacts\nimport ERC20Artifact from '../../assets/ethereum/ABI/token/ERC20Token.sol/ERC20Token.json';\nimport ERC721Artifact from '../../assets/ethereum/ABI/token/ERC721Token.sol/ERC721Token.json';\nimport ERC1155Artifact from '../../assets/ethereum/ABI/token/ERC1155Token.sol/ERC1155Token.json';\n\nimport { AddressBook, ContractName } from './types';\nimport { Contract, ethers, providers, Signer } from 'ethers';\nimport { JsonFragment } from '@ethersproject/abi';\nimport { ErrorDescription } from '@ethersproject/abi/lib/interface';\n\nexport const ERC20Abi = ERC20Artifact.abi;\nexport const ERC721Abi = ERC721Artifact.abi;\nexport const ERC1155Abi = ERC1155Artifact.abi;\n\n// -----------------------------------------------------------------------------\n// Address book\n// -----------------------------------------------------------------------------\n\n// Make sure ContractName in ./types includes all of these keys.\nexport const ADDRESSES: AddressBook = {\n // LiqETH contracts\n LiqEthAuthority: \"0x9686E04F30Fa93496B7d7fE0FBc2e4e0aD52891E\",\n BeaconState: \"0x207b249d7a83F6E9FCa04a1CD9b484D4f4f9aD2D\",\n WithdrawalQueue: \"0x9a575c7Acce9e616cD07A0BDb2D28866027b75Ae\",\n LiqEthToken: \"0x5f7192fa756304b255F6F9C1123426Db6A1Db748\",\n Accounting: \"0xBAbAd5219f022B29282b904ceEaeBB7ab1b069fC\",\n DepositManager: \"0x2e1986508472805c1649e4BBB424879B89720741\",\n WithdrawalVault: \"0xC82FAf3Fed135B70A7E797864F504819a98E96c4\",\n StakingModule: \"0xdd24EffAa4B42f3273E2b44995639119c08daBea\",\n YieldOracle: \"0x56A27E1d10d4aEc7402dC26693fb7c0Eb66eF802\",\n\n //Outpost contracts\n OutpostManagerAuthority: \"0xAEcd2aa6EeFa4Aa7Cb9368728aA89Ca59Aa9ea59\",\n iodata: \"0x2c2ab53F6Bc146bd31B459E832Ce0B9Da78712d8\",\n Base58: \"0x9F188Ec124c9ad9bF6D195650d8360Fd052F585A\",\n sysio_merkle: \"0x6eDA3C4c34421Cd667800C17fe33E48f5698e004\",\n ReceiptNFT: \"0xd083051d9bb8353875abCecAB50C6e4FB5e527a8\",\n MockAggregator: \"0xD721d15Ae1D1bF58DF1B9471198d968A16B8e58D\",\n Pool: \"0xee5F11aC9b104c18d2423f266c5E737fC95ebA92\",\n OutpostManager: \"0xB1B6ba7FA156652849069aC7ADB281283D235B9f\",\n sysio_write: \"0xEfA608136d372349C09a7aA57665C09Fb4a620Ca\",\n EthUsdPriceConsumer: \"0x6337A23b61f98b1526faF2848385Abe9cB4cFF21\",\n BAR: \"0x9264eAA449da94caF70Fc18522021a94C8DF32Fb\",\n OPPCommon: \"0x86A8cA16ce521De3EBdd1C541fAf188795b59FD0\",\n OPP: \"0x79e8395Bb5131FB285aCEE5329BB43E66f50F88C\",\n Pretoken: \"0x62f98AF2f9C3EF4eF2fA7bc0245BD5a9315E7541\",\n OPPInbound: \"0xC85f57Ff069711e0b3472De3963bd2fC2FEfF3e2\",\n Depositor: \"0xb0BACAb6f13dd96281300be13a6346461b2f35F3\"\n};\n\nexport type Contracts<T extends string = ContractName> = Record<T, ContractConfig>;\n\nexport type ContractConfig = {\n address: string;\n abi: JsonFragment[];\n};\n\n// -----------------------------------------------------------------------------\n// Contract config\n// -----------------------------------------------------------------------------\n\nexport const CONTRACTS: Contracts<ContractName> = {\n // LiqETH Contracts\n LiqEthAuthority: {\n address: ADDRESSES.LiqEthAuthority,\n abi: LiqEthArtifact.abi as JsonFragment[],\n },\n BeaconState: {\n address: ADDRESSES.BeaconState,\n abi: BeaconStateArtifact.abi as JsonFragment[]\n },\n WithdrawalQueue: {\n address: ADDRESSES.WithdrawalQueue,\n abi: WithdrawalQueueArtifact.abi as JsonFragment[],\n },\n LiqEthToken: {\n address: ADDRESSES.LiqEthToken,\n abi: LiqEthArtifact.abi as JsonFragment[],\n },\n Accounting: {\n address: ADDRESSES.Accounting,\n abi: AccountingArtifact.abi as JsonFragment[],\n },\n DepositManager: {\n address: ADDRESSES.DepositManager,\n abi: DepositManagerArtifact.abi as JsonFragment[],\n },\n WithdrawalVault: {\n address: ADDRESSES.WithdrawalVault,\n abi: WithdrawalVaultArtifact.abi as JsonFragment[],\n },\n StakingModule: {\n address: ADDRESSES.StakingModule,\n abi: StakingModuleArtifact.abi as JsonFragment[],\n },\n YieldOracle: {\n address: ADDRESSES.YieldOracle,\n abi: YieldOracleArtifact.abi as JsonFragment[],\n },\n\n // Outpost Contracts\n OutpostManagerAuthority: {\n address: ADDRESSES.OutpostManagerAuthority,\n abi: OutpostManagerAuthorityArtifact.abi as JsonFragment[],\n },\n iodata: {\n address: ADDRESSES.iodata,\n abi: IodataArtifact.abi as JsonFragment[],\n },\n Base58: {\n address: ADDRESSES.Base58,\n abi: Base58Artifact.abi as JsonFragment[],\n },\n sysio_merkle: {\n address: ADDRESSES.sysio_merkle,\n abi: sysio_merkleArtifact.abi as JsonFragment[],\n },\n ReceiptNFT: {\n address: ADDRESSES.ReceiptNFT,\n abi: ReceiptNFTArtifact.abi as JsonFragment[],\n },\n MockAggregator: {\n address: ADDRESSES.MockAggregator,\n abi: AggregatorArtifact.abi as JsonFragment[],\n },\n Pool: {\n address: ADDRESSES.Pool,\n abi: PoolArtifact.abi as JsonFragment[],\n },\n OutpostManager: {\n address: ADDRESSES.OutpostManager,\n abi: OutpostManagerArtifact.abi as JsonFragment[],\n },\n sysio_write: {\n address: ADDRESSES.sysio_write,\n abi: sysio_writeArtifact.abi as JsonFragment[],\n },\n EthUsdPriceConsumer: {\n address: ADDRESSES.EthUsdPriceConsumer,\n abi: EthUsdPriceConsumerArtifact.abi as JsonFragment[],\n },\n BAR: {\n address: ADDRESSES.BAR,\n abi: BARArtifact.abi as JsonFragment[],\n },\n OPPCommon: {\n address: ADDRESSES.OPPCommon,\n abi: OPPCommonArtifact.abi as JsonFragment[],\n },\n OPP: {\n address: ADDRESSES.OPP,\n abi: OPPArtifact.abi as JsonFragment[],\n },\n Pretoken: {\n address: ADDRESSES.Pretoken,\n abi: PretokenArtifact.abi as JsonFragment[],\n },\n OPPInbound: {\n address: ADDRESSES.OPPInbound,\n abi: OPPInboundArtifact.abi as JsonFragment[],\n },\n Depositor: {\n address: ADDRESSES.Depositor,\n abi: DepositorArtifact.abi as JsonFragment[],\n },\n};\n\nexport interface ContractOptions {\n /** RPC endpoint or injected EIP-1193 provider */\n provider?: ethers.providers.Provider;\n /** Only required if you need to send txns */\n signer?: Signer;\n}\n\nexport class EthereumContractService {\n private provider?: providers.Provider;\n private signer?: Signer;\n\n public readonly contract: { [N in ContractName]: ethers.Contract } = {} as any;\n public readonly iface: { [N in ContractName]: ethers.utils.Interface } = {} as any;\n\n constructor(opts: ContractOptions) {\n this.provider = opts.provider;\n this.signer = opts.signer;\n\n (Object.keys(CONTRACTS) as ContractName[]).forEach((name) => {\n const { address, abi } = CONTRACTS[name];\n this.iface[name] = new ethers.utils.Interface(abi);\n this.contract[name] = new ethers.Contract(\n address,\n abi,\n this.signer ?? this.provider\n );\n });\n }\n\n /** Get raw address for a contract */\n public getAddress(name: ContractName): string {\n return CONTRACTS[name].address;\n }\n\n /** Utility: get a read-only handle even if signer is present */\n public getReadOnly(name: ContractName): Contract {\n const { address, abi } = CONTRACTS[name];\n return new Contract(address, abi, this.provider);\n }\n\n /** Utility: get a write-enabled handle (throws if no signer) */\n public getWrite(name: ContractName): Contract {\n if (!this.signer) throw new Error('No signer available for write calls');\n const { address, abi } = CONTRACTS[name];\n return new Contract(address, abi, this.signer);\n }\n\n /** Expose network info */\n async getNetwork() {\n return this.provider?.getNetwork();\n }\n\n /** List all known contract names */\n public listContractNames(): ContractName[] {\n return Object.keys(CONTRACTS) as ContractName[];\n }\n\n /** Get Interface instance for a contract */\n public getInterface(name: ContractName): ethers.utils.Interface {\n const iface = this.iface[name];\n if (!iface) throw new Error(`Interface not initialized for ${name}`);\n return iface;\n }\n\n /** Get live Contract instance */\n public getContract(name: ContractName): ethers.Contract {\n const ctr = this.contract[name];\n if (!ctr) throw new Error(`Contract not initialized for ${name}`);\n return ctr;\n }\n\n /** A unified Interface containing all ABIs to parse custom errors or events. */\n public get omniInterface(): ethers.utils.Interface {\n const all: any[] = [];\n\n const allArtifacts = [\n ERC20Artifact,\n ERC721Artifact,\n ERC1155Artifact,\n\n // liqETH suite\n AccountingArtifact,\n DepositManagerArtifact,\n LiqEthArtifact,\n // LiqEthBurnArtifact,\n // LiqEthMintArtifact,\n // RewardsERC20Artifact,\n StakingModuleArtifact,\n // ValidatorBalanceArtifact,\n WithdrawalQueueArtifact,\n WithdrawalVaultArtifact,\n // YieldArtifact,\n ];\n\n allArtifacts.forEach(artifact => {\n if (artifact && artifact.abi) {\n all.push(...artifact.abi);\n }\n });\n\n const seen = new Set<string>();\n const dedup: any[] = [];\n for (const item of all) {\n try {\n const frag = ethers.utils.Fragment.from(item);\n const key = `${frag.type}:${frag.format(ethers.utils.FormatTypes.full)}`.toLowerCase();\n if (!seen.has(key)) {\n seen.add(key);\n dedup.push(item);\n }\n } catch {\n // ignore bad fragments\n }\n }\n\n return new ethers.utils.Interface(dedup);\n }\n\n /** Decode a revert or custom error payload */\n public parseError(revertData: string): ErrorDescription {\n try {\n return this.omniInterface.parseError(revertData);\n } catch {\n throw new Error(`Unable to parse error data: ${revertData}`);\n }\n }\n}","\nimport { ethers } from \"ethers\";\nimport { TrancheLadderItem, TrancheSnapshot } from \"../../types\";\nimport { ChainID } from \"@wireio/core\";\n\n\nconst BPS = BigInt(10_000);\n\nexport interface CustomContractError {\n name?: string;\n signature?: string;\n args?: any[];\n data?: any;\n method?: string;\n code?: any;\n raw: string;\n}\n\n\n\nexport function formatContractErrors(err: any): CustomContractError {\n // Extract custom error details if present\n if (err.errorName && err.errorArgs) {\n const errorObj: CustomContractError = {\n name: err.errorName,\n signature: err.errorSignature,\n args: err.errorArgs.map((arg: any) =>\n arg && arg._isBigNumber ? ethers.BigNumber.from(arg).toString() : arg\n ),\n data: err.data,\n method: err.method,\n code: err.code,\n raw: err,\n };\n console.error(\"Custom contract error:\", errorObj);\n return errorObj;\n } else {\n console.error(\"Contract Error:\", err);\n return {\n raw: typeof err === 'string' ? err : (err?.message || String(err))\n };\n }\n}\n\n\n\n/**\n * Finalize an OPP epoch. Optionally accept a gasLimit override (ethers BigNumberish).\n * If gasLimit is not provided, the method will attempt estimateGas.finalizeEpoch()\n * and pad it (1.2x). If estimateGas fails, a conservative fallback is used.\n */\nexport async function sendOPPFinalize(opp: ethers.Contract, gasLimit?: ethers.BigNumberish) {\n const overrides: any = {};\n try {\n if (gasLimit === undefined) {\n try {\n const estimated = await opp.estimateGas.finalizeEpoch();\n const padded = ethers.BigNumber.from(estimated).mul(12).div(10); // 1.2x\n overrides.gasLimit = padded;\n console.log('sendFinalize: estimated gas', estimated.toString(), 'padded to', overrides.gasLimit.toString());\n } catch (estErr) {\n // estimateGas can throw UNPREDICTABLE_GAS_LIMIT; fall back to a safe default\n console.warn('sendFinalize: estimateGas.finalizeEpoch() failed, falling back to hardcoded gasLimit', estErr);\n overrides.gasLimit = ethers.BigNumber.from(8000000);\n }\n } else {\n overrides.gasLimit = ethers.BigNumber.from(gasLimit);\n console.log('sendFinalize: using provided gasLimit override', overrides.gasLimit.toString());\n }\n\n const tx = await opp.finalizeEpoch(overrides); // submit tx with overrides\n console.log('sendFinalize tx hash:', tx.hash, 'overrides:', overrides);\n\n const receipt = await tx.wait(); // wait for mined\n console.log('sendFinalize tx mined, block:', receipt.blockNumber);\n return receipt;\n } catch (err: any) {\n // Verbose error logging to help debugging reverts / provider issues\n console.error('sendFinalize() failed:', err?.message || err);\n\n // Try to extract common raw payload locations used by ethers errors\n const raw = err?.error?.data || err?.data || err?.body || err?.receipt || err?.transaction || err;\n console.error('sendFinalize raw payload:', raw);\n\n // Try parsing with contractService if available\n try {\n const parsed = formatContractErrors(raw);\n console.error('sendFinalize parsed error:', parsed.name, parsed.args);\n } catch (parseErr) {\n // Fallback: decode Error(string) ABI encoded revert (0x08c379a0)\n try {\n const hex = (typeof raw === 'string') ? raw : (raw && raw.data) ? raw.data : null;\n if (hex && typeof hex === 'string' && hex.startsWith('0x08c379a0')) {\n const reason = ethers.utils.defaultAbiCoder.decode(['string'], '0x' + hex.slice(10))[0];\n console.error('sendFinalize revert reason:', reason);\n } else {\n console.error('sendFinalize: unable to decode revert payload (not standard Error(string))');\n }\n } catch (fallbackErr) {\n console.error('sendFinalize: fallback decode failed:', fallbackErr);\n }\n }\n\n // If there is a receipt, print it for extra context\n if (err?.receipt) console.error('sendFinalize receipt:', err.receipt);\n if (err?.transaction) console.error('sendFinalize transaction object:', err.transaction);\n\n // Re-throw so callers can handle it as well\n throw err;\n }\n}\n\n\n\n/**\n * Apply one forward growth step: value * (BPS + growthBps) / BPS.\n * Simple integer round-half-up.\n */\nfunction growOnce(value: bigint, growthBps: number): bigint {\n const g = BigInt(growthBps);\n return (value * (BPS + g) + BPS / BigInt(2)) / BPS;\n}\n\n\n/**\n * Apply one backward step: value * BPS / (BPS + growthBps).\n * Also integer round-half-up.\n */\nfunction shrinkOnce(value: bigint, growthBps: number): bigint {\n const g = BigInt(growthBps);\n return (value * BPS + (BPS + g) / BigInt(2)) / (BPS + g);\n}\n\n\n/**\n * Calculate the full supply for a given tranche using BigInt math.\n * trancheNumber is 1-based (tranche 1 = startSupply)\n */\nfunction getTrancheSize(startSupply: bigint, supplyGrowthBps: number, trancheNumber: number): bigint {\n let supply = startSupply;\n for (let i = 0; i < trancheNumber; i++) {\n supply = (supply * (BPS + BigInt(supplyGrowthBps)) + BPS / BigInt(2)) / BPS;\n }\n return supply;\n}\n\n\n/**\n * Build a local tranche ladder around the current tranche\n * using only on-chain config + current state.\n *\n */\nexport function buildEthereumTrancheLadder(options: {\n currentTranche: number;\n totalTrancheSupply: bigint,\n initialTrancheSupply: bigint;\n currentTrancheSupply: bigint;\n currentPriceUsd: bigint;\n supplyGrowthBps: number;\n priceIncrementUsd: number;\n windowBefore?: number;\n windowAfter?: number;\n}): TrancheLadderItem[] {\n const {\n currentTranche,\n initialTrancheSupply,\n currentTrancheSupply,\n currentPriceUsd,\n supplyGrowthBps,\n priceIncrementUsd,\n windowBefore = 5,\n windowAfter = 5,\n } = options;\n\n const startId = Math.max(0, currentTranche - windowBefore);\n const endId = currentTranche + windowAfter;\n \n //calculate total tranche size (e.g. 60,600 on tranche 2)\n const currentTrancheSize = getTrancheSize(initialTrancheSupply, supplyGrowthBps, currentTranche);\n\n const capacity = new Map<number, bigint>();\n const price = new Map<number, bigint>();\n\n // Seed current\n capacity.set(currentTranche, currentTrancheSize);\n price.set(currentTranche, currentPriceUsd);\n\n // Forward (future tranches)\n for (let id = currentTranche + 1; id <= endId; id++) {\n const prevCap = capacity.get(id - 1)!;\n const prevPrice = price.get(id - 1)!;\n capacity.set(id, growOnce(prevCap, supplyGrowthBps));\n price.set(id, growOnce(prevPrice, priceIncrementUsd));\n }\n\n // Backward (past tranches)\n for (let id = currentTranche - 1; id >= startId; id--) {\n const nextCap = capacity.get(id + 1)!;\n const nextPrice = price.get(id + 1)!;\n capacity.set(id, shrinkOnce(nextCap, supplyGrowthBps));\n price.set(id, shrinkOnce(nextPrice, priceIncrementUsd));\n }\n\n const ladder: TrancheLadderItem[] = [];\n for (let id = startId; id <= endId; id++) {\n const cap = capacity.get(id)!;\n let sold: bigint;\n if (id < currentTranche) {\n sold = cap;\n } else if (id === currentTranche) {\n sold = cap - currentTrancheSupply;\n } else {\n sold = BigInt(0);\n }\n\n ladder.push({\n id,\n capacity: cap,\n sold,\n remaining: cap - sold,\n priceUsd: price.get(id)!,\n });\n }\n\n return ladder;\n}\n\n\n/**\n * Turn raw liqsol_core accounts into a chain-agnostic TrancheSnapshot for SOL.\n * All math stays here; TokenClient just wires accounts + connection.\n */\nexport async function buildEthereumTrancheSnapshot(options: {\n chainID: ChainID;\n totalSharesBn;\n indexBn;\n trancheNumberBn;\n currentTrancheSupply;\n tranchePriceWadBn;\n totalTrancheSupply;\n initialTrancheSupply;\n supplyGrowthBps;\n priceIncrementUsd;\n minPriceUsd;\n maxPriceUsd;\n\n ethPriceUsd?: bigint;\n nativePriceTimestamp?: number;\n ladderWindowBefore?: number;\n ladderWindowAfter?: number;\n}): Promise<TrancheSnapshot> {\n const {\n chainID,\n ethPriceUsd,\n nativePriceTimestamp,\n ladderWindowBefore,\n ladderWindowAfter,\n\n totalSharesBn, \n indexBn, \n trancheNumberBn, \n currentTrancheSupply, \n tranchePriceWadBn, \n totalTrancheSupply,\n initialTrancheSupply,\n supplyGrowthBps,\n priceIncrementUsd,\n minPriceUsd, \n maxPriceUsd,\n } = options;\n\n\n // convert default BigNumber to bigint for hub to handle, and partially convert from 1e18 to 1e8 for the hub\n const totalShares = BigInt(totalSharesBn.toString()) / BigInt(1e10);\n const currentIndex = BigInt(indexBn.toString()); // RAY (1e27)\n const currentTranche = Number(trancheNumberBn.toString());\n const currentPriceUsd = BigInt(tranchePriceWadBn.toString()) / BigInt(1e10); // 1e18 WAD\n\n\n const ladder = buildEthereumTrancheLadder({\n currentTranche,\n totalTrancheSupply,\n initialTrancheSupply,\n currentTrancheSupply,\n currentPriceUsd,\n supplyGrowthBps,\n priceIncrementUsd,\n windowBefore: ladderWindowBefore,\n windowAfter: ladderWindowAfter,\n });\n\n\n return {\n chainID,\n currentIndex,\n totalShares,\n currentTranche,\n currentPriceUsd,\n supplyGrowthBps,\n priceIncrementUsd,\n currentTrancheSupply,\n initialTrancheSupply,\n totalPretokensSold: totalTrancheSupply,\n nativePriceUsd: ethPriceUsd,\n nativePriceTimestamp,\n ladder,\n };\n}\n","import { BigNumber, ethers } from \"ethers\";\nimport { DepositEvent, DepositResult, SharesBurnedEvent } from \"../types\";\nimport { EthereumContractService } from \"../contract\";\nimport { formatContractErrors } from \"../utils\";\n\nexport class ConvertClient {\n\n private readonly contractService: EthereumContractService;\n \n get contract() { return this.contractService.contract; }\n\n constructor(contract: EthereumContractService) {\n this.contractService = contract;\n }\n \n\n /**\n * Simulate a deposit via callStatic.\n *\n * Useful for pre-flight checks; will throw with the same revert\n * reason as a real tx if it would fail.\n */\n async simulateDeposit(amount: number | string | bigint | BigNumber): Promise<void> {\n const amountWei = BigNumber.isBigNumber(amount)\n ? amount\n : BigNumber.from(amount);\n\n // callStatic executes the function locally without sending a tx.\n // deposit() doesn't return anything, so we only care if it reverts.\n await this.contract.DepositManager.callStatic.deposit({\n value: amountWei,\n });\n }\n\n\n\n /**\n * \n * @param amountWei an amount of WEI to deposit in exchange for liqETH\n * @returns the hash of the transaction\n */\n async performDeposit(amountWei: BigNumber): Promise<DepositResult> {\n // Pre-check minDeposit\n const minDeposit: BigNumber = await this.contract.DepositManager.minDeposit();\n if (amountWei.lt(minDeposit)) {\n console.warn('less than min deposit');\n throw new Error(\n `Deposit amount below minDeposit: ` +\n `amount=${ethers.utils.formatEther(amountWei)} ETH, ` +\n `min=${ethers.utils.formatEther(minDeposit)} ETH`\n );\n }\n\n let tx, receipt;\n try {\n tx = await this.contract.DepositManager.deposit({ value: amountWei });\n receipt = await tx.wait(1);\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n\n\n // Parse Deposited event if present\n let deposited: DepositEvent | undefined;\n const ev = receipt.events?.find((e) => e.event === 'Deposited');\n\n if (ev && ev.args) {\n const { user, netEth, fee, shares } = ev.args;\n deposited = {\n user,\n netEth: BigNumber.from(netEth),\n fee: BigNumber.from(fee),\n shares: BigNumber.from(shares),\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n deposited,\n };\n }\n\n\n public async performWithdraw(signerAddress: string, amountWei: BigNumber): Promise<any> {\n let tx, receipt;\n try {\n tx = await this.contract.LiqEthToken.safeBurn(signerAddress, amountWei);\n receipt = await tx.wait(1);\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n\n // Parse SharesBurned event if present\n let event: SharesBurnedEvent | undefined;\n const ev = receipt.events?.find((e) => e.event === 'SharesBurned');\n\n if (ev && ev.args) {\n const { from, shares, tokenValue } = ev.args;\n event = {\n from,\n shares: BigNumber.from(shares),\n tokenValue: BigNumber.from(tokenValue),\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n event,\n };\n }\n\n\n \n /*\n // OLD - this was replaced with LiqEth.safeBurn() on 1/13/26\n async requestWithdraw(amountWei: BigNumber, signer: Signer, chainId: ChainID): Promise<WithdrawResult> {\n // deadline is a period of time in the future that the signature is valid for\n const deadline = Math.floor(Date.now() / 1000) + 3600;\n\n const liqEth = this.contract.LiqEth;\n const owner = await signer.getAddress();\n \n const nonce: BigNumber = await liqEth.nonces(owner);\n const domain = {\n name: await liqEth.name(),\n version: '1',\n chainId,\n verifyingContract: this.contract.LiqEthToken.address,\n } as any;\n\n const types = {\n Permit: [\n { name: 'owner', type: 'address' },\n { name: 'spender', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'nonce', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n ],\n } as any;\n\n const values = {\n owner,\n spender: this.contractService.getAddress('DepositManager'),\n value: amountWei,\n nonce: nonce,\n deadline,\n } as any;\n\n const signature = await (signer as any)._signTypedData(domain, types, values);\n const split = ethers.utils.splitSignature(signature);\n\n const tx = await this.contract.DepositManager.requestWithdrawal(\n amountWei,\n deadline,\n split.v,\n split.r,\n split.s\n );\n\n // wait for 1 confirmation\n const receipt = await tx.wait(1);\n\n // if WithdrawRequested event exists, parse it and get arguments\n let withdrawRequested: WithdrawRequestedEvent | undefined;\n const ev = receipt.events?.find((e) => e.event === 'WithdrawRequested');\n\n if (ev && ev.args) {\n const { user, ethAmount, nftId, readyAt } = ev.args;\n withdrawRequested = {\n user,\n ethAmount: BigNumber.from(ethAmount),\n nftId: BigNumber.from(nftId),\n readyAt: readyAt,\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n withdrawRequested,\n } as WithdrawResult;\n }\n */\n\n\n\n\n}","import { BigNumber, ethers } from \"ethers\";\nimport { StakedEvent, WithdrawnStakeEvent, WithdrawnStakeResult } from \"../types\";\nimport { EthereumContractService } from \"../contract\";\nimport { formatContractErrors } from \"../utils\";\n\nexport class StakeClient {\n\n private readonly contractService: EthereumContractService;\n \n get contract() { return this.contractService.contract; }\n\n constructor(contract: EthereumContractService) {\n this.contractService = contract;\n }\n \n\n\n /**\n * Simulate a stake via callStatic\n */\n async simulateStake(amountWei: BigNumber): Promise<void> {\n try {\n await this.contract.Depositor.callStatic.stakeLiqETH(amountWei);\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n }\n\n\n\n /**\n * \n * @param amountWei an amount of liqETH (in WEI) to stake to the Outpost\n * @returns txHash (hash of the transaction), receipt, Staked event\n */\n async performStake(amountWei: BigNumber, signerAddress: string): Promise<any> {\n const depositor = this.contract.Depositor.address;\n const liqRead = this.contract.LiqEthToken;\n const bal = await liqRead.balanceOf(signerAddress);\n const allowance = await liqRead.allowance(signerAddress, depositor);\n\n const paused = await this.contract.Depositor.paused();\n if(paused) {\n throw new Error(\"Error - Depositor is in a paused state\");\n }\n\n\n // if allowance is less than the requested stake amount, request permission to spend LiqEth\n if (allowance.lt(amountWei)) {\n const liqWrite = this.contractService.getWrite('LiqEthToken');\n\n // currently requested unlimited amount - potentially change to only request up to the current amount?\n const approveAmount = ethers.constants.MaxUint256;\n\n console.warn(`allowance insufficient (${allowance.toString()} < ${amountWei.toString()}); sending approve(${depositor}, ${approveAmount.toString()})`);\n const approveTx = await liqWrite.approve(depositor, approveAmount);\n await approveTx.wait(1);\n\n // re-read allowance to ensure approval succeeded\n const newAllowance = await liqRead.allowance(signerAddress, depositor);\n if (newAllowance.lt(amountWei)) {\n throw new Error('Approval failed or allowance still insufficient after approve');\n }\n }\n \n \n await this.simulateStake(amountWei);\n\n\n // send the tx to stake liqeth\n const tx = await this.contract.Depositor.stakeLiqETH(amountWei);\n\n // Wait for 1 confirmation \n const receipt = await tx.wait(1);\n\n // Parse Staked event if present\n let staked: StakedEvent | undefined;\n const ev = receipt.events?.find((e) => e.event === 'Staked');\n\n if (ev && ev.args) {\n const { user, amountLiq, shares, tokenId } = ev.args;\n staked = {\n user,\n amountLiq: BigNumber.from(amountLiq),\n shares: BigNumber.from(shares),\n tokenId: BigNumber.from(tokenId)\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n staked,\n };\n }\n\n\n\n /**\n * \n * @param amountWei an amount of liqETH (in WEI) to stake to the Outpost\n * @returns txHash (hash of the transaction), receipt, WithdrawnStake event\n */\n async performWithdrawStake(tokenId: BigNumber, recipient: string): Promise<WithdrawnStakeResult> {\n // Send the payable tx\n const tx = await this.contract.Depositor.withdrawStake(tokenId, recipient);\n\n // Wait for 1 confirmation \n const receipt = await tx.wait(1);\n\n // Parse Staked event if present\n let withdrawnstake: WithdrawnStakeEvent | undefined;\n const ev = receipt.events?.find((e) => e.event === 'WithdrawnStake');\n\n if (ev && ev.args) {\n const { user, tokenOut, tokenId } = ev.args;\n withdrawnstake = {\n user: user,\n tokenOut: BigNumber.from(tokenOut),\n tokenId: BigNumber.from(tokenId)\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n withdrawnstake,\n };\n }\n}","import { BigNumber, ethers } from \"ethers\";\nimport { EthereumContractService } from \"../contract\";\nimport { formatContractErrors, sendOPPFinalize } from \"../utils\";\n\nexport class PretokenClient {\n private readonly contractService: EthereumContractService;\n \n get contract() { return this.contractService.contract; }\n\n constructor(contract: EthereumContractService) {\n this.contractService = contract;\n }\n \n\n\n /**\n * Purchase pretokens by transferring liqETH into the pool (ERC-20) and calling Depositor.purchasePretokensWithLiqETH(amountLiq, buyer).\n * Returns txHash, receipt and parsed PurchasedWithLiqETH event (if present).\n */\n async purchasePretokensWithLiqETH(amountLiq: bigint, buyer: string): Promise<any> {\n\n const bal = await this.contract.LiqEthToken.balanceOf(buyer);\n const paused = await this.contract.Depositor.paused();\n if(paused) {\n throw new Error(\"Error - Depositor is in a paused state\");\n }\n\n // if current liq balance is less than the requested buy amount, throw an error\n if (bal.lt(amountLiq)) {\n throw new Error(`Balance insufficient for pre-token purchase`);\n }\n\n //check that the contract has allowance for the token\n const depositorAddr = this.contract.Depositor.address;\n const allowance = await this.contract.LiqEthToken.allowance(buyer, depositorAddr);\n\n // if allowance is less than the requested stake amount, request permission to spend LiqEth\n if (allowance.lt(amountLiq)) {\n const liqWrite = this.contractService.getWrite('LiqEthToken');\n\n // currently requested unlimited amount - potentially change to only request up to the current amount?\n const approveAmount = ethers.constants.MaxUint256;\n\n console.warn(`allowance insufficient (${allowance.toString()} < ${amountLiq.toString()}); sending approve(${depositorAddr}, ${approveAmount.toString()})`);\n\n const approveTx = await liqWrite.approve(depositorAddr, approveAmount);\n await approveTx.wait(1);\n\n // re-read allowance to ensure approval succeeded\n const newAllowance = await this.contract.LiqEthToken.allowance(buyer, depositorAddr);\n if (newAllowance.lt(amountLiq)) {\n throw new Error('Approval failed or allowance still insufficient after approve');\n }\n }\n \n // attempt a simulation of the purchase call\n try {\n const amountLiqBN = BigNumber.from(amountLiq)\n await this.contract.Depositor.callStatic.purchasePretokensWithLiqETH(amountLiqBN, buyer);\n } catch (err: any) {\n console.log('err', err);\n \n let errorObj = formatContractErrors(err);\n\n // ! TEMP for testing\n if(errorObj.name == \"OPP_PreviousEpochUnsent\") {\n console.error(\"OPP Previous Epoch is unsent - trigger OPP finalizeEpoch()\")\n await sendOPPFinalize(this.contract.OPP);\n throw new Error(errorObj.name+` - triggering OPP finalizeEpoch() please try again`);\n }\n\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n\n // attempt the real purchase call\n let tx, receipt;\n try {\n tx = await this.contract.Depositor.purchasePretokensWithLiqETH(amountLiq, buyer);\n receipt = await tx.wait(1);\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n\n\n // Attempt to parse PurchasedWithLiqETH event\n let purchased: any | undefined;\n const ev = receipt.events?.find((e) => e.event === 'PurchasedWithLiqETH' || (e.event && e.event.toString().startsWith('PurchasedWithLiqETH')));\n\n if (ev && ev.args) {\n // Event shape: PurchasedWithLiqETH(buyer, amountLiq, ethEqWei, shares, tokenId)\n const args: any = ev.args;\n // try named fields first, fallback to positional\n const evtBuyer = args.buyer ?? args[0];\n const evtAmountLiq = (args.amountLiq ?? args[1]) ? BigNumber.from(args.amountLiq ?? args[1]) : undefined;\n const evtEthEqWei = (args.ethEqWei ?? args[2]) ? BigNumber.from(args.ethEqWei ?? args[2]) : undefined;\n const evtShares = (args.shares ?? args[3]) ? BigNumber.from(args.shares ?? args[3]) : undefined;\n const evtTokenId = (args.tokenId ?? args[4]) ? BigNumber.from(args.tokenId ?? args[4]) : undefined;\n\n purchased = {\n buyer: evtBuyer,\n amountLiq: evtAmountLiq,\n ethEqWei: evtEthEqWei,\n shares: evtShares,\n tokenId: evtTokenId,\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n purchased,\n };\n }\n\n\n\n\n /**\n * Purchase pretokens by sending ETH to the Depositor.purchasePretokensWithETH(buyer) payable function.\n * Returns txHash, receipt and parsed PurchasedWithETH event (if present).\n async purchasePretokensWithETH(amountWei: BigNumber, buyer: string): Promise<any> {\n // attempt a simulation of the purchase call\n try {\n await this.contract.Depositor.callStatic.purchasePretokensWithETH(buyer, { value: amountWei });\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n\n // attempt the real purchase call\n let tx, receipt;\n try {\n tx = await this.contract.Depositor.purchasePretokensWithETH(buyer, { value: amountWei });\n receipt = await tx.wait(1);\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n\n\n // Attempt to parse PurchasedWithETH event\n let purchased: any | undefined;\n const ev = receipt.events?.find((e) => e.event === 'PurchasedWithETH' || e.event === 'PurchasedWithETH(address,uint256,uint256,uint256)');\n\n if (ev && ev.args) {\n // event signature: PurchasedWithETH(address indexed user, uint256 ethIn, uint256 shares, uint256 tokenId)\n const { user, ethIn, shares, tokenId } = ev.args as any;\n\n purchased = {\n buyer: user,\n amount: BigNumber.from(ethIn),\n shares: BigNumber.from(shares),\n tokenId: BigNumber.from(tokenId),\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n purchased,\n };\n }\n */\n\n \n\n}","import { ethers } from \"ethers\";\nimport { EthereumContractService } from \"../contract\";\nimport { OPPAssertion } from \"../../../types\";\n\n\nexport class OPPClient {\n\n \n private readonly decoders: Record<number, Decoder> = {\n 2001: (d) => this.decode2001(d),\n 2002: (d) => this.decode2002(d),\n\n 3001: (d) => this.decodeStake3001(d),\n 3002: (d) => this.decodeUnstake3002(d),\n // 3003 not implemented\n 3004: (d) => this.decodeLiqPretoken3004(d),\n 3005: (d) => this.decodePretoken3005(d),\n 3006: (d) => this.decodeYieldPretoken3006(d),\n };\n \n private readonly contractService: EthereumContractService;\n \n get contract() { return this.contractService.contract; }\n\n constructor(contract: EthereumContractService) {\n this.contractService = contract;\n }\n \n\n\n /**\n * Read OPP / Outpost state used by the Depositor to decide whether staking is allowed.\n * Returns various data\n */\n async getStatus(): Promise<any> {\n const depositor = this.contract.Depositor;\n const opp = this.contract.OPP;\n\n \n const oppAddress: string = await depositor.oppAddress();\n const oppInboundAddress: string = await depositor.oppInboundAddress();\n const prevEpochSent = await opp.prevEpochSent();\n \n\n const inbound = this.contractService.getReadOnly('OPPInbound');\n\n // Query useful getters\n const nextEpochBN: any = await inbound.nextEpochNum();\n const pendingEpochRaw: any = await inbound.pendingEpoch();\n const pendingMessageCount: any = await inbound.pendingMessageCount();\n const previousEpochHash: string = await inbound.previousEpochHash();\n const nextEpochNum = (nextEpochBN && typeof nextEpochBN.toNumber === 'function') ? nextEpochBN.toNumber() : Number(nextEpochBN || 0);\n\n const pendingEpoch = (pendingEpochRaw && pendingEpochRaw.epochNumber !== undefined)\n ? {\n epochNumber: (pendingEpochRaw.epochNumber && typeof pendingEpochRaw.epochNumber.toNumber === 'function') ? pendingEpochRaw.epochNumber.toNumber() : Number(pendingEpochRaw.epochNumber || 0),\n timestamp: (pendingEpochRaw.timestamp && typeof pendingEpochRaw.timestamp.toNumber === 'function') ? pendingEpochRaw.timestamp.toNumber() : Number(pendingEpochRaw.timestamp || 0),\n prevEpochHash: pendingEpochRaw.prevEpochHash,\n merkleRoot: pendingEpochRaw.merkleRoot,\n firstMessageID: pendingEpochRaw.firstMessageID,\n lastMessageID: pendingEpochRaw.lastMessageID,\n }\n : null;\n\n const pendingMessagesBN = pendingMessageCount;\n const pendingMessages = (pendingMessagesBN && typeof pendingMessagesBN.toString === 'function') ? pendingMessagesBN.toString() : String(pendingMessagesBN || '0');\n\n const hasPendingMessages = (pendingMessagesBN && typeof pendingMessagesBN.gt === 'function') ? pendingMessagesBN.gt(0) : (Number(pendingMessages) > 0);\n\n return {\n oppAddress,\n prevEpochSent,\n oppInboundAddress,\n nextEpochNum,\n pendingEpoch,\n pendingMessageCount: pendingMessages,\n previousEpochHash,\n hasPendingMessages,\n raw: {\n nextEpochBN,\n pendingEpochRaw,\n pendingMessageCount: pendingMessagesBN,\n },\n };\n }\n\n \n\n\n /**\n * Fetches all OPPMessage events and flattens all assertions into a single OPPAssertion[] array.\n */\n async getMessages(address: string): Promise<OPPAssertion[]> {\n const oppMessageFilter = this.contract.OPP.filters.OPPMessage();\n const events = await this.contract.OPP.queryFilter(oppMessageFilter, 0, \"latest\");\n const allAssertions: OPPAssertion[] = [];\n for (const event of events) {\n const assertions = await this.extractAssertionsFromEvent(event);\n allAssertions.push(...assertions);\n }\n\n // ! Current implementation is not ideal - no current way to filter OPP Messages by a single user\n const normalized = address ? address.toLowerCase() : null;\n const filtered = allAssertions.filter(a =>\n (a.from && a.from.toLowerCase() === normalized) ||\n (a.to && a.to.toLowerCase() === normalized)\n );\n return filtered.reverse();\n }\n\n\n\n\n\n /**\n * Extracts all OPPAssertions from a single OPPMessage event, attaching event metadata to each.\n */\n private async extractAssertionsFromEvent(event: any): Promise<OPPAssertion[]> {\n const header = event.args.header;\n const payloadAssertions = event.args.payload.assertions;\n\n const timestamp = header.timestamp ? Number(header.timestamp) : null;\n const from = event.address || null;\n const txHash = event.transactionHash;\n const chain = 'ETH';\n\n const assertionList: OPPAssertion[] = [];\n\n if (payloadAssertions && payloadAssertions.length > 0) {\n for (let a of payloadAssertions) {\n const assertionType = a[0] as number;\n const assertionData = a[1] as string;\n\n\n let type: OPPAssertion[\"type\"] = \"unknown\";\n let data: any = {};\n let to: string | null = null;\n\n const decoder = this.decoders[assertionType];\n\n if (decoder) {\n try {\n const decoded = decoder(assertionData);\n type = decoded.type;\n data = decoded.data;\n to = decoded.to ?? null;\n } catch (e: any) {\n // catch a bad assertion so it doesn't fail the entire function\n type = \"unknown\";\n data = {\n decodeError: e?.message ?? String(e),\n assertionType,\n rawHex: assertionData,\n };\n }\n } else {\n // Unknown assertion type\n data = { assertionType, rawHex: assertionData };\n }\n\n assertionList.push({\n type,\n data,\n chain,\n timestamp,\n from,\n to,\n txHash,\n raw: event,\n });\n }\n }\n return assertionList;\n }\n \n\n\n private decode2001(assertionData: string): DecoderResult {\n const hex = this.strip0x(assertionData);\n\n let cursor = 0;\n const r1 = this.readAddress(hex, cursor); cursor = r1.next;\n const r2 = this.readAddress(hex, cursor); cursor = r2.next;\n const r3 = this.readBytes32(hex, cursor); cursor = r3.next;\n const r4 = this.readUint256LE(hex, cursor); cursor = r4.next;\n const r5 = this.readUint64LE(hex, cursor); cursor = r5.next;\n\n const data = {\n actor: r1.addr,\n owner: r2.addr,\n bondLevelId: r3.value,\n tokenId: r4.value,\n bondedAt: r5.value,\n };\n\n return { type: \"bonded_actor\", data, to: r1.addr };\n }\n private decode2002(assertionData: string): DecoderResult {\n const hex = this.strip0x(assertionData);\n\n let cursor = 0;\n const r1 = this.readAddress(hex, cursor); cursor = r1.next;\n const r2 = this.readBytes32(hex, cursor); cursor = r2.next;\n const r3 = this.readUint256LE(hex, cursor); cursor = r3.next;\n const r4 = this.readUint64LE(hex, cursor); cursor = r4.next;\n\n const data = {\n actor: r1.addr,\n bondLevelId: r2.value,\n tokenId: r3.value,\n unbondedAt: r4.value,\n };\n\n return { type: \"unbonded_actor\", data, to: r1.addr };\n }\n\n\n private decodeStake3001(assertionData: string): DecoderResult {\n const { addr, nums } = this.decodeAddrPlusU256(assertionData, 3);\n const [principal, shares, indexAtMint] = nums;\n\n return {\n type: \"stake\",\n data: { \n staker: addr, \n principal: ethers.utils.formatUnits(principal, 18),\n shares: ethers.utils.formatUnits(shares, 18),\n indexAtMint \n },\n to: addr,\n };\n }\n private decodeUnstake3002(assertionData: string): DecoderResult {\n const { addr, nums } = this.decodeAddrPlusU256(assertionData, 4);\n const [unstakeAmount, shares, indexAtBurn, tokenId] = nums;\n\n return {\n type: \"unstake\",\n data: { \n unstaker: addr, \n unstakeAmount: ethers.utils.formatUnits(unstakeAmount, 18),\n shares, \n indexAtBurn, \n tokenId \n },\n to: addr,\n };\n }\n private decodeLiqPretoken3004(assertionData: string): DecoderResult {\n const { addr, nums } = this.decodeAddrPlusU256(assertionData, 3);\n const [principal, shares, indexAtMint] = nums;\n\n return {\n type: \"liq_pretoken_purchase\",\n data: { \n purchaser: addr, \n principal: ethers.utils.formatUnits(principal, 18),\n shares: ethers.utils.formatUnits(shares, 18),\n indexAtMint \n },\n to: addr,\n };\n }\n private decodePretoken3005(assertionData: string): DecoderResult {\n const { addr, nums } = this.decodeAddrPlusU256(assertionData, 3);\n const [ethInWei, usdValue, pretokensOut] = nums;\n\n return {\n type: \"pretoken_purchase\",\n data: {\n buyer: addr,\n ethInWei,\n ethIn: ethers.utils.formatUnits(ethInWei, 18),\n usdValue: ethers.utils.formatUnits(usdValue, 18),\n pretokensOut: ethers.utils.formatUnits(pretokensOut, 18),\n },\n to: addr,\n };\n }\n private decodeYieldPretoken3006(assertionData: string): DecoderResult {\n const { addr, nums } = this.decodeAddrPlusU256(assertionData, 2);\n const [principal, indexAtMint] = nums;\n\n return {\n type: \"yield_pretoken_purchase\",\n data: { purchaser: addr, principal, indexAtMint },\n to: addr,\n };\n }\n\n\n\n\n /**\n * \n * @param hex string to check\n * @returns the passed string, without a prefixed 0x if it existed\n */\n private strip0x(hex: string): string {\n return hex.startsWith(\"0x\") ? hex.slice(2) : hex;\n }\n\n private decodeAddrPlusU256(assertionData: string, count: number): { addr: string; nums: string[] } {\n const hex = this.strip0x(assertionData);\n let cursor = 0;\n\n const { addr, next } = this.readAddress(hex, cursor);\n cursor = next;\n\n const nums: string[] = [];\n for (let i = 0; i < count; i++) {\n const r = this.readUint256LE(hex, cursor);\n nums.push(r.value);\n cursor = r.next;\n }\n return { addr, nums };\n }\n\n private uint256FromLE(hexNo0x: string): ethers.BigNumber {\n if (hexNo0x.length !== 64) {\n throw new Error(`uint256 LE must be 32 bytes (64 hex chars), got ${hexNo0x.length}`);\n }\n const bytes = ethers.utils.arrayify(\"0x\" + hexNo0x);\n const reversed = Uint8Array.from(bytes).reverse(); // little -> big endian\n return ethers.BigNumber.from(ethers.utils.hexlify(reversed));\n }\n\n\n /**\n * Parses \"0x14 + <addr>\" and returns addr + next cursor (in hex chars, excluding 0x)\n * @param payload full payload\n * @param cursor place to start\n * @returns string\n */\n private readAddress(payload: string, cursor: number): { addr: string; next: number } {\n const lenByteHex = payload.slice(cursor, cursor + 2);\n const len = parseInt(lenByteHex, 16);\n if (!Number.isFinite(len) || len <= 0) throw new Error(`Bad address len byte: ${lenByteHex}`);\n const start = cursor + 2;\n const end = start + len * 2;\n const addrHex = payload.slice(start, end);\n if (addrHex.length !== len * 2) throw new Error(`Truncated address bytes`);\n return { addr: ethers.utils.getAddress(\"0x\" + addrHex), next: end };\n }\n\n /**\n * Reads 32-byte uint256 little-endian from payload at cursor (hex chars, excluding 0x)\n * @param payload \n * @param cursor \n * @returns \n */\n private readUint256LE(payload: string, cursor: number): { value: string; next: number } {\n const word = payload.slice(cursor, cursor + 64);\n if (word.length !== 64) throw new Error(`Truncated uint256 at ${cursor}`);\n return { value: this.uint256FromLE(word).toString(), next: cursor + 64 };\n }\n\n /**\n * Reads 8-byte uint64 little-endian from payload at cursor (hex chars, excluding 0x)\n * @param payload \n * @param cursor \n * @returns \n */\n private readUint64LE(payload: string, cursor: number): { value: number; next: number } {\n const word = payload.slice(cursor, cursor + 16);\n if (word.length !== 16) throw new Error(`Truncated uint64 at ${cursor}`);\n const bytes = ethers.utils.arrayify(\"0x\" + word);\n const reversed = Uint8Array.from(bytes).reverse();\n const bn = ethers.BigNumber.from(ethers.utils.hexlify(reversed));\n return { value: bn.toNumber(), next: cursor + 16 };\n }\n\n /**\n * Reads bytes32 from payload at cursor (hex chars, excluding 0x)\n * @param payload \n * @param cursor \n * @returns \n */\n private readBytes32(payload: string, cursor: number): { value: string; next: number } {\n const word = payload.slice(cursor, cursor + 64);\n if (word.length !== 64) throw new Error(`Truncated bytes32 at ${cursor}`);\n return { value: \"0x\" + word, next: cursor + 64 };\n }\n\n\n}\n\n\ntype DecoderResult = { type: OPPAssertion[\"type\"]; data: any; to?: string | null };\ntype Decoder = (assertionData: string) => DecoderResult;","import { BaseSignerWalletAdapter } from '@solana/wallet-adapter-base';\nimport { PublicKey as SolPubKey } from '@solana/web3.js';\nimport { ChainID, ExternalNetwork, PublicKey } from '@wireio/core';\nimport { ethers } from 'ethers';\n\nexport type StakerConfig = {\n network: ExternalNetwork;\n provider?: BaseSignerWalletAdapter | ethers.providers.Web3Provider;\n pubKey?: PublicKey;\n}\n\nexport interface IStakingClient {\n pubKey?: PublicKey;\n network: ExternalNetwork;\n\n /** Amount is in the chain's smallest unit (lamports/wei, etc.) */\n deposit(amount: bigint): Promise<string>;\n withdraw(amount: bigint): Promise<string>;\n stake(amount: bigint): Promise<string>;\n unstake(amount: bigint): Promise<string>;\n buy(amount: bigint): Promise<string>;\n\n /** Fetch the complete user portfolio */\n getPortfolio(): Promise<Portfolio>;\n\n // Estimated total APY for staking yeild\n getSystemAPY(): Promise<number>;\n\n /**\n * Protocol fee charged for deposit from Native to LIQ\n * in Solana: amount in lamports\n * in Ethereum: amount in wei\n */\n getDepositFee(amount: bigint): Promise<bigint>;\n\n /**\n * Program-level prelaunch WIRE/tranche snapshot for this chain.\n *\n * Returns:\n * - `TrancheSnapshot` when the chain supports pretoken/tranches\n * - `null` if this chain has no WIRE/pretoken integration\n */\n getTrancheSnapshot(options?: {\n chainID?: ChainID;\n windowBefore?: number;\n windowAfter?: number;\n }): Promise<TrancheSnapshot | null>;\n \n // Estimated total APY for staking yeild\n getSystemAPY(): Promise<number>;\n\n // Protocol fee charged for deposit from Native to LIQ\n getDepositFee(amount: bigint): Promise<bigint>;\n}\n\n/**\n * Cross-chain portfolio view for a single account/wallet.\n *\n * On Solana (liqSOL + Outpost + pretokens) we fill:\n * - native: SOL wallet lamports\n * - liq: liqSOL in user ATA\n * - staked: liqSOL staked into Outpost (stakedLiqsol)\n * - wire: WIRE pretokens purchased (1e8 scale)\n * - yield: Outpost yield view (index/shares + implied claim/yield)\n *\n * On other chains:\n * - native/liq/wire/staked can still be populated as appropriate\n * - yield may be undefined if no index/shares concept exists.\n */\nexport interface Portfolio {\n /** Native balance on chain: ETH, SOL, etc. */\n native: BalanceView;\n\n /** Liquid staking token balance (LiqETH, LiqSOL, etc.). */\n liq: BalanceView;\n\n /**\n * Outpost-staked balance:\n * - On Solana: liqSOL staked via `synd` (stakedLiqsol, in lamports).\n * - On other chains: protocol-specific staked principal, if any.\n */\n staked: BalanceView;\n\n /**\n * Prelaunch WIRE “shares” (pretokens).\n * - On Solana: totalPretokensPurchased (1e8 scale).\n * - On other chains: analogous pretoken balance if supported.\n */\n wire: BalanceView;\n\n /**\n * Yield / index-based view (SOL + Outpost only for now).\n *\n * If the connected chain doesn’t expose an index+shares model,\n * this will be undefined.\n */\n yield?: YieldView;\n\n /**\n * Extra PDAs, account addresses, and raw state useful for debugging\n * and advanced UI (e.g. tranche price, global index, PDAs).\n */\n extras?: Record<string, any>;\n\n /** Chain ID of the network from which this portfolio was fetched. */\n chainID: ChainID;\n}\n\n/**\n * Canonical view of a single balance on a given chain.\n *\n * amount – integer base units (wei, lamports, token base units)\n * symbol – display symbol (“SOL”, “LiqSOL”, “$WIRE”, etc.)\n * decimals – how many decimal places to use when formatting\n * ata – optional SPL ATA / ERC-20 address (where applicable)\n */\nexport interface BalanceView {\n amount: bigint;\n symbol: string;\n decimals: number;\n ata?: SolPubKey;\n}\n\n/**\n * Outpost yield view.\n *\n * All amounts are integers in base units (lamports for liqSOL, wei for liqETH).\n *\n * Math matches capital-staking:\n * INDEX_SCALE = 1e12\n * sharesToTokens = shares * currentIndex / INDEX_SCALE\n */\nexport interface YieldView {\n /**\n * Current global index for the Outpost pool.\n * - 1e12 scale (INDEX_SCALE)\n * - sharesToTokens(shares) = shares * currentIndex / indexScale\n */\n currentIndex: bigint;\n\n /**\n * Fixed scale factor used for index math.\n * - Always 1_000_000_000_000n (1e12) on Solana Outpost.\n */\n indexScale: bigint;\n\n /** Total shares outstanding in the Outpost pool (all users). */\n totalShares: bigint;\n\n /** User’s staked shares in the Outpost pool. */\n userShares: bigint;\n\n /**\n * Total liq (wei/lamports) the user could claim right now if they fully\n * unwound their stake:\n * estimatedClaim = userShares * currentIndex / indexScale\n */\n estimatedClaim?: bigint;\n\n /**\n * Portion of estimatedClaim that is “yield” above principal:\n * estimatedYield = max(0, estimatedClaim - staked)\n *\n * NOTE: staked principal itself is surfaced separately as\n * Portfolio.staked.amount.\n */\n estimatedYield?: bigint;\n}\n\nexport interface TrancheLadderItem {\n /** On-chain tranche id, 0-based (0,1,2,...) */\n id: number;\n /** Total capacity for this tranche (pretokens, 1e8 scale) */\n capacity: bigint;\n /** Sold amount in this tranche (1e8 scale) */\n sold: bigint;\n /** Remaining = capacity - sold (1e8 scale) */\n remaining: bigint;\n /** Price for this tranche in USD (1e8 scale) */\n priceUsd: bigint;\n}\n\nexport interface TrancheLadderItem {\n /** On-chain tranche id, 0-based (0,1,2,...) */\n id: number;\n /** Total capacity for this tranche (pretokens, 1e8 scale) */\n capacity: bigint;\n /** Sold amount in this tranche (1e8 scale) */\n sold: bigint;\n /** Remaining = capacity - sold (1e8 scale) */\n remaining: bigint;\n /** Price for this tranche in USD (1e8 scale) */\n priceUsd: bigint;\n}\n\n/**\n * Unified pretoken/tranche snapshot for any chain.\n * ETH / other chains just fill the same shape from their own contracts.\n */\nexport interface TrancheSnapshot {\n chainID: ChainID;\n\n /** Global share index (1e12 on Sol today; other chains can use their own scale) */\n currentIndex: bigint;\n /** Total accounting shares (wire pretoken “shares”) */\n totalShares: bigint;\n\n /** Current tranche id as stored on chain (0-based) */\n currentTranche: number;\n\n /** Current tranche price in USD (1e8 scale) */\n currentPriceUsd: bigint;\n\n /** Tranche curve config (per-chain) */\n // TODO make a constant?\n supplyGrowthBps: number; // e.g. 100 = +1% per tranche\n priceIncrementUsd: number; // e.g. 200 = +2% per tranche\n\n totalPretokensSold: bigint; // total pretokens sold across all tranches (1e8 scale)\n\n /** Current tranche supply state (1e8 scale) */\n currentTrancheSupply: bigint; // remaining in current tranche\n initialTrancheSupply: bigint; // capacity for current tranche\n\n /** Native token → USD price if available (SOL/USD, ETH/USD, etc, 1e8 scale) */\n nativePriceUsd?: bigint;\n /** Optional timestamp (sec) for the last recorded native price */\n nativePriceTimestamp?: number;\n\n /**\n * Local window of tranche “rows” centered around current.\n * Used directly by the frontend for ladder graphs.\n */\n ladder: TrancheLadderItem[];\n}\n\n\n// Enum describing which asset is being used to buy pretoken\nexport enum PurchaseAsset {\n SOL = 'SOL',\n LIQSOL = 'LIQSOL',\n ETH = 'ETH',\n LIQETH = 'LIQETH',\n YIELD = 'YIELD',\n}\n\nexport interface PurchaseQuote {\n purchaseAsset: PurchaseAsset;\n amountIn: bigint; // lamports / wei / token units\n\n /** Expected pretoken “shares” (pretokens) and decimals */\n wireShares: bigint; // 1e8 scale\n wireDecimals: number; // always 8 for now\n\n /** Current price + notional in USD (1e8 scale) */\n wirePriceUsd: bigint;\n notionalUsd: bigint;\n}\n\n// export interface OPPEvent {\n// type: 'liq_pretoken_purchase' | 'yield_pretoken_purchase' | 'pretoken_purchase' | 'stake' | 'unstake' | 'unknown';\n// amount: bigint | null;\n// chain: 'ETH' | 'SOL';\n// timestamp: number | null;\n// from: string | null;\n// to: string | null;\n// txHash: string;\n// raw: any;\n// assertions: OPPAssertion[]\n// }\n\nexport interface OPPAssertion {\n type: 'liq_pretoken_purchase' | 'yield_pretoken_purchase' | 'pretoken_purchase' | 'stake' | 'unstake' | 'bonded_actor' | 'unbonded_actor' | 'unknown',\n data: any\n chain: 'ETH' | 'SOL';\n timestamp: number | null;\n from: string | null;\n to: string | null;\n txHash: string;\n raw: any;\n}\n\n\n\nexport enum ReceiptNFTKind {\n STAKE = 0,\n PRETOKEN_PURCHASE = 1,\n}","import { BigNumber } from \"ethers\";\nimport { preLaunchReceipt } from \"../types\";\nimport { EthereumContractService } from \"../contract\";\nimport { ReceiptNFTKind } from \"../../../types\";\n\nexport class ReceiptClient {\n\n private readonly contractService: EthereumContractService;\n \n get contract() { return this.contractService.contract; }\n\n constructor(contract: EthereumContractService) {\n this.contractService = contract;\n }\n\n\n\n async allReceipts(address: string): Promise<preLaunchReceipt[]> {\n return this.fetchPreLaunchReceipts(address);\n }\n\n async stakeReceipts(address: string): Promise<preLaunchReceipt[]> {\n return this.fetchPreLaunchReceipts(address, ReceiptNFTKind.STAKE);\n }\n \n async pretokenReceipts(address: string): Promise<preLaunchReceipt[]> {\n return this.fetchPreLaunchReceipts(address, ReceiptNFTKind.PRETOKEN_PURCHASE);\n }\n\n\n\n /**\n * \n * @param address (string) to fetch receipts for\n * @returns preLaunchReceipt[]\n */\n async fetchPreLaunchReceipts(address: string, type?: ReceiptNFTKind): Promise<preLaunchReceipt[]> {\n const receiptContract = this.contract.ReceiptNFT;\n\n // first figure out which tokenIds this address owns, from events\n const tokenIds = await this.getOwnedTokenIdsFor(address);\n\n const results: preLaunchReceipt[] = [];\n\n // next fetch on-chain receipt data just for those ids\n for (const idBN of tokenIds) {\n try {\n const receiptData = await receiptContract.getReceipt(idBN);\n\n //skip any receipt not of the requested type\n if(type !== undefined && receiptData.kind !== type) continue;\n\n results.push({ \n tokenId: idBN.toBigInt(), \n receipt: {\n account: receiptData.account,\n currency: receiptData.currency,\n kind: receiptData.kind,\n indexAtMint: receiptData.indexAtMint.toBigInt(),\n principal: {\n amount: receiptData.principal.toBigInt(),\n decimals: 18,\n symbol: \"LiqETH\"\n },\n shares: {\n amount: receiptData.shares.toBigInt(),\n decimals: 18,\n symbol: \"LiqETH\"\n },\n timestamp: new Date(Number(receiptData.timestamp.toString()) * 1000).toLocaleString(),\n }\n });\n } catch (err) {\n // in case of any mismatch or race, just skip this id\n console.warn(`Failed to load receipt for tokenId=${idBN.toString()}`, err);\n continue;\n }\n }\n\n return results;\n }\n\n\n\n\n private async getOwnedTokenIdsFor(\n owner: string,\n fromBlock = 0,\n toBlock: number | string = \"latest\"\n ): Promise<BigNumber[]> {\n const receiptContract = this.contract.ReceiptNFT;\n\n // Logs where address received tokens\n const toLogs = await receiptContract.queryFilter(\n receiptContract.filters.Transfer(null, owner),\n fromBlock,\n toBlock\n );\n\n // Logs where address sent tokens (including burns from owner → 0)\n const fromLogs = await receiptContract.queryFilter(\n receiptContract.filters.Transfer(owner, null),\n fromBlock,\n toBlock\n );\n\n const owned = new Set<string>();\n\n // Add all received tokenIds\n for (const e of toLogs) {\n const tokenId = e.args?.tokenId;\n if (!tokenId) continue;\n owned.add(tokenId.toString());\n }\n\n // Remove all sent tokenIds\n for (const e of fromLogs) {\n const tokenId = e.args?.tokenId;\n if (!tokenId) continue;\n owned.delete(tokenId.toString());\n }\n\n // Convert to BigNumbers\n return Array.from(owned).map((id) => BigNumber.from(id));\n }\n\n\n\n}","import { BigNumber, ethers } from 'ethers';\nimport { ChainID, EvmChainID, PublicKey as WirePubKey } from '@wireio/core';\nimport {\n IStakingClient,\n OPPAssertion,\n Portfolio,\n StakerConfig,\n TrancheSnapshot\n} from '../../types';\nimport { EthereumContractService } from './contract';\nimport { preLaunchReceipt } from './types';\nimport { buildEthereumTrancheSnapshot } from './utils';\nimport { ConvertClient } from './clients/convert.client';\nimport { StakeClient } from './clients/stake.client';\nimport { PretokenClient } from './clients/pretoken.client';\nimport { OPPClient } from './clients/opp.client';\nimport { ReceiptClient } from './clients/receipt.client';\n\nexport class EthereumStakingClient implements IStakingClient {\n private readonly provider: ethers.providers.Web3Provider | ethers.providers.JsonRpcProvider;\n public readonly pubKey?: WirePubKey;\n private readonly signer?: ethers.Signer;\n private readonly contractService: EthereumContractService;\n\n private convertClient: ConvertClient;\n private pretokenClient: PretokenClient;\n private stakeClient: StakeClient;\n private oppClient: OPPClient;\n private receiptClient: ReceiptClient;\n\n\n get contract() { return this.contractService.contract; }\n get network() { return this.config.network; }\n\n constructor(private config: StakerConfig) {\n try {\n if (config.provider) {\n this.provider = config.provider as ethers.providers.Web3Provider;\n this.signer = this.provider.getSigner();\n }\n else {\n this.provider = new ethers.providers.JsonRpcProvider(config.network.rpcUrls[0]);\n }\n this.pubKey = config.pubKey;\n\n this.contractService = new EthereumContractService({\n provider: this.provider,\n signer: this.signer,\n });\n\n this.convertClient = new ConvertClient(this.contractService);\n this.pretokenClient = new PretokenClient(this.contractService);\n this.stakeClient = new StakeClient(this.contractService);\n this.oppClient = new OPPClient(this.contractService);\n this.receiptClient = new ReceiptClient(this.contractService);\n }\n catch (error) {\n // console.error('Error initializing EthereumStakingClient:', error);\n throw error;\n }\n }\n\n // ---------------------------------------------------------------------\n // Public IStakingClient Interface Methods\n // ---------------------------------------------------------------------\n\n /**\n * Deposit native ETH into the liqETH protocol via DepositManager.\n * @param amount Amount in wei (or something convertible to BigNumber).\n * Keep this as a bigint / string in the caller; avoid JS floats.\n * @returns transaction hash\n */\n async deposit(amount: number | string | bigint | BigNumber): Promise<string> {\n this.ensureUser();\n\n const amountWei = BigNumber.isBigNumber(amount)\n ? amount\n : BigNumber.from(amount);\n\n const result = await this.convertClient.performDeposit(amountWei);\n return result.txHash;\n }\n\n /**\n * Withdraw native ETH from the liqETH protocol via the liqeth safeBurn function, which burns the LiqETH and adds the user to the withdrawal queue.\n * @param amount Amount in wei (or something convertible to BigNumber).\n * @returns transaction hash\n */\n async withdraw(amount: bigint): Promise<string> {\n this.ensureUser();\n\n const address = await this.signer!.getAddress();\n const amountWei = BigNumber.from(amount);\n\n const result = await this.convertClient.performWithdraw(address, amountWei)\n return result.txHash;\n }\n\n\n /**\n * Stake liqETH via DepositManager.\n * @param amount Amount in wei - Keep this as a bigint / string in the caller; avoid JS floats.\n * @returns transaction hash\n */\n async stake(amount: bigint): Promise<string> {\n this.ensureUser();\n\n const walletAddress = await this.signer!.getAddress();\n const amountWei = BigNumber.from(amount);\n\n const result = await this.stakeClient.performStake(amountWei, walletAddress);\n return result.txHash;\n }\n\n\n // TODO\n async unstake(): Promise<string> {\n throw new Error(\"Method not yet implemented.\");\n }\n\n\n /**\n * ETH Prelaunch function to unstake liqEth\n * @param tokenId ReceiptNFT tokenId for the owned NFT that will be burned\n * @param recipient Address to receive the liqEth funds linked to the burned NFT\n * @returns the transaction hash\n */\n async unstakePrelaunch(tokenId: bigint, recipient: string): Promise<string> {\n this.ensureUser();\n\n const tokenIdBigNum = BigNumber.from(tokenId)\n const result = await this.stakeClient.performWithdrawStake(tokenIdBigNum, recipient);\n return result.txHash;\n }\n\n\n async buy(amount: bigint): Promise<string> {\n this.ensureUser();\n\n const buyer = await this.signer!.getAddress();\n\n // ! Hoodi only - check if the mock aggregator price is stale, and if so, update it before submitting the buy request\n await this.updateMockAggregatorPrice();\n\n let result = await this.pretokenClient.purchasePretokensWithLiqETH(amount, buyer);\n return result && result.txHash ? result.txHash : \"Error - no resulting txHash\";\n }\n\n\n /**\n * Resolve the user's ETH + liqETH balances.\n *\n * native = ETH in wallet\n * actual = liqETH token balance (ERC-20)\n * tracked = liqETH tracked balance (protocol/accounting view)\n */\n async getPortfolio(): Promise<Portfolio> {\n this.ensureUser();\n\n const walletAddress = await this.signer!.getAddress();\n\n // 1) Native ETH balance\n const nativeBalance = await this.provider.getBalance(walletAddress);\n const nativeDecimals = this.network?.nativeCurrency?.decimals ?? 18;\n const nativeSymbol = this.network?.nativeCurrency?.symbol ?? 'ETH';\n\n // 2) liqETH ERC-20 balance (actual)\n const liqBalance: ethers.BigNumber = await this.contract.LiqEthToken.balanceOf(walletAddress);\n const liqSymbol = 'Liq' + (this.network?.nativeCurrency?.symbol ?? 'ETH');\n\n // 3) staked liqEth ERC-20 balance (calculate from receipts)\n let stakeReceipts = await this.receiptClient.stakeReceipts(walletAddress);\n let stakeBalanceBN = BigNumber.from(0);\n for (let r of stakeReceipts) {\n stakeBalanceBN = stakeBalanceBN.add(BigNumber.from(r.receipt.principal.amount));\n }\n let stakeSharesBN = BigNumber.from(0);\n for (let r of stakeReceipts) {\n stakeSharesBN = stakeSharesBN.add(BigNumber.from(r.receipt.shares.amount));\n }\n\n // 4) WIRE pretoken balance\n const wireBalance: ethers.BigNumber = await this.contract.Pretoken.balanceOf(walletAddress);\n\n\n // 5) Calculate staking yield \n let currentIndex = BigInt(0);\n let totalShares = BigInt(0);\n let userShares = BigInt(0);\n const indexScale = BigInt(1e27);\n try {\n // These may throw if not implemented on contract\n const [indexBn, totalSharesBn] = await Promise.all([\n this.contract.Depositor.index().catch(() => BigNumber.from(0)),\n this.contract.Depositor.totalShares().catch(() => BigNumber.from(0)),\n ]);\n\n const userSharesBn = stakeSharesBN;\n currentIndex = BigInt(indexBn.toString());\n totalShares = BigInt(totalSharesBn.toString());\n userShares = BigInt(userSharesBn.toString());\n } catch {}\n\n // sharesToTokens(userShares, currentIndex) = userShares * currentIndex / indexScale\n let estimatedClaim = BigInt(0);\n let estimatedYield = BigInt(0);\n\n // started work on estimating the user's personal APY - not necessary at the moment\n // let estimatedAPY: number | null = null;\n // if (userShares > BigInt(0) && currentIndex > BigInt(0)) {\n // estimatedClaim = (userShares * currentIndex) / indexScale;\n // if (estimatedClaim > stakeBalanceBN.toBigInt()) {\n // estimatedYield = estimatedClaim - stakeBalanceBN.toBigInt();\n // }\n\n // estimatedAPY = null;\n // }\n\n const portfolio: Portfolio = {\n native: {\n amount: nativeBalance.toBigInt(),\n decimals: nativeDecimals,\n symbol: nativeSymbol,\n },\n liq: {\n amount: liqBalance.toBigInt(),\n decimals: nativeDecimals,\n symbol: liqSymbol,\n },\n staked: {\n amount: stakeBalanceBN.toBigInt(),\n decimals: nativeDecimals,\n symbol: liqSymbol,\n },\n wire: {\n amount: wireBalance.toBigInt(),\n decimals: 18,\n symbol: '$WIRE',\n },\n\n yield: {\n currentIndex,\n indexScale,\n totalShares,\n userShares,\n estimatedClaim,\n estimatedYield,\n },\n chainID: this.network.chainId\n }\n return portfolio;\n }\n\n /**\n * ETH Prelaunch function to list the Stake ReceiptNFTs owned by a specific user\n * @param address address to query the receipts for\n * @returns array of receipts\n */\n async fetchPrelaunchReceipts(address?: string): Promise<preLaunchReceipt[]> {\n this.ensureUser();\n\n if (address === undefined) address = await this.signer!.getAddress();\n\n //default to stake receipts\n return await this.receiptClient.stakeReceipts(address);\n }\n\n async getOPPMessages(address?: string): Promise<OPPAssertion[]> {\n this.ensureUser();\n\n if (!address) address = await this.signer!.getAddress();\n\n return await this.oppClient.getMessages(address);\n }\n\n // Ensure that signer wallet is available for write operations\n private ensureUser() {\n if (!this.signer) {\n throw new Error(\n 'EthereumStakingClient: write operation requires a wallet-connected Web3 provider',\n );\n }\n }\n\n\n // ---------------------------------------------------------------------\n // READ-ONLY Public Methods\n // ---------------------------------------------------------------------\n\n // Estimated total APY for staking yeild\n async getSystemAPY(): Promise<number> {\n const annualBpsBn = await this.contract.DepositManager.dailyRateBPS();\n return annualBpsBn.toNumber() / 10000; // 0.04 for 4%\n }\n\n // Protocol fee charged for deposit from Native to LIQ\n async getDepositFee(amountWei: bigint): Promise<bigint> {\n const feeBn: BigNumber = await this.contract.DepositManager.procFee(amountWei);\n return BigInt(feeBn.toString());\n }\n\n async getOPPStatus(): Promise<any> {\n return await this.oppClient.getStatus();\n }\n\n async getEthStats(): Promise<any> {\n let withdrawDelay = await this.contract.WithdrawalQueue.withdrawDelay();\n let minDeposit = await this.contract.DepositManager.minDeposit();\n let rewardCooldown = await this.contract.DepositManager.rewardCooldown();\n\n return {\n withdrawDelay,\n minDeposit,\n rewardCooldown,\n }\n }\n\n /**\n * Program-level prelaunch WIRE / tranche snapshot for Ethereum\n * \n * SUPPORTS READ-ONLY ACcESS\n */\n async getTrancheSnapshot(options?: {\n chainID?: ChainID;\n windowBefore?: number;\n windowAfter?: number;\n }): Promise<TrancheSnapshot> {\n const {\n chainID = EvmChainID.Hoodi,\n windowBefore,\n windowAfter,\n } = options ?? {};\n\n\n try {\n\n const blockNumber = await this.provider.getBlockNumber();\n const blockTag = { blockTag: blockNumber };\n\n\n // Fetch all required contract data\n const [totalSharesBn, indexBn, trancheNumberBn, trancheSupplyBn, tranchePriceWadBn, totalSupplyBn, supplyGrowthBps, priceIncrementUsd, minPriceUsd, maxPriceUsd] = await Promise.all([\n this.contract.Depositor.totalShares(blockTag),\n this.contract.Depositor.index(blockTag),\n this.contract.Pretoken.trancheNumber(blockTag),\n this.contract.Pretoken.trancheSupply(blockTag),\n this.contract.Pretoken.tranchePriceUsd(blockTag),\n this.contract.Pretoken.totalSupply(blockTag),\n this.contract.Pretoken.supplyGrowthBps(blockTag),\n this.contract.Pretoken.priceIncrementUsd(blockTag),\n this.contract.EthUsdPriceConsumer.MIN_PRICE(),\n this.contract.EthUsdPriceConsumer.MAX_PRICE(),\n ]);\n\n\n const totalTrancheSupply = BigInt(totalSupplyBn.toString()) / BigInt(1e10);\n const currentTrancheSupply = BigInt(trancheSupplyBn.toString()) / BigInt(1e10);\n\n\n // fetch price and timestamp from aggregator\n const [roundId, answer, startedAt, updatedAt, answeredInRound] = await this.contract.MockAggregator.latestRoundData();\n let ethPriceUsd: bigint = BigInt(answer.toString());\n let nativePriceTimestamp: number = Number(updatedAt);\n\n // ! Placeholder from hoodi deployment - don't think this can be fetched dynamically\n const initialTrancheSupply = BigInt(70000) * BigInt(1e8);\n\n console.log('priceIncrementUsd',priceIncrementUsd);\n \n\n return buildEthereumTrancheSnapshot({\n chainID,\n totalSharesBn,\n indexBn,\n trancheNumberBn,\n currentTrancheSupply,\n tranchePriceWadBn,\n totalTrancheSupply,\n initialTrancheSupply,\n supplyGrowthBps,\n priceIncrementUsd,\n minPriceUsd,\n maxPriceUsd,\n\n ethPriceUsd,\n nativePriceTimestamp,\n ladderWindowBefore: windowBefore,\n ladderWindowAfter: windowAfter,\n });\n }\n catch (err: any) {\n console.log(err);\n \n throw new Error(`Error fetching Ethereum tranche snapshot: ${err?.message || err}`);\n }\n }\n\n // ---------------------------------------------------------------------\n // Internal ETH Staking client helper functions\n // ---------------------------------------------------------------------\n\n // ! This is a temporary measure for Hoodi testnet because there is no aggregator deployed\n private async updateMockAggregatorPrice() {\n const aggregator = this.contract.MockAggregator;\n\n // read latest round & compute age\n const [roundId, answer, startedAt, updatedAt, answeredInRound] = await aggregator.latestRoundData();\n const now = (await this.provider.getBlock(\"latest\")).timestamp;\n const ageSec = Number(now) - Number(updatedAt);\n\n const ONE_HOUR = 1 * 3600;\n // const ONE_HOUR = 10;\n if (ageSec > ONE_HOUR) {\n // safety check - only run in non-production contexts\n const network = await this.provider.getNetwork();\n const chainId = network.chainId;\n const allowedTestChains = new Set([560048]);\n if (!allowedTestChains.has(chainId)) {\n console.warn(`MockAggregator is stale (${ageSec}s) but chainId ${chainId} is not a test/local network — skipping update.`);\n return;\n }\n\n\n //fetch the current ETH / USD price\n const res = await fetch('https://api.coingecko.com/api/v3/simple/price?ids=ethereum&vs_currencies=usd');\n const data = await res.json();\n const ethUsd = data.ethereum.usd;\n\n const currentEthPrice = ethers.utils.parseUnits(ethUsd.toString(), 8);\n\n try {\n //update to be intentionally stale\n // const alttx = await aggregator.updateStale(currentEthPrice, now - 7200);\n // const altreceipt = await alttx.wait(1);\n // console.log('stale update receipt', altreceipt)\n\n //update answer with current timestamp\n const tx = await aggregator.updateAnswer(currentEthPrice);\n const txreceipt = await tx.wait(1);\n // console.log('MockAggregator answer updated - receipt:', txreceipt)\n } catch (err: any) {\n console.error('MockAggregator updateAnswer failed', err?.message || err);\n }\n } else {\n console.log(`MockAggregator updated ${ageSec}s ago — no update needed`);\n }\n }\n}","// src/staker/staker.ts\n\nimport { ChainID, EvmChainID, SolChainID } from '@wireio/core';\nimport { IStakingClient, StakerConfig } from './types';\nimport { SolanaStakingClient } from './networks/solana/solana';\nimport { EthereumStakingClient } from './networks/ethereum/ethereum';\n\nexport class Staker {\n public selectedChainID?: ChainID;\n private clients: Map<ChainID, IStakingClient> = new Map();\n\n /**\n * Get the staking client for the currently selected chain.\n * @returns The staking client instance.\n */\n get client(): IStakingClient | undefined {\n return this.selectedChainID && this.isConfigured(this.selectedChainID)\n ? this.clients.get(this.selectedChainID) : undefined;\n }\n\n /** Is there a client configured for this chain? */\n isConfigured(chainId: ChainID): boolean {\n return this.clients.has(chainId);\n }\n\n /** List of configured chains */\n listConfigured(): ChainID[] {\n return [...this.clients.keys()];\n }\n\n constructor(config: StakerConfig | StakerConfig[], selectedChainID?: ChainID) {\n if (!config) throw new Error('StakerConfig is required');\n if (!Array.isArray(config)) config = [config];\n\n // console.log('STAKER INIT', config);\n\n config.forEach((cfg) => {\n switch (cfg.network.chainId) {\n case SolChainID.WireTestnet:\n this.clients.set(cfg.network.chainId, new SolanaStakingClient(cfg));\n break;\n\n case EvmChainID.Hoodi:\n this.clients.set(EvmChainID.Hoodi, new EthereumStakingClient(cfg));\n break;\n\n default:\n console.log(`No staking client available for chain ${cfg.network.chainId}`);\n throw new Error(`Unsupported network curve: ${cfg.network.name}`);\n }\n });\n\n this.selectedChainID = selectedChainID;\n }\n \n /**\n * Select a chain. Returns true if a client exists for it, false otherwise.\n * (We still record the selectedChainID so the UI can reflect the chosen chain.)\n */\n setChain(chainID: ChainID): boolean {\n this.selectedChainID = chainID;\n return this.clients.has(chainID);\n }\n}","import { BigNumber, ethers } from 'ethers';\nimport { BalanceView } from '../../types';\n\nexport const CONTRACT_NAMES = [\n // LiqETH contracts\n \"LiqEthAuthority\",\n \"BeaconState\",\n \"WithdrawalQueue\",\n \"LiqEthToken\",\n \"Accounting\",\n \"DepositManager\",\n \"WithdrawalVault\",\n \"StakingModule\",\n \"YieldOracle\",\n\n //Outpost contracts\n \"OutpostManagerAuthority\",\n \"iodata\",\n \"Base58\",\n \"sysio_merkle\",\n \"ReceiptNFT\",\n \"MockAggregator\",\n \"Pool\",\n \"OutpostManager\",\n \"sysio_write\",\n \"EthUsdPriceConsumer\",\n \"BAR\",\n \"OPPCommon\",\n \"OPP\",\n \"Pretoken\",\n \"OPPInbound\",\n \"Depositor\",\n\n] as const;\n\nexport type ContractName = typeof CONTRACT_NAMES[number];\nexport type AddressBook = Record<ContractName, string>;\n\n\ninterface Result {\n /** EVM transaction hash */\n txHash: string;\n /** Full receipt, if you want it */\n receipt: ethers.providers.TransactionReceipt;\n}\n\n\nexport interface DepositEvent {\n user: string;\n netEth: BigNumber;\n fee: BigNumber;\n shares: BigNumber;\n}\n\nexport interface DepositResult extends Result {\n /** Parsed Deposited event, if present */\n deposited?: DepositEvent;\n}\n\nexport interface WithdrawRequestedEvent {\n user: string;\n ethAmount: BigNumber;\n nftId: BigNumber;\n readyAt: string;\n}\n\nexport interface WithdrawResult extends Result {\n /** Parsed WithdrawRequested event, if present */\n withdrawRequested?: WithdrawRequestedEvent;\n}\n\n\nexport interface StakedEvent {\n user: string;\n amountLiq: BigNumber;\n shares: BigNumber;\n tokenId: BigNumber;\n}\n\nexport interface StakedResult extends Result {\n /** Parsed Staked event, if present */\n staked?: StakedEvent;\n}\n\n\nexport interface WithdrawnStakeEvent {\n user: string;\n tokenId: BigNumber;\n tokenOut: BigNumber;\n}\nexport interface WithdrawnStakeResult extends Result {\n /** Parsed WithdrawnStake event, if present */\n withdrawnstake?: WithdrawnStakeEvent;\n\n}\n\nexport interface SharesBurnedEvent {\n from: string;\n shares: BigNumber;\n tokenValue: BigNumber;\n}\n\nexport interface preLaunchReceipt {\n tokenId: bigint;\n receipt: {\n account: string,\n currency: number,\n kind: number,\n indexAtMint: BalanceView,\n principal: BalanceView,\n shares: BalanceView,\n timestamp: string,\n }\n}"],"names":["liqSolTokenIDL","validatorLeaderboardIDL","INDEX_SCALE","liqsolCoreJson","BPS","growOnce","shrinkOnce","SolPubKey","PublicKey","tokenId","PurchaseAsset","ReceiptNFTKind"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}