Files
qapi/patches/@polkahub__pjs-wallet@0.9.1.patch
rob thijssen b66b0a65c8
All checks were successful
deploy / build (push) Successful in 2m25s
deploy / deploy-web (push) Successful in 8s
feat: offer only signers that can sign for Quantus
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
2026-09-16 19:51:02 +03:00

90 lines
4.2 KiB
Diff

diff --git a/dist/ManagePjsWallet.js b/dist/ManagePjsWallet.js
index ec891b30a0bda8eb60b0ec647262ad334c04db89..03c93af0448018b58ef8abc2395e56b330d64038 100644
--- a/dist/ManagePjsWallet.js
+++ b/dist/ManagePjsWallet.js
@@ -4,38 +4,16 @@ import { cn, SourceButton } from '@polkahub/ui-components';
import { state, useStateObservable } from '@react-rxjs/core';
import { CircleQuestionMark } from 'lucide-react';
import { filter, switchMap } from 'rxjs';
-import nova from './assets/nova.webp.js';
-import pjs from './assets/pjs.webp.js';
-import subwallet from './assets/subwallet.webp.js';
-import talisman from './assets/talisman.webp.js';
-import polkagate from './assets/polkagate.webp.js';
-import fearless from './assets/fearless.webp.js';
+import blackbeard from './assets/blackbeard.svg.js';
import { pjsWalletProviderId } from './provider.js';
+// Only extensions that sign ML-DSA are listed: the Quantus runtime accepts no
+// other signature, so offering polkadot{.js}, Talisman and the rest would
+// connect wallets that can never sign here. Patched in qapi.
const knownExtensions = {
- "polkadot-js": {
- name: "Polkadot JS",
- logo: pjs
- },
- "nova-wallet": {
- name: "Nova Wallet",
- logo: nova
- },
- talisman: {
- name: "Talisman",
- logo: talisman
- },
- "subwallet-js": {
- name: "Subwallet",
- logo: subwallet
- },
- polkagate: {
- name: "Polkagate",
- logo: polkagate
- },
- "fearless-wallet": {
- name: "Fearless Wallet",
- logo: fearless
+ blackbeard: {
+ name: "blackbeard",
+ logo: blackbeard
}
};
const [pjsWalletPlugin$, useExternalizedPlugin] = externalizePlugin(pjsWalletProviderId);
diff --git a/dist/assets/blackbeard.svg.js b/dist/assets/blackbeard.svg.js
new file mode 100644
index 0000000000000000000000000000000000000000..4dfb32200a16b6c32b258d0519cd6c820a3bf9ab
--- /dev/null
+++ b/dist/assets/blackbeard.svg.js
@@ -0,0 +1,4 @@
+// blackbeard's sigil, the Quantus post-quantum wallet (quantus/extension#15)
+var blackbeard = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MCA0MCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIj4KICA8IS0tIGJsYWNrYmVhcmQub2JzZXJ2ZXIncyBzaWdpbCwgY2VudHJlZCBvbiBhIHNxdWFyZSBmb3IgaWNvbnMgLS0+CiAgPHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeD0iNiIgZmlsbD0iIzBkMGIwOSIvPgogIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDMgMCkiPgogICAgPHBhdGggZD0iTTE3IDEgTDMyIDcgVjIwIEMzMiAyOSAyNSAzNSAxNyAzOSBDOSAzNSAyIDI5IDIgMjAgVjcgWiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYmQ4ODI5IiBzdHJva2Utd2lkdGg9IjEuNiIvPgogICAgPHBhdGggZD0iTTE3IDggTDI0IDEyIFYyMSBDMjQgMjYgMjAuNSAyOS41IDE3IDMxLjUgQzEzLjUgMjkuNSAxMCAyNiAxMCAyMSBWMTIgWiIgZmlsbD0iI2JkODgyOTIyIi8+CiAgICA8cGF0aCBkPSJNMTcgMTEgVjI4IiBzdHJva2U9IiNkODQ1M2EiIHN0cm9rZS13aWR0aD0iMS42Ii8+CiAgICA8cGF0aCBkPSJNMTMgMTUgTDE3IDExIEwyMSAxNSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZDg0NTNhIiBzdHJva2Utd2lkdGg9IjEuNiIvPgogIDwvZz4KPC9zdmc+Cg==";
+
+export { blackbeard as default };
diff --git a/dist/provider.js b/dist/provider.js
index a0a44532893fc9b9b3d9c449c40362e60cfa3b95..d8f90bf491ea5fc4f708d456d2c3037255bc6dc8 100644
--- a/dist/provider.js
+++ b/dist/provider.js
@@ -6,6 +6,10 @@ import { getSs58AddressInfo } from 'polkadot-api';
import { concat, timer, map, filter, take, interval, switchMap, defer, retry, fromEventPattern, startWith, catchError, tap, ignoreElements, NEVER, shareReplay, firstValueFrom, scan } from 'rxjs';
const pjsWalletProviderId = "pjs-wallet";
+// Patched in qapi: only extensions that can sign for a post-quantum chain are
+// offered or connected. Anything else injected into the page is ignored.
+const PQ_EXTENSIONS = ["blackbeard"];
+const getPqExtensions = () => getInjectedExtensions().filter((name) => PQ_EXTENSIONS.includes(name));
const createPjsWalletProvider = (opts) => {
const { persist, accountFormat } = {
persist: localStorageProvider("pjs-wallet-plugin"),
@@ -15,11 +19,11 @@ const createPjsWalletProvider = (opts) => {
const availableExtensions$ = state(
concat(
timer(0, 100).pipe(
- map(getInjectedExtensions),
+ map(getPqExtensions),
filter((v) => v.length > 0),
take(1)
),
- interval(2e3).pipe(map(getInjectedExtensions))
+ interval(2e3).pipe(map(getPqExtensions))
),
[]
);