EVM, btcli, and Reliability
What shipped
Spec version 445 is a release about the surfaces people reach the chain through. Its own summary is that it 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 the interfaces that already existed; a saved multisig behaves like an ordinary wallet throughout btcli; an automated dry run carries enough information to approve and replay a transaction safely; and a Ledger user can read the actual fields of a limit order before signing it. Underneath those interfaces, it says, the release recycles transaction fees and corrects transaction-pool validation, proxy charging, commitment cleanup, storage growth and finality. [source]
The source for this page is one document: the project's own release note, titled "EVM, btcli, and Reliability" and dated August 2026. It is an interested party's account of its own work — so what follows reports what that note says rather than repeating it as established fact. [source]
The EVM work is the largest piece, and the release describes its goal as completing the deterministic, typed runtime surface an EVM caller is authorized to use. Five new domain addresses expose system state that previously needed a Substrate client or a duplicated constant — the scheduler, the randomness beacon, the runtime timestamp, the runtime's own configuration, and a registry of whether a precompile is currently disabled. The precompiles that already existed gain 68 state-changing methods and 67 typed views, across staking, neurons, subnets, alpha, balances, proxies, leasing, crowdloans, slot lookup, voting power and transfers. [source] [source]
What did not happen matters as much. The release's coverage audit inventories the deliberate exclusions — Root-only, unsigned, inherent, disabled and compatibility-only calls — and it states the principle behind them: those are not made reachable by pretending an EVM caller has a stronger origin than it does. Every state-changing method dispatches the highest-level runtime call as the mapped EVM signer, and the pallet still enforces ownership, role, rate limits, freeze windows and every other authorization rule. [source] [source]
What it changes for the ecosystem
For anyone writing contracts this is the largest change on the page, and it arrives with three specific chores. Refresh the complete canonical ABI set rather than reconstructing selectors from the release notes; add the five new addresses only from the published interfaces; and re-estimate gas for the aggregate staking reads, because three of them now scan more stake records and cost more, with unchanged selectors and return values that will not warn you. The release's blunt version of that last point is not to rely on fixed gas stipends. [source] [source] [source]
For teams that hold keys together, the multisig stops being a workflow you translate by hand. Save a signer set once and pass its name wherever a coldkey wallet is accepted: reads resolve the derived account, and a write selects a local member, wraps the intended call, finds an existing approval round and supplies its timepoint, so a co-signer completes the round by running the same command rather than assembling low-level approvals. Lesson 10 noted that the privileged protocol-level changes still possible on this chain are dispatched by a multisig of foundation-held keys rather than by stake; this release is about the tooling every other multisig holder has to live in. Alongside it, secret-bearing flags now warn that their values are visible in shell history and the process list, with a hidden prompt available instead. [source] [source]
For anything automated — an agent, a policy engine, or a human reviewing a plan before signing it — the dry run is now a document rather than a paragraph of prose. Asking for a dry run in JSON returns the parsed arguments, the exact spend or an explicit marker that the spend is unbounded, an estimated fee, warnings, a policy verdict, and a replay command that submits the same invocation without the dry-run flags. The release's stated point is that nobody, human or machine, should have to infer intent from prose before approving a transaction. [source]
Hardware-wallet users signing limit orders get the fields instead of a hash. The v438 release let a Ledger authorize an order by signing a wrapped order hash; 445 adds an alternative clear-signing form — one canonical printable message carrying the order type, amount, subnet, limit or trigger price, expiry, hotkey, relayer policy, fee, slippage, chain identifier, partial-fill policy and signer — which the device displays before approval and the runtime deterministically rebuilds before accepting the signature. The format is additive: raw and wrapped-hash signatures remain valid, all three resolve to the same canonical order identifier, and the release says frontends should add the readable form without removing the others. [source] [source] [source]
Everyone who pays a transaction fee is affected by one line in the reliability table: native TAO fees and EVM fees are now recycled instead of paid to the block author, and eligible alpha-paid fees are sold for TAO and recycled in the same transaction. The release draws the boundary explicitly — transaction fees are separate from swap fees, and swap fees still go to the block author. The rest of that table is maintenance a reader will mostly never see: deterministic failures now get rejected during transaction validation rather than filling a block, deregistration purges the commitments, metadata and indexes a departed neuron leaves behind and releases its commitment deposit, proxy calls refund the unused part of a worst-case estimate, a bounded background migration removes obsolete pre-dTAO storage, and the Polkadot SDK is pinned to a fork revision carrying finality fixes. That deregistration cleanup is a small addition to the story lesson 11 told: losing a slot now also clears what that slot was holding on chain. [source] [source] [source] [source] [source] [source] [source]
The upgrade path is undramatic. Older clients that read current chain metadata keep using existing commands; using the new features means upgrading to the versions the release names, existing wallet files stay usable, and saved multisigs can be passed directly as a wallet argument. The one operational trap is offline signing: any payload prepared before the runtime upgrade has to be rebuilt. [source]
What to watch
One reserved field is worth reading twice. The new precompile registry populates only its "is disabled" answer in this release; its selector parameter and selector-lifecycle fields are reserved for a future extension, and the release says plainly that they must not be used to infer whether a selector exists. Supported selectors, it says, remain defined by the published interfaces and ABIs, and it undertakes that released addresses and selectors stay stable — a promise about future releases, which is not something this page or a reader can check. [source] [source]
Unverified The change with the widest blast radius is the quietest one. Recycling transaction fees instead of paying them to the block author removes a revenue line from whoever produces blocks, and this document neither quantifies that line nor discusses what it does to the economics of running a node — it only records that swap fees are unaffected. Whether transaction fees were ever material next to emission is not answerable from here, and that is exactly the question a node operator would want answered.
Unverified The second thing to watch is the failure mode of the gas change. Three aggregate staking reads keep their selectors and their return values and simply cost more, which means a deployed contract with a hard-coded gas limit does not get a type error or a clear rejection — it gets a call that used to work and now runs out of gas, in production, at whatever moment the stake record count crosses the line. The release tells integrators to re-estimate; nothing forces them to.
How it actually works
The five new precompiles
Five new domain addresses expose system state that previously required a Substrate client or duplicated constants: [source] [source] [source] [source]
0x…080f— Scheduler: scheduled calls, retry state, task addresses, and incomplete work. [source] [source] [source]0x…0810— Drand: beacon configuration, pulses, stored rounds, and unsigned timing. [source] [source] [source]0x…0811— Timestamp: the runtime timestamp, and whether it was updated in the current block. [source] [source] [source]0x…0812— Runtime configuration: chain ID and grouped economic, consensus, registration and pallet constants. [source] [source] [source]0x…0813— Precompile registry: whether a precompile is currently disabled. [source] [source] [source]
The registry and the configuration precompile are reached like any other typed interface: [source] [source] [source] [source]
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 the selector-lifecycle fields are reserved for a future extension and must not be used to infer whether a selector exists. [source]
What the existing precompiles gained
The additions across existing interfaces come to 68 state-changing methods and 67 typed views, spanning staking V2, neurons, subnets, alpha, balances, proxies, leasing, crowdloans, UID lookup, voting power and transfer surfaces — 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 what is deliberately excluded: Root-only, unsigned, inherent, disabled and compatibility-only calls are not made reachable by pretending an EVM caller has a stronger origin. [source]
The release's account of authorization is that it is unchanged by the route in: every state-changing method dispatches the highest-level runtime call as the mapped EVM signer, and the pallet still enforces ownership, role, rate limits, freeze windows and the rest. It states that released addresses and selectors remain stable, and that supported selectors remain defined by the published interfaces and ABIs. Canonical Solidity interfaces, JSON ABIs, generated Python ABI copies, documentation, gas accounting and tests ship together, and the release tells integrators to use the v445 copies rather than reconstructing selectors from release notes. New maintainer documentation fixes the rules for ABI versioning, state exposure, lifecycle metadata, coverage and backwards compatibility. [source] [source]
getTotalHotkeyStake, getTotalColdkeyStake and getTotalColdkeyStakeOnSubnet now scan more stake records, so their gas estimate is higher; selectors and return values have not changed, and contracts and services should estimate again after the upgrade rather than hard-coding limits. [source]
A multisig as a wallet
Save the signer set once, then use its name wherever a coldkey wallet is accepted: [source] [source] [source]
btcli multisig add team-treasury --threshold 2 --signatories alice,bob,carol
btcli wallet transfer --dest 5F... --amount-tao 10 -w team-treasury
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. [source]
Before signing, --dry-run --json returns the parsed arguments, the exact spend or an explicit unbounded-spend marker, the estimated fee, warnings, a policy verdict, and a replay command that submits the same invocation without the dry-run flags: [source] [source]
btcli tx transfer --dest 5F... --amount-tao 10 -w team-treasury --dry-run --json
The 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 stay aligned with their human table columns, and explicit validator details produce one consolidated JSON document. Secret-bearing flags warn that values are visible in shell history and the process list, EVM private-key export prefers the clipboard on a terminal, wallet regeneration accepts 64-byte sr25519 private keys, and keyfiles again include the legacy fields older subnet tooling expects. [source] [source]
The clear-signed order
V438 let Ledger and compatible signers authorize limit orders by signing a wrapped order hash — the v438 page covers that form. V445 adds one canonical printable message instead, which the hardware wallet displays field by field and the runtime deterministically rebuilds before accepting the signature: [source] [source]
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 ×10⁹ scale, fee and slippage use parts per billion, and expiry is a Unix timestamp in milliseconds. A frontend may show friendlier values alongside the message but must sign these exact integers. The format is additive — existing raw SCALE and wrapped-hash signatures remain valid, 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, and the release says Rust/TypeScript parity tests plus device-derived Ledger vectors lock the exact bytes, so that a frontend cannot show one order and submit another. [source] [source]
The reliability pass
The release tabulates the runtime-level corrections by area: [source] [source]
- Transaction fees — native TAO fees and EVM fees are recycled instead of paid to the block author, and eligible alpha-paid fees are sold for TAO and recycled in the same transaction. [source] [source]
- Commit transactions — deterministic failures are rejected during transaction validation, and competing commits in the same signer and rate-limit lane conflict in the pool. [source] [source]
- Neuron trimming — deregistration purges active and revealed commitments, metadata, usage and timelock indexes, and releases the associated commitment deposit. [source] [source]
- Proxy fees — proxy calls propagate the inner call's actual post-dispatch weight, refunding unused worst-case weight; this applies to
proxyandproxy_announced. [source] [source] - Storage — a bounded, resumable
on_idlemigration removes obsolete pre-dTAO prefixes and explicit zero rows, and abandoned Swap V3 state is cleared separately. [source] [source] - Voting power — a maintained subnet total avoids repeated aggregation, and neuron removal or subnet dissolution now clears the corresponding voting-power state. [source] [source]
- GRANDPA — the Polkadot SDK is pinned to fork revision
cacb4310, including warp-finality and concluded-round cleanup fixes. [source] [source]
Transaction fees are separate from swap fees, and swap fees still go to the block author. The release's own summary of the rest is that they introduce no 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. [source]
What to do
EVM integrators refresh the complete canonical ABI set before using v445 selectors, add 0x…080f through 0x…0813 only from the published interfaces, use the registry to inspect whole-precompile availability, re-estimate aggregate staking reads, and do not rely on fixed gas stipends. SDK and CLI users can keep existing commands on older clients that read current chain metadata; the new features need bittensor 11.1.0 and bittensor-core 0.1.3 alongside the runtime upgrade, existing wallet files remain usable, saved multisigs can be passed directly as -w, and any offline signing payload prepared before the upgrade must be rebuilt. Limit-order applications add the human-readable signing format without removing raw or wrapped-hash support. Signers use btcli upgrade sign --url <v445 release URL> -w <wallet> after the release train proposes. [source] [source] [source] [source]