suideveloper
All questions
Consensus, validators and staking

How do I unstake SUI, and how long does it take?

October 31, 2026

To unstake, call 0x3::sui_system::request_withdraw_stake with your StakedSui object, or use "Unstake" in a wallet such as Slush. Sui has no unbonding period. The principal plus accrued rewards come back to your address as a SUI coin in the same transaction, usually within a second or so. The only timing rule is about rewards: you don't earn rewards for the epoch in which you withdraw.

Unstake from the CLI

First find your stake objects. They're owned by your address and have the type 0x3::staking_pool::StakedSui:

Terminal
sui client objects

Look for entries with the type 0x3::staking_pool::StakedSui and note their object IDs.

Then withdraw one:

Terminal
sui client call --package 0x3 --module sui_system \
  --function request_withdraw_stake \
  --args 0x5 <STAKED_SUI_OBJECT_ID>

0x5 is the shared system state object. The resulting coin is transferred to the sender.

Unstake from TypeScript

With @mysten/sui v2:

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

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

const { objects } = await client.listOwnedObjects({
  owner: address,
  type: '0x3::staking_pool::StakedSui',
});

const tx = new Transaction();
tx.moveCall({
  target: '0x3::sui_system::request_withdraw_stake',
  arguments: [tx.object.system(), tx.object(objects[0].objectId)],
});

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

To withdraw several stakes, add one moveCall per StakedSui object to the same transaction.

What you get back, and when

The amount depends on when the stake was activated:

Situation Result
Stake not active yet (staked this epoch) Principal returned immediately, no rewards
Active stake Principal plus rewards up to the start of the current epoch
Validator has left the set Principal plus rewards up to the epoch it left

The rewards are calculated with the pool's exchange rate recorded at the start of the current epoch. Anything the pool earns during the epoch you withdraw in goes to the remaining stakers. If you're about to unstake, waiting until just after an epoch change gets you one more epoch of rewards than unstaking just before it. Epochs last about 24 hours. See Sui epochs.

Partial unstaking

A StakedSui is withdrawn whole. To unstake part of one, split it first with 0x3::staking_pool::split_staked_sui(stake, amount), then withdraw the new object. Both parts must be at least 1 SUI.

Moving to another validator

Sui has no "redelegate" call. Withdraw, then stake again with request_add_stake to the new validator, in the same transaction if you like. The new stake activates next epoch, so you miss one epoch of rewards. See how staking works and how rewards are calculated.

Sources

More on consensus, validators and staking