suideveloper
All questions
Consensus, validators and staking

How does staking SUI work?

October 31, 2026

Staking SUI means delegating it to a validator's staking pool. It's done with a call to 0x3::sui_system::request_add_stake. Your SUI moves into the pool and you receive a StakedSui object, owned by your address, that records the pool, the amount and the activation epoch. The stake becomes active at the start of the next epoch. It earns a share of that validator's rewards for every full epoch it stays active, and you can withdraw at any time. The minimum is 1 SUI.

What happens on-chain

  1. You call request_add_stake(system_state, coin, validator_address). The 0x5 object is the shared SuiSystemState.
  2. The framework creates a StakedSui object with stake_activation_epoch = current epoch + 1 and transfers it to you. Staking doesn't lock up your account or the rest of your SUI.
  3. At the epoch change, the pool processes pending stakes. Your SUI becomes part of the validator's stake and adds to its voting power.
  4. At every later epoch change, the pool receives rewards and its exchange rate between pool tokens and SUI goes up. Your StakedSui is worth more SUI over time. You don't get separate reward payouts.

The StakedSui object is self-custodial. Only you can withdraw it, and you can split or merge StakedSui objects from the same pool and activation epoch (each part must be at least 1 SUI).

Stake from the CLI

Find a validator address with an explorer or the validator count query, then:

Terminal
sui client call --package 0x3 --module sui_system \
  --function request_add_stake \
  --args 0x5 <COIN_OBJECT_ID> <VALIDATOR_ADDRESS>

The whole coin is staked, so split off the amount you want first. To stake from several coins at once, use request_add_stake_mul_coin.

Stake from TypeScript

With @mysten/sui v2, split the amount from the gas coin and pass the system object:

TypeScript
import { SuiGrpcClient } from '@mysten/sui/grpc';
import { Transaction } from '@mysten/sui/transactions';

const client = new SuiGrpcClient({
  network: 'testnet',
  baseUrl: 'https://fullnode.testnet.sui.io:443',
});

const tx = new Transaction();
const [stake] = tx.splitCoins(tx.gas, [1_000_000_000n]); // 1 SUI in MIST
tx.moveCall({
  target: '0x3::sui_system::request_add_stake',
  arguments: [tx.object.system(), stake, tx.pure.address(VALIDATOR_ADDRESS)],
});

await client.signAndExecuteTransaction({ signer, transaction: tx });

You can try this on testnet with free SUI from the playground.

Choosing a validator

Rewards depend on the validator's share of total stake (its voting power) and its commission rate. Commission is between 0% and 20%. Validators that perform badly can be reported by their peers and lose that epoch's rewards, and stakers lose them too. Rewards are covered in detail in how Sui staking rewards are calculated.

There's no slashing of principal in the current framework. Reports only cut rewards. If a validator leaves the set, its pool becomes inactive and you can still withdraw from it.

Liquid staking

StakedSui can be converted to FungibleStakedSui with convert_to_fungible_staked_sui, once the stake is active. Liquid staking protocols build on this to issue tradable tokens backed by stake.

To withdraw, see how to unstake SUI.

Sources

More on consensus, validators and staking