Skip to main content
SUBMIT A PRSUBMIT AN ISSUElast edit: Feb 13, 2025

Bittensor 9.0 Migration Guide

This page notes breaking changes for the Bittensor Python SDK v9.0. This version supports Dynamic TAO, a major evolution of the Bittensor network's tokenomic architecture.

See: Dynamic TAO: What to expect.

Contents:

See: Concurrency with AyncIO and AsyncSubtensor

Subtensor: removed functions

get_account_next_index

This was only used for getting nonce, which can be achieved with subtensor.substrate.get_account_next_index(hotkey.ss58_address).

get_prometheus_info

We no longer use prometheus info.

get_total_stake_for_coldkey

Not compatible with Dynamic TAO.

Replaced with get_stake, which returns a staked balance for a coldkey, hotkey pair on a specific subnet.

get_total_stake_for_coldkeys

Not compatible with Dynamic TAO.

Replaced with get_stake, which returns a staked balance for a coldkey, hotkey pair on a specific subnet.

get_total_stake_for_hotkey

Not compatible with Dynamic TAO.

Replaced with get_stake, which returns a staked balance for a coldkey, hotkey pair on a specific subnet.

get_total_stake_for_hotkeys

Not compatible with Dynamic TAO.

Replaced with get_stake, which returns a staked balance for a coldkey, hotkey pair on a specific subnet.

Subtensor: type changes

__init__

No longer takes connection_timeout or websocket args. This is due to py-substrate-interface being re-written as async-substrate-interface.

amount

All Subtensor methods that accept an amount arg now accept it only as a Balance object, rather than the previous Union[Balance, int, float].

New helper functions, tao and rao in bittensor.utils.balance, return a balance object from the given Tao or Rao amount.

These methods include the following, and their associated extrinsics:

  • transfer
  • unstake
  • add_stake
  • move_stake
  • swap_stake
  • transfer_stake
  • get_transfer_fee

For example, where transfer previously accepted float for the amount, it now takes a Balance object, which can be created on the fly:

Previously:

from bittensor.core.subtensor import Subtensor

subtensor = Subtensor()
subtensor.transfer(wallet, destination, 1.0)

Now written as:

from bittensor.core.subtensor import Subtensor
from bittensor.utils.balance import tao, rao

subtensor = Subtensor()
subtensor.transfer(wallet, destination, tao(1.0))
# or
subtensor.transfer(wallet, destination, rao(1000000000))

consolidation of arg label: block

There were some cases where the block arg was called block_number or block_id. This is standardised, and now all block args are called block.

get_block_hash

No longer requires block arg, will fetch the latest block if not specified.

get_stake_for_coldkey_and_hotkey

Arg order has changed. It now takes (coldkey, hotkey) to align with the method name.

In addition, to accomodate changes to staking in dynamic TAO, the function now also accepts an optional list of netuids to check for stake, and returns a dict[int, StakeInfo], where int is the netuid. If netuids is left as None, all netuids are fetched.

get_subnet_reveal_period_epochs

Type hint is updated to reflect it always returns an int, rather than an Optional[int].

query_runtime_api

Now accepts params as Any, returns Any. This is due to an update in bt-decode and async-substrate-interface that allows for arbitrary decoding of runtime calls.

get_subnet_burn_cost

Now returns an Optional[Balance] object rather than Optional[int] (previously it gave rao int)

get_children

Now returns tuple[bool, list[tuple[float, str]], str] instead of tuple[bool, list[tuple[int, str]], str], as the proportions are now normalised floats.

AsyncSubtensor

AsyncSubtensor and Subtensor now have all and only the same methods.

Check out the wiki entry on Concurrency in Bittensor to learn more.

py-substrate-interface replaced with async-substrate-interface

py-substrate-interface has been completely removed as a requirement, and has been rewritten as async-substrate-interface.

While the main goal of this project was initially just providing an AsyncIO-compatible version of py-substrate-interface for our use in btcli and AsyncSubtensor, we noticed a lot of room for improvement, so we wrote not only the async part, but also a synchronous part. We aimed to be as API-compatible as possible, but there are a few differences (mainly in runtime calls).

async-substrate-interface is its own standalone package, as is a requirement for bittensor and btcli, replacing py-substrate-interface.

While we do practically all the decoding now through bt-decode, we still use py-scale-codec for a few SCALE encodings. This package will also eventually be replaced by an updated version of bt-decode.

Check out the wiki entry on Concurrency in Bittensor to learn more.