|
| 1 | +"use strict"; |
| 2 | +Object.defineProperty(exports, "__esModule", { value: true }); |
| 3 | +exports.depositStake = void 0; |
| 4 | +const web3_js_1 = require("@solana/web3.js"); |
| 5 | +const spl_stake_pool_1 = require("@solana/spl-stake-pool"); |
| 6 | +const generated_1 = require("./generated"); |
| 7 | +const spl_token_1 = require("@solana/spl-token"); |
| 8 | +/** |
| 9 | + * Creates instructions required to deposit stake to stake pool via |
| 10 | + * Stake Deposit Interceptor. |
| 11 | + * |
| 12 | + * @param connection |
| 13 | + * @param payer - [NEW] pays rent for DepositReceipt |
| 14 | + * @param stakePoolAddress |
| 15 | + * @param authorizedPubkey |
| 16 | + * @param validatorVote |
| 17 | + * @param depositStake |
| 18 | + * @param poolTokenReceiverAccount |
| 19 | + */ |
| 20 | +const depositStake = async (connection, payer, stakePoolAddress, authorizedPubkey, validatorVote, depositStake, poolTokenReceiverAccount) => { |
| 21 | + const stakePool = await (0, spl_stake_pool_1.getStakePoolAccount)(connection, stakePoolAddress); |
| 22 | + const stakePoolDepositAuthority = await generated_1.StakePoolDepositStakeAuthority.fromAccountAddress(connection, stakePool.account.data.stakeDepositAuthority); |
| 23 | + const withdrawAuthority = await findWithdrawAuthorityProgramAddress(spl_stake_pool_1.STAKE_POOL_PROGRAM_ID, stakePoolAddress); |
| 24 | + const validatorStake = await findStakeProgramAddress(spl_stake_pool_1.STAKE_POOL_PROGRAM_ID, validatorVote, stakePoolAddress); |
| 25 | + const instructions = []; |
| 26 | + const signers = []; |
| 27 | + const base = web3_js_1.Keypair.generate(); |
| 28 | + const poolMint = stakePool.account.data.poolMint; |
| 29 | + signers.push(base); |
| 30 | + // Create token account if not specified |
| 31 | + if (!poolTokenReceiverAccount) { |
| 32 | + const associatedAddress = (0, spl_token_1.getAssociatedTokenAddressSync)(poolMint, authorizedPubkey); |
| 33 | + instructions.push((0, spl_token_1.createAssociatedTokenAccountIdempotentInstruction)(authorizedPubkey, associatedAddress, authorizedPubkey, poolMint)); |
| 34 | + poolTokenReceiverAccount = associatedAddress; |
| 35 | + } |
| 36 | + instructions.push(...web3_js_1.StakeProgram.authorize({ |
| 37 | + stakePubkey: depositStake, |
| 38 | + authorizedPubkey, |
| 39 | + newAuthorizedPubkey: stakePool.account.data.stakeDepositAuthority, |
| 40 | + stakeAuthorizationType: web3_js_1.StakeAuthorizationLayout.Staker, |
| 41 | + }).instructions); |
| 42 | + instructions.push(...web3_js_1.StakeProgram.authorize({ |
| 43 | + stakePubkey: depositStake, |
| 44 | + authorizedPubkey, |
| 45 | + newAuthorizedPubkey: stakePool.account.data.stakeDepositAuthority, |
| 46 | + stakeAuthorizationType: web3_js_1.StakeAuthorizationLayout.Withdrawer, |
| 47 | + }).instructions); |
| 48 | + // Derive DepositReceipt Address |
| 49 | + const [depositReceiptAddress] = web3_js_1.PublicKey.findProgramAddressSync([ |
| 50 | + Buffer.from("deposit_receipt"), |
| 51 | + stakePoolAddress.toBuffer(), |
| 52 | + base.publicKey.toBuffer(), |
| 53 | + ], generated_1.PROGRAM_ID); |
| 54 | + const depositStakeIxArgs = { |
| 55 | + depositStakeArgs: { |
| 56 | + owner: authorizedPubkey, |
| 57 | + }, |
| 58 | + }; |
| 59 | + const depositStakeIxAccounts = { |
| 60 | + payer, |
| 61 | + stakePoolProgram: spl_stake_pool_1.STAKE_POOL_PROGRAM_ID, |
| 62 | + depositReceipt: depositReceiptAddress, |
| 63 | + stakePool: stakePoolAddress, |
| 64 | + validatorStakeList: stakePool.account.data.validatorList, |
| 65 | + depositStakeAuthority: stakePool.account.data.stakeDepositAuthority, |
| 66 | + base: base.publicKey, |
| 67 | + stakePoolWithdrawAuthority: withdrawAuthority, |
| 68 | + stake: depositStake, |
| 69 | + validatorStakeAccount: validatorStake, |
| 70 | + reserveStakeAccount: stakePool.account.data.reserveStake, |
| 71 | + vault: stakePoolDepositAuthority.vault, |
| 72 | + managerFeeAccount: stakePool.account.data.managerFeeAccount, |
| 73 | + referrerPoolTokensAccount: poolTokenReceiverAccount, |
| 74 | + poolMint, |
| 75 | + clock: web3_js_1.SYSVAR_CLOCK_PUBKEY, |
| 76 | + stakeHistory: web3_js_1.SYSVAR_STAKE_HISTORY_PUBKEY, |
| 77 | + tokenProgram: spl_token_1.TOKEN_PROGRAM_ID, |
| 78 | + stakeProgram: web3_js_1.StakeProgram.programId, |
| 79 | + systemProgram: web3_js_1.SystemProgram.programId, |
| 80 | + }; |
| 81 | + const depositStakeIx = (0, generated_1.createDepositStakeInstruction)(depositStakeIxAccounts, depositStakeIxArgs); |
| 82 | + instructions.push(depositStakeIx); |
| 83 | + return { |
| 84 | + instructions, |
| 85 | + signers, |
| 86 | + }; |
| 87 | +}; |
| 88 | +exports.depositStake = depositStake; |
| 89 | +/** |
| 90 | + * Generates the withdraw authority program address for the stake pool |
| 91 | + */ |
| 92 | +const findWithdrawAuthorityProgramAddress = (programId, stakePoolAddress) => { |
| 93 | + const [publicKey] = web3_js_1.PublicKey.findProgramAddressSync([stakePoolAddress.toBuffer(), Buffer.from("withdraw")], programId); |
| 94 | + return publicKey; |
| 95 | +}; |
| 96 | +/** |
| 97 | + * Generates the stake program address for a validator's vote account |
| 98 | + */ |
| 99 | +const findStakeProgramAddress = (programId, voteAccountAddress, stakePoolAddress) => { |
| 100 | + const [publicKey] = web3_js_1.PublicKey.findProgramAddressSync([ |
| 101 | + voteAccountAddress.toBuffer(), |
| 102 | + stakePoolAddress.toBuffer(), |
| 103 | + Buffer.alloc(0), |
| 104 | + ], programId); |
| 105 | + return publicKey; |
| 106 | +}; |
0 commit comments