Adds dilithium65 and dilithium87 to KeypairType, and Quantus to the network registry at SS58 prefix 189. Two types rather than one because the parameter set is not an implementation detail: it selects the signature enum variant byte the chain reads off the wire, it selects the trailing hardened index of the derivation path, and it fixes the key and signature lengths. New accounts use dilithium65; dilithium87 is legacy, used by accounts predating the recorded scheme and by the dev-genesis accounts, so it is supported but never chosen. Opening the union turns every table keyed by KeypairType into a type error, which is the point — it enumerates precisely the places needing a post-quantum answer. Where that answer is not written yet, assertSubstrateType() expresses the gap as a named, typed refusal at the call site rather than a silent undefined from an object index. It throws rather than degrading because all of these paths produce key material or an address, and a wrong-but-plausible value means funds at an address nobody controls. Call sites disappear as quantus/common#2 and #4 land. keyFromPath throws for the same reason: silently ignoring a derivation path would hand back the parent key under a child's name. Quantus is appended to the registry rather than merged — @substrate/ss58-registry does not carry it and nothing occupies prefixes 185..195, so there is nothing to override, and appending means a registry bump cannot silently drop it. standardAccount is 'ml-dsa', a value upstream's closed union does not allow, hence the widened KnownSubstrate; it is load-bearing, since a missing standardAccount makes toExpanded mark the network isIgnored. Testnets are first-class in this fork. Upstream drops any testnet from availableNetworks however complete its entry is, which suits a production chain picker and not us: Quantus is under active development and a wallet that cannot reach Heisenberg can only be tested against real funds. The exception is an allowlist (exposedTestnet) rather than removing the rule — removing it exposed all fifteen of upstream's testnets too, moving the sorted tail from 'ZERO' to 'ZERO Alphaville', which is a change we have no reason to make. isTestnet is still reported honestly so consumers can label or filter; we just stop deciding for them. Genesis hashes come from blackbeard.observer's config, which records their provenance: mainnet read from the node with chain_getBlockHash(0) on 2026-09-09, its launch day, and explicitly not the staging chain that telemetry calls "Quantus Staging Mainnet". Symbol and decimals (QTC, 12) agree between the chain's chain_spec.rs and the Dart SDK's AppConstants. Three upstream tests encoded rules this fork no longer follows. Each is rewritten to assert the new rule rather than deleted: - genesis entries for testnets are now allowed, for ones we opted into - an exposed testnet must still be labelled a testnet, since a user cannot tell play money from real money by looking at an address - one network per SS58 prefix stops holding when a chain has a testnet; mainnet and Heisenberg are both 189 because an address is valid on either, and consumers key on genesisHash rather than prefix Refs quantus/common#1 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012uDUodEcRbBwNRi3UCmw8f
@polkadot/keyring
Key management of user accounts including generation and retrieval of keyring pairs from a variety of input combinations.
Usage
Installation -
yarn add @polkadot/keyring
Classes and Functions can be imported as follows:
import Keyring from '@polkadot/keyring';