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
90 lines
4.2 KiB
Diff
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))
|
|
),
|
|
[]
|
|
);
|