Author SHA1 Message Date
grenadeandClaude Opus 5 e0aa78360a feat: rebrand as blackbeard
Lock Threads / lock (push) Has been cancelled
The extension presented itself as "polkadot{.js} extension". It is now
blackbeard, with the sigil and gold of blackbeard.observer.

Visible:
- manifest name, short_name, action title and page titles are "blackbeard",
  and the description says what it is: a post-quantum wallet for the Quantus
  Network;
- icons (16–128), favicon and the header logo are rendered from observer's
  sigil, centred on a square;
- the accent colour moves from polkadot orange to the sigil's gold;
- the phishing page and header fallback no longer name polkadot{.js};
- the welcome screen no longer claims "your information never leaves this
  machine". That stopped being true when balances arrived. It now says what
  is sent where, and that both can be pointed elsewhere or turned off;
- the README describes this extension rather than upstream's.

Behavioural, and part of the same change:
- Dapps find the extension as window.injectedWeb3['blackbeard']. As
  'polkadot-js' it overwrote, or was overwritten by, the real polkadot{.js}
  extension when both were installed.
- Page/content-script message channels follow short_name, so they are
  blackbeard-*. Sharing polkadot{.js}'s names meant each extension's content
  script answered the other's page messages.
- The Firefox add-on id is extension@blackbeard.observer instead of upstream's
  {7e3ce1f0-…}, so Firefox stops treating this as polkadot{.js}. Storage
  there starts empty; wallets need re-importing.
- Storage keys are fixed rather than derived from EXTENSION_PREFIX, and equal
  to what existing installs already use. chrome.storage is per-extension, and
  deriving keys from the name would have orphaned every stored account and
  wallet on rename.

Package names stay @polkadot/extension-*: they aren't user-visible, and
renaming them touches every import here and in the forks.

Verified in Firefox against the built extension:
- it installs as "blackbeard" with the new id;
- a plain page sees exactly one injected key, blackbeard;
- its enable() request reaches the background over the renamed channels and
  opens the connection-request screen, with the sigil and gold.

