Guides/EVM/Precompiles

Extrinsic coverage

Audit of typed EVM coverage for every extrinsic in the authorized runtime pallets.

View as Markdown

This audit covers the runtime's SubtensorModule, AdminUtils, Balances, Proxy, Scheduler, Drand, Crowdloan, Timestamp, and Swap pallets. Sudo and Multisig extrinsics are intentionally outside typed precompile coverage.

Generic SCALE dispatch through the Frontier Dispatch precompile does not count as typed coverage. A covered operation must have a stable Solidity interface or an explicit proposed typed replacement.

Coverage summary

PalletRuntime extrinsicsTyped todayProposed signed additionsNot exposed
SubtensorModule8268014
AdminUtils8640046
Balances9405
Proxy121110
Scheduler100010
Drand3003
Crowdloan101000
Timestamp1001
Swap6006
Total219133185

Typed today counts semantic coverage, not only direct dispatch to the same Rust call. For example, registerNetwork(bytes32) covers basic subnet registration by dispatching register_network_with_identity with empty identity fields.

Proposed signed additions includes extrinsics whose highest-level pallet call accepts a non-Root signed origin. If a call also accepts Root, only its signed path is exposed: the mapped EVM caller is dispatched as Signed, and the pallet performs its normal authorization checks.

Signed additions

Each implemented operation is listed on the page of its target precompile:

Target precompileMissing extrinsics assigned
Subnet13
Staking V220
Neuron21
Alpha3
Account balance1
Proxy4
Balance transfer2
Voting power2
Leasing1
Crowdloan1

The only remaining proposed signed operation is Proxy.proxy_announced. It requires a stable, versioned EVM description of the proxied runtime call and must not add another SCALE-encoded RuntimeCall interface.

Extrinsics not exposed as EVM calls

Pallet extrinsicReason
Root-only SubtensorModule extrinsicsdissolve_network, root_dissolve_network, swap_coldkey, sudo_set_tx_childkey_take_rate_limit, sudo_set_min_childkey_take, sudo_set_max_childkey_take, set_pending_childkey_cooldown, reset_coldkey_swap, sudo_set_num_root_claims, and sudo_set_voting_power_ema_alpha require Root.
SubtensorModule.schedule_swap_coldkeyDeprecated compatibility call that always returns Deprecated.
SubtensorModule.faucetBuild-feature-only development call; it is not part of the production runtime interface.
SubtensorModule.set_tempoRetained call-index compatibility entry point that succeeds without changing state. The real setting is exposed as SubnetPrecompile.setTempo through AdminUtils.sudo_set_tempo.
SubtensorModule.set_activity_cutoff_factorRetained call-index compatibility entry point that succeeds without changing state. The active AdminUtils operation is already covered by SubnetPrecompile.setActivityCutoffFactor.
Root-only AdminUtils extrinsicsRoot-only administration is not delegated to EVM callers. For calls that also accept a signed subnet owner, the domain precompile dispatches the highest-level call as the mapped EVM signer and preserves its authorization checks.
AdminUtils.sudo_set_total_issuanceDeprecated call that always returns Deprecated.
Balances.burnThe native call reduces FRAME Balances issuance without updating Subtensor's separate issuance ledger, which drives block emission. It is not exposed until the runtime provides a synchronized signed burn operation.
Root-only Balances extrinsicsforce_unreserve, force_transfer, force_set_balance, and force_adjust_total_issuance require Root.
All Scheduler extrinsicsScheduler.ScheduleOrigin is configured as Root in the runtime.
Drand.write_pulseUnsigned offchain-worker submission requiring None origin. An EVM caller cannot satisfy that origin without changing its security model.
Drand configuration extrinsicsset_beacon_config and set_oldest_stored_round require Root.
Timestamp.setBlock-production inherent requiring None origin. Contracts already receive the same time through block.timestamp.
Swap.set_fee_rateRequires Root.
Swap.add_liquidityPermanently disabled pallet call that always returns Deprecated.
Swap.remove_liquidityPermanently disabled pallet call that always returns Deprecated.
Swap.modify_positionPermanently disabled pallet call that always returns Deprecated.
Swap.toggle_user_liquidityPermanently disabled pallet call that always returns Deprecated.
Swap.disable_lpPermanently disabled pallet call that always returns Deprecated.

These exclusions preserve the existing runtime origin and lifecycle semantics. A typed precompile must not manufacture Root or None, call an internal helper, or write storage directly to make one of these operations callable.