EVM, btcli, and Reliability · August 2026
Spec 445 makes the chain substantially easier to use from every external surface. Solidity contracts gain 31 functions across five new Bittensor precompiles, plus 135 additions to existing interfaces. A saved multisig now behaves like a wallet throughout btcli. Automated dry runs carry enough information to approve and replay a transaction safely. Ledger users can read the actual fields of a limit order before signing it. Underneath those interfaces, v445 recycles transaction fees and corrects transaction-pool validation, proxy charging, commitment cleanup, storage growth, and GRANDPA finality.
The Bittensor precompile suite now covers the deterministic, typed runtime surface that an EVM caller is authorized to use. Five new domain addresses expose system state that previously required a Substrate client or duplicated constants:
| Address | Precompile | What contracts can inspect |
|---|---|---|
0x…080f | Scheduler | Scheduled calls, retry state, task addresses, and incomplete work |
0x…0810 | Drand | Beacon configuration, pulses, stored rounds, and unsigned timing |
0x…0811 | Timestamp | Runtime timestamp and whether it was updated in the current block |
0x…0812 | Runtime configuration | Chain ID and grouped economic, consensus, registration, and pallet constants |
0x…0813 | Precompile registry | Whether a precompile is currently disabled |
Existing precompiles gain 68 state-changing methods and 67 typed views across staking V2, neurons, subnets, alpha, balances, proxies, leasing, crowdloans, UID lookup, voting power, and transfer surfaces. The additions include typed registration and identity operations, weight and commitment calls, stake and collateral management, subnet configuration, global and per-subnet state, and a maintained total-voting-power view. The coverage audit inventories the deliberate exclusions: Root-only, unsigned, inherent, disabled, and compatibility-only calls are not made reachable by pretending an EVM caller has a stronger origin.
Every state-changing method dispatches the highest-level runtime call as the mapped EVM signer. The pallet still enforces ownership, role, rate limits, freeze windows, and every other authorization rule. Released addresses and selectors remain stable; the new registry gives contracts a typed way to discover whether a whole precompile is currently disabled. Supported selectors remain defined by the published interfaces and ABIs.
IPrecompileRegistry registry =
IPrecompileRegistry(0x0000000000000000000000000000000000000813);
IPrecompileRegistry.PrecompileStatus memory status =
registry.getPrecompileStatus(target, selector);
IRuntimeConfiguration config =
IRuntimeConfiguration(0x0000000000000000000000000000000000000812);
uint256 chainId = config.getEvmChainId();In v445, only the registry's isDisabled field is populated. Its selector parameter and selector-lifecycle fields are reserved for a future extension and must not be used to infer whether a selector exists.
Canonical Solidity interfaces, JSON ABIs, generated Python ABI copies, documentation, gas accounting, and tests ship together. Integrators should use the v445 copies rather than reconstructing selectors from release notes. The new maintainer documentation also fixes the rules for ABI versioning, state exposure, lifecycle metadata, coverage, and backwards compatibility so later runtime releases can extend this surface without breaking deployed contracts.
Some existing staking reads now scan more stake records, so their gas estimate is higher. The affected methods are getTotalHotkeyStake, getTotalColdkeyStake, and getTotalColdkeyStakeOnSubnet. Contracts and services should estimate these calls again after the upgrade and avoid hard-coded gas limits. The selectors and return values have not changed.
The v11 CLI no longer makes operators translate a multisig workflow into low-level approvals by hand. Save a signer set once, then pass its name wherever a coldkey wallet is accepted. Reads resolve the derived account. Writes select a local member, wrap the intended call, find an existing approval round, and supply its timepoint. A co-signer completes the round by running the same command.
btcli multisig add team-treasury --threshold 2 --signatories alice,bob,carol
# Alice opens the operation; Bob runs the identical command to complete it.
btcli wallet transfer --dest 5F... --amount-tao 10 -w team-treasuryBefore signing, --dry-run --json now returns the parsed arguments, exact spend or an explicit unbounded-spend marker, estimated fee, warnings, policy verdict, and a replay command that submits the same invocation without the dry-run flags. That makes a plan reviewable by a human, an agent, or a policy engine without asking any of them to infer intent from prose.
btcli tx transfer --dest 5F... --amount-tao 10 -w team-treasury --dry-run --jsonThe same release improves everyday staking: stake add shows free balance, accepts all, offers local hotkeys without requiring the target to live on disk, and accepts pasted or address-book targets. stake burn joins the normal command tree with a price-aware default. Names resolve inside raw-call JSON, multisig approvals fail early when the signer cannot cover the deposit and fee, and wrapper order is preserved so intent safety survives multisig dispatch. Root position rows now stay aligned with their human table columns, and explicit validator details produce one consolidated JSON document.
Secret-bearing flags now warn that values are visible in shell history and the process list; omitting them uses a hidden prompt. EVM private-key export prefers the clipboard on a terminal, and wallet regeneration accepts 64-byte sr25519 private keys. Keyfiles once again include the legacy fields expected by older subnet tooling, while the reader tolerates older encodings and gives specific guidance for browser and mobile exports. The complete operational flow is in the multisig guide.
V438 let Ledger and compatible signers authorize limit orders by signing a wrapped order hash. V445 adds an alternative clear-signing form: one canonical printable message containing the order type, amount, subnet, limit or trigger price, expiry, hotkey, relayer policy, fee, slippage, chain ID, partial-fill policy, and signer. The hardware wallet displays those fields before approval, and the runtime deterministically rebuilds the same message before accepting the signature.
TAO.com order v1: Limit buy <amount> on subnet <netuid>,
limit price <price>, expiry <unix timestamp ms>, hotkey <ss58>, fee <rate> to <ss58>,
relayer <policy>, max slippage <value>, chain <id>,
partial fills <true|false>, signer <ss58>The signed message uses raw integer units: amount is rao for a buy and raw alpha units for a sell; price uses a ×109 scale; fee and slippage use parts per billion; and expiry is a Unix timestamp in milliseconds. Frontends may show friendlier values alongside the message, but must sign these exact integers.
This format is additive. Existing raw SCALE signatures and wrapped-hash signatures remain valid, and every format resolves to the same canonical order ID for replay protection, cancellation, relayer restrictions, and partial fills. Sr25519 and ed25519 remain supported; ECDSA remains rejected. Rust and TypeScript parity tests plus device-derived Ledger vectors lock the exact bytes so a frontend cannot show one order and submit another.
| Area | Change in v445 |
|---|---|
| Transaction fees | Native TAO fees and EVM fees are recycled instead of paid to the block author. Eligible alpha-paid fees are sold for TAO and recycled in the same transaction. |
| Commit transactions | Deterministic failures are rejected during transaction validation; competing commits in the same signer and rate-limit lane conflict in the pool. |
| Neuron trimming | Deregistration purges active and revealed commitments, metadata, usage and timelock indexes, and releases the associated commitment deposit. |
| Proxy fees | Proxy calls propagate the inner call's actual post-dispatch weight, refunding unused worst-case weight. This applies to proxy and proxy_announced. |
| Storage | A bounded, resumable on_idle migration removes obsolete pre-dTAO prefixes and explicit zero rows; abandoned Swap V3 state is cleared separately. |
| Voting power | A maintained subnet total avoids repeated aggregation, and neuron removal or subnet dissolution now clears the corresponding voting-power state. |
| GRANDPA | The Polkadot SDK is pinned to fork revision cacb4310, including warp-finality and concluded-round cleanup fixes. |
Transaction fees are separate from swap fees; swap fees still go to the block author. The other changes do not introduce new operator workflows. They move predictable failures out of blocks, stop deleted identities from leaving chargeable state behind, return overestimated proxy weight, and keep historical defaults from accumulating forever.
0x…080f through 0x…0813 only from the published interfaces, and use the registry to inspect whole-precompile availability. Re-estimate aggregate staking reads and do not rely on fixed gas stipends.bittensor 11.1.0 and bittensor-core 0.1.3 alongside the runtime upgrade. Existing wallet files remain usable, and saved multisigs can now be passed directly as -w. Rebuild any offline signing payload prepared before the runtime upgrade.Signers: after the release train proposes, use btcli upgrade sign --url <v445 release URL> -w <wallet>.