updateStakePool static method
Future<Tuple<List<TransactionInstruction> , List<TransactionInstruction> > >
updateStakePool(
- SolanaRPC connection,
- StakePoolAccount stakePool, {
- bool noMerge = false,
Creates instructions required to completely update a stake pool after epoch change.
Implementation
static Future<
Tuple<List<TransactionInstruction>, List<TransactionInstruction>>>
updateStakePool(SolanaRPC connection, StakePoolAccount stakePool,
{bool noMerge = false}) async {
final stakePoolAddress = stakePool.address;
final validatorList = await connection.request(
SolanaRPCGetStakePoolValidatorListAccount(
address: stakePool.validatorList.address));
if (validatorList == null) {
throw MessageException("Validator list account does not found.");
}
final withdrawAuthority =
StakePoolProgramUtils.findWithdrawAuthorityProgramAddress(
stakePoolAddress: stakePoolAddress,
);
final updateListInstructions = <TransactionInstruction>[];
final instructions = <TransactionInstruction>[];
int startIndex = 0;
List<List<ValidatorStakeInfo>> validatorChunks =
_arrayChunk(validatorList.validators, 5);
for (final validatorChunk in validatorChunks) {
final List<SolAddress> validatorAndTransientStakePairs = [];
for (final validator in validatorChunk) {
final validatorStake = StakePoolProgramUtils.findStakeProgramAddress(
voteAccountAddress: validator.voteAccountAddress,
stakePoolAddress: stakePoolAddress);
validatorAndTransientStakePairs.add(validatorStake.address);
final transientStake =
StakePoolProgramUtils.findTransientStakeProgramAddress(
voteAccountAddress: validator.voteAccountAddress,
stakePoolAddress: stakePoolAddress,
seed: validator.transientSeedSuffixStart,
);
validatorAndTransientStakePairs.add(transientStake.address);
}
updateListInstructions.add(
StakePoolProgram.updateValidatorListBalance(
stakePool: stakePoolAddress,
validatorList: stakePool.validatorList,
reserveStake: stakePool.reserveStake,
validatorAndTransientStakePairs: validatorAndTransientStakePairs,
withdrawAuthority: withdrawAuthority.address,
layout: StakePoolUpdateValidatorListBalanceLayout(
startIndex: startIndex, noMerge: noMerge),
),
);
startIndex += 5;
}
instructions.add(
StakePoolProgram.updateStakePoolBalance(
stakePool: stakePoolAddress,
validatorList: stakePool.validatorList,
reserveStake: stakePool.reserveStake,
managerFeeAccount: stakePool.managerFeeAccount,
poolMint: stakePool.poolMint,
withdrawAuthority: withdrawAuthority.address,
),
);
instructions.add(
StakePoolProgram.cleanupRemovedValidatorEntries(
stakePool: stakePoolAddress,
validatorList: stakePool.validatorList,
),
);
return Tuple(updateListInstructions, instructions);
}