Closes #15

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012uDUodEcRbBwNRi3UCmw8f
2026-09-16 19:34:06 +03:00
24 changed files with 121 additions and 131 deletions
+62 -78
View File
@@ -1,71 +1,74 @@
# polkadot{.js} extension
# blackbeard
A very simple scaffolding browser extension that injects a [@polkadot/api](https://github.com/polkadot-js/api) Signer into a page, along with any associated accounts, allowing for use by any dapp. This is an extensible POC implementation of a Polkadot/Substrate browser signer.
A post-quantum browser wallet for the [Quantus Network](https://quantus.com), forked from the
[polkadot{.js} extension](https://github.com/polkadot-js/extension). It keeps upstream's shape — accounts
in a popup, a signer injected into dapps — with the cryptography, encoding and account model Quantus
actually needs:
As it stands, it does one thing: it _only_ manages accounts and allows the signing of transactions with those accounts. It does not inject providers for use by dapps at this early point, nor does it perform wallet functions where it constructs and submits txs to the network.
- **ML-DSA only.** Accounts are ML-DSA-65 and ML-DSA-87 (the two variants of the runtime's
`DilithiumSignatureScheme`), derived as `quantus-cli` and the mobile wallet derive them.
- **The runtime is the codec.** Calls and extrinsics are encoded and decoded from the chain's own
metadata ([@quantus/codec](https://git.lair.cafe/quantus/wasm)), fetched from a node and checked
against its genesis — never from a hardcoded type registry, which drifts from a runtime that changes.
- **Wallets, not keypairs.** A recovery phrase is one wallet, shown as every account it unlocks:
ML-DSA-65, ML-DSA-87 and wormhole tabs, per account index. The phrase is stored encrypted with the
wallet password so further accounts can be derived later.
- **Wormhole balances, read-only.** Deposits come from a [blackbeard observer](https://blackbeard.observer)
and are checked against the chain's own transfer counts; spent status is decided locally from
nullifiers precomputed while the password is to hand, checked against whole buckets of
`Wormhole::UsedNullifiers` so no node learns which ones are yours. Sending from a wormhole address
is not in the extension yet (quantus/extension#13).
Work is tracked at [git.lair.cafe/quantus/extension/issues](https://git.lair.cafe/quantus/extension/issues);
#1 is the epic.
## Installation
- On Chrome, install via [Chrome web store](https://chrome.google.com/webstore/detail/polkadot%7Bjs%7D-extension/mopnmbcafieddcagagdcbnhejhlodfdd)
- On Firefox, install via [Firefox add-ons](https://addons.mozilla.org/en-US/firefox/addon/polkadot-js-extension/)
There is no store listing. Build from source (below), or use the zips a build writes to the repo root.
![interface screenshots](docs/extension-overview.png)
- **Firefox:** `about:debugging#/runtime/this-firefox` → **Load Temporary Add-on…** → `master-ff-build.zip`.
Temporary add-ons are unloaded on restart; a permanent install of an unsigned add-on needs Developer
Edition or Nightly with `xpinstall.signatures.required` set to `false`.
- **Chrome / Chromium / Brave:** unzip `master-chrome-build.zip` into a folder, then `chrome://extensions`
→ **Developer mode** → **Load unpacked** → that folder. Not `packages/extension/build`, which holds
whichever browser was built last.
## Documentation and examples
Find out more about how to use the extension as a Dapp developer, cookbook, as well as answers to most frequent questions in the [Polkadot-js extension documentation](https://polkadot.js.org/docs/extension/)
## Privacy settings
## Firefox installation from source instructions.
Everything the extension asks the network is a setting, and each can be pointed at your own
infrastructure or turned off:
1. Uncompress `master-ff-src.zip`
2. Run `corepack enable` [More information](https://github.com/nodejs/corepack?tab=readme-ov-file#corepack-enable--name)
3. Install dependencies via `yarn install`
4. Build all packages via `yarn build`
- The `/packages/extension/build` directory will contain the exact code used in the add-on, and should exactly match the uncompressed `master-ff-build`.
NOTE: If you would like to regenerate the compressed `master-ff-build.zip`, and `master-ff-src.zip` files run: `yarn build:zip:ff`
## Development version
Steps to build the extension and view your changes in a browser:
1. Chrome:
1. Build via `yarn build:chrome`
- NOTE: You may need to enable corepack by running `corepack enable`
2. Install the extension
- go to `chrome://extensions/`
- ensure you have the Development flag set
- "Load unpacked" and point to `packages/extension/build`
- if developing, after making changes - refresh the extension
2. Firefox
1. Build via `yarn build:ff`
- NOTE: You may need to enable corepack by running `corepack enable`
2. Install the extension
- go to `about:debugging#addons`
- check "Enable add-on debugging"
- click on "Load Temporary Add-on" and point to `packages/extension/build/manifest.json`
- if developing, after making changes - reload the extension
3. When visiting `https://polkadot.js.org/apps/` it will inject the extension
Once added, you can create an account (via a generated seed) or import via an existing seed. The [apps UI](https://github.com/polkadot-js/apps/), when loaded, will show these accounts as `<account name> (extension)`
- **Read balances from** — the node used for balances and wormhole chain state.
- **Look up wormhole deposits with** — the observer asked which deposits went to your wormhole
addresses. It learns that those addresses belong to one person; nothing it is sent can name your exits.
## Development
The repo is split into a number of packages -
```sh
yarn install
yarn build # both browsers; writes master-chrome-build.zip and master-ff-build.zip
yarn test # background specs (the upstream React specs are not run: see quantus/extension#14)
yarn lint
```
- [extension](packages/extension/) - All the injection and background processing logic (the main entry)
- [extension-ui](packages/extension-ui/) - The UI components for the extension, to build up the popup
- [extension-dapp](packages/extension-dapp/) - A convenience wrapper to work with the injected objects, simplifying data extraction for any dapp that wishes to integrate the extension (or any extension that supports the interface)
- [extension-inject](packages/extension-inject/) - A convenience wrapper that allows extension developers to inject their extension for use by any dapp
The Quantus forks it builds against (`@polkadot/util-crypto`, `@polkadot/keyring`, `@polkadot/ui-keyring`,
`@polkadot/networks`) and `@quantus/crypto` / `@quantus/codec` come from the Gitea package registry;
see `.yarnrc.yml`. `scripts/tier1` submits real extrinsics against a node, and `scripts/tier2` is a
dapp harness for exercising the injected signer in a browser.
It also contains a [`manifest_chrome.json`](packages/extension/manifest_chrome.json) file which contains the manifest configuration for Chrome and another [`manifest_firefox.json`](packages/extension/manifest_firefox.json) with the configuration for Firefox, for compatibility reasons, and a dummy `manifest.json` file that's only used by the build.
The packages keep their upstream `@polkadot/extension-*` names:
- [extension](packages/extension/) — injection, background and manifests (the main entry)
- [extension-base](packages/extension-base/) — the background: keyring, wallets, signing, balances
- [extension-ui](packages/extension-ui/) — the popup
- [extension-dapp](packages/extension-dapp/) — a convenience wrapper for dapps using any injected extension
- [extension-inject](packages/extension-inject/) — the injection interface
## Dapp developers
The actual in-depth technical breakdown is given in the next section for any dapp developer wishing to work with the raw objects injected into the window. However, convenience wrappers are provided that allow for any dapp to use this extension (or any other extension that conforms to the interface) without having to manage any additional info.
The documentation for Dapp development is available [in the polkadot-js doc](https://polkadot.js.org/docs/extension).
This approach is used to support multiple external signers in for instance [apps](https://github.com/polkadot-js/apps/). You can read more about the convenience wrapper [@polkadot/extension-dapp](packages/extension-dapp/) along with usage samples.
Use [@polkadot/extension-dapp](packages/extension-dapp/), or any library that enumerates
`window.injectedWeb3`; this extension appears there as `blackbeard`. Signing requests are encoded and
shown using the chain's own metadata, so a dapp does not need to supply any.
## API interface
@@ -121,8 +124,8 @@ The extension injects `injectedWeb3` into the global `window` object, exposing t
```js
window.injectedWeb3 = {
// this is the name for this extension, there could be multiples injected,
// each with their own keys, here `polkadot-js` is for this extension
'polkadot-js': {
// each with their own keys, here `blackbeard` is for this extension
'blackbeard': {
// semver for the package
version: '0.1.0',
@@ -134,30 +137,11 @@ window.injectedWeb3 = {
}
```
## Mnemonics, Passwords, and Imports/Exports
### Using the mnemonic and password from the extension
## Recovery phrases and passwords
When you create a keypair via the extension, it supplies a 12-word mnemonic seed and asks you to create a password. This password only encrypts the private key on disk so that the password is required to spend funds in `polkadot-js/apps` or to import the account from backup. The password does not protect the mnemonic phrase. That is, if an attacker were to acquire the mnemonic phrase, they would be able to use it to spend funds without the password.
### Importing mnemonics from other key generation utilities
Some key-generation tools, e.g. [Subkey](https://www.substrate.io/kb/integrate/subkey), support hard and soft key derivation as well as passwords that encrypt the mnemonic phrase such that the mnemonic phrase itself is insufficient to spend funds.
The extension supports these advanced features. When you import an account from a seed, you can add these derivation paths or password to the end of the mnemonic in the following format:
```
<mnemonic phrase>//<hard>/<soft>///<password>
```
That is, hard-derivation paths are prefixed with `//`, soft paths with `/`, and the password with `///`.
The extension will still ask you to enter a password for this account. As before, this password only encrypts the private key on disk. It is not required to be the same password as the one that encrypts the mnemonic phrase.
Accounts can also be derived from existing accounts – `Derive New Account` option in account's dropdown menu should be selected. After providing the password of the parent account, along with name and password of the derived account, enter derivation path in the following format:
```
//<hard>/<soft>
```
The path will be added to the mnemonic phrase of the parent account.
A wallet's password encrypts the stored recovery phrase and each account's key; the phrase itself is
not protected by it, so anyone with the phrase controls every account the wallet shows. Import accepts
a BIP39 phrase, or a `0x`-prefixed 32-byte seed for the dev accounts. There are no derivation paths
to type: account indices are added from the wallet's menu, and derive the same accounts
`quantus-cli` and the mobile wallet derive for that index.
@@ -3,16 +3,14 @@
import type { KeyringJson, KeyringStore } from '@polkadot/ui-keyring/types';
import { EXTENSION_PREFIX } from '../defaults.js';
import BaseStore from './Base.js';
export default class AccountsStore extends BaseStore<KeyringJson> implements KeyringStore {
constructor () {
super(
EXTENSION_PREFIX && EXTENSION_PREFIX !== 'polkadot{.js}'
? `${EXTENSION_PREFIX}accounts`
: null
);
// Fixed, not derived from EXTENSION_PREFIX. chrome.storage is already per
// extension, and deriving the key from the name meant renaming the
// extension (quantus/extension#15) would orphan everything stored.
super(null);
}
public override async set (key: string, value: KeyringJson, update?: () => void): Promise<void> {
@@ -3,15 +3,13 @@
import type { MetadataDef } from '@polkadot/extension-inject/types';
import { EXTENSION_PREFIX } from '../defaults.js';
import BaseStore from './Base.js';
export default class MetadataStore extends BaseStore<MetadataDef> {
constructor () {
super(
EXTENSION_PREFIX && EXTENSION_PREFIX !== 'polkadot{.js}'
? `${EXTENSION_PREFIX}metadata`
: 'metadata'
);
// Fixed, not derived from EXTENSION_PREFIX. chrome.storage is already per
// extension, and deriving the key from the name meant renaming the
// extension (quantus/extension#15) would orphan everything stored.
super('metadata');
}
}
@@ -3,7 +3,6 @@
import type { WormholeNullifiersJson } from '../background/types.js';
import { EXTENSION_PREFIX } from '../defaults.js';
import BaseStore from './Base.js';
/**
@@ -15,10 +14,9 @@ import BaseStore from './Base.js';
*/
export default class NullifiersStore extends BaseStore<WormholeNullifiersJson> {
constructor () {
super(
EXTENSION_PREFIX && EXTENSION_PREFIX !== 'polkadot{.js}'
? `${EXTENSION_PREFIX}quantus:nullifiers`
: 'quantus:nullifiers'
);
// Fixed, not derived from EXTENSION_PREFIX. chrome.storage is already per
// extension, and deriving the key from the name meant renaming the
// extension (quantus/extension#15) would orphan everything stored.
super('quantus:nullifiers');
}
}
@@ -3,7 +3,6 @@
import type { WalletJson } from '../background/types.js';
import { EXTENSION_PREFIX } from '../defaults.js';
import BaseStore from './Base.js';
/**
@@ -15,10 +14,9 @@ import BaseStore from './Base.js';
*/
export default class WalletsStore extends BaseStore<WalletJson> {
constructor () {
super(
EXTENSION_PREFIX && EXTENSION_PREFIX !== 'polkadot{.js}'
? `${EXTENSION_PREFIX}quantus:wallet`
: 'quantus:wallet'
);
// Fixed, not derived from EXTENSION_PREFIX. chrome.storage is already per
// extension, and deriving the key from the name meant renaming the
// extension (quantus/extension#15) would orphan everything stored.
super('quantus:wallet');
}
}
@@ -27,7 +27,7 @@ function PhishingDetected ({ className }: Props): React.ReactElement<Props> {
<Header text={t('Phishing detected')} />
<div className={className}>
<p>
{t('You have been redirected because the Polkadot{.js} extension believes that this website could compromise the security of your accounts and your tokens.')}
{t('You have been redirected because blackbeard believes that this website could compromise the security of your accounts and your tokens.')}
</p>
<p className='websiteAddress'>
{decodedWebsite}
+6 -4
View File
@@ -31,12 +31,14 @@ function Welcome ({ className }: Props): React.ReactElement<Props> {
<p>{t('Before we start, just a couple of notes regarding use:')}</p>
<Box>
<List>
<li>{t('We do not send any clicks, pageviews or events to a central server')}</li>
<li>{t('We do not use any trackers or analytics')}</li>
<li>{t("We don't collect keys, addresses or any information - your information never leaves this machine")}</li>
<li>{t('No clicks, pageviews or events are sent anywhere, and there are no trackers or analytics.')}</li>
<li>{t('Keys and recovery phrases never leave this browser.')}</li>
<li>{t('To show balances, your addresses are sent to a Quantus node; to show wormhole balances, your wormhole addresses are sent to a blackbeard observer. Either can be pointed at your own server, or turned off, in settings.')}</li>
</List>
</Box>
<p>{t('... we are not in the information collection business (even anonymized).')}</p>
{/* Upstream said "your information never leaves this machine". Once
balances were shown that stopped being true, and a welcome screen
is the wrong place to overstate privacy. quantus/extension#15 */}
</div>
<VerticalSpace />
<ButtonArea>
-1
View File
@@ -1 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1" x="0px" y="0px" viewBox="15 15 140 140" style="enable-background:new 0 0 170 170;zoom: 1;" xml:space="preserve"><style type="text/css">.bg0{fill:#FF8C00} .st0{fill:#FFFFFF}</style><g><circle class="bg0" cx="85" cy="85" r="70"></circle><g><path class="st0" d="M85,34.7c-20.8,0-37.8,16.9-37.8,37.8c0,4.2,0.7,8.3,2,12.3c0.9,2.7,3.9,4.2,6.7,3.3c2.7-0.9,4.2-3.9,3.3-6.7 c-1.1-3.1-1.6-6.4-1.5-9.7C58.1,57.6,69.5,46,83.6,45.3c15.7-0.8,28.7,11.7,28.7,27.2c0,14.5-11.4,26.4-25.7,27.2 c0,0-5.3,0.3-7.9,0.7c-1.3,0.2-2.3,0.4-3,0.5c-0.3,0.1-0.6-0.2-0.5-0.5l0.9-4.4L81,73.4c0.6-2.8-1.2-5.6-4-6.2 c-2.8-0.6-5.6,1.2-6.2,4c0,0-11.8,55-11.9,55.6c-0.6,2.8,1.2,5.6,4,6.2c2.8,0.6,5.6-1.2,6.2-4c0.1-0.6,1.7-7.9,1.7-7.9 c1.2-5.6,5.8-9.7,11.2-10.4c1.2-0.2,5.9-0.5,5.9-0.5c19.5-1.5,34.9-17.8,34.9-37.7C122.8,51.6,105.8,34.7,85,34.7z M87.7,121.7 c-3.4-0.7-6.8,1.4-7.5,4.9c-0.7,3.4,1.4,6.8,4.9,7.5c3.4,0.7,6.8-1.4,7.5-4.9C93.3,125.7,91.2,122.4,87.7,121.7z"></path></g></g></svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1,10 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 40 40" width="40" height="40">
<!-- blackbeard.observer's sigil, centred on a square for icons -->
<rect width="40" height="40" rx="6" fill="#0d0b09"/>
<g transform="translate(3 0)">
<path d="M17 1 L32 7 V20 C32 29 25 35 17 39 C9 35 2 29 2 20 V7 Z" fill="none" stroke="#bd8829" stroke-width="1.6"/>
<path d="M17 8 L24 12 V21 C24 26 20.5 29.5 17 31.5 C13.5 29.5 10 26 10 21 V12 Z" fill="#bd882922"/>
<path d="M17 11 V28" stroke="#d8453a" stroke-width="1.6"/>
<path d="M13 15 L17 11 L21 15" fill="none" stroke="#d8453a" stroke-width="1.6"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 628 B

@@ -5,7 +5,7 @@ import { faArrowLeft, faCog, faExpand, faPlusCircle, faSearch } from '@fortaweso
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import React, { useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';
import logo from '../assets/pjs.svg';
import logo from '../assets/sigil.svg';
import { ActionContext } from '../components/index.js';
import InputFilter from '../components/InputFilter.js';
import Link from '../components/Link.js';
@@ -130,7 +130,7 @@ function Header ({ children, className = '', onFilter, showAdd, showBackArrow, s
/>
)
}
<span className='logoText'>{text || 'polkadot{.js}'}</span>
<span className='logoText'>{text || 'blackbeard'}</span>
</div>
{showSearch && (
<div className={`searchBarWrapper ${isSearchOpen ? 'selected' : ''}`}>
+4 -4
View File
@@ -1,9 +1,9 @@
{
"author": "polkadot.{js}",
"description": "Manage your Polkadot accounts outside of dapps. Injects the accounts and allows signing transactions for a specific account.",
"description": "A post-quantum wallet for the Quantus Network: ML-DSA-65 and ML-DSA-87 accounts, wormhole balances, and signing for dapps.",
"homepage_url": "https://github.com/polkadot-js/extension",
"name": "polkadot{.js} extension",
"short_name": "polkadot{.js}",
"name": "blackbeard",
"short_name": "blackbeard",
"manifest_version": 3,
"permissions": [
"storage",
@@ -15,7 +15,7 @@
"type": "module"
},
"action": {
"default_title": "polkadot{.js}",
"default_title": "blackbeard",
"default_popup": "index.html"
},
"content_scripts": [
+5 -5
View File
@@ -1,9 +1,9 @@
{
"author": "polkadot.{js}",
"description": "Manage your Polkadot accounts outside of dapps. Injects the accounts and allows signing transactions for a specific account.",
"description": "A post-quantum wallet for the Quantus Network: ML-DSA-65 and ML-DSA-87 accounts, wormhole balances, and signing for dapps.",
"homepage_url": "https://github.com/polkadot-js/extension",
"name": "polkadot{.js} extension",
"short_name": "polkadot{.js}",
"name": "blackbeard",
"short_name": "blackbeard",
"manifest_version": 3,
"permissions": [
"storage",
@@ -17,12 +17,12 @@
"type": "module"
},
"action": {
"default_title": "polkadot{.js}",
"default_title": "blackbeard",
"default_popup": "index.html"
},
"browser_specific_settings": {
"gecko": {
"id": "{7e3ce1f0-15fb-4fb1-99c6-25774749ec6d}",
"id": "extension@blackbeard.observer",
"strict_min_version": "108.0.2"
}
},
Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 510 B

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 9.2 KiB

-4
View File
@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?><!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) --><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1" x="0px" y="0px" viewBox="15 15 140 140" style="enable-background:new 0 0 170 170;zoom: 1;" xml:space="preserve"><style type="text/css">
.bg0{fill:#FF8C00}
.st0{fill:#FFFFFF;}
</style><g><circle class="bg0" cx="85" cy="85" r="70"></circle><g><path class="st0" d="M85,34.7c-20.8,0-37.8,16.9-37.8,37.8c0,4.2,0.7,8.3,2,12.3c0.9,2.7,3.9,4.2,6.7,3.3c2.7-0.9,4.2-3.9,3.3-6.7 c-1.1-3.1-1.6-6.4-1.5-9.7C58.1,57.6,69.5,46,83.6,45.3c15.7-0.8,28.7,11.7,28.7,27.2c0,14.5-11.4,26.4-25.7,27.2 c0,0-5.3,0.3-7.9,0.7c-1.3,0.2-2.3,0.4-3,0.5c-0.3,0.1-0.6-0.2-0.5-0.5l0.9-4.4L81,73.4c0.6-2.8-1.2-5.6-4-6.2 c-2.8-0.6-5.6,1.2-6.2,4c0,0-11.8,55-11.9,55.6c-0.6,2.8,1.2,5.6,4,6.2c2.8,0.6,5.6-1.2,6.2-4c0.1-0.6,1.7-7.9,1.7-7.9 c1.2-5.6,5.8-9.7,11.2-10.4c1.2-0.2,5.9-0.5,5.9-0.5c19.5-1.5,34.9-17.8,34.9-37.7C122.8,51.6,105.8,34.7,85,34.7z M87.7,121.7 c-3.4-0.7-6.8,1.4-7.5,4.9c-0.7,3.4,1.4,6.8,4.9,7.5c3.4,0.7,6.8-1.4,7.5-4.9C93.3,125.7,91.2,122.4,87.7,121.7z"></path></g></g></svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

+1 -1
View File
@@ -2,7 +2,7 @@
<html lang="en">
<head>
<meta charset="utf-8">
<title>polkadot{.js}</title>
<title>blackbeard</title>
<link href="fonts/fonts.css" rel="stylesheet">
<link href="theme.css" rel="stylesheet">
<style type="text/css">
@@ -192,5 +192,9 @@
"Check newer deposits": "",
"Whether a wormhole deposit is spent is decided by its nullifier, which only this wallet can compute. {{count}} deposits to \"{{name}}\" arrived after it last did. Enter the wallet password to compute theirs; they are stored with the wallet and removed if you forget it.": "",
"Compute and check": "",
"Open the wallet's wormhole tab first, so there is a balance to extend.": ""
"Open the wallet's wormhole tab first, so there is a balance to extend.": "",
"You have been redirected because blackbeard believes that this website could compromise the security of your accounts and your tokens.": "",
"No clicks, pageviews or events are sent anywhere, and there are no trackers or analytics.": "",
"Keys and recovery phrases never leave this browser.": "",
"To show balances, your addresses are sent to a Quantus node; to show wormhole balances, your wormhole addresses are sent to a blackbeard observer. Either can be pointed at your own server, or turned off, in settings.": ""
}
+1 -1
View File
@@ -2,7 +2,7 @@
<html lang="en">
<head>
<meta charset="utf-8">
<title>polkadot{.js}</title>
<title>blackbeard</title>
<link href="fonts/fonts.css" rel="stylesheet">
<link href="theme.css" rel="stylesheet">
</head>
+4 -4
View File
@@ -28,15 +28,15 @@ div#root {
--lineHeight: 26px;
/* shared colors */
--accountDotsIconColor: #8E8E8E;
--buttonBackground: #E86F00;
--buttonBackground: #A8761F;
--buttonBackgroundDangerHover: #D93B3B;
--buttonBackgroundHover: #ED9329;
--buttonBackgroundHover: #BD8829;
--buttonTextColor: #FFFFFF;
--connectedDotColor: seagreen;
--errorColor: #E42F2F;
--iconWarningColor: #FF7D01;
--iconWarningColor: #BD8829;
--identiconBackground: #F4F5F8;
--primaryColor: #FF7D01;
--primaryColor: #BD8829;
}
[data-theme="dark"] {
+4 -1
View File
@@ -12,7 +12,10 @@ import { packageInfo } from './packageInfo.js';
function inject () {
injectExtension(enable, {
name: 'polkadot-js',
// What dapps find us under in window.injectedWeb3. Not 'polkadot-js': with
// that extension also installed, both wrote the same key and one replaced
// the other. quantus/extension#15
name: 'blackbeard',
version: packageInfo.version
});
}