redelegate static method

TransactionInstruction redelegate({
  1. required Pubkey stakePoolAddress,
  2. required Pubkey staker,
  3. required Pubkey withdrawAuthority,
  4. required Pubkey validatorList,
  5. required Pubkey sourceStakeAccount,
  6. required Pubkey sourceTransientStakeAccount,
  7. required Pubkey uninitializedEphemeralStakeAccount,
  8. required Pubkey destinationTransientStakeAccount,
  9. required Pubkey destinationStakeAccount,
  10. required Pubkey destinationVoteAccount,
  11. required bu64 lamports,
  12. required bu64 sourceTransientStakeSeed,
  13. required bu64 ephemeralStakeSeed,
  14. required bu64 destinationTransientStakeSeed,
})

(Staker only) Redelegate active stake on a validator, eventually moving it to another.

Internally, this instruction splits a validator stake account into its corresponding transient stake account, redelegates it to an ephemeral stake account, then merges that stake into the destination transient stake account.

In order to rebalance the pool without taking custody, the staker needs a way of reducing the stake on a stake account. This instruction splits some amount of stake, up to the total activated stake, from the canonical validator stake account, into its "transient" stake account.

The instruction only succeeds if the source transient stake account and ephemeral stake account do not exist.

The amount of lamports to move must be at least twice rent-exemption plus the minimum delegation amount. Rent-exemption is required for the source transient stake account, and rent-exemption plus minimum delegation is required for the destination ephemeral stake account.

  1. [] Stake pool
  2. [s] Stake pool staker
  3. [] Stake pool withdraw authority
  4. [w] Validator list
  5. [w] Source canonical stake account to split from
  6. [w] Source transient stake account to receive split and be redelegated
  7. [w] Uninitialized ephemeral stake account to receive redelegation
  8. [w] Destination transient stake account to receive ephemeral stake by merge
  9. [] Destination stake account to receive transient stake after activation
  10. [] Destination validator vote account
  11. [] Clock sysvar
  12. [] Stake History sysvar
  13. [] Stake Config sysvar
  14. [] System program
  15. [] Stake program

Data:

  • lamports - Amount of lamports to redelegate.
  • sourceTransientStakeSeed - Seed used to create source transient stake account.
  • ephemeralStakeSeed - Seed used to create destination ephemeral account.
  • destinationTransientStakeSeed - Seed used to create destination transient stake account. If there is already transient stake, this must match the current seed, otherwise it can be anything.

Implementation

static TransactionInstruction redelegate({
  // Keys
  required final Pubkey stakePoolAddress,
  required final Pubkey staker,
  required final Pubkey withdrawAuthority,
  required final Pubkey validatorList,
  required final Pubkey sourceStakeAccount,
  required final Pubkey sourceTransientStakeAccount,
  required final Pubkey uninitializedEphemeralStakeAccount,
  required final Pubkey destinationTransientStakeAccount,
  required final Pubkey destinationStakeAccount,
  required final Pubkey destinationVoteAccount,
  // Data
  required final bu64 lamports,
  required final bu64 sourceTransientStakeSeed,
  required final bu64 ephemeralStakeSeed,
  required final bu64 destinationTransientStakeSeed,
}) {
  //  0. `[]` Stake pool
  //  1. `[s]` Stake pool staker
  //  2. `[]` Stake pool withdraw authority
  //  3. `[w]` Validator list
  //  4. `[w]` Source canonical stake account to split from
  //  5. `[w]` Source transient stake account to receive split and be redelegated
  //  6. `[w]` Uninitialized ephemeral stake account to receive redelegation
  //  7. `[w]` Destination transient stake account to receive ephemeral stake by merge
  //  8. `[]` Destination stake account to receive transient stake after activation
  //  9. `[]` Destination validator vote account
  // 10. `[]` Clock sysvar
  // 11. `[]` Stake History sysvar
  // 12. `[]` Stake Config sysvar
  // 13. `[]` System program
  // 14. `[]` Stake program
  final List<AccountMeta> keys = [
    AccountMeta(stakePoolAddress),
    AccountMeta.signer(staker),
    AccountMeta(withdrawAuthority),
    AccountMeta.writable(validatorList),
    AccountMeta.writable(sourceStakeAccount),
    AccountMeta.writable(sourceTransientStakeAccount),
    AccountMeta.writable(uninitializedEphemeralStakeAccount),
    AccountMeta.writable(destinationTransientStakeAccount),
    AccountMeta(destinationStakeAccount),
    AccountMeta(destinationVoteAccount),
    AccountMeta(sysvarClockPubkey),
    AccountMeta(sysvarStakeHistoryPubkey),
    AccountMeta(StakeProgram.configId),
    AccountMeta(SystemProgram.programId),
    AccountMeta(StakeProgram.programId),
  ];

  final List<Iterable<int>> data = [
    borsh.u64.encode(lamports),
    borsh.u64.encode(sourceTransientStakeSeed),
    borsh.u64.encode(ephemeralStakeSeed),
    borsh.u64.encode(destinationTransientStakeSeed),
  ];

  return _instance.createTransactionIntruction(
    StakePoolInstruction.redelegate,
    keys: keys,
    data: data,
  );
}