From 48822018f5587c9653dd7bb1504bb85b067c982d Mon Sep 17 00:00:00 2001 From: Dera Okeke Date: Tue, 17 Mar 2026 17:51:12 +0100 Subject: [PATCH 1/9] add ck note --- docs/keys/coldkey-swap.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/keys/coldkey-swap.md b/docs/keys/coldkey-swap.md index 55ebd0558..22556767e 100644 --- a/docs/keys/coldkey-swap.md +++ b/docs/keys/coldkey-swap.md @@ -17,6 +17,13 @@ See: - [Coldkey and Hotkey Workstation Security](./coldkey-hotkey-security) - [Coldkey swap blockchain sourcecode](https://github.com/opentensor/subtensor/blob/main/pallets/subtensor/src/swap/swap_coldkey.rs). +:::info coldkey swap vs transfers +Coldkey swaps are only necessary if you need to migrate a coldkey with subnet ownerships or registrations. + +If you only hold and stake TAO, you do not need to perform a coldkey swap. Instead, simply transfer your staked and unstaked TAO to the new coldkey. For more information, see [`btcli wallet transfer`](../btcli/btcli.md#btcli-wallet-transfer) and [`btcli stake transfer --all`](../btcli/btcli.md#btcli-stake-transfer). + +::: + ## Introduction The coldkey swap mechanism provides a secure way to switch to a new coldkey, if you feel the secrecy of your wallet's coldkey secret key needs to be improved. From b4ac2264189044d0b80773691efa4fb4fac60cb3 Mon Sep 17 00:00:00 2001 From: Dera Okeke Date: Tue, 17 Mar 2026 18:56:42 +0100 Subject: [PATCH 2/9] ck swap fix --- docs/keys/{coldkey-swap.md => schedule-coldkey-swap.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/keys/{coldkey-swap.md => schedule-coldkey-swap.md} (100%) diff --git a/docs/keys/coldkey-swap.md b/docs/keys/schedule-coldkey-swap.md similarity index 100% rename from docs/keys/coldkey-swap.md rename to docs/keys/schedule-coldkey-swap.md From a6ff4ffa0040863cade2ed6cc517dbb5ace4106b Mon Sep 17 00:00:00 2001 From: Dera Okeke Date: Tue, 17 Mar 2026 19:00:37 +0100 Subject: [PATCH 3/9] ck swap fix --- docs/keys/schedule-coldkey-swap.md | 452 ----------------------------- 1 file changed, 452 deletions(-) delete mode 100644 docs/keys/schedule-coldkey-swap.md diff --git a/docs/keys/schedule-coldkey-swap.md b/docs/keys/schedule-coldkey-swap.md deleted file mode 100644 index 22556767e..000000000 --- a/docs/keys/schedule-coldkey-swap.md +++ /dev/null @@ -1,452 +0,0 @@ ---- -title: "Rotate/Swap your Coldkey" ---- - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -# Rotate/Swap your Coldkey - -This page describes how to _rotate_ or _swap_ the coldkey in your wallet. This operation migrates your entire on-chain identity, including TAO balances and subnet ownership, to a new cryptographic key pair. - -It is _critical_ to swap your coldkey if you think it has been leaked or compromised, as your coldkey secures your wallet's identity and assets. - -See: - -- [Wallets, Coldkeys and Hotkeys in Bittensor](./wallets) -- [Coldkey and Hotkey Workstation Security](./coldkey-hotkey-security) -- [Coldkey swap blockchain sourcecode](https://github.com/opentensor/subtensor/blob/main/pallets/subtensor/src/swap/swap_coldkey.rs). - -:::info coldkey swap vs transfers -Coldkey swaps are only necessary if you need to migrate a coldkey with subnet ownerships or registrations. - -If you only hold and stake TAO, you do not need to perform a coldkey swap. Instead, simply transfer your staked and unstaked TAO to the new coldkey. For more information, see [`btcli wallet transfer`](../btcli/btcli.md#btcli-wallet-transfer) and [`btcli stake transfer --all`](../btcli/btcli.md#btcli-stake-transfer). - -::: - -## Introduction - -The coldkey swap mechanism provides a secure way to switch to a new coldkey, if you feel the secrecy of your wallet's coldkey secret key needs to be improved. - -Because they are such sensitive operations a security perspective, coldkey swaps unfold in several careful stages: - -1. Initiation/Announcement - -In the first step, the coldkey owner initiates the swap by making an announcement on the blockchain that the swap will occur. This triggers a mandatory waiting period, during which the wallet is locked to prevent operations such as transfers or staking. During this phase, the coldkey can only reannounce a coldkey swap, execute a swap or dispute a swap. - -At this initiation step, the coldkey owner provides the destination wallet address, which remains private, as only a hash is published to the blockchain. - -2. Pending Period - -Next, a pending or lock-out period must elapse, during which the swap can be disputed but not finalized. - -Currently the waiting/locked period is **36,000 blocks** (~ **5 days**). - -3. Disputation or Finalization - 1. [Disputing a coldkey swap](#dispute-a-coldkey-swap) prevents the execution of the swap and completely blocks the coldkey from performing any operations. At this point, the triumvirate is required to resolve the dispute. The coldkey private key is required to dispute a swap. - 1. If the Pending Period expires without the swap being disputed, the coldkey owner must finalize the swap by again providing the destination coldkey. The blockchain verifies that this key matches the recorded hash before proceeding. - -![Coldkey swap flow diagram](/img/docs/coldkey-swap.png) - - - -:::info notes - -- If the destination coldkey already has an existing identity, it will be preserved rather than being overwritten, and the assets of the source wallet will be transferred/merged into this existing wallet. -- The cost for a coldkey swap transaction is **0.1 TAO**. This must be available in the source coldkey when the swap is announced. Upon successful execution all assets are migrated to the destination coldkey. This includes all TAO, all stake in subnets, control of any hotkeys, and any subnet ownership. - -::: - -:::tip Prevent emergencies with proxies -Coldkey swaps are needed when a coldkey has been compromised/leaked, that is, if it is possible that someone else could have copied or recorded it in some way and can reproduce it. If someone gains your coldkey private key, they can take all of your wallet's assets, so any possibility of a compromise should be taken seriously. - -To limit the opportunity to compromise your most valuable coldkey, you can use another wallet as a **proxy.** With a properly configured proxy (a `ProxyType` limited to specific actions, and non-zero delay), even if an attacker gains access to your proxy wallet, they cannot immediately drain your funds—the delay gives you time to detect and reject unauthorized transactions. - -For high-value wallets, consider setting up a `Staking` proxy for regular staking operations instead of using your coldkey directly. - -See [Proxies: Overview](./proxies/index.md) to learn how to protect your coldkey proactively. -::: - -## Prerequisites - -To follow along with the below examples: - -- You must own the source coldkey to be swapped. -- A destination (new) coldkey public key. -- To safely experiment with this and other blockchain operations, you can deploy a your own - instance of Subtensor (Bittensor's blockchain component). - -:::warning -Confirm the identity of the destination coldkey. A mistake here can result in loss of all of the source coldkey's assets and identity. - -- If you are rotating the coldkey to maintain ownership, you must control the destination coldkey privatekey. Otherwise you will lose control over all of the source coldkey's assets and identity. -- If you are transferring ownership to someone else, confirm that they have secure control of the destination coldkey private key. -- The destination coldkey should not have any existing associations with hotkeys on-chain, which may result in unexpected consequences. - ::: - -## Check pending (announced) coldkey swaps - -You can fetch a list of all pending coldkey swaps, or check a paricular coldkey for pending swaps: - -You can check the details of all coldkey swap announcements, or announcements associated with a particular coldkey. This allows you to verify that your announcement is active while inspecting the committed hash and the target block for execution. - - - - - -Run the following command to check coldkey swaps using BTCLI. Replace `WALLET_NAME` with the source coldkey address, or use `--all` instead. - -```bash -btcli wallets swap-check --wallet-name WALLET_NAME -``` - -
- Show sample output - -```sh -Enter wallet name or SS58 address (leave blank to show all pending announcements): alice - - Pending Coldkey Swap Announcements - Current Block: 115 - - Coldkey ┃ New Coldkey Hash ┃ Execution Block ┃ Time Remaining ┃ Status -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━ - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY │ 0x94772f97f5...ae2160 │ 36111 │ 4d 23h │ Pending - - -``` - -
- -
- -Fetch the current coldkey swap announcement (if any) by calling `get_coldkey_swap_announcement`. Set `WALLET_NAME` to a wallet on disk that holds the coldkey you want to query, or replace `coldkey_ss58` with any coldkey SS58 address. - -```py -import bittensor as bt - -subtensor = bt.Subtensor(network="local") -wallet = bt.Wallet(name="WALLET_NAME") - -response = subtensor.get_coldkey_swap_announcement( - coldkey_ss58=wallet.coldkeypub.ss58_address -) - -print(response) -``` - - -
- -## Announce a coldkey swap - -Before swapping a coldkey, users must first announce their intention to swap coldkeys by providing the new coldkey and then wait the required delay interval before executing the swap. - -To announce a coldkey swap: - - - - - -Run the following command to announce a coldkey swap using BTCLI. Set `WALLET_NAME` to your source wallet name (or SS58 address) and `DESTINATION_COLDKEY` to the destination coldkey SS58 address. - -```bash -btcli wallets swap-coldkey announce \ ---wallet-name WALLET_NAME \ ---new-coldkey DESTINATION_COLDKEY -``` - -
- Show sample output - - - -```sh -Wallet selected: Wallet (Name: 'alice', Hotkey: 'default', Path: '/Users/chidera/.bittensor/wallets/') - - -New coldkey wallet: Wallet (Name: 'swap-test', Hotkey: 'default', Path: '/Users/chidera/.bittensor/wallets/') - -Using the specified network local from config -[19:16:41] Warning: Verify your local subtensor is running on port 9944. subtensor_interface.py:91 - - Announcing Coldkey Swap - - Item ┃ Value -━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - Current Coldkey │ 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY - New Coldkey │ 5FHqAJM9jtVccTctCVmEvxzzm6qeA2yfbqcLFZLMipRKS1cB - New Coldkey Hash │ 0x278149779b423b9294031351e042580000f6f0bce1fbf3a217a27be977c6d080 - Swap Cost │ ‎0.1000 τ‎ -Delay Before Execution│ 5d -──────────────────────┼──────────────────────────────────────────────────────────────────── - │ -Are you sure you want to continue? [y/n] (n): y -✅ Successfully announced coldkey swap - -✅ Your extrinsic has been included as 208-2 - - Coldkey Swap Announced - - Item ┃ Value -━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - Original Coldkey │ 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY - New Coldkey │ 5FHqAJM9jtVccTctCVmEvxzzm6qeA2yfbqcLFZLMipRKS1cB - New Coldkey Hash │ 0x278149779b423b9294031351e042580000f6f0bce1fbf3a217a27be977c6d080 - Execution Block │ 258 -Time Until Executable│ 4d 23h -─────────────────────┼──────────────────────────────────────────────────────────────────── - │ - -After the delay, run: -btcli wallet swap-coldkey execute --new-coldkey 5FHqAJM9jtVccTctCVmEvxzzm6qeA2yfbqcLFZLMipRKS1cB -``` - - -
-
- -Announce a coldkey swap (starts the mandatory waiting period) by submitting `announce_coldkey_swap`. Set `WALLET_NAME` to your source wallet name on disk and `DESTINATION_COLDKEY` to the destination coldkey SS58 address. - -```py -import bittensor as bt - -subtensor = bt.Subtensor(network="local") -wallet = bt.Wallet(name="WALLET_NAME") - -new_coldkey_ss58 = "DESTINATION_COLDKEY" - -# Announce the coldkey swap -response = subtensor.announce_coldkey_swap( - wallet=wallet, - new_coldkey_ss58=new_coldkey_ss58, - wait_for_inclusion=True, - wait_for_finalization=True, -) -print(response) - -``` - - -
- -:::info reannouncing coldkey swaps -A coldkey swap can be reannounced only after the [ColdkeySwapReannouncementDelay](https://github.com/opentensor/subtensor/blob/devnet-ready/runtime/src/lib.rs#:~:text=pub%20const%20InitialColdkeySwapReannouncementDelay) has passed. By default, this is 7,200 blocks (~1 day) after the initial announcement delay period expires. Reannouncing will overwrite the existing announcement and reset the mandatory waiting period before execution. -::: - -## Execute/finalize a coldkey swap - -After the announcement waiting period has passed, the source coldkey can now execute the swap to finalize the process. Attempting to execute a coldkey swap before the announcement delay period has passed will return an error. - -To execute a coldkey swap: - - - - - -Run the following command to execute a coldkey swap using BTCLI. Set `WALLET_NAME` to your source wallet name (or SS58 address) and `DESTINATION_COLDKEY` to the destination coldkey SS58 address. - -```bash -btcli wallets swap-coldkey execute \ ---wallet-name WALLET_NAME \ ---new-coldkey DESTINATION_COLDKEY -``` - -
- Show sample output - -```sh -Wallet selected: Wallet (Name: 'alice', Hotkey: 'default', Path: '/Users/chidera/.bittensor/wallets/') - -New coldkey wallet: Wallet (Name: 'swap-test', Hotkey: 'default', Path: '/Users/chidera/.bittensor/wallets/') - -Using the specified network local from config -[18:59:12] Warning: Verify your local subtensor is running on port 9944. subtensor_interface.py:91 - - Executing Coldkey Swap - - Item ┃ Value -━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - Current Coldkey │ 5Gxhv5iZGBvvR6YJeEdLmvZ7hSHbE6FdHc43fLqMVkhki7j4 - New Coldkey │ 5G4HAHNfT3TFvXMi53LLCR4vsBbSeKXUPsBycDtfbkroMVP9 -─────────────────┼────────────────────────────────────────────────── - │ - -WARNING: This action is irreversible. All assets will be transferred. - -Are you sure you want to continue? [y/n] (n): y -Decrypting... - -✅ Successfully executed coldkey swap! -✅ Your extrinsic has been included as 39386-2 - - Coldkey Swap Completed - - Item ┃ Value -━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - Old Coldkey │ 5Gxhv5iZGBvvR6YJeEdLmvZ7hSHbE6FdHc43fLqMVkhki7j4 - New Coldkey │ 5G4HAHNfT3TFvXMi53LLCR4vsBbSeKXUPsBycDtfbkroMVP9 -─────────────────┼────────────────────────────────────────────────── - │ - -All assets have been transferred to the new coldkey. -``` - -
- -
- -Execute/finalize an **announced** swap (once it is executable) by submitting `swap_coldkey_announced`. Set `WALLET_NAME` to your source wallet name on disk and `DESTINATION_COLDKEY` to the destination coldkey SS58 address used in the announcement. - -```py -import bittensor as bt - -subtensor = bt.Subtensor(network="local") -wallet = bt.Wallet(name="WALLET_NAME") - -new_coldkey_ss58 = "DESTINATION_COLDKEY" - -# Execute/finalize the announced swap -response = subtensor.swap_coldkey_announced( - wallet=wallet, - new_coldkey_ss58=new_coldkey_ss58, - wait_for_inclusion=True, - wait_for_finalization=True, -) -print(response) -``` - - -
- -After executing a coldkey swap, all assets will be transferred to the destination coldkey, including TAO balance, delegated stake, and any subnet ownership. - -## Dispute a coldkey swap - -If a malicious actor announces a coldkey swap on a compromised key, the legitimate owner can trigger a dispute at any point prior to its execution to intercept the operation. This operation freezes the coldkey and prevents the attacker from completing the swap process. - -To dispute a coldkey swap: - - -Run the following command to dispute a coldkey swap using BTCLI. Set `WALLET_NAME` to your source wallet name (or SS58 address). - -```bash -btcli wallets swap-coldkey dispute --wallet-name WALLET_NAME -``` - -
- Show sample output - -```sh -Wallet selected: Wallet (Name: 'alice', Hotkey: 'default', Path: '/Users/chidera/.bittensor/wallets/') - -Using the specified network local from config -[13:27:34] Warning: Verify your local subtensor is running on port 9944. subtensor_interface.py:91 - - Dispute Coldkey Swap - - Item ┃ Value -━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - Coldkey │ 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY - Execution Block │ 87 - Status │ Ready - Warning │ Disputing freezes the current swap process until the triumvirate can intervene. -─────────────────┼───────────────────────────────────────────────────────────────────────────────── - │ -Proceed with dispute? Your swap process will be frozen until the triumvirate can intervene. [y/n] (n): y -✅ Coldkey swap disputed. - -✅ Your extrinsic has been included as 40386-2 -``` - -
-
- - -Dispute (freeze) an active swap announcement by submitting `dispute_coldkey_swap`. Set `WALLET_NAME` to your source wallet name on disk. - -```py -import bittensor as bt - -subtensor = bt.Subtensor(network="local") -wallet = bt.Wallet(name="WALLET_NAME") - -response = subtensor.dispute_coldkey_swap( - wallet=wallet, - wait_for_inclusion=True, - wait_for_finalization=True, -) - -print(response) - -``` - - - -
- -:::info -The [`dispute_coldkey_swap`](https://github.com/opentensor/subtensor/blob/devnet-ready/pallets/subtensor/src/macros/dispatches.rs#:~:text=pub%20fn%20dispute_coldkey_swap) extrinsic is only callable by a coldkey with an active swap announcement. If no swap has been initiated, the process returns a [`ColdkeySwapAnnouncementNotFound`](https://github.com/opentensor/subtensor/blob/devnet-ready/pallets/subtensor/src/macros/errors.rs#:~:text=ColdkeySwapAnnouncementNotFound) error. -::: - -After a coldkey swap is disputed, the legitimate owner must contact the Triumvirate to prove ownership of the coldkey. The coldkey remains frozen until the Triumvirate resolves the dispute and [manually resets it](https://github.com/opentensor/subtensor/blob/822452f0bc205490c5ada2f2a04ad7b56ef7cc0a/pallets/subtensor/src/macros/dispatches.rs#L2470-L2490). From bda8b139ab6a782e0c5dace8576ab954ac3dd4d1 Mon Sep 17 00:00:00 2001 From: Dera Okeke Date: Tue, 17 Mar 2026 19:30:18 +0100 Subject: [PATCH 4/9] fix ck swap revert --- docs/keys/coldkey-swap.md | 452 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 452 insertions(+) create mode 100644 docs/keys/coldkey-swap.md diff --git a/docs/keys/coldkey-swap.md b/docs/keys/coldkey-swap.md new file mode 100644 index 000000000..22556767e --- /dev/null +++ b/docs/keys/coldkey-swap.md @@ -0,0 +1,452 @@ +--- +title: "Rotate/Swap your Coldkey" +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Rotate/Swap your Coldkey + +This page describes how to _rotate_ or _swap_ the coldkey in your wallet. This operation migrates your entire on-chain identity, including TAO balances and subnet ownership, to a new cryptographic key pair. + +It is _critical_ to swap your coldkey if you think it has been leaked or compromised, as your coldkey secures your wallet's identity and assets. + +See: + +- [Wallets, Coldkeys and Hotkeys in Bittensor](./wallets) +- [Coldkey and Hotkey Workstation Security](./coldkey-hotkey-security) +- [Coldkey swap blockchain sourcecode](https://github.com/opentensor/subtensor/blob/main/pallets/subtensor/src/swap/swap_coldkey.rs). + +:::info coldkey swap vs transfers +Coldkey swaps are only necessary if you need to migrate a coldkey with subnet ownerships or registrations. + +If you only hold and stake TAO, you do not need to perform a coldkey swap. Instead, simply transfer your staked and unstaked TAO to the new coldkey. For more information, see [`btcli wallet transfer`](../btcli/btcli.md#btcli-wallet-transfer) and [`btcli stake transfer --all`](../btcli/btcli.md#btcli-stake-transfer). + +::: + +## Introduction + +The coldkey swap mechanism provides a secure way to switch to a new coldkey, if you feel the secrecy of your wallet's coldkey secret key needs to be improved. + +Because they are such sensitive operations a security perspective, coldkey swaps unfold in several careful stages: + +1. Initiation/Announcement + +In the first step, the coldkey owner initiates the swap by making an announcement on the blockchain that the swap will occur. This triggers a mandatory waiting period, during which the wallet is locked to prevent operations such as transfers or staking. During this phase, the coldkey can only reannounce a coldkey swap, execute a swap or dispute a swap. + +At this initiation step, the coldkey owner provides the destination wallet address, which remains private, as only a hash is published to the blockchain. + +2. Pending Period + +Next, a pending or lock-out period must elapse, during which the swap can be disputed but not finalized. + +Currently the waiting/locked period is **36,000 blocks** (~ **5 days**). + +3. Disputation or Finalization + 1. [Disputing a coldkey swap](#dispute-a-coldkey-swap) prevents the execution of the swap and completely blocks the coldkey from performing any operations. At this point, the triumvirate is required to resolve the dispute. The coldkey private key is required to dispute a swap. + 1. If the Pending Period expires without the swap being disputed, the coldkey owner must finalize the swap by again providing the destination coldkey. The blockchain verifies that this key matches the recorded hash before proceeding. + +![Coldkey swap flow diagram](/img/docs/coldkey-swap.png) + + + +:::info notes + +- If the destination coldkey already has an existing identity, it will be preserved rather than being overwritten, and the assets of the source wallet will be transferred/merged into this existing wallet. +- The cost for a coldkey swap transaction is **0.1 TAO**. This must be available in the source coldkey when the swap is announced. Upon successful execution all assets are migrated to the destination coldkey. This includes all TAO, all stake in subnets, control of any hotkeys, and any subnet ownership. + +::: + +:::tip Prevent emergencies with proxies +Coldkey swaps are needed when a coldkey has been compromised/leaked, that is, if it is possible that someone else could have copied or recorded it in some way and can reproduce it. If someone gains your coldkey private key, they can take all of your wallet's assets, so any possibility of a compromise should be taken seriously. + +To limit the opportunity to compromise your most valuable coldkey, you can use another wallet as a **proxy.** With a properly configured proxy (a `ProxyType` limited to specific actions, and non-zero delay), even if an attacker gains access to your proxy wallet, they cannot immediately drain your funds—the delay gives you time to detect and reject unauthorized transactions. + +For high-value wallets, consider setting up a `Staking` proxy for regular staking operations instead of using your coldkey directly. + +See [Proxies: Overview](./proxies/index.md) to learn how to protect your coldkey proactively. +::: + +## Prerequisites + +To follow along with the below examples: + +- You must own the source coldkey to be swapped. +- A destination (new) coldkey public key. +- To safely experiment with this and other blockchain operations, you can deploy a your own + instance of Subtensor (Bittensor's blockchain component). + +:::warning +Confirm the identity of the destination coldkey. A mistake here can result in loss of all of the source coldkey's assets and identity. + +- If you are rotating the coldkey to maintain ownership, you must control the destination coldkey privatekey. Otherwise you will lose control over all of the source coldkey's assets and identity. +- If you are transferring ownership to someone else, confirm that they have secure control of the destination coldkey private key. +- The destination coldkey should not have any existing associations with hotkeys on-chain, which may result in unexpected consequences. + ::: + +## Check pending (announced) coldkey swaps + +You can fetch a list of all pending coldkey swaps, or check a paricular coldkey for pending swaps: + +You can check the details of all coldkey swap announcements, or announcements associated with a particular coldkey. This allows you to verify that your announcement is active while inspecting the committed hash and the target block for execution. + + + + + +Run the following command to check coldkey swaps using BTCLI. Replace `WALLET_NAME` with the source coldkey address, or use `--all` instead. + +```bash +btcli wallets swap-check --wallet-name WALLET_NAME +``` + +
+ Show sample output + +```sh +Enter wallet name or SS58 address (leave blank to show all pending announcements): alice + + Pending Coldkey Swap Announcements + Current Block: 115 + + Coldkey ┃ New Coldkey Hash ┃ Execution Block ┃ Time Remaining ┃ Status +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━ + 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY │ 0x94772f97f5...ae2160 │ 36111 │ 4d 23h │ Pending + + +``` + +
+ +
+ +Fetch the current coldkey swap announcement (if any) by calling `get_coldkey_swap_announcement`. Set `WALLET_NAME` to a wallet on disk that holds the coldkey you want to query, or replace `coldkey_ss58` with any coldkey SS58 address. + +```py +import bittensor as bt + +subtensor = bt.Subtensor(network="local") +wallet = bt.Wallet(name="WALLET_NAME") + +response = subtensor.get_coldkey_swap_announcement( + coldkey_ss58=wallet.coldkeypub.ss58_address +) + +print(response) +``` + + +
+ +## Announce a coldkey swap + +Before swapping a coldkey, users must first announce their intention to swap coldkeys by providing the new coldkey and then wait the required delay interval before executing the swap. + +To announce a coldkey swap: + + + + + +Run the following command to announce a coldkey swap using BTCLI. Set `WALLET_NAME` to your source wallet name (or SS58 address) and `DESTINATION_COLDKEY` to the destination coldkey SS58 address. + +```bash +btcli wallets swap-coldkey announce \ +--wallet-name WALLET_NAME \ +--new-coldkey DESTINATION_COLDKEY +``` + +
+ Show sample output + + + +```sh +Wallet selected: Wallet (Name: 'alice', Hotkey: 'default', Path: '/Users/chidera/.bittensor/wallets/') + + +New coldkey wallet: Wallet (Name: 'swap-test', Hotkey: 'default', Path: '/Users/chidera/.bittensor/wallets/') + +Using the specified network local from config +[19:16:41] Warning: Verify your local subtensor is running on port 9944. subtensor_interface.py:91 + + Announcing Coldkey Swap + + Item ┃ Value +━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + Current Coldkey │ 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY + New Coldkey │ 5FHqAJM9jtVccTctCVmEvxzzm6qeA2yfbqcLFZLMipRKS1cB + New Coldkey Hash │ 0x278149779b423b9294031351e042580000f6f0bce1fbf3a217a27be977c6d080 + Swap Cost │ ‎0.1000 τ‎ +Delay Before Execution│ 5d +──────────────────────┼──────────────────────────────────────────────────────────────────── + │ +Are you sure you want to continue? [y/n] (n): y +✅ Successfully announced coldkey swap + +✅ Your extrinsic has been included as 208-2 + + Coldkey Swap Announced + + Item ┃ Value +━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + Original Coldkey │ 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY + New Coldkey │ 5FHqAJM9jtVccTctCVmEvxzzm6qeA2yfbqcLFZLMipRKS1cB + New Coldkey Hash │ 0x278149779b423b9294031351e042580000f6f0bce1fbf3a217a27be977c6d080 + Execution Block │ 258 +Time Until Executable│ 4d 23h +─────────────────────┼──────────────────────────────────────────────────────────────────── + │ + +After the delay, run: +btcli wallet swap-coldkey execute --new-coldkey 5FHqAJM9jtVccTctCVmEvxzzm6qeA2yfbqcLFZLMipRKS1cB +``` + + +
+
+ +Announce a coldkey swap (starts the mandatory waiting period) by submitting `announce_coldkey_swap`. Set `WALLET_NAME` to your source wallet name on disk and `DESTINATION_COLDKEY` to the destination coldkey SS58 address. + +```py +import bittensor as bt + +subtensor = bt.Subtensor(network="local") +wallet = bt.Wallet(name="WALLET_NAME") + +new_coldkey_ss58 = "DESTINATION_COLDKEY" + +# Announce the coldkey swap +response = subtensor.announce_coldkey_swap( + wallet=wallet, + new_coldkey_ss58=new_coldkey_ss58, + wait_for_inclusion=True, + wait_for_finalization=True, +) +print(response) + +``` + + +
+ +:::info reannouncing coldkey swaps +A coldkey swap can be reannounced only after the [ColdkeySwapReannouncementDelay](https://github.com/opentensor/subtensor/blob/devnet-ready/runtime/src/lib.rs#:~:text=pub%20const%20InitialColdkeySwapReannouncementDelay) has passed. By default, this is 7,200 blocks (~1 day) after the initial announcement delay period expires. Reannouncing will overwrite the existing announcement and reset the mandatory waiting period before execution. +::: + +## Execute/finalize a coldkey swap + +After the announcement waiting period has passed, the source coldkey can now execute the swap to finalize the process. Attempting to execute a coldkey swap before the announcement delay period has passed will return an error. + +To execute a coldkey swap: + + + + + +Run the following command to execute a coldkey swap using BTCLI. Set `WALLET_NAME` to your source wallet name (or SS58 address) and `DESTINATION_COLDKEY` to the destination coldkey SS58 address. + +```bash +btcli wallets swap-coldkey execute \ +--wallet-name WALLET_NAME \ +--new-coldkey DESTINATION_COLDKEY +``` + +
+ Show sample output + +```sh +Wallet selected: Wallet (Name: 'alice', Hotkey: 'default', Path: '/Users/chidera/.bittensor/wallets/') + +New coldkey wallet: Wallet (Name: 'swap-test', Hotkey: 'default', Path: '/Users/chidera/.bittensor/wallets/') + +Using the specified network local from config +[18:59:12] Warning: Verify your local subtensor is running on port 9944. subtensor_interface.py:91 + + Executing Coldkey Swap + + Item ┃ Value +━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + Current Coldkey │ 5Gxhv5iZGBvvR6YJeEdLmvZ7hSHbE6FdHc43fLqMVkhki7j4 + New Coldkey │ 5G4HAHNfT3TFvXMi53LLCR4vsBbSeKXUPsBycDtfbkroMVP9 +─────────────────┼────────────────────────────────────────────────── + │ + +WARNING: This action is irreversible. All assets will be transferred. + +Are you sure you want to continue? [y/n] (n): y +Decrypting... + +✅ Successfully executed coldkey swap! +✅ Your extrinsic has been included as 39386-2 + + Coldkey Swap Completed + + Item ┃ Value +━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + Old Coldkey │ 5Gxhv5iZGBvvR6YJeEdLmvZ7hSHbE6FdHc43fLqMVkhki7j4 + New Coldkey │ 5G4HAHNfT3TFvXMi53LLCR4vsBbSeKXUPsBycDtfbkroMVP9 +─────────────────┼────────────────────────────────────────────────── + │ + +All assets have been transferred to the new coldkey. +``` + +
+ +
+ +Execute/finalize an **announced** swap (once it is executable) by submitting `swap_coldkey_announced`. Set `WALLET_NAME` to your source wallet name on disk and `DESTINATION_COLDKEY` to the destination coldkey SS58 address used in the announcement. + +```py +import bittensor as bt + +subtensor = bt.Subtensor(network="local") +wallet = bt.Wallet(name="WALLET_NAME") + +new_coldkey_ss58 = "DESTINATION_COLDKEY" + +# Execute/finalize the announced swap +response = subtensor.swap_coldkey_announced( + wallet=wallet, + new_coldkey_ss58=new_coldkey_ss58, + wait_for_inclusion=True, + wait_for_finalization=True, +) +print(response) +``` + + +
+ +After executing a coldkey swap, all assets will be transferred to the destination coldkey, including TAO balance, delegated stake, and any subnet ownership. + +## Dispute a coldkey swap + +If a malicious actor announces a coldkey swap on a compromised key, the legitimate owner can trigger a dispute at any point prior to its execution to intercept the operation. This operation freezes the coldkey and prevents the attacker from completing the swap process. + +To dispute a coldkey swap: + + +Run the following command to dispute a coldkey swap using BTCLI. Set `WALLET_NAME` to your source wallet name (or SS58 address). + +```bash +btcli wallets swap-coldkey dispute --wallet-name WALLET_NAME +``` + +
+ Show sample output + +```sh +Wallet selected: Wallet (Name: 'alice', Hotkey: 'default', Path: '/Users/chidera/.bittensor/wallets/') + +Using the specified network local from config +[13:27:34] Warning: Verify your local subtensor is running on port 9944. subtensor_interface.py:91 + + Dispute Coldkey Swap + + Item ┃ Value +━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + Coldkey │ 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY + Execution Block │ 87 + Status │ Ready + Warning │ Disputing freezes the current swap process until the triumvirate can intervene. +─────────────────┼───────────────────────────────────────────────────────────────────────────────── + │ +Proceed with dispute? Your swap process will be frozen until the triumvirate can intervene. [y/n] (n): y +✅ Coldkey swap disputed. + +✅ Your extrinsic has been included as 40386-2 +``` + +
+
+ + +Dispute (freeze) an active swap announcement by submitting `dispute_coldkey_swap`. Set `WALLET_NAME` to your source wallet name on disk. + +```py +import bittensor as bt + +subtensor = bt.Subtensor(network="local") +wallet = bt.Wallet(name="WALLET_NAME") + +response = subtensor.dispute_coldkey_swap( + wallet=wallet, + wait_for_inclusion=True, + wait_for_finalization=True, +) + +print(response) + +``` + + + +
+ +:::info +The [`dispute_coldkey_swap`](https://github.com/opentensor/subtensor/blob/devnet-ready/pallets/subtensor/src/macros/dispatches.rs#:~:text=pub%20fn%20dispute_coldkey_swap) extrinsic is only callable by a coldkey with an active swap announcement. If no swap has been initiated, the process returns a [`ColdkeySwapAnnouncementNotFound`](https://github.com/opentensor/subtensor/blob/devnet-ready/pallets/subtensor/src/macros/errors.rs#:~:text=ColdkeySwapAnnouncementNotFound) error. +::: + +After a coldkey swap is disputed, the legitimate owner must contact the Triumvirate to prove ownership of the coldkey. The coldkey remains frozen until the Triumvirate resolves the dispute and [manually resets it](https://github.com/opentensor/subtensor/blob/822452f0bc205490c5ada2f2a04ad7b56ef7cc0a/pallets/subtensor/src/macros/dispatches.rs#L2470-L2490). From 35b737cc462cef67c00bd48b16940adfd73dfb13 Mon Sep 17 00:00:00 2001 From: Dera Okeke Date: Tue, 17 Mar 2026 19:51:59 +0100 Subject: [PATCH 5/9] Keep coldkey-swap doc, remove schedule variant --- docs/keys/schedule-coldkey-swap.md | 116 +++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 docs/keys/schedule-coldkey-swap.md diff --git a/docs/keys/schedule-coldkey-swap.md b/docs/keys/schedule-coldkey-swap.md new file mode 100644 index 000000000..bb3a11105 --- /dev/null +++ b/docs/keys/schedule-coldkey-swap.md @@ -0,0 +1,116 @@ +--- +title: "Rotate/Swap your Coldkey" +--- + +import ThemedImage from '@theme/ThemedImage'; +import useBaseUrl from '@docusaurus/useBaseUrl'; + +# Rotate/Swap your Coldkey + +This page describes how to _rotate_ or _swap_ the coldkey in your wallet. This is required if you suspect your coldkey has been leaked. Your coldkey secures your identity on Bittensor. + +See: + +- [Wallets, Coldkeys and Hotkeys in Bittensor](./wallets) +- [Coldkey and Hotkey Workstation Security](./coldkey-hotkey-security) + +See [code for coldkey swap](https://github.com/opentensor/subtensor/blob/main/pallets/subtensor/src/swap/swap_coldkey.rs). + +:::info coldkey swap vs transfers +Coldkey swaps are only necessary if you need to migrate a coldkey with subnet ownerships or registrations. + +If you only hold and stake TAO, you do not need to perform a coldkey swap. Instead, simply transfer your staked and unstaked TAO to the new coldkey. For more information, see [`btcli wallet transfer`](../btcli/btcli.md#btcli-wallet-transfer) and [`btcli stake transfer --all`](../btcli/btcli.md#btcli-stake-transfer). + +::: + +The schedule coldkey swap feature works as follows: + +- The schedule coldkey swap feature enables you to schedule the swapping of source coldkey to a destination coldkey. If you feel your existing coldkey is potentially compromised, then use this feature to schedule a swap to a destination coldkey. +- When you use this feature, it will not immediately swap your coldkeys and swap your TAO funds from the source coldkey to the destination coldkey. It will only schedule the swap event. +- All scheduled coldkey swaps will be executed on-chain. **Your scheduled coldkey swap will execute on the mainnet 36000 blocks (approximately 5 days) after you successfully scheduled the coldkey swap using the method described in this document.** +- The source coldkey you used in this method will be locked when you schedule the swap. After the 36000-block period is elapsed your original coldkey will be unlocked entirely. +- **Cost**: The cost of this coldkey swap transaction is 0.1 TAO. This must be available in your source coldkey. +- Any subnet ownership from your source coldkey will move to the destination coldkey. +- The delegated stake will be transferred from your source coldkey to the destination coldkey. +- For those who were staking to a validator from their source coldkey, their staking TAO will transfer to the destination coldkey. + +:::danger Do not schedule coldkey swap more than once using the same coldkey +::: + +:::warning Scheduled swaps cannot be cancelled +Once a coldkey swap has been scheduled, **it cannot be cancelled**. This is an intentional design feature; coldkey swaps must not be cancellable, because if they were, an attacker who gained access to a coldkey could use cancellation to thwart the owner's attempt to swap it. + +The delay period is intentionally long to allow those affected by the swap to access their coldkeys in order to respond. This is an issue because high-value keys (for example, coldkeys with subnet ownership or which control high value validator hotkeys) should be kept under stringent conditions of physical security, implying they cannot always be quickly accessed, for example during travel. + +::: + +## Requirements + +1. To execute this operation, you must own the source coldkey. +2. The destination (new) coldkey public key must not already be assigned to a hotkey _or a coldkey that is associated with any hotkeys_. +3. Confirm the identity of the destination coldkey. A mistake here can result in loss of all of the source coldkey's assets and identity. + - If you are rotating the coldkey to maintain ownership, you must control the destination coldkey privatekey. Otherwise you will lose control over all of the source coldkey's assets and identity. + - If you are transferring ownership to someone else, confirm that they have secure control of the destination coldkey private key. + +## Using Bittensor-CLI + +`btcli w swap-coldkey` + +## Using the [Polkadot JS extension](https://polkadot.js.org/extension/) + +1. You must import your source and destination coldkeys into the Polkadot JS extension. +2. You must connect the source coldkey account to the [polkadot.js.org/apps](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fentrypoint-finney.opentensor.ai%3A443#/explorer) website. + +:::danger If you do not do this step, then you will not see **Developer** > **Extrinsics** option on the [polkadot.js.org/apps](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fentrypoint-finney.opentensor.ai%3A443#/extrinsics) website. +::: + +## Steps for Polkadot JS + +Follow the steps shown below the screenshot: + +
+ +
+ +
+ +### Step 1: Connect to the subtensor network on Polkadot.js + +Open your web browser and navigate to the Polkadot.js Apps website (https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fentrypoint-finney.opentensor.ai%3A443#/). + +### Step 2: Navigate to the Extrinsics page + +From the top navigation menu, proceed to **Developer** > **Extrinsics** to open the Extrinsics page. If you do not see this option, then make sure you successfully imported your source coldkey into the Polkadot JS extension, and connected this source coldkey account to the Polkadot.js Apps website. + +### Step 3: Select your source coldkey account + +Locate the drop-down section labeled **using the selected account** and select your connected account. This account should be your source coldkey account. + +### Step 4: Select the `subtensorModule` + +Locate the drop-down section labeled **submit the following extrinsic** and select `subtensorModule`. + +### Step 5: Choose the `scheduleSwapColdkey` function + +After selecting the `subtensorModule`, a second drop-down menu will appear on the right side of it. From this drop-down select the `scheduleSwapColdkey` option. + +### Step 6: Provide the destination coldkey + +Provide your destination coldkey in the `newColdkey: AccountId32` field. + +### Step 7: Submit the transaction + +Check again that you have provided the correct source and destination coldkeys. + +Scroll down to the bottom of the page and click on the **Submit Transaction** button. Polkadot.js will prompt you to sign the transaction using the selected account. After you sign the transaction, the signed transaction will be broadcast to the Subtensor. + +## Verify + +Your scheduled coldkey swap will execute on the mainnet 36000 blocks after you successfully scheduled the coldkey swap using the above method. Check your destination coldkey after approximately 5 days to verify. From 5b65af1ed469f155e00e3540439c163610cee883 Mon Sep 17 00:00:00 2001 From: Dera Okeke Date: Tue, 17 Mar 2026 19:55:02 +0100 Subject: [PATCH 6/9] check fix --- docs/keys/schedule-coldkey-swap.md | 116 ----------------------------- 1 file changed, 116 deletions(-) delete mode 100644 docs/keys/schedule-coldkey-swap.md diff --git a/docs/keys/schedule-coldkey-swap.md b/docs/keys/schedule-coldkey-swap.md deleted file mode 100644 index bb3a11105..000000000 --- a/docs/keys/schedule-coldkey-swap.md +++ /dev/null @@ -1,116 +0,0 @@ ---- -title: "Rotate/Swap your Coldkey" ---- - -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -# Rotate/Swap your Coldkey - -This page describes how to _rotate_ or _swap_ the coldkey in your wallet. This is required if you suspect your coldkey has been leaked. Your coldkey secures your identity on Bittensor. - -See: - -- [Wallets, Coldkeys and Hotkeys in Bittensor](./wallets) -- [Coldkey and Hotkey Workstation Security](./coldkey-hotkey-security) - -See [code for coldkey swap](https://github.com/opentensor/subtensor/blob/main/pallets/subtensor/src/swap/swap_coldkey.rs). - -:::info coldkey swap vs transfers -Coldkey swaps are only necessary if you need to migrate a coldkey with subnet ownerships or registrations. - -If you only hold and stake TAO, you do not need to perform a coldkey swap. Instead, simply transfer your staked and unstaked TAO to the new coldkey. For more information, see [`btcli wallet transfer`](../btcli/btcli.md#btcli-wallet-transfer) and [`btcli stake transfer --all`](../btcli/btcli.md#btcli-stake-transfer). - -::: - -The schedule coldkey swap feature works as follows: - -- The schedule coldkey swap feature enables you to schedule the swapping of source coldkey to a destination coldkey. If you feel your existing coldkey is potentially compromised, then use this feature to schedule a swap to a destination coldkey. -- When you use this feature, it will not immediately swap your coldkeys and swap your TAO funds from the source coldkey to the destination coldkey. It will only schedule the swap event. -- All scheduled coldkey swaps will be executed on-chain. **Your scheduled coldkey swap will execute on the mainnet 36000 blocks (approximately 5 days) after you successfully scheduled the coldkey swap using the method described in this document.** -- The source coldkey you used in this method will be locked when you schedule the swap. After the 36000-block period is elapsed your original coldkey will be unlocked entirely. -- **Cost**: The cost of this coldkey swap transaction is 0.1 TAO. This must be available in your source coldkey. -- Any subnet ownership from your source coldkey will move to the destination coldkey. -- The delegated stake will be transferred from your source coldkey to the destination coldkey. -- For those who were staking to a validator from their source coldkey, their staking TAO will transfer to the destination coldkey. - -:::danger Do not schedule coldkey swap more than once using the same coldkey -::: - -:::warning Scheduled swaps cannot be cancelled -Once a coldkey swap has been scheduled, **it cannot be cancelled**. This is an intentional design feature; coldkey swaps must not be cancellable, because if they were, an attacker who gained access to a coldkey could use cancellation to thwart the owner's attempt to swap it. - -The delay period is intentionally long to allow those affected by the swap to access their coldkeys in order to respond. This is an issue because high-value keys (for example, coldkeys with subnet ownership or which control high value validator hotkeys) should be kept under stringent conditions of physical security, implying they cannot always be quickly accessed, for example during travel. - -::: - -## Requirements - -1. To execute this operation, you must own the source coldkey. -2. The destination (new) coldkey public key must not already be assigned to a hotkey _or a coldkey that is associated with any hotkeys_. -3. Confirm the identity of the destination coldkey. A mistake here can result in loss of all of the source coldkey's assets and identity. - - If you are rotating the coldkey to maintain ownership, you must control the destination coldkey privatekey. Otherwise you will lose control over all of the source coldkey's assets and identity. - - If you are transferring ownership to someone else, confirm that they have secure control of the destination coldkey private key. - -## Using Bittensor-CLI - -`btcli w swap-coldkey` - -## Using the [Polkadot JS extension](https://polkadot.js.org/extension/) - -1. You must import your source and destination coldkeys into the Polkadot JS extension. -2. You must connect the source coldkey account to the [polkadot.js.org/apps](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fentrypoint-finney.opentensor.ai%3A443#/explorer) website. - -:::danger If you do not do this step, then you will not see **Developer** > **Extrinsics** option on the [polkadot.js.org/apps](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fentrypoint-finney.opentensor.ai%3A443#/extrinsics) website. -::: - -## Steps for Polkadot JS - -Follow the steps shown below the screenshot: - -
- -
- -
- -### Step 1: Connect to the subtensor network on Polkadot.js - -Open your web browser and navigate to the Polkadot.js Apps website (https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fentrypoint-finney.opentensor.ai%3A443#/). - -### Step 2: Navigate to the Extrinsics page - -From the top navigation menu, proceed to **Developer** > **Extrinsics** to open the Extrinsics page. If you do not see this option, then make sure you successfully imported your source coldkey into the Polkadot JS extension, and connected this source coldkey account to the Polkadot.js Apps website. - -### Step 3: Select your source coldkey account - -Locate the drop-down section labeled **using the selected account** and select your connected account. This account should be your source coldkey account. - -### Step 4: Select the `subtensorModule` - -Locate the drop-down section labeled **submit the following extrinsic** and select `subtensorModule`. - -### Step 5: Choose the `scheduleSwapColdkey` function - -After selecting the `subtensorModule`, a second drop-down menu will appear on the right side of it. From this drop-down select the `scheduleSwapColdkey` option. - -### Step 6: Provide the destination coldkey - -Provide your destination coldkey in the `newColdkey: AccountId32` field. - -### Step 7: Submit the transaction - -Check again that you have provided the correct source and destination coldkeys. - -Scroll down to the bottom of the page and click on the **Submit Transaction** button. Polkadot.js will prompt you to sign the transaction using the selected account. After you sign the transaction, the signed transaction will be broadcast to the Subtensor. - -## Verify - -Your scheduled coldkey swap will execute on the mainnet 36000 blocks after you successfully scheduled the coldkey swap using the above method. Check your destination coldkey after approximately 5 days to verify. From 91d4092c05c07608cc056fa68734b29d532ff2db Mon Sep 17 00:00:00 2001 From: Dera Okeke Date: Tue, 17 Mar 2026 21:12:20 +0100 Subject: [PATCH 7/9] revert fix --- docs/errors/subtensor.md | 36 ++++-- docs/governance/senators-btcli-guide.md | 2 +- docs/keys/coldkey-hotkey-security.md | 7 +- docs/keys/proxies/pure-proxies.md | 48 ++------ docs/keys/proxies/working-with-proxies.md | 16 +-- docs/keys/schedule-coldkey-swap.md | 116 ------------------ docs/learn/price-protection.md | 18 +-- docs/miners/miners-btcli-guide.md | 2 +- .../stakers-btcli-guide.md | 2 +- docs/subnets/subnet-creators-btcli-guide.md | 2 +- docs/subnets/subnet-hyperparameters.md | 8 +- .../subtensor-storage-query-examples.md | 28 ++--- docs/validators/validators-btcli-guide.md | 2 +- docusaurus.config.js | 22 ++-- sidebars.js | 2 +- static/img/docs/coldkey-swap.png | Bin 0 -> 40141 bytes 16 files changed, 75 insertions(+), 236 deletions(-) delete mode 100644 docs/keys/schedule-coldkey-swap.md create mode 100644 static/img/docs/coldkey-swap.png diff --git a/docs/errors/subtensor.md b/docs/errors/subtensor.md index e96df4c61..13a35b02d 100644 --- a/docs/errors/subtensor.md +++ b/docs/errors/subtensor.md @@ -102,10 +102,6 @@ New coldkey is hotkey. The coldkey has already been swapped. -### `ColdkeyIsInArbitration` - -The coldkey is in arbitration. - ### `UnableToRecoverPublicKey` Public key cannot be recovered. @@ -498,13 +494,33 @@ PoW hash seal does not match work. Faucet is disabled. -### `SwapAlreadyScheduled` +### ColdkeySwapAnnounced + +A coldkey swap has been announced for this account. + +### ColdkeySwapDisputed + +A coldkey swap for this account is under dispute. + +### `ColdkeySwapAnnouncementNotFound` + +Coldkey swap announcement not found -Swap already scheduled. +### `ColdkeySwapTooEarly` -### `FailedToSchedule` +Coldkey swap too early. -Failed to schedule swap. +### `ColdkeySwapReannouncedTooEarly` + +Coldkey swap reannounced too early. + +### `AnnouncedColdkeyHashDoesNotMatch` + +The announced coldkey hash does not match the new coldkey hash. + +### `ColdkeySwapAlreadyDisputed` + +Coldkey swap already disputed. ### `InvalidIdentity` @@ -545,3 +561,7 @@ Wallet not authorized. Ensure that the account has the correct root or subnet ow ### `InvalidValue` Generic error for out-of-range parameter value + +### `Deprecated` + +Deprecated call. diff --git a/docs/governance/senators-btcli-guide.md b/docs/governance/senators-btcli-guide.md index 0d897ed9d..fe1c902d0 100644 --- a/docs/governance/senators-btcli-guide.md +++ b/docs/governance/senators-btcli-guide.md @@ -27,4 +27,4 @@ See: [Senate](./senate). If you suspect your coldkey may have been leaked, you can request to swap it out of your wallet, using an extrinsic blockchain transaction. This operation has a 5 day waiting period, during which your coldkey will be locked. The cost of this coldkey swap transaction is 0.1 TAO. -See [Rotate/Swap your Coldkey](../keys/schedule-coldkey-swap) +See [Rotate/Swap your Coldkey](../keys/coldkey-swap) diff --git a/docs/keys/coldkey-hotkey-security.md b/docs/keys/coldkey-hotkey-security.md index 24caf74ea..749828056 100644 --- a/docs/keys/coldkey-hotkey-security.md +++ b/docs/keys/coldkey-hotkey-security.md @@ -2,7 +2,7 @@ title: "Coldkey and Hotkey Workstation Security" --- -import { SecurityWarning } from "./_security-warning.mdx"; +import { SecurityWarning } from "./\_security-warning.mdx"; # Coldkey and Hotkey Workstation Security @@ -98,7 +98,7 @@ Even on a minimal or air-gapped machine, follow standard security hygiene: If you suspect your coldkey may have been leaked, you can request to swap it out of your wallet, using an extrinsic blockchain transaction. This operation has a 5 day waiting period, during which your coldkey will be locked. The cost of this coldkey swap transaction is 0.1 TAO. -See [Rotate/Swap your Coldkey](./schedule-coldkey-swap) +See [Rotate/Swap your Coldkey](./coldkey-swap) Effectively, this transfers all of your TAO and alpha stake balances, as well as your `sudo` control over any subnets you have created: @@ -115,16 +115,17 @@ Effectively, this transfers all of your TAO and alpha stake balances, as well as **Proxies are one of the most effective tools for protecting your coldkey** while maintaining operational flexibility. By setting up proxy relationships, you can perform routine operations like staking without exposing your coldkey to any online environment. Key benefits: + - **Least-privilege permissions**: Configure proxies with only the specific permissions needed (e.g., `Staking` type for stake management only) - **Time-delayed operations**: Set a non-zero delay so you have time to reject unauthorized transactions if a proxy is compromised - **Coldkey stays in cold storage**: Your high-value coldkey never needs to leave secure offline storage for day-to-day operations - :::warning Zero-delay proxies A proxy with `delay: 0` and `ProxyType: Any` offers **no additional security** over direct coldkey access. Always use the narrowest `ProxyType` possible and consider adding delays for high-value operations. ::: See: + - [Proxies: Overview](./proxies/index.md) - [Working with Proxies](./proxies/working-with-proxies.md) - [Staking with a Proxy](./proxies/staking-with-proxy.md) diff --git a/docs/keys/proxies/pure-proxies.md b/docs/keys/proxies/pure-proxies.md index ba62f489b..31a2591eb 100644 --- a/docs/keys/proxies/pure-proxies.md +++ b/docs/keys/proxies/pure-proxies.md @@ -31,13 +31,7 @@ It is critical to understand that pure proxies do not offer the security advanta ### Transaction flow in pure proxies -All transactions involving a pure proxy must be signed by the spawner account. Once signed, the transaction is executed on-chain as if it originated directly from the pure proxy. Unlike standard proxies, a pure proxy must hold its own funds to cover the transaction value. The spawner then acts as an _Any proxy_, signing and authorizing calls and paying transaction fees, while the balance used for the call comes from the pure proxy’s account. - -:::info Transaction fees -By default, the spawner account covers the transaction fee when a proxy is executed. However, if the value of the proxy relationship's `realPaysFee` parameter has been set to `True`, the transaction fees will be covered by the pure proxy account when a proxy is executed. - -For more information, see [Transaction fee payment](./index.md#transaction-fee-payment) -::: +All transactions involving a pure proxy must be signed by the spawner account. Once signed, the transaction is executed on-chain as if it originated directly from the pure proxy. Unlike standard proxies, a pure proxy must hold its own funds to cover fees or transfers. The spawner then acts as an _Any proxy_, handling the signing and authorization of calls, but the balance used comes from the pure proxy's account. ### Multisigs and Pure Proxies @@ -155,19 +149,7 @@ response = subtensor.create_pure_proxy( index=0, # the disambiguation index, leave as zero ) -if response.success: - pure_account = response.data.get("pure_account") - spawner_address = response.data.get("spawner") - height = response.data.get("height") - ext_index = response.data.get("ext_index") - - print(f"✓ Pure proxy created!") - print(f" Pure proxy address: {pure_account}") - print(f" Spawner: {spawner_address}") - print(f" Block: {height}") - print(f" Extrinsic index: {ext_index}") -else: - print(f"✗ Failed: {response.message}") +print(response) ``` :::tip @@ -250,11 +232,8 @@ btcli wallet transfer \ --amount 1.0 ``` -:::warning Pure proxy account must be funded -Ensure the pure proxy account holds enough funds to cover the transaction value. Attempting to perform a proxy operation without funding the pure proxy account with return a `FundsUnavailable` error. - -You can transfer funds to the pure proxy account using the `btcli wallet transfer` command in your terminal. - +:::warning Pure proxy must be funded +Ensure the pure proxy account has enough funds to cover both the transfer amount and transaction fees. Transfer funds to the pure proxy first using a regular transfer. ::: **Other operations through pure proxies:** @@ -305,11 +284,7 @@ response = subtensor.proxy( call=transfer_call, ) -if response.success: - print(f"✓ Transfer executed through proxy!") - print(f" Transferred {transfer_amount} from {proxy_account[:10]}...") -else: - print(f"✗ Failed: {response.message}") +print(response) ``` :::info Building a call @@ -331,10 +306,8 @@ Balances(subtensor).transfer_keep_alive(...) ::: -:::warning Pure proxy account must be funded -Ensure the pure proxy account holds enough funds to cover the transaction value. Attempting to perform a proxy operation without funding the pure proxy account with return a `FundsUnavailable` error. - -You can transfer funds to the pure proxy account using the `btcli wallet transfer` command in your terminal. +:::warning +Ensure the pure proxy account holds enough funds to cover both the transfer and transaction fees. ::: @@ -356,7 +329,7 @@ You can transfer funds to the pure proxy account using the `btcli wallet transfe :::info - After submitting the transaction, check the Polkadot.JS web app's **Explorer** page for a `balances.Transfer` event. Notice the sender is the pure proxy account. -- Ensure the pure proxy account holds enough funds to cover the transaction value. +- Ensure the pure proxy account holds enough funds to cover both the transfer and transaction fees. ::: @@ -462,10 +435,7 @@ response = subtensor.kill_pure_proxy( ext_index=ext_index, # the extrinsic index of the `Proxy.PureCreated` transaction ) -if response.success: - print("✓ Pure proxy killed successfully!") -else: - print(f"✗ Failed: {response.message}") +print(response) ``` :::info Parameter requirements diff --git a/docs/keys/proxies/working-with-proxies.md b/docs/keys/proxies/working-with-proxies.md index e80726a26..35f1ec635 100644 --- a/docs/keys/proxies/working-with-proxies.md +++ b/docs/keys/proxies/working-with-proxies.md @@ -328,11 +328,7 @@ response = subtensor.proxy( call=transfer_call, ) -if response.success: - print(f"✓ Transfer executed through proxy!") - print(f" Transferred {transfer_amount} from {real_account[:10]}...") -else: - print(f"✗ Failed: {response.message}") +print(response) ``` :::info Building a call @@ -445,10 +441,7 @@ response = subtensor.remove_proxy( delay=0, # must match the delay value set when the proxy was added ) -if response.success: - print("✓ Proxy removed successfully!") -else: - print(f"✗ Failed: {response.message}") +print(response) ``` @@ -497,10 +490,7 @@ real_account = bt.Wallet(name="sn-creator") response = subtensor.remove_proxies(wallet=real_account) -if response.success: - print(f"✓ All proxies removed!") -else: - print(f"✗ Failed: {response.message}") +print(response) ``` diff --git a/docs/keys/schedule-coldkey-swap.md b/docs/keys/schedule-coldkey-swap.md deleted file mode 100644 index bb3a11105..000000000 --- a/docs/keys/schedule-coldkey-swap.md +++ /dev/null @@ -1,116 +0,0 @@ ---- -title: "Rotate/Swap your Coldkey" ---- - -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -# Rotate/Swap your Coldkey - -This page describes how to _rotate_ or _swap_ the coldkey in your wallet. This is required if you suspect your coldkey has been leaked. Your coldkey secures your identity on Bittensor. - -See: - -- [Wallets, Coldkeys and Hotkeys in Bittensor](./wallets) -- [Coldkey and Hotkey Workstation Security](./coldkey-hotkey-security) - -See [code for coldkey swap](https://github.com/opentensor/subtensor/blob/main/pallets/subtensor/src/swap/swap_coldkey.rs). - -:::info coldkey swap vs transfers -Coldkey swaps are only necessary if you need to migrate a coldkey with subnet ownerships or registrations. - -If you only hold and stake TAO, you do not need to perform a coldkey swap. Instead, simply transfer your staked and unstaked TAO to the new coldkey. For more information, see [`btcli wallet transfer`](../btcli/btcli.md#btcli-wallet-transfer) and [`btcli stake transfer --all`](../btcli/btcli.md#btcli-stake-transfer). - -::: - -The schedule coldkey swap feature works as follows: - -- The schedule coldkey swap feature enables you to schedule the swapping of source coldkey to a destination coldkey. If you feel your existing coldkey is potentially compromised, then use this feature to schedule a swap to a destination coldkey. -- When you use this feature, it will not immediately swap your coldkeys and swap your TAO funds from the source coldkey to the destination coldkey. It will only schedule the swap event. -- All scheduled coldkey swaps will be executed on-chain. **Your scheduled coldkey swap will execute on the mainnet 36000 blocks (approximately 5 days) after you successfully scheduled the coldkey swap using the method described in this document.** -- The source coldkey you used in this method will be locked when you schedule the swap. After the 36000-block period is elapsed your original coldkey will be unlocked entirely. -- **Cost**: The cost of this coldkey swap transaction is 0.1 TAO. This must be available in your source coldkey. -- Any subnet ownership from your source coldkey will move to the destination coldkey. -- The delegated stake will be transferred from your source coldkey to the destination coldkey. -- For those who were staking to a validator from their source coldkey, their staking TAO will transfer to the destination coldkey. - -:::danger Do not schedule coldkey swap more than once using the same coldkey -::: - -:::warning Scheduled swaps cannot be cancelled -Once a coldkey swap has been scheduled, **it cannot be cancelled**. This is an intentional design feature; coldkey swaps must not be cancellable, because if they were, an attacker who gained access to a coldkey could use cancellation to thwart the owner's attempt to swap it. - -The delay period is intentionally long to allow those affected by the swap to access their coldkeys in order to respond. This is an issue because high-value keys (for example, coldkeys with subnet ownership or which control high value validator hotkeys) should be kept under stringent conditions of physical security, implying they cannot always be quickly accessed, for example during travel. - -::: - -## Requirements - -1. To execute this operation, you must own the source coldkey. -2. The destination (new) coldkey public key must not already be assigned to a hotkey _or a coldkey that is associated with any hotkeys_. -3. Confirm the identity of the destination coldkey. A mistake here can result in loss of all of the source coldkey's assets and identity. - - If you are rotating the coldkey to maintain ownership, you must control the destination coldkey privatekey. Otherwise you will lose control over all of the source coldkey's assets and identity. - - If you are transferring ownership to someone else, confirm that they have secure control of the destination coldkey private key. - -## Using Bittensor-CLI - -`btcli w swap-coldkey` - -## Using the [Polkadot JS extension](https://polkadot.js.org/extension/) - -1. You must import your source and destination coldkeys into the Polkadot JS extension. -2. You must connect the source coldkey account to the [polkadot.js.org/apps](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fentrypoint-finney.opentensor.ai%3A443#/explorer) website. - -:::danger If you do not do this step, then you will not see **Developer** > **Extrinsics** option on the [polkadot.js.org/apps](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fentrypoint-finney.opentensor.ai%3A443#/extrinsics) website. -::: - -## Steps for Polkadot JS - -Follow the steps shown below the screenshot: - -
- -
- -
- -### Step 1: Connect to the subtensor network on Polkadot.js - -Open your web browser and navigate to the Polkadot.js Apps website (https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fentrypoint-finney.opentensor.ai%3A443#/). - -### Step 2: Navigate to the Extrinsics page - -From the top navigation menu, proceed to **Developer** > **Extrinsics** to open the Extrinsics page. If you do not see this option, then make sure you successfully imported your source coldkey into the Polkadot JS extension, and connected this source coldkey account to the Polkadot.js Apps website. - -### Step 3: Select your source coldkey account - -Locate the drop-down section labeled **using the selected account** and select your connected account. This account should be your source coldkey account. - -### Step 4: Select the `subtensorModule` - -Locate the drop-down section labeled **submit the following extrinsic** and select `subtensorModule`. - -### Step 5: Choose the `scheduleSwapColdkey` function - -After selecting the `subtensorModule`, a second drop-down menu will appear on the right side of it. From this drop-down select the `scheduleSwapColdkey` option. - -### Step 6: Provide the destination coldkey - -Provide your destination coldkey in the `newColdkey: AccountId32` field. - -### Step 7: Submit the transaction - -Check again that you have provided the correct source and destination coldkeys. - -Scroll down to the bottom of the page and click on the **Submit Transaction** button. Polkadot.js will prompt you to sign the transaction using the selected account. After you sign the transaction, the signed transaction will be broadcast to the Subtensor. - -## Verify - -Your scheduled coldkey swap will execute on the mainnet 36000 blocks after you successfully scheduled the coldkey swap using the above method. Check your destination coldkey after approximately 5 days to verify. diff --git a/docs/learn/price-protection.md b/docs/learn/price-protection.md index 823cf6e4b..6ca966517 100644 --- a/docs/learn/price-protection.md +++ b/docs/learn/price-protection.md @@ -2,7 +2,7 @@ title: "Understand Price Protection" --- -import { SdkVersion } from "../sdk/_sdk-version.mdx"; +import { SdkVersion } from "../sdk/\_sdk-version.mdx"; # Understand Price Protection @@ -13,6 +13,7 @@ Other users' transactions can affect the token price, even while your transactio It is therefore important to carefully manage price protection when staking and unstaking real value liquidity, i.e. on mainnet ("finney"). For additional protection against MEV attacks, consider using [MEV Shield](../sdk/mev-protection.md) to encrypt your transactions. ## Price Protection Modes + ### Strict Safe Mode (Default) In this mode, the transaction is **rejected entirely** if executing it would push the final market price beyond the tolerance threshold from the price when you submitted the transaction. Tolerance threshold can be specified but is 5% by default. @@ -339,19 +340,6 @@ def demonstrate_protection_modes(): ) print(response) - - if response.success: - # Check if it should have failed - post_subnet_info = subtensor.subnet(netuid=netuid) - post_safe_price = post_subnet_info.price.tao - print(f"Final price: {post_safe_price:.6f} TAO/α") - print(f"Price ceiling was: {price_ceiling:.6f} TAO/α") - - if post_safe_price > price_ceiling: - print(f"🚨 BUG: Transaction succeeded but price ({post_safe_price:.6f}) > ceiling ({price_ceiling:.6f})") - else: - print(f"Price stayed within tolerance: {post_safe_price:.6f} ≤ {price_ceiling:.6f}") - print(f"Actual price increase: {((post_safe_price - pre_safe_price) / pre_safe_price) * 100:.3f}%") except Exception as e: if "Price exceeded tolerance limit" in str(e) or "exceeded tolerance" in str(e) or "tolerance" in str(e).lower(): @@ -425,7 +413,7 @@ def demonstrate_protection_modes(): actual_amount_executed = balance_before.tao - balance_after.tao print(response) - + if response.success: print(f"Amount requested: {very_large_amount} TAO") print(f"Amount actually executed: {actual_amount_executed:.3f} TAO") diff --git a/docs/miners/miners-btcli-guide.md b/docs/miners/miners-btcli-guide.md index 322d98aa2..ffb8371fd 100644 --- a/docs/miners/miners-btcli-guide.md +++ b/docs/miners/miners-btcli-guide.md @@ -69,4 +69,4 @@ Miners will need coldkeys to manage their TAO and alpha currency, as well as hot If you suspect your coldkey may have been leaked, you can request to swap it out of your wallet, using an extrinsic blockchain transaction. This operation has a 5 day waiting period, during which your coldkey will be locked. The cost of this coldkey swap transaction is 0.1 TAO. -See [Rotate/Swap your Coldkey](../keys/schedule-coldkey-swap) +See [Rotate/Swap your Coldkey](../keys/coldkey-swap) diff --git a/docs/staking-and-delegation/stakers-btcli-guide.md b/docs/staking-and-delegation/stakers-btcli-guide.md index a006cb4bf..e9cf720c7 100644 --- a/docs/staking-and-delegation/stakers-btcli-guide.md +++ b/docs/staking-and-delegation/stakers-btcli-guide.md @@ -63,4 +63,4 @@ See: If you suspect your coldkey may have been leaked, you can request to swap it out of your wallet, using an extrinsic blockchain transaction. This operation has a 5 day waiting period, during which your coldkey will be locked. The cost of this coldkey swap transaction is 0.1 TAO. -See [Rotate/Swap your Coldkey](../keys/schedule-coldkey-swap) +See [Rotate/Swap your Coldkey](../keys/coldkey-swap) diff --git a/docs/subnets/subnet-creators-btcli-guide.md b/docs/subnets/subnet-creators-btcli-guide.md index cab7f0bc6..e235e7dd0 100644 --- a/docs/subnets/subnet-creators-btcli-guide.md +++ b/docs/subnets/subnet-creators-btcli-guide.md @@ -35,4 +35,4 @@ Configure your subnet's hyperparameters with `btcli sudo set`. Requires the cold If you suspect your coldkey may have been leaked, you can request to swap it out of your wallet, using an extrinsic blockchain transaction. This operation has a 5 day waiting period, during which your coldkey will be locked. The cost of this coldkey swap transaction is 0.1 TAO. -See [Rotate/Swap your Coldkey](../keys/schedule-coldkey-swap) +See [Rotate/Swap your Coldkey](../keys/coldkey-swap) diff --git a/docs/subnets/subnet-hyperparameters.md b/docs/subnets/subnet-hyperparameters.md index 5f227cb32..4d8699f95 100644 --- a/docs/subnets/subnet-hyperparameters.md +++ b/docs/subnets/subnet-hyperparameters.md @@ -904,15 +904,15 @@ Toggles the consensus mechanism used by the subnet between Yuma Consensus v2 and The following variables are global and/or can only be configured with `root` permissions, which are held by a triumvirate of Opentensor Foundation employees. They are listed here for reference. -### ColdkeySwapScheduleDuration +### ColdkeySwapAnnouncementDelay **Type**: u12 -**Default**: +**Default**: `36000` **`btcli` setter**: no -**Setter extrinsic**: `sudo_set_coldkey_swap_schedule_duration` +**Setter extrinsic**: `sudo_set_coldkey_swap_announcement_delay` **Permissions required to set**: Root @@ -920,7 +920,7 @@ The following variables are global and/or can only be configured with `root` per The duration in blocks of the waiting period before a coldkey swap. -See [Rotate/Swap your Coldkey](../keys/schedule-coldkey-swap) +See [Rotate/Swap your Coldkey](../keys/coldkey-swap) diff --git a/docs/subtensor-nodes/subtensor-storage-query-examples.md b/docs/subtensor-nodes/subtensor-storage-query-examples.md index e0d23b284..70a518322 100644 --- a/docs/subtensor-nodes/subtensor-storage-query-examples.md +++ b/docs/subtensor-nodes/subtensor-storage-query-examples.md @@ -461,23 +461,10 @@ import { SdkVersion } from "../sdk/_sdk-version.mdx"; result = substrate.query('SubtensorModule', 'CKBurn') print(result.value) ``` -## 28. ColdkeySwapRescheduleDuration -- **Description**: Storage for ColdkeySwapRescheduleDuration. -- **Query Type**: `u32` -- **Parameters**: None -- **Default Value**: `0` -- **Python Example**: - ```python - from async_substrate_interface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") +## 29. ColdkeySwapAnnouncements - result = substrate.query('SubtensorModule', 'ColdkeySwapRescheduleDuration') - print(result.value) - ``` -## 29. ColdkeySwapScheduled - -- **Description**: Storage for ColdkeySwapScheduled. +- **Description**: Storage for ColdkeySwapAnnouncements. - **Query Type**: `u16 -> AccountId` - **Parameters**: - `coldkey`: `AccountId` @@ -489,12 +476,12 @@ import { SdkVersion } from "../sdk/_sdk-version.mdx"; from bittensor_wallet import Keypair coldkey = Keypair.create_from_uri('//Bob').ss58_address - result = substrate.query('SubtensorModule', 'ColdkeySwapScheduled', [coldkey]) + result = substrate.query('SubtensorModule', 'ColdkeySwapAnnouncements', [coldkey]) print(result.value) ``` -## 30. ColdkeySwapScheduleDuration +## 30. ColdkeySwapAnnouncementDelay -- **Description**: The block duration for which a coldkey swap schedule must wait before execution. +- **Description**: The number of blocks that must pass after a coldkey swap is announced before it can be executed. - **Query Type**: `u32` - **Parameters**: None - **Default Value**: `36000` @@ -503,7 +490,7 @@ import { SdkVersion } from "../sdk/_sdk-version.mdx"; from async_substrate_interface import SubstrateInterface substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - result = substrate.query('SubtensorModule', 'ColdkeySwapScheduleDuration') + result = substrate.query('SubtensorModule', 'ColdkeySwapAnnouncementDelay') print(result.value) ``` ## 31. CommitRevealWeightsEnabled @@ -1451,7 +1438,7 @@ import { SdkVersion } from "../sdk/_sdk-version.mdx"; - **Description**: Network rate limit. - **Query Type**: `u64` - **Parameters**: None -- **Default Value**: `7200` +- **Default Value**: `14400` - **Python Example**: ```python from async_substrate_interface import SubstrateInterface @@ -3025,4 +3012,3 @@ import { SdkVersion } from "../sdk/_sdk-version.mdx"; result = substrate.query('SubtensorModule', 'Yuma3On', [netuid]) print(result.value) ``` - diff --git a/docs/validators/validators-btcli-guide.md b/docs/validators/validators-btcli-guide.md index c100c9207..4f032964c 100644 --- a/docs/validators/validators-btcli-guide.md +++ b/docs/validators/validators-btcli-guide.md @@ -54,4 +54,4 @@ To set weights, a validator must meet several requirements. See [Requirements fo If you suspect your coldkey may have been leaked, you can request to swap it out of your wallet, using an extrinsic blockchain transaction. This operation has a 5 day waiting period, during which your coldkey will be locked. The cost of this coldkey swap transaction is 0.1 TAO. -See [Rotate/Swap your Coldkey](../keys/schedule-coldkey-swap) +See [Rotate/Swap your Coldkey](../keys/coldkey-swap) diff --git a/docusaurus.config.js b/docusaurus.config.js index 75e167cc3..8d8505d36 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -73,15 +73,15 @@ const config = { "@docusaurus/plugin-client-redirects", { redirects: [ - { - "to": "/keys/proxies/working-with-proxies", - "from": "/keys/proxies/create-proxy" + { + to: "/keys/proxies/working-with-proxies", + from: "/keys/proxies/create-proxy", }, - { - "to": "/subnets/understanding-multiple-mech-subnets", - "from": "/subnets/understanding-sub-subnets" + { + to: "/subnets/understanding-multiple-mech-subnets", + from: "/subnets/understanding-sub-subnets", }, - { + { to: "/liquidity-positions/", from: "/liquidity-provider", }, @@ -101,10 +101,6 @@ const config = { from: "/subnets/register-validate-mine", to: "/validators", }, - { - to: "/keys/schedule-coldkey-swap", - from: "/subnets/schedule-coldkey-swap", - }, { to: "/sdk/bt-api-ref", from: "/reference/bittensor-api-ref", @@ -125,6 +121,10 @@ const config = { from: "/questions-and-answers", to: "/resources/questions-and-answers", }, + { + to: "/keys/coldkey-swap", + from: "/keys/schedule-coldkey-swap", + }, { from: "/emissions", to: "/learn/emissions", diff --git a/sidebars.js b/sidebars.js index 1d00d2e74..7a2b5ddf3 100644 --- a/sidebars.js +++ b/sidebars.js @@ -97,7 +97,7 @@ const sidebars = { ], }, "keys/multisig", - "keys/schedule-coldkey-swap", + "keys/coldkey-swap", ], }, diff --git a/static/img/docs/coldkey-swap.png b/static/img/docs/coldkey-swap.png new file mode 100644 index 0000000000000000000000000000000000000000..82abe2554f73b994e331f43544fce11fc4bae3cc GIT binary patch literal 40141 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 literal 0 HcmV?d00001 From 3864fc11c4fc957fcedf4167456ada6327246b55 Mon Sep 17 00:00:00 2001 From: Dera Okeke Date: Wed, 18 Mar 2026 21:30:55 +0100 Subject: [PATCH 8/9] updated doc --- docs/keys/proxies/pure-proxies.md | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/docs/keys/proxies/pure-proxies.md b/docs/keys/proxies/pure-proxies.md index 31a2591eb..e5cdbb02a 100644 --- a/docs/keys/proxies/pure-proxies.md +++ b/docs/keys/proxies/pure-proxies.md @@ -31,7 +31,13 @@ It is critical to understand that pure proxies do not offer the security advanta ### Transaction flow in pure proxies -All transactions involving a pure proxy must be signed by the spawner account. Once signed, the transaction is executed on-chain as if it originated directly from the pure proxy. Unlike standard proxies, a pure proxy must hold its own funds to cover fees or transfers. The spawner then acts as an _Any proxy_, handling the signing and authorization of calls, but the balance used comes from the pure proxy's account. +All transactions involving a pure proxy must be signed by the spawner account. Once signed, the transaction is executed on-chain as if it originated directly from the pure proxy. Unlike standard proxies, a pure proxy must hold its own funds to cover the transaction value. The spawner then acts as an _Any proxy_, signing and authorizing calls and paying transaction fees, while the balance used for the call comes from the pure proxy’s account. + +:::info Transaction fees +By default, the spawner account covers the transaction fee when a proxy is executed. However, if the value of the proxy relationship's `realPaysFee` parameter has been set to `True`, the transaction fees will be covered by the pure proxy account when a proxy is executed. + +For more information, see [Transaction fee payment](./index.md#transaction-fee-payment) +::: ### Multisigs and Pure Proxies @@ -232,8 +238,11 @@ btcli wallet transfer \ --amount 1.0 ``` -:::warning Pure proxy must be funded -Ensure the pure proxy account has enough funds to cover both the transfer amount and transaction fees. Transfer funds to the pure proxy first using a regular transfer. +:::warning Pure proxy account must be funded +Ensure the pure proxy account holds enough funds to cover the transaction value. Attempting to perform a proxy operation without funding the pure proxy account with return a `FundsUnavailable` error. + +You can transfer funds to the pure proxy account using the `btcli wallet transfer` command in your terminal. + ::: **Other operations through pure proxies:** @@ -306,8 +315,10 @@ Balances(subtensor).transfer_keep_alive(...) ::: -:::warning -Ensure the pure proxy account holds enough funds to cover both the transfer and transaction fees. +:::warning Pure proxy account must be funded +Ensure the pure proxy account holds enough funds to cover the transaction value. Attempting to perform a proxy operation without funding the pure proxy account with return a `FundsUnavailable` error. + +You can transfer funds to the pure proxy account using the `btcli wallet transfer` command in your terminal. ::: @@ -329,7 +340,7 @@ Ensure the pure proxy account holds enough funds to cover both the transfer and :::info - After submitting the transaction, check the Polkadot.JS web app's **Explorer** page for a `balances.Transfer` event. Notice the sender is the pure proxy account. -- Ensure the pure proxy account holds enough funds to cover both the transfer and transaction fees. +- Ensure the pure proxy account holds enough funds to cover the transaction value. ::: From 80b126dfe394bdac4ac7022e44f4e7242af01eae Mon Sep 17 00:00:00 2001 From: Dera Okeke Date: Sun, 22 Mar 2026 12:46:15 +0100 Subject: [PATCH 9/9] update --- docs/keys/coldkey-swap.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/keys/coldkey-swap.md b/docs/keys/coldkey-swap.md index 22556767e..e32f3abcb 100644 --- a/docs/keys/coldkey-swap.md +++ b/docs/keys/coldkey-swap.md @@ -32,7 +32,7 @@ Because they are such sensitive operations a security perspective, coldkey swaps 1. Initiation/Announcement -In the first step, the coldkey owner initiates the swap by making an announcement on the blockchain that the swap will occur. This triggers a mandatory waiting period, during which the wallet is locked to prevent operations such as transfers or staking. During this phase, the coldkey can only reannounce a coldkey swap, execute a swap or dispute a swap. +In the first step, the coldkey owner initiates the swap by making an announcement on the blockchain that the swap will occur. This triggers a mandatory waiting period, during which the wallet is locked to prevent operations such as transfers or staking. During this phase, the coldkey can only execute or dispute a swap. At this initiation step, the coldkey owner provides the destination wallet address, which remains private, as only a hash is published to the blockchain.