Transactions

remove-stake

Unstake alpha from a hotkey back to the coldkey.

View as Markdown

Swaps the alpha position back to TAO at the current pool price and credits it to the signing coldkey's free balance. Pass all to exit the entire position on that hotkey and subnet (the build fails if nothing is staked there). Like staking, the swap moves the pool, so large amounts incur slippage. By default the call is slippage-protected: it fails (SlippageTooHigh) instead of filling once the price falls more than rate_tolerance (5%) below the price at submission — raise the tolerance or set slippage_protection to False to execute at any price, or use remove_stake_limit to set an explicit limit price. The hotkey and netuid must match where the stake is actually held, and the subnet must have subtoken trading enabled. The requested amount is capped to the stake currently available. A partial unstake must leave a remainder worth at least 0.002 TAO at the simulated pool price — exit the full position instead of leaving dust (AmountTooLow).

SignerOriginPalletWraps
coldkeysigned account (pallet role may apply)SubtensorModuleSubtensorModule.remove_stake, SubtensorModule.remove_stake_limit

Parameters

ParameterTypeRequiredDescription
hotkey_ss58stringyesHotkey the stake is held on (the validator backing the position).
netuidintegeryesSubnet the stake lives on (netuid 0 is the root network).
amount_alphanumber | "all"yesHow much to unstake from this position, or all.
slippage_protectionbooleannoBound the price the swap may execute at (on by default): the call fails (SlippageTooHigh) instead of filling once the pool price moves more than rate_tolerance from the price at submission. Disable to execute at any price.
rate_tolerancenumbernoMaximum price move slippage protection accepts, as a fraction (0.05 = 5%). Ignored when slippage protection is disabled.

Address parameters (--hotkey, --coldkey, --dest, ...) accept a raw ss58 address, an address-book or proxy-book name, or a local wallet/hotkey name.

CLI

Preview with --dry-run (shows fee, effects, and policy result without submitting), then submit:

btcli tx remove-stake \
  --hotkey <ss58|name> \
  --netuid <int> \
  --amount-alpha <amount|all> --dry-run
btcli tx remove-stake \
  --hotkey <ss58|name> \
  --netuid <int> \
  --amount-alpha <amount|all> -w my_coldkey

Python

import bittensor as bt
from bittensor.wallet import Wallet

wallet = Wallet(name="my_coldkey", hotkey="my_hotkey")
intent = bt.RemoveStake(hotkey_ss58="5F...", netuid=1, amount_alpha=1.0)

sub = bt.Subtensor()
plan = sub.plan(intent, wallet)   # fee, effects, policy — no submission
result = sub.execute(intent, wallet)
if not result.success:
    print(result.error.code, result.error.remediation)

(bt.Subtensor is also the async client — async with bt.Subtensor() as client: — see The client.) Or build the intent by op name, as an agent would:

result = sub.execute_tool("remove_stake", {...}, wallet)

On-chain implementation

SubtensorModule.remove_stakepallets/subtensor/src/macros/dispatches.rs#L595:

#[pallet::call_index(3)]
#[pallet::weight(<T as crate::pallet::Config>::WeightInfo::remove_stake())]
pub fn remove_stake(
    origin: OriginFor<T>,
    hotkey: T::AccountId,
    netuid: NetUid,
    amount_unstaked: AlphaBalance,
) -> DispatchResult {
    Self::do_remove_stake(origin, hotkey, netuid, amount_unstaked)
}

Delegates to do_remove_stake.

SubtensorModule.remove_stake_limitpallets/subtensor/src/macros/dispatches.rs#L1446:

#[pallet::call_index(89)]
#[pallet::weight(<T as crate::pallet::Config>::WeightInfo::remove_stake_limit())]
pub fn remove_stake_limit(
    origin: OriginFor<T>,
    hotkey: T::AccountId,
    netuid: NetUid,
    amount_unstaked: AlphaBalance,
    limit_price: TaoBalance,
    allow_partial: bool,
) -> DispatchResult {
    Self::do_remove_stake_limit(
        origin,
        hotkey,
        netuid,
        amount_unstaked,
        limit_price,
        allow_partial,
    )
}

Delegates to do_remove_stake_limit.

Every file is browsable under /code exactly as built into the runtime, or as plain text under /code/raw/<path> (index: /code/index.json).