# set-weights (/docs/tx/set-weights)

The one entry point validators need for scoring miners: it conforms the
weights to the subnet's hyperparameters (max-weight clip, u16 quantization,
minimum weight count) and submits via whichever path the subnet runs — a
plain `set_weights` when commit-reveal is off, or a timelock-encrypted
commit (auto-revealed by the chain at the drand reveal round) when it is on.
Signed by the hotkey, which must be registered on the subnet. Before
signing it preflights registration and the rate limit, so those failures
are caught fast with the same error the chain would return; the rate-limit
error says how many blocks to wait. The chain additionally enforces checks
that are not preflighted: the hotkey must hold the minimum stake to set
weights, must hold a validator permit to set non-self weights (the subnet
owner is exempt), and `version_key` must not be older than the subnet's
required version. Prefer this over `commit_weights`/`reveal_weights`
unless you specifically need to force one path.

| Signer   | Pallet          | Wraps                                                                                          |
| -------- | --------------- | ---------------------------------------------------------------------------------------------- |
| `hotkey` | SubtensorModule | `SubtensorModule.set_mechanism_weights`, `SubtensorModule.commit_timelocked_mechanism_weights` |

## Parameters [#parameters]

| Parameter     | Type             | Required | Description                                                                                                                                                                                                                           |
| ------------- | ---------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `netuid`      | integer          | yes      | Subnet whose miners the weights score.                                                                                                                                                                                                |
| `uids`        | array of integer | no       | Miner UIDs being weighted, as a list parallel to weights. Omit when weights is given as a uid-to-weight mapping.                                                                                                                      |
| `weights`     | array of number  | no       | Relative weight per miner: either a JSON object mapping uid to weight, or a list parallel to uids. Values are relative, not absolute; they are clipped to the subnet's max-weight limit, normalized, and quantized before submission. |
| `mechid`      | integer          | no       | Mechanism index within the subnet. 0 is the default (and for most subnets the only) mechanism.                                                                                                                                        |
| `version_key` | integer          | no       | Weights version key checked against the subnet's required version. Leave 0 unless the subnet owner requires a specific value.                                                                                                         |

Address parameters (`--hotkey`, `--coldkey`, `--dest`, ...) accept a raw ss58
address, an address-book or proxy-book name, or a local wallet/hotkey name.

## CLI [#cli]

Preview with `--dry-run` (shows fee, effects, and policy result without
submitting), then submit:

```bash
btcli tx set-weights \
  --netuid <int> --dry-run
btcli tx set-weights \
  --netuid <int> -w my_coldkey
```

## Python [#python]

```python
import bittensor as sub
from bittensor.wallet import Wallet

wallet = Wallet(name="my_coldkey", hotkey="my_hotkey")
intent = sub.SetWeights(netuid=1)

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:

```python
await client.execute_tool("set_weights", {...}, wallet)
```
