Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
74 commits
Select commit Hold shift + click to select a range
c5168b1
change pallet limit orders to support ledger kind of signatures
girazoki Jun 29, 2026
d507ead
support both ledger and non-ledger sig formats
girazoki Jun 29, 2026
c668ade
rust fjmt
girazoki Jun 29, 2026
db46d7f
ts fmt
girazoki Jun 29, 2026
0913d4d
Human friendly lerger sigs
girazoki Jul 1, 2026
db2cf0e
Merge remote-tracking branch 'origin/devnet-ready' into girazoki-edge…
girazoki Jul 27, 2026
1201a6a
Expand evm precompile maintenance skill with compatibility notes, inc…
UnArbosFour Jul 27, 2026
a10b62e
pass ss58 from config
girazoki Jul 28, 2026
1dee117
make comment shorter
girazoki Jul 28, 2026
843795a
Merge remote-tracking branch 'origin/main' into girazoki-edger-human-…
girazoki Jul 28, 2026
5d10f59
Add precompile coverage gaps for existing domains
UnArbosFour Jul 28, 2026
f8571e8
ledger signs hash of payload if > 256
girazoki Jul 28, 2026
ee6de75
ts tests updated
girazoki Jul 28, 2026
75aeb3e
ledger test vectors
girazoki Jul 28, 2026
48445d7
Remove event reporting precompile suggestions
UnArbosFour Jul 29, 2026
32980cd
Require root priviledged calls to not be implemented in precompiles i…
UnArbosFour Jul 29, 2026
36dee7c
Spec out the deprecation with locally defined precompile lifecycle ru…
UnArbosFour Jul 29, 2026
374619f
99% complete implementation of precompiles
UnArbosFour Jul 30, 2026
26d9925
Add rules for read exposure of state variables and maps
UnArbosFour Jul 30, 2026
3fe2377
Precompiles: Add missing readers
UnArbosFour Jul 31, 2026
7f9ae80
Fix typo in path
UnArbosFour Jul 31, 2026
539f5d0
Add runtime constants to the precompile requirements
UnArbosFour Jul 31, 2026
8041d88
Add runtime constants
UnArbosFour Jul 31, 2026
c204d82
Merge remote-tracking branch 'origin/main' into girazoki-edger-human-…
girazoki Aug 3, 2026
fa7c922
reject invalid during transaction validation
UnArbosSix Aug 4, 2026
2769b73
fix provides tag
UnArbosSix Aug 4, 2026
ef6a09b
use existing helper
UnArbosSix Aug 4, 2026
040e9e0
fix: burn transaction fees instead of rewarding authors
UnArbosFive Aug 5, 2026
40dd1f1
chore: apply workspace rustfmt
UnArbosFive Aug 5, 2026
e6c7ca5
fix: recycle alpha-paid transaction fees
UnArbosFive Aug 5, 2026
b5e821c
Add root claim precompile and getters for unclaimed value
UnArbosFour Aug 5, 2026
7a7d410
Merge branch 'main' into feat/add-evm-maintainer-skill
UnArbosFour Aug 5, 2026
61df032
chore: bump runtime spec version to 444
UnArbosFive Aug 5, 2026
a15d632
chore: refresh SDK metadata for spec 444
UnArbosFive Aug 5, 2026
6c49a11
docs: refresh generated transaction links
UnArbosFive Aug 5, 2026
a85d83d
fix(testnet): restore GRANDPA finality after warp sync
UnArbosFive Aug 5, 2026
2da90f5
chore: pin merged SDK GRANDPA fixes
UnArbosFive Aug 6, 2026
c1b8d0b
feat: combine btcli v11 UX and wallet compatibility
UnArbosFive Aug 6, 2026
a4b252b
fix: preserve intent safety through multisig dispatch
UnArbosFive Aug 6, 2026
1a587cc
Remove miner-burn scaling from subnet emission shares
unarbos Aug 6, 2026
ea75553
Merge remote-tracking branch 'origin/revert-block-author-transaction-…
unarbos Aug 6, 2026
86ad1e1
fix(cli): align root output shapes
UnArbosFive Aug 4, 2026
7807f86
Merge remote-tracking branch 'origin/feat/full-precompiles' into rele…
unarbos Aug 6, 2026
75b8b95
Merge remote-tracking branch 'origin/feat/add-evm-maintainer-skill' i…
unarbos Aug 6, 2026
5a97255
Merge remote-tracking branch 'origin/fix/testnet-grandpa-finality-sdk…
unarbos Aug 6, 2026
a4baf0c
Merge remote-tracking branch 'origin/feat/btcli-combined' into releas…
unarbos Aug 6, 2026
b1e6b83
fix: no-std imports in precompiles; regenerate docs pages for drift gate
unarbos Aug 6, 2026
fb0843b
test: get_shares regression coverage for MinerBurned independence
unarbos Aug 6, 2026
e5aada8
chore: add TotalVotingPower to generated SDK metadata; regen namespac…
unarbos Aug 6, 2026
8c5174f
add migration
UnArbosSix Aug 7, 2026
8ecc006
chore: remove mainnet clone migration test
UnArbosSix Aug 7, 2026
d316a6c
revert extra
UnArbosSix Aug 7, 2026
6336944
prevent zero values from being created
UnArbosSix Aug 7, 2026
62edbef
urge neuron commitments when trimming uids
UnArbosSix Aug 7, 2026
2904c51
propagate inner post-dispatch weight
UnArbosSix Aug 7, 2026
bf69eea
clippy
UnArbosFour Aug 7, 2026
bf5de6c
Merge remote-tracking branch 'origin/main' into girazoki-edger-human-…
girazoki Aug 10, 2026
d251f45
purge on neuron dereg
UnArbosSix Aug 10, 2026
3d74b6e
fix: clear voting power state on subnet dissolutio
UnArbosSix Aug 10, 2026
7844370
preserve wrapper order for saved multisig dispatch
UnArbosSix Aug 10, 2026
857c72e
Merge pull request #3040 from RaoFoundation/fix/prevalidate-commitmen…
UnArbosSix Aug 10, 2026
981741f
Merge pull request #3061 from RaoFoundation/codex/storage-bloat-migra…
UnArbosSix Aug 10, 2026
cc7a424
Merge pull request #3062 from RaoFoundation/fix/purge-commitments-on-…
UnArbosSix Aug 10, 2026
791421b
Merge pull request #3063 from RaoFoundation/fix/proxy-post-dispatch-w…
UnArbosSix Aug 10, 2026
96691ad
Merge pull request #3002 from girazoki/girazoki-edger-human-friendly
UnArbosSix Aug 10, 2026
49724bf
add release page
UnArbosSix Aug 10, 2026
a91ade0
remove unsynchronized burnBalance function
UnArbosSix Aug 10, 2026
73f8092
fix: restore release CI checks
UnArbosFive Aug 10, 2026
28e3c5f
docs: correct documentation details
UnArbosFive Aug 10, 2026
f699950
fix pre-compile conversions
UnArbosSix Aug 10, 2026
16a6b86
docs: synchronize EVM interface artifacts
UnArbosFive Aug 10, 2026
a3aa5ba
docs: prepare v444 release guidance
UnArbosFive Aug 10, 2026
f22b50e
docs: refine v444 release actions
UnArbosFive Aug 10, 2026
3aa4ae7
docs: make emissions guidance timeless
UnArbosFive Aug 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
182 changes: 182 additions & 0 deletions .agents/skills/evm-maintainer/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,182 @@
---
name: evm-maintainer
description: Maintain backwards-compatible, versioned EVM precompiles that expose runtime extrinsics, state, constants, and APIs to Solidity.
---

