Transactions
move-lock
Move an existing lock from one hotkey to another on a subnet.
Re-points the signing coldkey's entire stake lock on the subnet at the
destination hotkey, carrying the locked mass with it. Accrued conviction
is preserved only when the origin and destination hotkeys are owned by
the same coldkey (e.g. rotating your own validator hotkeys); if the
destination hotkey belongs to a different coldkey, conviction resets to
zero and matures again from scratch. The destination hotkey must exist
on chain (fails with HotKeyAccountNotExists). Fails if there is no
existing lock on the subnet to move.
| Signer | Pallet | Wraps |
|---|---|---|
coldkey | SubtensorModule | SubtensorModule.move_lock |
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
netuid | integer | yes | Subnet the lock lives on. |
destination_hotkey_ss58 | string | yes | Hotkey the lock is moved to. |
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-lock \
--netuid <int> \
--destination-hotkey <ss58|name> --dry-run
btcli tx move-lock \
--netuid <int> \
--destination-hotkey <ss58|name> -w my_coldkeyPython
import bittensor as sub
from bittensor.wallet import Wallet
wallet = Wallet(name="my_coldkey", hotkey="my_hotkey")
intent = sub.MoveLock(netuid=1, destination_hotkey_ss58="5F...")
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_lock", {...}, wallet)