# Polkadot.js Apps Support Quip uses hybrid consensus keys: - BABE authority key: `sr25519 + FN-DSA-512` (`H4`) - GRANDPA authority key: `ed25519 + FN-DSA-512` (`H2`) These consensus keys are not browser-managed account keys. Polkadot.js Apps can connect to Quip without custom type overrides, but validator/session key management still goes through the node keystore rather than browser-generated consensus keys. The H2/H4 implementation comes from the pinned `pqhybridsign` library (AGPL-3.0-or-later). Its current FN-DSA-512 implementation predates the final FIPS 206 standard; changing the pinned revision or its wire format is therefore consensus-sensitive and requires runtime and transaction-version review. ## Current Support Model Polkadot.js Apps works normally for: - connect to the Quip node over WebSocket - inspect storage, events, and extrinsics - call `author_rotateKeys` - submit `session.setKeys` The browser does **not** need to generate hybrid BABE or GRANDPA keys directly. Session keys should continue to be generated by the node keystore through `author_rotateKeys`, then registered on-chain with `session.setKeys`. Browser-side transaction signing now has an initial WASM/signature wrapper in this repository and is tracked in [`wasm-signing-plan.md`](./wasm-signing-plan.md). ## Regenerating the signing fixture `fixtures/hybrid-signing.json` embeds drift-prone runtime values (spec version, transaction version, extension set), so `cargo test -p quip-protocol-runtime --test signing_fixture` fails whenever those change. Regenerate it with: ```bash cargo run -p quip-protocol-runtime --example generate_polkadotjs_signing_fixture -- --write ``` Then re-run the signing-fixture tests and `npm test --prefix js/quip-signer`, which both consume the fixture. ## Metadata Compatibility Quip exposes the hybrid BABE and GRANDPA types through metadata-safe wrapper shapes, so current Polkadot.js Apps builds should not require any manual custom types just to connect and decode the runtime metadata. This matters because the hybrid BABE and GRANDPA signatures are larger than the classical Substrate defaults, and older metadata representations using a single large `[u8; N]` array can exceed client-side parser limits. If Apps has cached older metadata from before this fix, reconnecting may still show stale decode errors. In that case, hard-refresh the page or remove the saved endpoint and reconnect. ## What This Does Not Add This does not add browser-side generation or signing support for hybrid BABE or GRANDPA authority keys. For validator/session key management, the intended flow remains: 1. `author_rotateKeys` 2. `session.setKeys` That is the supported path for Quip's hybrid consensus keys in Polkadot.js Apps.