Skip to content

Release v444: remove miner-burn scaling from subnet emission shares - #3058

Merged
UnArbosFive merged 74 commits into
mainfrom
release-444
Aug 10, 2026
Merged

Release v444: remove miner-burn scaling from subnet emission shares#3058
UnArbosFive merged 74 commits into
mainfrom
release-444

Conversation

@unarbos

@unarbos unarbos commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Summary

Release v444 bundles runtime, EVM, SDK/CLI, transaction-fee, storage, proxy, commitments, limit-order, and GRANDPA fixes.

Changes

Emission shares: remove miner-burn scaling

  • Removes the (1 - MinerBurned) weighting from subnet emission shares.
  • Subnet shares are now determined by price EMA through the emission gate.
  • Miner incentive recycling and MinerBurned bookkeeping remain unchanged.

Recycle transaction fees instead of rewarding block authors (#3053)

  • Native TAO fees and tips are recycled by reducing issuance instead of being paid to block authors.
  • Alpha-paid fees swap to TAO and recycle atomically.
  • EVM base and priority fees use the same recycling path.

Complete EVM precompile implementation (#3018)

  • Adds Scheduler (0x80f), Drand (0x810), Timestamp (0x811), RuntimeConfiguration (0x812), and PrecompileRegistry (0x813), with 31 functions across the five new addresses.
  • Adds 68 state-changing methods and 67 typed views across existing precompiles.
  • State-changing calls dispatch as the mapped EVM signer so pallet authorization and rate limits remain enforced.
  • Adds Solidity interfaces, generated Python ABIs, tests, and the total-voting-power migration.
  • Existing aggregate staking reads keep their selectors and return values but require new gas estimates; integrators should avoid hard-coded gas limits.

EVM precompile documentation and maintenance tooling (#2998)

  • Adds documentation for the deployed precompile surface, coverage, ABI lifecycle, state exposure, and backwards compatibility.
  • Adds maintenance guidance for keeping precompiles synchronized with runtime functionality.

btcli v11, SDK compatibility, and alpha-fee fixes (#3052)

  • Adds multisig wallet-name support, improved stake UX, machine-readable --dry-run --json plans, secret hygiene, call-name resolution, and multisig funding preflight.
  • Fixes CheckNonce so alpha-only coldkeys can use the alpha fee fallback.
  • Restores compatibility with legacy SDK keyfile fields.
  • Existing metadata-aware reads and transactions remain compatible. Use bittensor 11.1.0 alongside the runtime upgrade for the new v444 SDK/CLI features, and rebuild offline signing payloads prepared before spec 444.
  • Includes the root CLI output fixes from fix(cli): align root output shapes #3037.

GRANDPA finality fixes and polkadot-sdk pin (#3055)

  • Pins workspace polkadot-sdk dependencies to fork revision cacb4310.
  • Includes the GRANDPA warp-finality and concluded-round cleanup fixes.

Reject deterministic commitment failures before block inclusion (#3040)

  • Prevalidates set_commitment subnet existence and registration.
  • Applies commit-rate validation to timelocked and CRv3 mechanism weight commits.
  • Uses the correct subnet/mechanism rate-limit lane.
  • Adds transaction-pool conflict tags so competing commits from the same signer/lane cannot coexist.

Remove empty and obsolete storage entries (#3061)

  • Adds a bounded, resumable Subtensor state cleanup executed from on_idle.
  • Removes obsolete pre-dTAO prefixes and explicit zero/default rows while preserving live nonzero state.
  • Cleans abandoned Swap V3 prefixes and zero reservoir entries.
  • Persists migration progress and prevents completed migrations from restarting.

Purge commitments when neurons are trimmed (#3062)

  • Removes commitment state when a neuron is deregistered by reducing a subnet's max_uids.
  • Purges active/revealed commitments, metadata, usage tracking, timelock-index entries, and associated deposits.
  • Leaves normal UID replacement behavior unchanged.

Refund unused weight for proxied calls (#3063)

  • Propagates inner-call post-dispatch weight from proxy and proxy_announced.
  • Transaction payment now charges the actual inner-call weight plus proxy overhead instead of the full worst-case declared weight.
  • Preserves LastCallResult and ProxyExecuted behavior.

Human-readable Ledger limit orders (#3002)

  • Adds an additive human-readable signing format for limit orders.
  • Hardware-wallet users can verify the actual order fields instead of signing only an opaque order hash.
  • Documents the raw units for amount, price, fee, slippage, and millisecond expiry.
  • Preserves the existing raw and wrapped signing formats.
  • Keeps replay protection tied to the canonical order ID regardless of signing mechanism.
  • Adds Rust and TypeScript parity, execution, and Ledger signing-vector tests.

Release plumbing

Release

  • Mainnet clone upgrade + migration rehearsal
  • Devnet deploy + smoke
  • Testnet approval + smoke
  • Mainnet multisig ceremony

girazoki and others added 30 commits June 29, 2026 09:28

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AI review — see the sticky summary comment for the verdict and the inline comments below for specific findings.

}

let mut totals = BTreeMap::<NetUid, u64>::new();
for (netuid, _, voting_power) in VotingPower::<T>::iter() {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[HIGH] Runtime upgrade scans the complete voting-power map

VotingPower::<T>::iter() performs an unbounded synchronous scan from on_runtime_upgrade. The returned weight is calculated only after all entries have already been read, so it cannot prevent upgrade execution from exceeding the block limit as this map grows. Convert this to a bounded, resumable migration with a persisted cursor and explicit per-block budget.

@github-actions

Copy link
Copy Markdown
Contributor

🔄 AI review updated — Skeptic: VULNERABLE

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AI review — see the sticky summary comment for the verdict and the inline comments below for specific findings.

}

let mut totals = BTreeMap::<NetUid, u64>::new();
for (netuid, _, voting_power) in VotingPower::<T>::iter() {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[HIGH] Runtime upgrade scans the complete voting-power map

VotingPower::<T>::iter() performs an unbounded synchronous scan during on_runtime_upgrade, while also accumulating every subnet total in memory. Existing state size therefore controls both execution weight and memory use, potentially preventing the runtime upgrade from completing. Convert this to a bounded, resumable migration with persistent progress, and mark it complete only after the final batch.

@github-actions

Copy link
Copy Markdown
Contributor

🔄 AI review updated — Skeptic: VULNERABLE

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AI review — see the sticky summary comment for the verdict and the inline comments below for specific findings.

}

let mut totals = BTreeMap::<NetUid, u64>::new();
for (netuid, _, voting_power) in VotingPower::<T>::iter() {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[HIGH] Runtime upgrade scans the complete voting-power map

This iterates every VotingPower entry synchronously during on_runtime_upgrade, with no bound or resumable cursor. The returned database weight is calculated only after completing the scan, so a sufficiently large map can make the upgrade block exceed its execution budget and jeopardize chain liveness. Implement this as a bounded, resumable migration with persistent progress.

@github-actions

Copy link
Copy Markdown
Contributor

🔄 AI review updated — Skeptic: VULNERABLE

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AI review — see the sticky summary comment for the verdict and the inline comments below for specific findings.

}

let mut totals = BTreeMap::<NetUid, u64>::new();
for (netuid, _, voting_power) in VotingPower::<T>::iter() {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[HIGH] Runtime upgrade scans the complete voting-power map

VotingPower::<T>::iter() performs an unbounded synchronous scan during on_runtime_upgrade. As voting-power state grows, this can exceed the runtime-upgrade execution budget and prevent the release from completing. Convert this to a bounded, resumable migration with persistent cursor/progress state.

@github-actions

Copy link
Copy Markdown
Contributor

🔄 AI review updated — Skeptic: VULNERABLE

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AI review — see the sticky summary comment for the verdict and the inline comments below for specific findings.

}

let mut totals = BTreeMap::<NetUid, u64>::new();
for (netuid, _, voting_power) in VotingPower::<T>::iter() {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[HIGH] Runtime upgrade scans the complete voting-power map

on_runtime_upgrade invokes this migration synchronously, and VotingPower::<T>::iter() has no upper bound. Its storage reads and BTreeMap memory consumption therefore grow with all historical voting-power entries, potentially exceeding the upgrade block's execution or memory limits. Weight returned after execution does not constrain the work. Backfill this state through a bounded, resumable cursor before marking the migration complete.

@github-actions

Copy link
Copy Markdown
Contributor

🔄 AI review updated — Skeptic: VULNERABLE

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AI review — see the sticky summary comment for the verdict and the inline comments below for specific findings.

}

let mut totals = BTreeMap::<NetUid, u64>::new();
for (netuid, _, voting_power) in VotingPower::<T>::iter() {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[HIGH] Runtime upgrade scans the complete voting-power map

VotingPower is unbounded, but this synchronous runtime-upgrade migration iterates every entry before returning its weight. A sufficiently large live map can exceed upgrade-block execution capacity and stall the chain. Move this backfill to a bounded, resumable migration with a persisted cursor and per-block weight budget; mark it complete only after the final page.

@github-actions

Copy link
Copy Markdown
Contributor

🔄 AI review updated — Skeptic: VULNERABLE

@UnArbosFive
UnArbosFive merged commit 13d5a5e into main Aug 10, 2026
104 of 105 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants