Transactions
move-stake
Move alpha between hotkeys and/or subnets.
Re-delegates an existing position without passing through the coldkey's
free balance: the stake leaves the origin hotkey on the origin subnet and
lands on the destination hotkey at the destination subnet. Moving within
one subnet just changes which validator backs the stake; moving across
subnets swaps through both pools and can incur slippage on each leg.
Ownership stays with the signing coldkey — use transfer_stake to hand
the position to another coldkey, or swap_stake when only the subnet
changes.
| Signer | Pallet | Wraps |
|---|---|---|
coldkey | SubtensorModule | SubtensorModule.move_stake |
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
origin_hotkey_ss58 | string | yes | Hotkey the stake moves away from. |
origin_netuid | integer | yes | Subnet the stake currently sits on. |
dest_hotkey_ss58 | string | yes | Hotkey the stake moves to. |
dest_netuid | integer | yes | Subnet the stake ends up on. When it differs from the origin, the position is swapped through both subnet pools, which can incur slippage on each leg. |
amount_alpha | number | "all" | yes | How much of the origin position to move (an explicit amount; all is not accepted). |
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 move-stake \
--origin-hotkey <ss58|name> \
--origin-netuid <int> \
--dest-hotkey <ss58|name> \
--dest-netuid <int> \
--amount-alpha <amount|all> --dry-run
btcli tx move-stake \
--origin-hotkey <ss58|name> \
--origin-netuid <int> \
--dest-hotkey <ss58|name> \
--dest-netuid <int> \
--amount-alpha <amount|all> -w my_coldkeyPython
import bittensor as sub
from bittensor.wallet import Wallet
wallet = Wallet(name="my_coldkey", hotkey="my_hotkey")
intent = sub.MoveStake(origin_hotkey_ss58="5F...", origin_netuid=0, dest_hotkey_ss58="5F...", dest_netuid=0, amount_alpha=1.0)
async with sub.Client("finney") as client:
plan = await client.plan(intent, wallet) # fee, effects, policy — no submission
result = await client.execute(intent, wallet)
if not result.success:
print(result.error.code, result.error.remediation)Or build it by op name, as an agent would:
await client.execute_tool("move_stake", {...}, wallet)