# EVM Precompile Maintainer

You are the maintainer of EVM precompiles. EVM precompiles in subtensor should
expose the deterministic functionality available to client applications to EVM
smart contracts: extrinsics, state maps and values, runtime constants, and
runtime API/RPC results through typed interfaces. Your job is to keep this
coverage current without breaking deployed smart contracts that rely on
existing ABIs. Read the notes below and then execute the workflow.

## Reference routing

- Before classifying or implementing any precompile change, including an
additive function, runtime adaptation, bug fix, deprecation, or disablement,
read [ABI versioning](references/abi-versioning.md).
- Before implementing or reviewing precompile coverage and tests, read
[Coverage and testing](references/coverage-and-testing.md).
- Before classifying pallet state or runtime constants, or adding, reviewing,
or omitting a typed view, read
[State exposure](references/state-exposure.md) and use its direct, wrapped,
and do-not-expose classifications. Do not override a classification without
an explicit human decision.
- Before flagging or changing an existing view because of its storage
cardinality or scan behavior, read
[Reviewed exceptions](references/exceptions.md). Apply an exception only to
the exact function and invariant recorded there.

## Backwards compatibility

Treat every released precompile as a permanent public API. Preserve the ability
of deployed contracts, including immutable and externally audited wrappers, to
keep working across runtime upgrades without changing their source code,
bytecode, configured precompile addresses, or calldata.

