@wireio/stake 0.4.3 → 0.4.69

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 (558) hide show
  1. package/README.md +185 -243
  2. package/lib/stake.browser.js +51760 -10073
  3. package/lib/stake.browser.js.map +1 -1
  4. package/lib/stake.d.ts +11856 -882
  5. package/lib/stake.js +52320 -10531
  6. package/lib/stake.js.map +1 -1
  7. package/lib/stake.m.js +51760 -10073
  8. package/lib/stake.m.js.map +1 -1
  9. package/package.json +4 -3
  10. package/src/assets/ethereum/hoodi/common/Base58.sol/Base58.dbg.json +4 -0
  11. package/src/assets/ethereum/hoodi/common/Base58.sol/Base58.json +164 -0
  12. package/src/assets/ethereum/hoodi/common/OpenZepArtifacts.sol/__Dummy_OZ_UUPS__.dbg.json +4 -0
  13. package/src/assets/ethereum/hoodi/common/OpenZepArtifacts.sol/__Dummy_OZ_UUPS__.json +76 -0
  14. package/src/assets/ethereum/hoodi/common/RestrictedCallers.sol/RestrictedCallers.dbg.json +4 -0
  15. package/src/assets/ethereum/hoodi/common/RestrictedCallers.sol/RestrictedCallers.json +10 -0
  16. package/src/assets/ethereum/hoodi/common/iodata.sol/iodata.dbg.json +4 -0
  17. package/src/assets/ethereum/hoodi/common/iodata.sol/iodata.json +618 -0
  18. package/src/assets/ethereum/hoodi/common/iodata_util.sol/iodata_util.dbg.json +4 -0
  19. package/src/assets/ethereum/hoodi/common/iodata_util.sol/iodata_util.json +40 -0
  20. package/src/assets/ethereum/hoodi/common/sysio_data.sol/sysio_data.dbg.json +4 -0
  21. package/src/assets/ethereum/hoodi/common/sysio_data.sol/sysio_data.json +10 -0
  22. package/src/assets/ethereum/hoodi/common/sysio_errors.sol/sysio_errors.dbg.json +4 -0
  23. package/src/assets/ethereum/hoodi/common/sysio_errors.sol/sysio_errors.json +10 -0
  24. package/src/assets/ethereum/hoodi/common/sysio_merkle.sol/sysio_merkle.dbg.json +4 -0
  25. package/src/assets/ethereum/hoodi/common/sysio_merkle.sol/sysio_merkle.json +233 -0
  26. package/src/assets/ethereum/hoodi/common/sysio_name.sol/sysio_name.dbg.json +4 -0
  27. package/src/assets/ethereum/hoodi/common/sysio_name.sol/sysio_name.json +49 -0
  28. package/src/assets/ethereum/hoodi/common/sysio_pubkey.sol/sysio_pubkey.dbg.json +4 -0
  29. package/src/assets/ethereum/hoodi/common/sysio_pubkey.sol/sysio_pubkey.json +64 -0
  30. package/src/assets/ethereum/hoodi/common/sysio_read.sol/sysio_read.dbg.json +4 -0
  31. package/src/assets/ethereum/hoodi/common/sysio_read.sol/sysio_read.json +1458 -0
  32. package/src/assets/ethereum/hoodi/common/sysio_tester.sol/SysioTester.dbg.json +4 -0
  33. package/src/assets/ethereum/hoodi/common/sysio_tester.sol/SysioTester.json +1532 -0
  34. package/src/assets/ethereum/hoodi/common/sysio_verify.sol/sysio_verify.dbg.json +4 -0
  35. package/src/assets/ethereum/hoodi/common/sysio_verify.sol/sysio_verify.json +1525 -0
  36. package/src/assets/ethereum/hoodi/common/sysio_write.sol/sysio_write.dbg.json +4 -0
  37. package/src/assets/ethereum/hoodi/common/sysio_write.sol/sysio_write.json +1076 -0
  38. package/src/assets/ethereum/hoodi/liqEth/BeaconState.sol/BeaconState.dbg.json +4 -0
  39. package/src/assets/ethereum/hoodi/liqEth/DepositManager.sol/DepositManagerV2.dbg.json +4 -0
  40. package/src/assets/ethereum/hoodi/liqEth/DepositManager.sol/DepositManagerV2.json +985 -0
  41. package/src/assets/ethereum/hoodi/liqEth/LiqEthAuthority.sol/LiqEthAuthority.dbg.json +4 -0
  42. package/src/assets/ethereum/hoodi/liqEth/LiqEthCommon.sol/IAccounting.dbg.json +4 -0
  43. package/src/assets/ethereum/hoodi/liqEth/LiqEthCommon.sol/IAccounting.json +182 -0
  44. package/src/assets/ethereum/hoodi/liqEth/LiqEthCommon.sol/IDepositContract.dbg.json +4 -0
  45. package/src/assets/ethereum/hoodi/liqEth/LiqEthCommon.sol/IDepositManager.dbg.json +4 -0
  46. package/src/assets/ethereum/hoodi/liqEth/LiqEthCommon.sol/ILiqEthUpgradeable.dbg.json +4 -0
  47. package/src/assets/ethereum/hoodi/liqEth/LiqEthCommon.sol/IRewardsERC20.dbg.json +4 -0
  48. package/src/assets/ethereum/hoodi/liqEth/LiqEthCommon.sol/IRewardsERC20.json +319 -0
  49. package/src/assets/ethereum/hoodi/liqEth/LiqEthCommon.sol/IRewardsERC20Pausable.dbg.json +4 -0
  50. package/src/assets/ethereum/hoodi/liqEth/LiqEthCommon.sol/IRewardsERC20Pausable.json +333 -0
  51. package/src/assets/ethereum/hoodi/liqEth/LiqEthCommon.sol/IStakingModule.dbg.json +4 -0
  52. package/src/assets/ethereum/{ABI → hoodi}/liqEth/LiqEthCommon.sol/IStakingModule.json +1 -1
  53. package/src/assets/ethereum/hoodi/liqEth/LiqEthCommon.sol/IValidatorBalanceVerifier.dbg.json +4 -0
  54. package/src/assets/ethereum/hoodi/liqEth/LiqEthCommon.sol/IWithdrawalRecord.dbg.json +4 -0
  55. package/src/assets/ethereum/hoodi/liqEth/LiqEthCommon.sol/LiqEthCommon.dbg.json +4 -0
  56. package/src/assets/ethereum/{ABI → hoodi}/liqEth/LiqEthCommon.sol/LiqEthCommon.json +2 -2
  57. package/src/assets/ethereum/hoodi/liqEth/LiqEthDeepFreeze.sol/LiqEthDeepFreeze.dbg.json +4 -0
  58. package/src/assets/ethereum/hoodi/liqEth/LiqEthDeepFreeze.sol/LiqEthDeepFreeze.json +236 -0
  59. package/src/assets/ethereum/hoodi/liqEth/LiqEthManaged.sol/LiqEthManaged.dbg.json +4 -0
  60. package/src/assets/ethereum/{ABI → hoodi}/liqEth/LiqEthManaged.sol/LiqEthManaged.json +2 -2
  61. package/src/assets/ethereum/hoodi/liqEth/RewardsERC20.sol/RewardsERC20UpgradeableV2.dbg.json +4 -0
  62. package/src/assets/ethereum/hoodi/liqEth/RewardsERC20.sol/RewardsERC20UpgradeableV2.json +957 -0
  63. package/src/assets/ethereum/hoodi/liqEth/RewardsERC20Pausable.sol/RewardsERC20PausableUpgradeableV2.dbg.json +4 -0
  64. package/src/assets/ethereum/hoodi/liqEth/RewardsERC20Pausable.sol/RewardsERC20PausableUpgradeableV2.json +1020 -0
  65. package/src/assets/ethereum/hoodi/liqEth/Yield.sol/YieldOracle.dbg.json +4 -0
  66. package/src/assets/ethereum/{ABI → hoodi}/liqEth/Yield.sol/YieldOracle.json +2 -2
  67. package/src/assets/ethereum/hoodi/liqEth/accounting.sol/AccountingV2.dbg.json +4 -0
  68. package/src/assets/ethereum/hoodi/liqEth/accounting.sol/AccountingV2.json +629 -0
  69. package/src/assets/ethereum/hoodi/liqEth/liqEth.sol/LiqEthTokenV2.dbg.json +4 -0
  70. package/src/assets/ethereum/hoodi/liqEth/liqEth.sol/LiqEthTokenV2.json +1323 -0
  71. package/src/assets/ethereum/hoodi/liqEth/stakingModule.sol/StakingModuleV2.dbg.json +4 -0
  72. package/src/assets/ethereum/hoodi/liqEth/stakingModule.sol/StakingModuleV2.json +1779 -0
  73. package/src/assets/ethereum/hoodi/liqEth/v1/DepositManager.sol/DepositManager.dbg.json +4 -0
  74. package/src/assets/ethereum/hoodi/liqEth/v1/DepositManager.sol/DepositManager.json +978 -0
  75. package/src/assets/ethereum/hoodi/liqEth/v1/LiqEthCommon.sol/IAccounting.dbg.json +4 -0
  76. package/src/assets/ethereum/{ABI/liqEth → hoodi/liqEth/v1}/LiqEthCommon.sol/IAccounting.json +1 -1
  77. package/src/assets/ethereum/hoodi/liqEth/v1/LiqEthCommon.sol/IDepositContract.dbg.json +4 -0
  78. package/src/assets/ethereum/hoodi/liqEth/v1/LiqEthCommon.sol/IDepositContract.json +39 -0
  79. package/src/assets/ethereum/hoodi/liqEth/v1/LiqEthCommon.sol/IDepositManager.dbg.json +4 -0
  80. package/src/assets/ethereum/hoodi/liqEth/v1/LiqEthCommon.sol/IDepositManager.json +64 -0
  81. package/src/assets/ethereum/hoodi/liqEth/v1/LiqEthCommon.sol/ILiqEthUpgradeable.dbg.json +4 -0
  82. package/src/assets/ethereum/hoodi/liqEth/v1/LiqEthCommon.sol/ILiqEthUpgradeable.json +29 -0
  83. package/src/assets/ethereum/hoodi/liqEth/v1/LiqEthCommon.sol/IRewardsERC20.dbg.json +4 -0
  84. package/src/assets/ethereum/{ABI/liqEth → hoodi/liqEth/v1}/LiqEthCommon.sol/IRewardsERC20.json +1 -1
  85. package/src/assets/ethereum/hoodi/liqEth/v1/LiqEthCommon.sol/IRewardsERC20Pausable.dbg.json +4 -0
  86. package/src/assets/ethereum/{ABI/liqEth → hoodi/liqEth/v1}/LiqEthCommon.sol/IRewardsERC20Pausable.json +1 -1
  87. package/src/assets/ethereum/hoodi/liqEth/v1/LiqEthCommon.sol/IStakingModule.dbg.json +4 -0
  88. package/src/assets/ethereum/hoodi/liqEth/v1/LiqEthCommon.sol/IStakingModule.json +344 -0
  89. package/src/assets/ethereum/hoodi/liqEth/v1/LiqEthCommon.sol/IValidatorBalanceVerifier.dbg.json +4 -0
  90. package/src/assets/ethereum/hoodi/liqEth/v1/LiqEthCommon.sol/IValidatorBalanceVerifier.json +129 -0
  91. package/src/assets/ethereum/hoodi/liqEth/v1/LiqEthCommon.sol/IWithdrawalRecord.dbg.json +4 -0
  92. package/src/assets/ethereum/hoodi/liqEth/v1/LiqEthCommon.sol/IWithdrawalRecord.json +66 -0
  93. package/src/assets/ethereum/hoodi/liqEth/v1/LiqEthCommon.sol/LiqEthCommon.dbg.json +4 -0
  94. package/src/assets/ethereum/hoodi/liqEth/v1/LiqEthCommon.sol/LiqEthCommon.json +10 -0
  95. package/src/assets/ethereum/hoodi/liqEth/v1/RewardsERC20.sol/RewardsERC20Upgradeable.dbg.json +4 -0
  96. package/src/assets/ethereum/{ABI/liqEth → hoodi/liqEth/v1}/RewardsERC20.sol/RewardsERC20Upgradeable.json +1 -1
  97. package/src/assets/ethereum/hoodi/liqEth/v1/RewardsERC20Pausable.sol/RewardsERC20PausableUpgradeable.dbg.json +4 -0
  98. package/src/assets/ethereum/{ABI/liqEth → hoodi/liqEth/v1}/RewardsERC20Pausable.sol/RewardsERC20PausableUpgradeable.json +1 -1
  99. package/src/assets/ethereum/hoodi/liqEth/v1/accounting.sol/Accounting.dbg.json +4 -0
  100. package/src/assets/ethereum/hoodi/liqEth/v1/accounting.sol/Accounting.json +548 -0
  101. package/src/assets/ethereum/hoodi/liqEth/v1/liqEth.sol/LiqEthToken.dbg.json +4 -0
  102. package/src/assets/ethereum/hoodi/liqEth/v1/liqEth.sol/LiqEthToken.json +1233 -0
  103. package/src/assets/ethereum/hoodi/liqEth/v1/stakingModule.sol/StakingModule.dbg.json +4 -0
  104. package/src/assets/ethereum/hoodi/liqEth/v1/stakingModule.sol/StakingModule.json +1772 -0
  105. package/src/assets/ethereum/hoodi/liqEth/withdrawalQueue.sol/WithdrawalQueue.dbg.json +4 -0
  106. package/src/assets/ethereum/{ABI → hoodi}/liqEth/withdrawalQueue.sol/WithdrawalQueue.json +2 -2
  107. package/src/assets/ethereum/hoodi/liqEth/withdrawalVault.sol/Uint64BE.dbg.json +4 -0
  108. package/src/assets/ethereum/{ABI → hoodi}/liqEth/withdrawalVault.sol/Uint64BE.json +2 -2
  109. package/src/assets/ethereum/hoodi/liqEth/withdrawalVault.sol/WithdrawalVault.dbg.json +4 -0
  110. package/src/assets/ethereum/hoodi/liqEth/withdrawalVault.sol/WithdrawalVault.json +441 -0
  111. package/src/assets/ethereum/hoodi/outpost/BAR.sol/BAR.dbg.json +4 -0
  112. package/src/assets/ethereum/hoodi/outpost/BAR.sol/BAR.json +1111 -0
  113. package/src/assets/ethereum/hoodi/outpost/Depositor.sol/Depositor.dbg.json +4 -0
  114. package/src/assets/ethereum/hoodi/outpost/Depositor.sol/Depositor.json +1696 -0
  115. package/src/assets/ethereum/hoodi/outpost/EthUsdPriceConsumer.sol/AggregatorV3Interface.dbg.json +4 -0
  116. package/src/assets/ethereum/hoodi/outpost/EthUsdPriceConsumer.sol/EthUsdPriceConsumer.dbg.json +4 -0
  117. package/src/assets/ethereum/hoodi/outpost/EthUsdPriceConsumer.sol/EthUsdPriceConsumer.json +274 -0
  118. package/src/assets/ethereum/hoodi/outpost/InstaswapBridgeAttestations.sol/BridgeDepositCodec.dbg.json +4 -0
  119. package/src/assets/ethereum/hoodi/outpost/InstaswapBridgeAttestations.sol/BridgeDepositCodec.json +10 -0
  120. package/src/assets/ethereum/hoodi/outpost/InstaswapBridgeAttestations.sol/BridgeWithdrawCodec.dbg.json +4 -0
  121. package/src/assets/ethereum/hoodi/outpost/InstaswapBridgeAttestations.sol/BridgeWithdrawCodec.json +10 -0
  122. package/src/assets/ethereum/hoodi/outpost/InstaswapBridgeAttestations.sol/BridgeWithdrawConfirmCodec.dbg.json +4 -0
  123. package/src/assets/ethereum/hoodi/outpost/InstaswapBridgeAttestations.sol/BridgeWithdrawConfirmCodec.json +10 -0
  124. package/src/assets/ethereum/hoodi/outpost/InstaswapBridgeAttestations.sol/InstaswapBridgeAttestationTypeLib.dbg.json +4 -0
  125. package/src/assets/ethereum/hoodi/outpost/InstaswapBridgeAttestations.sol/InstaswapBridgeAttestationTypeLib.json +10 -0
  126. package/src/assets/ethereum/hoodi/outpost/LiqEthBridge.sol/LiqEthBridge.dbg.json +4 -0
  127. package/src/assets/ethereum/hoodi/outpost/LiqEthBridge.sol/LiqEthBridge.json +1044 -0
  128. package/src/assets/ethereum/hoodi/outpost/OPP.sol/OPP.dbg.json +4 -0
  129. package/src/assets/ethereum/hoodi/outpost/OPP.sol/OPP.json +1055 -0
  130. package/src/assets/ethereum/hoodi/outpost/OPPCommon.sol/IOPP.dbg.json +4 -0
  131. package/src/assets/ethereum/hoodi/outpost/OPPCommon.sol/IOPP.json +81 -0
  132. package/src/assets/ethereum/hoodi/outpost/OPPCommon.sol/IOPPEndpoint.dbg.json +4 -0
  133. package/src/assets/ethereum/hoodi/outpost/OPPCommon.sol/IOPPInbound.dbg.json +4 -0
  134. package/src/assets/ethereum/hoodi/outpost/OPPCommon.sol/IOPPInbound.json +330 -0
  135. package/src/assets/ethereum/hoodi/outpost/OPPCommon.sol/IOPPReceiver.dbg.json +4 -0
  136. package/src/assets/ethereum/hoodi/outpost/OPPCommon.sol/IOPPReceiver.json +29 -0
  137. package/src/assets/ethereum/hoodi/outpost/OPPCommon.sol/IOPPSender.dbg.json +4 -0
  138. package/src/assets/ethereum/hoodi/outpost/OPPCommon.sol/IOPPSender.json +41 -0
  139. package/src/assets/ethereum/hoodi/outpost/OPPCommon.sol/OPPCommon.dbg.json +4 -0
  140. package/src/assets/ethereum/hoodi/outpost/OPPCommon.sol/OPPCommon.json +287 -0
  141. package/src/assets/ethereum/hoodi/outpost/OPPEndpoint.sol/OPPEndpoint.dbg.json +4 -0
  142. package/src/assets/ethereum/hoodi/outpost/OPPEndpoint.sol/OPPEndpoint.json +294 -0
  143. package/src/assets/ethereum/hoodi/outpost/OPPEndpointManaged.sol/OPPEndpointManaged.dbg.json +4 -0
  144. package/src/assets/ethereum/hoodi/outpost/OPPEndpointManaged.sol/OPPEndpointManaged.json +415 -0
  145. package/src/assets/ethereum/hoodi/outpost/OPPEndpointOwnable.sol/OPPEndpointOwnable.dbg.json +4 -0
  146. package/src/assets/ethereum/hoodi/outpost/OPPEndpointOwnable.sol/OPPEndpointOwnable.json +399 -0
  147. package/src/assets/ethereum/hoodi/outpost/OPPErrors.sol/OPPErrors.dbg.json +4 -0
  148. package/src/assets/ethereum/hoodi/outpost/OPPErrors.sol/OPPErrors.json +245 -0
  149. package/src/assets/ethereum/hoodi/outpost/OPPInbound.sol/OPPInbound.dbg.json +4 -0
  150. package/src/assets/ethereum/hoodi/outpost/OPPInbound.sol/OPPInbound.json +1204 -0
  151. package/src/assets/ethereum/hoodi/outpost/OPPReceiver.sol/OPPReceiver.dbg.json +4 -0
  152. package/src/assets/ethereum/hoodi/outpost/OPPReceiver.sol/OPPReceiver.json +312 -0
  153. package/src/assets/ethereum/hoodi/outpost/OPPSender.sol/OPPSender.dbg.json +4 -0
  154. package/src/assets/ethereum/hoodi/outpost/OPPSender.sol/OPPSender.json +324 -0
  155. package/src/assets/ethereum/hoodi/outpost/OperatorRegistry.sol/OperatorRegistry.dbg.json +4 -0
  156. package/src/assets/ethereum/hoodi/outpost/OperatorRegistry.sol/OperatorRegistry.json +1068 -0
  157. package/src/assets/ethereum/hoodi/outpost/OutpostErrors.sol/OutpostErrors.dbg.json +4 -0
  158. package/src/assets/ethereum/hoodi/outpost/OutpostErrors.sol/OutpostErrors.json +211 -0
  159. package/src/assets/ethereum/hoodi/outpost/OutpostManaged.sol/OutpostManaged.dbg.json +4 -0
  160. package/src/assets/ethereum/hoodi/outpost/OutpostManaged.sol/OutpostManaged.json +229 -0
  161. package/src/assets/ethereum/hoodi/outpost/OutpostManager.sol/OutpostManager.dbg.json +4 -0
  162. package/src/assets/ethereum/hoodi/outpost/OutpostManager.sol/OutpostManager.json +751 -0
  163. package/src/assets/ethereum/hoodi/outpost/OutpostManagerAuthority.sol/OutpostManagerAuthority.dbg.json +4 -0
  164. package/src/assets/ethereum/hoodi/outpost/OutpostManagerAuthority.sol/OutpostManagerAuthority.json +1432 -0
  165. package/src/assets/ethereum/hoodi/outpost/OutpostManagerCommon.sol/IOutpostManager.dbg.json +4 -0
  166. package/src/assets/ethereum/hoodi/outpost/OutpostManagerCommon.sol/IOutpostManager.json +130 -0
  167. package/src/assets/ethereum/hoodi/outpost/OutpostManagerCommon.sol/IOutpostUpgradeable.dbg.json +4 -0
  168. package/src/assets/ethereum/hoodi/outpost/OutpostManagerCommon.sol/OutpostManagerCommon.dbg.json +4 -0
  169. package/src/assets/ethereum/hoodi/outpost/OutpostManagerCommon.sol/OutpostManagerCommon.json +141 -0
  170. package/src/assets/ethereum/hoodi/outpost/OutpostOwnable.sol/OutpostOwnable.dbg.json +4 -0
  171. package/src/assets/ethereum/hoodi/outpost/OutpostOwnable.sol/OutpostOwnable.json +213 -0
  172. package/src/assets/ethereum/hoodi/outpost/OutpostReserve.sol/OutpostReserve.dbg.json +4 -0
  173. package/src/assets/ethereum/hoodi/outpost/OutpostReserve.sol/OutpostReserve.json +888 -0
  174. package/src/assets/ethereum/hoodi/outpost/Pool.sol/Pool.dbg.json +4 -0
  175. package/src/assets/ethereum/hoodi/outpost/Pool.sol/Pool.json +659 -0
  176. package/src/assets/ethereum/hoodi/outpost/Pretoken.sol/Pretoken.dbg.json +4 -0
  177. package/src/assets/ethereum/hoodi/outpost/Pretoken.sol/Pretoken.json +1393 -0
  178. package/src/assets/ethereum/hoodi/outpost/ReceiptNFT.sol/ReceiptNFT.dbg.json +4 -0
  179. package/src/assets/ethereum/hoodi/outpost/ReceiptNFT.sol/ReceiptNFT.json +1738 -0
  180. package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/InstaswapConfirmCodec.dbg.json +4 -0
  181. package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/InstaswapConfirmCodec.json +10 -0
  182. package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/InstaswapFailedCodec.dbg.json +4 -0
  183. package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/InstaswapFailedCodec.json +10 -0
  184. package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/InstaswapRequestCodec.dbg.json +4 -0
  185. package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/InstaswapRequestCodec.json +10 -0
  186. package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/InstaswapSettlementCodec.dbg.json +4 -0
  187. package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/InstaswapSettlementCodec.json +10 -0
  188. package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/PrincipalExitConfirmCodec.dbg.json +4 -0
  189. package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/PrincipalExitConfirmCodec.json +10 -0
  190. package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/PrincipalExitFailedCodec.dbg.json +4 -0
  191. package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/PrincipalExitFailedCodec.json +10 -0
  192. package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/PrincipalExitRequestCodec.dbg.json +4 -0
  193. package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/PrincipalExitRequestCodec.json +10 -0
  194. package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/PrincipalStakeDeltaCodec.dbg.json +4 -0
  195. package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/PrincipalStakeDeltaCodec.json +10 -0
  196. package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/WireYieldHubAssetCodec.dbg.json +4 -0
  197. package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/WireYieldHubAssetCodec.json +10 -0
  198. package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/WireYieldHubAttestationTypeLib.dbg.json +4 -0
  199. package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/WireYieldHubAttestationTypeLib.json +10 -0
  200. package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/WireYieldHubAttestations.dbg.json +4 -0
  201. package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/WireYieldHubAttestations.json +1437 -0
  202. package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/YieldDepositCodec.dbg.json +4 -0
  203. package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/YieldDepositCodec.json +10 -0
  204. package/src/assets/ethereum/hoodi/outpost/interfaces/IPretoken.sol/IPretoken.dbg.json +4 -0
  205. package/src/assets/ethereum/hoodi/outpost/interfaces/IWarrant.sol/IWarrant.dbg.json +4 -0
  206. package/src/assets/ethereum/hoodi/outpost/token/ERC721EthEquivalentVotesUpgradeable.sol/ERC721EthEquivalentVotesUpgradeable.dbg.json +4 -0
  207. package/src/assets/ethereum/hoodi/outpost/token/IERC721EthEquivalent.sol/IERC721EthEquivalent.dbg.json +4 -0
  208. package/src/assets/ethereum/hoodi/token/ERC1155Token.sol/ERC1155Token.dbg.json +4 -0
  209. package/src/assets/ethereum/hoodi/token/ERC1155Token.sol/ERC1155Token.json +472 -0
  210. package/src/assets/ethereum/hoodi/token/ERC20Token.sol/ERC20Token.dbg.json +4 -0
  211. package/src/assets/ethereum/hoodi/token/ERC20Token.sol/ERC20Token.json +330 -0
  212. package/src/assets/ethereum/hoodi/token/ERC721Token.sol/ERC721Token.dbg.json +4 -0
  213. package/src/assets/ethereum/hoodi/token/ERC721Token.sol/ERC721Token.json +449 -0
  214. package/src/assets/ethereum/hoodi/token/Eman1155.sol/Eman1155.dbg.json +4 -0
  215. package/src/assets/ethereum/hoodi/token/Eman1155.sol/Eman1155.json +560 -0
  216. package/src/assets/ethereum/hoodi/token/Eman20.sol/Eman20.dbg.json +4 -0
  217. package/src/assets/ethereum/hoodi/token/Eman20.sol/Eman20.json +460 -0
  218. package/src/assets/ethereum/hoodi/token/Eman721.sol/Eman721.dbg.json +4 -0
  219. package/src/assets/ethereum/hoodi/token/Eman721.sol/Eman721.json +624 -0
  220. package/src/assets/ethereum/mainnet/common/Base58.sol/Base58.dbg.json +4 -0
  221. package/src/assets/ethereum/mainnet/common/Base58.sol/Base58.json +164 -0
  222. package/src/assets/ethereum/mainnet/common/OpenZepArtifacts.sol/__Dummy_OZ_UUPS__.dbg.json +4 -0
  223. package/src/assets/ethereum/mainnet/common/OpenZepArtifacts.sol/__Dummy_OZ_UUPS__.json +76 -0
  224. package/src/assets/ethereum/mainnet/common/RestrictedCallers.sol/RestrictedCallers.dbg.json +4 -0
  225. package/src/assets/ethereum/mainnet/common/RestrictedCallers.sol/RestrictedCallers.json +10 -0
  226. package/src/assets/ethereum/mainnet/common/iodata.sol/iodata.dbg.json +4 -0
  227. package/src/assets/ethereum/mainnet/common/iodata.sol/iodata.json +618 -0
  228. package/src/assets/ethereum/mainnet/common/iodata_util.sol/iodata_util.dbg.json +4 -0
  229. package/src/assets/ethereum/mainnet/common/iodata_util.sol/iodata_util.json +40 -0
  230. package/src/assets/ethereum/mainnet/common/sysio_data.sol/sysio_data.dbg.json +4 -0
  231. package/src/assets/ethereum/mainnet/common/sysio_data.sol/sysio_data.json +10 -0
  232. package/src/assets/ethereum/mainnet/common/sysio_errors.sol/sysio_errors.dbg.json +4 -0
  233. package/src/assets/ethereum/mainnet/common/sysio_errors.sol/sysio_errors.json +10 -0
  234. package/src/assets/ethereum/mainnet/common/sysio_merkle.sol/sysio_merkle.dbg.json +4 -0
  235. package/src/assets/ethereum/mainnet/common/sysio_merkle.sol/sysio_merkle.json +233 -0
  236. package/src/assets/ethereum/mainnet/common/sysio_name.sol/sysio_name.dbg.json +4 -0
  237. package/src/assets/ethereum/mainnet/common/sysio_name.sol/sysio_name.json +49 -0
  238. package/src/assets/ethereum/mainnet/common/sysio_pubkey.sol/sysio_pubkey.dbg.json +4 -0
  239. package/src/assets/ethereum/mainnet/common/sysio_pubkey.sol/sysio_pubkey.json +64 -0
  240. package/src/assets/ethereum/mainnet/common/sysio_read.sol/sysio_read.dbg.json +4 -0
  241. package/src/assets/ethereum/mainnet/common/sysio_read.sol/sysio_read.json +1458 -0
  242. package/src/assets/ethereum/mainnet/common/sysio_tester.sol/SysioTester.dbg.json +4 -0
  243. package/src/assets/ethereum/mainnet/common/sysio_tester.sol/SysioTester.json +1532 -0
  244. package/src/assets/ethereum/mainnet/common/sysio_verify.sol/sysio_verify.dbg.json +4 -0
  245. package/src/assets/ethereum/mainnet/common/sysio_verify.sol/sysio_verify.json +1525 -0
  246. package/src/assets/ethereum/mainnet/common/sysio_write.sol/sysio_write.dbg.json +4 -0
  247. package/src/assets/ethereum/mainnet/common/sysio_write.sol/sysio_write.json +1076 -0
  248. package/src/assets/ethereum/mainnet/liqEth/BeaconState.sol/BeaconState.dbg.json +4 -0
  249. package/src/assets/ethereum/mainnet/liqEth/BeaconState.sol/BeaconState.json +807 -0
  250. package/src/assets/ethereum/mainnet/liqEth/DepositManager.sol/DepositManagerV2.dbg.json +4 -0
  251. package/src/assets/ethereum/mainnet/liqEth/DepositManager.sol/DepositManagerV2.json +1004 -0
  252. package/src/assets/ethereum/mainnet/liqEth/DepositManager.sol/IStakingModuleBondLocker.dbg.json +4 -0
  253. package/src/assets/ethereum/mainnet/liqEth/DepositManager.sol/IStakingModuleBondLocker.json +29 -0
  254. package/src/assets/ethereum/mainnet/liqEth/KeyBondManager.sol/KeyBondManager.dbg.json +4 -0
  255. package/src/assets/ethereum/mainnet/liqEth/KeyBondManager.sol/KeyBondManager.json +897 -0
  256. package/src/assets/ethereum/mainnet/liqEth/LiqEthAuthority.sol/LiqEthAuthority.dbg.json +4 -0
  257. package/src/assets/ethereum/mainnet/liqEth/LiqEthAuthority.sol/LiqEthAuthority.json +1289 -0
  258. package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/IDepositContract.dbg.json +4 -0
  259. package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/IDepositContract.json +39 -0
  260. package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/IDepositManager.dbg.json +4 -0
  261. package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/IDepositManager.json +64 -0
  262. package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/IKeyBondManager.dbg.json +4 -0
  263. package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/IKeyBondManager.json +189 -0
  264. package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/ILiqEthUpgradeable.dbg.json +4 -0
  265. package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/ILiqEthUpgradeable.json +29 -0
  266. package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/IRewardsERC20.dbg.json +4 -0
  267. package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/IRewardsERC20.json +319 -0
  268. package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/IRewardsERC20Pausable.dbg.json +4 -0
  269. package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/IRewardsERC20Pausable.json +333 -0
  270. package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/IStakingModule.dbg.json +4 -0
  271. package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/IStakingModule.json +279 -0
  272. package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/IValidatorBalanceVerifier.dbg.json +4 -0
  273. package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/IValidatorBalanceVerifier.json +129 -0
  274. package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/IWithdrawalRecord.dbg.json +4 -0
  275. package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/IWithdrawalRecord.json +66 -0
  276. package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/LiqEthCommon.dbg.json +4 -0
  277. package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/LiqEthCommon.json +10 -0
  278. package/src/assets/ethereum/mainnet/liqEth/LiqEthDeepFreeze.sol/LiqEthDeepFreeze.dbg.json +4 -0
  279. package/src/assets/ethereum/mainnet/liqEth/LiqEthDeepFreeze.sol/LiqEthDeepFreeze.json +236 -0
  280. package/src/assets/ethereum/mainnet/liqEth/LiqEthManaged.sol/LiqEthManaged.dbg.json +4 -0
  281. package/src/assets/ethereum/mainnet/liqEth/LiqEthManaged.sol/LiqEthManaged.json +229 -0
  282. package/src/assets/ethereum/mainnet/liqEth/RewardsERC20.sol/RewardsERC20UpgradeableV2.dbg.json +4 -0
  283. package/src/assets/ethereum/mainnet/liqEth/RewardsERC20.sol/RewardsERC20UpgradeableV2.json +957 -0
  284. package/src/assets/ethereum/mainnet/liqEth/RewardsERC20Pausable.sol/RewardsERC20PausableUpgradeableV2.dbg.json +4 -0
  285. package/src/assets/ethereum/mainnet/liqEth/RewardsERC20Pausable.sol/RewardsERC20PausableUpgradeableV2.json +1020 -0
  286. package/src/assets/ethereum/mainnet/liqEth/StakingLib.sol/StakingLib.dbg.json +4 -0
  287. package/src/assets/ethereum/mainnet/liqEth/StakingLib.sol/StakingLib.json +89 -0
  288. package/src/assets/ethereum/mainnet/liqEth/Yield.sol/YieldOracle.dbg.json +4 -0
  289. package/src/assets/ethereum/mainnet/liqEth/Yield.sol/YieldOracle.json +1376 -0
  290. package/src/assets/ethereum/mainnet/liqEth/liqEth.sol/LiqEthTokenV2.dbg.json +4 -0
  291. package/src/assets/ethereum/mainnet/liqEth/liqEth.sol/LiqEthTokenV2.json +1323 -0
  292. package/src/assets/ethereum/mainnet/liqEth/stakingModule.sol/StakingModuleV2.dbg.json +4 -0
  293. package/src/assets/ethereum/mainnet/liqEth/stakingModule.sol/StakingModuleV2.json +1896 -0
  294. package/src/assets/ethereum/mainnet/liqEth/v1/DepositManager.sol/DepositManager.dbg.json +4 -0
  295. package/src/assets/ethereum/mainnet/liqEth/v1/DepositManager.sol/DepositManager.json +978 -0
  296. package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/IAccounting.dbg.json +4 -0
  297. package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/IAccounting.json +176 -0
  298. package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/IDepositContract.dbg.json +4 -0
  299. package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/IDepositContract.json +39 -0
  300. package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/IDepositManager.dbg.json +4 -0
  301. package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/IDepositManager.json +64 -0
  302. package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/ILiqEthUpgradeable.dbg.json +4 -0
  303. package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/ILiqEthUpgradeable.json +29 -0
  304. package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/IRewardsERC20.dbg.json +4 -0
  305. package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/IRewardsERC20.json +249 -0
  306. package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/IRewardsERC20Pausable.dbg.json +4 -0
  307. package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/IRewardsERC20Pausable.json +263 -0
  308. package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/IStakingModule.dbg.json +4 -0
  309. package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/IStakingModule.json +344 -0
  310. package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/IValidatorBalanceVerifier.dbg.json +4 -0
  311. package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/IValidatorBalanceVerifier.json +129 -0
  312. package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/IWithdrawalRecord.dbg.json +4 -0
  313. package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/IWithdrawalRecord.json +66 -0
  314. package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/LiqEthCommon.dbg.json +4 -0
  315. package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/LiqEthCommon.json +10 -0
  316. package/src/assets/ethereum/mainnet/liqEth/v1/RewardsERC20.sol/RewardsERC20Upgradeable.dbg.json +4 -0
  317. package/src/assets/ethereum/mainnet/liqEth/v1/RewardsERC20.sol/RewardsERC20Upgradeable.json +874 -0
  318. package/src/assets/ethereum/mainnet/liqEth/v1/RewardsERC20Pausable.sol/RewardsERC20PausableUpgradeable.dbg.json +4 -0
  319. package/src/assets/ethereum/mainnet/liqEth/v1/RewardsERC20Pausable.sol/RewardsERC20PausableUpgradeable.json +937 -0
  320. package/src/assets/ethereum/mainnet/liqEth/v1/accounting.sol/Accounting.dbg.json +4 -0
  321. package/src/assets/ethereum/mainnet/liqEth/v1/accounting.sol/Accounting.json +542 -0
  322. package/src/assets/ethereum/mainnet/liqEth/v1/liqEth.sol/LiqEthToken.dbg.json +4 -0
  323. package/src/assets/ethereum/mainnet/liqEth/v1/liqEth.sol/LiqEthToken.json +1233 -0
  324. package/src/assets/ethereum/mainnet/liqEth/v1/stakingModule.sol/StakingModule.dbg.json +4 -0
  325. package/src/assets/ethereum/mainnet/liqEth/v1/stakingModule.sol/StakingModule.json +1772 -0
  326. package/src/assets/ethereum/mainnet/liqEth/withdrawalQueue.sol/WithdrawalQueue.dbg.json +4 -0
  327. package/src/assets/ethereum/mainnet/liqEth/withdrawalQueue.sol/WithdrawalQueue.json +973 -0
  328. package/src/assets/ethereum/mainnet/liqEth/withdrawalVault.sol/Uint64BE.dbg.json +4 -0
  329. package/src/assets/ethereum/mainnet/liqEth/withdrawalVault.sol/Uint64BE.json +10 -0
  330. package/src/assets/ethereum/mainnet/liqEth/withdrawalVault.sol/WithdrawalVault.dbg.json +4 -0
  331. package/src/assets/ethereum/mainnet/liqEth/withdrawalVault.sol/WithdrawalVault.json +441 -0
  332. package/src/assets/ethereum/mainnet/outpost/BAR.sol/BARV2.dbg.json +4 -0
  333. package/src/assets/ethereum/mainnet/outpost/BAR.sol/BARV2.json +1915 -0
  334. package/src/assets/ethereum/mainnet/outpost/Depositor.sol/DepositorV2.dbg.json +4 -0
  335. package/src/assets/ethereum/mainnet/outpost/Depositor.sol/DepositorV2.json +1845 -0
  336. package/src/assets/ethereum/mainnet/outpost/EthUsdPriceConsumer.sol/AggregatorV3Interface.dbg.json +4 -0
  337. package/src/assets/ethereum/mainnet/outpost/EthUsdPriceConsumer.sol/AggregatorV3Interface.json +122 -0
  338. package/src/assets/ethereum/mainnet/outpost/EthUsdPriceConsumer.sol/EthUsdPriceConsumer.dbg.json +4 -0
  339. package/src/assets/ethereum/{ABI → mainnet}/outpost/EthUsdPriceConsumer.sol/EthUsdPriceConsumer.json +31 -29
  340. package/src/assets/ethereum/mainnet/outpost/OPP.sol/OPP.dbg.json +4 -0
  341. package/src/assets/ethereum/mainnet/outpost/OPPCommon.sol/IOPP.dbg.json +4 -0
  342. package/src/assets/ethereum/mainnet/outpost/OPPCommon.sol/IOPPEndpoint.dbg.json +4 -0
  343. package/src/assets/ethereum/mainnet/outpost/OPPCommon.sol/IOPPEndpoint.json +29 -0
  344. package/src/assets/ethereum/mainnet/outpost/OPPCommon.sol/IOPPInbound.dbg.json +4 -0
  345. package/src/assets/ethereum/mainnet/outpost/OPPCommon.sol/IOPPReceiver.dbg.json +4 -0
  346. package/src/assets/ethereum/mainnet/outpost/OPPCommon.sol/IOPPSender.dbg.json +4 -0
  347. package/src/assets/ethereum/mainnet/outpost/OPPCommon.sol/OPPCommon.dbg.json +4 -0
  348. package/src/assets/ethereum/mainnet/outpost/OPPEndpoint.sol/OPPEndpoint.dbg.json +4 -0
  349. package/src/assets/ethereum/mainnet/outpost/OPPEndpointManaged.sol/OPPEndpointManaged.dbg.json +4 -0
  350. package/src/assets/ethereum/mainnet/outpost/OPPEndpointOwnable.sol/OPPEndpointOwnable.dbg.json +4 -0
  351. package/src/assets/ethereum/mainnet/outpost/OPPErrors.sol/OPPErrors.dbg.json +4 -0
  352. package/src/assets/ethereum/mainnet/outpost/OPPInbound.sol/OPPInbound.dbg.json +4 -0
  353. package/src/assets/ethereum/mainnet/outpost/OPPReceiver.sol/OPPReceiver.dbg.json +4 -0
  354. package/src/assets/ethereum/mainnet/outpost/OPPSender.sol/OPPSender.dbg.json +4 -0
  355. package/src/assets/ethereum/mainnet/outpost/OutpostErrors.sol/OutpostErrors.dbg.json +4 -0
  356. package/src/assets/ethereum/{ABI → mainnet}/outpost/OutpostErrors.sol/OutpostErrors.json +33 -18
  357. package/src/assets/ethereum/mainnet/outpost/OutpostManaged.sol/OutpostManaged.dbg.json +4 -0
  358. package/src/assets/ethereum/mainnet/outpost/OutpostManager.sol/OutpostManagerV2.dbg.json +4 -0
  359. package/src/assets/ethereum/mainnet/outpost/OutpostManager.sol/OutpostManagerV2.json +737 -0
  360. package/src/assets/ethereum/mainnet/outpost/OutpostManagerAuthority.sol/OutpostManagerAuthority.dbg.json +4 -0
  361. package/src/assets/ethereum/mainnet/outpost/OutpostManagerCommon.sol/IOutpostManager.dbg.json +4 -0
  362. package/src/assets/ethereum/mainnet/outpost/OutpostManagerCommon.sol/IOutpostUpgradeable.dbg.json +4 -0
  363. package/src/assets/ethereum/mainnet/outpost/OutpostManagerCommon.sol/IOutpostUpgradeable.json +29 -0
  364. package/src/assets/ethereum/mainnet/outpost/OutpostManagerCommon.sol/OutpostManagerCommon.dbg.json +4 -0
  365. package/src/assets/ethereum/mainnet/outpost/OutpostOwnable.sol/OutpostOwnable.dbg.json +4 -0
  366. package/src/assets/ethereum/mainnet/outpost/Pool.sol/PoolV2.dbg.json +4 -0
  367. package/src/assets/ethereum/mainnet/outpost/Pool.sol/PoolV2.json +943 -0
  368. package/src/assets/ethereum/mainnet/outpost/Pretoken.sol/PretokenV2.dbg.json +4 -0
  369. package/src/assets/ethereum/mainnet/outpost/Pretoken.sol/PretokenV2.json +1703 -0
  370. package/src/assets/ethereum/mainnet/outpost/ReceiptNFT.sol/ReceiptNFT.dbg.json +4 -0
  371. package/src/assets/ethereum/{ABI → mainnet}/outpost/ReceiptNFT.sol/ReceiptNFT.json +33 -18
  372. package/src/assets/ethereum/mainnet/outpost/interfaces/IPretoken.sol/IPretoken.dbg.json +4 -0
  373. package/src/assets/ethereum/mainnet/outpost/interfaces/IPretoken.sol/IPretoken.json +29 -0
  374. package/src/assets/ethereum/mainnet/outpost/interfaces/IWarrant.sol/IWarrant.dbg.json +4 -0
  375. package/src/assets/ethereum/mainnet/outpost/interfaces/IWarrant.sol/IWarrant.json +29 -0
  376. package/src/assets/ethereum/mainnet/outpost/token/ERC721EthEquivalentVotesUpgradeable.sol/ERC721EthEquivalentVotesUpgradeable.dbg.json +4 -0
  377. package/src/assets/ethereum/mainnet/outpost/token/ERC721EthEquivalentVotesUpgradeable.sol/ERC721EthEquivalentVotesUpgradeable.json +858 -0
  378. package/src/assets/ethereum/mainnet/outpost/token/IERC721EthEquivalent.sol/IERC721EthEquivalent.dbg.json +4 -0
  379. package/src/assets/ethereum/mainnet/outpost/token/IERC721EthEquivalent.sol/IERC721EthEquivalent.json +30 -0
  380. package/src/assets/ethereum/mainnet/outpost/v1/BAR.sol/BAR.dbg.json +4 -0
  381. package/src/assets/ethereum/{ABI/outpost → mainnet/outpost/v1}/BAR.sol/BAR.json +34 -19
  382. package/src/assets/ethereum/mainnet/outpost/v1/Depositor.sol/Depositor.dbg.json +4 -0
  383. package/src/assets/ethereum/mainnet/outpost/v1/Depositor.sol/Depositor.json +1653 -0
  384. package/src/assets/ethereum/mainnet/outpost/v1/OutpostManager.sol/OutpostManager.dbg.json +4 -0
  385. package/src/assets/ethereum/{ABI/outpost → mainnet/outpost/v1}/OutpostManager.sol/OutpostManager.json +3 -3
  386. package/src/assets/ethereum/mainnet/outpost/v1/Pool.sol/Pool.dbg.json +4 -0
  387. package/src/assets/ethereum/{ABI/outpost → mainnet/outpost/v1}/Pool.sol/Pool.json +34 -19
  388. package/src/assets/ethereum/mainnet/outpost/v1/Pretoken.sol/Pretoken.dbg.json +4 -0
  389. package/src/assets/ethereum/mainnet/outpost/v1/Pretoken.sol/Pretoken.json +1665 -0
  390. package/src/assets/ethereum/mainnet/token/ERC1155Token.sol/ERC1155Token.dbg.json +4 -0
  391. package/src/assets/ethereum/mainnet/token/ERC1155Token.sol/ERC1155Token.json +472 -0
  392. package/src/assets/ethereum/mainnet/token/ERC20Token.sol/ERC20Token.dbg.json +4 -0
  393. package/src/assets/ethereum/mainnet/token/ERC20Token.sol/ERC20Token.json +330 -0
  394. package/src/assets/ethereum/mainnet/token/ERC721Token.sol/ERC721Token.dbg.json +4 -0
  395. package/src/assets/ethereum/mainnet/token/ERC721Token.sol/ERC721Token.json +449 -0
  396. package/src/assets/solana/devnet/idl/liqsol_core.json +8566 -0
  397. package/src/assets/solana/{idl → devnet/idl}/liqsol_token.json +34 -0
  398. package/src/assets/solana/devnet/idl/transfer_hook.json +490 -0
  399. package/src/assets/solana/{idl → devnet/idl}/validator_leaderboard.json +15 -0
  400. package/src/assets/solana/devnet/types/liqsol_core.ts +8572 -0
  401. package/src/assets/solana/{types → devnet/types}/liqsol_token.ts +34 -0
  402. package/src/assets/solana/devnet/types/transfer_hook.ts +496 -0
  403. package/src/assets/solana/{types → devnet/types}/validator_leaderboard.ts +15 -0
  404. package/src/assets/solana/{idl → mainnet/idl}/liqsol_core.json +632 -433
  405. package/src/assets/solana/mainnet/idl/liqsol_token.json +217 -0
  406. package/src/assets/solana/mainnet/idl/transfer_hook.json +479 -0
  407. package/src/assets/solana/mainnet/idl/validator_leaderboard.json +574 -0
  408. package/src/assets/solana/{types → mainnet/types}/liqsol_core.ts +632 -433
  409. package/src/assets/solana/mainnet/types/liqsol_token.ts +223 -0
  410. package/src/assets/solana/mainnet/types/transfer_hook.ts +485 -0
  411. package/src/assets/solana/mainnet/types/validator_leaderboard.ts +580 -0
  412. package/src/assets/solana/realdevnet/idl/liqsol_core.json +7112 -0
  413. package/src/assets/solana/realdevnet/idl/liqsol_token.json +217 -0
  414. package/src/assets/solana/realdevnet/idl/transfer_hook.json +479 -0
  415. package/src/assets/solana/realdevnet/idl/validator_leaderboard.json +735 -0
  416. package/src/assets/solana/realdevnet/types/liqsol_core.ts +7118 -0
  417. package/src/assets/solana/realdevnet/types/liqsol_token.ts +223 -0
  418. package/src/assets/solana/realdevnet/types/transfer_hook.ts +485 -0
  419. package/src/assets/solana/realdevnet/types/validator_leaderboard.ts +741 -0
  420. package/src/index.ts +2 -2
  421. package/src/networks/ethereum/clients/convert.client.ts +32 -3
  422. package/src/networks/ethereum/clients/opp.client.ts +20 -21
  423. package/src/networks/ethereum/clients/pretoken.client.ts +8 -9
  424. package/src/networks/ethereum/clients/receipt.client.ts +93 -23
  425. package/src/networks/ethereum/clients/stake.client.ts +86 -14
  426. package/src/networks/ethereum/clients/validator.client.ts +61 -0
  427. package/src/networks/ethereum/contract.ts +425 -153
  428. package/src/networks/ethereum/ethereum.ts +370 -202
  429. package/src/networks/ethereum/types.ts +65 -28
  430. package/src/networks/ethereum/utils.ts +104 -72
  431. package/src/networks/solana/clients/convert.client.ts +341 -0
  432. package/src/networks/solana/clients/distribution.client.ts +245 -20
  433. package/src/networks/solana/clients/leaderboard.client.ts +10 -13
  434. package/src/networks/solana/clients/outpost.client.ts +93 -55
  435. package/src/networks/solana/clients/token.client.ts +20 -15
  436. package/src/networks/solana/constants.ts +55 -287
  437. package/src/networks/solana/program.ts +446 -28
  438. package/src/networks/solana/solana.ts +917 -288
  439. package/src/networks/solana/types.ts +173 -24
  440. package/src/networks/solana/utils.ts +125 -339
  441. package/src/staker.ts +25 -4
  442. package/src/types.ts +102 -22
  443. package/src/assets/ethereum/ABI/liqEth/BeaconState.sol/BeaconState.dbg.json +0 -4
  444. package/src/assets/ethereum/ABI/liqEth/DepositManager.sol/DepositManager.dbg.json +0 -4
  445. package/src/assets/ethereum/ABI/liqEth/DepositManager.sol/DepositManager.json +0 -952
  446. package/src/assets/ethereum/ABI/liqEth/LiqEthAuthority.sol/LiqEthAuthority.dbg.json +0 -4
  447. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IAccounting.dbg.json +0 -4
  448. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IDepositContract.dbg.json +0 -4
  449. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IDepositManager.dbg.json +0 -4
  450. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/ILiqEthUpgradeable.dbg.json +0 -4
  451. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IRewardsERC20.dbg.json +0 -4
  452. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IRewardsERC20Pausable.dbg.json +0 -4
  453. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IStakingModule.dbg.json +0 -4
  454. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IValidatorBalanceVerifier.dbg.json +0 -4
  455. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IWithdrawalRecord.dbg.json +0 -4
  456. package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/LiqEthCommon.dbg.json +0 -4
  457. package/src/assets/ethereum/ABI/liqEth/LiqEthManaged.sol/LiqEthManaged.dbg.json +0 -4
  458. package/src/assets/ethereum/ABI/liqEth/RewardsERC20.sol/RewardsERC20Upgradeable.dbg.json +0 -4
  459. package/src/assets/ethereum/ABI/liqEth/RewardsERC20Pausable.sol/RewardsERC20PausableUpgradeable.dbg.json +0 -4
  460. package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/BeaconRoots.dbg.json +0 -4
  461. package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/BeaconRoots.json +0 -10
  462. package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/SSZ.dbg.json +0 -4
  463. package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/SSZ.json +0 -10
  464. package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/SSZExtras.dbg.json +0 -4
  465. package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/SSZExtras.json +0 -10
  466. package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/SSZVec48.dbg.json +0 -4
  467. package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/SSZVec48.json +0 -10
  468. package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/ValidatorBalanceVerifier.dbg.json +0 -4
  469. package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/ValidatorBalanceVerifier.json +0 -291
  470. package/src/assets/ethereum/ABI/liqEth/Yield.sol/YieldOracle.dbg.json +0 -4
  471. package/src/assets/ethereum/ABI/liqEth/accounting.sol/Accounting.dbg.json +0 -4
  472. package/src/assets/ethereum/ABI/liqEth/accounting.sol/Accounting.json +0 -555
  473. package/src/assets/ethereum/ABI/liqEth/liqEth.sol/LiqEthToken.dbg.json +0 -4
  474. package/src/assets/ethereum/ABI/liqEth/liqEth.sol/LiqEthToken.json +0 -1202
  475. package/src/assets/ethereum/ABI/liqEth/stakingModule.sol/StakingModule.dbg.json +0 -4
  476. package/src/assets/ethereum/ABI/liqEth/stakingModule.sol/StakingModule.json +0 -1791
  477. package/src/assets/ethereum/ABI/liqEth/withdrawalQueue.sol/WithdrawalQueue.dbg.json +0 -4
  478. package/src/assets/ethereum/ABI/liqEth/withdrawalVault.sol/Uint64BE.dbg.json +0 -4
  479. package/src/assets/ethereum/ABI/liqEth/withdrawalVault.sol/WithdrawalVault.dbg.json +0 -4
  480. package/src/assets/ethereum/ABI/liqEth/withdrawalVault.sol/WithdrawalVault.json +0 -460
  481. package/src/assets/ethereum/ABI/outpost/Aggregator.sol/Aggregator.json +0 -82
  482. package/src/assets/ethereum/ABI/outpost/BAR.sol/BAR.dbg.json +0 -4
  483. package/src/assets/ethereum/ABI/outpost/Depositor.sol/Depositor.dbg.json +0 -4
  484. package/src/assets/ethereum/ABI/outpost/Depositor.sol/Depositor.json +0 -1638
  485. package/src/assets/ethereum/ABI/outpost/EthUsdPriceConsumer.sol/AggregatorV3Interface.dbg.json +0 -4
  486. package/src/assets/ethereum/ABI/outpost/EthUsdPriceConsumer.sol/EthUsdPriceConsumer.dbg.json +0 -4
  487. package/src/assets/ethereum/ABI/outpost/OPP.sol/OPP.dbg.json +0 -4
  488. package/src/assets/ethereum/ABI/outpost/OPPCommon.sol/IOPP.dbg.json +0 -4
  489. package/src/assets/ethereum/ABI/outpost/OPPCommon.sol/IOPPEndpoint.dbg.json +0 -4
  490. package/src/assets/ethereum/ABI/outpost/OPPCommon.sol/IOPPInbound.dbg.json +0 -4
  491. package/src/assets/ethereum/ABI/outpost/OPPCommon.sol/IOPPReceiver.dbg.json +0 -4
  492. package/src/assets/ethereum/ABI/outpost/OPPCommon.sol/IOPPSender.dbg.json +0 -4
  493. package/src/assets/ethereum/ABI/outpost/OPPCommon.sol/OPPCommon.dbg.json +0 -4
  494. package/src/assets/ethereum/ABI/outpost/OPPEndpoint.sol/OPPEndpoint.dbg.json +0 -4
  495. package/src/assets/ethereum/ABI/outpost/OPPEndpointManaged.sol/OPPEndpointManaged.dbg.json +0 -4
  496. package/src/assets/ethereum/ABI/outpost/OPPEndpointOwnable.sol/OPPEndpointOwnable.dbg.json +0 -4
  497. package/src/assets/ethereum/ABI/outpost/OPPErrors.sol/OPPErrors.dbg.json +0 -4
  498. package/src/assets/ethereum/ABI/outpost/OPPInbound.sol/OPPInbound.dbg.json +0 -4
  499. package/src/assets/ethereum/ABI/outpost/OPPReceiver.sol/OPPReceiver.dbg.json +0 -4
  500. package/src/assets/ethereum/ABI/outpost/OPPSender.sol/OPPSender.dbg.json +0 -4
  501. package/src/assets/ethereum/ABI/outpost/OutpostErrors.sol/OutpostErrors.dbg.json +0 -4
  502. package/src/assets/ethereum/ABI/outpost/OutpostManaged.sol/OutpostManaged.dbg.json +0 -4
  503. package/src/assets/ethereum/ABI/outpost/OutpostManager.sol/OutpostManager.dbg.json +0 -4
  504. package/src/assets/ethereum/ABI/outpost/OutpostManagerAuthority.sol/OutpostManagerAuthority.dbg.json +0 -4
  505. package/src/assets/ethereum/ABI/outpost/OutpostManagerCommon.sol/IOutpostManager.dbg.json +0 -4
  506. package/src/assets/ethereum/ABI/outpost/OutpostManagerCommon.sol/IOutpostUpgradeable.dbg.json +0 -4
  507. package/src/assets/ethereum/ABI/outpost/OutpostManagerCommon.sol/OutpostManagerCommon.dbg.json +0 -4
  508. package/src/assets/ethereum/ABI/outpost/OutpostOwnable.sol/OutpostOwnable.dbg.json +0 -4
  509. package/src/assets/ethereum/ABI/outpost/Pool.sol/Pool.dbg.json +0 -4
  510. package/src/assets/ethereum/ABI/outpost/Pretoken.sol/Pretoken.dbg.json +0 -4
  511. package/src/assets/ethereum/ABI/outpost/Pretoken.sol/Pretoken.json +0 -1650
  512. package/src/assets/ethereum/ABI/outpost/ReceiptNFT.sol/ReceiptNFT.dbg.json +0 -4
  513. package/src/assets/ethereum/ABI/outpost/interfaces/IPretoken.sol/IPretoken.dbg.json +0 -4
  514. package/src/assets/ethereum/ABI/outpost/interfaces/IWarrant.sol/IWarrant.dbg.json +0 -4
  515. package/src/assets/ethereum/ABI/outpost/token/ERC721EthEquivalentVotesUpgradeable.sol/ERC721EthEquivalentVotesUpgradeable.dbg.json +0 -4
  516. package/src/assets/ethereum/ABI/outpost/token/IERC721EthEquivalent.sol/IERC721EthEquivalent.dbg.json +0 -4
  517. package/src/assets/ethereum/ABI/token/ERC1155Token.sol/ERC1155Token.dbg.json +0 -4
  518. package/src/assets/ethereum/ABI/token/ERC1155Token.sol/ERC1155Token.json +0 -472
  519. package/src/assets/ethereum/ABI/token/ERC20Token.sol/ERC20Token.dbg.json +0 -4
  520. package/src/assets/ethereum/ABI/token/ERC20Token.sol/ERC20Token.json +0 -330
  521. package/src/assets/ethereum/ABI/token/ERC721Token.sol/ERC721Token.dbg.json +0 -4
  522. package/src/assets/ethereum/ABI/token/ERC721Token.sol/ERC721Token.json +0 -449
  523. package/src/assets/solana/idl/transfer_hook.json +0 -197
  524. package/src/assets/solana/types/transfer_hook.ts +0 -203
  525. package/src/networks/solana/clients/deposit.client.ts +0 -274
  526. package/src/staker/types.ts +0 -62
  527. /package/src/assets/ethereum/{ABI → hoodi}/liqEth/BeaconState.sol/BeaconState.json +0 -0
  528. /package/src/assets/ethereum/{ABI → hoodi}/liqEth/LiqEthAuthority.sol/LiqEthAuthority.json +0 -0
  529. /package/src/assets/ethereum/{ABI → hoodi}/liqEth/LiqEthCommon.sol/IDepositContract.json +0 -0
  530. /package/src/assets/ethereum/{ABI → hoodi}/liqEth/LiqEthCommon.sol/IDepositManager.json +0 -0
  531. /package/src/assets/ethereum/{ABI → hoodi}/liqEth/LiqEthCommon.sol/ILiqEthUpgradeable.json +0 -0
  532. /package/src/assets/ethereum/{ABI → hoodi}/liqEth/LiqEthCommon.sol/IValidatorBalanceVerifier.json +0 -0
  533. /package/src/assets/ethereum/{ABI → hoodi}/liqEth/LiqEthCommon.sol/IWithdrawalRecord.json +0 -0
  534. /package/src/assets/ethereum/{ABI → hoodi}/outpost/EthUsdPriceConsumer.sol/AggregatorV3Interface.json +0 -0
  535. /package/src/assets/ethereum/{ABI → hoodi}/outpost/OPPCommon.sol/IOPPEndpoint.json +0 -0
  536. /package/src/assets/ethereum/{ABI → hoodi}/outpost/OutpostManagerCommon.sol/IOutpostUpgradeable.json +0 -0
  537. /package/src/assets/ethereum/{ABI → hoodi}/outpost/interfaces/IPretoken.sol/IPretoken.json +0 -0
  538. /package/src/assets/ethereum/{ABI → hoodi}/outpost/interfaces/IWarrant.sol/IWarrant.json +0 -0
  539. /package/src/assets/ethereum/{ABI → hoodi}/outpost/token/ERC721EthEquivalentVotesUpgradeable.sol/ERC721EthEquivalentVotesUpgradeable.json +0 -0
  540. /package/src/assets/ethereum/{ABI → hoodi}/outpost/token/IERC721EthEquivalent.sol/IERC721EthEquivalent.json +0 -0
  541. /package/src/assets/ethereum/{ABI → mainnet}/outpost/OPP.sol/OPP.json +0 -0
  542. /package/src/assets/ethereum/{ABI → mainnet}/outpost/OPPCommon.sol/IOPP.json +0 -0
  543. /package/src/assets/ethereum/{ABI → mainnet}/outpost/OPPCommon.sol/IOPPInbound.json +0 -0
  544. /package/src/assets/ethereum/{ABI → mainnet}/outpost/OPPCommon.sol/IOPPReceiver.json +0 -0
  545. /package/src/assets/ethereum/{ABI → mainnet}/outpost/OPPCommon.sol/IOPPSender.json +0 -0
  546. /package/src/assets/ethereum/{ABI → mainnet}/outpost/OPPCommon.sol/OPPCommon.json +0 -0
  547. /package/src/assets/ethereum/{ABI → mainnet}/outpost/OPPEndpoint.sol/OPPEndpoint.json +0 -0
  548. /package/src/assets/ethereum/{ABI → mainnet}/outpost/OPPEndpointManaged.sol/OPPEndpointManaged.json +0 -0
  549. /package/src/assets/ethereum/{ABI → mainnet}/outpost/OPPEndpointOwnable.sol/OPPEndpointOwnable.json +0 -0
  550. /package/src/assets/ethereum/{ABI → mainnet}/outpost/OPPErrors.sol/OPPErrors.json +0 -0
  551. /package/src/assets/ethereum/{ABI → mainnet}/outpost/OPPInbound.sol/OPPInbound.json +0 -0
  552. /package/src/assets/ethereum/{ABI → mainnet}/outpost/OPPReceiver.sol/OPPReceiver.json +0 -0
  553. /package/src/assets/ethereum/{ABI → mainnet}/outpost/OPPSender.sol/OPPSender.json +0 -0
  554. /package/src/assets/ethereum/{ABI → mainnet}/outpost/OutpostManaged.sol/OutpostManaged.json +0 -0
  555. /package/src/assets/ethereum/{ABI → mainnet}/outpost/OutpostManagerAuthority.sol/OutpostManagerAuthority.json +0 -0
  556. /package/src/assets/ethereum/{ABI → mainnet}/outpost/OutpostManagerCommon.sol/IOutpostManager.json +0 -0
  557. /package/src/assets/ethereum/{ABI → mainnet}/outpost/OutpostManagerCommon.sol/OutpostManagerCommon.json +0 -0
  558. /package/src/assets/ethereum/{ABI → mainnet}/outpost/OutpostOwnable.sol/OutpostOwnable.json +0 -0
