@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.
- package/README.md +185 -243
- package/lib/stake.browser.js +51760 -10073
- package/lib/stake.browser.js.map +1 -1
- package/lib/stake.d.ts +11856 -882
- package/lib/stake.js +52320 -10531
- package/lib/stake.js.map +1 -1
- package/lib/stake.m.js +51760 -10073
- package/lib/stake.m.js.map +1 -1
- package/package.json +4 -3
- package/src/assets/ethereum/hoodi/common/Base58.sol/Base58.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/common/Base58.sol/Base58.json +164 -0
- package/src/assets/ethereum/hoodi/common/OpenZepArtifacts.sol/__Dummy_OZ_UUPS__.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/common/OpenZepArtifacts.sol/__Dummy_OZ_UUPS__.json +76 -0
- package/src/assets/ethereum/hoodi/common/RestrictedCallers.sol/RestrictedCallers.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/common/RestrictedCallers.sol/RestrictedCallers.json +10 -0
- package/src/assets/ethereum/hoodi/common/iodata.sol/iodata.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/common/iodata.sol/iodata.json +618 -0
- package/src/assets/ethereum/hoodi/common/iodata_util.sol/iodata_util.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/common/iodata_util.sol/iodata_util.json +40 -0
- package/src/assets/ethereum/hoodi/common/sysio_data.sol/sysio_data.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/common/sysio_data.sol/sysio_data.json +10 -0
- package/src/assets/ethereum/hoodi/common/sysio_errors.sol/sysio_errors.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/common/sysio_errors.sol/sysio_errors.json +10 -0
- package/src/assets/ethereum/hoodi/common/sysio_merkle.sol/sysio_merkle.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/common/sysio_merkle.sol/sysio_merkle.json +233 -0
- package/src/assets/ethereum/hoodi/common/sysio_name.sol/sysio_name.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/common/sysio_name.sol/sysio_name.json +49 -0
- package/src/assets/ethereum/hoodi/common/sysio_pubkey.sol/sysio_pubkey.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/common/sysio_pubkey.sol/sysio_pubkey.json +64 -0
- package/src/assets/ethereum/hoodi/common/sysio_read.sol/sysio_read.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/common/sysio_read.sol/sysio_read.json +1458 -0
- package/src/assets/ethereum/hoodi/common/sysio_tester.sol/SysioTester.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/common/sysio_tester.sol/SysioTester.json +1532 -0
- package/src/assets/ethereum/hoodi/common/sysio_verify.sol/sysio_verify.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/common/sysio_verify.sol/sysio_verify.json +1525 -0
- package/src/assets/ethereum/hoodi/common/sysio_write.sol/sysio_write.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/common/sysio_write.sol/sysio_write.json +1076 -0
- package/src/assets/ethereum/hoodi/liqEth/BeaconState.sol/BeaconState.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/liqEth/DepositManager.sol/DepositManagerV2.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/liqEth/DepositManager.sol/DepositManagerV2.json +985 -0
- package/src/assets/ethereum/hoodi/liqEth/LiqEthAuthority.sol/LiqEthAuthority.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/liqEth/LiqEthCommon.sol/IAccounting.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/liqEth/LiqEthCommon.sol/IAccounting.json +182 -0
- package/src/assets/ethereum/hoodi/liqEth/LiqEthCommon.sol/IDepositContract.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/liqEth/LiqEthCommon.sol/IDepositManager.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/liqEth/LiqEthCommon.sol/ILiqEthUpgradeable.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/liqEth/LiqEthCommon.sol/IRewardsERC20.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/liqEth/LiqEthCommon.sol/IRewardsERC20.json +319 -0
- package/src/assets/ethereum/hoodi/liqEth/LiqEthCommon.sol/IRewardsERC20Pausable.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/liqEth/LiqEthCommon.sol/IRewardsERC20Pausable.json +333 -0
- package/src/assets/ethereum/hoodi/liqEth/LiqEthCommon.sol/IStakingModule.dbg.json +4 -0
- package/src/assets/ethereum/{ABI → hoodi}/liqEth/LiqEthCommon.sol/IStakingModule.json +1 -1
- package/src/assets/ethereum/hoodi/liqEth/LiqEthCommon.sol/IValidatorBalanceVerifier.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/liqEth/LiqEthCommon.sol/IWithdrawalRecord.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/liqEth/LiqEthCommon.sol/LiqEthCommon.dbg.json +4 -0
- package/src/assets/ethereum/{ABI → hoodi}/liqEth/LiqEthCommon.sol/LiqEthCommon.json +2 -2
- package/src/assets/ethereum/hoodi/liqEth/LiqEthDeepFreeze.sol/LiqEthDeepFreeze.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/liqEth/LiqEthDeepFreeze.sol/LiqEthDeepFreeze.json +236 -0
- package/src/assets/ethereum/hoodi/liqEth/LiqEthManaged.sol/LiqEthManaged.dbg.json +4 -0
- package/src/assets/ethereum/{ABI → hoodi}/liqEth/LiqEthManaged.sol/LiqEthManaged.json +2 -2
- package/src/assets/ethereum/hoodi/liqEth/RewardsERC20.sol/RewardsERC20UpgradeableV2.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/liqEth/RewardsERC20.sol/RewardsERC20UpgradeableV2.json +957 -0
- package/src/assets/ethereum/hoodi/liqEth/RewardsERC20Pausable.sol/RewardsERC20PausableUpgradeableV2.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/liqEth/RewardsERC20Pausable.sol/RewardsERC20PausableUpgradeableV2.json +1020 -0
- package/src/assets/ethereum/hoodi/liqEth/Yield.sol/YieldOracle.dbg.json +4 -0
- package/src/assets/ethereum/{ABI → hoodi}/liqEth/Yield.sol/YieldOracle.json +2 -2
- package/src/assets/ethereum/hoodi/liqEth/accounting.sol/AccountingV2.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/liqEth/accounting.sol/AccountingV2.json +629 -0
- package/src/assets/ethereum/hoodi/liqEth/liqEth.sol/LiqEthTokenV2.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/liqEth/liqEth.sol/LiqEthTokenV2.json +1323 -0
- package/src/assets/ethereum/hoodi/liqEth/stakingModule.sol/StakingModuleV2.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/liqEth/stakingModule.sol/StakingModuleV2.json +1779 -0
- package/src/assets/ethereum/hoodi/liqEth/v1/DepositManager.sol/DepositManager.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/liqEth/v1/DepositManager.sol/DepositManager.json +978 -0
- package/src/assets/ethereum/hoodi/liqEth/v1/LiqEthCommon.sol/IAccounting.dbg.json +4 -0
- package/src/assets/ethereum/{ABI/liqEth → hoodi/liqEth/v1}/LiqEthCommon.sol/IAccounting.json +1 -1
- package/src/assets/ethereum/hoodi/liqEth/v1/LiqEthCommon.sol/IDepositContract.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/liqEth/v1/LiqEthCommon.sol/IDepositContract.json +39 -0
- package/src/assets/ethereum/hoodi/liqEth/v1/LiqEthCommon.sol/IDepositManager.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/liqEth/v1/LiqEthCommon.sol/IDepositManager.json +64 -0
- package/src/assets/ethereum/hoodi/liqEth/v1/LiqEthCommon.sol/ILiqEthUpgradeable.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/liqEth/v1/LiqEthCommon.sol/ILiqEthUpgradeable.json +29 -0
- package/src/assets/ethereum/hoodi/liqEth/v1/LiqEthCommon.sol/IRewardsERC20.dbg.json +4 -0
- package/src/assets/ethereum/{ABI/liqEth → hoodi/liqEth/v1}/LiqEthCommon.sol/IRewardsERC20.json +1 -1
- package/src/assets/ethereum/hoodi/liqEth/v1/LiqEthCommon.sol/IRewardsERC20Pausable.dbg.json +4 -0
- package/src/assets/ethereum/{ABI/liqEth → hoodi/liqEth/v1}/LiqEthCommon.sol/IRewardsERC20Pausable.json +1 -1
- package/src/assets/ethereum/hoodi/liqEth/v1/LiqEthCommon.sol/IStakingModule.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/liqEth/v1/LiqEthCommon.sol/IStakingModule.json +344 -0
- package/src/assets/ethereum/hoodi/liqEth/v1/LiqEthCommon.sol/IValidatorBalanceVerifier.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/liqEth/v1/LiqEthCommon.sol/IValidatorBalanceVerifier.json +129 -0
- package/src/assets/ethereum/hoodi/liqEth/v1/LiqEthCommon.sol/IWithdrawalRecord.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/liqEth/v1/LiqEthCommon.sol/IWithdrawalRecord.json +66 -0
- package/src/assets/ethereum/hoodi/liqEth/v1/LiqEthCommon.sol/LiqEthCommon.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/liqEth/v1/LiqEthCommon.sol/LiqEthCommon.json +10 -0
- package/src/assets/ethereum/hoodi/liqEth/v1/RewardsERC20.sol/RewardsERC20Upgradeable.dbg.json +4 -0
- package/src/assets/ethereum/{ABI/liqEth → hoodi/liqEth/v1}/RewardsERC20.sol/RewardsERC20Upgradeable.json +1 -1
- package/src/assets/ethereum/hoodi/liqEth/v1/RewardsERC20Pausable.sol/RewardsERC20PausableUpgradeable.dbg.json +4 -0
- package/src/assets/ethereum/{ABI/liqEth → hoodi/liqEth/v1}/RewardsERC20Pausable.sol/RewardsERC20PausableUpgradeable.json +1 -1
- package/src/assets/ethereum/hoodi/liqEth/v1/accounting.sol/Accounting.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/liqEth/v1/accounting.sol/Accounting.json +548 -0
- package/src/assets/ethereum/hoodi/liqEth/v1/liqEth.sol/LiqEthToken.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/liqEth/v1/liqEth.sol/LiqEthToken.json +1233 -0
- package/src/assets/ethereum/hoodi/liqEth/v1/stakingModule.sol/StakingModule.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/liqEth/v1/stakingModule.sol/StakingModule.json +1772 -0
- package/src/assets/ethereum/hoodi/liqEth/withdrawalQueue.sol/WithdrawalQueue.dbg.json +4 -0
- package/src/assets/ethereum/{ABI → hoodi}/liqEth/withdrawalQueue.sol/WithdrawalQueue.json +2 -2
- package/src/assets/ethereum/hoodi/liqEth/withdrawalVault.sol/Uint64BE.dbg.json +4 -0
- package/src/assets/ethereum/{ABI → hoodi}/liqEth/withdrawalVault.sol/Uint64BE.json +2 -2
- package/src/assets/ethereum/hoodi/liqEth/withdrawalVault.sol/WithdrawalVault.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/liqEth/withdrawalVault.sol/WithdrawalVault.json +441 -0
- package/src/assets/ethereum/hoodi/outpost/BAR.sol/BAR.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/BAR.sol/BAR.json +1111 -0
- package/src/assets/ethereum/hoodi/outpost/Depositor.sol/Depositor.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/Depositor.sol/Depositor.json +1696 -0
- package/src/assets/ethereum/hoodi/outpost/EthUsdPriceConsumer.sol/AggregatorV3Interface.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/EthUsdPriceConsumer.sol/EthUsdPriceConsumer.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/EthUsdPriceConsumer.sol/EthUsdPriceConsumer.json +274 -0
- package/src/assets/ethereum/hoodi/outpost/InstaswapBridgeAttestations.sol/BridgeDepositCodec.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/InstaswapBridgeAttestations.sol/BridgeDepositCodec.json +10 -0
- package/src/assets/ethereum/hoodi/outpost/InstaswapBridgeAttestations.sol/BridgeWithdrawCodec.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/InstaswapBridgeAttestations.sol/BridgeWithdrawCodec.json +10 -0
- package/src/assets/ethereum/hoodi/outpost/InstaswapBridgeAttestations.sol/BridgeWithdrawConfirmCodec.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/InstaswapBridgeAttestations.sol/BridgeWithdrawConfirmCodec.json +10 -0
- package/src/assets/ethereum/hoodi/outpost/InstaswapBridgeAttestations.sol/InstaswapBridgeAttestationTypeLib.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/InstaswapBridgeAttestations.sol/InstaswapBridgeAttestationTypeLib.json +10 -0
- package/src/assets/ethereum/hoodi/outpost/LiqEthBridge.sol/LiqEthBridge.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/LiqEthBridge.sol/LiqEthBridge.json +1044 -0
- package/src/assets/ethereum/hoodi/outpost/OPP.sol/OPP.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/OPP.sol/OPP.json +1055 -0
- package/src/assets/ethereum/hoodi/outpost/OPPCommon.sol/IOPP.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/OPPCommon.sol/IOPP.json +81 -0
- package/src/assets/ethereum/hoodi/outpost/OPPCommon.sol/IOPPEndpoint.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/OPPCommon.sol/IOPPInbound.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/OPPCommon.sol/IOPPInbound.json +330 -0
- package/src/assets/ethereum/hoodi/outpost/OPPCommon.sol/IOPPReceiver.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/OPPCommon.sol/IOPPReceiver.json +29 -0
- package/src/assets/ethereum/hoodi/outpost/OPPCommon.sol/IOPPSender.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/OPPCommon.sol/IOPPSender.json +41 -0
- package/src/assets/ethereum/hoodi/outpost/OPPCommon.sol/OPPCommon.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/OPPCommon.sol/OPPCommon.json +287 -0
- package/src/assets/ethereum/hoodi/outpost/OPPEndpoint.sol/OPPEndpoint.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/OPPEndpoint.sol/OPPEndpoint.json +294 -0
- package/src/assets/ethereum/hoodi/outpost/OPPEndpointManaged.sol/OPPEndpointManaged.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/OPPEndpointManaged.sol/OPPEndpointManaged.json +415 -0
- package/src/assets/ethereum/hoodi/outpost/OPPEndpointOwnable.sol/OPPEndpointOwnable.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/OPPEndpointOwnable.sol/OPPEndpointOwnable.json +399 -0
- package/src/assets/ethereum/hoodi/outpost/OPPErrors.sol/OPPErrors.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/OPPErrors.sol/OPPErrors.json +245 -0
- package/src/assets/ethereum/hoodi/outpost/OPPInbound.sol/OPPInbound.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/OPPInbound.sol/OPPInbound.json +1204 -0
- package/src/assets/ethereum/hoodi/outpost/OPPReceiver.sol/OPPReceiver.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/OPPReceiver.sol/OPPReceiver.json +312 -0
- package/src/assets/ethereum/hoodi/outpost/OPPSender.sol/OPPSender.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/OPPSender.sol/OPPSender.json +324 -0
- package/src/assets/ethereum/hoodi/outpost/OperatorRegistry.sol/OperatorRegistry.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/OperatorRegistry.sol/OperatorRegistry.json +1068 -0
- package/src/assets/ethereum/hoodi/outpost/OutpostErrors.sol/OutpostErrors.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/OutpostErrors.sol/OutpostErrors.json +211 -0
- package/src/assets/ethereum/hoodi/outpost/OutpostManaged.sol/OutpostManaged.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/OutpostManaged.sol/OutpostManaged.json +229 -0
- package/src/assets/ethereum/hoodi/outpost/OutpostManager.sol/OutpostManager.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/OutpostManager.sol/OutpostManager.json +751 -0
- package/src/assets/ethereum/hoodi/outpost/OutpostManagerAuthority.sol/OutpostManagerAuthority.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/OutpostManagerAuthority.sol/OutpostManagerAuthority.json +1432 -0
- package/src/assets/ethereum/hoodi/outpost/OutpostManagerCommon.sol/IOutpostManager.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/OutpostManagerCommon.sol/IOutpostManager.json +130 -0
- package/src/assets/ethereum/hoodi/outpost/OutpostManagerCommon.sol/IOutpostUpgradeable.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/OutpostManagerCommon.sol/OutpostManagerCommon.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/OutpostManagerCommon.sol/OutpostManagerCommon.json +141 -0
- package/src/assets/ethereum/hoodi/outpost/OutpostOwnable.sol/OutpostOwnable.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/OutpostOwnable.sol/OutpostOwnable.json +213 -0
- package/src/assets/ethereum/hoodi/outpost/OutpostReserve.sol/OutpostReserve.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/OutpostReserve.sol/OutpostReserve.json +888 -0
- package/src/assets/ethereum/hoodi/outpost/Pool.sol/Pool.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/Pool.sol/Pool.json +659 -0
- package/src/assets/ethereum/hoodi/outpost/Pretoken.sol/Pretoken.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/Pretoken.sol/Pretoken.json +1393 -0
- package/src/assets/ethereum/hoodi/outpost/ReceiptNFT.sol/ReceiptNFT.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/ReceiptNFT.sol/ReceiptNFT.json +1738 -0
- package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/InstaswapConfirmCodec.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/InstaswapConfirmCodec.json +10 -0
- package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/InstaswapFailedCodec.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/InstaswapFailedCodec.json +10 -0
- package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/InstaswapRequestCodec.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/InstaswapRequestCodec.json +10 -0
- package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/InstaswapSettlementCodec.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/InstaswapSettlementCodec.json +10 -0
- package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/PrincipalExitConfirmCodec.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/PrincipalExitConfirmCodec.json +10 -0
- package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/PrincipalExitFailedCodec.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/PrincipalExitFailedCodec.json +10 -0
- package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/PrincipalExitRequestCodec.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/PrincipalExitRequestCodec.json +10 -0
- package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/PrincipalStakeDeltaCodec.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/PrincipalStakeDeltaCodec.json +10 -0
- package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/WireYieldHubAssetCodec.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/WireYieldHubAssetCodec.json +10 -0
- package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/WireYieldHubAttestationTypeLib.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/WireYieldHubAttestationTypeLib.json +10 -0
- package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/WireYieldHubAttestations.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/WireYieldHubAttestations.json +1437 -0
- package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/YieldDepositCodec.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/WireYieldHubAttestations.sol/YieldDepositCodec.json +10 -0
- package/src/assets/ethereum/hoodi/outpost/interfaces/IPretoken.sol/IPretoken.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/interfaces/IWarrant.sol/IWarrant.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/token/ERC721EthEquivalentVotesUpgradeable.sol/ERC721EthEquivalentVotesUpgradeable.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/outpost/token/IERC721EthEquivalent.sol/IERC721EthEquivalent.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/token/ERC1155Token.sol/ERC1155Token.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/token/ERC1155Token.sol/ERC1155Token.json +472 -0
- package/src/assets/ethereum/hoodi/token/ERC20Token.sol/ERC20Token.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/token/ERC20Token.sol/ERC20Token.json +330 -0
- package/src/assets/ethereum/hoodi/token/ERC721Token.sol/ERC721Token.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/token/ERC721Token.sol/ERC721Token.json +449 -0
- package/src/assets/ethereum/hoodi/token/Eman1155.sol/Eman1155.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/token/Eman1155.sol/Eman1155.json +560 -0
- package/src/assets/ethereum/hoodi/token/Eman20.sol/Eman20.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/token/Eman20.sol/Eman20.json +460 -0
- package/src/assets/ethereum/hoodi/token/Eman721.sol/Eman721.dbg.json +4 -0
- package/src/assets/ethereum/hoodi/token/Eman721.sol/Eman721.json +624 -0
- package/src/assets/ethereum/mainnet/common/Base58.sol/Base58.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/common/Base58.sol/Base58.json +164 -0
- package/src/assets/ethereum/mainnet/common/OpenZepArtifacts.sol/__Dummy_OZ_UUPS__.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/common/OpenZepArtifacts.sol/__Dummy_OZ_UUPS__.json +76 -0
- package/src/assets/ethereum/mainnet/common/RestrictedCallers.sol/RestrictedCallers.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/common/RestrictedCallers.sol/RestrictedCallers.json +10 -0
- package/src/assets/ethereum/mainnet/common/iodata.sol/iodata.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/common/iodata.sol/iodata.json +618 -0
- package/src/assets/ethereum/mainnet/common/iodata_util.sol/iodata_util.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/common/iodata_util.sol/iodata_util.json +40 -0
- package/src/assets/ethereum/mainnet/common/sysio_data.sol/sysio_data.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/common/sysio_data.sol/sysio_data.json +10 -0
- package/src/assets/ethereum/mainnet/common/sysio_errors.sol/sysio_errors.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/common/sysio_errors.sol/sysio_errors.json +10 -0
- package/src/assets/ethereum/mainnet/common/sysio_merkle.sol/sysio_merkle.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/common/sysio_merkle.sol/sysio_merkle.json +233 -0
- package/src/assets/ethereum/mainnet/common/sysio_name.sol/sysio_name.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/common/sysio_name.sol/sysio_name.json +49 -0
- package/src/assets/ethereum/mainnet/common/sysio_pubkey.sol/sysio_pubkey.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/common/sysio_pubkey.sol/sysio_pubkey.json +64 -0
- package/src/assets/ethereum/mainnet/common/sysio_read.sol/sysio_read.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/common/sysio_read.sol/sysio_read.json +1458 -0
- package/src/assets/ethereum/mainnet/common/sysio_tester.sol/SysioTester.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/common/sysio_tester.sol/SysioTester.json +1532 -0
- package/src/assets/ethereum/mainnet/common/sysio_verify.sol/sysio_verify.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/common/sysio_verify.sol/sysio_verify.json +1525 -0
- package/src/assets/ethereum/mainnet/common/sysio_write.sol/sysio_write.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/common/sysio_write.sol/sysio_write.json +1076 -0
- package/src/assets/ethereum/mainnet/liqEth/BeaconState.sol/BeaconState.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/BeaconState.sol/BeaconState.json +807 -0
- package/src/assets/ethereum/mainnet/liqEth/DepositManager.sol/DepositManagerV2.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/DepositManager.sol/DepositManagerV2.json +1004 -0
- package/src/assets/ethereum/mainnet/liqEth/DepositManager.sol/IStakingModuleBondLocker.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/DepositManager.sol/IStakingModuleBondLocker.json +29 -0
- package/src/assets/ethereum/mainnet/liqEth/KeyBondManager.sol/KeyBondManager.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/KeyBondManager.sol/KeyBondManager.json +897 -0
- package/src/assets/ethereum/mainnet/liqEth/LiqEthAuthority.sol/LiqEthAuthority.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/LiqEthAuthority.sol/LiqEthAuthority.json +1289 -0
- package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/IDepositContract.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/IDepositContract.json +39 -0
- package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/IDepositManager.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/IDepositManager.json +64 -0
- package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/IKeyBondManager.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/IKeyBondManager.json +189 -0
- package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/ILiqEthUpgradeable.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/ILiqEthUpgradeable.json +29 -0
- package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/IRewardsERC20.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/IRewardsERC20.json +319 -0
- package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/IRewardsERC20Pausable.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/IRewardsERC20Pausable.json +333 -0
- package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/IStakingModule.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/IStakingModule.json +279 -0
- package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/IValidatorBalanceVerifier.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/IValidatorBalanceVerifier.json +129 -0
- package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/IWithdrawalRecord.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/IWithdrawalRecord.json +66 -0
- package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/LiqEthCommon.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/LiqEthCommon.sol/LiqEthCommon.json +10 -0
- package/src/assets/ethereum/mainnet/liqEth/LiqEthDeepFreeze.sol/LiqEthDeepFreeze.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/LiqEthDeepFreeze.sol/LiqEthDeepFreeze.json +236 -0
- package/src/assets/ethereum/mainnet/liqEth/LiqEthManaged.sol/LiqEthManaged.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/LiqEthManaged.sol/LiqEthManaged.json +229 -0
- package/src/assets/ethereum/mainnet/liqEth/RewardsERC20.sol/RewardsERC20UpgradeableV2.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/RewardsERC20.sol/RewardsERC20UpgradeableV2.json +957 -0
- package/src/assets/ethereum/mainnet/liqEth/RewardsERC20Pausable.sol/RewardsERC20PausableUpgradeableV2.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/RewardsERC20Pausable.sol/RewardsERC20PausableUpgradeableV2.json +1020 -0
- package/src/assets/ethereum/mainnet/liqEth/StakingLib.sol/StakingLib.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/StakingLib.sol/StakingLib.json +89 -0
- package/src/assets/ethereum/mainnet/liqEth/Yield.sol/YieldOracle.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/Yield.sol/YieldOracle.json +1376 -0
- package/src/assets/ethereum/mainnet/liqEth/liqEth.sol/LiqEthTokenV2.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/liqEth.sol/LiqEthTokenV2.json +1323 -0
- package/src/assets/ethereum/mainnet/liqEth/stakingModule.sol/StakingModuleV2.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/stakingModule.sol/StakingModuleV2.json +1896 -0
- package/src/assets/ethereum/mainnet/liqEth/v1/DepositManager.sol/DepositManager.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/v1/DepositManager.sol/DepositManager.json +978 -0
- package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/IAccounting.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/IAccounting.json +176 -0
- package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/IDepositContract.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/IDepositContract.json +39 -0
- package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/IDepositManager.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/IDepositManager.json +64 -0
- package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/ILiqEthUpgradeable.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/ILiqEthUpgradeable.json +29 -0
- package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/IRewardsERC20.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/IRewardsERC20.json +249 -0
- package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/IRewardsERC20Pausable.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/IRewardsERC20Pausable.json +263 -0
- package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/IStakingModule.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/IStakingModule.json +344 -0
- package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/IValidatorBalanceVerifier.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/IValidatorBalanceVerifier.json +129 -0
- package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/IWithdrawalRecord.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/IWithdrawalRecord.json +66 -0
- package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/LiqEthCommon.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/v1/LiqEthCommon.sol/LiqEthCommon.json +10 -0
- package/src/assets/ethereum/mainnet/liqEth/v1/RewardsERC20.sol/RewardsERC20Upgradeable.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/v1/RewardsERC20.sol/RewardsERC20Upgradeable.json +874 -0
- package/src/assets/ethereum/mainnet/liqEth/v1/RewardsERC20Pausable.sol/RewardsERC20PausableUpgradeable.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/v1/RewardsERC20Pausable.sol/RewardsERC20PausableUpgradeable.json +937 -0
- package/src/assets/ethereum/mainnet/liqEth/v1/accounting.sol/Accounting.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/v1/accounting.sol/Accounting.json +542 -0
- package/src/assets/ethereum/mainnet/liqEth/v1/liqEth.sol/LiqEthToken.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/v1/liqEth.sol/LiqEthToken.json +1233 -0
- package/src/assets/ethereum/mainnet/liqEth/v1/stakingModule.sol/StakingModule.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/v1/stakingModule.sol/StakingModule.json +1772 -0
- package/src/assets/ethereum/mainnet/liqEth/withdrawalQueue.sol/WithdrawalQueue.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/withdrawalQueue.sol/WithdrawalQueue.json +973 -0
- package/src/assets/ethereum/mainnet/liqEth/withdrawalVault.sol/Uint64BE.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/withdrawalVault.sol/Uint64BE.json +10 -0
- package/src/assets/ethereum/mainnet/liqEth/withdrawalVault.sol/WithdrawalVault.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/liqEth/withdrawalVault.sol/WithdrawalVault.json +441 -0
- package/src/assets/ethereum/mainnet/outpost/BAR.sol/BARV2.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/outpost/BAR.sol/BARV2.json +1915 -0
- package/src/assets/ethereum/mainnet/outpost/Depositor.sol/DepositorV2.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/outpost/Depositor.sol/DepositorV2.json +1845 -0
- package/src/assets/ethereum/mainnet/outpost/EthUsdPriceConsumer.sol/AggregatorV3Interface.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/outpost/EthUsdPriceConsumer.sol/AggregatorV3Interface.json +122 -0
- package/src/assets/ethereum/mainnet/outpost/EthUsdPriceConsumer.sol/EthUsdPriceConsumer.dbg.json +4 -0
- package/src/assets/ethereum/{ABI → mainnet}/outpost/EthUsdPriceConsumer.sol/EthUsdPriceConsumer.json +31 -29
- package/src/assets/ethereum/mainnet/outpost/OPP.sol/OPP.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/outpost/OPPCommon.sol/IOPP.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/outpost/OPPCommon.sol/IOPPEndpoint.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/outpost/OPPCommon.sol/IOPPEndpoint.json +29 -0
- package/src/assets/ethereum/mainnet/outpost/OPPCommon.sol/IOPPInbound.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/outpost/OPPCommon.sol/IOPPReceiver.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/outpost/OPPCommon.sol/IOPPSender.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/outpost/OPPCommon.sol/OPPCommon.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/outpost/OPPEndpoint.sol/OPPEndpoint.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/outpost/OPPEndpointManaged.sol/OPPEndpointManaged.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/outpost/OPPEndpointOwnable.sol/OPPEndpointOwnable.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/outpost/OPPErrors.sol/OPPErrors.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/outpost/OPPInbound.sol/OPPInbound.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/outpost/OPPReceiver.sol/OPPReceiver.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/outpost/OPPSender.sol/OPPSender.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/outpost/OutpostErrors.sol/OutpostErrors.dbg.json +4 -0
- package/src/assets/ethereum/{ABI → mainnet}/outpost/OutpostErrors.sol/OutpostErrors.json +33 -18
- package/src/assets/ethereum/mainnet/outpost/OutpostManaged.sol/OutpostManaged.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/outpost/OutpostManager.sol/OutpostManagerV2.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/outpost/OutpostManager.sol/OutpostManagerV2.json +737 -0
- package/src/assets/ethereum/mainnet/outpost/OutpostManagerAuthority.sol/OutpostManagerAuthority.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/outpost/OutpostManagerCommon.sol/IOutpostManager.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/outpost/OutpostManagerCommon.sol/IOutpostUpgradeable.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/outpost/OutpostManagerCommon.sol/IOutpostUpgradeable.json +29 -0
- package/src/assets/ethereum/mainnet/outpost/OutpostManagerCommon.sol/OutpostManagerCommon.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/outpost/OutpostOwnable.sol/OutpostOwnable.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/outpost/Pool.sol/PoolV2.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/outpost/Pool.sol/PoolV2.json +943 -0
- package/src/assets/ethereum/mainnet/outpost/Pretoken.sol/PretokenV2.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/outpost/Pretoken.sol/PretokenV2.json +1703 -0
- package/src/assets/ethereum/mainnet/outpost/ReceiptNFT.sol/ReceiptNFT.dbg.json +4 -0
- package/src/assets/ethereum/{ABI → mainnet}/outpost/ReceiptNFT.sol/ReceiptNFT.json +33 -18
- package/src/assets/ethereum/mainnet/outpost/interfaces/IPretoken.sol/IPretoken.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/outpost/interfaces/IPretoken.sol/IPretoken.json +29 -0
- package/src/assets/ethereum/mainnet/outpost/interfaces/IWarrant.sol/IWarrant.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/outpost/interfaces/IWarrant.sol/IWarrant.json +29 -0
- package/src/assets/ethereum/mainnet/outpost/token/ERC721EthEquivalentVotesUpgradeable.sol/ERC721EthEquivalentVotesUpgradeable.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/outpost/token/ERC721EthEquivalentVotesUpgradeable.sol/ERC721EthEquivalentVotesUpgradeable.json +858 -0
- package/src/assets/ethereum/mainnet/outpost/token/IERC721EthEquivalent.sol/IERC721EthEquivalent.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/outpost/token/IERC721EthEquivalent.sol/IERC721EthEquivalent.json +30 -0
- package/src/assets/ethereum/mainnet/outpost/v1/BAR.sol/BAR.dbg.json +4 -0
- package/src/assets/ethereum/{ABI/outpost → mainnet/outpost/v1}/BAR.sol/BAR.json +34 -19
- package/src/assets/ethereum/mainnet/outpost/v1/Depositor.sol/Depositor.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/outpost/v1/Depositor.sol/Depositor.json +1653 -0
- package/src/assets/ethereum/mainnet/outpost/v1/OutpostManager.sol/OutpostManager.dbg.json +4 -0
- package/src/assets/ethereum/{ABI/outpost → mainnet/outpost/v1}/OutpostManager.sol/OutpostManager.json +3 -3
- package/src/assets/ethereum/mainnet/outpost/v1/Pool.sol/Pool.dbg.json +4 -0
- package/src/assets/ethereum/{ABI/outpost → mainnet/outpost/v1}/Pool.sol/Pool.json +34 -19
- package/src/assets/ethereum/mainnet/outpost/v1/Pretoken.sol/Pretoken.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/outpost/v1/Pretoken.sol/Pretoken.json +1665 -0
- package/src/assets/ethereum/mainnet/token/ERC1155Token.sol/ERC1155Token.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/token/ERC1155Token.sol/ERC1155Token.json +472 -0
- package/src/assets/ethereum/mainnet/token/ERC20Token.sol/ERC20Token.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/token/ERC20Token.sol/ERC20Token.json +330 -0
- package/src/assets/ethereum/mainnet/token/ERC721Token.sol/ERC721Token.dbg.json +4 -0
- package/src/assets/ethereum/mainnet/token/ERC721Token.sol/ERC721Token.json +449 -0
- package/src/assets/solana/devnet/idl/liqsol_core.json +8566 -0
- package/src/assets/solana/{idl → devnet/idl}/liqsol_token.json +34 -0
- package/src/assets/solana/devnet/idl/transfer_hook.json +490 -0
- package/src/assets/solana/{idl → devnet/idl}/validator_leaderboard.json +15 -0
- package/src/assets/solana/devnet/types/liqsol_core.ts +8572 -0
- package/src/assets/solana/{types → devnet/types}/liqsol_token.ts +34 -0
- package/src/assets/solana/devnet/types/transfer_hook.ts +496 -0
- package/src/assets/solana/{types → devnet/types}/validator_leaderboard.ts +15 -0
- package/src/assets/solana/{idl → mainnet/idl}/liqsol_core.json +632 -433
- package/src/assets/solana/mainnet/idl/liqsol_token.json +217 -0
- package/src/assets/solana/mainnet/idl/transfer_hook.json +479 -0
- package/src/assets/solana/mainnet/idl/validator_leaderboard.json +574 -0
- package/src/assets/solana/{types → mainnet/types}/liqsol_core.ts +632 -433
- package/src/assets/solana/mainnet/types/liqsol_token.ts +223 -0
- package/src/assets/solana/mainnet/types/transfer_hook.ts +485 -0
- package/src/assets/solana/mainnet/types/validator_leaderboard.ts +580 -0
- package/src/assets/solana/realdevnet/idl/liqsol_core.json +7112 -0
- package/src/assets/solana/realdevnet/idl/liqsol_token.json +217 -0
- package/src/assets/solana/realdevnet/idl/transfer_hook.json +479 -0
- package/src/assets/solana/realdevnet/idl/validator_leaderboard.json +735 -0
- package/src/assets/solana/realdevnet/types/liqsol_core.ts +7118 -0
- package/src/assets/solana/realdevnet/types/liqsol_token.ts +223 -0
- package/src/assets/solana/realdevnet/types/transfer_hook.ts +485 -0
- package/src/assets/solana/realdevnet/types/validator_leaderboard.ts +741 -0
- package/src/index.ts +2 -2
- package/src/networks/ethereum/clients/convert.client.ts +32 -3
- package/src/networks/ethereum/clients/opp.client.ts +20 -21
- package/src/networks/ethereum/clients/pretoken.client.ts +8 -9
- package/src/networks/ethereum/clients/receipt.client.ts +93 -23
- package/src/networks/ethereum/clients/stake.client.ts +86 -14
- package/src/networks/ethereum/clients/validator.client.ts +61 -0
- package/src/networks/ethereum/contract.ts +425 -153
- package/src/networks/ethereum/ethereum.ts +370 -202
- package/src/networks/ethereum/types.ts +65 -28
- package/src/networks/ethereum/utils.ts +104 -72
- package/src/networks/solana/clients/convert.client.ts +341 -0
- package/src/networks/solana/clients/distribution.client.ts +245 -20
- package/src/networks/solana/clients/leaderboard.client.ts +10 -13
- package/src/networks/solana/clients/outpost.client.ts +93 -55
- package/src/networks/solana/clients/token.client.ts +20 -15
- package/src/networks/solana/constants.ts +55 -287
- package/src/networks/solana/program.ts +446 -28
- package/src/networks/solana/solana.ts +917 -288
- package/src/networks/solana/types.ts +173 -24
- package/src/networks/solana/utils.ts +125 -339
- package/src/staker.ts +25 -4
- package/src/types.ts +102 -22
- package/src/assets/ethereum/ABI/liqEth/BeaconState.sol/BeaconState.dbg.json +0 -4
- package/src/assets/ethereum/ABI/liqEth/DepositManager.sol/DepositManager.dbg.json +0 -4
- package/src/assets/ethereum/ABI/liqEth/DepositManager.sol/DepositManager.json +0 -952
- package/src/assets/ethereum/ABI/liqEth/LiqEthAuthority.sol/LiqEthAuthority.dbg.json +0 -4
- package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IAccounting.dbg.json +0 -4
- package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IDepositContract.dbg.json +0 -4
- package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IDepositManager.dbg.json +0 -4
- package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/ILiqEthUpgradeable.dbg.json +0 -4
- package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IRewardsERC20.dbg.json +0 -4
- package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IRewardsERC20Pausable.dbg.json +0 -4
- package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IStakingModule.dbg.json +0 -4
- package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IValidatorBalanceVerifier.dbg.json +0 -4
- package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/IWithdrawalRecord.dbg.json +0 -4
- package/src/assets/ethereum/ABI/liqEth/LiqEthCommon.sol/LiqEthCommon.dbg.json +0 -4
- package/src/assets/ethereum/ABI/liqEth/LiqEthManaged.sol/LiqEthManaged.dbg.json +0 -4
- package/src/assets/ethereum/ABI/liqEth/RewardsERC20.sol/RewardsERC20Upgradeable.dbg.json +0 -4
- package/src/assets/ethereum/ABI/liqEth/RewardsERC20Pausable.sol/RewardsERC20PausableUpgradeable.dbg.json +0 -4
- package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/BeaconRoots.dbg.json +0 -4
- package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/BeaconRoots.json +0 -10
- package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/SSZ.dbg.json +0 -4
- package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/SSZ.json +0 -10
- package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/SSZExtras.dbg.json +0 -4
- package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/SSZExtras.json +0 -10
- package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/SSZVec48.dbg.json +0 -4
- package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/SSZVec48.json +0 -10
- package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/ValidatorBalanceVerifier.dbg.json +0 -4
- package/src/assets/ethereum/ABI/liqEth/ValidatorBalanceVerifier.sol/ValidatorBalanceVerifier.json +0 -291
- package/src/assets/ethereum/ABI/liqEth/Yield.sol/YieldOracle.dbg.json +0 -4
- package/src/assets/ethereum/ABI/liqEth/accounting.sol/Accounting.dbg.json +0 -4
- package/src/assets/ethereum/ABI/liqEth/accounting.sol/Accounting.json +0 -555
- package/src/assets/ethereum/ABI/liqEth/liqEth.sol/LiqEthToken.dbg.json +0 -4
- package/src/assets/ethereum/ABI/liqEth/liqEth.sol/LiqEthToken.json +0 -1202
- package/src/assets/ethereum/ABI/liqEth/stakingModule.sol/StakingModule.dbg.json +0 -4
- package/src/assets/ethereum/ABI/liqEth/stakingModule.sol/StakingModule.json +0 -1791
- package/src/assets/ethereum/ABI/liqEth/withdrawalQueue.sol/WithdrawalQueue.dbg.json +0 -4
- package/src/assets/ethereum/ABI/liqEth/withdrawalVault.sol/Uint64BE.dbg.json +0 -4
- package/src/assets/ethereum/ABI/liqEth/withdrawalVault.sol/WithdrawalVault.dbg.json +0 -4
- package/src/assets/ethereum/ABI/liqEth/withdrawalVault.sol/WithdrawalVault.json +0 -460
- package/src/assets/ethereum/ABI/outpost/Aggregator.sol/Aggregator.json +0 -82
- package/src/assets/ethereum/ABI/outpost/BAR.sol/BAR.dbg.json +0 -4
- package/src/assets/ethereum/ABI/outpost/Depositor.sol/Depositor.dbg.json +0 -4
- package/src/assets/ethereum/ABI/outpost/Depositor.sol/Depositor.json +0 -1638
- package/src/assets/ethereum/ABI/outpost/EthUsdPriceConsumer.sol/AggregatorV3Interface.dbg.json +0 -4
- package/src/assets/ethereum/ABI/outpost/EthUsdPriceConsumer.sol/EthUsdPriceConsumer.dbg.json +0 -4
- package/src/assets/ethereum/ABI/outpost/OPP.sol/OPP.dbg.json +0 -4
- package/src/assets/ethereum/ABI/outpost/OPPCommon.sol/IOPP.dbg.json +0 -4
- package/src/assets/ethereum/ABI/outpost/OPPCommon.sol/IOPPEndpoint.dbg.json +0 -4
- package/src/assets/ethereum/ABI/outpost/OPPCommon.sol/IOPPInbound.dbg.json +0 -4
- package/src/assets/ethereum/ABI/outpost/OPPCommon.sol/IOPPReceiver.dbg.json +0 -4
- package/src/assets/ethereum/ABI/outpost/OPPCommon.sol/IOPPSender.dbg.json +0 -4
- package/src/assets/ethereum/ABI/outpost/OPPCommon.sol/OPPCommon.dbg.json +0 -4
- package/src/assets/ethereum/ABI/outpost/OPPEndpoint.sol/OPPEndpoint.dbg.json +0 -4
- package/src/assets/ethereum/ABI/outpost/OPPEndpointManaged.sol/OPPEndpointManaged.dbg.json +0 -4
- package/src/assets/ethereum/ABI/outpost/OPPEndpointOwnable.sol/OPPEndpointOwnable.dbg.json +0 -4
- package/src/assets/ethereum/ABI/outpost/OPPErrors.sol/OPPErrors.dbg.json +0 -4
- package/src/assets/ethereum/ABI/outpost/OPPInbound.sol/OPPInbound.dbg.json +0 -4
- package/src/assets/ethereum/ABI/outpost/OPPReceiver.sol/OPPReceiver.dbg.json +0 -4
- package/src/assets/ethereum/ABI/outpost/OPPSender.sol/OPPSender.dbg.json +0 -4
- package/src/assets/ethereum/ABI/outpost/OutpostErrors.sol/OutpostErrors.dbg.json +0 -4
- package/src/assets/ethereum/ABI/outpost/OutpostManaged.sol/OutpostManaged.dbg.json +0 -4
- package/src/assets/ethereum/ABI/outpost/OutpostManager.sol/OutpostManager.dbg.json +0 -4
- package/src/assets/ethereum/ABI/outpost/OutpostManagerAuthority.sol/OutpostManagerAuthority.dbg.json +0 -4
- package/src/assets/ethereum/ABI/outpost/OutpostManagerCommon.sol/IOutpostManager.dbg.json +0 -4
- package/src/assets/ethereum/ABI/outpost/OutpostManagerCommon.sol/IOutpostUpgradeable.dbg.json +0 -4
- package/src/assets/ethereum/ABI/outpost/OutpostManagerCommon.sol/OutpostManagerCommon.dbg.json +0 -4
- package/src/assets/ethereum/ABI/outpost/OutpostOwnable.sol/OutpostOwnable.dbg.json +0 -4
- package/src/assets/ethereum/ABI/outpost/Pool.sol/Pool.dbg.json +0 -4
- package/src/assets/ethereum/ABI/outpost/Pretoken.sol/Pretoken.dbg.json +0 -4
- package/src/assets/ethereum/ABI/outpost/Pretoken.sol/Pretoken.json +0 -1650
- package/src/assets/ethereum/ABI/outpost/ReceiptNFT.sol/ReceiptNFT.dbg.json +0 -4
- package/src/assets/ethereum/ABI/outpost/interfaces/IPretoken.sol/IPretoken.dbg.json +0 -4
- package/src/assets/ethereum/ABI/outpost/interfaces/IWarrant.sol/IWarrant.dbg.json +0 -4
- package/src/assets/ethereum/ABI/outpost/token/ERC721EthEquivalentVotesUpgradeable.sol/ERC721EthEquivalentVotesUpgradeable.dbg.json +0 -4
- package/src/assets/ethereum/ABI/outpost/token/IERC721EthEquivalent.sol/IERC721EthEquivalent.dbg.json +0 -4
- package/src/assets/ethereum/ABI/token/ERC1155Token.sol/ERC1155Token.dbg.json +0 -4
- package/src/assets/ethereum/ABI/token/ERC1155Token.sol/ERC1155Token.json +0 -472
- package/src/assets/ethereum/ABI/token/ERC20Token.sol/ERC20Token.dbg.json +0 -4
- package/src/assets/ethereum/ABI/token/ERC20Token.sol/ERC20Token.json +0 -330
- package/src/assets/ethereum/ABI/token/ERC721Token.sol/ERC721Token.dbg.json +0 -4
- package/src/assets/ethereum/ABI/token/ERC721Token.sol/ERC721Token.json +0 -449
- package/src/assets/solana/idl/transfer_hook.json +0 -197
- package/src/assets/solana/types/transfer_hook.ts +0 -203
- package/src/networks/solana/clients/deposit.client.ts +0 -274
- package/src/staker/types.ts +0 -62
- /package/src/assets/ethereum/{ABI → hoodi}/liqEth/BeaconState.sol/BeaconState.json +0 -0
- /package/src/assets/ethereum/{ABI → hoodi}/liqEth/LiqEthAuthority.sol/LiqEthAuthority.json +0 -0
- /package/src/assets/ethereum/{ABI → hoodi}/liqEth/LiqEthCommon.sol/IDepositContract.json +0 -0
- /package/src/assets/ethereum/{ABI → hoodi}/liqEth/LiqEthCommon.sol/IDepositManager.json +0 -0
- /package/src/assets/ethereum/{ABI → hoodi}/liqEth/LiqEthCommon.sol/ILiqEthUpgradeable.json +0 -0
- /package/src/assets/ethereum/{ABI → hoodi}/liqEth/LiqEthCommon.sol/IValidatorBalanceVerifier.json +0 -0
- /package/src/assets/ethereum/{ABI → hoodi}/liqEth/LiqEthCommon.sol/IWithdrawalRecord.json +0 -0
- /package/src/assets/ethereum/{ABI → hoodi}/outpost/EthUsdPriceConsumer.sol/AggregatorV3Interface.json +0 -0
- /package/src/assets/ethereum/{ABI → hoodi}/outpost/OPPCommon.sol/IOPPEndpoint.json +0 -0
- /package/src/assets/ethereum/{ABI → hoodi}/outpost/OutpostManagerCommon.sol/IOutpostUpgradeable.json +0 -0
- /package/src/assets/ethereum/{ABI → hoodi}/outpost/interfaces/IPretoken.sol/IPretoken.json +0 -0
- /package/src/assets/ethereum/{ABI → hoodi}/outpost/interfaces/IWarrant.sol/IWarrant.json +0 -0
- /package/src/assets/ethereum/{ABI → hoodi}/outpost/token/ERC721EthEquivalentVotesUpgradeable.sol/ERC721EthEquivalentVotesUpgradeable.json +0 -0
- /package/src/assets/ethereum/{ABI → hoodi}/outpost/token/IERC721EthEquivalent.sol/IERC721EthEquivalent.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/OPP.sol/OPP.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/OPPCommon.sol/IOPP.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/OPPCommon.sol/IOPPInbound.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/OPPCommon.sol/IOPPReceiver.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/OPPCommon.sol/IOPPSender.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/OPPCommon.sol/OPPCommon.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/OPPEndpoint.sol/OPPEndpoint.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/OPPEndpointManaged.sol/OPPEndpointManaged.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/OPPEndpointOwnable.sol/OPPEndpointOwnable.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/OPPErrors.sol/OPPErrors.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/OPPInbound.sol/OPPInbound.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/OPPReceiver.sol/OPPReceiver.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/OPPSender.sol/OPPSender.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/OutpostManaged.sol/OutpostManaged.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/OutpostManagerAuthority.sol/OutpostManagerAuthority.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/OutpostManagerCommon.sol/IOutpostManager.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/OutpostManagerCommon.sol/OutpostManagerCommon.json +0 -0
- /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 {
|
|
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
|
-
|
|
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
|
|
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.
|
|
181
|
-
|
|
182
|
-
this.
|
|
183
|
-
this.
|
|
184
|
-
this.
|
|
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
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
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
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
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
|
-
*
|
|
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
|
|
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
|
-
|
|
244
|
-
|
|
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
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
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
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
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
|
-
|
|
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
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
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
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
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
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
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
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
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
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
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
|
-
//
|
|
622
|
+
// SquadsX Helpers
|
|
474
623
|
// ---------------------------------------------------------------------
|
|
475
624
|
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
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
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
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
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
const
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
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
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
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
|
|
535
|
-
*
|
|
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
|
-
|
|
757
|
+
_ctx: { blockhash: string; lastValidBlockHeight: number },
|
|
540
758
|
): Promise<string> {
|
|
541
759
|
this.ensureUser();
|
|
542
760
|
|
|
543
|
-
const
|
|
544
|
-
|
|
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
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
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
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
);
|
|
565
|
-
}
|
|
788
|
+
if (first) {
|
|
789
|
+
return bs58.encode(first);
|
|
790
|
+
}
|
|
566
791
|
|
|
567
|
-
|
|
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.
|
|
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
|
|
615
|
-
|
|
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.
|
|
619
|
-
this.
|
|
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
|
-
'
|
|
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
|
+
}
|