Compatibility covers observable behavior, not merely the continued existence
of a four-byte selector. Preserve the documented meaning of the call whenever
that meaning can still be represented honestly and safely.

For each affected released function or view:

1. Preserve the old interface and meaning through the existing implementation
or a bounded adapter whenever possible.
2. Add a versioned function when the new behavior needs different inputs,
outputs, or semantics. Keep the old address and selector routed.
3. Use soft deprecation, which marks a function as deprecated while preserving
its released behavior, by default. Declare deprecation and replacement
metadata on the Rust precompile function with the lifecycle annotation
described in [ABI versioning](references/abi-versioning.md). Treat the
annotated Rust function as the source of truth and generate Solidity
lifecycle annotations and registry metadata from it; do not maintain
separate hand-written lifecycle data. Never fabricate data or silently
reinterpret an old field to avoid a compatibility decision.
4. If hard deprecation may be necessary, stop and follow the mainnet release
warning and lifecycle process in
[ABI versioning](references/abi-versioning.md). A general request to update
precompiles does not authorize an early compatibility break.
5. Prove that legacy callers still work and that unrelated precompiles and ABIs
are unchanged by following
[Coverage and testing](references/coverage-and-testing.md).

An exposed runtime constant is a view of the value compiled into the current
runtime. Preserve its selector, return encoding, units, and documented meaning,
but do not freeze its old numeric value when a runtime upgrade legitimately
changes the source constant. Preserve the old representation through an honest
adapter and add a versioned view if the constant's type, units, or meaning
changes.

## Notes on coding precompiles

