The Quantus runtime accepts only ML-DSA signatures. qapi offered every signer
polkahub knows, and none of those could sign here:
- Polkadot Vault, Ledger and WalletConnect produce sr25519, ed25519 or ecdsa
signatures (and WalletConnect was configured only for Polkadot, Kusama and
Paseo);
- the external multisig signer hands signing to multisig.usepapi.app;
- the browser-extension list offered polkadot{.js}, Nova, Talisman,
SubWallet, PolkaGate and Fearless.
These providers, their management buttons, and the Vault and multisig modals
are removed. What remains: browser extensions, read-only (watch) addresses,
and proxies, which sign through whichever signer they wrap.
@polkahub/pjs-wallet is patched (pinned to 0.9.1, like the substrate-bindings
patches) so the extension list is blackbeard alone, with its sigil as the
logo. Its provider only ever sees, offers or connects blackbeard: anything
else injected into window.injectedWeb3 is ignored, not merely unlabelled.
Verified against a local build in Firefox with blackbeard installed. The
Account Providers panel shows blackbeard (with the sigil), Address and Proxy,
and nothing else, including after fake polkadot-js and talisman entries were
injected into the page and the provider's 2 s re-scan had run.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012uDUodEcRbBwNRi3UCmw8f
qapi console
A fork of the papi console, pointed at the Quantus chains and patched to accept their post-quantum signature type.
Deployed at https://qapi.blackbeard.observer.
Why this fork exists
The console is built on polkadot-api,
which shares no code with the polkadot-js stack the Quantus browser extension forks
(quantus/extension, quantus/common, quantus/ui, quantus/wasm). That makes it an
independent implementation of the same wire format — and the only way to find out
whether our stack is right about Quantus or merely self-consistent.
It already is: for the same call, nonce and signature, createV4Tx here produces bytes
identical to quantus/extension's tier-1 harness.
The one patch
getSignerType in @polkadot-api/signers-common reads the extrinsic's Address and
Signature types out of the metadata — the right thing, and better than polkadot-js,
which hardcodes ExtrinsicSignature: 'MultiSignature' in a type definition file. It then
threw that answer away and required the enum to carry Ecdsa, Ed25519 and Sr25519.
Quantus's DilithiumSignatureScheme carries Dilithium87 and Dilithium65, so every
signing attempt raised Unkown signer before reaching code that would have worked —
createV4Tx is entirely length-agnostic, and a 7 219-byte ML-DSA-87 signature drops
straight in.
patches/@polkadot-api__signers-common.patch drops the names and keeps the structural
check. See quantus/papi-console#1.
Develop
pnpm install
pnpm dev
Deploy
Pushes to main deploy to oolon via .gitea/workflows/deploy.yaml. One-time host
provisioning — DNS, certificate, nginx vhost, webroot — is
script/infra-setup.sh, run by an operator:
./script/infra-setup.sh --pubkey ~/.ssh/id_gitea_ci.pub
Conventions: architecture/ —
deployment-gitea-actions.md, reverse-proxies.md, external-tls.md, public-dns.md.
Upstream's own README, and the licence, are unchanged: this is a fork, not a rewrite.