@@ -1,21 +1,32 @@
1
1
  import {
2
+ AddressLookupTableAccount,
2
3
  Commitment,
3
4
  ComputeBudgetProgram,
4
5
  Connection,
5
6
  ConnectionConfig,
7
+ PerfSample,
8
+ SendTransactionError,
6
9
  PublicKey as SolPubKey,
10
+ SystemProgram,
7
11
  Transaction,
12
+ TransactionInstruction,
13
+ TransactionMessage,
8
14
  TransactionSignature,
15
+ VersionedTransaction,
9
16
  } from '@solana/web3.js';
10
- import { AnchorProvider } from '@coral-xyz/anchor';
17
+ import { AnchorProvider, BN } from '@coral-xyz/anchor';
11
18
  import { BaseSignerWalletAdapter } from '@solana/wallet-adapter-base';
12
19
  import {
13
20
  ASSOCIATED_TOKEN_PROGRAM_ID,
21
+ createAssociatedTokenAccountInstruction,
14
22
  getAssociatedTokenAddressSync,
15
23
  TOKEN_2022_PROGRAM_ID,
16
24
  } from '@solana/spl-token';
17
25
 
26
+ import * as multisig from "@sqds/multisig";
27
+
18
28
  import {
29
+ Base58,
19
30
  ChainID,
20
31
  ExternalNetwork,
21
32
  KeyType,
@@ -26,28 +37,33 @@ import {
26
37
  import {
27
38
  IStakingClient,
28
39
  Portfolio,
40
+ SquadsXConfig,
29
41
  StakerConfig,
30
42
  TrancheSnapshot,
31
43
  } from '../../types';
32
44
 
33
- import { DepositClient } from './clients/deposit.client';
45
+ import { ConvertClient } from './clients/convert.client';
34
46
  import { DistributionClient } from './clients/distribution.client';
35
47
  import { LeaderboardClient } from './clients/leaderboard.client';
36
48
  import { OutpostClient } from './clients/outpost.client';
37
49
  import { TokenClient } from './clients/token.client';
38
50
 
39
51
  import {
40
- deriveLiqsolMintPda,
41
- deriveReservePoolPda,
42
- deriveVaultPda,
52
+ DEFAULT_AVERAGE_PAY_RATE,
43
53
  INDEX_SCALE,
54
+ PAY_RATE_SCALE_FACTOR,
44
55
  } from './constants';
45
56
 
46
- import { buildSolanaTrancheSnapshot } from './utils';
47
- import { SolanaTransaction } from './types';
57
+ import { buildSolanaTrancheSnapshot, ceilDiv } from './utils';
58
+ import { GlobalConfig, PayRateEntry, SolanaTransaction } from './types';
59
+ import { WithdrawReceipt } from '../../types';
60
+ import { SolanaProgramService } from './program';
61
+ import bs58 from 'bs58';
48
62
 
49
63
  const commitment: Commitment = 'confirmed';
50
64
 
65
+ export const SCALE = new BN('1000000000000');
66
+
51
67
  /**
52
68
  * Solana implementation of IStakingClient.
53
69
  *
@@ -64,11 +80,15 @@ export class SolanaStakingClient implements IStakingClient {
64
80
  public connection: Connection;
65
81
  public anchor: AnchorProvider;
66
82
 
67
- public depositClient: DepositClient;
83
+ public convertClient: ConvertClient;
68
84
  public distributionClient: DistributionClient;
69
85
  public leaderboardClient: LeaderboardClient;
70
86
  public outpostClient: OutpostClient;
71
87
  public tokenClient: TokenClient;
88
+ public program: SolanaProgramService
89
+
90
+ private smartAccount?: SolPubKey; // PDA (off-curve)
91
+ private signer?: SolPubKey; // on-curve signer
72
92
 
73
93
  get solPubKey(): SolPubKey {
74
94
  if (!this.pubKey) throw new Error('pubKey is undefined');
@@ -79,6 +99,18 @@ export class SolanaStakingClient implements IStakingClient {
79
99
  return this.config.network;
80
100
  }
81
101
 
102
+ get feePayer(): SolPubKey {
103
+ if (this.signer) return this.signer;
104
+ // fallback for normal wallets
105
+ if (this.anchor.wallet.publicKey) return this.anchor.wallet.publicKey;
106
+ throw new Error('No signing authority available');
107
+ }
108
+
109
+ get squadsX(): SquadsXConfig | null {
110
+ const config = this.config.extras?.squadsX;
111
+ return config ?? null;
112
+ }
113
+
82
114
  constructor(private config: StakerConfig) {
83
115
  const adapter = config.provider as BaseSignerWalletAdapter | undefined;
84
116
 
@@ -177,11 +209,13 @@ export class SolanaStakingClient implements IStakingClient {
177
209
  commitment,
178
210
  });
179
211
 
180
- this.depositClient = new DepositClient(this.anchor);
181
- this.distributionClient = new DistributionClient(this.anchor);
182
- this.leaderboardClient = new LeaderboardClient(this.anchor);
183
- this.outpostClient = new OutpostClient(this.anchor);
184
- this.tokenClient = new TokenClient(this.anchor);
212
+ this.program = new SolanaProgramService(this.anchor, config.network.chainId as SolChainID);
213
+
214
+ this.convertClient = new ConvertClient(this.anchor, this.program);
215
+ this.distributionClient = new DistributionClient(this.anchor, this.program);
216
+ this.leaderboardClient = new LeaderboardClient(this.anchor, this.program);
217
+ this.outpostClient = new OutpostClient(this.anchor, this.program);
218
+ this.tokenClient = new TokenClient(this.anchor, this.program);
185
219
  }
186
220
 
187
221
  // ---------------------------------------------------------------------
@@ -194,18 +228,19 @@ export class SolanaStakingClient implements IStakingClient {
194
228
  */
195
229
  async deposit(amountLamports: bigint): Promise<string> {
196
230
  this.ensureUser();
197
- if (amountLamports <= BigInt(0)) {
231
+ if (amountLamports <= BigInt(0))
198
232
  throw new Error('Deposit amount must be greater than zero.');
199
- }
200
233
 
201
- const tx = await this.depositClient.buildDepositTx(amountLamports);
202
- const { tx: prepared, blockhash, lastValidBlockHeight } =
203
- await this.prepareTx(tx);
204
- const signed = await this.signTransaction(prepared);
205
- return await this.sendAndConfirmHttp(signed, {
206
- blockhash,
207
- lastValidBlockHeight,
208
- });
234
+ try {
235
+ const ix = await this.convertClient.buildDepositTx(amountLamports, this.squadsVaultPDA)
236
+ return !!this.squadsX
237
+ ? await this.sendSquadsIxs(ix)
238
+ : await this.buildAndSendIx(ix)
239
+
240
+ } catch (err) {
241
+ console.log(`Failed to deposit Solana: ${err}`);
242
+ throw err;
243
+ }
209
244
  }
210
245
 
211
246
  /**
@@ -220,44 +255,90 @@ export class SolanaStakingClient implements IStakingClient {
220
255
  */
221
256
  async withdraw(amountLamports: bigint): Promise<string> {
222
257
  this.ensureUser();
223
- if (amountLamports <= BigInt(0)) {
258
+ if (amountLamports <= BigInt(0))
224
259
  throw new Error('Withdraw amount must be greater than zero.');
225
- }
226
260
 
227
- const tx = await this.depositClient.buildWithdrawTx(amountLamports);
228
- const { tx: prepared, blockhash, lastValidBlockHeight } =
229
- await this.prepareTx(tx);
230
- const signed = await this.signTransaction(prepared);
231
- return await this.sendAndConfirmHttp(signed, {
232
- blockhash,
233
- lastValidBlockHeight,
234
- });
261
+ try {
262
+ const ix = await this.convertClient.buildWithdrawTx(amountLamports, this.squadsVaultPDA)
263
+ return !!this.squadsX
264
+ ? await this.sendSquadsIxs(ix)
265
+ : await this.buildAndSendIx(ix)
266
+
267
+ } catch (err) {
268
+ console.log(`Failed to withdraw Solana: ${err}`);
269
+ throw err;
270
+ }
235
271
  }
236
272
 
237
273
  /**
238
- * Stake liqSOL into Outpost (liqSOL pool) via liqsol_core::synd.
274
+ * Enumerate withdrawal receipt NFTs held by the user (queued/ready/claimed).
275
+ * Mirrors the ETH getPendingWithdraws helper for UI parity.
239
276
  */
240
- async stake(amountLamports: bigint): Promise<string> {
277
+ async getPendingWithdraws(address?: string): Promise<WithdrawReceipt[]> {
241
278
  this.ensureUser();
279
+ const owner = address ? new SolPubKey(address) :
280
+ this.squadsVaultPDA ?? this.anchor.wallet.publicKey;
281
+ return await this.convertClient.fetchWithdrawReceipts(owner);
282
+ }
242
283
 
243
- if (!amountLamports || amountLamports <= BigInt(0)) {
244
- throw new Error('Stake amount must be greater than zero.');
284
+ /**
285
+ * Claim a withdrawal receipt (burn NFT + receive SOL) via claim_withdraw.
286
+ */
287
+ async claimWithdraw(tokenId: bigint): Promise<string> {
288
+ this.ensureUser();
289
+ const owner = this.squadsVaultPDA ?? this.anchor.wallet.publicKey;
290
+
291
+ try {
292
+ const ix = await this.convertClient.buildClaimWithdrawTx(tokenId, owner);
293
+ return !!this.squadsX
294
+ ? await this.sendSquadsIxs(ix)
295
+ : await this.buildAndSendIx(ix);
296
+ } catch (err) {
297
+ console.log(`Failed to claim withdraw on Solana: ${err}`);
298
+ throw err;
245
299
  }
300
+ }
246
301
 
247
- const user = this.solPubKey;
248
-
249
- // Build compute budget increase instruction
250
- const cuIx = ComputeBudgetProgram.setComputeUnitLimit({ units: 400_000 });
251
-
252
- // Build the Outpost synd instruction
253
- const ix = await this.outpostClient.buildStakeIx(amountLamports, user);
302
+ /**
303
+ * Claim accrued liqSOL distribution rewards (liqsol_core::claim_rewards).
304
+ */
305
+ async claimLiqsolRewards(): Promise<string> {
306
+ this.ensureUser();
307
+ const owner = this.squadsVaultPDA ?? this.anchor.wallet.publicKey;
308
+
309
+ try {
310
+ const ix = await this.distributionClient.buildClaimRewardsIx(owner);
311
+ return !!this.squadsX
312
+ ? await this.sendSquadsIxs(ix)
313
+ : await this.buildAndSendIx(ix);
314
+ } catch (err) {
315
+ console.log(`Failed to claim liqSOL rewards on Solana: ${err}`);
316
+ throw err;
317
+ }
318
+ }
254
319
 
255
- // Wrap in a transaction and send
256
- const tx = new Transaction().add(cuIx, ix);
257
- const prepared = await this.prepareTx(tx);
258
- const signed = await this.signTransaction(prepared.tx);
320
+ /**
321
+ * Stake liqSOL into Outpost (liqSOL → pool) via liqsol_core::synd.
322
+ */
323
+ async stake(amountLamports: bigint, wireAccount?: string): Promise<string> {
324
+ this.ensureUser();
325
+ if (!amountLamports || amountLamports <= BigInt(0))
326
+ throw new Error('Stake amount must be greater than zero.');
259
327
 
260
- return this.sendAndConfirmHttp(signed, prepared);
328
+ try {
329
+ const ix = await this.outpostClient.buildStakeIx(
330
+ amountLamports,
331
+ this.squadsVaultPDA,
332
+ wireAccount,
333
+ )
334
+ return !!this.squadsX
335
+ ? await this.sendSquadsIxs(ix)
336
+ : await this.buildAndSendIx(ix)
337
+
338
+ } catch (err) {
339
+ console.log(`Failed to stake Solana: ${err}`);
340
+ throw err;
341
+ }
261
342
  }
262
343
 
263
344
  /**
@@ -265,25 +346,19 @@ export class SolanaStakingClient implements IStakingClient {
265
346
  */
266
347
  async unstake(amountLamports: bigint): Promise<string> {
267
348
  this.ensureUser();
268
-
269
- if (!amountLamports || amountLamports <= BigInt(0)) {
349
+ if (!amountLamports || amountLamports <= BigInt(0))
270
350
  throw new Error('Unstake amount must be greater than zero.');
271
- }
272
-
273
- const user = this.solPubKey;
274
-
275
- // Build compute budget increase instruction
276
- const cuIx = ComputeBudgetProgram.setComputeUnitLimit({ units: 400_000 });
277
-
278
- // Build the Outpost desynd instruction
279
- const ix = await this.outpostClient.buildUnstakeIx(amountLamports, user);
280
351
 
281
- // Wrap in a transaction and send
282
- const tx = new Transaction().add(cuIx, ix);
283
- const prepared = await this.prepareTx(tx);
284
- const signed = await this.signTransaction(prepared.tx);
285
-
286
- return this.sendAndConfirmHttp(signed, prepared);
352
+ try {
353
+ const ix = await this.outpostClient.buildUnstakeIx(amountLamports, this.squadsVaultPDA)
354
+ return !!this.squadsX
355
+ ? await this.sendSquadsIxs(ix)
356
+ : await this.buildAndSendIx(ix)
357
+ }
358
+ catch (err) {
359
+ console.log(`Failed to unstake Solana: ${err}`);
360
+ throw err;
361
+ }
287
362
  }
288
363
 
289
364
  /**
@@ -294,21 +369,83 @@ export class SolanaStakingClient implements IStakingClient {
294
369
  */
295
370
  async buy(amountLamports: bigint): Promise<string> {
296
371
  this.ensureUser();
297
- if (!amountLamports || amountLamports <= BigInt(0)) {
372
+ if (!amountLamports || amountLamports <= BigInt(0))
298
373
  throw new Error('liqSOL pretoken purchase requires a positive amount.');
374
+
375
+ try {
376
+ const ix = await this.tokenClient.buildPurchaseIx(amountLamports, this.squadsVaultPDA)
377
+ return !!this.squadsX
378
+ ? await this.sendSquadsIxs(ix)
379
+ : await this.buildAndSendIx(ix)
380
+ }
381
+ catch (err) {
382
+ console.log(`Failed to buy liqSOL pretokens: ${err}`);
383
+ throw err;
299
384
  }
385
+ }
300
386
 
301
- const user = this.solPubKey;
302
- const cuIx = ComputeBudgetProgram.setComputeUnitLimit({ units: 400_000 });
303
- const ix = await this.tokenClient.buildPurchaseIx(amountLamports, user);
304
- const tx = new Transaction().add(cuIx, ix);
305
- const { tx: prepared, blockhash, lastValidBlockHeight } =
306
- await this.prepareTx(tx);
307
- const signed = await this.signTransaction(prepared);
308
- return await this.sendAndConfirmHttp(signed, {
309
- blockhash,
310
- lastValidBlockHeight,
311
- });
387
+ /** Deposit SOL to liqSOL, then syndicate that liqSOL in one transaction. Requires enough SOL for the deposit fee. */
388
+ async depositAndStake(amountLamports: bigint, wireAccount?: string): Promise<string> {
389
+ this.ensureUser();
390
+ if (!amountLamports || amountLamports <= BigInt(0))
391
+ throw new Error('Amount must be greater than zero.');
392
+
393
+ try {
394
+ const user = this.squadsVaultPDA ?? this.anchor.wallet.publicKey;
395
+ const depositIx = await this.convertClient.buildDepositTx(amountLamports, user);
396
+ const stakeIx = await this.outpostClient.buildStakeIx(
397
+ amountLamports,
398
+ user,
399
+ wireAccount,
400
+ );
401
+
402
+ return !!this.squadsX
403
+ ? await this.sendSquadsIxs([depositIx, stakeIx])
404
+ : await this.buildAndSendIx([depositIx, stakeIx]);
405
+ } catch (err) {
406
+ console.log(`Failed to deposit and stake: ${err}`);
407
+ throw err;
408
+ }
409
+ }
410
+
411
+ /** Deposit SOL to liqSOL, then buy pretokens with that liqSOL in one transaction. Requires enough SOL for the deposit fee. */
412
+ async depositAndBuy(amountLamports: bigint): Promise<string> {
413
+ this.ensureUser();
414
+ if (!amountLamports || amountLamports <= BigInt(0))
415
+ throw new Error('Amount must be greater than zero.');
416
+
417
+ try {
418
+ const user = this.squadsVaultPDA ?? this.anchor.wallet.publicKey;
419
+ const depositIx = await this.convertClient.buildDepositTx(amountLamports, user);
420
+ const purchaseIx = await this.tokenClient.buildPurchaseIx(amountLamports, user);
421
+
422
+ return !!this.squadsX
423
+ ? await this.sendSquadsIxs([depositIx, purchaseIx])
424
+ : await this.buildAndSendIx([depositIx, purchaseIx]);
425
+ } catch (err) {
426
+ console.log(`Failed to deposit and buy: ${err}`);
427
+ throw err;
428
+ }
429
+ }
430
+
431
+ /** Desyndicate liqSOL, then request withdraw in one transaction. */
432
+ async unstakeAndWithdraw(amountLamports: bigint): Promise<string> {
433
+ this.ensureUser();
434
+ if (!amountLamports || amountLamports <= BigInt(0))
435
+ throw new Error('Amount must be greater than zero.');
436
+
437
+ try {
438
+ const user = this.squadsVaultPDA ?? this.anchor.wallet.publicKey;
439
+ const unstakeIx = await this.outpostClient.buildUnstakeIx(amountLamports, user);
440
+ const withdrawIx = await this.convertClient.buildWithdrawTx(amountLamports, user);
441
+
442
+ return !!this.squadsX
443
+ ? await this.sendSquadsIxs([unstakeIx, withdrawIx])
444
+ : await this.buildAndSendIx([unstakeIx, withdrawIx]);
445
+ } catch (err) {
446
+ console.log(`Failed to unstake and withdraw: ${err}`);
447
+ throw err;
448
+ }
312
449
  }
313
450
 
314
451
  /**
@@ -320,143 +457,156 @@ export class SolanaStakingClient implements IStakingClient {
320
457
  * - yield: on-chain index/shares plus an estimated accrued liqSOL yield
321
458
  * - extras: useful internal addresses and raw state for debugging/UX
322
459
  */
323
- async getPortfolio(): Promise<Portfolio> {
324
- if (!this.pubKey) throw new Error('User pubKey is undefined');
325
-
326
- const user = this.solPubKey;
327
-
328
- const reservePoolPDA = deriveReservePoolPda();
329
- const vaultPDA = deriveVaultPda();
330
- const liqsolMint = deriveLiqsolMintPda();
331
-
332
- const userLiqsolAta = getAssociatedTokenAddressSync(
333
- liqsolMint,
334
- user,
335
- false,
336
- TOKEN_2022_PROGRAM_ID,
337
- ASSOCIATED_TOKEN_PROGRAM_ID,
338
- );
339
-
340
- // NOTE:
341
- // - nativeLamports: wallet SOL
342
- // - actualBalResp: liqSOL balance in user ATA
343
- // - snapshot: Outpost + pretokens + global index/shares
344
- const [nativeLamports, actualBalResp, snapshot] = await Promise.all([
345
- this.connection.getBalance(user, 'confirmed'),
346
- this.connection
347
- .getTokenAccountBalance(userLiqsolAta, 'confirmed')
348
- .catch(() => null),
349
- this.outpostClient.fetchWireState(user).catch(() => null),
350
- ]);
460
+ async getPortfolio(address?: string): Promise<Portfolio> {
461
+ // if (!this.pubKey) throw new Error('User pubKey is undefined');
462
+ try {
463
+ const user = address ? new SolPubKey(address) :
464
+ !!this.squadsX ? this.squadsVaultPDA! : this.solPubKey;
465
+
466
+ const reservePoolPDA = this.program.deriveReservePoolPda();
467
+ const vaultPDA = this.program.deriveVaultPda();
468
+ const liqsolMint = this.program.deriveLiqsolMintPda();
469
+
470
+ const userLiqsolAta = getAssociatedTokenAddressSync(
471
+ liqsolMint,
472
+ user,
473
+ true,
474
+ TOKEN_2022_PROGRAM_ID,
475
+ ASSOCIATED_TOKEN_PROGRAM_ID,
476
+ );
351
477
 
352
- const LIQSOL_DECIMALS = 9;
353
-
354
- const actualAmountStr = actualBalResp?.value?.amount ?? '0';
355
-
356
- const globalState = snapshot?.globalState ?? null;
357
- const outpostAccount = snapshot?.outpostAccount ?? null;
358
- const trancheState = snapshot?.trancheState ?? null;
359
- const userPretokenRecord = snapshot?.userPretokenRecord ?? null;
360
-
361
- // -----------------------------
362
- // Staked liqSOL (Outpost)
363
- // -----------------------------
364
- // This is the liqSOL that has been syndicated into Outpost via `synd`.
365
- // It lives on the outpost account as `stakedLiqsol`.
366
- const stakedLiqsolStr =
367
- outpostAccount?.stakedLiqsol?.toString?.() ?? '0';
368
-
369
- // -----------------------------
370
- // WIRE pretokens (1e8 scale)
371
- // -----------------------------
372
- // This is NOT stake — it’s the prelaunch WIRE position.
373
- const wirePretokensStr =
374
- userPretokenRecord?.totalPretokensPurchased?.toString?.() ??
375
- '0';
376
-
377
- // -----------------------------
378
- // Yield view (index + shares)
379
- // -----------------------------
380
- // We expose:
381
- // - currentIndex: globalState.currentIndex (1e12 scale)
382
- // - totalShares: globalState.totalShares
383
- // - userShares: outpostAccount.stakedShares
384
- // - estimatedClaimLiqsol: floor(userShares * index / INDEX_SCALE)
385
- // - estimatedYield: max(0, estimatedClaim - stakedLiqsol)
386
- //
387
- // This matches the capital-staking math:
388
- // sharesToTokens(shares, index) = shares * index / INDEX_SCALE
389
- const currentIndexStr =
390
- globalState?.currentIndex?.toString?.() ?? '0';
391
- const totalSharesStr =
392
- globalState?.totalShares?.toString?.() ?? '0';
393
- const userSharesStr =
394
- outpostAccount?.stakedShares?.toString?.() ?? '0';
395
-
396
- const stakedLiqsol = BigInt(stakedLiqsolStr);
397
- const currentIndex = BigInt(currentIndexStr);
398
- const totalShares = BigInt(totalSharesStr);
399
- const userShares = BigInt(userSharesStr);
400
-
401
- let estimatedClaim = BigInt(0);
402
- let estimatedYield = BigInt(0);
403
-
404
- if (userShares > BigInt(0) && currentIndex > BigInt(0)) {
405
- // sharesToTokens(userShares, currentIndex)
406
- estimatedClaim = (userShares * currentIndex) / INDEX_SCALE;
407
-
408
- if (estimatedClaim > stakedLiqsol) {
409
- estimatedYield = estimatedClaim - stakedLiqsol;
478
+ // NOTE:
479
+ // - nativeLamports: wallet SOL
480
+ // - actualBalResp: liqSOL balance in user ATA
481
+ // - snapshot: Outpost + pretokens + global index/shares
482
+ const [nativeLamports, actualBalResp, snapshot, claimableLamports] = await Promise.all([
483
+ this.connection.getBalance(user, 'confirmed'),
484
+ this.connection
485
+ .getTokenAccountBalance(userLiqsolAta, 'confirmed')
486
+ .catch(() => null),
487
+ this.outpostClient.fetchWireState(user).catch(() => null),
488
+ this.distributionClient.getClaimableLiqsol(user).catch(() => new BN(0)),
489
+ ]);
490
+
491
+ const LIQSOL_DECIMALS = 9;
492
+
493
+ const actualAmountStr = actualBalResp?.value?.amount ?? '0';
494
+
495
+ const globalState = snapshot?.globalState ?? null;
496
+ const outpostAccount = snapshot?.outpostAccount ?? null;
497
+ const trancheState = snapshot?.trancheState ?? null;
498
+ const userPretokenRecord = snapshot?.userPretokenRecord ?? null;
499
+
500
+ // -----------------------------
501
+ // Staked liqSOL (Outpost)
502
+ // -----------------------------
503
+ // This is the liqSOL that has been syndicated into Outpost via `synd`.
504
+ // It lives on the outpost account as `stakedLiqsol`.
505
+ const stakedLiqsolStr =
506
+ outpostAccount?.stakedLiqsol?.toString?.() ?? '0';
507
+
508
+ // -----------------------------
509
+ // WIRE pretokens (1e8 scale)
510
+ // -----------------------------
511
+ // This is NOT stake — it’s the prelaunch WIRE position.
512
+ const wirePretokensStr =
513
+ userPretokenRecord?.totalPretokensPurchased?.toString?.() ??
514
+ '0';
515
+
516
+ // -----------------------------
517
+ // Yield view (index + shares)
518
+ // -----------------------------
519
+ // We expose:
520
+ // - currentIndex: globalState.currentIndex (1e12 scale)
521
+ // - totalShares: globalState.totalShares
522
+ // - userShares: outpostAccount.stakedShares
523
+ // - estimatedClaimLiqsol: floor(userShares * index / INDEX_SCALE)
524
+ // - estimatedYield: max(0, estimatedClaim - stakedLiqsol)
525
+ //
526
+ // This matches the capital-staking math:
527
+ // sharesToTokens(shares, index) = shares * index / INDEX_SCALE
528
+ const currentIndexStr =
529
+ globalState?.currentIndex?.toString?.() ?? '0';
530
+ const totalSharesStr =
531
+ globalState?.totalShares?.toString?.() ?? '0';
532
+ const userSharesStr =
533
+ outpostAccount?.stakedShares?.toString?.() ?? '0';
534
+
535
+ const stakedLiqsol = BigInt(stakedLiqsolStr);
536
+ const currentIndex = BigInt(currentIndexStr);
537
+ const totalShares = BigInt(totalSharesStr);
538
+ const userShares = BigInt(userSharesStr);
539
+
540
+ let estimatedClaim = BigInt(0);
541
+ let estimatedYield = BigInt(0);
542
+
543
+ if (userShares > BigInt(0) && currentIndex > BigInt(0)) {
544
+ // sharesToTokens(userShares, currentIndex)
545
+ estimatedClaim = (userShares * currentIndex) / INDEX_SCALE;
546
+
547
+ if (estimatedClaim > stakedLiqsol) {
548
+ estimatedYield = estimatedClaim - stakedLiqsol;
549
+ }
410
550
  }
411
- }
412
551
 
413
- return {
414
- native: {
415
- amount: BigInt(nativeLamports),
416
- symbol: 'SOL',
417
- decimals: 9,
418
- },
419
- liq: {
420
- amount: BigInt(actualAmountStr),
421
- symbol: 'LiqSOL',
422
- decimals: LIQSOL_DECIMALS,
423
- ata: userLiqsolAta,
424
- },
425
- staked: {
426
- // liqSOL staked in Outpost via `synd`
427
- amount: stakedLiqsol,
428
- symbol: 'LiqSOL',
429
- decimals: LIQSOL_DECIMALS,
430
- },
431
- wire: {
432
- // Prelaunch WIRE pretokens (1e8 scale)
433
- amount: BigInt(wirePretokensStr),
434
- symbol: '$WIRE',
435
- decimals: 8,
436
- },
437
- yield: {
438
- // Raw primitives so the frontend can display curves, charts, etc.
439
- currentIndex,
440
- indexScale: INDEX_SCALE,
441
- totalShares,
442
- userShares,
443
- // liqSOL amounts (lamports) implied by index/shares
444
- estimatedClaim,
445
- estimatedYield,
446
- },
447
- extras: {
448
- userLiqsolAta: userLiqsolAta.toBase58(),
449
- reservePoolPDA: reservePoolPDA.toBase58(),
450
- vaultPDA: vaultPDA.toBase58(),
451
- globalIndex: globalState?.currentIndex?.toString(),
452
- totalShares: globalState?.totalShares?.toString(),
453
- currentTrancheNumber:
454
- trancheState?.currentTrancheNumber?.toString(),
455
- currentTranchePriceUsd:
456
- trancheState?.currentTranchePriceUsd?.toString(), // 1e8 USD
457
- },
458
- chainID: this.network.chainId,
459
- };
552
+ return {
553
+ native: {
554
+ amount: BigInt(nativeLamports),
555
+ symbol: 'SOL',
556
+ decimals: 9,
557
+ },
558
+ liq: {
559
+ amount: BigInt(actualAmountStr),
560
+ symbol: 'LiqSOL',
561
+ decimals: LIQSOL_DECIMALS,
562
+ ata: userLiqsolAta,
563
+ },
564
+ claimable: {
565
+ amount: BigInt(claimableLamports.toString()),
566
+ symbol: 'LiqSOL',
567
+ decimals: LIQSOL_DECIMALS,
568
+ ata: userLiqsolAta,
569
+ },
570
+ staked: {
571
+ // liqSOL staked in Outpost via `synd`
572
+ amount: stakedLiqsol,
573
+ symbol: 'LiqSOL',
574
+ decimals: LIQSOL_DECIMALS,
575
+ },
576
+ wire: {
577
+ // Prelaunch WIRE pretokens (1e8 scale)
578
+ amount: BigInt(wirePretokensStr),
579
+ symbol: '$WIRE',
580
+ decimals: 8,
581
+ },
582
+ yield: {
583
+ // Raw primitives so the frontend can display curves, charts, etc.
584
+ currentIndex,
585
+ indexScale: INDEX_SCALE,
586
+ totalShares,
587
+ userShares,
588
+ // liqSOL amounts (lamports) implied by index/shares
589
+ estimatedClaim,
590
+ estimatedYield,
591
+ },
592
+ extras: {
593
+ userLiqsolAta: userLiqsolAta.toBase58(),
594
+ reservePoolPDA: reservePoolPDA.toBase58(),
595
+ vaultPDA: vaultPDA.toBase58(),
596
+ globalIndex: globalState?.currentIndex?.toString(),
597
+ totalShares: globalState?.totalShares?.toString(),
598
+ currentTrancheNumber:
599
+ trancheState?.currentTrancheNumber?.toString(),
600
+ currentTranchePriceUsd:
601
+ trancheState?.currentTranchePriceUsd?.toString(), // 1e8 USD
602
+ },
603
+ chainID: this.network.chainId,
604
+ };
605
+ }
606
+ catch (err) {
607
+ console.log(`Failed to get Solana portfolio: ${err}`);
608
+ throw err;
609
+ }
460
610
  }
461
611
 
462
612
  /**
@@ -468,103 +618,184 @@ export class SolanaStakingClient implements IStakingClient {
468
618
  return this.distributionClient.getUserRecord(this.solPubKey);
469
619
  }
470
620
 
471
-
472
621
  // ---------------------------------------------------------------------
473
- // READ-ONLY Public Methods
622
+ // SquadsX Helpers
474
623
  // ---------------------------------------------------------------------
475
624
 
476
- // Estimated total APY for staking yeild
477
- getSystemAPY(): Promise<number> {
478
- // TODO
479
- return Promise.resolve(0);
625
+ get squadsMultisigPDA(): SolPubKey | undefined {
626
+ if (!this.squadsX) return undefined;
627
+ return new SolPubKey(this.squadsX.multisigPDA);
480
628
  }
481
629
 
482
- // Protocol fee charged for deposit from Native to LIQ
483
- getDepositFee(amount: bigint): Promise<bigint> {
484
- // Returning 1% for now,
485
- // TODO: fetch real fee from on-chain config
486
- return Promise.resolve((amount * BigInt(1)) / BigInt(100));
630
+ get squadsVaultPDA(): SolPubKey | undefined {
631
+ if (!this.squadsX || !this.squadsMultisigPDA) return undefined;
632
+ const multisigPda = this.squadsMultisigPDA;
633
+ const index = this.squadsX.vaultIndex ?? 0;
634
+ const pda = multisig.getVaultPda({ multisigPda, index });
635
+ return pda[0];
487
636
  }
488
637
 
489
- /**
490
- * Unified, chain-agnostic tranche snapshot for Solana.
491
- *
492
- * Uses:
493
- * - liqsol_core.globalState (currentIndex, totalShares, etc.)
494
- * - liqsol_core.trancheState (price, supply, total sold, etc.)
495
- * - PriceHistory/Chainlink SOL/USD via TokenClient.getSolPriceUsdSafe()
496
- *
497
- * This is READ-ONLY and works even with no connected wallet.
498
- */
499
- async getTrancheSnapshot(options?: {
500
- chainID?: ChainID;
501
- windowBefore?: number;
502
- windowAfter?: number;
503
- }): Promise<TrancheSnapshot> {
504
- const {
505
- chainID = SolChainID.WireTestnet,
506
- windowBefore,
507
- windowAfter,
508
- } = options ?? {};
509
-
510
- const [globalState, trancheState] = await Promise.all([
511
- this.tokenClient.fetchGlobalState(),
512
- this.tokenClient.fetchTrancheState(),
513
- ]);
638
+ /** Create a Squads vault transaction/proposal for one or more instructions. */
639
+ private async sendSquadsIxs(ix: TransactionInstruction | TransactionInstruction[]): Promise<string> {
640
+ if (!this.squadsX) throw new Error('Attempting to wrap Squads instruction without SquadsX config');
641
+
642
+ const ixs = Array.isArray(ix) ? ix : [ix];
643
+ const multisigPda = this.squadsMultisigPDA!;
644
+ const vaultPda = this.squadsVaultPDA!;
645
+ const vaultIndex = this.squadsX?.vaultIndex ?? 0;
646
+ const creator = this.solPubKey;
647
+
648
+ const ms = await multisig.accounts.Multisig.fromAccountAddress(this.connection, multisigPda);
649
+ const current = BigInt(ms.transactionIndex?.toString() ?? 0);
650
+ const transactionIndex = current + BigInt(1);
651
+
652
+ const altAddress = this.program.PROGRAM_IDS.ALT;
653
+ const altAccount = await this.connection.getAddressLookupTable(altAddress);
654
+ if (!altAccount.value) throw new Error("ALT not found on-chain or not yet active.");
655
+
656
+ const lookupTable: AddressLookupTableAccount = altAccount.value;
657
+ const computeLimitIx = ComputeBudgetProgram.setComputeUnitLimit({ units: 600_000 });
658
+ const computePriceIx = ComputeBudgetProgram.setComputeUnitPrice({ microLamports: 2000 });
659
+
660
+ const { blockhash } = await this.connection.getLatestBlockhash("confirmed");
661
+ const transactionMessage = new TransactionMessage({
662
+ payerKey: vaultPda,
663
+ recentBlockhash: blockhash,
664
+ instructions: [computeLimitIx, computePriceIx, ...ixs],
665
+ });
514
666
 
515
- const { price: solPriceUsd, timestamp } =
516
- await this.tokenClient.getSolPriceUsdSafe();
517
-
518
- return buildSolanaTrancheSnapshot({
519
- chainID,
520
- globalState,
521
- trancheState,
522
- solPriceUsd,
523
- nativePriceTimestamp: timestamp,
524
- ladderWindowBefore: windowBefore,
525
- ladderWindowAfter: windowAfter,
667
+ const createVaultTxIx = await multisig.instructions.vaultTransactionCreate({
668
+ multisigPda,
669
+ transactionIndex,
670
+ creator,
671
+ vaultIndex,
672
+ transactionMessage,
673
+ ephemeralSigners: 0,
674
+ addressLookupTableAccounts: [lookupTable],
526
675
  });
676
+
677
+ const vaultTransactionCreate = await this.buildAndSendIx(createVaultTxIx)
678
+ console.log('SQUADSX: vaultTransactionCreate', vaultTransactionCreate);
679
+
680
+ const createProposalIx = await multisig.instructions.proposalCreate({
681
+ multisigPda,
682
+ transactionIndex,
683
+ creator,
684
+ });
685
+
686
+ const proposalCreate = await this.buildAndSendIx(createProposalIx)
687
+ console.log('SQUADSX: proposalCreate', proposalCreate);
688
+
689
+ return proposalCreate;
527
690
  }
528
691
 
692
+ // async finish(multisigPda: string, transactionIndex: number): Promise<void> {
693
+ // const vaultExecute = await multisig.instructions.vaultTransactionExecute({
694
+ // connection: this.connection,
695
+ // multisigPda: new SolPubKey(multisigPda),
696
+ // transactionIndex: BigInt(transactionIndex),
697
+ // member: this.solPubKey
698
+ // });
699
+
700
+ // const cuIx = ComputeBudgetProgram.setComputeUnitLimit({ units: 400_000 });
701
+ // const tx1 = new Transaction().add(cuIx, vaultExecute.instruction);
702
+ // const prepared1 = await this.prepareTx(tx1);
703
+ // const signed1 = await this.signTransaction(prepared1.tx);
704
+ // const sent1 = await this.sendAndConfirmHttp(signed1, prepared1);
705
+ // console.log('SENT FINISH', sent1);
706
+ // }
707
+
529
708
  // ---------------------------------------------------------------------
530
709
  // Tx helpers
531
710
  // ---------------------------------------------------------------------
532
711
 
712
+ async buildAndSendIx(ix: TransactionInstruction | TransactionInstruction[]): Promise<string> {
713
+ const ixs = Array.isArray(ix) ? ix : [ix];
714
+ const computeLimitIx = ComputeBudgetProgram.setComputeUnitLimit({ units: 600_000 });
715
+ const computePriceIx = ComputeBudgetProgram.setComputeUnitPrice({ microLamports: 2000 });
716
+ const { blockhash, lastValidBlockHeight } =
717
+ await this.connection.getLatestBlockhash('confirmed');
718
+
719
+ const altAddress = this.program.PROGRAM_IDS.ALT;
720
+ const altAccount = await this.connection.getAddressLookupTable(altAddress);
721
+ const lookupTable = altAccount.value;
722
+
723
+ const instructions = [computeLimitIx, computePriceIx, ...ixs];
724
+
725
+ const tx = lookupTable
726
+ ? new VersionedTransaction(
727
+ new TransactionMessage({
728
+ payerKey: this.feePayer,
729
+ recentBlockhash: blockhash,
730
+ instructions,
731
+ }).compileToV0Message([lookupTable]),
732
+ )
733
+ : new Transaction().add(...instructions);
734
+
735
+ const prepared =
736
+ tx instanceof Transaction
737
+ ? await this.prepareTx(tx)
738
+ : { tx, blockhash, lastValidBlockHeight };
739
+
740
+ const signed = await this.signTransaction(prepared.tx);
741
+
742
+ return this.sendAndConfirmHttp(signed, prepared);
743
+ }
744
+
745
+
533
746
  /**
534
- * Send a signed transaction over HTTP RPC and wait for confirmation.
535
- * Throws if the transaction fails.
747
+ * Send a signed transaction over HTTP RPC.
748
+ *
749
+ * - Returns immediately on successful sendRawTransaction.
750
+ * - If sendRawTransaction throws a SendTransactionError with
751
+ * "already been processed", we treat it as success and
752
+ * just return a derived signature.
753
+ * - No confirmTransaction / polling / blockheight handling.
536
754
  */
537
755
  private async sendAndConfirmHttp(
538
756
  signed: SolanaTransaction,
539
- ctx: { blockhash: string; lastValidBlockHeight: number },
757
+ _ctx: { blockhash: string; lastValidBlockHeight: number },
540
758
  ): Promise<string> {
541
759
  this.ensureUser();
542
760
 
543
- const signature = await this.connection.sendRawTransaction(
544
- signed.serialize(),
545
- {
761
+ const rawTx = signed.serialize();
762
+
763
+ try {
764
+ // Normal happy path: RPC accepts the tx and returns a signature
765
+ const signature = await this.connection.sendRawTransaction(rawTx, {
546
766
  skipPreflight: false,
547
767
  preflightCommitment: commitment,
548
768
  maxRetries: 3,
549
- },
550
- );
769
+ });
770
+ return signature;
771
+ } catch (e: any) {
772
+ const msg = e?.message ?? '';
773
+ const isSendTxError =
774
+ e instanceof SendTransactionError || e?.name === 'SendTransactionError';
775
+
776
+ // Benign duplicate case: tx is already in the ledger / cache
777
+ if (isSendTxError && msg.includes('already been processed')) {
778
+ console.warn(
779
+ 'sendRawTransaction reports "already been processed"; ' +
780
+ 'treating as success without further confirmation.',
781
+ );
551
782
 
552
- const conf = await this.connection.confirmTransaction(
553
- {
554
- signature,
555
- blockhash: ctx.blockhash,
556
- lastValidBlockHeight: ctx.lastValidBlockHeight,
557
- },
558
- commitment,
559
- );
783
+ // Try to derive a signature from the signed Transaction.
784
+ // If SolanaTransaction is a legacy Transaction, this works.
785
+ const legacy = signed as unknown as Transaction;
786
+ const first = legacy.signatures?.[0]?.signature;
560
787
 
561
- if (conf.value.err) {
562
- throw new Error(
563
- `Transaction failed: ${JSON.stringify(conf.value.err)}`,
564
- );
565
- }
788
+ if (first) {
789
+ return bs58.encode(first);
790
+ }
566
791
 
567
- return signature;
792
+ // Fallback: return a dummy string
793
+ return 'already-processed';
794
+ }
795
+
796
+ // Any other send error is a real failure
797
+ throw e;
798
+ }
568
799
  }
569
800
 
570
801
  /**
@@ -602,7 +833,7 @@ export class SolanaStakingClient implements IStakingClient {
602
833
  const { blockhash, lastValidBlockHeight } =
603
834
  await this.connection.getLatestBlockhash('confirmed');
604
835
  tx.recentBlockhash = blockhash;
605
- tx.feePayer = this.solPubKey;
836
+ tx.feePayer = this.feePayer;
606
837
  return { tx, blockhash, lastValidBlockHeight };
607
838
  }
608
839
 
@@ -611,16 +842,414 @@ export class SolanaStakingClient implements IStakingClient {
611
842
  * Ensures we have a Wire pubKey and an Anchor wallet pubKey, and that they match.
612
843
  */
613
844
  ensureUser() {
614
- if (!this.pubKey || !this.anchor.wallet.publicKey) {
615
- throw new Error('User Authorization required: pubKey is undefined');
845
+ if (!this.pubKey) throw new Error('User pubKey is undefined');
846
+
847
+ const wallet = this.anchor?.wallet as any;
848
+ const pk = wallet?.publicKey as SolPubKey | undefined;
849
+
850
+ if (!pk) throw new Error('Wallet not connected');
851
+ if (typeof wallet.signTransaction !== 'function') {
852
+ throw new Error('Wallet does not support signTransaction');
853
+ }
854
+
855
+ // if (!this.pubKey || !this.anchor.wallet.publicKey) {
856
+ // throw new Error('User Authorization required: pubKey is undefined');
857
+ // }
858
+ // if (
859
+ // this.solPubKey.toBase58() !==
860
+ // this.anchor.wallet.publicKey.toBase58()
861
+ // ) {
862
+ // throw new Error(
863
+ // 'Write access requires connected wallet to match pubKey',
864
+ // );
865
+ // }
866
+ }
867
+
868
+ // ---------------------------------------------------------------------
869
+ // READ-ONLY Public Methods
870
+ // ---------------------------------------------------------------------
871
+
872
+ /**
873
+ * Unified, chain-agnostic tranche snapshot for Solana.
874
+ *
875
+ * Uses:
876
+ * - liqsol_core.globalState (currentIndex, totalShares, etc.)
877
+ * - liqsol_core.trancheState (price, supply, total sold, etc.)
878
+ * - PriceHistory/Chainlink SOL/USD via TokenClient.getSolPriceUsdSafe()
879
+ *
880
+ * This is READ-ONLY and works even with no connected wallet.
881
+ */
882
+ async getTrancheSnapshot(chainID: ChainID): Promise<TrancheSnapshot> {
883
+ try {
884
+ const [globalState, trancheState] = await Promise.all([
885
+ this.tokenClient.fetchGlobalState(),
886
+ this.tokenClient.fetchTrancheState(),
887
+ ]);
888
+
889
+ const { price: solPriceUsd, timestamp } =
890
+ await this.tokenClient.getSolPriceUsdSafe();
891
+
892
+ return buildSolanaTrancheSnapshot({
893
+ chainID,
894
+ globalState,
895
+ trancheState,
896
+ solPriceUsd,
897
+ nativePriceTimestamp: timestamp,
898
+ });
899
+ }
900
+ catch (err) {
901
+ console.log(`Failed to build Solana tranche snapshot: ${err}`);
902
+ throw err;
903
+ }
904
+ }
905
+
906
+ /**
907
+ * Returns the system APY (percent) for Solana,
908
+ * using compound interest per epoch and a
909
+ * cluster-derived epochs-per-year.
910
+ */
911
+ async getSystemAPY(): Promise<number> {
912
+ try {
913
+ // 1) Per-epoch rate (decimal) from on-chain stakeMetrics
914
+ const ratePerEpoch = await this.getEpochRateDecimalFromProgram();
915
+ // 2) Live epochs-per-year estimate from cluster
916
+ const epochsPerYear = await this.getEpochsPerYearFromCluster();
917
+ // 3) Compound: (1 + r)^N - 1
918
+ const apyDecimal = Math.pow(1 + ratePerEpoch, epochsPerYear) - 1;
919
+ // 4) Convert to percent
920
+ const apyPercent = apyDecimal * 100;
921
+
922
+ return apyPercent;
923
+ } catch (err) {
924
+ console.log(`Failed to compute Solana system APY: ${err}`);
925
+ throw err;
616
926
  }
927
+ }
928
+
929
+ /**
930
+ * Reads the liqsol_core stakeMetrics account and returns the
931
+ * Solana per-epoch system rate as a **decimal** (not BPS),
932
+ * de-scaled using PAY_RATE_SCALE_FACTOR (1e12).
933
+ */
934
+ private async getEpochRateDecimalFromProgram(): Promise<number> {
935
+ const liqSolCoreProgram = this.program.getProgram('liqsolCore');
936
+ const payRateHistoryPda = this.program.derivePayRateHistoryPda();
937
+
938
+ const payRateHistory =
939
+ await liqSolCoreProgram.account.payRateHistory.fetch(payRateHistoryPda);
940
+
941
+ const totalEntriesAdded = Number(payRateHistory.totalEntriesAdded);
942
+ const maxEntries = Number(payRateHistory.maxEntries);
943
+
944
+ if (totalEntriesAdded === 0) {
945
+ // No real entries yet, fall back to default
946
+ return Number(DEFAULT_AVERAGE_PAY_RATE) / Number(PAY_RATE_SCALE_FACTOR);
947
+ }
948
+
949
+ const currentIndex = Number(payRateHistory.currentIndex);
950
+
951
+ // Only average entries that have actually been processed (written by add_entry),
952
+ // not the default-initialized slots. After 10+ entries, processedCount === maxEntries.
953
+ const processedCount = Math.min(totalEntriesAdded, maxEntries);
954
+
955
+ let sum = BigInt(0);
956
+ let validCount = 0;
957
+ // Walk backward from most recent entry
958
+ let idx = (currentIndex - 1 + maxEntries) % maxEntries;
959
+
960
+ for (let i = 0; i < processedCount; i++) {
961
+ const entry = payRateHistory.entries[idx];
962
+ const scaledRate = BigInt(entry.scaledRate.toString());
963
+ if (scaledRate > BigInt(0)) {
964
+ sum += scaledRate;
965
+ validCount++;
966
+ }
967
+ idx = (idx - 1 + maxEntries) % maxEntries;
968
+ }
969
+
970
+ if (validCount === 0) {
971
+ return Number(DEFAULT_AVERAGE_PAY_RATE) / Number(PAY_RATE_SCALE_FACTOR);
972
+ }
973
+
974
+ // Average the processed entries
975
+ const average = Number(sum / BigInt(validCount));
976
+ return average / Number(PAY_RATE_SCALE_FACTOR);
977
+ }
978
+
979
+ // Simple cache so we don’t hammer RPC
980
+ private epochsPerYearCache?: { value: number; fetchedAt: number };
981
+ private static readonly EPOCHS_PER_YEAR_TTL_MS = 10 * 60 * 1000; // 10 minutes
982
+
983
+ /**
984
+ * Derive "epochs per year" from the live Solana cluster.
985
+ *
986
+ * Uses:
987
+ * - getRecentPerformanceSamples() to estimate slots/second
988
+ * - getEpochInfo() to read slotsInEpoch
989
+ */
990
+ private async getEpochsPerYearFromCluster(): Promise<number> {
991
+ const now = Date.now();
992
+
617
993
  if (
618
- this.solPubKey.toBase58() !==
619
- this.anchor.wallet.publicKey.toBase58()
994
+ this.epochsPerYearCache &&
995
+ now - this.epochsPerYearCache.fetchedAt <
996
+ SolanaStakingClient.EPOCHS_PER_YEAR_TTL_MS
620
997
  ) {
998
+ return this.epochsPerYearCache.value;
999
+ }
1000
+
1001
+ const connection = this.anchor.connection;
1002
+
1003
+ // 1) Estimate slots/second from recent performance samples
1004
+ const samples: PerfSample[] = await connection.getRecentPerformanceSamples(
1005
+ 60,
1006
+ );
1007
+ if (!samples.length) {
1008
+ throw new Error('No performance samples available from cluster');
1009
+ }
1010
+
1011
+ const totalSlots = samples.reduce((acc, s) => acc + s.numSlots, 0);
1012
+ const totalSecs = samples.reduce((acc, s) => acc + s.samplePeriodSecs, 0);
1013
+
1014
+ if (totalSecs === 0) {
621
1015
  throw new Error(
622
- 'Write access requires connected wallet to match pubKey',
1016
+ 'Cluster returned zero samplePeriodSecs in performance samples',
623
1017
  );
624
1018
  }
1019
+
1020
+ const slotsPerSecond = totalSlots / totalSecs;
1021
+
1022
+ // 2) Slots per epoch from cluster
1023
+ const epochInfo = await connection.getEpochInfo(); // finalized commitment by default
1024
+ const slotsPerEpoch = epochInfo.slotsInEpoch;
1025
+
1026
+ const secondsPerEpoch = slotsPerEpoch / slotsPerSecond;
1027
+ const secondsPerYear = 365 * 24 * 60 * 60;
1028
+
1029
+ const epochsPerYear = secondsPerYear / secondsPerEpoch;
1030
+
1031
+ this.epochsPerYearCache = {
1032
+ value: epochsPerYear,
1033
+ fetchedAt: now,
1034
+ };
1035
+
1036
+ return epochsPerYear;
625
1037
  }
626
- }
1038
+
1039
+ // ---------------------------------------------
1040
+ // Deposit fee calculation (SOL -> liqSOL)
1041
+ // ---------------------------------------------
1042
+
1043
+ /**
1044
+ * Estimate the protocol deposit fee in lamports for a given SOL amount,
1045
+ * based on recent pay rates and globalConfig.depositFeeMultiplier.
1046
+ *
1047
+ * - amountLamports: deposit notional in lamports
1048
+ * - windowSize: how many recent payRate entries to average (default 5)
1049
+ *
1050
+ * Returns 0n if payRateHistory or globalConfig is missing, or if
1051
+ * there are no valid pay-rate entries yet.
1052
+ */
1053
+ async getDepositFee(
1054
+ amountLamports: bigint,
1055
+ windowSize = 5,
1056
+ ): Promise<bigint> {
1057
+ if (amountLamports <= BigInt(0)) {
1058
+ return BigInt(0);
1059
+ }
1060
+
1061
+ const [avgPayRate, globalConfig]: [BN, GlobalConfig | null] = await Promise.all([
1062
+ this.distributionClient.getAverageScaledPayRate(windowSize),
1063
+ this.distributionClient.getGlobalConfig(),
1064
+ ]);
1065
+
1066
+ if (!globalConfig || avgPayRate.isZero()) {
1067
+ return BigInt(0);
1068
+ }
1069
+
1070
+ // depositFeeMultiplier may be BN or number depending on your type
1071
+ const rawMultiplier = globalConfig.depositFeeMultiplier;
1072
+ const multiplier = new BN(
1073
+ rawMultiplier?.toString?.() ?? rawMultiplier ?? 0,
1074
+ );
1075
+ if (multiplier.isZero()) {
1076
+ return BigInt(0);
1077
+ }
1078
+
1079
+ const amountBn = new BN(amountLamports.toString());
1080
+
1081
+ // 10^12 scale (matches scaledRate / index scale)
1082
+
1083
+ const feeBn = ceilDiv(
1084
+ avgPayRate.mul(multiplier).mul(amountBn),
1085
+ SCALE,
1086
+ );
1087
+
1088
+ return BigInt(feeBn.toString());
1089
+ }
1090
+
1091
+ /**
1092
+ * Compute a conservative "deposit buffer" in lamports that should be left
1093
+ * in the wallet so that a MAX deposit (balance - buffer) will succeed.
1094
+ *
1095
+ * It accounts for:
1096
+ * - Runtime tx fees (via cached dummy self-transfer fee)
1097
+ * - Protocol deposit fee (via getDepositFee(amount))
1098
+ *
1099
+ * Intended UI usage:
1100
+ * const buffer = await client.getDepositBuffer();
1101
+ * const balance = portfolio.native.amount;
1102
+ * const maxDeposit = balance > buffer ? balance - buffer : BigInt(0);
1103
+ */
1104
+ async getDepositBuffer(options?: {
1105
+ txCount?: number; // how many txs to cover in gas buffer (default 2)
1106
+ safetyMultiplier?: number; // safety multiplier on per-tx fee (default 3x)
1107
+ minBufferLamports?: bigint; // minimum gas buffer (default ~0.01 SOL)
1108
+ balanceOverrideLamports?: bigint; // for tests/custom callers
1109
+ }): Promise<bigint> {
1110
+ this.ensureUser();
1111
+
1112
+ // -------------------------------------------------------------
1113
+ // 1) Current wallet balance (prefer caller override)
1114
+ // -------------------------------------------------------------
1115
+ const balanceLamports: bigint =
1116
+ options?.balanceOverrideLamports ??
1117
+ BigInt(await this.connection.getBalance(this.feePayer, commitment));
1118
+
1119
+ if (balanceLamports <= BigInt(0)) {
1120
+ return BigInt(0);
1121
+ }
1122
+
1123
+ // -------------------------------------------------------------
1124
+ // 2) Estimate gas buffer (using cached single-tx fee)
1125
+ // -------------------------------------------------------------
1126
+ let gasBuffer = BigInt(0);
1127
+
1128
+ try {
1129
+ const singleTxFeeLamports = await this.getSingleTxFeeLamports();
1130
+
1131
+ const txCount = BigInt(options?.txCount ?? 2);
1132
+ const safetyMultiplier = options?.safetyMultiplier ?? 3;
1133
+ const safetyScaled = BigInt(Math.round(safetyMultiplier * 100)); // e.g. 300
1134
+
1135
+ let buf =
1136
+ (singleTxFeeLamports * txCount * safetyScaled) /
1137
+ BigInt(100);
1138
+
1139
+ const defaultMinBufferLamports = BigInt(10_000_000); // ~0.01 SOL
1140
+ const minBufferLamports =
1141
+ options?.minBufferLamports ?? defaultMinBufferLamports;
1142
+
1143
+ if (buf < minBufferLamports) {
1144
+ buf = minBufferLamports;
1145
+ }
1146
+
1147
+ gasBuffer = buf;
1148
+ } catch {
1149
+ // If fee estimation fails, just fall back to "no gas buffer".
1150
+ gasBuffer = BigInt(0);
1151
+ }
1152
+
1153
+ // If gas buffer alone eats the whole balance, we just keep everything.
1154
+ if (balanceLamports <= gasBuffer) {
1155
+ return balanceLamports;
1156
+ }
1157
+
1158
+ const spendable = balanceLamports - gasBuffer;
1159
+
1160
+ // -------------------------------------------------------------
1161
+ // 3) If we can't compute deposit fee, buffer == gasBuffer
1162
+ // -------------------------------------------------------------
1163
+ if (typeof this.getDepositFee !== 'function') {
1164
+ return gasBuffer;
1165
+ }
1166
+
1167
+ // -------------------------------------------------------------
1168
+ // 4) Approximate principal using linear fee model from ONE RPC call
1169
+ //
1170
+ // fee(a) ≈ k * a
1171
+ // want: a + k*a <= spendable → a <= spendable / (1 + k)
1172
+ //
1173
+ // We estimate k from fee(spendable) / spendable.
1174
+ // -------------------------------------------------------------
1175
+ let feeAtSpendable: bigint;
1176
+
1177
+ try {
1178
+ feeAtSpendable = await this.getDepositFee(spendable);
1179
+ } catch {
1180
+ // If protocol fee lookup fails, fall back to gas-only buffer
1181
+ return gasBuffer;
1182
+ }
1183
+
1184
+ // If there is effectively no protocol fee, keep only gas buffer.
1185
+ if (feeAtSpendable <= BigInt(0)) {
1186
+ return gasBuffer;
1187
+ }
1188
+
1189
+ const s = spendable;
1190
+ const f = feeAtSpendable;
1191
+
1192
+ // denom = s + f = s * (1 + k) (since f ≈ k*s)
1193
+ const denom = s + f;
1194
+ if (denom === BigInt(0)) {
1195
+ return gasBuffer;
1196
+ }
1197
+
1198
+ // a ≈ floor( s^2 / (s + f) )
1199
+ let a = (s * s) / denom;
1200
+
1201
+ // Tiny safety haircut to avoid edge off-by-one lamports
1202
+ const fudge = BigInt(10_000); // ≈ 0.00001 SOL
1203
+ let effectivePrincipal =
1204
+ a > fudge ? a - fudge : a;
1205
+
1206
+ if (effectivePrincipal < BigInt(0)) {
1207
+ effectivePrincipal = BigInt(0);
1208
+ }
1209
+
1210
+ const buffer = balanceLamports > effectivePrincipal
1211
+ ? balanceLamports - effectivePrincipal
1212
+ : balanceLamports;
1213
+
1214
+ // Ensure we never under-reserve gas.
1215
+ return buffer < gasBuffer ? gasBuffer : buffer;
1216
+ }
1217
+
1218
+ private cachedTxFee?: { value: bigint; fetchedAt: number };
1219
+ private static readonly FEE_CACHE_TTL_MS = 60_000; // 60s
1220
+
1221
+ private async getSingleTxFeeLamports(): Promise<bigint> {
1222
+ const now = Date.now();
1223
+
1224
+ if (this.cachedTxFee && now - this.cachedTxFee.fetchedAt < SolanaStakingClient.FEE_CACHE_TTL_MS) {
1225
+ return this.cachedTxFee.value;
1226
+ }
1227
+
1228
+ const payer = this.feePayer;
1229
+
1230
+ const dummyIx = SystemProgram.transfer({
1231
+ fromPubkey: payer,
1232
+ toPubkey: payer,
1233
+ lamports: 0,
1234
+ });
1235
+
1236
+ const tx = new Transaction().add(dummyIx);
1237
+ const { blockhash } = await this.connection.getLatestBlockhash(commitment);
1238
+ tx.recentBlockhash = blockhash;
1239
+ tx.feePayer = payer;
1240
+
1241
+ const message = tx.compileMessage();
1242
+ const feeInfo = await this.connection.getFeeForMessage(message, commitment);
1243
+
1244
+ const singleTxFeeLamports = BigInt(feeInfo.value ?? 5000);
1245
+
1246
+ this.cachedTxFee = {
1247
+ value: singleTxFeeLamports,
1248
+ fetchedAt: now,
1249
+ };
1250
+
1251
+ return singleTxFeeLamports;
1252
+ }
1253
+
1254
+
1255
+ }