- Keep every precompile path O(1) in CPU and memory unless the exact path is a
human-reviewed exception in
[Reviewed exceptions](references/exceptions.md).
- For a state-changing function, use
`PrecompileHandleExt::try_dispatch_runtime_call` and the established
precompile patterns where they apply. Construct the highest-level pallet
call and dispatch it with the mapped EVM caller as `RawOrigin::Signed`. This
preserves the pallet's ownership, role, rate-limit, freeze-window, and other
checks. Do not reproduce the extrinsic's logic, call an internal `do_*`
helper, write its storage directly, or substitute `RawOrigin::Root` or
`RawOrigin::None`.
- Expose a state-changing extrinsic only when that highest-level pallet call
accepts a non-Root signed origin.
- An extrinsic that accepts either a signed authority, such as a subnet owner,
or Root may expose its signed path. Do not expose an extrinsic that is
Root-only or `None`-only unless a separately approved authorization design is
added to the runtime. If the only way to make a proposed operation succeed is
to grant the caller a stronger origin, stop and request that design.
- Replace bulk runtime APIs and storage scans with bounded indexed or
cursor-based views. Apply the bound before performing the work; never call an
unbounded helper and truncate its result afterward. Preserve the exact
reviewed scan exceptions in
[Reviewed exceptions](references/exceptions.md).
- Read runtime constants from their authoritative runtime or pallet
configuration source. Never duplicate the literal value in precompile code.
Group related constants into coherent typed views when that keeps the
interface smaller without obscuring their meaning.
- Follow [ABI versioning](references/abi-versioning.md) for every released
interface.
- Treat repository-owned Rust function lifecycle annotations as the source of
truth for registry deprecation metadata, replacement selectors, migration
messages, and generated Solidity interfaces and `@custom:deprecated`
NatSpec. Do not hand-edit generated Solidity lifecycle data. Operational
disablement remains a separate dynamic value and must not be encoded in a
function annotation.
- Do not use Ethereum reserved precompile addresses for subtensor functionality.
- Assign new Bittensor domain precompiles sequentially from the next unused
Bittensor address. The current proposal reserves `0x080f` through `0x0813`
for Scheduler, Drand, Timestamp, Runtime Configuration, and the Precompile
Registry, respectively. Add routing and tests that lock every implemented
address and selector before release.
- Follow the code style and established patterns in existing precompiles.
- Represent Substrate account IDs in EVM space as 32-byte public keys.
- Multiply Subtensor balances by `10^9` to match EVM's 18-decimal convention,
and divide by the same factor before passing balances to Subtensor pallets.

## Maintenance workflow

Perform this workflow on:

- Every change to subtensor Rust codebase
- When explicitly prompted

## Step 1 — Determine the diff

Determine the diff between current branch and the most recent main branch (may need to pull it locally if it is outdated). See how this diff affects EVM precompiles:

- Does it remove or change any functions that precompiles rely on? Does it change function signatures or underlying functionality?
- Does it add or change any functionality: extrinsics, RPCs, state maps and
values, or runtime constants?

## Step 2 - Review the diff in the context of current precompiles vs. subtensor functionality

- All extrinsics that accept a non-Root signed origin, as well as all state
variables, maps, and constants should be exposed directly or through
type-safe readers to precompile callers for the following pallets:
- subtensor
- admin-util
- balances
- proxy
- scheduler
- drand
- crowdloan
- timestamp
- swap
- Root-only, `None`-only, inherent, disabled, and compatibility no-op
extrinsics must be inventoried and explicitly classified as not callable
through typed EVM precompiles.
- All deterministic runtime API RPC results for the subtensor pallet should be
exposed through typed precompile views. Preserve a similar interface when it
is already bounded; redesign bulk results as bounded indexed or cursor-based
views when it is not.

Use [Coverage and testing](references/coverage-and-testing.md) to build the
inventory and distinguish deployed, partial, proposed, and missing coverage.
Use [State exposure](references/state-exposure.md) to classify every state item
and runtime constant, and [Reviewed exceptions](references/exceptions.md)
before treating an existing view as incomplete or improperly bounded.

## Step 3 - Handle changed functions, state variables and maps, and constants

Apply the backwards-compatibility decision rule above and the detailed
[ABI versioning](references/abi-versioning.md) process. Preserve released
behavior through a bounded adapter and add a versioned function for new
behavior. If preservation is impossible, dishonest, unbounded, or unsafe, stop
and report the release blocker; do not implement an immediate compatibility
break as an ordinary precompile update.

## Step 4 - Handle added functions, state variables and maps, and constants

Determine the category under which the new functionality needs to be added and add to the corresponding existing precompile. You may create a new precompile too if the category does not fall into any existing ones.

## Step 5 - Update precompile documentation

Update the Solidity interface, generated ABI, NatSpec, registry metadata, SDK
copies, and public precompile documentation together. Verify their agreement
and ensure unrelated precompile artifacts remain unchanged. Document the
meaning, units, type conversion, and runtime-upgrade behavior of exposed
constants.
Loading
Loading