Transactions

set-subnet-emission-weights

Set slots of a subnet's emission weight vector (btcli `subnets emission`).

View as Markdown

Dispatches AdminUtils.sudo_set_subnet_emission_weights for the named slots. The signer must be the subnet's owner coldkey (root may also call it). With renormalize the untouched owner/validator/miner slots are rescaled so the vector still sums to one; without it the merged vector is submitted as given. Every accepted set makes the chain re-solve the subnet's effective TAO weight so root stakers earn their baseline share of emission (what they would earn with the default validator share and the global TaoWeight) — the pre-sign plan shows that share and the resulting weight, and lists every rule the chain would reject (including a validator share too low to reach the baseline), so a bad vector is caught before signing. Owners may change the vector once per week per subnet.

SignerOriginPalletWraps
coldkeysubnet ownerAdminUtilsAdminUtils.sudo_set_subnet_emission_weights

Verify

After inclusion, confirm the effect with the subnet-emission-weights read:

btcli query subnet-emission-weights --netuid <integer> --json

Parameters

ParameterTypeRequiredDescription
netuidintegeryesSubnet to configure; the signer must be its owner.
slotsarray of ['integer', 'string']yesSlots to set, by name or uid: 0 burn, 1 recycle, 2 owner, 3 validator, 4 miner. Omitted owner/validator/miner slots keep their current share; omitted burn/recycle are zero.
valuesarray of ['integer', 'number', 'string']yesNew share for each slot, pairwise with slots: a 0..1 fraction (0.41), a percentage ("41%"), or raw u64 parts of 2^64-1. Rules: burn = recycle = 0; owner <= 33% (>= 18% on lease-created subnets); validator <= 50% and high enough that root's baseline share of emission is reachable (see btcli subnets emission show); miner >= 33%; all five sum to exactly 1.
renormalizebooleannoKeep the named slots as given and rescale the other owner/validator/miner slots proportionally so the vector sums to 1 (the miner slot absorbs rounding). Without it, the update is applied verbatim and must already sum to 1.

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 set-subnet-emission-weights \
  --netuid <int> \
  --slots <a,b,c> \
  --values <a,b,c> --dry-run
btcli tx set-subnet-emission-weights \
  --netuid <int> \
  --slots <a,b,c> \
  --values <a,b,c> -w my_coldkey

Python

import bittensor as bt
from bittensor.wallet import Wallet

wallet = Wallet(name="my_coldkey", hotkey="my_hotkey")
intent = bt.SetSubnetEmissionWeights(netuid=1, slots=[...], values=[...])

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("set_subnet_emission_weights", {...}, wallet)

On-chain implementation

AdminUtils.sudo_set_subnet_emission_weights — pallets/admin-utils/src/lib.rs#L2694:

#[pallet::call_index(114)]
#[pallet::weight(<T as Config>::WeightInfo::sudo_set_subnet_emission_weights())]
pub fn sudo_set_subnet_emission_weights(
    origin: OriginFor<T>,
    netuid: NetUid,
    uids: Vec<u16>,
    values: Vec<u64>,
) -> DispatchResult {
    let maybe_owner = pallet_subtensor::Pallet::<T>::ensure_sn_owner_or_root_with_limits(
        origin,
        netuid,
        &[Hyperparameter::EmissionWeights.into()],
    )?;
    pallet_subtensor::Pallet::<T>::ensure_admin_window_open(netuid)?;

    pallet_subtensor::Pallet::<T>::do_set_subnet_emission_weights(netuid, uids, values)?;

    pallet_subtensor::Pallet::<T>::record_owner_rl(
        maybe_owner,
        netuid,
        &[Hyperparameter::EmissionWeights.into()],
    );
    Ok(())
}

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