@wireio/stake 1.1.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/stake.browser.js +12942 -6703
- package/lib/stake.browser.js.map +1 -1
- package/lib/stake.d.ts +7627 -646
- package/lib/stake.js +13315 -7071
- package/lib/stake.js.map +1 -1
- package/lib/stake.m.js +12942 -6703
- package/lib/stake.m.js.map +1 -1
- package/package.json +4 -3
- package/src/assets/solana/mainnet/idl/liqsol_core.json +6166 -0
- package/src/assets/solana/mainnet/idl/liqsol_token.json +183 -0
- package/src/assets/solana/mainnet/idl/transfer_hook.json +197 -0
- package/src/assets/solana/mainnet/idl/validator_leaderboard.json +574 -0
- package/src/assets/solana/mainnet/types/liqsol_core.ts +6172 -0
- package/src/assets/solana/mainnet/types/liqsol_token.ts +189 -0
- package/src/assets/solana/mainnet/types/transfer_hook.ts +203 -0
- package/src/assets/solana/mainnet/types/validator_leaderboard.ts +580 -0
- package/src/networks/ethereum/clients/convert.client.ts +30 -1
- package/src/networks/ethereum/clients/receipt.client.ts +81 -3
- package/src/networks/ethereum/clients/stake.client.ts +1 -0
- package/src/networks/ethereum/contract.ts +260 -222
- package/src/networks/ethereum/ethereum.ts +36 -28
- package/src/networks/ethereum/types.ts +17 -2
- package/src/networks/solana/clients/deposit.client.ts +294 -65
- package/src/networks/solana/clients/distribution.client.ts +13 -18
- package/src/networks/solana/clients/leaderboard.client.ts +9 -11
- package/src/networks/solana/clients/outpost.client.ts +11 -10
- package/src/networks/solana/clients/token.client.ts +11 -13
- package/src/networks/solana/constants.ts +44 -285
- package/src/networks/solana/program.ts +365 -26
- package/src/networks/solana/solana.ts +213 -69
- package/src/networks/solana/types.ts +4 -4
- package/src/networks/solana/utils.ts +16 -301
- package/src/staker.ts +10 -2
- package/src/types.ts +19 -6
- /package/src/assets/ethereum/{ABI → mainnet}/common/Base58.sol/Base58.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/common/Base58.sol/Base58.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/common/OpenZepArtifacts.sol/__Dummy_OZ_UUPS__.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/common/OpenZepArtifacts.sol/__Dummy_OZ_UUPS__.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/common/RestrictedCallers.sol/RestrictedCallers.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/common/RestrictedCallers.sol/RestrictedCallers.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/common/iodata.sol/iodata.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/common/iodata.sol/iodata.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/common/iodata_util.sol/iodata_util.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/common/iodata_util.sol/iodata_util.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/common/sysio_data.sol/sysio_data.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/common/sysio_data.sol/sysio_data.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/common/sysio_errors.sol/sysio_errors.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/common/sysio_errors.sol/sysio_errors.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/common/sysio_merkle.sol/sysio_merkle.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/common/sysio_merkle.sol/sysio_merkle.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/common/sysio_name.sol/sysio_name.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/common/sysio_name.sol/sysio_name.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/common/sysio_pubkey.sol/sysio_pubkey.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/common/sysio_pubkey.sol/sysio_pubkey.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/common/sysio_read.sol/sysio_read.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/common/sysio_read.sol/sysio_read.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/common/sysio_tester.sol/SysioTester.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/common/sysio_tester.sol/SysioTester.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/common/sysio_verify.sol/sysio_verify.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/common/sysio_verify.sol/sysio_verify.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/common/sysio_write.sol/sysio_write.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/common/sysio_write.sol/sysio_write.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/BeaconState.sol/BeaconState.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/BeaconState.sol/BeaconState.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/DepositManager.sol/DepositManager.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/DepositManager.sol/DepositManager.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/LiqEthAuthority.sol/LiqEthAuthority.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/LiqEthAuthority.sol/LiqEthAuthority.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/LiqEthCommon.sol/IAccounting.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/LiqEthCommon.sol/IAccounting.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/LiqEthCommon.sol/IDepositContract.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/LiqEthCommon.sol/IDepositContract.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/LiqEthCommon.sol/IDepositManager.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/LiqEthCommon.sol/IDepositManager.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/LiqEthCommon.sol/ILiqEthUpgradeable.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/LiqEthCommon.sol/ILiqEthUpgradeable.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/LiqEthCommon.sol/IRewardsERC20.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/LiqEthCommon.sol/IRewardsERC20.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/LiqEthCommon.sol/IRewardsERC20Pausable.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/LiqEthCommon.sol/IRewardsERC20Pausable.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/LiqEthCommon.sol/IStakingModule.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/LiqEthCommon.sol/IStakingModule.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/LiqEthCommon.sol/IValidatorBalanceVerifier.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/LiqEthCommon.sol/IValidatorBalanceVerifier.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/LiqEthCommon.sol/IWithdrawalRecord.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/LiqEthCommon.sol/IWithdrawalRecord.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/LiqEthCommon.sol/LiqEthCommon.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/LiqEthCommon.sol/LiqEthCommon.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/LiqEthManaged.sol/LiqEthManaged.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/LiqEthManaged.sol/LiqEthManaged.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/RewardsERC20.sol/RewardsERC20Upgradeable.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/RewardsERC20.sol/RewardsERC20Upgradeable.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/RewardsERC20Pausable.sol/RewardsERC20PausableUpgradeable.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/RewardsERC20Pausable.sol/RewardsERC20PausableUpgradeable.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/Yield.sol/YieldOracle.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/Yield.sol/YieldOracle.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/accounting.sol/Accounting.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/accounting.sol/Accounting.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/liqEth.sol/LiqEthToken.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/liqEth.sol/LiqEthToken.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/stakingModule.sol/StakingModule.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/stakingModule.sol/StakingModule.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/withdrawalQueue.sol/WithdrawalQueue.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/withdrawalQueue.sol/WithdrawalQueue.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/withdrawalVault.sol/Uint64BE.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/withdrawalVault.sol/Uint64BE.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/withdrawalVault.sol/WithdrawalVault.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/liqEth/withdrawalVault.sol/WithdrawalVault.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/Aggregator.sol/Aggregator.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/BAR.sol/BAR.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/BAR.sol/BAR.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/Depositor.sol/Depositor.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/Depositor.sol/Depositor.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/EthUsdPriceConsumer.sol/AggregatorV3Interface.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/EthUsdPriceConsumer.sol/AggregatorV3Interface.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/EthUsdPriceConsumer.sol/EthUsdPriceConsumer.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/EthUsdPriceConsumer.sol/EthUsdPriceConsumer.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/OPP.sol/OPP.dbg.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.dbg.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/IOPPEndpoint.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/OPPCommon.sol/IOPPEndpoint.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/OPPCommon.sol/IOPPInbound.dbg.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.dbg.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.dbg.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.dbg.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.dbg.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.dbg.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.dbg.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.dbg.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.dbg.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.dbg.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.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/OPPSender.sol/OPPSender.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/OutpostErrors.sol/OutpostErrors.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/OutpostErrors.sol/OutpostErrors.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/OutpostManaged.sol/OutpostManaged.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/OutpostManaged.sol/OutpostManaged.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/OutpostManager.sol/OutpostManager.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/OutpostManager.sol/OutpostManager.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/OutpostManagerAuthority.sol/OutpostManagerAuthority.dbg.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.dbg.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/IOutpostUpgradeable.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/OutpostManagerCommon.sol/IOutpostUpgradeable.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/OutpostManagerCommon.sol/OutpostManagerCommon.dbg.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.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/OutpostOwnable.sol/OutpostOwnable.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/Pool.sol/Pool.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/Pool.sol/Pool.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/Pretoken.sol/Pretoken.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/Pretoken.sol/Pretoken.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/ReceiptNFT.sol/ReceiptNFT.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/ReceiptNFT.sol/ReceiptNFT.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/interfaces/IPretoken.sol/IPretoken.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/interfaces/IPretoken.sol/IPretoken.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/interfaces/IWarrant.sol/IWarrant.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/interfaces/IWarrant.sol/IWarrant.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/token/ERC721EthEquivalentVotesUpgradeable.sol/ERC721EthEquivalentVotesUpgradeable.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/token/ERC721EthEquivalentVotesUpgradeable.sol/ERC721EthEquivalentVotesUpgradeable.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/token/IERC721EthEquivalent.sol/IERC721EthEquivalent.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/outpost/token/IERC721EthEquivalent.sol/IERC721EthEquivalent.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/token/ERC1155Token.sol/ERC1155Token.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/token/ERC1155Token.sol/ERC1155Token.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/token/ERC20Token.sol/ERC20Token.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/token/ERC20Token.sol/ERC20Token.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/token/ERC721Token.sol/ERC721Token.dbg.json +0 -0
- /package/src/assets/ethereum/{ABI → mainnet}/token/ERC721Token.sol/ERC721Token.json +0 -0
- /package/src/assets/solana/{idl → devnet/idl}/liqsol_core.json +0 -0
- /package/src/assets/solana/{idl → devnet/idl}/liqsol_token.json +0 -0
- /package/src/assets/solana/{idl → devnet/idl}/transfer_hook.json +0 -0
- /package/src/assets/solana/{idl → devnet/idl}/validator_leaderboard.json +0 -0
- /package/src/assets/solana/{types → devnet/types}/liqsol_core.ts +0 -0
- /package/src/assets/solana/{types → devnet/types}/liqsol_token.ts +0 -0
- /package/src/assets/solana/{types → devnet/types}/transfer_hook.ts +0 -0
- /package/src/assets/solana/{types → devnet/types}/validator_leaderboard.ts +0 -0
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
TrancheSnapshot
|
|
9
9
|
} from '../../types';
|
|
10
10
|
import { EthereumContractService } from './contract';
|
|
11
|
-
import { preLaunchReceipt } from './types';
|
|
11
|
+
import { preLaunchReceipt, WithdrawReceipt } from './types';
|
|
12
12
|
import { buildEthereumTrancheSnapshot } from './utils';
|
|
13
13
|
import { ConvertClient } from './clients/convert.client';
|
|
14
14
|
import { StakeClient } from './clients/stake.client';
|
|
@@ -48,6 +48,7 @@ export class EthereumStakingClient implements IStakingClient {
|
|
|
48
48
|
this.contractService = new EthereumContractService({
|
|
49
49
|
provider: this.provider,
|
|
50
50
|
signer: this.signer,
|
|
51
|
+
chainId: config.network.chainId as EvmChainID,
|
|
51
52
|
});
|
|
52
53
|
|
|
53
54
|
this.convertClient = new ConvertClient(this.contractService);
|
|
@@ -98,6 +99,31 @@ export class EthereumStakingClient implements IStakingClient {
|
|
|
98
99
|
return result.txHash;
|
|
99
100
|
}
|
|
100
101
|
|
|
102
|
+
/**
|
|
103
|
+
* Withdraw native ETH from the liqETH protocol via the liqeth safeBurn function, which burns the LiqETH and adds the user to the withdrawal queue.
|
|
104
|
+
* @param amount Amount in wei (or something convertible to BigNumber).
|
|
105
|
+
* @returns transaction hash
|
|
106
|
+
*/
|
|
107
|
+
async loadPendingWithdraws(): Promise<WithdrawReceipt[]> {
|
|
108
|
+
this.ensureUser();
|
|
109
|
+
const address = await this.signer!.getAddress();
|
|
110
|
+
|
|
111
|
+
return await this.receiptClient.fetchWithdrawReceipts(address);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Withdraw native ETH from the liqETH protocol via the liqeth safeBurn function, which burns the LiqETH and adds the user to the withdrawal queue.
|
|
116
|
+
* @param tokenId The ID of the withdrawal request NFT
|
|
117
|
+
* @returns transaction hash
|
|
118
|
+
*/
|
|
119
|
+
async claimWithdraw(tokenId: bigint): Promise<string> {
|
|
120
|
+
this.ensureUser();
|
|
121
|
+
|
|
122
|
+
const tokenIdBigNum = BigNumber.from(tokenId)
|
|
123
|
+
const result = await this.convertClient.claimWithdraw(tokenIdBigNum)
|
|
124
|
+
return result.txHash;
|
|
125
|
+
}
|
|
126
|
+
|
|
101
127
|
|
|
102
128
|
/**
|
|
103
129
|
* Stake liqETH via DepositManager.
|
|
@@ -213,17 +239,14 @@ export class EthereumStakingClient implements IStakingClient {
|
|
|
213
239
|
// sharesToTokens(userShares, currentIndex) = userShares * currentIndex / indexScale
|
|
214
240
|
let estimatedClaim = BigInt(0);
|
|
215
241
|
let estimatedYield = BigInt(0);
|
|
242
|
+
|
|
243
|
+
if (userShares > BigInt(0) && currentIndex > BigInt(0)) {
|
|
244
|
+
estimatedClaim = (userShares * currentIndex) / indexScale;
|
|
245
|
+
if (estimatedClaim > stakeBalanceBN.toBigInt()) {
|
|
246
|
+
estimatedYield = estimatedClaim - stakeBalanceBN.toBigInt();
|
|
247
|
+
}
|
|
248
|
+
}
|
|
216
249
|
|
|
217
|
-
// started work on estimating the user's personal APY - not necessary at the moment
|
|
218
|
-
// let estimatedAPY: number | null = null;
|
|
219
|
-
// if (userShares > BigInt(0) && currentIndex > BigInt(0)) {
|
|
220
|
-
// estimatedClaim = (userShares * currentIndex) / indexScale;
|
|
221
|
-
// if (estimatedClaim > stakeBalanceBN.toBigInt()) {
|
|
222
|
-
// estimatedYield = estimatedClaim - stakeBalanceBN.toBigInt();
|
|
223
|
-
// }
|
|
224
|
-
|
|
225
|
-
// estimatedAPY = null;
|
|
226
|
-
// }
|
|
227
250
|
|
|
228
251
|
const portfolio: Portfolio = {
|
|
229
252
|
native: {
|
|
@@ -342,24 +365,14 @@ export class EthereumStakingClient implements IStakingClient {
|
|
|
342
365
|
*
|
|
343
366
|
* SUPPORTS READ-ONLY ACcESS
|
|
344
367
|
*/
|
|
345
|
-
async getTrancheSnapshot(
|
|
346
|
-
chainID?: ChainID;
|
|
347
|
-
windowBefore?: number;
|
|
348
|
-
windowAfter?: number;
|
|
349
|
-
}): Promise<TrancheSnapshot> {
|
|
350
|
-
const {
|
|
351
|
-
chainID = EvmChainID.Ethereum,
|
|
352
|
-
windowBefore,
|
|
353
|
-
windowAfter,
|
|
354
|
-
} = options ?? {};
|
|
368
|
+
async getTrancheSnapshot(chainID: ChainID): Promise<TrancheSnapshot> {
|
|
355
369
|
|
|
370
|
+
console.log('getTrancheSnapshot', chainID);
|
|
356
371
|
|
|
357
372
|
try {
|
|
358
|
-
|
|
359
373
|
const blockNumber = await this.provider.getBlockNumber();
|
|
360
374
|
const blockTag = { blockTag: blockNumber };
|
|
361
375
|
|
|
362
|
-
|
|
363
376
|
// Fetch all required contract data
|
|
364
377
|
const [totalSharesBn, indexBn, trancheNumberBn, trancheSupplyBn, tranchePriceUsdBn, totalSupplyBn, supplyGrowthBps, priceGrowthCents, minPriceUsd, maxPriceUsd] = await Promise.all([
|
|
365
378
|
this.contract.Depositor.totalShares(blockTag),
|
|
@@ -377,7 +390,6 @@ export class EthereumStakingClient implements IStakingClient {
|
|
|
377
390
|
const totalTrancheSupply = BigInt(totalSupplyBn.toString()) / BigInt(1e10);
|
|
378
391
|
const currentTrancheSupply = BigInt(trancheSupplyBn.toString()) / BigInt(1e10);
|
|
379
392
|
|
|
380
|
-
|
|
381
393
|
// fetch price and timestamp from aggregator
|
|
382
394
|
// const [roundId, answer, startedAt, updatedAt, answeredInRound] = await this.contract.MockAggregator.latestRoundData();
|
|
383
395
|
//originally fetched ethPrice from aggregator - pulling from EthUsdPriceConsumer instead - this is where the actual price gets pulled from when purchasing pretokens.
|
|
@@ -403,11 +415,7 @@ export class EthereumStakingClient implements IStakingClient {
|
|
|
403
415
|
priceGrowthCents,
|
|
404
416
|
minPriceUsd,
|
|
405
417
|
maxPriceUsd,
|
|
406
|
-
|
|
407
418
|
ethPriceUsd,
|
|
408
|
-
// nativePriceTimestamp,
|
|
409
|
-
ladderWindowBefore: windowBefore,
|
|
410
|
-
ladderWindowAfter: windowAfter,
|
|
411
419
|
});
|
|
412
420
|
}
|
|
413
421
|
catch (err: any) {
|
|
@@ -11,7 +11,7 @@ export const CONTRACT_NAMES = [
|
|
|
11
11
|
"DepositManager",
|
|
12
12
|
"WithdrawalVault",
|
|
13
13
|
"StakingModule",
|
|
14
|
-
"YieldOracle",
|
|
14
|
+
// "YieldOracle",
|
|
15
15
|
|
|
16
16
|
//Outpost contracts
|
|
17
17
|
"OutpostManagerAuthority",
|
|
@@ -29,7 +29,7 @@ export const CONTRACT_NAMES = [
|
|
|
29
29
|
"Pretoken",
|
|
30
30
|
"OPPInbound",
|
|
31
31
|
"Depositor",
|
|
32
|
-
|
|
32
|
+
"MockAggregator",
|
|
33
33
|
] as const;
|
|
34
34
|
|
|
35
35
|
export type ContractName = typeof CONTRACT_NAMES[number];
|
|
@@ -110,4 +110,19 @@ export interface preLaunchReceipt {
|
|
|
110
110
|
shares: BalanceView,
|
|
111
111
|
timestamp: string,
|
|
112
112
|
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export interface ClaimedEvent {
|
|
116
|
+
user: string;
|
|
117
|
+
amount: BigNumber;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
export interface WithdrawReceipt {
|
|
122
|
+
tokenId: bigint;
|
|
123
|
+
receipt: {
|
|
124
|
+
ethAmount: BigNumber;
|
|
125
|
+
ethBalance: BalanceView;
|
|
126
|
+
readyAt: number;
|
|
127
|
+
}
|
|
113
128
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AnchorProvider, BN, Program } from '@coral-xyz/anchor';
|
|
1
|
+
import { AnchorProvider, BN, Program, Wallet } from '@coral-xyz/anchor';
|
|
2
2
|
import {
|
|
3
3
|
SystemProgram,
|
|
4
4
|
Transaction,
|
|
@@ -8,52 +8,41 @@ import {
|
|
|
8
8
|
SYSVAR_CLOCK_PUBKEY,
|
|
9
9
|
SYSVAR_RENT_PUBKEY,
|
|
10
10
|
SYSVAR_STAKE_HISTORY_PUBKEY,
|
|
11
|
+
Connection,
|
|
12
|
+
PublicKey,
|
|
13
|
+
TransactionMessage,
|
|
14
|
+
LAMPORTS_PER_SOL,
|
|
15
|
+
Signer,
|
|
11
16
|
} from '@solana/web3.js';
|
|
17
|
+
|
|
12
18
|
import {
|
|
13
19
|
TOKEN_2022_PROGRAM_ID,
|
|
14
20
|
ASSOCIATED_TOKEN_PROGRAM_ID,
|
|
15
21
|
getAssociatedTokenAddressSync,
|
|
16
22
|
} from '@solana/spl-token';
|
|
23
|
+
import * as multisig from "@sqds/multisig";
|
|
17
24
|
|
|
18
25
|
import { SolanaProgramService } from '../program';
|
|
19
|
-
import type { LiqsolCore } from '../../../assets/solana/types/liqsol_core';
|
|
26
|
+
import type { LiqsolCore } from '../../../assets/solana/devnet/types/liqsol_core';
|
|
20
27
|
|
|
21
|
-
import {
|
|
22
|
-
PROGRAM_IDS,
|
|
23
|
-
deriveDepositAuthorityPda,
|
|
24
|
-
deriveLiqsolMintPda,
|
|
25
|
-
deriveLiqsolMintAuthorityPda,
|
|
26
|
-
deriveReservePoolPda,
|
|
27
|
-
deriveVaultPda,
|
|
28
|
-
deriveStakeControllerStatePda,
|
|
29
|
-
derivePayoutStatePda,
|
|
30
|
-
deriveBucketAuthorityPda,
|
|
31
|
-
derivePayRateHistoryPda,
|
|
32
|
-
deriveDistributionStatePda,
|
|
33
|
-
deriveUserRecordPda,
|
|
34
|
-
deriveEphemeralStakeAddress,
|
|
35
|
-
deriveWithdrawGlobalPda,
|
|
36
|
-
deriveStakeAllocationStatePda,
|
|
37
|
-
deriveStakeMetricsPda,
|
|
38
|
-
deriveMaintenanceLedgerPda,
|
|
39
|
-
deriveWithdrawMintAuthorityPda,
|
|
40
|
-
deriveWithdrawMintMetadataPda,
|
|
41
|
-
deriveWithdrawNftMintPda,
|
|
42
|
-
deriveLiqReceiptDataPda,
|
|
43
|
-
deriveGlobalConfigPda,
|
|
44
|
-
} from '../constants';
|
|
45
28
|
import { GlobalAccount, WalletLike } from '../types';
|
|
46
29
|
|
|
47
30
|
export class DepositClient {
|
|
48
31
|
private program: Program<LiqsolCore>;
|
|
49
32
|
|
|
33
|
+
get connection() {
|
|
34
|
+
return this.provider.connection;
|
|
35
|
+
}
|
|
36
|
+
|
|
50
37
|
get wallet(): WalletLike {
|
|
51
38
|
return this.provider.wallet;
|
|
52
39
|
}
|
|
53
40
|
|
|
54
|
-
constructor(
|
|
55
|
-
|
|
56
|
-
|
|
41
|
+
constructor(
|
|
42
|
+
private readonly provider: AnchorProvider,
|
|
43
|
+
private readonly pgs: SolanaProgramService
|
|
44
|
+
) {
|
|
45
|
+
this.program = pgs.getProgram('liqsolCore');
|
|
57
46
|
}
|
|
58
47
|
|
|
59
48
|
/**
|
|
@@ -63,7 +52,7 @@ export class DepositClient {
|
|
|
63
52
|
async buildDepositTx(
|
|
64
53
|
amount: bigint,
|
|
65
54
|
user = this.wallet.publicKey,
|
|
66
|
-
): Promise<
|
|
55
|
+
): Promise<TransactionInstruction> {
|
|
67
56
|
if (!user) {
|
|
68
57
|
throw new Error(
|
|
69
58
|
'DepositClient.buildDepositTx: wallet not connected',
|
|
@@ -78,16 +67,16 @@ export class DepositClient {
|
|
|
78
67
|
// -------------------------------------------------------------
|
|
79
68
|
// PDAs
|
|
80
69
|
// -------------------------------------------------------------
|
|
81
|
-
const depositAuthority = deriveDepositAuthorityPda();
|
|
82
|
-
const liqsolMint = deriveLiqsolMintPda();
|
|
83
|
-
const liqsolMintAuthority = deriveLiqsolMintAuthorityPda();
|
|
84
|
-
const reservePool = deriveReservePoolPda();
|
|
85
|
-
const vault = deriveVaultPda();
|
|
86
|
-
const controllerState = deriveStakeControllerStatePda();
|
|
87
|
-
const payoutState = derivePayoutStatePda();
|
|
88
|
-
const bucketAuthority = deriveBucketAuthorityPda();
|
|
89
|
-
const payRateHistory = derivePayRateHistoryPda();
|
|
90
|
-
const globalConfig = deriveGlobalConfigPda();
|
|
70
|
+
const depositAuthority = this.pgs.deriveDepositAuthorityPda();
|
|
71
|
+
const liqsolMint = this.pgs.deriveLiqsolMintPda();
|
|
72
|
+
const liqsolMintAuthority = this.pgs.deriveLiqsolMintAuthorityPda();
|
|
73
|
+
const reservePool = this.pgs.deriveReservePoolPda();
|
|
74
|
+
const vault = this.pgs.deriveVaultPda();
|
|
75
|
+
const controllerState = this.pgs.deriveStakeControllerStatePda();
|
|
76
|
+
const payoutState = this.pgs.derivePayoutStatePda();
|
|
77
|
+
const bucketAuthority = this.pgs.deriveBucketAuthorityPda();
|
|
78
|
+
const payRateHistory = this.pgs.derivePayRateHistoryPda();
|
|
79
|
+
const globalConfig = this.pgs.deriveGlobalConfigPda();
|
|
91
80
|
|
|
92
81
|
// -------------------------------------------------------------
|
|
93
82
|
// Token-2022 ATAs
|
|
@@ -95,15 +84,15 @@ export class DepositClient {
|
|
|
95
84
|
const userAta = getAssociatedTokenAddressSync(
|
|
96
85
|
liqsolMint,
|
|
97
86
|
user,
|
|
98
|
-
|
|
87
|
+
true,
|
|
99
88
|
TOKEN_2022_PROGRAM_ID,
|
|
100
89
|
);
|
|
101
90
|
|
|
102
91
|
// -------------------------------------------------------------
|
|
103
92
|
// Distribution state + user_record (KEYED BY TOKEN ACCOUNT)
|
|
104
93
|
// -------------------------------------------------------------
|
|
105
|
-
const distributionState = deriveDistributionStatePda();
|
|
106
|
-
const userRecord = deriveUserRecordPda(userAta);
|
|
94
|
+
const distributionState = this.pgs.deriveDistributionStatePda();
|
|
95
|
+
const userRecord = this.pgs.deriveUserRecordPda(userAta);
|
|
107
96
|
|
|
108
97
|
const bucketTokenAccount = getAssociatedTokenAddressSync(
|
|
109
98
|
liqsolMint,
|
|
@@ -116,12 +105,12 @@ export class DepositClient {
|
|
|
116
105
|
// Ephemeral stake
|
|
117
106
|
// -------------------------------------------------------------
|
|
118
107
|
const seed = Math.floor(Math.random() * 2 ** 32);
|
|
119
|
-
const ephemeralStake = await deriveEphemeralStakeAddress(user, seed);
|
|
108
|
+
const ephemeralStake = await this.pgs.deriveEphemeralStakeAddress(user, seed);
|
|
120
109
|
|
|
121
110
|
// -------------------------------------------------------------
|
|
122
111
|
// BUILD IX (MUST MATCH IDL)
|
|
123
112
|
// -------------------------------------------------------------
|
|
124
|
-
|
|
113
|
+
return await this.program.methods
|
|
125
114
|
.deposit(new BN(amount.toString()), seed)
|
|
126
115
|
.accounts({
|
|
127
116
|
user,
|
|
@@ -129,7 +118,7 @@ export class DepositClient {
|
|
|
129
118
|
systemProgram: SystemProgram.programId,
|
|
130
119
|
tokenProgram: TOKEN_2022_PROGRAM_ID,
|
|
131
120
|
associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,
|
|
132
|
-
liqsolProgram: PROGRAM_IDS.LIQSOL_TOKEN,
|
|
121
|
+
liqsolProgram: this.pgs.PROGRAM_IDS.LIQSOL_TOKEN,
|
|
133
122
|
stakeProgram: StakeProgram.programId,
|
|
134
123
|
liqsolMint,
|
|
135
124
|
userAta,
|
|
@@ -151,10 +140,130 @@ export class DepositClient {
|
|
|
151
140
|
globalConfig
|
|
152
141
|
})
|
|
153
142
|
.instruction();
|
|
143
|
+
}
|
|
154
144
|
|
|
155
|
-
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
async buildSquadsDepositProposalTx(params: {
|
|
148
|
+
connection: Connection;
|
|
149
|
+
multisigPda: PublicKey;
|
|
150
|
+
amountLamports: bigint;
|
|
151
|
+
wallet: WalletLikeSigner; // your WalletLikeSigner type
|
|
152
|
+
vaultIndex?: number;
|
|
153
|
+
}): Promise<{
|
|
154
|
+
tx: Transaction;
|
|
155
|
+
transactionIndex: bigint;
|
|
156
|
+
vaultPda: PublicKey;
|
|
157
|
+
}> {
|
|
158
|
+
const { connection, multisigPda, amountLamports, wallet } = params;
|
|
159
|
+
const vaultIndex = params.vaultIndex ?? 0;
|
|
160
|
+
|
|
161
|
+
if (!wallet?.publicKey) throw new Error("wallet.publicKey missing");
|
|
162
|
+
if (!amountLamports || amountLamports <= BigInt(0)) throw new Error("amountLamports must be > 0");
|
|
163
|
+
|
|
164
|
+
// 1) vault PDA
|
|
165
|
+
const [vaultPda] = multisig.getVaultPda({ multisigPda, index: vaultIndex });
|
|
166
|
+
|
|
167
|
+
// 2) build deposit ix where `user` = vaultPda (off-curve OK)
|
|
168
|
+
const depositBuilt = await this.buildDepositIxForUser(amountLamports, vaultPda);
|
|
169
|
+
|
|
170
|
+
// 3) compute next transactionIndex (best-effort; see note below)
|
|
171
|
+
const ms = await multisig.accounts.Multisig.fromAccountAddress(connection, multisigPda);
|
|
172
|
+
const current = BigInt((ms as any).transactionIndex?.toString?.() ?? 0);
|
|
173
|
+
const transactionIndex = current + BigInt(1);
|
|
174
|
+
|
|
175
|
+
// 4) inner message uses vault as payer
|
|
176
|
+
const { blockhash } = await connection.getLatestBlockhash("confirmed");
|
|
177
|
+
const message = new TransactionMessage({
|
|
178
|
+
payerKey: vaultPda,
|
|
179
|
+
recentBlockhash: blockhash,
|
|
180
|
+
instructions: [depositBuilt.ix],
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
// 5) squads instructions (no rpc.*)
|
|
184
|
+
const createVaultTxIx = await multisig.instructions.vaultTransactionCreate({
|
|
185
|
+
multisigPda,
|
|
186
|
+
transactionIndex,
|
|
187
|
+
creator: wallet.publicKey,
|
|
188
|
+
vaultIndex,
|
|
189
|
+
ephemeralSigners: 0,
|
|
190
|
+
transactionMessage: message,
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
// const createProposalIx = await multisig.instructions.proposalCreate({
|
|
194
|
+
// multisigPda,
|
|
195
|
+
// transactionIndex,
|
|
196
|
+
// creator: wallet.publicKey,
|
|
197
|
+
// });
|
|
198
|
+
// console.log('createVaultTxIx', createVaultTxIx);
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
// 6) return a normal Transaction for your pipeline
|
|
202
|
+
const tx = new Transaction().add(createVaultTxIx);
|
|
203
|
+
|
|
204
|
+
return { tx, transactionIndex, vaultPda };
|
|
156
205
|
}
|
|
157
206
|
|
|
207
|
+
async buildSquadsDepositProposalTx2(params: {
|
|
208
|
+
connection: Connection;
|
|
209
|
+
multisigPda: PublicKey;
|
|
210
|
+
amountLamports: bigint;
|
|
211
|
+
wallet: WalletLikeSigner; // your WalletLikeSigner type
|
|
212
|
+
vaultIndex?: number;
|
|
213
|
+
}): Promise<{
|
|
214
|
+
tx: Transaction;
|
|
215
|
+
transactionIndex: bigint;
|
|
216
|
+
vaultPda: PublicKey;
|
|
217
|
+
}> {
|
|
218
|
+
const { connection, multisigPda, amountLamports, wallet } = params;
|
|
219
|
+
const vaultIndex = params.vaultIndex ?? 0;
|
|
220
|
+
|
|
221
|
+
if (!wallet?.publicKey) throw new Error("wallet.publicKey missing");
|
|
222
|
+
if (!amountLamports || amountLamports <= BigInt(0)) throw new Error("amountLamports must be > 0");
|
|
223
|
+
|
|
224
|
+
// 1) vault PDA
|
|
225
|
+
const [vaultPda] = multisig.getVaultPda({ multisigPda, index: vaultIndex });
|
|
226
|
+
|
|
227
|
+
// 2) build deposit ix where `user` = vaultPda (off-curve OK)
|
|
228
|
+
const depositBuilt = await this.buildDepositIxForUser(amountLamports, vaultPda);
|
|
229
|
+
|
|
230
|
+
// 3) compute next transactionIndex (best-effort; see note below)
|
|
231
|
+
const ms = await multisig.accounts.Multisig.fromAccountAddress(connection, multisigPda);
|
|
232
|
+
const current = BigInt(ms.transactionIndex?.toString?.() ?? 0);
|
|
233
|
+
const transactionIndex = current + BigInt(1);
|
|
234
|
+
|
|
235
|
+
// 4) inner message uses vault as payer
|
|
236
|
+
const { blockhash } = await connection.getLatestBlockhash("confirmed");
|
|
237
|
+
const message = new TransactionMessage({
|
|
238
|
+
payerKey: vaultPda,
|
|
239
|
+
recentBlockhash: blockhash,
|
|
240
|
+
instructions: [depositBuilt.ix],
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
// 5) squads instructions (no rpc.*)
|
|
244
|
+
// const createVaultTxIx = await multisig.instructions.vaultTransactionCreate({
|
|
245
|
+
// multisigPda,
|
|
246
|
+
// transactionIndex,
|
|
247
|
+
// creator: wallet.publicKey,
|
|
248
|
+
// vaultIndex,
|
|
249
|
+
// ephemeralSigners: 0,
|
|
250
|
+
// transactionMessage: message,
|
|
251
|
+
// });
|
|
252
|
+
|
|
253
|
+
const createProposalIx = await multisig.instructions.proposalCreate({
|
|
254
|
+
multisigPda,
|
|
255
|
+
transactionIndex,
|
|
256
|
+
creator: wallet.publicKey,
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
// 6) return a normal Transaction for your pipeline
|
|
260
|
+
const tx = new Transaction().add(createProposalIx);
|
|
261
|
+
|
|
262
|
+
return { tx, transactionIndex, vaultPda };
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
|
|
158
267
|
/**
|
|
159
268
|
* Build a withdraw-request transaction:
|
|
160
269
|
* liqSOL -> SOL via liqsol_core::requestWithdraw.
|
|
@@ -182,33 +291,33 @@ export class DepositClient {
|
|
|
182
291
|
// -------------------------------------------------------------
|
|
183
292
|
// Core program + liqSOL mint / user ATA
|
|
184
293
|
// -------------------------------------------------------------
|
|
185
|
-
const liqsolMint = deriveLiqsolMintPda();
|
|
294
|
+
const liqsolMint = this.pgs.deriveLiqsolMintPda();
|
|
186
295
|
|
|
187
296
|
const userAta = getAssociatedTokenAddressSync(
|
|
188
297
|
liqsolMint,
|
|
189
298
|
user,
|
|
190
|
-
|
|
299
|
+
true,
|
|
191
300
|
TOKEN_2022_PROGRAM_ID,
|
|
192
301
|
);
|
|
193
302
|
|
|
194
303
|
// Distribution / balance-tracking
|
|
195
304
|
// user_record is keyed by the user’s liqSOL ATA (same convention
|
|
196
305
|
// as deposit/purchase).
|
|
197
|
-
const userRecord = deriveUserRecordPda(userAta);
|
|
198
|
-
const distributionState = deriveDistributionStatePda();
|
|
306
|
+
const userRecord = this.pgs.deriveUserRecordPda(userAta);
|
|
307
|
+
const distributionState = this.pgs.deriveDistributionStatePda();
|
|
199
308
|
|
|
200
309
|
// Reserve + stake controller PDAs
|
|
201
|
-
const global = deriveWithdrawGlobalPda(); // withdraw operator state
|
|
202
|
-
const reservePool = deriveReservePoolPda();
|
|
203
|
-
const stakeAllocationState = deriveStakeAllocationStatePda();
|
|
204
|
-
const stakeMetrics = deriveStakeMetricsPda();
|
|
205
|
-
const maintenanceLedger = deriveMaintenanceLedgerPda();
|
|
206
|
-
const globalConfig = deriveGlobalConfigPda(); // liqSOL config / roles
|
|
310
|
+
const global = this.pgs.deriveWithdrawGlobalPda(); // withdraw operator state
|
|
311
|
+
const reservePool = this.pgs.deriveReservePoolPda();
|
|
312
|
+
const stakeAllocationState = this.pgs.deriveStakeAllocationStatePda();
|
|
313
|
+
const stakeMetrics = this.pgs.deriveStakeMetricsPda();
|
|
314
|
+
const maintenanceLedger = this.pgs.deriveMaintenanceLedgerPda();
|
|
315
|
+
const globalConfig = this.pgs.deriveGlobalConfigPda(); // liqSOL config / roles
|
|
207
316
|
|
|
208
317
|
// -------------------------------------------------------------
|
|
209
318
|
// Need nextReceiptId from withdraw global state
|
|
210
319
|
// -------------------------------------------------------------
|
|
211
|
-
const globalAcct
|
|
320
|
+
const globalAcct: GlobalAccount = await this.program.account.global.fetch(global);
|
|
212
321
|
|
|
213
322
|
const rawId = globalAcct.nextReceiptId;
|
|
214
323
|
let receiptId: bigint;
|
|
@@ -231,22 +340,22 @@ export class DepositClient {
|
|
|
231
340
|
// -------------------------------------------------------------
|
|
232
341
|
// NFT receipt PDAs (mint, metadata, data, ATA)
|
|
233
342
|
// -------------------------------------------------------------
|
|
234
|
-
const mintAuthority = deriveWithdrawMintAuthorityPda();
|
|
235
|
-
const metadata = deriveWithdrawMintMetadataPda();
|
|
343
|
+
const mintAuthority = this.pgs.deriveWithdrawMintAuthorityPda();
|
|
344
|
+
const metadata = this.pgs.deriveWithdrawMintMetadataPda();
|
|
236
345
|
|
|
237
|
-
const nftMint = deriveWithdrawNftMintPda(receiptId);
|
|
238
|
-
const receiptData = deriveLiqReceiptDataPda(nftMint);
|
|
346
|
+
const nftMint = this.pgs.deriveWithdrawNftMintPda(receiptId);
|
|
347
|
+
const receiptData = this.pgs.deriveLiqReceiptDataPda(nftMint);
|
|
239
348
|
|
|
240
349
|
const owner = user;
|
|
241
350
|
const nftAta = getAssociatedTokenAddressSync(
|
|
242
351
|
nftMint,
|
|
243
352
|
owner,
|
|
244
|
-
|
|
353
|
+
true,
|
|
245
354
|
TOKEN_2022_PROGRAM_ID,
|
|
246
355
|
);
|
|
247
356
|
|
|
248
357
|
// Bucket token account (same bucket used by deposit/distribution)
|
|
249
|
-
const bucketAuthority = deriveBucketAuthorityPda();
|
|
358
|
+
const bucketAuthority = this.pgs.deriveBucketAuthorityPda();
|
|
250
359
|
const bucketTokenAccount = getAssociatedTokenAddressSync(
|
|
251
360
|
liqsolMint,
|
|
252
361
|
bucketAuthority,
|
|
@@ -289,4 +398,124 @@ export class DepositClient {
|
|
|
289
398
|
|
|
290
399
|
return new Transaction().add(ix);
|
|
291
400
|
}
|
|
292
|
-
|
|
401
|
+
|
|
402
|
+
|
|
403
|
+
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
/**
|
|
407
|
+
* Internal helper: build the liqsol_core::deposit instruction for a specific `user`.
|
|
408
|
+
* This is the exact same account wiring as buildDepositTx(), but returns the IX
|
|
409
|
+
* plus useful this.pgs.derived addresses/seed for Squads flows.
|
|
410
|
+
*/
|
|
411
|
+
private async buildDepositIxForUser(
|
|
412
|
+
amount: bigint,
|
|
413
|
+
user: PublicKey,
|
|
414
|
+
): Promise<{
|
|
415
|
+
ix: TransactionInstruction;
|
|
416
|
+
seed: number;
|
|
417
|
+
userAta: PublicKey;
|
|
418
|
+
ephemeralStake: PublicKey;
|
|
419
|
+
}> {
|
|
420
|
+
if (!user) {
|
|
421
|
+
throw new Error("buildDepositIxForUser: user is required");
|
|
422
|
+
}
|
|
423
|
+
if (!amount || amount <= BigInt(0)) {
|
|
424
|
+
throw new Error("buildDepositIxForUser: amount must be > 0");
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
// -------------------------------------------------------------
|
|
428
|
+
// PDAs
|
|
429
|
+
// -------------------------------------------------------------
|
|
430
|
+
const depositAuthority = this.pgs.deriveDepositAuthorityPda();
|
|
431
|
+
const liqsolMint = this.pgs.deriveLiqsolMintPda();
|
|
432
|
+
const liqsolMintAuthority = this.pgs.deriveLiqsolMintAuthorityPda();
|
|
433
|
+
const reservePool = this.pgs.deriveReservePoolPda();
|
|
434
|
+
const vault = this.pgs.deriveVaultPda();
|
|
435
|
+
const controllerState = this.pgs.deriveStakeControllerStatePda();
|
|
436
|
+
const payoutState = this.pgs.derivePayoutStatePda();
|
|
437
|
+
const bucketAuthority = this.pgs.deriveBucketAuthorityPda();
|
|
438
|
+
const payRateHistory = this.pgs.derivePayRateHistoryPda();
|
|
439
|
+
const globalConfig = this.pgs.deriveGlobalConfigPda();
|
|
440
|
+
|
|
441
|
+
// -------------------------------------------------------------
|
|
442
|
+
// Token-2022 ATAs
|
|
443
|
+
// -------------------------------------------------------------
|
|
444
|
+
const userAta = getAssociatedTokenAddressSync(
|
|
445
|
+
liqsolMint,
|
|
446
|
+
user,
|
|
447
|
+
true,
|
|
448
|
+
TOKEN_2022_PROGRAM_ID,
|
|
449
|
+
);
|
|
450
|
+
|
|
451
|
+
// -------------------------------------------------------------
|
|
452
|
+
// Distribution state + user_record (KEYED BY TOKEN ACCOUNT)
|
|
453
|
+
// -------------------------------------------------------------
|
|
454
|
+
const distributionState = this.pgs.deriveDistributionStatePda();
|
|
455
|
+
const userRecord = this.pgs.deriveUserRecordPda(userAta);
|
|
456
|
+
|
|
457
|
+
const bucketTokenAccount = getAssociatedTokenAddressSync(
|
|
458
|
+
liqsolMint,
|
|
459
|
+
bucketAuthority,
|
|
460
|
+
true,
|
|
461
|
+
TOKEN_2022_PROGRAM_ID,
|
|
462
|
+
);
|
|
463
|
+
|
|
464
|
+
// -------------------------------------------------------------
|
|
465
|
+
// Ephemeral stake
|
|
466
|
+
// -------------------------------------------------------------
|
|
467
|
+
const seed = Math.floor(Math.random() * 2 ** 32);
|
|
468
|
+
const ephemeralStake = await this.pgs.deriveEphemeralStakeAddress(user, seed);
|
|
469
|
+
|
|
470
|
+
// -------------------------------------------------------------
|
|
471
|
+
// BUILD IX (MUST MATCH IDL)
|
|
472
|
+
// -------------------------------------------------------------
|
|
473
|
+
const ix: TransactionInstruction = await this.program.methods
|
|
474
|
+
.deposit(new BN(amount.toString()), seed)
|
|
475
|
+
.accounts({
|
|
476
|
+
user,
|
|
477
|
+
depositAuthority,
|
|
478
|
+
systemProgram: SystemProgram.programId,
|
|
479
|
+
tokenProgram: TOKEN_2022_PROGRAM_ID,
|
|
480
|
+
associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,
|
|
481
|
+
liqsolProgram: this.pgs.PROGRAM_IDS.LIQSOL_TOKEN,
|
|
482
|
+
stakeProgram: StakeProgram.programId,
|
|
483
|
+
liqsolMint,
|
|
484
|
+
userAta,
|
|
485
|
+
liqsolMintAuthority,
|
|
486
|
+
reservePool,
|
|
487
|
+
vault,
|
|
488
|
+
ephemeralStake,
|
|
489
|
+
controllerState,
|
|
490
|
+
payoutState,
|
|
491
|
+
bucketAuthority,
|
|
492
|
+
bucketTokenAccount,
|
|
493
|
+
userRecord,
|
|
494
|
+
distributionState,
|
|
495
|
+
payRateHistory,
|
|
496
|
+
instructionsSysvar: SYSVAR_INSTRUCTIONS_PUBKEY,
|
|
497
|
+
clock: SYSVAR_CLOCK_PUBKEY,
|
|
498
|
+
stakeHistory: SYSVAR_STAKE_HISTORY_PUBKEY,
|
|
499
|
+
rent: SYSVAR_RENT_PUBKEY,
|
|
500
|
+
globalConfig,
|
|
501
|
+
})
|
|
502
|
+
.instruction();
|
|
503
|
+
|
|
504
|
+
return { ix, seed, userAta, ephemeralStake };
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
// A “wallet-adapter-like” shape (AnchorProvider.wallet matches this)
|
|
510
|
+
type WalletLikeSigner = {
|
|
511
|
+
publicKey: PublicKey;
|
|
512
|
+
signTransaction: (tx: Transaction) => Promise<Transaction>;
|
|
513
|
+
};
|
|
514
|
+
|
|
515
|
+
function isKeypairSigner(x: any): x is { publicKey: PublicKey; secretKey: Uint8Array } {
|
|
516
|
+
return !!x && x.publicKey instanceof PublicKey && x.secretKey instanceof Uint8Array;
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
function isWalletLikeSigner(x: any): x is WalletLikeSigner {
|
|
520
|
+
return !!x && x.publicKey instanceof PublicKey && typeof x.signTransaction === "function";
|
|
521
|
+
}
|